]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug where coersion of literal ``True`` or ``False`` constant
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 19 Jul 2015 14:27:33 +0000 (10:27 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 19 Jul 2015 14:27:33 +0000 (10:27 -0400)
in conjunction with :func:`.and_` or :func:`.or_` would fail
with an AttributeError.
fixes #3490

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/sql/elements.py
test/sql/test_operators.py

index c4d9ab44807a06e7a5567c3bd86f11a97f9137bb..7dae2bebd84c9fc990635e4f5ec58a69c6d9224a 100644 (file)
 .. changelog::
     :version: 1.0.7
 
+    .. change::
+        :tags: bug, sql
+        :tickets: 3490
+
+        Fixed bug where coersion of literal ``True`` or ``False`` constant
+        in conjunction with :func:`.and_` or :func:`.or_` would fail
+        with an AttributeError.
+
     .. change::
         :tags: bug, sql
         :tickets: 3485
index 41dfcf147891ee124f7f0e8cf664f1041b5b5f4e..eb0923e15a6448daa75b4eba35681949fee027a8 100644 (file)
@@ -1847,9 +1847,12 @@ class BooleanClauseList(ClauseList, ColumnElement):
     def _construct(cls, operator, continue_on, skip_on, *clauses, **kw):
         convert_clauses = []
 
-        clauses = util.coerce_generator_arg(clauses)
+        clauses = [
+            _expression_literal_as_text(clause)
+            for clause in
+            util.coerce_generator_arg(clauses)
+        ]
         for clause in clauses:
-            clause = _expression_literal_as_text(clause)
 
             if isinstance(clause, continue_on):
                 continue
index 65d1e3716babc6cafcee2514b7419627430a127e..bb4cb1bf17220d46a6b0731be99d9f6e955afe17 100644 (file)
@@ -825,6 +825,64 @@ class ConjunctionTest(fixtures.TestBase, testing.AssertsCompiledSQL):
             "SELECT false AS anon_1, false AS anon_2"
         )
 
+    def test_is_true_literal(self):
+        c = column('x', Boolean)
+        self.assert_compile(
+            c.is_(True),
+            "x IS true"
+        )
+
+    def test_is_false_literal(self):
+        c = column('x', Boolean)
+        self.assert_compile(
+            c.is_(False),
+            "x IS false"
+        )
+
+    def test_and_false_literal_leading(self):
+        self.assert_compile(
+            and_(False, True),
+            "false"
+        )
+
+        self.assert_compile(
+            and_(False, False),
+            "false"
+        )
+
+    def test_and_true_literal_leading(self):
+        self.assert_compile(
+            and_(True, True),
+            "true"
+        )
+
+        self.assert_compile(
+            and_(True, False),
+            "false"
+        )
+
+    def test_or_false_literal_leading(self):
+        self.assert_compile(
+            or_(False, True),
+            "true"
+        )
+
+        self.assert_compile(
+            or_(False, False),
+            "false"
+        )
+
+    def test_or_true_literal_leading(self):
+        self.assert_compile(
+            or_(True, True),
+            "true"
+        )
+
+        self.assert_compile(
+            or_(True, False),
+            "true"
+        )
+
 
 class OperatorPrecedenceTest(fixtures.TestBase, testing.AssertsCompiledSQL):
     __dialect__ = 'default'