From 07e1786d46bb1529d08b729c04ef1f215f94ffde Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Sun, 23 May 2021 09:25:08 +0200 Subject: [PATCH] * fix wrong substring offset in TForeignKey.SQLCode * fix TForeignKey.ReferenceTableObj with dots in database name * use the fixed TForeignKey.ReferenceTableObj instead of .ReferenceTable in two places Closes #1364 --- source/dbconnection.pas | 17 +++++++++++------ source/main.pas | 19 ++++++++++--------- source/table_editor.pas | 14 ++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/source/dbconnection.pas b/source/dbconnection.pas index 38cedc4a..e64febae 100644 --- a/source/dbconnection.pas +++ b/source/dbconnection.pas @@ -9579,7 +9579,7 @@ begin if Columns.Count > 0 then Delete(Result, Length(Result)-1, 2); Result := Result + ') REFERENCES '; if (not ReferenceDb.IsEmpty) and (ReferenceTable.StartsWith(ReferenceDb)) then begin - TablePart := ReferenceTable.Substring(Length(ReferenceDb)); + TablePart := ReferenceTable.Substring(Length(ReferenceDb) + 1); Result := Result + FConnection.QuoteIdent(ReferenceDb) + '.' + FConnection.QuoteIdent(TablePart); end else begin @@ -9602,12 +9602,17 @@ var RefDb, RefTable: String; begin // Find database object of reference table - RefDb := ReferenceTable.Substring(0, Pos('.', ReferenceTable)-1); - if not RefDb.IsEmpty then begin - RefTable := ReferenceTable.Substring(Length(RefDb)+1); + if (not ReferenceDb.IsEmpty) and (ReferenceTable.StartsWith(ReferenceDb)) then begin + RefDb := ReferenceDb; + RefTable := ReferenceTable.Substring(Length(ReferenceDb) + 1); end else begin - RefDb := FConnection.Database; - RefTable := ReferenceTable; + RefDb := ReferenceTable.Substring(0, Pos('.', ReferenceTable)-1); + if not RefDb.IsEmpty then begin + RefTable := ReferenceTable.Substring(Length(RefDb)+1); + end else begin + RefDb := FConnection.Database; + RefTable := ReferenceTable; + end; end; Result := FConnection.FindObject(RefDb, RefTable); end; diff --git a/source/main.pas b/source/main.pas index c0c1576f..4d059251 100644 --- a/source/main.pas +++ b/source/main.pas @@ -10219,26 +10219,27 @@ begin if idx > -1 then try // Find the first text column if available and use that for displaying in the pulldown instead of using meaningless id numbers RefObj := ForeignKey.ReferenceTableObj; + if not Assigned(RefObj) then + Continue; + TextCol := ''; - if Assigned(RefObj) then begin - Columns := RefObj.TableColumns; - for TblColumn in Columns do begin - if (TblColumn.DataType.Category = dtcText) and (TblColumn.Name <> ForeignKey.ForeignColumns[idx]) then begin - TextCol := TblColumn.Name; - break; - end; + Columns := RefObj.TableColumns; + for TblColumn in Columns do begin + if (TblColumn.DataType.Category = dtcText) and (TblColumn.Name <> ForeignKey.ForeignColumns[idx]) then begin + TextCol := TblColumn.Name; + break; end; end; KeyCol := Conn.QuoteIdent(ForeignKey.ForeignColumns[idx]); if TextCol <> '' then begin SQL := KeyCol+', ' + Conn.GetSQLSpecifity(spFuncLeft, [Conn.QuoteIdent(TextCol), 256])+ - ' FROM '+Conn.QuoteIdent(ForeignKey.ReferenceTable, True, '.')+ + ' FROM ' + RefObj.QuotedDbAndTableName + ' GROUP BY '+KeyCol+', '+Conn.QuoteIdent(TextCol)+ // MSSQL complains if the text columns is not grouped ' ORDER BY '+Conn.QuoteIdent(TextCol); end else begin SQL := KeyCol+ - ' FROM '+Conn.QuoteIdent(ForeignKey.ReferenceTable, True, '.')+ + ' FROM ' + RefObj.QuotedDbAndTableName + ' GROUP BY '+KeyCol+ ' ORDER BY '+KeyCol; end; diff --git a/source/table_editor.pas b/source/table_editor.pas index 95eba7ff..2445a6cc 100644 --- a/source/table_editor.pas +++ b/source/table_editor.pas @@ -2521,7 +2521,6 @@ procedure TfrmTableEditor.listForeignKeysEditing(Sender: TBaseVirtualTree; Node: Column: TColumnIndex; var Allowed: Boolean); var Key: TForeignKey; - ExistsQuery: String; begin // Disallow editing foreign columns when no reference table was selected. // Also, check for existance of reference table and warn if it's missing. @@ -2531,16 +2530,11 @@ begin if Key.ReferenceTable = '' then ErrorDialog(_('Please select a reference table before selecting foreign columns.')) else begin - try - ExistsQuery := DBObject.Connection.ApplyLimitClause( - 'SELECT', - '1 FROM '+DBObject.Connection.QuoteIdent(Key.ReferenceTable, True, '.'), - 1, 0); - DBObject.Connection.GetVar(ExistsQuery); - Allowed := True; - except + if Key.ReferenceTableObj = nil then begin // Leave Allowed = False - ErrorDialog(f_('Reference table "%s" seems to be missing, broken or non-accessible.', [Key.ReferenceTable])) + ErrorDialog(f_('Reference table "%s" seems to be missing, broken or non-accessible.', [Key.ReferenceTable])); + end else begin + Allowed := True; end; end; end else