summaryrefslogtreecommitdiff
path: root/django/db/backends/sqlite3
diff options
context:
space:
mode:
authorHannes Ljungberg <hannes@5monkeys.se>2019-10-10 20:04:17 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-01-13 11:47:50 +0100
commit83fcfc9ec8610540948815e127101f1206562ead (patch)
treeaca51a61ef2d7397ee170fc74c564d242c441147 /django/db/backends/sqlite3
parente3ece0144a988bc522c4bd551baecaf2139ce4ed (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.py1
-rw-r--r--django/db/backends/sqlite3/introspection.py14
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