#36111: --debug-sql fails on Oracle if a query with params fails to execute and 
no
prior query has either
-----------------------------------+---------------------------------------
     Reporter:  Jacob Walls        |                    Owner:  Jacob Walls
         Type:  Bug                |                   Status:  assigned
    Component:  Testing framework  |                  Version:  dev
     Severity:  Normal             |               Resolution:
     Keywords:                     |             Triage Stage:  Unreviewed
    Has patch:  1                  |      Needs documentation:  0
  Needs tests:  0                  |  Patch needs improvement:  0
Easy pickings:  1                  |                    UI/UX:  0
-----------------------------------+---------------------------------------
Description changed by Jacob Walls:

Old description:

> Noticed while working on ticket:35972 that an Oracle failure I wanted to
> debug with `--debug-sql` failed like:
>
> {{{#!py
> ======================================================================
> ERROR: test_last_executed_query_without_previous_query
> (backends.tests.LastExecutedQueryTest)
> last_executed_query should not raise an exception even if no previous
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/django/source/tests/backends/tests.py", line 80, in
> test_last_executed_query_without_previous_query
>     connection.ops.last_executed_query(cursor, "SELECT %s;", (Value(1),))
>   File "/django/source/django/db/backends/oracle/operations.py", line
> 330, in last_executed_query
>     statement = statement.replace(
> AttributeError: 'NoneType' object has no attribute 'replace'
> }}}
>
> Failing test:
>
> {{{#!diff
> diff --git a/tests/backends/tests.py b/tests/backends/tests.py
> index 2adfa51360..b9cc4d119c 100644
> --- a/tests/backends/tests.py
> +++ b/tests/backends/tests.py
> @@ -19,6 +19,7 @@ from django.db import (
>  from django.db.backends.base.base import BaseDatabaseWrapper
>  from django.db.backends.signals import connection_created
>  from django.db.backends.utils import CursorWrapper
> +from django.db.models import Value
>  from django.db.models.sql.constants import CURSOR
>  from django.test import (
>      TestCase,
> @@ -74,7 +75,9 @@ class LastExecutedQueryTest(TestCase):
>          query has been run.
>          """
>          with connection.cursor() as cursor:
> -            connection.ops.last_executed_query(cursor, "", ())
> +            if connection.vendor == "oracle":
> +                cursor.statement = None
> +            connection.ops.last_executed_query(cursor, "SELECT %s;",
> (Value(1),))
>
>      def test_debug_sql(self):
>          list(Reporter.objects.filter(first_name="test"))
> }}}
>
> The actual failure (where `cursor.statement` was None) happened via
> making this copy-paste mistake from the `as_sql()` method before it:
> {{{#!diff
> diff --git a/django/db/models/fields/json.py
> b/django/db/models/fields/json.py
> index d59c3afd71..108e4d7b0d 100644
> --- a/django/db/models/fields/json.py
> +++ b/django/db/models/fields/json.py
> @@ -252,7 +252,7 @@ class HasKeyLookup(PostgresOperatorLookup):
>              # queries but it is assumed that it cannot be evaded because
> the
>              # path is JSON serialized.
>              sql_parts.append(template % (lhs_sql, rhs_json_path))
> -            params.extend(lhs_params)
> +            params.extend(list(lhs_params) + [rhs_json_path])
>          return self._combine_sql_parts(sql_parts), tuple(params)
>
>      def as_postgresql(self, compiler, connection):
> }}}

New description:

 Noticed while working on ticket:35972 that an Oracle failure I wanted to
 debug with `--debug-sql` failed like:

 {{{#!py
 ======================================================================
 ERROR: test_last_executed_query_without_previous_query
 (backends.tests.LastExecutedQueryTest)
 last_executed_query should not raise an exception even if no previous
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/django/source/tests/backends/tests.py", line 80, in
 test_last_executed_query_without_previous_query
     connection.ops.last_executed_query(cursor, "SELECT %s;", (1,))
   File "/django/source/django/db/backends/oracle/operations.py", line 330,
 in last_executed_query
     statement = statement.replace(
 AttributeError: 'NoneType' object has no attribute 'replace'
 }}}

 Failing test:

 {{{#!diff
 diff --git a/tests/backends/tests.py b/tests/backends/tests.py
 index 2adfa51360..b9cc4d119c 100644
 --- a/tests/backends/tests.py
 +++ b/tests/backends/tests.py
 @@ -19,6 +19,7 @@ from django.db import (
  from django.db.backends.base.base import BaseDatabaseWrapper
  from django.db.backends.signals import connection_created
  from django.db.backends.utils import CursorWrapper
  from django.db.models.sql.constants import CURSOR
  from django.test import (
      TestCase,
 @@ -74,7 +75,9 @@ class LastExecutedQueryTest(TestCase):
          query has been run.
          """
          with connection.cursor() as cursor:
 -            connection.ops.last_executed_query(cursor, "", ())
 +            if connection.vendor == "oracle":
 +                cursor.statement = None
 +            connection.ops.last_executed_query(cursor, "SELECT %s;",
 (1,))

      def test_debug_sql(self):
          list(Reporter.objects.filter(first_name="test"))
 }}}

 The actual failure (where `cursor.statement` was None) happened via making
 this copy-paste mistake from the `as_sql()` method before it:
 {{{#!diff
 diff --git a/django/db/models/fields/json.py
 b/django/db/models/fields/json.py
 index d59c3afd71..108e4d7b0d 100644
 --- a/django/db/models/fields/json.py
 +++ b/django/db/models/fields/json.py
 @@ -252,7 +252,7 @@ class HasKeyLookup(PostgresOperatorLookup):
              # queries but it is assumed that it cannot be evaded because
 the
              # path is JSON serialized.
              sql_parts.append(template % (lhs_sql, rhs_json_path))
 -            params.extend(lhs_params)
 +            params.extend(list(lhs_params) + [rhs_json_path])
          return self._combine_sql_parts(sql_parts), tuple(params)

      def as_postgresql(self, compiler, connection):
 }}}

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36111#comment:2>
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 [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/010701947aee8da3-468607c2-bb79-4e8c-b667-9da820bf26d0-000000%40eu-central-1.amazonses.com.

Reply via email to