diff --git a/packages/pg-meta/src/sql/indexes.ts b/packages/pg-meta/src/sql/indexes.ts index db66dc9ab25..84705e97159 100644 --- a/packages/pg-meta/src/sql/indexes.ts +++ b/packages/pg-meta/src/sql/indexes.ts @@ -39,7 +39,7 @@ export const INDEXES_SQL = /* SQL */ safeSql` JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_am am ON c.relam = am.oid JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(idx.indkey) - JOIN pg_indexes ix ON c.relname = ix.indexname + JOIN pg_indexes ix ON c.relname = ix.indexname AND n.nspname = ix.schemaname GROUP BY idx.indexrelid, idx.indrelid, n.nspname, idx.indnatts, idx.indnkeyatts, idx.indisunique, idx.indisprimary, idx.indisexclusion, idx.indimmediate, idx.indisclustered, idx.indisvalid, diff --git a/packages/pg-meta/test/indexes.test.ts b/packages/pg-meta/test/indexes.test.ts index be1e02425dd..88a16c51995 100644 --- a/packages/pg-meta/test/indexes.test.ts +++ b/packages/pg-meta/test/indexes.test.ts @@ -166,3 +166,35 @@ withTestDatabase('list with filters', async ({ executeQuery }) => { const offset = offsetZod.parse(await executeQuery(offsetSql)) expect(offset).toHaveLength(withoutSystem.length - 1) }) + +withTestDatabase('handles same index name across schemas correctly', async ({ executeQuery }) => { + // Create two schemas + await executeQuery(`CREATE SCHEMA schema_a;`) + await executeQuery(`CREATE SCHEMA schema_b;`) + + // Create tables + await executeQuery(`CREATE TABLE schema_a.test (id int);`) + await executeQuery(`CREATE TABLE schema_b.test (id int);`) + + // Create SAME index name in both schemas + await executeQuery(`CREATE INDEX idx_test ON schema_a.test (id);`) + await executeQuery(`CREATE INDEX idx_test ON schema_b.test (id);`) + + // Fetch indexes + const { sql, zod } = await pgMeta.indexes.list({ includeSystemSchemas: true }) + const indexes = zod.parse(await executeQuery(sql)) + + const schemaAIndex = indexes.find( + (i) => i.schema === 'schema_a' && i.index_definition.includes('schema_a.test') + ) + + const schemaBIndex = indexes.find( + (i) => i.schema === 'schema_b' && i.index_definition.includes('schema_b.test') + ) + + expect(schemaAIndex).toBeDefined() + expect(schemaBIndex).toBeDefined() + + expect(schemaAIndex!.index_definition).toContain('schema_a.test') + expect(schemaBIndex!.index_definition).toContain('schema_b.test') +})