mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
* 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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user