Skip to content

Crash on nullable foreign keys with slices #7

Open
@Wilfred

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions