Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Add pg_stat_statements extension support
Extended extensionsFilters to support pg_stat_statements extension,
which automatically filters out all pg_stat_* tables from introspect
and push operations. This is useful when working with PostgreSQL
databases that have the pg_stat_statements extension enabled.

Changes:
- Updated getTablesFilterByExtensions() to filter !pg_stat_* tables
- Extended extensionsFilters type to include 'pg_stat_statements'
- Updated Zod validation schemas
- Added comprehensive unit tests
- Added TSDoc documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
  • Loading branch information
aaijazi and claude committed Oct 15, 2025
commit b314a9cff59da0c59eb4846f0659fcd7f951c6af
4 changes: 2 additions & 2 deletions drizzle-kit/src/cli/validations/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export const pushParams = object({
schemaFilter: union([string(), string().array()])
.optional()
.default(['public']),
extensionsFilters: literal('postgis').array().optional(),
extensionsFilters: union([literal('postgis'), literal('pg_stat_statements')]).array().optional(),
verbose: boolean().optional(),
strict: boolean().optional(),
entities: object({
Expand All @@ -45,7 +45,7 @@ export const pullParams = object({
schemaFilter: union([string(), string().array()])
.optional()
.default(['public']),
extensionsFilters: literal('postgis').array().optional(),
extensionsFilters: union([literal('postgis'), literal('pg_stat_statements')]).array().optional(),
casing,
breakpoints: boolean().optional().default(true),
migrations: object({
Expand Down
17 changes: 10 additions & 7 deletions drizzle-kit/src/extensions/getTablesFilterByExtensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ export const getTablesFilterByExtensions = ({
extensionsFilters,
dialect,
}: Pick<Config, 'extensionsFilters' | 'dialect'>): string[] => {
if (extensionsFilters) {
if (
extensionsFilters.includes('postgis')
&& dialect === 'postgresql'
) {
return ['!geography_columns', '!geometry_columns', '!spatial_ref_sys'];
const filters: string[] = [];

if (extensionsFilters && dialect === 'postgresql') {
if (extensionsFilters.includes('postgis')) {
filters.push('!geography_columns', '!geometry_columns', '!spatial_ref_sys');
}
if (extensionsFilters.includes('pg_stat_statements')) {
filters.push('!pg_stat_*');
}
}
return [];

return filters;
};
26 changes: 25 additions & 1 deletion drizzle-kit/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,18 @@ type Verify<T, U extends T> = U;
*
* ---
*
* `extensionsFilters` - parameter allows you to filter out tables created by PostgreSQL extensions.
* This parameter accepts an array of extension names. Currently supported extensions:
* - 'postgis' - filters out geography_columns, geometry_columns, and spatial_ref_sys tables
* - 'pg_stat_statements' - filters out all pg_stat_* tables
*
* For example, having extensionsFilters: ["postgis", "pg_stat_statements"] will automatically filter out
* all extension-related tables from introspect and push operations.
*
* See https://orm.drizzle.team/kit-docs/config-reference#extensionsfilters
*
* ---
*
* `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.
* This parameter accepts a single schema as a string or an array of schemas as strings.
* No glob pattern is supported here. By default, drizzle will use the public schema for both commands,
Expand Down Expand Up @@ -112,7 +124,7 @@ export type Config =
out?: string;
breakpoints?: boolean;
tablesFilter?: string | string[];
extensionsFilters?: 'postgis'[];
extensionsFilters?: ('postgis' | 'pg_stat_statements')[];
schemaFilter?: string | string[];
schema?: string | string[];
verbose?: boolean;
Expand Down Expand Up @@ -318,6 +330,18 @@ export type Config =
*
* ---
*
* `extensionsFilters` - parameter allows you to filter out tables created by PostgreSQL extensions.
* This parameter accepts an array of extension names. Currently supported extensions:
* - 'postgis' - filters out geography_columns, geometry_columns, and spatial_ref_sys tables
* - 'pg_stat_statements' - filters out all pg_stat_* tables
*
* For example, having extensionsFilters: ["postgis", "pg_stat_statements"] will automatically filter out
* all extension-related tables from introspect and push operations.
*
* See https://orm.drizzle.team/kit-docs/config-reference#extensionsfilters
*
* ---
*
* `schemaFilter` - parameter allows you to define which schema in PostgreSQL should be used for either introspect or push commands.
* This parameter accepts a single schema as a string or an array of schemas as strings.
* No glob pattern is supported here. By default, drizzle will use the public schema for both commands,
Expand Down
56 changes: 56 additions & 0 deletions drizzle-kit/tests/extensions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { expect, test } from 'vitest';
import { getTablesFilterByExtensions } from '../src/extensions/getTablesFilterByExtensions';

test('postgis extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis'],
dialect: 'postgresql',
});

expect(filters).toEqual([
'!geography_columns',
'!geometry_columns',
'!spatial_ref_sys',
]);
});

test('pg_stat_statements extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['pg_stat_statements'],
dialect: 'postgresql',
});

expect(filters).toEqual(['!pg_stat_*']);
});

test('multiple extensions filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis', 'pg_stat_statements'],
dialect: 'postgresql',
});

expect(filters).toEqual([
'!geography_columns',
'!geometry_columns',
'!spatial_ref_sys',
'!pg_stat_*',
]);
});

test('no extension filters', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: undefined,
dialect: 'postgresql',
});

expect(filters).toEqual([]);
});

test('extension filters only for postgresql', () => {
const filters = getTablesFilterByExtensions({
extensionsFilters: ['postgis', 'pg_stat_statements'],
dialect: 'mysql',
});

expect(filters).toEqual([]);
});