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.
- sqlspec/__init__.py +7 -15
- sqlspec/_serialization.py +256 -24
- sqlspec/_typing.py +71 -52
- sqlspec/adapters/adbc/_types.py +1 -1
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +870 -0
- sqlspec/adapters/adbc/config.py +69 -12
- sqlspec/adapters/adbc/data_dictionary.py +340 -0
- sqlspec/adapters/adbc/driver.py +266 -58
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +504 -0
- sqlspec/adapters/adbc/type_converter.py +153 -0
- sqlspec/adapters/aiosqlite/_types.py +1 -1
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +527 -0
- sqlspec/adapters/aiosqlite/config.py +88 -15
- sqlspec/adapters/aiosqlite/data_dictionary.py +149 -0
- sqlspec/adapters/aiosqlite/driver.py +143 -40
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +281 -0
- sqlspec/adapters/aiosqlite/pool.py +7 -7
- sqlspec/adapters/asyncmy/__init__.py +7 -1
- sqlspec/adapters/asyncmy/_types.py +2 -2
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +493 -0
- sqlspec/adapters/asyncmy/config.py +68 -23
- sqlspec/adapters/asyncmy/data_dictionary.py +161 -0
- sqlspec/adapters/asyncmy/driver.py +313 -58
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +2 -1
- sqlspec/adapters/asyncpg/_type_handlers.py +71 -0
- sqlspec/adapters/asyncpg/_types.py +11 -7
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +450 -0
- sqlspec/adapters/asyncpg/config.py +59 -35
- sqlspec/adapters/asyncpg/data_dictionary.py +173 -0
- sqlspec/adapters/asyncpg/driver.py +170 -25
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +253 -0
- sqlspec/adapters/bigquery/_types.py +1 -1
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +576 -0
- sqlspec/adapters/bigquery/config.py +27 -10
- sqlspec/adapters/bigquery/data_dictionary.py +149 -0
- sqlspec/adapters/bigquery/driver.py +368 -142
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +327 -0
- sqlspec/adapters/bigquery/type_converter.py +125 -0
- sqlspec/adapters/duckdb/_types.py +1 -1
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +553 -0
- sqlspec/adapters/duckdb/config.py +80 -20
- sqlspec/adapters/duckdb/data_dictionary.py +163 -0
- sqlspec/adapters/duckdb/driver.py +167 -45
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +332 -0
- sqlspec/adapters/duckdb/pool.py +4 -4
- sqlspec/adapters/duckdb/type_converter.py +133 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +133 -0
- sqlspec/adapters/oracledb/_types.py +20 -2
- sqlspec/adapters/oracledb/adk/__init__.py +5 -0
- sqlspec/adapters/oracledb/adk/store.py +1745 -0
- sqlspec/adapters/oracledb/config.py +122 -32
- sqlspec/adapters/oracledb/data_dictionary.py +509 -0
- sqlspec/adapters/oracledb/driver.py +353 -91
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +767 -0
- sqlspec/adapters/oracledb/migrations.py +348 -73
- sqlspec/adapters/oracledb/type_converter.py +207 -0
- sqlspec/adapters/psqlpy/_type_handlers.py +44 -0
- sqlspec/adapters/psqlpy/_types.py +2 -1
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +482 -0
- sqlspec/adapters/psqlpy/config.py +46 -17
- sqlspec/adapters/psqlpy/data_dictionary.py +172 -0
- sqlspec/adapters/psqlpy/driver.py +123 -209
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +272 -0
- sqlspec/adapters/psqlpy/type_converter.py +102 -0
- sqlspec/adapters/psycopg/_type_handlers.py +80 -0
- sqlspec/adapters/psycopg/_types.py +2 -1
- sqlspec/adapters/psycopg/adk/__init__.py +5 -0
- sqlspec/adapters/psycopg/adk/store.py +944 -0
- sqlspec/adapters/psycopg/config.py +69 -35
- sqlspec/adapters/psycopg/data_dictionary.py +331 -0
- sqlspec/adapters/psycopg/driver.py +238 -81
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +554 -0
- sqlspec/adapters/sqlite/__init__.py +2 -1
- sqlspec/adapters/sqlite/_type_handlers.py +86 -0
- sqlspec/adapters/sqlite/_types.py +1 -1
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +572 -0
- sqlspec/adapters/sqlite/config.py +87 -15
- sqlspec/adapters/sqlite/data_dictionary.py +149 -0
- sqlspec/adapters/sqlite/driver.py +137 -54
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +318 -0
- sqlspec/adapters/sqlite/pool.py +18 -9
- sqlspec/base.py +45 -26
- sqlspec/builder/__init__.py +73 -4
- sqlspec/builder/_base.py +162 -89
- sqlspec/builder/_column.py +62 -29
- sqlspec/builder/_ddl.py +180 -121
- sqlspec/builder/_delete.py +5 -4
- sqlspec/builder/_dml.py +388 -0
- sqlspec/{_sql.py → builder/_factory.py} +53 -94
- sqlspec/builder/_insert.py +32 -131
- sqlspec/builder/_join.py +375 -0
- sqlspec/builder/_merge.py +446 -11
- sqlspec/builder/_parsing_utils.py +111 -17
- sqlspec/builder/_select.py +1457 -24
- sqlspec/builder/_update.py +11 -42
- sqlspec/cli.py +307 -194
- sqlspec/config.py +252 -67
- sqlspec/core/__init__.py +5 -4
- sqlspec/core/cache.py +17 -17
- sqlspec/core/compiler.py +62 -9
- sqlspec/core/filters.py +37 -37
- sqlspec/core/hashing.py +9 -9
- sqlspec/core/parameters.py +83 -48
- sqlspec/core/result.py +102 -46
- sqlspec/core/splitter.py +16 -17
- sqlspec/core/statement.py +36 -30
- sqlspec/core/type_conversion.py +235 -0
- sqlspec/driver/__init__.py +7 -6
- sqlspec/driver/_async.py +188 -151
- sqlspec/driver/_common.py +285 -80
- sqlspec/driver/_sync.py +188 -152
- sqlspec/driver/mixins/_result_tools.py +20 -236
- sqlspec/driver/mixins/_sql_translator.py +4 -4
- sqlspec/exceptions.py +75 -7
- sqlspec/extensions/adk/__init__.py +53 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +144 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +181 -0
- sqlspec/extensions/adk/store.py +536 -0
- sqlspec/extensions/aiosql/adapter.py +73 -53
- sqlspec/extensions/litestar/__init__.py +21 -4
- sqlspec/extensions/litestar/cli.py +54 -10
- sqlspec/extensions/litestar/config.py +59 -266
- sqlspec/extensions/litestar/handlers.py +46 -17
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +324 -223
- sqlspec/extensions/litestar/providers.py +25 -25
- sqlspec/extensions/litestar/store.py +265 -0
- sqlspec/loader.py +30 -49
- sqlspec/migrations/__init__.py +4 -3
- sqlspec/migrations/base.py +302 -39
- sqlspec/migrations/commands.py +611 -144
- sqlspec/migrations/context.py +142 -0
- sqlspec/migrations/fix.py +199 -0
- sqlspec/migrations/loaders.py +68 -23
- sqlspec/migrations/runner.py +543 -107
- sqlspec/migrations/tracker.py +237 -21
- sqlspec/migrations/utils.py +51 -3
- sqlspec/migrations/validation.py +177 -0
- sqlspec/protocols.py +66 -36
- sqlspec/storage/_utils.py +98 -0
- sqlspec/storage/backends/fsspec.py +134 -106
- sqlspec/storage/backends/local.py +78 -51
- sqlspec/storage/backends/obstore.py +278 -162
- sqlspec/storage/registry.py +75 -39
- sqlspec/typing.py +16 -84
- sqlspec/utils/config_resolver.py +153 -0
- sqlspec/utils/correlation.py +4 -5
- sqlspec/utils/data_transformation.py +3 -2
- sqlspec/utils/deprecation.py +9 -8
- sqlspec/utils/fixtures.py +4 -4
- sqlspec/utils/logging.py +46 -6
- sqlspec/utils/module_loader.py +2 -2
- sqlspec/utils/schema.py +288 -0
- sqlspec/utils/serializers.py +50 -2
- sqlspec/utils/sync_tools.py +21 -17
- sqlspec/utils/text.py +1 -2
- sqlspec/utils/type_guards.py +111 -20
- sqlspec/utils/version.py +433 -0
- {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/METADATA +40 -21
- sqlspec-0.27.0.dist-info/RECORD +207 -0
- sqlspec/builder/mixins/__init__.py +0 -55
- sqlspec/builder/mixins/_cte_and_set_ops.py +0 -254
- sqlspec/builder/mixins/_delete_operations.py +0 -50
- sqlspec/builder/mixins/_insert_operations.py +0 -282
- sqlspec/builder/mixins/_join_operations.py +0 -389
- sqlspec/builder/mixins/_merge_operations.py +0 -592
- sqlspec/builder/mixins/_order_limit_operations.py +0 -152
- sqlspec/builder/mixins/_pivot_operations.py +0 -157
- sqlspec/builder/mixins/_select_operations.py +0 -936
- sqlspec/builder/mixins/_update_operations.py +0 -218
- sqlspec/builder/mixins/_where_clause.py +0 -1304
- sqlspec-0.25.0.dist-info/RECORD +0 -139
- sqlspec-0.25.0.dist-info/licenses/NOTICE +0 -29
- {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/entry_points.txt +0 -0
- {sqlspec-0.25.0.dist-info → sqlspec-0.27.0.dist-info}/licenses/LICENSE +0 -0
sqlspec/builder/_column.py
CHANGED
|
@@ -5,7 +5,8 @@ SQL conditions with parameter binding.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from collections.abc import Iterable
|
|
8
|
-
from
|
|
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:
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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:
|
|
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(
|
|
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=
|
|
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=
|
|
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 = [
|
|
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(
|
|
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:
|
|
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 = [
|
|
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 = [
|
|
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:
|
|
214
|
+
def substring(self, start: int, length: int | None = None) -> "FunctionColumn":
|
|
188
215
|
"""SQL SUBSTRING() function."""
|
|
189
|
-
args = [
|
|
216
|
+
args = [self._convert_value(start)]
|
|
190
217
|
if length is not None:
|
|
191
|
-
args.append(
|
|
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] + [
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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 = [
|
|
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(
|
|
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 = [
|
|
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 = [
|
|
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:
|