[2.2.x] Fixed #30754 -- Prevented inclusion of aliases in partial index conditions.
SQLite doesn't repoint table aliases in partial index conditions on table
rename which breaks the documented table alteration procedure.
Thanks Pēteris Caune for the report.
Backport of 34decdebf1
from master
This commit is contained in:
parent
be053c0b2a
commit
964dd4f4f2
|
@ -59,13 +59,10 @@ class Index:
|
|||
if self.condition is None:
|
||||
return None
|
||||
query = Query(model=model)
|
||||
query.add_q(self.condition)
|
||||
where = query.build_where(self.condition)
|
||||
compiler = query.get_compiler(connection=schema_editor.connection)
|
||||
# Only the WhereNode is of interest for the partial index.
|
||||
sql, params = query.where.as_sql(compiler=compiler, connection=schema_editor.connection)
|
||||
# BaseDatabaseSchemaEditor does the same map on the params, but since
|
||||
# it's handled outside of that class, the work is done here.
|
||||
return sql % tuple(map(schema_editor.quote_value, params))
|
||||
sql, params = where.as_sql(compiler, schema_editor.connection)
|
||||
return sql % tuple(schema_editor.quote_value(p) for p in params)
|
||||
|
||||
def create_sql(self, model, schema_editor, using=''):
|
||||
fields = [model._meta.get_field(field_name) for field_name, _ in self.fields_orders]
|
||||
|
|
|
@ -9,4 +9,5 @@ Django 2.2.6 fixes several bugs in 2.2.5.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed migrations crash on SQLite when altering a model containing partial
|
||||
indexes (:ticket:`30754`).
|
||||
|
|
|
@ -108,7 +108,7 @@ class PartialIndexConditionIgnoredTests(TransactionTestCase):
|
|||
editor.add_index(Article, index)
|
||||
|
||||
self.assertNotIn(
|
||||
'WHERE %s.%s' % (editor.quote_name(Article._meta.db_table), 'published'),
|
||||
'WHERE %s' % editor.quote_name('published'),
|
||||
str(index.create_sql(Article, editor))
|
||||
)
|
||||
|
||||
|
@ -260,7 +260,7 @@ class PartialIndexTests(TransactionTestCase):
|
|||
)
|
||||
)
|
||||
self.assertIn(
|
||||
'WHERE %s.%s' % (editor.quote_name(Article._meta.db_table), editor.quote_name("pub_date")),
|
||||
'WHERE %s' % editor.quote_name('pub_date'),
|
||||
str(index.create_sql(Article, schema_editor=editor))
|
||||
)
|
||||
editor.add_index(index=index, model=Article)
|
||||
|
@ -277,7 +277,7 @@ class PartialIndexTests(TransactionTestCase):
|
|||
condition=Q(pk__gt=1),
|
||||
)
|
||||
self.assertIn(
|
||||
'WHERE %s.%s' % (editor.quote_name(Article._meta.db_table), editor.quote_name('id')),
|
||||
'WHERE %s' % editor.quote_name('id'),
|
||||
str(index.create_sql(Article, schema_editor=editor))
|
||||
)
|
||||
editor.add_index(index=index, model=Article)
|
||||
|
@ -294,7 +294,7 @@ class PartialIndexTests(TransactionTestCase):
|
|||
condition=Q(published=True),
|
||||
)
|
||||
self.assertIn(
|
||||
'WHERE %s.%s' % (editor.quote_name(Article._meta.db_table), editor.quote_name('published')),
|
||||
'WHERE %s' % editor.quote_name('published'),
|
||||
str(index.create_sql(Article, schema_editor=editor))
|
||||
)
|
||||
editor.add_index(index=index, model=Article)
|
||||
|
@ -321,7 +321,7 @@ class PartialIndexTests(TransactionTestCase):
|
|||
sql = str(index.create_sql(Article, schema_editor=editor))
|
||||
where = sql.find('WHERE')
|
||||
self.assertIn(
|
||||
'WHERE (%s.%s' % (editor.quote_name(Article._meta.db_table), editor.quote_name("pub_date")),
|
||||
'WHERE (%s' % editor.quote_name('pub_date'),
|
||||
sql
|
||||
)
|
||||
# Because each backend has different syntax for the operators,
|
||||
|
@ -341,7 +341,7 @@ class PartialIndexTests(TransactionTestCase):
|
|||
condition=Q(pub_date__isnull=False),
|
||||
)
|
||||
self.assertIn(
|
||||
'WHERE %s.%s IS NOT NULL' % (editor.quote_name(Article._meta.db_table), editor.quote_name("pub_date")),
|
||||
'WHERE %s IS NOT NULL' % editor.quote_name('pub_date'),
|
||||
str(index.create_sql(Article, schema_editor=editor))
|
||||
)
|
||||
editor.add_index(index=index, model=Article)
|
||||
|
|
Loading…
Reference in New Issue