summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2022-01-11 18:11:13 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2022-01-11 18:11:13 +0000
commit71b6425db3517fc6194a349e6cc5abea851c7f35 (patch)
tree43b2328ac117c8958aa5f12f5af7904a410c2dc8 /lib/sqlalchemy/sql
parentc47a605f96783e81aa02eab1f4e491bd223d1068 (diff)
parent8a62aa58fa5eeaad4e6bdd994a00293f41eb3a71 (diff)
downloadsqlalchemy-71b6425db3517fc6194a349e6cc5abea851c7f35.tar.gz
Merge "implement second-level type resolution for literals" into main
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r--lib/sqlalchemy/sql/sqltypes.py18
-rw-r--r--lib/sqlalchemy/sql/type_api.py11
2 files changed, 28 insertions, 1 deletions
diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py
index 05007eff1..744ddd025 100644
--- a/lib/sqlalchemy/sql/sqltypes.py
+++ b/lib/sqlalchemy/sql/sqltypes.py
@@ -622,6 +622,13 @@ class DateTime(_LookupExpressionAdapter, TypeEngine):
def get_dbapi_type(self, dbapi):
return dbapi.DATETIME
+ def _resolve_for_literal(self, value):
+ with_timezone = value.tzinfo is not None
+ if with_timezone and not self.timezone:
+ return DATETIME_TIMEZONE
+ else:
+ return self
+
@property
def python_type(self):
return dt.datetime
@@ -692,6 +699,13 @@ class Time(_LookupExpressionAdapter, TypeEngine):
def python_type(self):
return dt.time
+ def _resolve_for_literal(self, value):
+ with_timezone = value.tzinfo is not None
+ if with_timezone and not self.timezone:
+ return TIME_TIMEZONE
+ else:
+ return self
+
@util.memoized_property
def _expression_adaptations(self):
# Based on https://www.postgresql.org/docs/current/\
@@ -2981,6 +2995,8 @@ STRINGTYPE = String()
INTEGERTYPE = Integer()
MATCHTYPE = MatchType()
TABLEVALUE = TableValueType()
+DATETIME_TIMEZONE = DateTime(timezone=True)
+TIME_TIMEZONE = Time(timezone=True)
_type_map = {
int: Integer(),
@@ -3018,7 +3034,7 @@ def _resolve_value_to_type(value):
)
return NULLTYPE
else:
- return _result_type
+ return _result_type._resolve_for_literal(value)
# back-assign to type_api
diff --git a/lib/sqlalchemy/sql/type_api.py b/lib/sqlalchemy/sql/type_api.py
index 9dd702410..ea00a32ad 100644
--- a/lib/sqlalchemy/sql/type_api.py
+++ b/lib/sqlalchemy/sql/type_api.py
@@ -592,6 +592,17 @@ class TypeEngine(Traversible):
)
return new_type
+ def _resolve_for_literal(self, value):
+ """adjust this type given a literal Python value that will be
+ stored in a bound parameter.
+
+ Used exclusively by _resolve_value_to_type().
+
+ .. versionadded:: 1.4.30 or 2.0
+
+ """
+ return self
+
@util.memoized_property
def _type_affinity(self):
"""Return a rudimental 'affinity' value expressing the general class