summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-11-22 18:35:36 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2013-11-22 18:37:35 -0500
commitad85ab12d62e65b0310c778057551bcdd460f0d9 (patch)
tree9ea65d5fa76cd7003e648b4d97f8f2bc1e017805
parent9d848680f46ffdabca84d7e2b3a4fd862d1f0bda (diff)
downloadsqlalchemy-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.rst11
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--test/engine/test_execute.py21
-rw-r--r--test/sql/test_query.py2
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'},