diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-11-22 18:35:36 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-11-22 18:37:35 -0500 |
commit | ad85ab12d62e65b0310c778057551bcdd460f0d9 (patch) | |
tree | 9ea65d5fa76cd7003e648b4d97f8f2bc1e017805 | |
parent | 9d848680f46ffdabca84d7e2b3a4fd862d1f0bda (diff) | |
download | sqlalchemy-ad85ab12d62e65b0310c778057551bcdd460f0d9.tar.gz |
- Fixed bug where SQL statement would be improperly ASCII-encoded
when a pre-DBAPI :class:`.StatementError` were raised within
:meth:`.Connection.execute`, causing encoding errors for
non-ASCII statements. The stringification now remains within
Python unicode thus avoiding encoding errors. [ticket:2871]
Conflicts:
test/engine/test_execute.py
-rw-r--r-- | doc/build/changelog/changelog_08.rst | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 2 | ||||
-rw-r--r-- | test/engine/test_execute.py | 21 | ||||
-rw-r--r-- | test/sql/test_query.py | 2 |
4 files changed, 33 insertions, 3 deletions
diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index cc51febe1..e5df47616 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -12,6 +12,17 @@ :version: 0.8.4 .. change:: + :tags: bug, engine + :tickets: 2871 + :versions: 0.9.0b2 + + Fixed bug where SQL statement would be improperly ASCII-encoded + when a pre-DBAPI :class:`.StatementError` were raised within + :meth:`.Connection.execute`, causing encoding errors for + non-ASCII statements. The stringification now remains within + Python unicode thus avoiding encoding errors. + + .. change:: :tags: bug, oracle :tickets: 2870 :versions: 0.9.0b2 diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 25167167d..57d0445dd 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -824,7 +824,7 @@ class Connection(Connectable): context = constructor(dialect, self, conn, *args) except Exception, e: self._handle_dbapi_exception(e, - str(statement), parameters, + util.text_type(statement), parameters, None, None) if context.compiled: diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py index d38b697df..76f7b9a71 100644 --- a/test/engine/test_execute.py +++ b/test/engine/test_execute.py @@ -1,3 +1,4 @@ +# coding: utf-8 from __future__ import with_statement from sqlalchemy.testing import eq_, assert_raises, assert_raises_message, \ @@ -11,6 +12,7 @@ from sqlalchemy.sql import column, literal from sqlalchemy.testing.schema import Table, Column import sqlalchemy as tsa from sqlalchemy import testing +from sqlalchemy import util from sqlalchemy.testing import engines from sqlalchemy.testing.engines import testing_engine import logging.handlers @@ -227,7 +229,7 @@ class ExecuteTest(fixtures.TestBase): def _go(conn): assert_raises_message( tsa.exc.StatementError, - r"nope \(original cause: Exception: nope\) 'SELECT 1 ", + r"nope \(original cause: Exception: nope\) u?'SELECT 1 ", conn.execute, select([1]).\ where( @@ -241,6 +243,23 @@ class ExecuteTest(fixtures.TestBase): finally: conn.close() + def test_stmt_exception_non_ascii(self): + name = util.u('méil') + assert_raises_message( + tsa.exc.StatementError, + util.u( + "A value is required for bind parameter 'uname'" + r'.*SELECT users.user_name AS "m\\xe9il"') if util.py2k + else + util.u( + "A value is required for bind parameter 'uname'" + '.*SELECT users.user_name AS "méil"'), + testing.db.execute, + select([users.c.user_name.label(name)]).where( + users.c.user_name == bindparam("uname")), + {'uname_incorrect': 'foo'} + ) + def test_stmt_exception_pickleable_no_dbapi(self): self._test_stmt_exception_pickleable(Exception("hello world")) diff --git a/test/sql/test_query.py b/test/sql/test_query.py index ab689ff0a..fcd450dbe 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -68,7 +68,7 @@ class QueryTest(fixtures.TestBase): r"A value is required for bind parameter 'user_name', in " "parameter group 2 \(original cause: (sqlalchemy.exc.)?InvalidRequestError: A " "value is required for bind parameter 'user_name', in " - "parameter group 2\) 'INSERT INTO query_users", + "parameter group 2\) u?'INSERT INTO query_users", users.insert().execute, {'user_id':7, 'user_name':'jack'}, {'user_id':8, 'user_name':'ed'}, |