]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug whereby SQLite compiler failed to propagate compiler arguments
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 31 Jan 2014 22:57:17 +0000 (17:57 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 31 Jan 2014 22:57:17 +0000 (17:57 -0500)
such as "literal binds" into a CAST expression.
- Fixed bug whereby binary type would fail in some cases
if used with a "test" dialect, such as a DefaultDialect or other
dialect with no DBAPI.
- Fixed bug where "literal binds" wouldn't work with a bound parameter
that's a binary type.  A similar, but different, issue is fixed
in 0.8.

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/dialects/sqlite/base.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/sqltypes.py
test/sql/test_compiler.py
test/sql/test_types.py

index 8f1daf0037fb3669c23e4ee9896301486927bc25..fbb6db335595c93ccb690ea7342cb7bac24fce42 100644 (file)
 .. changelog::
     :version: 0.9.2
 
+    .. change::
+        :tags: bug, sqlite
+
+        Fixed bug whereby SQLite compiler failed to propagate compiler arguments
+        such as "literal binds" into a CAST expression.
+
+    .. change::
+        :tags: bug, sql
+
+        Fixed bug whereby binary type would fail in some cases
+        if used with a "test" dialect, such as a DefaultDialect or other
+        dialect with no DBAPI.
+
+    .. change::
+        :tags: bug, sql, py3k
+
+        Fixed bug where "literal binds" wouldn't work with a bound parameter
+        that's a binary type.  A similar, but different, issue is fixed
+        in 0.8.
+
     .. change::
         :tags: bug, sql
         :tickets: 2927
index d8aa58c2c18e0910702aee2ff95ccda5ffd6669c..4e1223eeaf57acf068df0318fb3dff22dabfdae2 100644 (file)
@@ -456,9 +456,9 @@ class SQLiteCompiler(compiler.SQLCompiler):
 
     def visit_cast(self, cast, **kwargs):
         if self.dialect.supports_cast:
-            return super(SQLiteCompiler, self).visit_cast(cast)
+            return super(SQLiteCompiler, self).visit_cast(cast, **kwargs)
         else:
-            return self.process(cast.clause)
+            return self.process(cast.clause, **kwargs)
 
     def visit_extract(self, extract, **kw):
         try:
index 4448f7c7b09cafcf2b32374464a36b3efd8d82d1..673e5f89b7b1db8b409dd728c8be6b9fd24d42ed 100644 (file)
@@ -961,7 +961,6 @@ class SQLCompiler(Compiled):
                                             literal_binds=False,
                                             skip_bind_expression=False,
                                             **kwargs):
-
         if not skip_bind_expression and bindparam.type._has_bind_expression:
             bind_expression = bindparam.type.bind_expression(bindparam)
             return self.process(bind_expression,
index d779caaeac1ce681642a05b6e155cce9c4bb1edd..61d906e1c52222b98f4777930b8d8f2c6d73f651 100644 (file)
@@ -790,7 +790,7 @@ class _Binary(TypeEngine):
 
     def literal_processor(self, dialect):
         def process(value):
-            value = value.decode(self.dialect.encoding).replace("'", "''")
+            value = value.decode(dialect.encoding).replace("'", "''")
             return "'%s'" % value
         return process
 
@@ -801,6 +801,9 @@ class _Binary(TypeEngine):
     # Python 3 - sqlite3 doesn't need the `Binary` conversion
     # here, though pg8000 does to indicate "bytea"
     def bind_processor(self, dialect):
+        if dialect.dbapi is None:
+            return None
+
         DBAPIBinary = dialect.dbapi.Binary
 
         def process(value):
index 53b9f68fc615441980b13fcdcb8a7fb4538ebc93..cd9d318645823e3104f6e42a948bd05c5c9e0f51 100644 (file)
@@ -1185,6 +1185,12 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
             dialect=dialect
         )
 
+        self.assert_compile(
+            select([literal(util.b("foo"))]),
+            "SELECT 'foo' AS anon_1",
+            dialect=dialect
+        )
+
         assert_raises_message(
             exc.CompileError,
             "Bind parameter 'foo' without a renderable value not allowed here.",
index 3df19874bf92756f2bba2dc7f374a9d82aa290e6..fd927b51ac35e20412bbee01cf838914264ca5ad 100644 (file)
@@ -1203,6 +1203,17 @@ class BinaryTest(fixtures.TestBase, AssertsExecutionResults):
                     count().scalar(), 1)
 
 
+    def test_literal_roundtrip(self):
+        compiled = select([cast(literal(util.b("foo")), LargeBinary)]).compile(
+                            dialect=testing.db.dialect,
+                            compile_kwargs={"literal_binds": True})
+        result = testing.db.execute(compiled)
+        eq_(result.scalar(), util.b("foo"))
+
+    def test_bind_processor_no_dbapi(self):
+        b = LargeBinary()
+        eq_(b.bind_processor(default.DefaultDialect()), None)
+
     def load_stream(self, name):
         f = os.path.join(os.path.dirname(__file__), "..", name)
         return open(f, mode='rb').read()