#36107: PostgresSQL ArrayField with size crashes with bulk_create
-------------------------------------+-------------------------------------
Reporter: Claude Paroz | Type: Bug
Status: new | Component: Database
| layer (models, ORM)
Version: 5.2 | Severity: Release
| blocker
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
When trying to `bulk_create` model instances with an ArrayField with a
specified `size` (and triggering the UNNEST instruction), the query
crashes at database level (column "<field>" is of type double precision[]
but expression is of type double precision).
Probably a regression in a16eedcf9c69d8a11d94cac1811018c5b996d491
A possible reproducing test:
{{{
diff --git a/tests/postgres_tests/migrations/0002_create_test_models.py
b/tests/postgres_tests/migrations/0002_create_test_models.py
index 188f79607d..31705ae21a 100644
--- a/tests/postgres_tests/migrations/0002_create_test_models.py
+++ b/tests/postgres_tests/migrations/0002_create_test_models.py
@@ -167,6 +167,28 @@ class Migration(migrations.Migration):
},
bases=(models.Model,),
),
+ migrations.CreateModel(
+ name="WithSizeArrayModel",
+ fields=[
+ (
+ "id",
+ models.AutoField(
+ verbose_name="ID",
+ serialize=False,
+ auto_created=True,
+ primary_key=True,
+ ),
+ ),
+ (
+ "field",
+ ArrayField(models.FloatField(), size=2, null=True,
blank=True),
+ ),
+ ],
+ options={
+ "required_db_vendor": "postgresql",
+ },
+ bases=(models.Model,),
+ ),
migrations.CreateModel(
name="NullableIntegerArrayModel",
fields=[
diff --git a/tests/postgres_tests/models.py
b/tests/postgres_tests/models.py
index e3118bc590..1563f6a35d 100644
--- a/tests/postgres_tests/models.py
+++ b/tests/postgres_tests/models.py
@@ -64,6 +64,10 @@ class DateTimeArrayModel(PostgreSQLModel):
times = ArrayField(models.TimeField())
+class WithSizeArrayModel(PostgreSQLModel):
+ field = ArrayField(models.FloatField(), size=3)
+
+
class NestedIntegerArrayModel(PostgreSQLModel):
field = ArrayField(ArrayField(models.IntegerField()))
diff --git a/tests/postgres_tests/test_array.py
b/tests/postgres_tests/test_array.py
index d930a01a1d..c2b0ebcd31 100644
--- a/tests/postgres_tests/test_array.py
+++ b/tests/postgres_tests/test_array.py
@@ -28,6 +28,7 @@ from .models import (
OtherTypesArrayModel,
PostgreSQLModel,
Tag,
+ WithSizeArrayModel,
)
try:
@@ -216,6 +217,12 @@ class TestQuerying(PostgreSQLTestCase):
]
)
+ def test_bulk_create_with_sized_arrayfield(self):
+ WithSizeArrayModel.objects.bulk_create([
+ WithSizeArrayModel(field=[1, 2]),
+ WithSizeArrayModel(field=[3, 4]),
+ ])
+
def test_empty_list(self):
NullableIntegerArrayModel.objects.create(field=[])
obj = (
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/36107>
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/01070194752cee5e-92281592-6dc3-4746-a5d7-78fa63c2061a-000000%40eu-central-1.amazonses.com.