diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-04-08 16:04:44 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-04-08 16:04:44 +0000 |
| commit | faf980c0bd22c6eaa5636ebef287ca6ca533e90a (patch) | |
| tree | 9c7a7bd16b7be29c2ad5ccfefe79d6c586b5c0a7 /lib/sqlalchemy/sql | |
| parent | 654d01e5f3ef1eb3e71fd9a9c1beb1a3b6f2f117 (diff) | |
| parent | df078a6fb010e28cb14afa1f0947add1f60e0e52 (diff) | |
| download | sqlalchemy-faf980c0bd22c6eaa5636ebef287ca6ca533e90a.tar.gz | |
Merge "Infer types in BindParameter when expanding=True"
Diffstat (limited to 'lib/sqlalchemy/sql')
| -rw-r--r-- | lib/sqlalchemy/sql/elements.py | 15 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/sqltypes.py | 12 |
2 files changed, 25 insertions, 2 deletions
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index dfa6c0f8f..9e1b69088 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -1392,15 +1392,26 @@ class BindParameter(roles.InElementRole, ColumnElement): self.literal_execute = literal_execute if _is_crud: self._is_crud = True + if type_ is None: + if expanding and value: + check_value = value[0] + else: + check_value = value if _compared_to_type is not None: self.type = _compared_to_type.coerce_compared_value( - _compared_to_operator, value + _compared_to_operator, check_value ) else: - self.type = type_api._resolve_value_to_type(value) + self.type = type_api._resolve_value_to_type(check_value) elif isinstance(type_, type): self.type = type_() + elif type_._is_tuple_type: + if expanding and value: + check_value = value[0] + else: + check_value = value + self.type = type_._resolve_values_to_types(check_value) else: self.type = type_ diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py index e57a14681..bdfb7d833 100644 --- a/lib/sqlalchemy/sql/sqltypes.py +++ b/lib/sqlalchemy/sql/sqltypes.py @@ -2912,8 +2912,20 @@ class TupleType(TypeEngine): _is_tuple_type = True def __init__(self, *types): + self._fully_typed = NULLTYPE not in types self.types = types + def _resolve_values_to_types(self, value): + if self._fully_typed: + return self + else: + return TupleType( + *[ + _resolve_value_to_type(elem) if typ is NULLTYPE else typ + for typ, elem in zip(self.types, value) + ] + ) + def result_processor(self, dialect, coltype): raise NotImplementedError( "The tuple type does not support being fetched " |
