Opened 18 years ago
Closed 18 years ago
#4293 closed (invalid)
The bug occur in a slice filter. |slice:"1::2" if query set is empty
Reported by: | Owned by: | Adrian Holovaty | |
---|---|---|---|
Component: | Template system | Version: | 0.96 |
Severity: | Keywords: | loop state | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
{% for film in films|slice:"1::2" %}
The films is an empty query set.
Exception Type: ProgrammingError
Exception Value: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1' at line 1")
Change History (2)
comment:1 by , 18 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 18 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Well, this is the traceback I get whether the QuerySet is empty or not:
Traceback (most recent call last): File "/home/gdub/bzr/django/main/django/template/__init__.py" in render_node 741. result = node.render(context) File "/home/gdub/bzr/django/main/django/template/defaulttags.py" in render 96. values = self.sequence.resolve(context, True) File "/home/gdub/bzr/django/main/django/template/__init__.py" in resolve 597. obj = func(obj, *arg_vals) File "/home/gdub/bzr/django/main/django/template/defaultfilters.py" in slice_ 354. return value[slice(*bits)] File "/home/gdub/bzr/django/main/django/db/models/query.py" in __getitem__ 148. return list(self._clone(_offset=offset, _limit=limit))[::k.step] File "/home/gdub/bzr/django/main/django/db/models/query.py" in __iter__ 108. return iter(self._get_data()) File "/home/gdub/bzr/django/main/django/db/models/query.py" in _get_data 470. self._result_cache = list(self.iterator()) File "/home/gdub/bzr/django/main/django/db/models/query.py" in iterator 174. select, sql, params = self._get_sql_clause() File "/home/gdub/bzr/django/main/django/db/models/query.py" in _get_sql_clause 550. assert self._offset is None, "'offset' is not allowed without 'limit'" AssertionError at /lab/items/ 'offset' is not allowed without 'limit'
but now that I think of it, we probably don't want this error to fail silently since it's an unsupported feature with QuerySets, and is not really the fault of the filter.
My error doesn't appear to be the same one you are seeing. If you could, please post more information. The full traceback, the query you are assigning to films
, and the generated SQL would be great. Without that, closing this ticket as invalid as I am unable to reproduce the error you are seeing.
I have not confirmed this, but it appears that the slice filter code is not catching AssertionError, which can be raised when an offset is specified without a limit. From
django/db/models/query.py
:If this is indeed the case, then this ticket should be changed to make the slice filter fail silently since there is already a ticket for slicing to the end of a QuerySet (#2150).