sqlglot 27.4.1__py3-none-any.whl → 27.5.1__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/duckdb.py +1 -0
- sqlglot/dialects/exasol.py +44 -3
- sqlglot/dialects/materialize.py +1 -0
- sqlglot/dialects/oracle.py +0 -4
- sqlglot/dialects/postgres.py +0 -2
- sqlglot/dialects/redshift.py +1 -0
- sqlglot/dialects/risingwave.py +1 -0
- sqlglot/dialects/singlestore.py +1141 -0
- sqlglot/dialects/snowflake.py +0 -8
- sqlglot/expressions.py +7 -11
- sqlglot/generator.py +37 -10
- sqlglot/optimizer/eliminate_joins.py +3 -0
- sqlglot/optimizer/scope.py +6 -0
- sqlglot/parser.py +24 -8
- sqlglot/tokens.py +5 -2
- sqlglot/transforms.py +1 -1
- {sqlglot-27.4.1.dist-info → sqlglot-27.5.1.dist-info}/METADATA +1 -24
- {sqlglot-27.4.1.dist-info → sqlglot-27.5.1.dist-info}/RECORD +22 -22
- {sqlglot-27.4.1.dist-info → sqlglot-27.5.1.dist-info}/licenses/LICENSE +1 -1
- {sqlglot-27.4.1.dist-info → sqlglot-27.5.1.dist-info}/WHEEL +0 -0
- {sqlglot-27.4.1.dist-info → sqlglot-27.5.1.dist-info}/top_level.txt +0 -0
sqlglot/dialects/snowflake.py
CHANGED
|
@@ -655,12 +655,6 @@ class Snowflake(Dialect):
|
|
|
655
655
|
|
|
656
656
|
TIMESTAMPS = parser.Parser.TIMESTAMPS - {TokenType.TIME}
|
|
657
657
|
|
|
658
|
-
RANGE_PARSERS = {
|
|
659
|
-
**parser.Parser.RANGE_PARSERS,
|
|
660
|
-
TokenType.LIKE_ANY: parser.binary_range_parser(exp.LikeAny),
|
|
661
|
-
TokenType.ILIKE_ANY: parser.binary_range_parser(exp.ILikeAny),
|
|
662
|
-
}
|
|
663
|
-
|
|
664
658
|
ALTER_PARSERS = {
|
|
665
659
|
**parser.Parser.ALTER_PARSERS,
|
|
666
660
|
"UNSET": lambda self: self.expression(
|
|
@@ -1133,8 +1127,6 @@ class Snowflake(Dialect):
|
|
|
1133
1127
|
"EXCLUDE": TokenType.EXCEPT,
|
|
1134
1128
|
"FILE FORMAT": TokenType.FILE_FORMAT,
|
|
1135
1129
|
"GET": TokenType.GET,
|
|
1136
|
-
"ILIKE ANY": TokenType.ILIKE_ANY,
|
|
1137
|
-
"LIKE ANY": TokenType.LIKE_ANY,
|
|
1138
1130
|
"MATCH_CONDITION": TokenType.MATCH_CONDITION,
|
|
1139
1131
|
"MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE,
|
|
1140
1132
|
"MINUS": TokenType.EXCEPT,
|
sqlglot/expressions.py
CHANGED
|
@@ -940,15 +940,18 @@ class Expression(metaclass=_Expression):
|
|
|
940
940
|
low: t.Any,
|
|
941
941
|
high: t.Any,
|
|
942
942
|
copy: bool = True,
|
|
943
|
-
symmetric: t.Optional[bool] =
|
|
943
|
+
symmetric: t.Optional[bool] = None,
|
|
944
944
|
**opts,
|
|
945
945
|
) -> Between:
|
|
946
|
-
|
|
946
|
+
between = Between(
|
|
947
947
|
this=maybe_copy(self, copy),
|
|
948
948
|
low=convert(low, copy=copy, **opts),
|
|
949
949
|
high=convert(high, copy=copy, **opts),
|
|
950
|
-
symmetric=symmetric,
|
|
951
950
|
)
|
|
951
|
+
if symmetric is not None:
|
|
952
|
+
between.set("symmetric", symmetric)
|
|
953
|
+
|
|
954
|
+
return between
|
|
952
955
|
|
|
953
956
|
def is_(self, other: ExpOrStr) -> Is:
|
|
954
957
|
return self._binop(Is, other)
|
|
@@ -4546,6 +4549,7 @@ class DataType(Expression):
|
|
|
4546
4549
|
FIXEDSTRING = auto()
|
|
4547
4550
|
FLOAT = auto()
|
|
4548
4551
|
GEOGRAPHY = auto()
|
|
4552
|
+
GEOGRAPHYPOINT = auto()
|
|
4549
4553
|
GEOMETRY = auto()
|
|
4550
4554
|
POINT = auto()
|
|
4551
4555
|
RING = auto()
|
|
@@ -5093,10 +5097,6 @@ class ILike(Binary, Predicate):
|
|
|
5093
5097
|
pass
|
|
5094
5098
|
|
|
5095
5099
|
|
|
5096
|
-
class ILikeAny(Binary, Predicate):
|
|
5097
|
-
pass
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
5100
|
class IntDiv(Binary):
|
|
5101
5101
|
pass
|
|
5102
5102
|
|
|
@@ -5113,10 +5113,6 @@ class Like(Binary, Predicate):
|
|
|
5113
5113
|
pass
|
|
5114
5114
|
|
|
5115
5115
|
|
|
5116
|
-
class LikeAny(Binary, Predicate):
|
|
5117
|
-
pass
|
|
5118
|
-
|
|
5119
|
-
|
|
5120
5116
|
class LT(Binary, Predicate):
|
|
5121
5117
|
pass
|
|
5122
5118
|
|
sqlglot/generator.py
CHANGED
|
@@ -491,6 +491,9 @@ class Generator(metaclass=_Generator):
|
|
|
491
491
|
# Whether SYMMETRIC and ASYMMETRIC flags are supported with BETWEEN expression
|
|
492
492
|
SUPPORTS_BETWEEN_FLAGS = False
|
|
493
493
|
|
|
494
|
+
# Whether LIKE and ILIKE support quantifiers such as LIKE ANY/ALL/SOME
|
|
495
|
+
SUPPORTS_LIKE_QUANTIFIERS = True
|
|
496
|
+
|
|
494
497
|
TYPE_MAPPING = {
|
|
495
498
|
exp.DataType.Type.DATETIME2: "TIMESTAMP",
|
|
496
499
|
exp.DataType.Type.NCHAR: "CHAR",
|
|
@@ -2898,7 +2901,10 @@ class Generator(metaclass=_Generator):
|
|
|
2898
2901
|
return f"{self.sql(expression, 'this')}[{expressions_sql}]"
|
|
2899
2902
|
|
|
2900
2903
|
def all_sql(self, expression: exp.All) -> str:
|
|
2901
|
-
|
|
2904
|
+
this = self.sql(expression, "this")
|
|
2905
|
+
if not isinstance(expression.this, (exp.Tuple, exp.Paren)):
|
|
2906
|
+
this = self.wrap(this)
|
|
2907
|
+
return f"ALL {this}"
|
|
2902
2908
|
|
|
2903
2909
|
def any_sql(self, expression: exp.Any) -> str:
|
|
2904
2910
|
this = self.sql(expression, "this")
|
|
@@ -3648,12 +3654,6 @@ class Generator(metaclass=_Generator):
|
|
|
3648
3654
|
def gte_sql(self, expression: exp.GTE) -> str:
|
|
3649
3655
|
return self.binary(expression, ">=")
|
|
3650
3656
|
|
|
3651
|
-
def ilike_sql(self, expression: exp.ILike) -> str:
|
|
3652
|
-
return self.binary(expression, "ILIKE")
|
|
3653
|
-
|
|
3654
|
-
def ilikeany_sql(self, expression: exp.ILikeAny) -> str:
|
|
3655
|
-
return self.binary(expression, "ILIKE ANY")
|
|
3656
|
-
|
|
3657
3657
|
def is_sql(self, expression: exp.Is) -> str:
|
|
3658
3658
|
if not self.IS_BOOL_ALLOWED and isinstance(expression.expression, exp.Boolean):
|
|
3659
3659
|
return self.sql(
|
|
@@ -3661,11 +3661,38 @@ class Generator(metaclass=_Generator):
|
|
|
3661
3661
|
)
|
|
3662
3662
|
return self.binary(expression, "IS")
|
|
3663
3663
|
|
|
3664
|
+
def _like_sql(self, expression: exp.Like | exp.ILike) -> str:
|
|
3665
|
+
this = expression.this
|
|
3666
|
+
rhs = expression.expression
|
|
3667
|
+
|
|
3668
|
+
if isinstance(expression, exp.Like):
|
|
3669
|
+
exp_class: t.Type[exp.Like | exp.ILike] = exp.Like
|
|
3670
|
+
op = "LIKE"
|
|
3671
|
+
else:
|
|
3672
|
+
exp_class = exp.ILike
|
|
3673
|
+
op = "ILIKE"
|
|
3674
|
+
|
|
3675
|
+
if isinstance(rhs, (exp.All, exp.Any)) and not self.SUPPORTS_LIKE_QUANTIFIERS:
|
|
3676
|
+
exprs = rhs.this.unnest()
|
|
3677
|
+
|
|
3678
|
+
if isinstance(exprs, exp.Tuple):
|
|
3679
|
+
exprs = exprs.expressions
|
|
3680
|
+
|
|
3681
|
+
connective = exp.or_ if isinstance(rhs, exp.Any) else exp.and_
|
|
3682
|
+
|
|
3683
|
+
like_expr: exp.Expression = exp_class(this=this, expression=exprs[0])
|
|
3684
|
+
for expr in exprs[1:]:
|
|
3685
|
+
like_expr = connective(like_expr, exp_class(this=this, expression=expr))
|
|
3686
|
+
|
|
3687
|
+
return self.sql(like_expr)
|
|
3688
|
+
|
|
3689
|
+
return self.binary(expression, op)
|
|
3690
|
+
|
|
3664
3691
|
def like_sql(self, expression: exp.Like) -> str:
|
|
3665
|
-
return self.
|
|
3692
|
+
return self._like_sql(expression)
|
|
3666
3693
|
|
|
3667
|
-
def
|
|
3668
|
-
return self.
|
|
3694
|
+
def ilike_sql(self, expression: exp.ILike) -> str:
|
|
3695
|
+
return self._like_sql(expression)
|
|
3669
3696
|
|
|
3670
3697
|
def similarto_sql(self, expression: exp.SimilarTo) -> str:
|
|
3671
3698
|
return self.binary(expression, "SIMILAR TO")
|
|
@@ -32,6 +32,9 @@ def eliminate_joins(expression):
|
|
|
32
32
|
|
|
33
33
|
# Reverse the joins so we can remove chains of unused joins
|
|
34
34
|
for join in reversed(joins):
|
|
35
|
+
if join.is_semi_or_anti_join:
|
|
36
|
+
continue
|
|
37
|
+
|
|
35
38
|
alias = join.alias_or_name
|
|
36
39
|
if _should_eliminate_join(scope, join, alias):
|
|
37
40
|
join.pop()
|
sqlglot/optimizer/scope.py
CHANGED
|
@@ -523,6 +523,12 @@ class Scope:
|
|
|
523
523
|
for _, source in scope.selected_sources.values():
|
|
524
524
|
scope_ref_count[id(source)] += 1
|
|
525
525
|
|
|
526
|
+
for name in scope._semi_anti_join_tables:
|
|
527
|
+
# semi/anti join sources are not actually selected but we still need to
|
|
528
|
+
# increment their ref count to avoid them being optimized away
|
|
529
|
+
if name in scope.sources:
|
|
530
|
+
scope_ref_count[id(scope.sources[name])] += 1
|
|
531
|
+
|
|
526
532
|
return scope_ref_count
|
|
527
533
|
|
|
528
534
|
|
sqlglot/parser.py
CHANGED
|
@@ -380,6 +380,7 @@ class Parser(metaclass=_Parser):
|
|
|
380
380
|
TokenType.BIGDECIMAL,
|
|
381
381
|
TokenType.UUID,
|
|
382
382
|
TokenType.GEOGRAPHY,
|
|
383
|
+
TokenType.GEOGRAPHYPOINT,
|
|
383
384
|
TokenType.GEOMETRY,
|
|
384
385
|
TokenType.POINT,
|
|
385
386
|
TokenType.RING,
|
|
@@ -1136,7 +1137,14 @@ class Parser(metaclass=_Parser):
|
|
|
1136
1137
|
"TRUNCATE": lambda self: self._parse_partitioned_by_bucket_or_truncate(),
|
|
1137
1138
|
}
|
|
1138
1139
|
|
|
1139
|
-
def _parse_partitioned_by_bucket_or_truncate(self) -> exp.Expression:
|
|
1140
|
+
def _parse_partitioned_by_bucket_or_truncate(self) -> t.Optional[exp.Expression]:
|
|
1141
|
+
if not self._match(TokenType.L_PAREN, advance=False):
|
|
1142
|
+
# Partitioning by bucket or truncate follows the syntax:
|
|
1143
|
+
# PARTITION BY (BUCKET(..) | TRUNCATE(..))
|
|
1144
|
+
# If we don't have parenthesis after each keyword, we should instead parse this as an identifier
|
|
1145
|
+
self._retreat(self._index - 1)
|
|
1146
|
+
return None
|
|
1147
|
+
|
|
1140
1148
|
klass = (
|
|
1141
1149
|
exp.PartitionedByBucket
|
|
1142
1150
|
if self._prev.text.upper() == "BUCKET"
|
|
@@ -5767,6 +5775,7 @@ class Parser(metaclass=_Parser):
|
|
|
5767
5775
|
return None
|
|
5768
5776
|
|
|
5769
5777
|
comments = self._curr.comments
|
|
5778
|
+
prev = self._prev
|
|
5770
5779
|
token = self._curr
|
|
5771
5780
|
token_type = self._curr.token_type
|
|
5772
5781
|
this = self._curr.text
|
|
@@ -5798,12 +5807,19 @@ class Parser(metaclass=_Parser):
|
|
|
5798
5807
|
else:
|
|
5799
5808
|
subquery_predicate = self.SUBQUERY_PREDICATES.get(token_type)
|
|
5800
5809
|
|
|
5801
|
-
if subquery_predicate
|
|
5802
|
-
|
|
5803
|
-
|
|
5804
|
-
|
|
5805
|
-
|
|
5806
|
-
|
|
5810
|
+
if subquery_predicate:
|
|
5811
|
+
expr = None
|
|
5812
|
+
if self._curr.token_type in (TokenType.SELECT, TokenType.WITH):
|
|
5813
|
+
expr = self._parse_select()
|
|
5814
|
+
self._match_r_paren()
|
|
5815
|
+
elif prev and prev.token_type in (TokenType.LIKE, TokenType.ILIKE):
|
|
5816
|
+
# Backtrack one token since we've consumed the L_PAREN here. Instead, we'd like
|
|
5817
|
+
# to parse "LIKE [ANY | ALL] (...)" as a whole into an exp.Tuple or exp.Paren
|
|
5818
|
+
self._advance(-1)
|
|
5819
|
+
expr = self._parse_bitwise()
|
|
5820
|
+
|
|
5821
|
+
if expr:
|
|
5822
|
+
return self.expression(subquery_predicate, comments=comments, this=expr)
|
|
5807
5823
|
|
|
5808
5824
|
if functions is None:
|
|
5809
5825
|
functions = self.FUNCTIONS
|
|
@@ -6194,7 +6210,7 @@ class Parser(metaclass=_Parser):
|
|
|
6194
6210
|
return self._parse_id_var(any_token=False)
|
|
6195
6211
|
|
|
6196
6212
|
def _parse_unique(self) -> exp.UniqueColumnConstraint:
|
|
6197
|
-
self.
|
|
6213
|
+
self._match_texts(("KEY", "INDEX"))
|
|
6198
6214
|
return self.expression(
|
|
6199
6215
|
exp.UniqueColumnConstraint,
|
|
6200
6216
|
nulls=self._match_text_seq("NULLS", "NOT", "DISTINCT"),
|
sqlglot/tokens.py
CHANGED
|
@@ -39,6 +39,8 @@ class TokenType(AutoName):
|
|
|
39
39
|
COLON = auto()
|
|
40
40
|
DOTCOLON = auto()
|
|
41
41
|
DCOLON = auto()
|
|
42
|
+
DCOLONDOLLAR = auto()
|
|
43
|
+
DCOLONPERCENT = auto()
|
|
42
44
|
DQMARK = auto()
|
|
43
45
|
SEMICOLON = auto()
|
|
44
46
|
STAR = auto()
|
|
@@ -53,6 +55,8 @@ class TokenType(AutoName):
|
|
|
53
55
|
NEQ = auto()
|
|
54
56
|
NULLSAFE_EQ = auto()
|
|
55
57
|
COLON_EQ = auto()
|
|
58
|
+
COLON_GT = auto()
|
|
59
|
+
NCOLON_GT = auto()
|
|
56
60
|
AND = auto()
|
|
57
61
|
OR = auto()
|
|
58
62
|
AMP = auto()
|
|
@@ -183,6 +187,7 @@ class TokenType(AutoName):
|
|
|
183
187
|
DATEMULTIRANGE = auto()
|
|
184
188
|
UUID = auto()
|
|
185
189
|
GEOGRAPHY = auto()
|
|
190
|
+
GEOGRAPHYPOINT = auto()
|
|
186
191
|
NULLABLE = auto()
|
|
187
192
|
GEOMETRY = auto()
|
|
188
193
|
POINT = auto()
|
|
@@ -301,7 +306,6 @@ class TokenType(AutoName):
|
|
|
301
306
|
HINT = auto()
|
|
302
307
|
IGNORE = auto()
|
|
303
308
|
ILIKE = auto()
|
|
304
|
-
ILIKE_ANY = auto()
|
|
305
309
|
IN = auto()
|
|
306
310
|
INDEX = auto()
|
|
307
311
|
INNER = auto()
|
|
@@ -322,7 +326,6 @@ class TokenType(AutoName):
|
|
|
322
326
|
LATERAL = auto()
|
|
323
327
|
LEFT = auto()
|
|
324
328
|
LIKE = auto()
|
|
325
|
-
LIKE_ANY = auto()
|
|
326
329
|
LIMIT = auto()
|
|
327
330
|
LIST = auto()
|
|
328
331
|
LOAD = auto()
|
sqlglot/transforms.py
CHANGED
|
@@ -990,7 +990,7 @@ def any_to_exists(expression: exp.Expression) -> exp.Expression:
|
|
|
990
990
|
if isinstance(expression, exp.Select):
|
|
991
991
|
for any_expr in expression.find_all(exp.Any):
|
|
992
992
|
this = any_expr.this
|
|
993
|
-
if isinstance(this, exp.Query):
|
|
993
|
+
if isinstance(this, exp.Query) or isinstance(any_expr.parent, (exp.Like, exp.ILike)):
|
|
994
994
|
continue
|
|
995
995
|
|
|
996
996
|
binop = any_expr.parent
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlglot
|
|
3
|
-
Version: 27.
|
|
3
|
+
Version: 27.5.1
|
|
4
4
|
Summary: An easily customizable SQL parser and transpiler
|
|
5
5
|
Author-email: Toby Mao <toby.mao@gmail.com>
|
|
6
|
-
License: MIT License
|
|
7
|
-
|
|
8
|
-
Copyright (c) 2023 Toby Mao
|
|
9
|
-
|
|
10
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
-
in the Software without restriction, including without limitation the rights
|
|
13
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
-
furnished to do so, subject to the following conditions:
|
|
16
|
-
|
|
17
|
-
The above copyright notice and this permission notice shall be included in all
|
|
18
|
-
copies or substantial portions of the Software.
|
|
19
|
-
|
|
20
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
-
SOFTWARE.
|
|
27
|
-
|
|
28
6
|
Project-URL: Homepage, https://sqlglot.com/
|
|
29
7
|
Project-URL: Documentation, https://sqlglot.com/sqlglot.html
|
|
30
8
|
Project-URL: Repository, https://github.com/tobymao/sqlglot
|
|
@@ -32,7 +10,6 @@ Project-URL: Issues, https://github.com/tobymao/sqlglot/issues
|
|
|
32
10
|
Classifier: Development Status :: 5 - Production/Stable
|
|
33
11
|
Classifier: Intended Audience :: Developers
|
|
34
12
|
Classifier: Intended Audience :: Science/Research
|
|
35
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
36
13
|
Classifier: Operating System :: OS Independent
|
|
37
14
|
Classifier: Programming Language :: SQL
|
|
38
15
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
@@ -1,22 +1,22 @@
|
|
|
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=lEPcd62DijGiIa_sz50zyHEi74AH-53vHCq2mbltrig,513
|
|
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=L8eo53HkSOsPisQIE-mAhiO3o52cgMXEG8XPAlft3Ck,246138
|
|
8
|
+
sqlglot/generator.py,sha256=HgUGW8vGaSTRIbGz9aCpK7uOcGlt7UdPWhcYqHZSB0w,217786
|
|
9
9
|
sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
|
|
10
10
|
sqlglot/jsonpath.py,sha256=jneO-A57n4ojVT2drCn2HBlx_Ka8wLcGpemW1JgvbjA,7666
|
|
11
11
|
sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
|
|
12
|
-
sqlglot/parser.py,sha256=
|
|
12
|
+
sqlglot/parser.py,sha256=IGRj3zKCRpKolV8srQvBOsQCF_iH27N2Lb3qpefJPg0,327777
|
|
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
16
|
sqlglot/serde.py,sha256=DQVJ95WrIvhYfe02Ytb4NQug2aMwDCEwpMBW1LKDqzE,2031
|
|
17
17
|
sqlglot/time.py,sha256=Q62gv6kL40OiRBF6BMESxKJcMVn7ZLNw7sv8H34z5FI,18400
|
|
18
|
-
sqlglot/tokens.py,sha256=
|
|
19
|
-
sqlglot/transforms.py,sha256=
|
|
18
|
+
sqlglot/tokens.py,sha256=ibw_XDjfMgX80ScCwXXrxKLyKCSmHWwZhxPkmKF7q3I,48937
|
|
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=BQUv9EuMmvhP_wVitGLo0PlCi15atvfXgvREpsTsxeQ,3799
|
|
22
22
|
sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
|
|
@@ -28,21 +28,21 @@ sqlglot/dialects/doris.py,sha256=g6KGYu01nUsvz_wjZkZbI0tiPg-ZUKyr7a-yGaw5Kec,198
|
|
|
28
28
|
sqlglot/dialects/dremio.py,sha256=FbBTri3KPD4oJMKV9Qdnh7_EgLJUZZB8iDzUlDE26h4,4077
|
|
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=X4nY2ZjUSGZZ3pCqUraGxIYXVA-gzB134qV0TeyMmqQ,51418
|
|
32
32
|
sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
|
|
33
|
-
sqlglot/dialects/exasol.py,sha256=
|
|
33
|
+
sqlglot/dialects/exasol.py,sha256=EMA9hBttHHnt0lIj0BN5_se8x-ve7TrKrhIfmbVkaaQ,11968
|
|
34
34
|
sqlglot/dialects/fabric.py,sha256=4Sng2ZhQSaf6eK3ituR9DqDZERaVwYS_UfdpusjsISg,10220
|
|
35
35
|
sqlglot/dialects/hive.py,sha256=bAZz0qnaOH9f5FyIMkqBu3XB2Cj7y-xnCPbxPsk8U9I,31959
|
|
36
|
-
sqlglot/dialects/materialize.py,sha256=
|
|
36
|
+
sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
|
|
37
37
|
sqlglot/dialects/mysql.py,sha256=J_88qeXxC_oD09yMiNgw_so3x2QlaqL5l7CRku1R6wo,49280
|
|
38
|
-
sqlglot/dialects/oracle.py,sha256=
|
|
39
|
-
sqlglot/dialects/postgres.py,sha256=
|
|
38
|
+
sqlglot/dialects/oracle.py,sha256=DpckKjR3FauVmXDIDaNTFqJE0KzXnW4sUlnZjQC8z0Y,15735
|
|
39
|
+
sqlglot/dialects/postgres.py,sha256=8QF9uEXXFAGCXQah1n8mv4fonF58o0n59Il66hOZYqI,33942
|
|
40
40
|
sqlglot/dialects/presto.py,sha256=Tm3Bx9AJilT1xlgunTpF0wUhIZBOPS-rB5Iwitnygxc,33462
|
|
41
41
|
sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
|
|
42
|
-
sqlglot/dialects/redshift.py,sha256=
|
|
43
|
-
sqlglot/dialects/risingwave.py,sha256=
|
|
44
|
-
sqlglot/dialects/singlestore.py,sha256=
|
|
45
|
-
sqlglot/dialects/snowflake.py,sha256=
|
|
42
|
+
sqlglot/dialects/redshift.py,sha256=MXI9W7CgKCtMNjNRPcZPxO8NBA9_PxZx14HB52o-aUc,15822
|
|
43
|
+
sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
|
|
44
|
+
sqlglot/dialects/singlestore.py,sha256=TyvnHVCfVRSFU5cXmNGUIQiOj7ma1dIT8_EeGZmEP3E,29237
|
|
45
|
+
sqlglot/dialects/snowflake.py,sha256=iIBtw6FFgkyksGXiNagirQ8rl1SFf_Vu5mtpEVh7sx0,70487
|
|
46
46
|
sqlglot/dialects/spark.py,sha256=hTumyd46Cc3HEl9KvlTla2eq_NKBI3w5Jis3FeMt_R8,8886
|
|
47
47
|
sqlglot/dialects/spark2.py,sha256=aCwPqLduLRSUSPtbI1VtBjydK6haKgEy3iahmueGRo4,14742
|
|
48
48
|
sqlglot/dialects/sqlite.py,sha256=XIDmiNTswWcrDwlFm8gOODCrJ_rPmXQKkm9U_-YAlVs,13183
|
|
@@ -60,7 +60,7 @@ sqlglot/optimizer/__init__.py,sha256=FdAvVz6rQLLkiiH21-SD4RxB5zS3WDeU-s03PZkJ-F4
|
|
|
60
60
|
sqlglot/optimizer/annotate_types.py,sha256=mEhUmD6CBZ1HIgYJMvfMTIivoB-6nKHiDAvoktobocM,25025
|
|
61
61
|
sqlglot/optimizer/canonicalize.py,sha256=RJpUbWDudjknRMtO_Kf8MGZ5Hv1twpPWac2u5kpV4Vw,7719
|
|
62
62
|
sqlglot/optimizer/eliminate_ctes.py,sha256=fUBM0RUnPrm2sYptEWBux98B7fcx7W-BM1zVqfgDz9c,1448
|
|
63
|
-
sqlglot/optimizer/eliminate_joins.py,sha256=
|
|
63
|
+
sqlglot/optimizer/eliminate_joins.py,sha256=2iYtG93aJGxvURqm1BVPosrnnnQ_IXI14RcD4pM8eHc,5942
|
|
64
64
|
sqlglot/optimizer/eliminate_subqueries.py,sha256=sAB_Pk94_n2n1PIaZ2Mc3M-n2TV-JmjjaomaY14u0Og,6292
|
|
65
65
|
sqlglot/optimizer/isolate_table_selects.py,sha256=_8rIKVMoL7eY3rrJsmgIdTRvfmBSLUxeHg42q1JW990,1464
|
|
66
66
|
sqlglot/optimizer/merge_subqueries.py,sha256=lg6Is78nUM2MbqbRjE6xapgErIO-5pteBE74Qh3z4Zk,15211
|
|
@@ -73,11 +73,11 @@ sqlglot/optimizer/pushdown_projections.py,sha256=7NoK5NAUVYVhs0YnYyo6WuXfaO-BShS
|
|
|
73
73
|
sqlglot/optimizer/qualify.py,sha256=oAPfwub7dEkrlCrsptcJWpLya4BgKhN6M5SwIs_86LY,4002
|
|
74
74
|
sqlglot/optimizer/qualify_columns.py,sha256=epPE7HjnJ1yQCmy_QTzsjze7uM79BNsvzBem3gx4L3Q,43275
|
|
75
75
|
sqlglot/optimizer/qualify_tables.py,sha256=rRo0rXMMDAloG_ut7nGPtIO3e__ooM2PqShxWECKQbo,6965
|
|
76
|
-
sqlglot/optimizer/scope.py,sha256=
|
|
76
|
+
sqlglot/optimizer/scope.py,sha256=T6iVYnYwubt-WB1BOFsFYdJ-D7WtWZGL37SuCRQK23s,31154
|
|
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.5.1.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
|
|
80
|
+
sqlglot-27.5.1.dist-info/METADATA,sha256=qGmWTwLA19LsBnKSh45sCcekBfpbQaHm4ql4xe9dA3I,19437
|
|
81
|
+
sqlglot-27.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
82
|
+
sqlglot-27.5.1.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
|
|
83
|
+
sqlglot-27.5.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|