Outsource a local function into TDBObject.SchemaClauseIS, and use it in GetTableColumns

This commit is contained in:
Ansgar Becker
2021-01-04 19:27:04 +01:00
parent 6fd54fb9d4
commit 2028db3df8

View File

@ -147,6 +147,7 @@ type
function QuotedName(AlwaysQuote: Boolean=True; SeparateSegments: Boolean=True): String; function QuotedName(AlwaysQuote: Boolean=True; SeparateSegments: Boolean=True): String;
function QuotedDbAndTableName(AlwaysQuote: Boolean=True): String; function QuotedDbAndTableName(AlwaysQuote: Boolean=True): String;
function QuotedColumn(AlwaysQuote: Boolean=True): String; function QuotedColumn(AlwaysQuote: Boolean=True): String;
function SchemaClauseIS(Prefix: String): String;
function RowCount(Reload: Boolean): Int64; function RowCount(Reload: Boolean): Int64;
function GetCreateCode: String; overload; function GetCreateCode: String; overload;
function GetCreateCode(RemoveAutoInc, RemoveDefiner: Boolean): String; overload; function GetCreateCode(RemoveAutoInc, RemoveDefiner: Boolean): String; overload;
@ -356,7 +357,7 @@ type
spEmptyTable, spRenameTable, spRenameView, spCurrentUserHost, spLikeCompare, spEmptyTable, spRenameTable, spRenameView, spCurrentUserHost, spLikeCompare,
spAddColumn, spChangeColumn, spAddColumn, spChangeColumn,
spGlobalStatus, spCommandsCounters, spSessionVariables, spGlobalVariables, spGlobalStatus, spCommandsCounters, spSessionVariables, spGlobalVariables,
spISTableSchemaCol, spISSchemaCol,
spUSEQuery, spKillQuery, spKillProcess, spUSEQuery, spKillQuery, spKillProcess,
spFuncLength, spFuncCeil, spFuncLeft, spFuncNow, spFuncLength, spFuncCeil, spFuncLeft, spFuncNow,
spLockedTables); spLockedTables);
@ -2631,7 +2632,7 @@ begin
); );
FSQLSpecifities[spSessionVariables] := 'SHOW VARIABLES'; FSQLSpecifities[spSessionVariables] := 'SHOW VARIABLES';
FSQLSpecifities[spGlobalVariables] := 'SHOW GLOBAL VARIABLES'; FSQLSpecifities[spGlobalVariables] := 'SHOW GLOBAL VARIABLES';
FSQLSpecifities[spISTableSchemaCol] := 'TABLE_SCHEMA'; FSQLSpecifities[spISSchemaCol] := '%s_SCHEMA';
FSQLSpecifities[spUSEQuery] := 'USE %s'; FSQLSpecifities[spUSEQuery] := 'USE %s';
FSQLSpecifities[spKillQuery] := 'KILL %d'; FSQLSpecifities[spKillQuery] := 'KILL %d';
FSQLSpecifities[spKillProcess] := 'KILL %d'; FSQLSpecifities[spKillProcess] := 'KILL %d';
@ -2652,7 +2653,7 @@ begin
FSQLSpecifities[spChangeColumn] := 'ALTER COLUMN %s %s'; FSQLSpecifities[spChangeColumn] := 'ALTER COLUMN %s %s';
FSQLSpecifities[spSessionVariables] := 'SELECT '+QuoteIdent('comment')+', '+QuoteIdent('value')+' FROM '+QuoteIdent('master')+'.'+QuoteIdent('dbo')+'.'+QuoteIdent('syscurconfigs')+' ORDER BY '+QuoteIdent('comment'); FSQLSpecifities[spSessionVariables] := 'SELECT '+QuoteIdent('comment')+', '+QuoteIdent('value')+' FROM '+QuoteIdent('master')+'.'+QuoteIdent('dbo')+'.'+QuoteIdent('syscurconfigs')+' ORDER BY '+QuoteIdent('comment');
FSQLSpecifities[spGlobalVariables] := FSQLSpecifities[spSessionVariables]; FSQLSpecifities[spGlobalVariables] := FSQLSpecifities[spSessionVariables];
FSQLSpecifities[spISTableSchemaCol] := 'TABLE_CATALOG'; FSQLSpecifities[spISSchemaCol] := '%s_CATALOG';
FSQLSpecifities[spUSEQuery] := 'USE %s'; FSQLSpecifities[spUSEQuery] := 'USE %s';
FSQLSpecifities[spKillQuery] := 'KILL %d'; FSQLSpecifities[spKillQuery] := 'KILL %d';
FSQLSpecifities[spKillProcess] := 'KILL %d'; FSQLSpecifities[spKillProcess] := 'KILL %d';
@ -2673,7 +2674,7 @@ begin
FSQLSpecifities[spChangeColumn] := 'ALTER COLUMN %s %s'; FSQLSpecifities[spChangeColumn] := 'ALTER COLUMN %s %s';
FSQLSpecifities[spSessionVariables] := 'SHOW ALL'; FSQLSpecifities[spSessionVariables] := 'SHOW ALL';
FSQLSpecifities[spGlobalVariables] := FSQLSpecifities[spSessionVariables]; FSQLSpecifities[spGlobalVariables] := FSQLSpecifities[spSessionVariables];
FSQLSpecifities[spISTableSchemaCol] := 'table_schema'; FSQLSpecifities[spISSchemaCol] := '%s_schema';
FSQLSpecifities[spUSEQuery] := 'SET search_path TO %s'; FSQLSpecifities[spUSEQuery] := 'SET search_path TO %s';
FSQLSpecifities[spKillQuery] := 'SELECT pg_cancel_backend(%d)'; FSQLSpecifities[spKillQuery] := 'SELECT pg_cancel_backend(%d)';
FSQLSpecifities[spKillProcess] := 'SELECT pg_cancel_backend(%d)'; FSQLSpecifities[spKillProcess] := 'SELECT pg_cancel_backend(%d)';
@ -2694,7 +2695,7 @@ begin
FSQLSpecifities[spChangeColumn] := 'CHANGE COLUMN %s %s'; FSQLSpecifities[spChangeColumn] := 'CHANGE COLUMN %s %s';
FSQLSpecifities[spSessionVariables] := 'SELECT null, null'; // Todo: combine "PRAGMA pragma_list" + "PRAGMA a; PRAGMY b; ..."? FSQLSpecifities[spSessionVariables] := 'SELECT null, null'; // Todo: combine "PRAGMA pragma_list" + "PRAGMA a; PRAGMY b; ..."?
FSQLSpecifities[spGlobalVariables] := 'SHOW GLOBAL VARIABLES'; FSQLSpecifities[spGlobalVariables] := 'SHOW GLOBAL VARIABLES';
FSQLSpecifities[spISTableSchemaCol] := 'TABLE_SCHEMA'; FSQLSpecifities[spISSchemaCol] := '%s_SCHEMA';
FSQLSpecifities[spUSEQuery] := '-- USE %s neither supported nor required'; // Cannot be empty without causing problems FSQLSpecifities[spUSEQuery] := '-- USE %s neither supported nor required'; // Cannot be empty without causing problems
FSQLSpecifities[spKillQuery] := 'KILL %d'; FSQLSpecifities[spKillQuery] := 'KILL %d';
FSQLSpecifities[spKillProcess] := 'KILL %d'; FSQLSpecifities[spKillProcess] := 'KILL %d';
@ -3489,17 +3490,6 @@ var
TableKey: TTableKey; TableKey: TTableKey;
TableForeignKeys: TForeignKeyList; TableForeignKeys: TForeignKeyList;
TableForeignKey: TForeignKey; TableForeignKey: TForeignKey;
// Return fitting schema clause for queries in IS.TABLES, IS.ROUTINES etc.
// TODO: Does not work on MSSQL 2000
function SchemaClauseIS(Prefix: String): String;
begin
if Obj.Schema <> '' then
Result := Prefix+'_SCHEMA='+EscapeString(Obj.Schema)
else
Result := Prefix+'_CATALOG='+EscapeString(Obj.Database);
end;
begin begin
case Obj.NodeType of case Obj.NodeType of
lntTable: begin lntTable: begin
@ -3553,7 +3543,7 @@ begin
Result := GetVar('SELECT VIEW_DEFINITION'+ Result := GetVar('SELECT VIEW_DEFINITION'+
' FROM '+InfSch+'.VIEWS'+ ' FROM '+InfSch+'.VIEWS'+
' WHERE TABLE_NAME='+EscapeString(Obj.Name)+ ' WHERE TABLE_NAME='+EscapeString(Obj.Name)+
' AND '+SchemaClauseIS('TABLE') ' AND '+Obj.SchemaClauseIS('TABLE')
); );
end; end;
end; end;
@ -3607,7 +3597,7 @@ begin
' FROM '+InfSch+'.ROUTINES'+ ' FROM '+InfSch+'.ROUTINES'+
' WHERE ROUTINE_NAME='+EscapeString(Obj.Name)+ ' WHERE ROUTINE_NAME='+EscapeString(Obj.Name)+
' AND ROUTINE_TYPE='+EscapeString('FUNCTION')+ ' AND ROUTINE_TYPE='+EscapeString('FUNCTION')+
' AND '+SchemaClauseIS('ROUTINE') ' AND '+Obj.SchemaClauseIS('ROUTINE')
); );
end; end;
end; end;
@ -3629,7 +3619,7 @@ begin
' FROM '+InfSch+'.ROUTINES'+ ' FROM '+InfSch+'.ROUTINES'+
' WHERE ROUTINE_NAME='+EscapeString(Obj.Name)+ ' WHERE ROUTINE_NAME='+EscapeString(Obj.Name)+
' AND ROUTINE_TYPE='+EscapeString('PROCEDURE')+ ' AND ROUTINE_TYPE='+EscapeString('PROCEDURE')+
' AND '+SchemaClauseIS('ROUTINE') ' AND '+Obj.SchemaClauseIS('ROUTINE')
); );
end; end;
end; end;
@ -4862,18 +4852,14 @@ var
TableIdx: Integer; TableIdx: Integer;
ColQuery: TDBQuery; ColQuery: TDBQuery;
Col: TTableColumn; Col: TTableColumn;
dt, SchemaClause, DefText, ExtraText, MaxLen: String; dt, DefText, ExtraText, MaxLen: String;
begin begin
// Generic: query table columns from IS.COLUMNS // Generic: query table columns from IS.COLUMNS
Log(lcDebug, 'Getting fresh columns for '+Table.QuotedDbAndTableName); Log(lcDebug, 'Getting fresh columns for '+Table.QuotedDbAndTableName);
Result := TTableColumnList.Create(True); Result := TTableColumnList.Create(True);
TableIdx := InformationSchemaObjects.IndexOf('columns'); TableIdx := InformationSchemaObjects.IndexOf('columns');
if Table.Schema <> '' then
SchemaClause := 'TABLE_SCHEMA='+EscapeString(Table.Schema)
else
SchemaClause := GetSQLSpecifity(spISTableSchemaCol)+'='+EscapeString(Table.Database);
ColQuery := GetResults('SELECT * FROM '+QuoteIdent(InfSch)+'.'+QuoteIdent(InformationSchemaObjects[TableIdx])+ ColQuery := GetResults('SELECT * FROM '+QuoteIdent(InfSch)+'.'+QuoteIdent(InformationSchemaObjects[TableIdx])+
' WHERE '+SchemaClause+' AND TABLE_NAME='+EscapeString(Table.Name)+ ' WHERE '+Table.SchemaClauseIS('TABLE')+' AND TABLE_NAME='+EscapeString(Table.Name)+
' ORDER BY ORDINAL_POSITION'); ' ORDER BY ORDINAL_POSITION');
while not ColQuery.Eof do begin while not ColQuery.Eof do begin
Col := TTableColumn.Create(Self); Col := TTableColumn.Create(Self);
@ -8909,6 +8895,16 @@ begin
Result := Connection.QuoteIdent(Column, AlwaysQuote); Result := Connection.QuoteIdent(Column, AlwaysQuote);
end; end;
// Return fitting schema clause for queries in IS.TABLES, IS.ROUTINES etc.
// TODO: Does not work on MSSQL 2000
function TDBObject.SchemaClauseIS(Prefix: String): String;
begin
if Schema <> '' then
Result := Prefix+'_SCHEMA' + '=' + Connection.EscapeString(Schema)
else
Result := Connection.GetSQLSpecifity(spISSchemaCol, [Prefix]) + '=' + Connection.EscapeString(Database);
end;
function TDBObject.RowCount(Reload: Boolean): Int64; function TDBObject.RowCount(Reload: Boolean): Int64;
begin begin
if (Rows = -1) or Reload then begin if (Rows = -1) or Reload then begin