1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

Refs #30593 -- Fixed introspection of check constraints columns on MariaDB.

This commit is contained in:
Hasan Ramezani
2019-07-30 16:21:05 +02:00
committed by Mariusz Felisiak
parent b2aad9ad4d
commit e3fc9af4ab
2 changed files with 20 additions and 8 deletions

View File

@@ -147,12 +147,16 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
return self.connection.features._mysql_storage_engine
return result[0]
def _parse_constraint_columns(self, check_clause):
def _parse_constraint_columns(self, check_clause, columns):
check_columns = OrderedSet()
statement = sqlparse.parse(check_clause)[0]
tokens = (token for token in statement.flatten() if not token.is_whitespace)
for token in tokens:
if token.ttype in [sqlparse.tokens.Name, sqlparse.tokens.Literal.String.Single]:
if (
token.ttype == sqlparse.tokens.Name and
self.connection.ops.quote_name(token.value) == token.value and
token.value[1:-1] in columns
):
check_columns.add(token.value[1:-1])
return check_columns
@@ -201,6 +205,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
constraints[constraint]['unique'] = True
# Add check constraints.
if self.connection.features.can_introspect_check_constraints:
columns = {info.name for info in self.get_table_description(cursor, table_name)}
type_query = """
SELECT c.constraint_name, c.check_clause
FROM information_schema.check_constraints AS c
@@ -211,7 +216,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
cursor.execute(type_query, [table_name])
for constraint, check_clause in cursor.fetchall():
constraints[constraint] = {
'columns': self._parse_constraint_columns(check_clause),
'columns': self._parse_constraint_columns(check_clause, columns),
'primary_key': False,
'unique': False,
'index': False,