Skip to content

Commit ef1475c

Browse files
fix: exclude pg_stat_statements functions from Brain schema introspection
- Added EXCLUDED_EXTENSION_FUNCTIONS_SQL constant to filter out pg_stat_statements, pg_stat_statements_info, pg_stat_statements_reset, and pg_buffercache functions - Applied excludeExtensionFunctionsPredicate to getFunctions() query - Extended tests to verify function exclusion works correctly The view exclusion was already working but the extension also creates functions that appeared in Brain. This adds the missing function filter. Co-authored-by: Venkat SF <venkatesh.sakamuri@stayflexi.com>
1 parent 50e05bf commit ef1475c

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

‎backend/src/main/java/com/dbaagent/provider/postgres/PostgresIntrospectionProvider.java‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ public class PostgresIntrospectionProvider implements IntrospectionProvider {
3737
static final String EXCLUDED_EXTENSION_VIEWS_SQL =
3838
"NOT IN ('pg_stat_statements', 'pg_stat_statements_info', 'pg_buffercache')";
3939

40+
/**
41+
* Extension-created functions that should be excluded from Brain. These are
42+
* internal extension functions not useful for application queries.
43+
*/
44+
static final String EXCLUDED_EXTENSION_FUNCTIONS_SQL =
45+
"NOT IN ('pg_stat_statements', 'pg_stat_statements_info', 'pg_stat_statements_reset', 'pg_buffercache_pages', 'pg_buffercache_summary')";
46+
4047
static String nonSystemSchemaPredicate(String column) {
4148
return column + " " + String.format(NON_SYSTEM_SCHEMA_SQL, column);
4249
}
@@ -45,6 +52,10 @@ static String excludeExtensionViewsPredicate(String column) {
4552
return column + " " + EXCLUDED_EXTENSION_VIEWS_SQL;
4653
}
4754

55+
static String excludeExtensionFunctionsPredicate(String column) {
56+
return column + " " + EXCLUDED_EXTENSION_FUNCTIONS_SQL;
57+
}
58+
4859
/** Map / snapshot key that survives duplicate table names across schemas. */
4960
static String qualifiedTableKey(String schema, String table) {
5061
String s = (schema == null || schema.isBlank()) ? DEFAULT_SCHEMA : schema;
@@ -128,13 +139,15 @@ private List<DatabaseObject> getTablesAndViews(Connection connection) throws SQL
128139
private List<DatabaseObject> getFunctions(Connection connection) throws SQLException {
129140
List<DatabaseObject> objects = new ArrayList<>();
130141

142+
String schemaPred = nonSystemSchemaPredicate("n.nspname");
143+
String extFuncPred = excludeExtensionFunctionsPredicate("p.proname");
131144
String query = """
132145
SELECT n.nspname as schema_name, p.proname as name, pg_get_functiondef(p.oid) as definition
133146
FROM pg_proc p
134147
JOIN pg_namespace n ON p.pronamespace = n.oid
135-
WHERE %s AND p.prokind = 'f'
148+
WHERE %s AND %s AND p.prokind = 'f'
136149
ORDER BY n.nspname, p.proname
137-
""".formatted(nonSystemSchemaPredicate("n.nspname"));
150+
""".formatted(schemaPred, extFuncPred);
138151

139152
try (Statement stmt = connection.createStatement();
140153
ResultSet rs = stmt.executeQuery(query)) {

‎backend/src/test/java/com/dbaagent/provider/postgres/PostgresIntrospectionProviderTest.java‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,4 +412,30 @@ void extensionViewExclusion_isExactMatch() {
412412
assertTrue(predicate.startsWith("NOT IN"),
413413
"Predicate should use NOT IN for exact matching");
414414
}
415+
416+
@Test
417+
void excludeExtensionFunctionsPredicate_excludesPgStatStatementsFunctions() {
418+
String predicate = PostgresIntrospectionProvider.excludeExtensionFunctionsPredicate("p.proname");
419+
420+
assertTrue(predicate.contains("pg_stat_statements"),
421+
"Exclusion predicate should mention pg_stat_statements");
422+
assertTrue(predicate.contains("pg_stat_statements_info"),
423+
"Exclusion predicate should mention pg_stat_statements_info");
424+
assertTrue(predicate.contains("pg_stat_statements_reset"),
425+
"Exclusion predicate should mention pg_stat_statements_reset");
426+
assertTrue(predicate.contains("NOT IN"),
427+
"Exclusion predicate should use NOT IN clause");
428+
}
429+
430+
@Test
431+
void extensionFunctionExclusion_isExactMatch() {
432+
String predicate = PostgresIntrospectionProvider.EXCLUDED_EXTENSION_FUNCTIONS_SQL;
433+
434+
assertTrue(predicate.contains("'pg_stat_statements'"),
435+
"Predicate should exclude exactly 'pg_stat_statements'");
436+
assertTrue(predicate.contains("'pg_stat_statements_reset'"),
437+
"Predicate should exclude exactly 'pg_stat_statements_reset'");
438+
assertTrue(predicate.startsWith("NOT IN"),
439+
"Predicate should use NOT IN for exact matching");
440+
}
415441
}

0 commit comments

Comments
 (0)