sqlspec 0.25.0__py3-none-any.whl → 0.27.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (199) hide show
  1. sqlspec/__init__.py +7 -15
  2. sqlspec/_serialization.py +256 -24
  3. sqlspec/_typing.py +71 -52
  4. sqlspec/adapters/adbc/_types.py +1 -1
  5. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  6. sqlspec/adapters/adbc/adk/store.py +870 -0
  7. sqlspec/adapters/adbc/config.py +69 -12
  8. sqlspec/adapters/adbc/data_dictionary.py +340 -0
  9. sqlspec/adapters/adbc/driver.py +266 -58
  10. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  11. sqlspec/adapters/adbc/litestar/store.py +504 -0
  12. sqlspec/adapters/adbc/type_converter.py +153 -0
  13. sqlspec/adapters/aiosqlite/_types.py +1 -1
  14. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  15. sqlspec/adapters/aiosqlite/adk/store.py +527 -0
  16. sqlspec/adapters/aiosqlite/config.py +88 -15
  17. sqlspec/adapters/aiosqlite/data_dictionary.py +149 -0
  18. sqlspec/adapters/aiosqlite/driver.py +143 -40
  19. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  20. sqlspec/adapters/aiosqlite/litestar/store.py +281 -0
  21. sqlspec/adapters/aiosqlite/pool.py +7 -7
  22. sqlspec/adapters/asyncmy/__init__.py +7 -1
  23. sqlspec/adapters/asyncmy/_types.py +2 -2
  24. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  25. sqlspec/adapters/asyncmy/adk/store.py +493 -0
  26. sqlspec/adapters/asyncmy/config.py +68 -23
  27. sqlspec/adapters/asyncmy/data_dictionary.py +161 -0
  28. sqlspec/adapters/asyncmy/driver.py +313 -58
  29. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  30. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  31. sqlspec/adapters/asyncpg/__init__.py +2 -1
  32. sqlspec/adapters/asyncpg/_type_handlers.py +71 -0
  33. sqlspec/adapters/asyncpg/_types.py +11 -7
  34. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  35. sqlspec/adapters/asyncpg/adk/store.py +450 -0
  36. sqlspec/adapters/asyncpg/config.py +59 -35
  37. sqlspec/adapters/asyncpg/data_dictionary.py +173 -0
  38. sqlspec/adapters/asyncpg/driver.py +170 -25
  39. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  40. sqlspec/adapters/asyncpg/litestar/store.py +253 -0
  41. sqlspec/adapters/bigquery/_types.py +1 -1
  42. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  43. sqlspec/adapters/bigquery/adk/store.py +576 -0
  44. sqlspec/adapters/bigquery/config.py +27 -10
  45. sqlspec/adapters/bigquery/data_dictionary.py +149 -0
  46. sqlspec/adapters/bigquery/driver.py +368 -142
  47. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  48. sqlspec/adapters/bigquery/litestar/store.py +327 -0
  49. sqlspec/adapters/bigquery/type_converter.py +125 -0
  50. sqlspec/adapters/duckdb/_types.py +1 -1
  51. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  52. sqlspec/adapters/duckdb/adk/store.py +553 -0
  53. sqlspec/adapters/duckdb/config.py +80 -20
  54. sqlspec/adapters/duckdb/data_dictionary.py +163 -0
  55. sqlspec/adapters/duckdb/driver.py +167 -45
  56. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  57. sqlspec/adapters/duckdb/litestar/store.py +332 -0
  58. sqlspec/adapters/duckdb/pool.py +4 -4
  59. sqlspec/adapters/duckdb/type_converter.py +133 -0
  60. sqlspec/adapters/oracledb/_numpy_handlers.py +133 -0
  61. sqlspec/adapters/oracledb/_types.py +20 -2
  62. sqlspec/adapters/oracledb/adk/__init__.py +5 -0
  63. sqlspec/adapters/oracledb/adk/store.py +1745 -0
  64. sqlspec/adapters/oracledb/config.py +122 -32
  65. sqlspec/adapters/oracledb/data_dictionary.py +509 -0
  66. sqlspec/adapters/oracledb/driver.py +353 -91
  67. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  68. sqlspec/adapters/oracledb/litestar/store.py +767 -0
  69. sqlspec/adapters/oracledb/migrations.py +348 -73
  70. sqlspec/adapters/oracledb/type_converter.py +207 -0
  71. sqlspec/adapters/psqlpy/_type_handlers.py +44 -0
  72. sqlspec/adapters/psqlpy/_types.py +2 -1
  73. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  74. sqlspec/adapters/psqlpy/adk/store.py +482 -0
  75. sqlspec/adapters/psqlpy/config.py +46 -17
  76. sqlspec/adapters/psqlpy/data_dictionary.py +172 -0
  77. sqlspec/adapters/psqlpy/driver.py +123 -209
  78. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  79. sqlspec/adapters/psqlpy/litestar/store.py +272 -0
  80. sqlspec/adapters/psqlpy/type_converter.py +102 -0
  81. sqlspec/adapters/psycopg/_type_handlers.py +80 -0
  82. sqlspec/adapters/psycopg/_types.py +2 -1
  83. sqlspec/adapters/psycopg/adk/__init__.py +5 -0
  84. sqlspec/adapters/psycopg/adk/store.py +944 -0
  85. sqlspec/adapters/psycopg/config.py +69 -35
  86. sqlspec/adapters/psycopg/data_dictionary.py +331 -0
  87. sqlspec/adapters/psycopg/driver.py +238 -81
  88. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  89. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  90. sqlspec/adapters/sqlite/__init__.py +2 -1
  91. sqlspec/adapters/sqlite/_type_handlers.py +86 -0
  92. sqlspec/adapters/sqlite/_types.py +1 -1
  93. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  94. sqlspec/adapters/sqlite/adk/store.py +572 -0
  95. sqlspec/adapters/sqlite/config.py +87 -15
  96. sqlspec/adapters/sqlite/data_dictionary.py +149 -0
  97. sqlspec/adapters/sqlite/driver.py +137 -54
  98. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  99. sqlspec/adapters/sqlite/litestar/store.py +318 -0
  100. sqlspec/adapters/sqlite/pool.py +18 -9
  101. sqlspec/base.py +45 -26
  102. sqlspec/builder/__init__.py +73 -4
  103. sqlspec/builder/_base.py +162 -89
  104. sqlspec/builder/_column.py +62 -29
  105. sqlspec/builder/_ddl.py +180 -121
  106. sqlspec/builder/_delete.py +5 -4
  107. sqlspec/builder/_dml.py +388 -0
  108. sqlspec/{_sql.py → builder/_factory.py} +53 -94
  109. sqlspec/builder/_insert.py +32 -131
  110. sqlspec/builder/_join.py +375 -0
  111. sqlspec/builder/_merge.py +446 -11
  112. sqlspec/builder/_parsing_utils.py +111 -17
  113. sqlspec/builder/_select.py +1457 -24
  114. sqlspec/builder/_update.py +11 -42
  115. sqlspec/cli.py +307 -194
  116. sqlspec/config.py +252 -67
  117. sqlspec/core/__init__.py +5 -4
  118. sqlspec/core/cache.py +17 -17
  119. sqlspec/core/compiler.py +62 -9
  120. sqlspec/core/filters.py +37 -37
  121. sqlspec/core/hashing.py +9 -9
  122. sqlspec/core/parameters.py +83 -48
  123. sqlspec/core/result.py +102 -46
  124. sqlspec/core/splitter.py +16 -17
  125. sqlspec/core/statement.py +36 -30
  126. sqlspec/core/type_conversion.py +235 -0
  127. sqlspec/driver/__init__.py +7 -6
  128. sqlspec/driver/_async.py +188 -151
  129. sqlspec/driver/_common.py +285 -80
  130. sqlspec/driver/_sync.py +188 -152
  131. sqlspec/driver/mixins/_result_tools.py +20 -236
  132. sqlspec/driver/mixins/_sql_translator.py +4 -4
  133. sqlspec/exceptions.py +75 -7
  134. sqlspec/extensions/adk/__init__.py +53 -0
  135. sqlspec/extensions/adk/_types.py +51 -0
  136. sqlspec/extensions/adk/converters.py +172 -0
  137. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +144 -0
  138. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  139. sqlspec/extensions/adk/service.py +181 -0
  140. sqlspec/extensions/adk/store.py +536 -0
  141. sqlspec/extensions/aiosql/adapter.py +73 -53
  142. sqlspec/extensions/litestar/__init__.py +21 -4
  143. sqlspec/extensions/litestar/cli.py +54 -10
  144. sqlspec/extensions/litestar/config.py +59 -266
  145. sqlspec/extensions/litestar/handlers.py +46 -17
  146. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  147. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  148. sqlspec/extensions/litestar/plugin.py +324 -223
  149. sqlspec/extensions/litestar/providers.py +25 -25
  150. sqlspec/extensions/litestar/store.py +265 -0
  151. sqlspec/loader.py +30 -49
  152. sqlspec/migrations/__init__.py +4 -3
  153. sqlspec/migrations/base.py +302 -39
  154. sqlspec/migrations/commands.py +611 -144
  155. sqlspec/migrations/context.py +142 -0
  156. sqlspec/migrations/fix.py +199 -0
  157. sqlspec/migrations/loaders.py +68 -23
  158. sqlspec/migrations/runner.py +543 -107
  159. sqlspec/migrations/tracker.py +237 -21
  160. sqlspec/migrations/utils.py +51 -3
  161. sqlspec/migrations/validation.py +177 -0
  162. sqlspec/protocols.py +66 -36
  163. sqlspec/storage/_utils.py +98 -0
  164. sqlspec/storage/backends/fsspec.py +134 -106
  165. sqlspec/storage/backends/local.py +78 -51
  166. sqlspec/storage/backends/obstore.py +278 -162
  167. sqlspec/storage/registry.py +75 -39
  168. sqlspec/typing.py +16 -84
  169. sqlspec/utils/config_resolver.py +153 -0
  170. sqlspec/utils/correlation.py +4 -5
  171. sqlspec/utils/data_transformation.py +3 -2
  172. sqlspec/utils/deprecation.py +9 -8
  173. sqlspec/utils/fixtures.py +4 -4
  174. sqlspec/utils/logging.py +46 -6
  175. sqlspec/utils/module_loader.py +2 -2
  176. sqlspec/utils/schema.py +288 -0
  177. sqlspec/utils/serializers.py +50 -2
  178. sqlspec/utils/sync_tools.py +21 -17
  179. sqlspec/utils/text.py +1 -2
  180. sqlspec/utils/type_guards.py +111 -20
  181. sqlspec/utils/version.py +433 -0
  182. {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/METADATA +40 -21
  183. sqlspec-0.27.0.dist-info/RECORD +207 -0
  184. sqlspec/builder/mixins/__init__.py +0 -55
  185. sqlspec/builder/mixins/_cte_and_set_ops.py +0 -254
  186. sqlspec/builder/mixins/_delete_operations.py +0 -50
  187. sqlspec/builder/mixins/_insert_operations.py +0 -282
  188. sqlspec/builder/mixins/_join_operations.py +0 -389
  189. sqlspec/builder/mixins/_merge_operations.py +0 -592
  190. sqlspec/builder/mixins/_order_limit_operations.py +0 -152
  191. sqlspec/builder/mixins/_pivot_operations.py +0 -157
  192. sqlspec/builder/mixins/_select_operations.py +0 -936
  193. sqlspec/builder/mixins/_update_operations.py +0 -218
  194. sqlspec/builder/mixins/_where_clause.py +0 -1304
  195. sqlspec-0.25.0.dist-info/RECORD +0 -139
  196. sqlspec-0.25.0.dist-info/licenses/NOTICE +0 -29
  197. {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/WHEEL +0 -0
  198. {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/entry_points.txt +0 -0
  199. {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/licenses/LICENSE +0 -0
@@ -5,7 +5,8 @@ SQL conditions with parameter binding.
5
5
  """
6
6
 
7
7
  from collections.abc import Iterable
8
- from typing import Any, Optional, cast
8
+ from datetime import date, datetime
9
+ from typing import Any, cast
9
10
 
10
11
  from sqlglot import exp
11
12
 
@@ -14,6 +15,24 @@ from sqlspec.utils.type_guards import has_sql_method
14
15
  __all__ = ("Column", "ColumnExpression", "FunctionColumn")
15
16
 
16
17
 
18
+ def _convert_value(value: Any) -> exp.Expression:
19
+ """Convert a Python value to a SQLGlot expression.
20
+
21
+ Special handling for datetime objects to prevent SQLGlot from
22
+ converting them to TIME_STR_TO_TIME function calls. Datetime
23
+ objects should be passed as parameters, not converted to SQL functions.
24
+
25
+ Args:
26
+ value: The value to convert
27
+
28
+ Returns:
29
+ A SQLGlot expression representing the value
30
+ """
31
+ if isinstance(value, (datetime, date)):
32
+ return exp.Literal(this=value, is_string=False)
33
+ return exp.convert(value)
34
+
35
+
17
36
  class ColumnExpression:
18
37
  """Base class for column expressions that can be combined with operators."""
19
38
 
@@ -58,7 +77,7 @@ class Column:
58
77
 
59
78
  __slots__ = ("_expression", "name", "table")
60
79
 
61
- def __init__(self, name: str, table: Optional[str] = None) -> None:
80
+ def __init__(self, name: str, table: str | None = None) -> None:
62
81
  self.name = name
63
82
  self.table = table
64
83
 
@@ -67,53 +86,59 @@ class Column:
67
86
  else:
68
87
  self._expression = exp.Column(this=exp.Identifier(this=name))
69
88
 
89
+ def _convert_value(self, value: Any) -> exp.Expression:
90
+ """Convert a Python value to a SQLGlot expression."""
91
+ return _convert_value(value)
92
+
70
93
  def __eq__(self, other: object) -> ColumnExpression: # type: ignore[override]
71
94
  """Equal to (==)."""
72
95
  if other is None:
73
96
  return ColumnExpression(exp.Is(this=self._expression, expression=exp.Null()))
74
- return ColumnExpression(exp.EQ(this=self._expression, expression=exp.convert(other)))
97
+ return ColumnExpression(exp.EQ(this=self._expression, expression=self._convert_value(other)))
75
98
 
76
99
  def __ne__(self, other: object) -> ColumnExpression: # type: ignore[override]
77
100
  """Not equal to (!=)."""
78
101
  if other is None:
79
102
  return ColumnExpression(exp.Not(this=exp.Is(this=self._expression, expression=exp.Null())))
80
- return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.convert(other)))
103
+ return ColumnExpression(exp.NEQ(this=self._expression, expression=self._convert_value(other)))
81
104
 
82
105
  def __gt__(self, other: Any) -> ColumnExpression:
83
106
  """Greater than (>)."""
84
- return ColumnExpression(exp.GT(this=self._expression, expression=exp.convert(other)))
107
+ return ColumnExpression(exp.GT(this=self._expression, expression=self._convert_value(other)))
85
108
 
86
109
  def __ge__(self, other: Any) -> ColumnExpression:
87
110
  """Greater than or equal (>=)."""
88
- return ColumnExpression(exp.GTE(this=self._expression, expression=exp.convert(other)))
111
+ return ColumnExpression(exp.GTE(this=self._expression, expression=self._convert_value(other)))
89
112
 
90
113
  def __lt__(self, other: Any) -> ColumnExpression:
91
114
  """Less than (<)."""
92
- return ColumnExpression(exp.LT(this=self._expression, expression=exp.convert(other)))
115
+ return ColumnExpression(exp.LT(this=self._expression, expression=self._convert_value(other)))
93
116
 
94
117
  def __le__(self, other: Any) -> ColumnExpression:
95
118
  """Less than or equal (<=)."""
96
- return ColumnExpression(exp.LTE(this=self._expression, expression=exp.convert(other)))
119
+ return ColumnExpression(exp.LTE(this=self._expression, expression=self._convert_value(other)))
97
120
 
98
121
  def __invert__(self) -> ColumnExpression:
99
122
  """Apply NOT operator (~)."""
100
123
  return ColumnExpression(exp.Not(this=self._expression))
101
124
 
102
- def like(self, pattern: str, escape: Optional[str] = None) -> ColumnExpression:
125
+ def like(self, pattern: str, escape: str | None = None) -> ColumnExpression:
103
126
  """SQL LIKE pattern matching."""
104
127
  if escape:
105
- like_expr = exp.Like(this=self._expression, expression=exp.convert(pattern), escape=exp.convert(escape))
128
+ like_expr = exp.Like(
129
+ this=self._expression, expression=self._convert_value(pattern), escape=self._convert_value(escape)
130
+ )
106
131
  else:
107
- like_expr = exp.Like(this=self._expression, expression=exp.convert(pattern))
132
+ like_expr = exp.Like(this=self._expression, expression=self._convert_value(pattern))
108
133
  return ColumnExpression(like_expr)
109
134
 
110
135
  def ilike(self, pattern: str) -> ColumnExpression:
111
136
  """Case-insensitive LIKE."""
112
- return ColumnExpression(exp.ILike(this=self._expression, expression=exp.convert(pattern)))
137
+ return ColumnExpression(exp.ILike(this=self._expression, expression=self._convert_value(pattern)))
113
138
 
114
139
  def in_(self, values: Iterable[Any]) -> ColumnExpression:
115
140
  """SQL IN clause."""
116
- converted_values = [exp.convert(v) for v in values]
141
+ converted_values = [self._convert_value(v) for v in values]
117
142
  return ColumnExpression(exp.In(this=self._expression, expressions=converted_values))
118
143
 
119
144
  def not_in(self, values: Iterable[Any]) -> ColumnExpression:
@@ -122,7 +147,9 @@ class Column:
122
147
 
123
148
  def between(self, start: Any, end: Any) -> ColumnExpression:
124
149
  """SQL BETWEEN clause."""
125
- return ColumnExpression(exp.Between(this=self._expression, low=exp.convert(start), high=exp.convert(end)))
150
+ return ColumnExpression(
151
+ exp.Between(this=self._expression, low=self._convert_value(start), high=self._convert_value(end))
152
+ )
126
153
 
127
154
  def is_null(self) -> ColumnExpression:
128
155
  """SQL IS NULL."""
@@ -132,7 +159,7 @@ class Column:
132
159
  """SQL IS NOT NULL."""
133
160
  return ColumnExpression(exp.Not(this=exp.Is(this=self._expression, expression=exp.Null())))
134
161
 
135
- def not_like(self, pattern: str, escape: Optional[str] = None) -> ColumnExpression:
162
+ def not_like(self, pattern: str, escape: str | None = None) -> ColumnExpression:
136
163
  """SQL NOT LIKE pattern matching."""
137
164
  return ~self.like(pattern, escape)
138
165
 
@@ -142,12 +169,12 @@ class Column:
142
169
 
143
170
  def any_(self, values: Iterable[Any]) -> ColumnExpression:
144
171
  """SQL = ANY(...) clause."""
145
- converted_values = [exp.convert(v) for v in values]
172
+ converted_values = [self._convert_value(v) for v in values]
146
173
  return ColumnExpression(exp.EQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
147
174
 
148
175
  def not_any_(self, values: Iterable[Any]) -> ColumnExpression:
149
176
  """SQL <> ANY(...) clause."""
150
- converted_values = [exp.convert(v) for v in values]
177
+ converted_values = [self._convert_value(v) for v in values]
151
178
  return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
152
179
 
153
180
  def lower(self) -> "FunctionColumn":
@@ -184,16 +211,16 @@ class Column:
184
211
  """SQL CEIL() function."""
185
212
  return FunctionColumn(exp.Ceil(this=self._expression))
186
213
 
187
- def substring(self, start: int, length: Optional[int] = None) -> "FunctionColumn":
214
+ def substring(self, start: int, length: int | None = None) -> "FunctionColumn":
188
215
  """SQL SUBSTRING() function."""
189
- args = [exp.convert(start)]
216
+ args = [self._convert_value(start)]
190
217
  if length is not None:
191
- args.append(exp.convert(length))
218
+ args.append(self._convert_value(length))
192
219
  return FunctionColumn(exp.Substring(this=self._expression, expressions=args))
193
220
 
194
221
  def coalesce(self, *values: Any) -> "FunctionColumn":
195
222
  """SQL COALESCE() function."""
196
- expressions = [self._expression] + [exp.convert(v) for v in values]
223
+ expressions = [self._expression] + [self._convert_value(v) for v in values]
197
224
  return FunctionColumn(exp.Coalesce(expressions=expressions))
198
225
 
199
226
  def cast(self, data_type: str) -> "FunctionColumn":
@@ -272,22 +299,26 @@ class FunctionColumn:
272
299
  def __init__(self, expression: exp.Expression) -> None:
273
300
  self._expression = expression
274
301
 
302
+ def _convert_value(self, value: Any) -> exp.Expression:
303
+ """Convert a Python value to a SQLGlot expression."""
304
+ return _convert_value(value)
305
+
275
306
  def __eq__(self, other: object) -> ColumnExpression: # type: ignore[override]
276
- return ColumnExpression(exp.EQ(this=self._expression, expression=exp.convert(other)))
307
+ return ColumnExpression(exp.EQ(this=self._expression, expression=self._convert_value(other)))
277
308
 
278
309
  def __ne__(self, other: object) -> ColumnExpression: # type: ignore[override]
279
- return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.convert(other)))
310
+ return ColumnExpression(exp.NEQ(this=self._expression, expression=self._convert_value(other)))
280
311
 
281
312
  def like(self, pattern: str) -> ColumnExpression:
282
- return ColumnExpression(exp.Like(this=self._expression, expression=exp.convert(pattern)))
313
+ return ColumnExpression(exp.Like(this=self._expression, expression=self._convert_value(pattern)))
283
314
 
284
315
  def ilike(self, pattern: str) -> ColumnExpression:
285
316
  """Case-insensitive LIKE."""
286
- return ColumnExpression(exp.ILike(this=self._expression, expression=exp.convert(pattern)))
317
+ return ColumnExpression(exp.ILike(this=self._expression, expression=self._convert_value(pattern)))
287
318
 
288
319
  def in_(self, values: Iterable[Any]) -> ColumnExpression:
289
320
  """SQL IN clause."""
290
- converted_values = [exp.convert(v) for v in values]
321
+ converted_values = [self._convert_value(v) for v in values]
291
322
  return ColumnExpression(exp.In(this=self._expression, expressions=converted_values))
292
323
 
293
324
  def not_in_(self, values: Iterable[Any]) -> ColumnExpression:
@@ -304,7 +335,9 @@ class FunctionColumn:
304
335
 
305
336
  def between(self, start: Any, end: Any) -> ColumnExpression:
306
337
  """SQL BETWEEN clause."""
307
- return ColumnExpression(exp.Between(this=self._expression, low=exp.convert(start), high=exp.convert(end)))
338
+ return ColumnExpression(
339
+ exp.Between(this=self._expression, low=self._convert_value(start), high=self._convert_value(end))
340
+ )
308
341
 
309
342
  def is_null(self) -> ColumnExpression:
310
343
  """SQL IS NULL."""
@@ -316,12 +349,12 @@ class FunctionColumn:
316
349
 
317
350
  def any_(self, values: Iterable[Any]) -> ColumnExpression:
318
351
  """SQL = ANY(...) clause."""
319
- converted_values = [exp.convert(v) for v in values]
352
+ converted_values = [self._convert_value(v) for v in values]
320
353
  return ColumnExpression(exp.EQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
321
354
 
322
355
  def not_any_(self, values: Iterable[Any]) -> ColumnExpression:
323
356
  """SQL <> ANY(...) clause."""
324
- converted_values = [exp.convert(v) for v in values]
357
+ converted_values = [self._convert_value(v) for v in values]
325
358
  return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
326
359
 
327
360
  def alias(self, alias_name: str) -> exp.Expression: