]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Check that arrays contain consistent objects.
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 5 Apr 2020 02:07:04 +0000 (14:07 +1200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 5 Apr 2020 02:07:04 +0000 (14:07 +1200)
psycopg3/types/array.py
tests/types/test_array.py

index 43a5a4408b5ee5a0116008c4439aa54a67499a99..6d0d937a0ba39552fcbd0e53004ce0fdba22355e 100644 (file)
@@ -106,6 +106,12 @@ class ListAdapter(BaseListAdapter):
                     if isinstance(ad, tuple):
                         if oid == 0:
                             oid = ad[1]
+                            got_type = type(item)
+                        elif oid != ad[1]:
+                            raise e.DataError(
+                                f"array contains different types,"
+                                f" at least {got_type} and {type(item)}"
+                            )
                         ad = ad[0]
                     tokens.append(escape_item(ad))
 
@@ -148,6 +154,12 @@ class BinaryListAdapter(BaseListAdapter):
                     if isinstance(ad, tuple):
                         if head[2] == 0:
                             head[2] = ad[1]
+                            got_type = type(item)
+                        elif head[2] != ad[1]:
+                            raise e.DataError(
+                                f"array contains different types,"
+                                f" at least {got_type} and {type(item)}"
+                            )
                         ad = ad[0]
                     if ad is None:
                         head[1] = 1
index b6e79a8d4a63acb725740f8d73546b5c3c8c2acd..26721bf4b29b1d0d12ebfded17fa40b739ae9139 100644 (file)
@@ -1,6 +1,7 @@
 import pytest
+import psycopg3
 from psycopg3.types import builtins
-from psycopg3.adapt import TypeCaster, UnknownCaster, Format
+from psycopg3.adapt import TypeCaster, UnknownCaster, Format, Transformer
 from psycopg3.types.array import UnknownArrayCaster, ArrayCaster
 
 
@@ -72,6 +73,16 @@ def test_adapt_list_int(conn, obj, want):
     assert cur.fetchone()[0]
 
 
+@pytest.mark.parametrize(
+    "input",
+    [[["a"], ["b", "c"]], [["a"], []], [[]], [[["a"]], ["b"]], [True, b"a"]],
+)
+def test_bad_binary_array(input):
+    tx = Transformer()
+    with pytest.raises(psycopg3.DataError):
+        tx.adapt(input, Format.BINARY)
+
+
 @pytest.mark.parametrize("fmt_out", [Format.TEXT, Format.BINARY])
 @pytest.mark.parametrize("want, obj", tests_int)
 def test_cast_list_int(conn, obj, want, fmt_out):