From d0613c00f448cd28949bf3366d028489498212a1 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Sun, 13 Mar 2016 10:22:27 +0000 Subject: [PATCH] Support searching in procedures and functions on MSSQL and PostgreSQL mode too. --- source/dbconnection.pas | 9 ++++++++- source/tabletools.pas | 17 ++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/source/dbconnection.pas b/source/dbconnection.pas index b9b214b5..540aa74a 100644 --- a/source/dbconnection.pas +++ b/source/dbconnection.pas @@ -284,7 +284,8 @@ type spAddColumn, spChangeColumn, spSessionVariables, spGlobalVariables, spISTableSchemaCol, - spUSEQuery, spKillQuery); + spUSEQuery, spKillQuery, + spFuncLength, spFuncCeil); TDBConnection = class(TComponent) private @@ -2005,6 +2006,8 @@ begin FSQLSpecifities[spISTableSchemaCol] := 'TABLE_SCHEMA'; FSQLSpecifities[spUSEQuery] := 'USE %s'; FSQLSpecifities[spKillQuery] := 'KILL %d'; + FSQLSpecifities[spFuncLength] := 'LENGTH'; + FSQLSpecifities[spFuncCeil] := 'CEIL'; end; ngMSSQL: begin FSQLSpecifities[spEmptyTable] := 'DELETE FROM '; @@ -2018,6 +2021,8 @@ begin FSQLSpecifities[spISTableSchemaCol] := 'TABLE_CATALOG'; FSQLSpecifities[spUSEQuery] := 'USE %s'; FSQLSpecifities[spKillQuery] := 'KILL %d'; + FSQLSpecifities[spFuncLength] := 'LEN'; + FSQLSpecifities[spFuncCeil] := 'CEILING'; end; ngPgSQL: begin FSQLSpecifities[spEmptyTable] := 'DELETE FROM '; @@ -2031,6 +2036,8 @@ begin FSQLSpecifities[spISTableSchemaCol] := 'table_schema'; FSQLSpecifities[spUSEQuery] := 'SET search_path TO %s'; FSQLSpecifities[spKillQuery] := 'SELECT pg_cancel_backend(%d)'; + FSQLSpecifities[spFuncLength] := 'LENGTH'; + FSQLSpecifities[spFuncCeil] := 'CEIL'; end; end; diff --git a/source/tabletools.pas b/source/tabletools.pas index 32f53d6a..bc9be3a5 100644 --- a/source/tabletools.pas +++ b/source/tabletools.pas @@ -795,18 +795,21 @@ procedure TfrmTableTools.DoFind(DBObj: TDBObject); var Columns: TTableColumnList; Col: TTableColumn; - SQL, Dummy, Column, RoutineDefinitionColumn, FindText, FindTextJokers: String; + SQL, Dummy, Column, RoutineDefinitionColumn, RoutineSchemaColumn, FindText, FindTextJokers: String; begin FFindSeeResultSQL.Add(''); FindText := memoFindText.Text; FindTextJokers := '%'+FindText+'%'; - RoutineDefinitionColumn := DBObj.Connection.QuoteIdent('ROUTINE_DEFINITION'); + RoutineDefinitionColumn := DBObj.Connection.QuoteIdent('routine_definition'); if not chkCaseSensitive.Checked then begin FindText := LowerCase(FindText); FindTextJokers := LowerCase(FindTextJokers); RoutineDefinitionColumn := 'LOWER('+RoutineDefinitionColumn+')'; end; + RoutineSchemaColumn := 'routine_schema'; + if DBObj.Connection.Parameters.IsMSSQL then + RoutineSchemaColumn := 'routine_catalog'; Columns := TTableColumnList.Create(True); case DBObj.NodeType of @@ -866,17 +869,17 @@ begin end; lntProcedure, lntFunction: begin - if DBObj.Connection.InformationSchemaObjects.IndexOf('ROUTINES') > -1 then begin + if DBObj.Connection.InformationSchemaObjects.IndexOf('routines') > -1 then begin SQL := 'SELECT '+ esc(DBObj.Database)+' AS '+DBObj.Connection.QuoteIdent('Database')+', '+ esc(DBObj.Name)+' AS '+DBObj.Connection.QuoteIdent('Table')+', '+ - 'CEIL((LENGTH('+RoutineDefinitionColumn+') - LENGTH(REPLACE('+RoutineDefinitionColumn+', '+esc(FindText)+', '+esc('')+'))) / LENGTH('+esc(FindText)+')) AS '+DBObj.Connection.QuoteIdent('Found rows')+', '+ + DBObj.Connection.GetSQLSpecifity(spFuncCeil)+'(('+DBObj.Connection.GetSQLSpecifity(spFuncLength)+'('+RoutineDefinitionColumn+') - '+DBObj.Connection.GetSQLSpecifity(spFuncLength)+'(REPLACE('+RoutineDefinitionColumn+', '+esc(FindText)+', '+esc('')+'))) / '+DBObj.Connection.GetSQLSpecifity(spFuncLength)+'('+esc(FindText)+')) AS '+DBObj.Connection.QuoteIdent('Found rows')+', '+ '0 AS '+DBObj.Connection.QuoteIdent('Relevance')+ - 'FROM '+DBObj.Connection.QuoteIdent('INFORMATION_SCHEMA')+'.'+DBObj.Connection.QuoteIdent('ROUTINES')+' '+ - 'WHERE '+DBObj.Connection.QuoteIdent('ROUTINE_SCHEMA')+'='+esc(DBObj.Database)+' AND '+DBObj.Connection.QuoteIdent('ROUTINE_NAME')+'='+esc(DBObj.Name); + 'FROM '+DBObj.Connection.QuoteIdent('information_schema')+'.'+DBObj.Connection.QuoteIdent('routines')+' '+ + 'WHERE '+DBObj.Connection.QuoteIdent(RoutineSchemaColumn)+'='+esc(DBObj.Database)+' AND '+DBObj.Connection.QuoteIdent('routine_name')+'='+esc(DBObj.Name); AddResults(SQL, DBObj.Connection); end else begin - AddNotes(DBObj, f_('%s%s missing.', [STRSKIPPED, 'INFORMATION_SCHEMA.ROUTINES']), ''); + AddNotes(DBObj, f_('%s%s missing.', [STRSKIPPED, 'information_schema.routines']), ''); end; end;