diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-02-03 10:42:08 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-02-03 10:42:08 -0500 |
commit | 52728f7052e643e9890da75ef2c756d4bead41f0 (patch) | |
tree | 8bfe8a805028563213209322056618f7d34aedbc /lib/sqlalchemy/sql/coercions.py | |
parent | a7eeac60cae28bb553327d317a88adb22c799ef3 (diff) | |
download | sqlalchemy-52728f7052e643e9890da75ef2c756d4bead41f0.tar.gz |
Add coercions to literal()
To prevent literal() from receiving a ClauseElement which
then leads to confusing results, add a new LiteralValueRole
coercion that does an _is_literal() check and implement
for literal().
Fixes: #5639
Change-Id: Ibd686544af2d7c013765278f984baf237de88caf
Diffstat (limited to 'lib/sqlalchemy/sql/coercions.py')
-rw-r--r-- | lib/sqlalchemy/sql/coercions.py | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/sqlalchemy/sql/coercions.py b/lib/sqlalchemy/sql/coercions.py index 3b972be41..0d5ffd43a 100644 --- a/lib/sqlalchemy/sql/coercions.py +++ b/lib/sqlalchemy/sql/coercions.py @@ -138,7 +138,7 @@ def expect(role, element, apply_propagate_attrs=None, argname=None, **kw): ): resolved = None - if impl._resolve_string_only: + if impl._resolve_literal_only: resolved = impl._literal_coercion(element, **kw) else: @@ -223,7 +223,7 @@ class RoleImpl(object): raise NotImplementedError() _post_coercion = None - _resolve_string_only = False + _resolve_literal_only = False def __init__(self, role_class): self._role_class = role_class @@ -274,7 +274,7 @@ class _Deannotate(object): class _StringOnly(object): __slots__ = () - _resolve_string_only = True + _resolve_literal_only = True class _ReturnsStringKey(object): @@ -380,6 +380,23 @@ class _CoerceLiterals(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__ = () |