#25517: Concat() database function is not idempotent in SQLite ----------------------------------------------+---------------------------- Reporter: wsmith323 | Owner: nobody Type: Bug | Status: new Component: Database layer (models, ORM) | Version: master Severity: Normal | Keywords: concat | coalesce sqlite Triage Stage: Unreviewed | Has patch: 0 Easy pickings: 0 | UI/UX: 0 ----------------------------------------------+---------------------------- When running on sqlite, with a {{{Concat()}}} expression used in the query, the {{{ConcatPair.coalesce()}}} method is called every time the SQL is generated. This is normal, expected, and AFAIK, correct behavior.
The problem is that {{{ConcatPair.coalesce()}}} is NOT idempotent. So, EVERY time the SQL is generated, each expression within the {{{ConcatPair}}} instance is wrapped with an additional `COALESCE()` SQL function. If generated enough times, the SQL can reach a point where it will crash the sqlite query parser. This problem may not manifest itself in a typical request/response context, as the SQL with the additional `COALESCE()` calls will work identically to the original and the SQL may not be re-generated a sufficient number of times to crash the parser. However, in a long-running process (where this bug was found), it can be easily triggered. For example, say I have a "base" queryset with a {{{Concat()}}} within an {{{.annotate()}}}. I never actually evaluate this queryset, but I use it to construct other querysets which I do evaluate. Because all of these querysets share the same instance of Query._annotations, evaluating ANY of these querysets will add an additional level of COALESCE() to the SQL generated by the others. I have a fix coded. I will submit a PR shortly. -- Ticket URL: <https://code.djangoproject.com/ticket/25517> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/052.f68048d0d791ebd47f8489c564f16742%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.