#36906: Oracle guard for coalescing text & varchar doesn't fathom JSONField
-------------------------------------+-------------------------------------
               Reporter:  Jacob      |          Owner:  Sarah Boyce
  Walls                              |
                   Type:  Bug        |         Status:  assigned
              Component:  Database   |        Version:  dev
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 `Coalesce` has an `as_oracle()` method to make sure that `varchar` and
 `NCLOB` (text) fields are not mixed. `JSONField` is also implemented as an
 `NCLOB` type, so it needs to be included in the check, too.

 Discovered in
 https://github.com/django/django/pull/20009#discussion_r2500562079.

 Rough test for demonstration purposes -- a little more realism would be
 nice.

 {{{#!diff
 diff --git a/tests/db_functions/comparison/test_coalesce.py
 b/tests/db_functions/comparison/test_coalesce.py
 index b08ae742df..839954f73c 100644
 --- a/tests/db_functions/comparison/test_coalesce.py
 +++ b/tests/db_functions/comparison/test_coalesce.py
 @@ -1,4 +1,4 @@
 -from django.db.models import Subquery, TextField
 +from django.db.models import JSONField, Subquery, TextField
  from django.db.models.functions import Coalesce, Lower
  from django.test import TestCase
  from django.utils import timezone
 @@ -51,6 +51,14 @@ class CoalesceTests(TestCase):
          self.assertQuerySetEqual(
              article.order_by("title"), [lorem_ipsum.lower()], lambda a:
 a.headline
          )
 +        # mixed JSON and Char
 +        article = Article.objects.annotate(
 +            # fix this to be more realistic?
 +            summary_or_metadata=Coalesce("summary", "metadata",
 output_field=JSONField()),
 +        )
 +        self.assertQuerySetEqual(
 +            article.order_by("title"), [{}], lambda a:
 a.summary_or_metadata
 +        )

      def test_ordering(self):
          Author.objects.create(name="John Smith", alias="smithj")
 diff --git a/tests/db_functions/migrations/0002_create_test_models.py
 b/tests/db_functions/migrations/0002_create_test_models.py
 index 2fa924cbe0..7c57a1eee7 100644
 --- a/tests/db_functions/migrations/0002_create_test_models.py
 +++ b/tests/db_functions/migrations/0002_create_test_models.py
 @@ -50,6 +50,7 @@ class Migration(migrations.Migration):
                  ("published", models.DateTimeField(null=True,
 blank=True)),
                  ("updated", models.DateTimeField(null=True, blank=True)),
                  ("views", models.PositiveIntegerField(default=0)),
 +                ("metadata", models.JSONField(default=dict)),
              ],
          ),
          migrations.CreateModel(
 diff --git a/tests/db_functions/models.py b/tests/db_functions/models.py
 index 45a5a027f4..7fb6200fb5 100644
 --- a/tests/db_functions/models.py
 +++ b/tests/db_functions/models.py
 @@ -21,6 +21,7 @@ class Article(models.Model):
      published = models.DateTimeField(null=True, blank=True)
      updated = models.DateTimeField(null=True, blank=True)
      views = models.PositiveIntegerField(default=0)
 +    metadata = models.JSONField(default=dict)


  class Fan(models.Model):
 }}}

 {{{#!py
 django.db.utils.DatabaseError: ORA-00932: expression
 ("DB_FUNCTIONS_ARTICLE"."METADATA") is of data type NCLOB, which is
 incompatible with expected data type NCHAR
 Help: https://docs.oracle.com/error-help/db/ora-00932/
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36906>
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/0107019c34aa5eab-3679241a-0d40-4550-8f9e-4b082d84c840-000000%40eu-central-1.amazonses.com.

Reply via email to