Skip to content

Commit bd35a7e

Browse files
fix: Include EXPRESSION column in MySQL get_indexes_sql for functional indexes
The information_schema.statistics query was only returning COLUMN_NAME, which is NULL for functional (expression) indexes like JSON path indexes. Use COALESCE to return either COLUMN_NAME or the expression wrapped in parentheses, matching the original SHOW KEYS behavior. Also include SEQ_IN_INDEX for proper ordering.
1 parent da0ac48 commit bd35a7e

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

src/datajoint/adapters/mysql.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,9 +652,15 @@ def parse_foreign_key_error(self, error_message: str) -> dict[str, str | list[st
652652
return result
653653

654654
def get_indexes_sql(self, schema_name: str, table_name: str) -> str:
655-
"""Query to get index definitions."""
655+
"""Query to get index definitions.
656+
657+
Note: For MySQL 8.0+, EXPRESSION column contains the expression for
658+
functional indexes. COLUMN_NAME is NULL for such indexes.
659+
"""
656660
return (
657-
f"SELECT INDEX_NAME as index_name, COLUMN_NAME as column_name, NON_UNIQUE as non_unique "
661+
f"SELECT INDEX_NAME as index_name, "
662+
f"COALESCE(COLUMN_NAME, CONCAT('(', EXPRESSION, ')')) as column_name, "
663+
f"NON_UNIQUE as non_unique, SEQ_IN_INDEX as seq_in_index "
658664
f"FROM information_schema.statistics "
659665
f"WHERE table_schema = {self.quote_string(schema_name)} "
660666
f"AND table_name = {self.quote_string(table_name)} "

0 commit comments

Comments
 (0)