--- /dev/null
+.. change::
+ :tags: bug, postgresql, regression
+ :tickets: 9739
+
+ Fixed another regression due to the "insertmanyvalues" change in 2.0.10 as
+ part of :ticket:`9618`, in a similar way as regression :ticket:`9701`, where
+ :class:`.LargeBinary` datatypes also need additional casts on when using the
+ asyncpg driver specifically in order to work with the new bulk INSERT
+ format.
from .base import PGIdentifierPreparer
from .base import REGCLASS
from .base import REGCONFIG
+from .types import BYTEA
from ... import exc
from ... import pool
from ... import util
render_bind_cast = True
+class AsyncpgByteA(BYTEA):
+ render_bind_cast = True
+
+
class AsyncpgDate(sqltypes.Date):
render_bind_cast = True
sqltypes.Numeric: AsyncpgNumeric,
sqltypes.Float: AsyncpgFloat,
sqltypes.JSON: AsyncpgJSON,
+ sqltypes.LargeBinary: AsyncpgByteA,
json.JSONB: AsyncpgJSONB,
sqltypes.JSON.JSONPathType: AsyncpgJSONPathType,
sqltypes.JSON.JSONIndexType: AsyncpgJSONIndexType,
from ... import Date
from ... import DateTime
from ... import Float
+from ... import Identity
from ... import Integer
from ... import JSON
from ... import literal
from ... import UnicodeText
from ... import UUID
from ... import Uuid
+from ...dialects.postgresql import BYTEA
from ...orm import declarative_base
from ...orm import Session
from ...sql.sqltypes import LargeBinary
row = connection.execute(select(binary_table.c.pickle_data)).first()
eq_(row, ({"foo": [1, 2, 3], "bar": "bat"},))
+ @testing.combinations(
+ (
+ LargeBinary(),
+ b"this is binary",
+ ),
+ (LargeBinary(), b"7\xe7\x9f"),
+ (BYTEA(), b"7\xe7\x9f", testing.only_on("postgresql")),
+ argnames="type_,value",
+ )
+ @testing.variation("sort_by_parameter_order", [True, False])
+ @testing.variation("multiple_rows", [True, False])
+ @testing.requires.insert_returning
+ def test_imv_returning(
+ self,
+ connection,
+ metadata,
+ sort_by_parameter_order,
+ type_,
+ value,
+ multiple_rows,
+ ):
+ """test #9739 (similar to #9701).
+
+ this tests insertmanyvalues as well as binary
+ RETURNING types
+
+ """
+ t = Table(
+ "t",
+ metadata,
+ Column("id", Integer, Identity(), primary_key=True),
+ Column("value", type_),
+ )
+
+ t.create(connection)
+
+ result = connection.execute(
+ t.insert().returning(
+ t.c.id,
+ t.c.value,
+ sort_by_parameter_order=bool(sort_by_parameter_order),
+ ),
+ [{"value": value} for i in range(10)]
+ if multiple_rows
+ else {"value": value},
+ )
+
+ if multiple_rows:
+ i_range = range(1, 11)
+ else:
+ i_range = range(1, 2)
+
+ eq_(
+ set(result),
+ {(id_, value) for id_ in i_range},
+ )
+
+ eq_(
+ set(connection.scalars(select(t.c.value))),
+ {value},
+ )
+
class TextTest(_LiteralRoundTripFixture, fixtures.TablesTest):
__requires__ = ("text_type",)