]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixes(#7561) Add support for postgres.UUID literal_binds compilation
authorJosé Duarte <duarte@dystematic.com>
Wed, 12 Jan 2022 22:00:00 +0000 (22:00 +0000)
committerJosé Duarte <duarte@dystematic.com>
Wed, 12 Jan 2022 22:02:16 +0000 (22:02 +0000)
lib/sqlalchemy/dialects/postgresql/base.py
test/dialect/postgresql/test_types.py

index bf8812ae5455d79f036515f2f216694166e4e314..3a055429ed99ad3dec242e08f549d7d92d2fdeac 100644 (file)
@@ -1410,7 +1410,6 @@ from ...types import SMALLINT
 from ...types import TEXT
 from ...types import VARCHAR
 
-
 IDX_USING = re.compile(r"^(?:btree|hash|gist|gin|[\w_]+)$", re.I)
 
 RESERVED_WORDS = set(
@@ -1751,6 +1750,14 @@ class UUID(sqltypes.TypeEngine):
         else:
             return None
 
+    def literal_processor(self, dialect):
+        bp = self.bind_processor(dialect)
+
+        def process(value):
+            return "'%s'" % bp(value)
+
+        return process
+
 
 PGUuid = UUID
 
index e8c18acb04b0b528e67c45e390ca48e992f94867..e3dd4ae5c8d0ee9e32de89bcfd6a291ee111dac5 100644 (file)
@@ -48,6 +48,7 @@ from sqlalchemy.dialects.postgresql import TSTZRANGE
 from sqlalchemy.exc import CompileError
 from sqlalchemy.orm import declarative_base
 from sqlalchemy.orm import Session
+from sqlalchemy.sql import bindparam
 from sqlalchemy.sql import operators
 from sqlalchemy.sql import sqltypes
 from sqlalchemy.testing import fixtures
@@ -929,10 +930,10 @@ class NumericInterpretationTest(fixtures.TestBase):
 
     def test_numeric_codes(self):
         from sqlalchemy.dialects.postgresql import (
+            base,
             pg8000,
             psycopg2,
             psycopg2cffi,
-            base,
         )
 
         dialects = (
@@ -1420,9 +1421,11 @@ class ArrayTest(AssertsCompiledSQL, fixtures.TestBase):
         argnames="with_enum, using_aggregate_order_by",
     )
     def test_array_agg_specific(self, with_enum, using_aggregate_order_by):
-        from sqlalchemy.dialects.postgresql import aggregate_order_by
-        from sqlalchemy.dialects.postgresql import array_agg
-        from sqlalchemy.dialects.postgresql import ENUM
+        from sqlalchemy.dialects.postgresql import (
+            ENUM,
+            aggregate_order_by,
+            array_agg,
+        )
 
         element_type = ENUM if with_enum else Integer
         expr = (
@@ -2785,6 +2788,46 @@ class UUIDTest(fixtures.TestBase):
     def test_uuid_array(self, datatype, value1, value2, connection):
         self.test_round_trip(datatype, value1, value2, connection)
 
+    @testing.combinations(
+        (
+            "not_as_uuid",
+            postgresql.UUID(as_uuid=False),
+            str(uuid.uuid4()),
+            str(uuid.uuid4()),
+        ),
+        (
+            "as_uuid",
+            postgresql.UUID(as_uuid=True),
+            uuid.uuid4(),
+            uuid.uuid4(),
+        ),
+        id_="iaaa",
+        argnames="datatype, value1, value2",
+    )
+    def test_uuid_literal(self, datatype, value1, value2, connection):
+        v1 = connection.execute(
+            select(
+                bindparam(
+                    "uuid_literal",
+                    literal_execute=True,
+                    type_=datatype,
+                )
+            ),
+            uuid_literal=value1,
+        ).first()
+        v2 = connection.execute(
+            select(
+                bindparam(
+                    "uuid_literal",
+                    literal_execute=True,
+                    type_=datatype,
+                )
+            ),
+            uuid_literal=value2,
+        ).first()
+        eq_(v1, value1)
+        eq_(v2, value2)
+
 
 class HStoreTest(AssertsCompiledSQL, fixtures.TestBase):
     __dialect__ = "postgresql"