summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-08-03 14:06:41 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-08-03 14:06:41 -0400
commit96837098cdafb0b53d0bd8c480da93330d2c1806 (patch)
tree9c2bbcd25c3df1c278cbfa302477dbc442272440
parent54feab41f9fc81966da1f6e7bc35344c8ba5f604 (diff)
downloadsqlalchemy-96837098cdafb0b53d0bd8c480da93330d2c1806.tar.gz
- the text() construct, if placed in a column
oriented situation, will at least return NULLTYPE for its type instead of None, allowing it to be used a little more freely for ad-hoc column expressions than before. literal_column() is still the better choice, however.
-rw-r--r--CHANGES9
-rw-r--r--lib/sqlalchemy/sql/expression.py6
-rw-r--r--test/sql/test_case_statement.py22
3 files changed, 31 insertions, 6 deletions
diff --git a/CHANGES b/CHANGES
index 13d6e0f63..b44edcede 100644
--- a/CHANGES
+++ b/CHANGES
@@ -88,7 +88,14 @@ CHANGES
ResourceClosedError for all "this
connection/transaction/result is closed" types of
errors.
-
+
+ - the text() construct, if placed in a column
+ oriented situation, will at least return NULLTYPE
+ for its type instead of None, allowing it to
+ be used a little more freely for ad-hoc column
+ expressions than before. literal_column()
+ is still the better choice, however.
+
- declarative
- if @classproperty is used with a regular class-bound
mapper property attribute, it will be called to get the
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index 8a92dba0d..4b8df74c6 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -428,8 +428,8 @@ def case(whens, value=None, else_=None):
The expressions used for THEN and ELSE,
when specified as strings, will be interpreted
as bound values. To specify textual SQL expressions
- for these, use the literal_column(<string>) or
- text(<string>) construct.
+ for these, use the :func:`literal_column`
+ construct.
The expressions used for the WHEN criterion
may only be literal strings when "value" is
@@ -2436,7 +2436,7 @@ class _TextClause(Executable, ClauseElement):
if self.typemap is not None and len(self.typemap) == 1:
return list(self.typemap)[0]
else:
- return None
+ return sqltypes.NULLTYPE
def self_group(self, against=None):
if against is operators.in_op:
diff --git a/test/sql/test_case_statement.py b/test/sql/test_case_statement.py
index 3f3abe7e1..645822fa7 100644
--- a/test/sql/test_case_statement.py
+++ b/test/sql/test_case_statement.py
@@ -1,4 +1,4 @@
-from sqlalchemy.test.testing import assert_raises, assert_raises_message
+from sqlalchemy.test.testing import assert_raises, assert_raises_message, eq_
import sys
from sqlalchemy import *
from sqlalchemy.test import *
@@ -99,7 +99,25 @@ class CaseTest(TestBase, AssertsCompiledSQL):
self.assert_compile(case([("x", "y")], value=t.c.col1), "CASE test.col1 WHEN :param_1 THEN :param_2 END")
self.assert_compile(case([(t.c.col1==7, "y")], else_="z"), "CASE WHEN (test.col1 = :col1_1) THEN :param_1 ELSE :param_2 END")
-
+
+ def test_text_doesnt_explode(self):
+
+ for s in [
+ select([case([(info_table.c.info == 'pk_4_data',
+ text("'yes'"))], else_=text("'no'"
+ ))]).order_by(info_table.c.info),
+
+ select([case([(info_table.c.info == 'pk_4_data',
+ literal_column("'yes'"))], else_=literal_column("'no'"
+ ))]).order_by(info_table.c.info),
+
+ ]:
+ eq_(s.execute().fetchall(), [
+ (u'no', ), (u'no', ), (u'no', ), (u'yes', ),
+ (u'no', ), (u'no', ),
+ ])
+
+
@testing.fails_on('firebird', 'FIXME: unknown')
@testing.fails_on('maxdb', 'FIXME: unknown')