summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2016-10-14 19:59:13 +0200
committerTim Graham <timograham@gmail.com>2016-10-14 13:59:13 -0400
commit5a772a0b7bf71128287396d310ddd3db13625a1f (patch)
tree14b1857b12db0723b3b12cd41fe3a4416b997719 /django
parent424187ec4be73a36d5430901382a27c8523f446a (diff)
Fixed #27324 -- Simplified DatabaseIntrospection.get_constraints() on Oracle.
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/oracle/introspection.py56
1 files 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)