diff options
author | Claude Paroz <claude@2xlibre.net> | 2016-08-31 21:05:39 +0200 |
---|---|---|
committer | Claude Paroz <claude@2xlibre.net> | 2016-09-12 09:26:33 +0200 |
commit | a1ad896422437b376462361560086609538779fc (patch) | |
tree | 8adc57c4dffd30aff83d2143c7158b2388b1266b /django/db/backends/postgresql/introspection.py | |
parent | 0c6fbea59ba592586140115bd654c7f6c0983f56 (diff) | |
download | django-a1ad896422437b376462361560086609538779fc.tar.gz |
Refs #27098 -- Added introspection for expression-based index on PostgreSQL
Also test it on PostGIS raster fields.
Diffstat (limited to 'django/db/backends/postgresql/introspection.py')
-rw-r--r-- | django/db/backends/postgresql/introspection.py | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/django/db/backends/postgresql/introspection.py b/django/db/backends/postgresql/introspection.py index a9a90253ec..24bd45c1da 100644 --- a/django/db/backends/postgresql/introspection.py +++ b/django/db/backends/postgresql/introspection.py @@ -152,7 +152,9 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): def get_constraints(self, cursor, table_name): """ - Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns. + Retrieve any constraints or keys (unique, pk, fk, check, index) across + one or more columns. Also retrieve the definition of expression-based + indexes. """ constraints = {} # Loop over the key table, collecting things as constraints. The column @@ -191,16 +193,21 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): "foreign_key": tuple(used_cols.split(".", 1)) if kind == "f" else None, "check": kind == "c", "index": False, + "definition": None, } # Now get indexes cursor.execute(""" SELECT indexname, array_agg(attname), indisunique, indisprimary, - array_agg(ordering), amname + array_agg(ordering), amname, exprdef FROM ( SELECT c2.relname as indexname, idx.*, attr.attname, am.amname, CASE + WHEN idx.indexprs IS NOT NULL THEN + pg_get_indexdef(idx.indexrelid) + END AS exprdef, + CASE WHEN am.amcanorder THEN CASE (option & 1) WHEN 1 THEN 'DESC' ELSE 'ASC' @@ -217,18 +224,19 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): LEFT JOIN pg_attribute attr ON attr.attrelid = c.oid AND attr.attnum = idx.key WHERE c.relname = %s ) s2 - GROUP BY indexname, indisunique, indisprimary, amname; + GROUP BY indexname, indisunique, indisprimary, amname, exprdef; """, [table_name]) - for index, columns, unique, primary, orders, type_ in cursor.fetchall(): + for index, columns, unique, primary, orders, type_, definition in cursor.fetchall(): if index not in constraints: constraints[index] = { - "columns": columns, - "orders": orders, + "columns": columns if columns != [None] else [], + "orders": orders if orders != [None] else [], "primary_key": primary, "unique": unique, "foreign_key": None, "check": False, "index": True, "type": type_, + "definition": definition, } return constraints |