Open
Description
Given the models:
from django.db import models
class Foo(models.Model):
name = models.CharField(max_length=100, blank=True, null=True)
class PointsToFoo(models.Model):
foo = models.ForeignKey(Foo, null=True)
And given the following settings (note the FkNullFix):
DATABASES['default'] = {'ENGINE': 'dbindexer', 'TARGET': 'native'}
DBINDEXER_BACKENDS = (
'dbindexer.backends.BaseResolver',
'dbindexer.backends.FKNullFix',
'dbindexer.backends.InMemoryJOINResolver',
)
Querying for null foreign keys generates the following crash:
from django.test import TestCase
from artproject_debug.models import PointsToFoo
class DBIndexerNullableFK(TestCase):
def test_dbindexer(self):
filtered_queryset = PointsToFoo.objects.filter(foo=None)
# force query to occur (yes, twice is necessary)
list(filtered_queryset[:500])
list(filtered_queryset[:500])
Traceback:
======================================================================
ERROR: test_dbindexer (artproject_debug.tests.DBIndexerNullableFK)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/wilfred/work/gap2/artproject_debug/tests.py", line 10, in test_dbindexer
list(filtered_queryset[:500])
File "/home/wilfred/work/gap2/django/db/models/query.py", line 85, in __len__
self._result_cache.extend(self._iter)
File "/home/wilfred/work/gap2/django/db/models/query.py", line 276, in iterator
for row in compiler.results_iter():
File "/home/wilfred/work/gap2/dbindexer/compiler.py", line 27, in results_iter
self.convert_filters()
File "/home/wilfred/work/gap2/dbindexer/compiler.py", line 19, in convert_filters
resolver.convert_filters(self.query)
File "/home/wilfred/work/gap2/dbindexer/resolver.py", line 31, in convert_filters
backend.convert_filters(query)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 68, in convert_filters
self._convert_filters(query, query.where)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 75, in _convert_filters
self._convert_filters(query, child)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 78, in _convert_filters
self.convert_filter(query, filters, child, index)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 167, in convert_filter
self.fix_fk_null_filter(query, constraint)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 184, in fix_fk_null_filter
self.unref_alias(query, alias)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 170, in unref_alias
unref_alias(query, alias)
File "/home/wilfred/work/gap2/dbindexer/backends.py", line 145, in unref_alias
query.table_map[table_name].remove(alias)
ValueError: list.remove(x): x not in list
Metadata
Assignees
Labels
No labels