summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChinmoy Chakraborty <chinmoy12c@gmail.com>2020-12-28 11:15:48 +0530
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-12-28 08:57:30 +0100
commit270072c4c231acd72a03534357a4aa59010e76ff (patch)
treecd962118db219e0206e7005042049b4717c030c5
parent89fc144dedc737a79929231438f035b1d4a993c9 (diff)
Fixed #32158 -- Fixed loaddata crash on SQLite when table/column names are SQL keywords.
-rw-r--r--django/db/backends/sqlite3/base.py11
-rw-r--r--tests/backends/models.py8
-rw-r--r--tests/backends/tests.py13
3 files changed, 28 insertions, 4 deletions
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py
index 2eeaf98c0d..ab4ea70492 100644
--- a/django/db/backends/sqlite3/base.py
+++ b/django/db/backends/sqlite3/base.py
@@ -327,19 +327,24 @@ class DatabaseWrapper(BaseDatabaseWrapper):
violations = cursor.execute('PRAGMA foreign_key_check').fetchall()
else:
violations = chain.from_iterable(
- cursor.execute('PRAGMA foreign_key_check(%s)' % table_name).fetchall()
+ cursor.execute(
+ 'PRAGMA foreign_key_check(%s)'
+ % self.ops.quote_name(table_name)
+ ).fetchall()
for table_name in table_names
)
# See https://www.sqlite.org/pragma.html#pragma_foreign_key_check
for table_name, rowid, referenced_table_name, foreign_key_index in violations:
foreign_key = cursor.execute(
- 'PRAGMA foreign_key_list(%s)' % table_name
+ 'PRAGMA foreign_key_list(%s)' % self.ops.quote_name(table_name)
).fetchall()[foreign_key_index]
column_name, referenced_column_name = foreign_key[3:5]
primary_key_column_name = self.introspection.get_primary_key_column(cursor, table_name)
primary_key_value, bad_value = cursor.execute(
'SELECT %s, %s FROM %s WHERE rowid = %%s' % (
- primary_key_column_name, column_name, table_name
+ self.ops.quote_name(primary_key_column_name),
+ self.ops.quote_name(column_name),
+ self.ops.quote_name(table_name),
),
(rowid,),
).fetchone()
diff --git a/tests/backends/models.py b/tests/backends/models.py
index 5368e8d903..15c81052ea 100644
--- a/tests/backends/models.py
+++ b/tests/backends/models.py
@@ -140,3 +140,11 @@ class Author(models.Model):
class Book(models.Model):
author = models.ForeignKey(Author, models.CASCADE, to_field='name')
+
+
+class SQLKeywordsModel(models.Model):
+ id = models.AutoField(primary_key=True, db_column='select')
+ reporter = models.ForeignKey(Reporter, models.CASCADE, db_column='where')
+
+ class Meta:
+ db_table = 'order'
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index ed1847ede5..dd537d1ea3 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -20,7 +20,7 @@ from django.test import (
from .models import (
Article, Object, ObjectReference, Person, Post, RawData, Reporter,
- ReporterProxy, SchoolClass, Square,
+ ReporterProxy, SchoolClass, SQLKeywordsModel, Square,
VeryLongModelNameZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ,
)
@@ -625,6 +625,17 @@ class FkConstraintsTests(TransactionTestCase):
connection.check_constraints()
transaction.set_rollback(True)
+ def test_check_constraints_sql_keywords(self):
+ with transaction.atomic():
+ obj = SQLKeywordsModel.objects.create(reporter=self.r)
+ obj.refresh_from_db()
+ obj.reporter_id = 30
+ with connection.constraint_checks_disabled():
+ obj.save()
+ with self.assertRaises(IntegrityError):
+ connection.check_constraints(table_names=['order'])
+ transaction.set_rollback(True)
+
class ThreadTests(TransactionTestCase):