diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-08-03 14:06:41 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-08-03 14:06:41 -0400 |
| commit | 96837098cdafb0b53d0bd8c480da93330d2c1806 (patch) | |
| tree | 9c2bbcd25c3df1c278cbfa302477dbc442272440 | |
| parent | 54feab41f9fc81966da1f6e7bc35344c8ba5f604 (diff) | |
| download | sqlalchemy-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-- | CHANGES | 9 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/expression.py | 6 | ||||
| -rw-r--r-- | test/sql/test_case_statement.py | 22 |
3 files changed, 31 insertions, 6 deletions
@@ -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') |
