#29500: SQLite functions crashes on NULL values -------------------------------------+------------------------------------- Reporter: Sergey Fedoseev | Owner: Srinivas | Reddy Thatiparthy Type: Bug | Status: assigned Component: Database layer | Version: 2.0 (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Nick Pope): We need to be careful how we handle this to ensure that the behaviour mirrors other backends. I've checked PostgreSQL and when any one of the arguments to `POWER()`. `LPAD()` or `RPAD()` is `NULL` they return `NULL`. We should ensure that we check whether any one of the arguments is `None` and, if so, return `None`. We must not catch exceptions such as `TypeError` or `ValueError` to do this as has been done in the initial version of the [https://github.com/django/django/pull/10121 PR]. If we were to pass a string to `_sqlite_power()` we would expect a `TypeError` which should blow up, not return `None`. Compare to PostgreSQL: {{{ postgres=# select power(2, 'abc'); ERROR: invalid input syntax for type double precision: "abc" LINE 1: select power(2, 'abc'); ^ }}} The second part of the problem here is that the sqlite backend suppresses the error message and returns a different exception: {{{ OperationalError: user-defined function raised exception }}} Obviously this is not particularly helpful, but a quick search and I found the following on Stack Overflow: https://stackoverflow.com/a/45834923 It points to the documentation for [https://docs.python.org/3/library/sqlite3.html#sqlite3.enable_callback_tracebacks sqlite3.enable_callback_tracebacks()]. I would recommend the following: 1. Creation of a decorator to check for `None` passed into any of the arguments which returns `None` or calls the function as appropriate. 2. Enabling callbacks on tracebacks for sqlite3 (always / when debug enabled / documentation change to give instruction). Note that the outcome of this pull request will affect [https://github.com/django/django/pull/9622 PR/9622] which I am reviewing, particular with respect to my [https://github.com/django/django/pull/9622#discussion_r165360894 comment]. -- Ticket URL: <https://code.djangoproject.com/ticket/29500#comment:6> 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/068.c9bbbdb14e946e7b83c543e2211fecab%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.