Skip to content

Commit 9afe49b

Browse files
waltaskewolavloite
andauthored
fix: Retrieve columns in compound indexes in correct order (#798)
Fixes #797 Co-authored-by: Knut Olav Løite <koloite@gmail.com>
1 parent 6cbf00b commit 9afe49b

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,33 +1267,36 @@ def get_multi_indexes(
12671267
i.table_schema,
12681268
i.table_name,
12691269
i.index_name,
1270-
(
1271-
SELECT ARRAY_AGG(ic.column_name)
1270+
ARRAY(
1271+
SELECT ic.column_name
12721272
FROM information_schema.index_columns ic
12731273
WHERE ic.index_name = i.index_name
12741274
AND ic.table_catalog = i.table_catalog
12751275
AND ic.table_schema = i.table_schema
12761276
AND ic.table_name = i.table_name
12771277
AND ic.column_ordering is not null
1278+
ORDER BY ic.ordinal_position
12781279
) as columns,
12791280
i.is_unique,
1280-
(
1281-
SELECT ARRAY_AGG(ic.column_ordering)
1281+
ARRAY(
1282+
SELECT ic.column_ordering
12821283
FROM information_schema.index_columns ic
12831284
WHERE ic.index_name = i.index_name
12841285
AND ic.table_catalog = i.table_catalog
12851286
AND ic.table_schema = i.table_schema
12861287
AND ic.table_name = i.table_name
12871288
AND ic.column_ordering is not null
1289+
ORDER BY ic.ordinal_position
12881290
) as column_orderings,
1289-
(
1290-
SELECT ARRAY_AGG(storing.column_name)
1291+
ARRAY(
1292+
SELECT storing.column_name
12911293
FROM information_schema.index_columns storing
12921294
WHERE storing.index_name = i.index_name
12931295
AND storing.table_catalog = i.table_catalog
12941296
AND storing.table_schema = i.table_schema
12951297
AND storing.table_name = i.table_name
12961298
AND storing.column_ordering is null
1299+
ORDER BY storing.ordinal_position
12971300
) as storing_columns,
12981301
FROM information_schema.indexes as i
12991302
JOIN information_schema.tables AS t

test/system/test_basics.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def define_tables(cls, metadata):
106106
Column("a", String, primary_key=True),
107107
Column("b", String, primary_key=True),
108108
)
109-
Table(
109+
composite_fk = Table(
110110
"composite_fk",
111111
metadata,
112112
Column("my_a", String, primary_key=True),
@@ -118,6 +118,12 @@ def define_tables(cls, metadata):
118118
name="composite_fk_composite_pk_a_b",
119119
),
120120
)
121+
Index(
122+
"idx_composte_fk_all",
123+
composite_fk.c.my_a,
124+
composite_fk.c.my_b,
125+
composite_fk.c.my_c,
126+
)
121127

122128
def test_hello_world(self, connection):
123129
greeting = connection.execute(text("select 'Hello World'"))
@@ -356,6 +362,28 @@ def test_composite_fk_lookups(self, connection):
356362
insp.get_multi_foreign_keys(filter_names=["composite_fk"]),
357363
)
358364

365+
def test_composite_index_lookups(self, connection):
366+
"""Ensures we introspect composite indexes."""
367+
368+
engine = connection.engine
369+
370+
insp = inspect(engine)
371+
eq_(
372+
{
373+
(None, "composite_fk"): [
374+
{
375+
"name": "idx_composte_fk_all",
376+
"column_names": ["my_a", "my_b", "my_c"],
377+
"unique": False,
378+
"column_sorting": {"my_a": "asc", "my_b": "asc", "my_c": "asc"},
379+
"include_columns": [],
380+
"dialect_options": {},
381+
}
382+
]
383+
},
384+
insp.get_multi_indexes(filter_names=["composite_fk"]),
385+
)
386+
359387
def test_commit_timestamp(self, connection):
360388
"""Ensures commit timestamps are set."""
361389

0 commit comments

Comments
 (0)