diff options
| author | Hannes Ljungberg <hannes@5monkeys.se> | 2019-10-10 20:04:17 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-01-13 11:47:50 +0100 |
| commit | 83fcfc9ec8610540948815e127101f1206562ead (patch) | |
| tree | aca51a61ef2d7397ee170fc74c564d242c441147 /django/db/backends/sqlite3 | |
| parent | e3ece0144a988bc522c4bd551baecaf2139ce4ed (diff) | |
Fixed #26167 -- Added support for functional indexes.
Thanks Simon Charette, Mads Jensen, and Mariusz Felisiak for reviews.
Co-authored-by: Markus Holtermann <info@markusholtermann.eu>
Diffstat (limited to 'django/db/backends/sqlite3')
| -rw-r--r-- | django/db/backends/sqlite3/features.py | 1 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/introspection.py | 14 |
2 files changed, 12 insertions, 3 deletions
diff --git a/django/db/backends/sqlite3/features.py b/django/db/backends/sqlite3/features.py index 3348256c74..31055f8f99 100644 --- a/django/db/backends/sqlite3/features.py +++ b/django/db/backends/sqlite3/features.py @@ -38,6 +38,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_pragma_foreign_key_check = Database.sqlite_version_info >= (3, 20, 0) can_defer_constraint_checks = supports_pragma_foreign_key_check supports_functions_in_partial_indexes = Database.sqlite_version_info >= (3, 15, 0) + supports_expression_indexes = True supports_over_clause = Database.sqlite_version_info >= (3, 25, 0) supports_frame_range_fixed_distance = Database.sqlite_version_info >= (3, 28, 0) supports_aggregate_filter_clause = Database.sqlite_version_info >= (3, 30, 1) diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py index 1d7ce3fabf..8c1d4582ab 100644 --- a/django/db/backends/sqlite3/introspection.py +++ b/django/db/backends/sqlite3/introspection.py @@ -416,9 +416,9 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): if constraints[index]['index'] and not constraints[index]['unique']: # SQLite doesn't support any index type other than b-tree constraints[index]['type'] = Index.suffix - order_info = sql.split('(')[-1].split(')')[0].split(',') - orders = ['DESC' if info.endswith('DESC') else 'ASC' for info in order_info] - constraints[index]['orders'] = orders + orders = self._get_index_columns_orders(sql) + if orders is not None: + constraints[index]['orders'] = orders # Get the PK pk_column = self.get_primary_key_column(cursor, table_name) if pk_column: @@ -437,6 +437,14 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): constraints.update(self._get_foreign_key_constraints(cursor, table_name)) return constraints + def _get_index_columns_orders(self, sql): + tokens = sqlparse.parse(sql)[0] + for token in tokens: + if isinstance(token, sqlparse.sql.Parenthesis): + columns = str(token).strip('()').split(', ') + return ['DESC' if info.endswith('DESC') else 'ASC' for info in columns] + return None + def _get_column_collations(self, cursor, table_name): row = cursor.execute(""" SELECT sql |
