From: Mike Bayer Date: Tue, 3 Aug 2010 18:06:41 +0000 (-0400) Subject: - the text() construct, if placed in a column X-Git-Tag: rel_0_6_4~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96837098cdafb0b53d0bd8c480da93330d2c1806;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. --- diff --git a/CHANGES b/CHANGES index 13d6e0f639..b44edcede6 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 8a92dba0dd..4b8df74c6e 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() or - text() 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 3f3abe7e19..645822fa70 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')