@@ -94,19 +94,52 @@ const getGET_FUNCTIONS_WITH_PROCEDURES_ADDITIONAL = postgresVersion => {
9494 FROM pg_catalog.pg_proc WHERE pronamespace = $1;` ;
9595} ;
9696
97+ const getGET_FUNCTIONS_WITH_PROCEDURES = ( { extensionsToExclude = [ ] } ) => {
98+ const extensionsStatement = extensionsToExclude . length ? extensionsToExclude . map ( ext => `'${ ext } '` ) . join ( ', ' ) : '' ;
99+
100+ return `
101+ SELECT
102+ specific_name,
103+ routine_name AS name,
104+ routine_type,
105+ routine_definition,
106+ external_language,
107+ security_type,
108+ type_udt_name AS return_data_type
109+ FROM information_schema.routines
110+ WHERE specific_schema = $1
111+ AND specific_name NOT IN (
112+ SELECT r.specific_name
113+ FROM information_schema.routines r
114+ JOIN pg_proc p
115+ ON r.routine_name = p.proname
116+ AND r.specific_schema = (
117+ SELECT n.nspname
118+ FROM pg_namespace n
119+ WHERE n.oid = p.pronamespace
120+ )
121+ JOIN pg_depend d
122+ ON d.objid = p.oid
123+ JOIN pg_extension e
124+ ON d.refobjid = e.oid
125+ WHERE e.extname IN (${ extensionsStatement } )
126+ );
127+ ` ;
128+ } ;
129+
97130const queryConstants = {
98131 PING : 'SELECT schema_name FROM information_schema.schemata LIMIT 1;' ,
99132 GET_VERSION : 'SELECT version()' ,
100133 GET_VERSION_AS_NUM : 'SHOW server_version_num;' ,
101134 GET_SCHEMA_NAMES : 'SELECT schema_name FROM information_schema.schemata;' ,
102135 GET_TABLE_NAMES : `
103136 SELECT tables.table_name, tables.table_type FROM information_schema.tables AS tables
104- INNER JOIN
137+ INNER JOIN
105138 (SELECT
106139 pg_class.relname AS table_name,
107140 pg_namespace.nspname AS table_schema
108141 FROM pg_catalog.pg_class AS pg_class
109- INNER JOIN pg_catalog.pg_namespace AS pg_namespace
142+ INNER JOIN pg_catalog.pg_namespace AS pg_namespace
110143 ON (pg_namespace.oid = pg_class.relnamespace)
111144 WHERE pg_class.relispartition = false
112145 AND pg_class.relkind = ANY('{"r","v","t","m","p"}'))
@@ -120,8 +153,8 @@ const queryConstants = {
120153 GET_NAMESPACE_OID : 'SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1' ,
121154 GET_TABLE_LEVEL_DATA : `
122155 SELECT pc.oid, pc.relpersistence, pc.reloptions, pt.spcname, pg_get_expr(pc.relpartbound, pc.oid) AS partition_expr
123- FROM pg_catalog.pg_class AS pc
124- LEFT JOIN pg_catalog.pg_tablespace AS pt
156+ FROM pg_catalog.pg_class AS pc
157+ LEFT JOIN pg_catalog.pg_tablespace AS pt
125158 ON pc.reltablespace = pt.oid
126159 WHERE pc.relname = $1 AND pc.relnamespace = $2;` ,
127160 GET_TABLE_TOAST_OPTIONS : `
@@ -155,15 +188,15 @@ const queryConstants = {
155188 GET_ROWS_COUNT : fullTableName => `SELECT COUNT(*) AS quantity FROM ${ fullTableName } ;` ,
156189 GET_SAMPLED_DATA : ( fullTableName , jsonColumns ) => `SELECT ${ jsonColumns } FROM ${ fullTableName } LIMIT $1;` ,
157190 GET_SAMPLED_DATA_SIZE : ( fullTableName , jsonColumns ) => `
158- SELECT sum(pg_column_size(_hackolade_tmp_sampling_tbl.*)) AS _hackolade_tmp_sampling_tbl_size
191+ SELECT sum(pg_column_size(_hackolade_tmp_sampling_tbl.*)) AS _hackolade_tmp_sampling_tbl_size
159192 FROM (SELECT ${ jsonColumns } FROM ${ fullTableName } LIMIT $1) AS _hackolade_tmp_sampling_tbl;` ,
160193 GET_INHERITS_PARENT_TABLE_NAME : `
161194 SELECT pc.relname AS parent_table_name FROM pg_catalog.pg_inherits AS pi
162195 INNER JOIN pg_catalog.pg_class AS pc
163196 ON pc.oid = pi.inhparent
164197 WHERE pi.inhrelid = $1;` ,
165198 GET_TABLE_CONSTRAINTS : `
166- SELECT pcon.conname AS constraint_name,
199+ SELECT pcon.conname AS constraint_name,
167200 pcon.contype AS constraint_type,
168201 pcon.connoinherit AS no_inherit,
169202 pcon.conkey AS constraint_keys,
@@ -181,14 +214,14 @@ const queryConstants = {
181214 GET_TABLE_INDEXES_V_10 : getGET_TABLE_INDEXES ( 10 ) ,
182215 GET_TABLE_INDEXES_V_15 : getGET_TABLE_INDEXES ( 15 ) ,
183216 GET_TABLE_FOREIGN_KEYS : `
184- SELECT pcon.conname AS relationship_name,
217+ SELECT pcon.conname AS relationship_name,
185218 pcon.conkey AS table_columns_positions,
186219 pcon.confdeltype AS relationship_on_delete,
187220 pcon.confupdtype AS relationship_on_update,
188221 pcon.confmatchtype AS relationship_match,
189- pc_foreign_table.relname AS foreign_table_name,
222+ pc_foreign_table.relname AS foreign_table_name,
190223 ARRAY(
191- SELECT column_name::text FROM unnest(pcon.confkey) AS column_position
224+ SELECT column_name::text FROM unnest(pcon.confkey) AS column_position
192225 JOIN information_schema.columns ON (ordinal_position = column_position)
193226 WHERE table_name = pc_foreign_table.relname AND table_schema = foreign_table_namespace.nspname)::text[] AS foreign_columns,
194227 foreign_table_namespace.nspname AS foreign_table_schema
@@ -201,22 +234,13 @@ const queryConstants = {
201234 GET_VIEW_DATA : `SELECT * FROM information_schema.views WHERE table_name = $1 AND table_schema = $2;` ,
202235 GET_VIEW_SELECT_STMT_FALLBACK : `SELECT definition FROM pg_views WHERE viewname = $1 AND schemaname = $2;` ,
203236 GET_VIEW_OPTIONS : `
204- SELECT oid,
237+ SELECT oid,
205238 reloptions AS view_options,
206239 relpersistence AS persistence,
207240 obj_description(oid, 'pg_class') AS description
208- FROM pg_catalog.pg_class
241+ FROM pg_catalog.pg_class
209242 WHERE relname = $1 AND relnamespace = $2;` ,
210- GET_FUNCTIONS_WITH_PROCEDURES : `
211- SELECT specific_name,
212- routine_name AS name,
213- routine_type,
214- routine_definition,
215- external_language,
216- security_type,
217- type_udt_name AS return_data_type
218- FROM information_schema.routines
219- WHERE specific_schema=$1;` ,
243+ GET_FUNCTIONS_WITH_PROCEDURES : getGET_FUNCTIONS_WITH_PROCEDURES ( { extensionsToExclude : [ 'vector' ] } ) ,
220244 GET_FUNCTIONS_WITH_PROCEDURES_ARGS : `
221245 SELECT parameter_name,
222246 parameter_mode,
@@ -315,7 +339,7 @@ const queryConstants = {
315339 (c.relname)::information_schema.sql_identifier,
316340 em.num, ((t.tgtype)::integer & 1), ((t.tgtype)::integer & 66)
317341 ORDER BY t.tgname))::information_schema.cardinal_number AS action_order,
318- (regexp_match(pg_get_triggerdef(t.oid), '.{35,} WHEN \ ((.+)\ ) EXECUTE FUNCTION'::text))[1]::information_schema.character_data AS action_condition,
342+ (regexp_match(pg_get_triggerdef(t.oid), '.{35,} WHEN ((.+)) EXECUTE FUNCTION'::text))[1]::information_schema.character_data AS action_condition,
319343 (SUBSTRING(pg_get_triggerdef(t.oid)
320344 FROM (POSITION(('EXECUTE FUNCTION'::text) IN (SUBSTRING(pg_get_triggerdef(t.oid)
321345 FROM 48))) + 47)))::information_schema.character_data AS action_statement,
@@ -363,7 +387,7 @@ const queryConstants = {
363387 pg_class_referenced.relname AS referenced_table_name,
364388 pg_namespace_referenced.nspname AS referenced_table_schema
365389 FROM pg_catalog.pg_trigger as pg_trigger
366- LEFT JOIN pg_catalog.pg_proc AS pg_proc
390+ LEFT JOIN pg_catalog.pg_proc AS pg_proc
367391 ON (pg_trigger.tgfoid = pg_proc.oid)
368392 LEFT JOIN pg_catalog.pg_attribute AS pg_attribute
369393 ON (pg_attribute.attnum = ANY(pg_trigger.tgattr::int2[]) AND pg_trigger.tgrelid = pg_attribute.attrelid)
@@ -376,7 +400,7 @@ const queryConstants = {
376400 LEFT JOIN pg_catalog.pg_namespace AS pg_namespace_referenced
377401 ON(pg_namespace_referenced.oid = pg_class_referenced.relnamespace)
378402 WHERE pg_class.relnamespace = $1 AND pg_class.oid = $2
379- GROUP BY
403+ GROUP BY
380404 trigger_name,
381405 function_name,
382406 "constraint",
0 commit comments