Ensure we don't introspect pg indexes defined on diff schema.

Fixes #3043
This commit is contained in:
Charles Leifer
2026-04-23 07:53:46 -05:00
parent 2fc7057792
commit 19a1ca7e15
2 changed files with 41 additions and 4 deletions
+6 -3
View File
@@ -4214,11 +4214,14 @@ class PostgresqlDatabase(Database):
FROM generate_subscripts(idx.indkey, 1) AS k
ORDER BY k), ',')
FROM pg_catalog.pg_class AS t
INNER JOIN pg_catalog.pg_namespace AS n ON t.relnamespace = n.oid
INNER JOIN pg_catalog.pg_index AS idx ON t.oid = idx.indrelid
INNER JOIN pg_catalog.pg_class AS i ON idx.indexrelid = i.oid
INNER JOIN pg_catalog.pg_indexes AS idxs ON
(idxs.tablename = t.relname AND idxs.indexname = i.relname)
WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s
INNER JOIN pg_catalog.pg_indexes AS idxs ON (
idxs.tablename = t.relname
AND idxs.indexname = i.relname
AND idxs.schemaname = n.nspname)
WHERE t.relname = %s AND t.relkind = %s AND n.nspname = %s
ORDER BY idx.indisunique DESC, i.relname;"""
cursor = self.execute_sql(query, (table, 'r', schema or 'public'))
return [IndexMetadata(name, sql.rstrip(' ;'), columns.split(','),
+35 -1
View File
@@ -15,12 +15,13 @@ from peewee import *
from peewee import NodeList
from .base import BaseTestCase
from .base import get_in_memory_db
from .base import IS_CRDB
from .base import IS_SQLITE
from .base import ModelDatabaseTestCase
from .base import ModelTestCase
from .base import TestModel
from .base import get_in_memory_db
from .base import requires_postgresql
from .base_models import Category
from .base_models import Note
from .base_models import Person
@@ -1237,3 +1238,36 @@ class TestSchemaCreateAllDropAll(ModelTestCase):
TempModel._schema.drop_all()
self.assertFalse(self.database.table_exists('temp_model'))
@requires_postgresql
class TestSchemaGetIndexes(ModelTestCase):
def setUp(self):
super(TestSchemaGetIndexes, self).setUp()
queries = [
'create schema s1', 'create schema s2',
'create table s1.t (c1 integer, c2 integer, c3 integer)',
'create table s2.t (c1 integer, c2 integer, c3 integer)',
'create index i1 on s1.t (c1, c2)',
'create index i1 on s2.t (c1, c2)',
'create index i2 on s1.t (c1)',
]
with self.database:
for query in queries:
self.database.execute_sql(query)
def tearDown(self):
with self.database:
self.database.execute_sql('drop schema s1 cascade')
self.database.execute_sql('drop schema s2 cascade')
super(TestSchemaGetIndexes, self).setUp()
def test_schema_get_indexes(self):
tables = self.database.get_tables(schema='s1')
self.assertEqual(tables, ['t'])
idxs = self.database.get_indexes('t', schema='s1')
self.assertEqual([(i.name, i.columns) for i in idxs],
[('i1', ['c1', 'c2']), ('i2', ['c1'])])
idxs = self.database.get_indexes('t', schema='s2')
self.assertEqual([(i.name, i.columns) for i in idxs],
[('i1', ['c1', 'c2'])])