summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/compiler.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-11-14 08:54:56 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2022-11-14 13:49:38 -0500
commit3ea8273c7926d19d4745bf5a859927838fa0783c (patch)
treefc8082f19320879be28877335c32f2d01b4254f7 /lib/sqlalchemy/sql/compiler.py
parent3d892381996e7ba68ee3bf6d7de40c8414e3812a (diff)
downloadsqlalchemy-3ea8273c7926d19d4745bf5a859927838fa0783c.tar.gz
add informative exception context for literal render
An informative re-raise is now thrown in the case where any "literal bindparam" render operation fails, indicating the value itself and the datatype in use, to assist in debugging when literal params are being rendered in a statement. Fixes: #8800 Change-Id: Id658f8b03359312353ddbb0c7563026239579f7b (cherry picked from commit c7baf6e0aa624c9378c3bc3c4923d1e188d62dc9)
Diffstat (limited to 'lib/sqlalchemy/sql/compiler.py')
-rw-r--r--lib/sqlalchemy/sql/compiler.py29
1 files changed, 25 insertions, 4 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index a7232f096..611cd1821 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -38,6 +38,7 @@ from . import operators
from . import schema
from . import selectable
from . import sqltypes
+from . import util as sql_util
from .base import NO_ARG
from .base import prefix_anon_map
from .elements import quoted_name
@@ -1216,7 +1217,8 @@ class SQLCompiler(Compiled):
replacement_expressions[
escaped_name
] = self.render_literal_bindparam(
- parameter, render_literal_value=value
+ parameter,
+ render_literal_value=value,
)
continue
@@ -2590,10 +2592,29 @@ class SQLCompiler(Compiled):
processor = type_._cached_literal_processor(self.dialect)
if processor:
- return processor(value)
+ try:
+ return processor(value)
+ except Exception as e:
+ util.raise_(
+ exc.CompileError(
+ "Could not render literal value "
+ '"%s" '
+ "with datatype "
+ "%s; see parent stack trace for "
+ "more detail."
+ % (
+ sql_util._repr_single_value(value),
+ type_,
+ )
+ ),
+ from_=e,
+ )
+
else:
- raise NotImplementedError(
- "Don't know how to literal-quote value %r" % value
+ raise exc.CompileError(
+ "No literal value renderer is available for literal value "
+ '"%s" with datatype %s'
+ % (sql_util._repr_single_value(value), type_)
)
def _truncate_bindparam(self, bindparam):