From 5a772a0b7bf71128287396d310ddd3db13625a1f Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 14 Oct 2016 19:59:13 +0200 Subject: [PATCH] Fixed #27324 -- Simplified DatabaseIntrospection.get_constraints() on Oracle. --- django/db/backends/oracle/introspection.py | 56 +++++++--------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py index 2ac43deff6..f0d5f080b6 100644 --- a/django/db/backends/oracle/introspection.py +++ b/django/db/backends/oracle/introspection.py @@ -158,7 +158,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns. """ constraints = {} - # Loop over the constraints, getting PKs and uniques + # Loop over the constraints, getting PKs, uniques, and checks cursor.execute(""" SELECT user_constraints.constraint_name, @@ -167,29 +167,34 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): WHEN 'P' THEN 1 ELSE 0 END AS is_primary_key, - CASE user_indexes.uniqueness - WHEN 'UNIQUE' THEN 1 + CASE + WHEN EXISTS ( + SELECT 1 + FROM user_indexes + WHERE user_indexes.index_name = user_constraints.index_name + AND user_indexes.uniqueness = 'UNIQUE' + ) + THEN 1 ELSE 0 END AS is_unique, CASE user_constraints.constraint_type WHEN 'C' THEN 1 ELSE 0 - END AS is_check_constraint + END AS is_check_constraint, + CASE + WHEN user_constraints.constraint_type IN ('P', 'U') THEN 1 + ELSE 0 + END AS has_index FROM user_constraints - INNER JOIN - user_indexes ON user_indexes.index_name = user_constraints.index_name LEFT OUTER JOIN user_cons_columns cols ON user_constraints.constraint_name = cols.constraint_name WHERE - ( - user_constraints.constraint_type = 'P' OR - user_constraints.constraint_type = 'U' - ) + user_constraints.constraint_type = ANY('P', 'U', 'C') AND user_constraints.table_name = UPPER(%s) ORDER BY cols.position """, [table_name]) - for constraint, column, pk, unique, check in cursor.fetchall(): + for constraint, column, pk, unique, check, index in cursor.fetchall(): # If we're the first column, make the record if constraint not in constraints: constraints[constraint] = { @@ -198,34 +203,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): "unique": unique, "foreign_key": None, "check": check, - "index": True, # All P and U come with index, see inner join above - } - # Record the details - constraints[constraint]['columns'].append(column) - # Check constraints - cursor.execute(""" - SELECT - cons.constraint_name, - LOWER(cols.column_name) AS column_name - FROM - user_constraints cons - LEFT OUTER JOIN - user_cons_columns cols ON cons.constraint_name = cols.constraint_name - WHERE - cons.constraint_type = 'C' AND - cons.table_name = UPPER(%s) - ORDER BY cols.position - """, [table_name]) - for constraint, column in cursor.fetchall(): - # If we're the first column, make the record - if constraint not in constraints: - constraints[constraint] = { - "columns": [], - "primary_key": False, - "unique": False, - "foreign_key": None, - "check": True, - "index": False, + "index": index, # All P and U come with index } # Record the details constraints[constraint]['columns'].append(column)