* 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
This commit is contained in:
Ansgar Becker
2021-05-23 09:25:08 +02:00
parent bee6acab7b
commit 07e1786d46
3 changed files with 25 additions and 25 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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