):
resolved = None
- if impl._resolve_string_only:
+ if impl._resolve_literal_only:
resolved = impl._literal_coercion(element, **kw)
else:
raise NotImplementedError()
_post_coercion = None
- _resolve_string_only = False
+ _resolve_literal_only = False
def __init__(self, role_class):
self._role_class = role_class
class _StringOnly(object):
__slots__ = ()
- _resolve_string_only = True
+ _resolve_literal_only = True
class _ReturnsStringKey(object):
self._raise_for_expected(element, argname)
+class LiteralValueImpl(RoleImpl):
+ _resolve_literal_only = True
+
+ def _implicit_coercions(
+ self, element, resolved, argname, type_=None, **kw
+ ):
+ if not _is_literal(resolved):
+ self._raise_for_expected(
+ element, resolved=resolved, argname=argname, **kw
+ )
+
+ return elements.BindParameter(None, element, type_=type_, unique=True)
+
+ def _literal_coercion(self, element, argname=None, type_=None, **kw):
+ return element
+
+
class _SelectIsNotFrom(object):
__slots__ = ()
will provide bind-parameter translation for this literal.
"""
- return BindParameter(None, value, type_=type_, unique=True)
+ return coercions.expect(roles.LiteralValueRole, value, type_=type_)
def outparam(key, type_=None):
)
)
+ def test_no_clauseelement_in_bind(self):
+ with testing.expect_raises_message(
+ exc.ArgumentError,
+ r"Literal Python value expected, got BindParameter",
+ ):
+ literal(bindparam("x"))
+
+ with testing.expect_raises_message(
+ exc.ArgumentError,
+ r"Literal Python value expected, got .*ColumnClause",
+ ):
+ literal(column("q"))
+
def test_scalar_select_no_coercion(self):
with testing.expect_warnings(
"implicitly coercing SELECT object to scalar subquery"