sqlglot 27.13.2__py3-none-any.whl → 27.15.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.
- sqlglot/_version.py +2 -2
- sqlglot/dialects/bigquery.py +23 -18
- sqlglot/dialects/clickhouse.py +1 -0
- sqlglot/dialects/dialect.py +1 -1
- sqlglot/dialects/duckdb.py +15 -4
- sqlglot/dialects/fabric.py +1 -1
- sqlglot/dialects/hive.py +1 -0
- sqlglot/dialects/mysql.py +41 -9
- sqlglot/dialects/postgres.py +19 -0
- sqlglot/dialects/redshift.py +1 -0
- sqlglot/dialects/singlestore.py +129 -1
- sqlglot/dialects/snowflake.py +88 -3
- sqlglot/dialects/sqlite.py +1 -0
- sqlglot/dialects/tsql.py +10 -0
- sqlglot/expressions.py +68 -4
- sqlglot/generator.py +27 -13
- sqlglot/optimizer/annotate_types.py +35 -5
- sqlglot/optimizer/qualify_columns.py +6 -2
- sqlglot/parser.py +51 -15
- sqlglot/serde.py +108 -50
- sqlglot/tokens.py +4 -0
- {sqlglot-27.13.2.dist-info → sqlglot-27.15.0.dist-info}/METADATA +1 -1
- {sqlglot-27.13.2.dist-info → sqlglot-27.15.0.dist-info}/RECORD +26 -26
- {sqlglot-27.13.2.dist-info → sqlglot-27.15.0.dist-info}/WHEEL +0 -0
- {sqlglot-27.13.2.dist-info → sqlglot-27.15.0.dist-info}/licenses/LICENSE +0 -0
- {sqlglot-27.13.2.dist-info → sqlglot-27.15.0.dist-info}/top_level.txt +0 -0
sqlglot/parser.py
CHANGED
|
@@ -942,6 +942,9 @@ class Parser(metaclass=_Parser):
|
|
|
942
942
|
TokenType.RLIKE: binary_range_parser(exp.RegexpLike),
|
|
943
943
|
TokenType.SIMILAR_TO: binary_range_parser(exp.SimilarTo),
|
|
944
944
|
TokenType.FOR: lambda self, this: self._parse_comprehension(this),
|
|
945
|
+
TokenType.QMARK_AMP: binary_range_parser(exp.JSONBContainsAllTopKeys),
|
|
946
|
+
TokenType.QMARK_PIPE: binary_range_parser(exp.JSONBContainsAnyTopKeys),
|
|
947
|
+
TokenType.HASH_DASH: binary_range_parser(exp.JSONBDeleteAtPath),
|
|
945
948
|
}
|
|
946
949
|
|
|
947
950
|
PIPE_SYNTAX_TRANSFORM_PARSERS = {
|
|
@@ -1424,8 +1427,6 @@ class Parser(metaclass=_Parser):
|
|
|
1424
1427
|
|
|
1425
1428
|
DISTINCT_TOKENS = {TokenType.DISTINCT}
|
|
1426
1429
|
|
|
1427
|
-
NULL_TOKENS = {TokenType.NULL}
|
|
1428
|
-
|
|
1429
1430
|
UNNEST_OFFSET_ALIAS_TOKENS = TABLE_ALIAS_TOKENS - SET_OPERATIONS
|
|
1430
1431
|
|
|
1431
1432
|
SELECT_START_TOKENS = {TokenType.L_PAREN, TokenType.WITH, TokenType.SELECT}
|
|
@@ -1555,6 +1556,10 @@ class Parser(metaclass=_Parser):
|
|
|
1555
1556
|
# is true for Snowflake but not for BigQuery which can also process strings
|
|
1556
1557
|
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION = False
|
|
1557
1558
|
|
|
1559
|
+
# Dialects like Databricks support JOINS without join criteria
|
|
1560
|
+
# Adding an ON TRUE, makes transpilation semantically correct for other dialects
|
|
1561
|
+
ADD_JOIN_ON_TRUE = False
|
|
1562
|
+
|
|
1558
1563
|
__slots__ = (
|
|
1559
1564
|
"error_level",
|
|
1560
1565
|
"error_message_context",
|
|
@@ -3205,9 +3210,10 @@ class Parser(metaclass=_Parser):
|
|
|
3205
3210
|
elif self._match(TokenType.FROM):
|
|
3206
3211
|
from_ = self._parse_from(skip_from_token=True, consume_pipe=True)
|
|
3207
3212
|
# Support parentheses for duckdb FROM-first syntax
|
|
3208
|
-
select = self._parse_select()
|
|
3213
|
+
select = self._parse_select(from_=from_)
|
|
3209
3214
|
if select:
|
|
3210
|
-
select.
|
|
3215
|
+
if not select.args.get("from"):
|
|
3216
|
+
select.set("from", from_)
|
|
3211
3217
|
this = select
|
|
3212
3218
|
else:
|
|
3213
3219
|
this = exp.select("*").from_(t.cast(exp.From, from_))
|
|
@@ -3235,6 +3241,7 @@ class Parser(metaclass=_Parser):
|
|
|
3235
3241
|
parse_subquery_alias: bool = True,
|
|
3236
3242
|
parse_set_operation: bool = True,
|
|
3237
3243
|
consume_pipe: bool = True,
|
|
3244
|
+
from_: t.Optional[exp.From] = None,
|
|
3238
3245
|
) -> t.Optional[exp.Expression]:
|
|
3239
3246
|
query = self._parse_select_query(
|
|
3240
3247
|
nested=nested,
|
|
@@ -3243,13 +3250,12 @@ class Parser(metaclass=_Parser):
|
|
|
3243
3250
|
parse_set_operation=parse_set_operation,
|
|
3244
3251
|
)
|
|
3245
3252
|
|
|
3246
|
-
if (
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
query = query.subquery(copy=False) if query and table else query
|
|
3253
|
+
if consume_pipe and self._match(TokenType.PIPE_GT, advance=False):
|
|
3254
|
+
if not query and from_:
|
|
3255
|
+
query = exp.select("*").from_(from_)
|
|
3256
|
+
if isinstance(query, exp.Query):
|
|
3257
|
+
query = self._parse_pipe_syntax_query(query)
|
|
3258
|
+
query = query.subquery(copy=False) if query and table else query
|
|
3253
3259
|
|
|
3254
3260
|
return query
|
|
3255
3261
|
|
|
@@ -3876,6 +3882,16 @@ class Parser(metaclass=_Parser):
|
|
|
3876
3882
|
|
|
3877
3883
|
comments = [c for token in (method, side, kind) if token for c in token.comments]
|
|
3878
3884
|
comments = (join_comments or []) + comments
|
|
3885
|
+
|
|
3886
|
+
if (
|
|
3887
|
+
self.ADD_JOIN_ON_TRUE
|
|
3888
|
+
and not kwargs.get("on")
|
|
3889
|
+
and not kwargs.get("using")
|
|
3890
|
+
and not kwargs.get("method")
|
|
3891
|
+
and kwargs.get("kind") in (None, "INNER", "OUTER")
|
|
3892
|
+
):
|
|
3893
|
+
kwargs["on"] = exp.true()
|
|
3894
|
+
|
|
3879
3895
|
return self.expression(exp.Join, comments=comments, **kwargs)
|
|
3880
3896
|
|
|
3881
3897
|
def _parse_opclass(self) -> t.Optional[exp.Expression]:
|
|
@@ -4407,6 +4423,8 @@ class Parser(metaclass=_Parser):
|
|
|
4407
4423
|
def _parse_pivot_aggregation(self) -> t.Optional[exp.Expression]:
|
|
4408
4424
|
func = self._parse_function()
|
|
4409
4425
|
if not func:
|
|
4426
|
+
if self._prev and self._prev.token_type == TokenType.COMMA:
|
|
4427
|
+
return None
|
|
4410
4428
|
self.raise_error("Expecting an aggregation function in PIVOT")
|
|
4411
4429
|
|
|
4412
4430
|
return self._parse_alias(func)
|
|
@@ -5396,7 +5414,7 @@ class Parser(metaclass=_Parser):
|
|
|
5396
5414
|
|
|
5397
5415
|
# https://docs.snowflake.com/en/sql-reference/data-types-vector
|
|
5398
5416
|
if type_token == TokenType.VECTOR and len(expressions) == 2:
|
|
5399
|
-
expressions
|
|
5417
|
+
expressions = self._parse_vector_expressions(expressions)
|
|
5400
5418
|
|
|
5401
5419
|
if not self._match(TokenType.R_PAREN):
|
|
5402
5420
|
self._retreat(index)
|
|
@@ -5532,6 +5550,11 @@ class Parser(metaclass=_Parser):
|
|
|
5532
5550
|
|
|
5533
5551
|
return this
|
|
5534
5552
|
|
|
5553
|
+
def _parse_vector_expressions(
|
|
5554
|
+
self, expressions: t.List[exp.Expression]
|
|
5555
|
+
) -> t.List[exp.Expression]:
|
|
5556
|
+
return [exp.DataType.build(expressions[0].name, dialect=self.dialect), *expressions[1:]]
|
|
5557
|
+
|
|
5535
5558
|
def _parse_struct_types(self, type_required: bool = False) -> t.Optional[exp.Expression]:
|
|
5536
5559
|
index = self._index
|
|
5537
5560
|
|
|
@@ -5805,6 +5828,9 @@ class Parser(metaclass=_Parser):
|
|
|
5805
5828
|
|
|
5806
5829
|
return func
|
|
5807
5830
|
|
|
5831
|
+
def _parse_function_args(self, alias: bool = False) -> t.List[exp.Expression]:
|
|
5832
|
+
return self._parse_csv(lambda: self._parse_lambda(alias=alias))
|
|
5833
|
+
|
|
5808
5834
|
def _parse_function_call(
|
|
5809
5835
|
self,
|
|
5810
5836
|
functions: t.Optional[t.Dict[str, t.Callable]] = None,
|
|
@@ -5869,7 +5895,7 @@ class Parser(metaclass=_Parser):
|
|
|
5869
5895
|
known_function = function and not anonymous
|
|
5870
5896
|
|
|
5871
5897
|
alias = not known_function or upper in self.FUNCTIONS_WITH_ALIASED_ARGS
|
|
5872
|
-
args = self.
|
|
5898
|
+
args = self._parse_function_args(alias)
|
|
5873
5899
|
|
|
5874
5900
|
post_func_comments = self._curr and self._curr.comments
|
|
5875
5901
|
if known_function and post_func_comments:
|
|
@@ -6051,6 +6077,9 @@ class Parser(metaclass=_Parser):
|
|
|
6051
6077
|
constraint_kind = exp.ComputedColumnConstraint(
|
|
6052
6078
|
this=self._parse_assignment(),
|
|
6053
6079
|
persisted=persisted or self._match_text_seq("PERSISTED"),
|
|
6080
|
+
data_type=exp.Var(this="AUTO")
|
|
6081
|
+
if self._match_text_seq("AUTO")
|
|
6082
|
+
else self._parse_types(),
|
|
6054
6083
|
not_null=self._match_pair(TokenType.NOT, TokenType.NULL),
|
|
6055
6084
|
)
|
|
6056
6085
|
constraints.append(self.expression(exp.ColumnConstraint, kind=constraint_kind))
|
|
@@ -7246,7 +7275,7 @@ class Parser(metaclass=_Parser):
|
|
|
7246
7275
|
return self._parse_primary() or self._parse_var(any_token=True)
|
|
7247
7276
|
|
|
7248
7277
|
def _parse_null(self) -> t.Optional[exp.Expression]:
|
|
7249
|
-
if self._match_set(
|
|
7278
|
+
if self._match_set((TokenType.NULL, TokenType.UNKNOWN)):
|
|
7250
7279
|
return self.PRIMARY_PARSERS[TokenType.NULL](self, self._prev)
|
|
7251
7280
|
return self._parse_placeholder()
|
|
7252
7281
|
|
|
@@ -7280,7 +7309,7 @@ class Parser(metaclass=_Parser):
|
|
|
7280
7309
|
if self._match(TokenType.L_PAREN, advance=False):
|
|
7281
7310
|
return self._parse_wrapped_csv(self._parse_expression)
|
|
7282
7311
|
|
|
7283
|
-
expression = self.
|
|
7312
|
+
expression = self._parse_alias(self._parse_assignment(), explicit=True)
|
|
7284
7313
|
return [expression] if expression else None
|
|
7285
7314
|
|
|
7286
7315
|
def _parse_csv(
|
|
@@ -8370,6 +8399,13 @@ class Parser(metaclass=_Parser):
|
|
|
8370
8399
|
kind = self._match(TokenType.FROM) or not self._match_text_seq("TO")
|
|
8371
8400
|
|
|
8372
8401
|
files = self._parse_csv(self._parse_file_location)
|
|
8402
|
+
if self._match(TokenType.EQ, advance=False):
|
|
8403
|
+
# Backtrack one token since we've consumed the lhs of a parameter assignment here.
|
|
8404
|
+
# This can happen for Snowflake dialect. Instead, we'd like to parse the parameter
|
|
8405
|
+
# list via `_parse_wrapped(..)` below.
|
|
8406
|
+
self._advance(-1)
|
|
8407
|
+
files = []
|
|
8408
|
+
|
|
8373
8409
|
credentials = self._parse_credentials()
|
|
8374
8410
|
|
|
8375
8411
|
self._match_text_seq("WITH")
|
sqlglot/serde.py
CHANGED
|
@@ -4,65 +4,123 @@ import typing as t
|
|
|
4
4
|
|
|
5
5
|
from sqlglot import expressions as exp
|
|
6
6
|
|
|
7
|
-
if t.TYPE_CHECKING:
|
|
8
|
-
JSON = t.Union[dict, list, str, float, int, bool, None]
|
|
9
|
-
Node = t.Union[t.List["Node"], exp.DataType.Type, exp.Expression, JSON]
|
|
10
7
|
|
|
8
|
+
INDEX = "i"
|
|
9
|
+
ARG_KEY = "k"
|
|
10
|
+
IS_ARRAY = "a"
|
|
11
|
+
CLASS = "c"
|
|
12
|
+
TYPE = "t"
|
|
13
|
+
COMMENTS = "o"
|
|
14
|
+
META = "m"
|
|
15
|
+
VALUE = "v"
|
|
16
|
+
DATA_TYPE = "DataType.Type"
|
|
11
17
|
|
|
12
|
-
|
|
18
|
+
|
|
19
|
+
def dump(expression: exp.Expression) -> t.List[t.Dict[str, t.Any]]:
|
|
13
20
|
"""
|
|
14
|
-
|
|
21
|
+
Dump an Expression into a JSON serializable List.
|
|
15
22
|
"""
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
i = 0
|
|
24
|
+
payloads = []
|
|
25
|
+
stack: t.List[t.Tuple[t.Any, t.Optional[int], t.Optional[str], bool]] = [
|
|
26
|
+
(expression, None, None, False)
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
while stack:
|
|
30
|
+
node, index, arg_key, is_array = stack.pop()
|
|
31
|
+
|
|
32
|
+
payload: t.Dict[str, t.Any] = {}
|
|
33
|
+
|
|
34
|
+
if index is not None:
|
|
35
|
+
payload[INDEX] = index
|
|
36
|
+
if arg_key is not None:
|
|
37
|
+
payload[ARG_KEY] = arg_key
|
|
38
|
+
if is_array:
|
|
39
|
+
payload[IS_ARRAY] = is_array
|
|
40
|
+
|
|
41
|
+
payloads.append(payload)
|
|
42
|
+
|
|
43
|
+
if hasattr(node, "parent"):
|
|
44
|
+
klass = node.__class__.__qualname__
|
|
45
|
+
|
|
46
|
+
if node.__class__.__module__ != exp.__name__:
|
|
47
|
+
klass = f"{node.__module__}.{klass}"
|
|
48
|
+
|
|
49
|
+
payload[CLASS] = klass
|
|
50
|
+
|
|
51
|
+
if node.type:
|
|
52
|
+
payload[TYPE] = dump(node.type)
|
|
53
|
+
if node.comments:
|
|
54
|
+
payload[COMMENTS] = node.comments
|
|
55
|
+
if node._meta is not None:
|
|
56
|
+
payload[META] = node._meta
|
|
57
|
+
if node.args:
|
|
58
|
+
for k, vs in reversed(node.args.items()):
|
|
59
|
+
if type(vs) is list:
|
|
60
|
+
for v in reversed(vs):
|
|
61
|
+
stack.append((v, i, k, True))
|
|
62
|
+
elif vs is not None:
|
|
63
|
+
stack.append((vs, i, k, False))
|
|
64
|
+
elif type(node) is exp.DataType.Type:
|
|
65
|
+
payload[CLASS] = DATA_TYPE
|
|
66
|
+
payload[VALUE] = node.value
|
|
67
|
+
else:
|
|
68
|
+
payload[VALUE] = node
|
|
69
|
+
|
|
70
|
+
i += 1
|
|
71
|
+
|
|
72
|
+
return payloads
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@t.overload
|
|
76
|
+
def load(payloads: None) -> None: ...
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@t.overload
|
|
80
|
+
def load(payloads: t.List[t.Dict[str, t.Any]]) -> exp.Expression: ...
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def load(payloads):
|
|
43
84
|
"""
|
|
44
|
-
|
|
85
|
+
Load a list of dicts generated by dump into an Expression.
|
|
45
86
|
"""
|
|
46
|
-
if isinstance(obj, list):
|
|
47
|
-
return [load(i) for i in obj]
|
|
48
|
-
if isinstance(obj, dict):
|
|
49
|
-
class_name = obj["class"]
|
|
50
87
|
|
|
51
|
-
|
|
52
|
-
|
|
88
|
+
if not payloads:
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
payload, *tail = payloads
|
|
92
|
+
root = _load(payload)
|
|
93
|
+
nodes = [root]
|
|
94
|
+
for payload in tail:
|
|
95
|
+
node = _load(payload)
|
|
96
|
+
nodes.append(node)
|
|
97
|
+
parent = nodes[payload[INDEX]]
|
|
98
|
+
arg_key = payload[ARG_KEY]
|
|
53
99
|
|
|
54
|
-
if
|
|
55
|
-
|
|
56
|
-
module = __import__(module_path, fromlist=[class_name])
|
|
100
|
+
if payload.get(IS_ARRAY):
|
|
101
|
+
parent.append(arg_key, node)
|
|
57
102
|
else:
|
|
58
|
-
|
|
103
|
+
parent.set(arg_key, node)
|
|
104
|
+
|
|
105
|
+
return root
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _load(payload: t.Dict[str, t.Any]) -> exp.Expression | exp.DataType.Type:
|
|
109
|
+
class_name = payload.get(CLASS)
|
|
59
110
|
|
|
60
|
-
|
|
111
|
+
if not class_name:
|
|
112
|
+
return payload[VALUE]
|
|
113
|
+
if class_name == DATA_TYPE:
|
|
114
|
+
return exp.DataType.Type(payload[VALUE])
|
|
61
115
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
116
|
+
if "." in class_name:
|
|
117
|
+
module_path, class_name = class_name.rsplit(".", maxsplit=1)
|
|
118
|
+
module = __import__(module_path, fromlist=[class_name])
|
|
119
|
+
else:
|
|
120
|
+
module = exp
|
|
66
121
|
|
|
67
|
-
|
|
68
|
-
|
|
122
|
+
expression = getattr(module, class_name)()
|
|
123
|
+
expression.type = load(payload.get(TYPE))
|
|
124
|
+
expression.comments = payload.get(COMMENTS)
|
|
125
|
+
expression._meta = payload.get(META)
|
|
126
|
+
return expression
|
sqlglot/tokens.py
CHANGED
|
@@ -85,6 +85,9 @@ class TokenType(AutoName):
|
|
|
85
85
|
DAMP = auto()
|
|
86
86
|
XOR = auto()
|
|
87
87
|
DSTAR = auto()
|
|
88
|
+
QMARK_AMP = auto()
|
|
89
|
+
QMARK_PIPE = auto()
|
|
90
|
+
HASH_DASH = auto()
|
|
88
91
|
|
|
89
92
|
URI_START = auto()
|
|
90
93
|
|
|
@@ -395,6 +398,7 @@ class TokenType(AutoName):
|
|
|
395
398
|
SIMILAR_TO = auto()
|
|
396
399
|
SOME = auto()
|
|
397
400
|
SORT_BY = auto()
|
|
401
|
+
SOUNDS_LIKE = auto()
|
|
398
402
|
START_WITH = auto()
|
|
399
403
|
STORAGE_INTEGRATION = auto()
|
|
400
404
|
STRAIGHT_JOIN = auto()
|
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
sqlglot/__init__.py,sha256=za08rtdPh2v7dOpGdNomttlIVGgTrKja7rPd6sQwaTg,5391
|
|
2
2
|
sqlglot/__main__.py,sha256=022c173KqxsiABWTEpUIq_tJUxuNiW7a7ABsxBXqvu8,2069
|
|
3
3
|
sqlglot/_typing.py,sha256=-1HPyr3w5COlSJWqlgt8jhFk2dyMvBuvVBqIX1wyVCM,642
|
|
4
|
-
sqlglot/_version.py,sha256=
|
|
4
|
+
sqlglot/_version.py,sha256=KVLKBMiChkTVkTm8LDtrlmQe6kAjOFYgfWf9NfPngWM,708
|
|
5
5
|
sqlglot/diff.py,sha256=PtOllQMQa1Sw1-V2Y8eypmDqGujXYPaTOp_WLsWkAWk,17314
|
|
6
6
|
sqlglot/errors.py,sha256=QNKMr-pzLUDR-tuMmn_GK6iMHUIVdb_YSJ_BhGEvuso,2126
|
|
7
|
-
sqlglot/expressions.py,sha256=
|
|
8
|
-
sqlglot/generator.py,sha256=
|
|
7
|
+
sqlglot/expressions.py,sha256=P9Da86Bo1Ufv1oZFs3ESJ1WDlc6tjvr-qz5BAd8_ek8,255449
|
|
8
|
+
sqlglot/generator.py,sha256=m4UHZpDrh52RZzv_iBqMnhv_j4DmhtpY1CtVyiGIJ8k,225187
|
|
9
9
|
sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
|
|
10
10
|
sqlglot/jsonpath.py,sha256=SQgaxzaEYBN7At9dkTK4N1Spk6xHxvHL6QtCIP6iM30,7905
|
|
11
11
|
sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
|
|
12
|
-
sqlglot/parser.py,sha256=
|
|
12
|
+
sqlglot/parser.py,sha256=woN7sh4ol7HcMNXzDIQbeuMnvHQ337MiNQPk-5lxZPY,335079
|
|
13
13
|
sqlglot/planner.py,sha256=ql7Li-bWJRcyXzNaZy_n6bQ6B2ZfunEIB8Ztv2xaxq4,14634
|
|
14
14
|
sqlglot/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
sqlglot/schema.py,sha256=13H2qKQs27EKdTpDLOvcNnSTDAUbYNKjWtJs4aQCSOA,20509
|
|
16
|
-
sqlglot/serde.py,sha256=
|
|
16
|
+
sqlglot/serde.py,sha256=nWpBFUjwZh06Li4qBuNb0YRU_QyflzSVyWkFxujM0WM,3175
|
|
17
17
|
sqlglot/time.py,sha256=Q62gv6kL40OiRBF6BMESxKJcMVn7ZLNw7sv8H34z5FI,18400
|
|
18
|
-
sqlglot/tokens.py,sha256=
|
|
18
|
+
sqlglot/tokens.py,sha256=fHH_44_p4-AH9o0scLPkF6bqKT-Tyc-Fk_ba-Gvp5-E,49171
|
|
19
19
|
sqlglot/transforms.py,sha256=utNDsCBsA7hPUK3-aby3DDgiY_XVMAKQqeoLm1EyihI,41218
|
|
20
20
|
sqlglot/trie.py,sha256=v27uXMrHfqrXlJ6GmeTSMovsB_3o0ctnlKhdNt7W6fI,2245
|
|
21
21
|
sqlglot/dialects/__init__.py,sha256=e3K2NHrZO7oXfBzEpRsvgWAgJ_UCEyg7SlUCRqvnPj4,3799
|
|
22
22
|
sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
|
|
23
|
-
sqlglot/dialects/bigquery.py,sha256=
|
|
24
|
-
sqlglot/dialects/clickhouse.py,sha256=
|
|
23
|
+
sqlglot/dialects/bigquery.py,sha256=9Q-oCXcpa2vrT2eMgVGHWwEvECMm4RQeV1XkjJj0nPA,72483
|
|
24
|
+
sqlglot/dialects/clickhouse.py,sha256=OzcDAS7pWs889gu0aLYn_HIjTLiPRjGFG61p6-84stE,58574
|
|
25
25
|
sqlglot/dialects/databricks.py,sha256=H4QTq7gg6tJylKc_YWsGp6049KydoI_wlQUHM7iCJtI,4753
|
|
26
|
-
sqlglot/dialects/dialect.py,sha256=
|
|
26
|
+
sqlglot/dialects/dialect.py,sha256=BU4-x1d8tRCSAfdpeP5b86me0wXfgpcEPdyk27wLgg4,73293
|
|
27
27
|
sqlglot/dialects/doris.py,sha256=CFnF955Oav3IjZWA80ickOI8tPpCjxk7BN5R4Z6pA1U,25263
|
|
28
28
|
sqlglot/dialects/dremio.py,sha256=nOMxu_4xVKSOmMGNSwdxXSPc243cNbbpb-xXzYdgdeg,8460
|
|
29
29
|
sqlglot/dialects/drill.py,sha256=FOh7_KjPx_77pv0DiHKZog0CcmzqeF9_PEmGnJ1ESSM,5825
|
|
30
30
|
sqlglot/dialects/druid.py,sha256=kh3snZtneehNOWqs3XcPjsrhNaRbkCQ8E4hHbWJ1fHM,690
|
|
31
|
-
sqlglot/dialects/duckdb.py,sha256=
|
|
31
|
+
sqlglot/dialects/duckdb.py,sha256=ZVXloJqjz_LiMFJ80v14P01hAwerje5NT2FeQdzAaqc,53023
|
|
32
32
|
sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
|
|
33
33
|
sqlglot/dialects/exasol.py,sha256=ay3g_VyT5WvHTgNyJuCQu0nBt4bpllLZ9IdMBizEgYM,15761
|
|
34
|
-
sqlglot/dialects/fabric.py,sha256=
|
|
35
|
-
sqlglot/dialects/hive.py,sha256=
|
|
34
|
+
sqlglot/dialects/fabric.py,sha256=BdkvzM8s-m5DIdBwdjEYskp32ub7aHCAex_xlhQn92I,10222
|
|
35
|
+
sqlglot/dialects/hive.py,sha256=UGIkXjMCk5a9ndUXQtvfG560oi3emdpqOYLQCmGabBk,32046
|
|
36
36
|
sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
|
|
37
|
-
sqlglot/dialects/mysql.py,sha256=
|
|
37
|
+
sqlglot/dialects/mysql.py,sha256=0s7RIpWPCaBYvxgR8Z6JWPub1BHBB_0Th7KHCIXVfms,49702
|
|
38
38
|
sqlglot/dialects/oracle.py,sha256=zWPCpzGiTlgCJ5E6FjfX3Rszjcw4SnHg6xeVboMYIyo,15972
|
|
39
|
-
sqlglot/dialects/postgres.py,sha256=
|
|
39
|
+
sqlglot/dialects/postgres.py,sha256=KcvDIfl99EqOZ7nQ1Ey1IqcQMkAuXiN4SJqyvo95c2g,34674
|
|
40
40
|
sqlglot/dialects/presto.py,sha256=XVeYr2NP86x5enlRqI7MYR6le85_ucYg_BBRocGN3jM,33413
|
|
41
41
|
sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
|
|
42
|
-
sqlglot/dialects/redshift.py,sha256=
|
|
42
|
+
sqlglot/dialects/redshift.py,sha256=FIwtP3yEg-way9pa32kxCJc6IaFkHVIvgYKZA-Ilmi0,15919
|
|
43
43
|
sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
|
|
44
|
-
sqlglot/dialects/singlestore.py,sha256=
|
|
45
|
-
sqlglot/dialects/snowflake.py,sha256=
|
|
44
|
+
sqlglot/dialects/singlestore.py,sha256=0QqNYOucNklPQuyeGcsisLI97qPGx_RfWKOFarJz2qw,61711
|
|
45
|
+
sqlglot/dialects/snowflake.py,sha256=tgUJ77_Ntm1QcCbwlvI-j0_R96s0l6zFUUqysHIEez8,75351
|
|
46
46
|
sqlglot/dialects/spark.py,sha256=PzyhkelDzbCMgJ3RVHD6yyzLIFp9NdZfwVas5IymowM,10147
|
|
47
47
|
sqlglot/dialects/spark2.py,sha256=qz36FT9k4iuiqboRpyG4VpKGkPR0P2fifmqgZ9gNUEU,14851
|
|
48
|
-
sqlglot/dialects/sqlite.py,sha256=
|
|
48
|
+
sqlglot/dialects/sqlite.py,sha256=zzXEbnaLjJeg6hPLHricjpfSkuf8tpXECnjcHtoqIbw,13263
|
|
49
49
|
sqlglot/dialects/starrocks.py,sha256=2gav0PSNgRdAGXzawdznZliBpglJoQ0wBxPI7ZIMsRw,11314
|
|
50
50
|
sqlglot/dialects/tableau.py,sha256=oIawDzUITxGCWaEMB8OaNMPWhbC3U-2y09pYPm4eazc,2190
|
|
51
51
|
sqlglot/dialects/teradata.py,sha256=7LxCcRwP0Idd_OnCzA57NCdheVjHcKC2aFAKG5N49IU,18202
|
|
52
52
|
sqlglot/dialects/trino.py,sha256=Z7prRhCxIBh0KCxIQpWmVOIGHCJM9Xl5oRlqySxln4Y,4350
|
|
53
|
-
sqlglot/dialects/tsql.py,sha256=
|
|
53
|
+
sqlglot/dialects/tsql.py,sha256=7pVL3H-qNLCnoHqBEVSIVKhlTqoPmiYBRtg_HVv8zH4,54462
|
|
54
54
|
sqlglot/executor/__init__.py,sha256=FslewzYQtQdDNg_0Ju2UaiP4vo4IMUgkfkmFsYUhcN0,2958
|
|
55
55
|
sqlglot/executor/context.py,sha256=WJHJdYQCOeVXwLw0uSSrWSc25eBMn5Ix108RCvdsKRQ,3386
|
|
56
56
|
sqlglot/executor/env.py,sha256=tQhU5PpTBMcxgZIFddFqxWMNPtHN0vOOz72voncY3KY,8276
|
|
57
57
|
sqlglot/executor/python.py,sha256=09GYRzrPn3lZGfDJY9pbONOvmYxsRyeSWjUiqkSRHGo,16661
|
|
58
58
|
sqlglot/executor/table.py,sha256=xkuJlgLVNYUXsSUaX0zTcnFekldXLLU8LqDyjR5K9wY,4419
|
|
59
59
|
sqlglot/optimizer/__init__.py,sha256=FdAvVz6rQLLkiiH21-SD4RxB5zS3WDeU-s03PZkJ-F4,343
|
|
60
|
-
sqlglot/optimizer/annotate_types.py,sha256=
|
|
60
|
+
sqlglot/optimizer/annotate_types.py,sha256=E3oqbGWD7Lb8DhGakLG8R_be8MIaBWTBXLk0RxCQFro,26400
|
|
61
61
|
sqlglot/optimizer/canonicalize.py,sha256=RJpUbWDudjknRMtO_Kf8MGZ5Hv1twpPWac2u5kpV4Vw,7719
|
|
62
62
|
sqlglot/optimizer/eliminate_ctes.py,sha256=fUBM0RUnPrm2sYptEWBux98B7fcx7W-BM1zVqfgDz9c,1448
|
|
63
63
|
sqlglot/optimizer/eliminate_joins.py,sha256=2iYtG93aJGxvURqm1BVPosrnnnQ_IXI14RcD4pM8eHc,5942
|
|
@@ -71,13 +71,13 @@ sqlglot/optimizer/optimizer.py,sha256=vXEXDWHvbO-vJmSI7UqJuydM2WrD1xko7rETq2EtVJ
|
|
|
71
71
|
sqlglot/optimizer/pushdown_predicates.py,sha256=HGjs3Z4V3-X2d1VTfWhyByY3aL5SmKnVvt3aDXiiBM0,8414
|
|
72
72
|
sqlglot/optimizer/pushdown_projections.py,sha256=7NoK5NAUVYVhs0YnYyo6WuXfaO-BShSwS6lA8Y-ATQ4,6668
|
|
73
73
|
sqlglot/optimizer/qualify.py,sha256=oAPfwub7dEkrlCrsptcJWpLya4BgKhN6M5SwIs_86LY,4002
|
|
74
|
-
sqlglot/optimizer/qualify_columns.py,sha256=
|
|
74
|
+
sqlglot/optimizer/qualify_columns.py,sha256=7aabZhD-dKNiwIW_ZjOEr0RPbWfhSbuR-WI6NnVCZAA,45298
|
|
75
75
|
sqlglot/optimizer/qualify_tables.py,sha256=dA4ZazL7ShQh2JgBwpHuG-4c5lBw1TNzCnuN7m0iVTA,6645
|
|
76
76
|
sqlglot/optimizer/scope.py,sha256=UOTrbwqcTc5iRQf0WStgYWXpE24w6riZy-tJYA18yTw,31229
|
|
77
77
|
sqlglot/optimizer/simplify.py,sha256=-_yus42OYwqjQ9a2TSGhtG2G0pSkInUry1z7hEMz2pY,51062
|
|
78
78
|
sqlglot/optimizer/unnest_subqueries.py,sha256=kzWUVDlxs8z9nmRx-8U-pHXPtVZhEIwkKqmKhr2QLvc,10908
|
|
79
|
-
sqlglot-27.
|
|
80
|
-
sqlglot-27.
|
|
81
|
-
sqlglot-27.
|
|
82
|
-
sqlglot-27.
|
|
83
|
-
sqlglot-27.
|
|
79
|
+
sqlglot-27.15.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
|
|
80
|
+
sqlglot-27.15.0.dist-info/METADATA,sha256=8y7rLoqBMae_bNKyR6wVJnGJNlO-UTAVbDbvaHBzZgc,20682
|
|
81
|
+
sqlglot-27.15.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
82
|
+
sqlglot-27.15.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
|
|
83
|
+
sqlglot-27.15.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|