sqlglot 27.15.1__py3-none-any.whl → 27.15.2__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 +29 -0
- sqlglot/dialects/snowflake.py +20 -1
- sqlglot/expressions.py +11 -0
- sqlglot/generator.py +8 -0
- sqlglot/tokens.py +2 -0
- {sqlglot-27.15.1.dist-info → sqlglot-27.15.2.dist-info}/METADATA +1 -1
- {sqlglot-27.15.1.dist-info → sqlglot-27.15.2.dist-info}/RECORD +11 -11
- {sqlglot-27.15.1.dist-info → sqlglot-27.15.2.dist-info}/WHEEL +0 -0
- {sqlglot-27.15.1.dist-info → sqlglot-27.15.2.dist-info}/licenses/LICENSE +0 -0
- {sqlglot-27.15.1.dist-info → sqlglot-27.15.2.dist-info}/top_level.txt +0 -0
sqlglot/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '27.15.
|
|
32
|
-
__version_tuple__ = version_tuple = (27, 15,
|
|
31
|
+
__version__ = version = '27.15.2'
|
|
32
|
+
__version_tuple__ = version_tuple = (27, 15, 2)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
sqlglot/dialects/duckdb.py
CHANGED
|
@@ -304,6 +304,8 @@ class DuckDB(Dialect):
|
|
|
304
304
|
"CHAR": TokenType.TEXT,
|
|
305
305
|
"DATETIME": TokenType.TIMESTAMPNTZ,
|
|
306
306
|
"DETACH": TokenType.DETACH,
|
|
307
|
+
"FORCE": TokenType.FORCE,
|
|
308
|
+
"INSTALL": TokenType.INSTALL,
|
|
307
309
|
"LOGICAL": TokenType.BOOLEAN,
|
|
308
310
|
"ONLY": TokenType.ONLY,
|
|
309
311
|
"PIVOT_WIDER": TokenType.PIVOT,
|
|
@@ -468,6 +470,8 @@ class DuckDB(Dialect):
|
|
|
468
470
|
**parser.Parser.STATEMENT_PARSERS,
|
|
469
471
|
TokenType.ATTACH: lambda self: self._parse_attach_detach(),
|
|
470
472
|
TokenType.DETACH: lambda self: self._parse_attach_detach(is_attach=False),
|
|
473
|
+
TokenType.FORCE: lambda self: self._parse_force(),
|
|
474
|
+
TokenType.INSTALL: lambda self: self._parse_install(),
|
|
471
475
|
TokenType.SHOW: lambda self: self._parse_show(),
|
|
472
476
|
}
|
|
473
477
|
|
|
@@ -605,6 +609,24 @@ class DuckDB(Dialect):
|
|
|
605
609
|
def _parse_show_duckdb(self, this: str) -> exp.Show:
|
|
606
610
|
return self.expression(exp.Show, this=this)
|
|
607
611
|
|
|
612
|
+
def _parse_force(self) -> exp.Install | exp.Command:
|
|
613
|
+
# FORCE can only be followed by INSTALL or CHECKPOINT
|
|
614
|
+
# In the case of CHECKPOINT, we fallback
|
|
615
|
+
if not self._match(TokenType.INSTALL):
|
|
616
|
+
return self._parse_as_command(self._prev)
|
|
617
|
+
|
|
618
|
+
return self._parse_install(force=True)
|
|
619
|
+
|
|
620
|
+
def _parse_install(self, force: bool = False) -> exp.Install:
|
|
621
|
+
return self.expression(
|
|
622
|
+
exp.Install,
|
|
623
|
+
**{ # type: ignore
|
|
624
|
+
"this": self._parse_id_var(),
|
|
625
|
+
"from": self._parse_var_or_string() if self._match(TokenType.FROM) else None,
|
|
626
|
+
"force": force,
|
|
627
|
+
},
|
|
628
|
+
)
|
|
629
|
+
|
|
608
630
|
def _parse_primary(self) -> t.Optional[exp.Expression]:
|
|
609
631
|
if self._match_pair(TokenType.HASH, TokenType.NUMBER):
|
|
610
632
|
return exp.PositionalColumn(this=exp.Literal.number(self._prev.text))
|
|
@@ -928,6 +950,13 @@ class DuckDB(Dialect):
|
|
|
928
950
|
def show_sql(self, expression: exp.Show) -> str:
|
|
929
951
|
return f"SHOW {expression.name}"
|
|
930
952
|
|
|
953
|
+
def install_sql(self, expression: exp.Install) -> str:
|
|
954
|
+
force = "FORCE " if expression.args.get("force") else ""
|
|
955
|
+
this = self.sql(expression, "this")
|
|
956
|
+
from_clause = expression.args.get("from")
|
|
957
|
+
from_clause = f" FROM {from_clause}" if from_clause else ""
|
|
958
|
+
return f"{force}INSTALL {this}{from_clause}"
|
|
959
|
+
|
|
931
960
|
def fromiso8601timestamp_sql(self, expression: exp.FromISO8601Timestamp) -> str:
|
|
932
961
|
return self.sql(exp.cast(expression.this, exp.DataType.Type.TIMESTAMPTZ))
|
|
933
962
|
|
sqlglot/dialects/snowflake.py
CHANGED
|
@@ -746,6 +746,7 @@ class Snowflake(Dialect):
|
|
|
746
746
|
"VECTOR_L2_DISTANCE": exp.EuclideanDistance.from_arg_list,
|
|
747
747
|
"ZEROIFNULL": _build_if_from_zeroifnull,
|
|
748
748
|
}
|
|
749
|
+
FUNCTIONS.pop("PREDICT")
|
|
749
750
|
|
|
750
751
|
FUNCTION_PARSERS = {
|
|
751
752
|
**parser.Parser.FUNCTION_PARSERS,
|
|
@@ -852,6 +853,13 @@ class Snowflake(Dialect):
|
|
|
852
853
|
),
|
|
853
854
|
}
|
|
854
855
|
|
|
856
|
+
COLUMN_OPERATORS = {
|
|
857
|
+
**parser.Parser.COLUMN_OPERATORS,
|
|
858
|
+
TokenType.EXCLAMATION: lambda self, this, attr: self.expression(
|
|
859
|
+
exp.ModelAttribute, this=this, expression=attr
|
|
860
|
+
),
|
|
861
|
+
}
|
|
862
|
+
|
|
855
863
|
def _parse_use(self) -> exp.Use:
|
|
856
864
|
if self._match_text_seq("SECONDARY", "ROLES"):
|
|
857
865
|
this = self._match_texts(("ALL", "NONE")) and exp.var(self._prev.text.upper())
|
|
@@ -963,7 +971,7 @@ class Snowflake(Dialect):
|
|
|
963
971
|
# Keys are strings in Snowflake's objects, see also:
|
|
964
972
|
# - https://docs.snowflake.com/en/sql-reference/data-types-semistructured
|
|
965
973
|
# - https://docs.snowflake.com/en/sql-reference/functions/object_construct
|
|
966
|
-
return self._parse_slice(self._parse_string())
|
|
974
|
+
return self._parse_slice(self._parse_string()) or self._parse_assignment()
|
|
967
975
|
|
|
968
976
|
return self._parse_slice(self._parse_alias(self._parse_assignment(), explicit=True))
|
|
969
977
|
|
|
@@ -1254,6 +1262,7 @@ class Snowflake(Dialect):
|
|
|
1254
1262
|
SINGLE_TOKENS = {
|
|
1255
1263
|
**tokens.Tokenizer.SINGLE_TOKENS,
|
|
1256
1264
|
"$": TokenType.PARAMETER,
|
|
1265
|
+
"!": TokenType.EXCLAMATION,
|
|
1257
1266
|
}
|
|
1258
1267
|
|
|
1259
1268
|
VAR_SINGLE_TOKENS = {"$"}
|
|
@@ -1303,6 +1312,7 @@ class Snowflake(Dialect):
|
|
|
1303
1312
|
exp.BitwiseAndAgg: rename_func("BITANDAGG"),
|
|
1304
1313
|
exp.BitwiseOrAgg: rename_func("BITORAGG"),
|
|
1305
1314
|
exp.BitwiseXorAgg: rename_func("BITXORAGG"),
|
|
1315
|
+
exp.BitwiseNot: rename_func("BITNOT"),
|
|
1306
1316
|
exp.BitwiseLeftShift: rename_func("BITSHIFTLEFT"),
|
|
1307
1317
|
exp.BitwiseRightShift: rename_func("BITSHIFTRIGHT"),
|
|
1308
1318
|
exp.Create: transforms.preprocess([_flatten_structured_types_unless_iceberg]),
|
|
@@ -1623,6 +1633,12 @@ class Snowflake(Dialect):
|
|
|
1623
1633
|
return f"CLUSTER BY ({self.expressions(expression, flat=True)})"
|
|
1624
1634
|
|
|
1625
1635
|
def struct_sql(self, expression: exp.Struct) -> str:
|
|
1636
|
+
if len(expression.expressions) == 1:
|
|
1637
|
+
arg = expression.expressions[0]
|
|
1638
|
+
if arg.is_star or (isinstance(arg, exp.ILike) and arg.left.is_star):
|
|
1639
|
+
# Wildcard syntax: https://docs.snowflake.com/en/sql-reference/data-types-semistructured#object
|
|
1640
|
+
return f"{{{self.sql(expression.expressions[0])}}}"
|
|
1641
|
+
|
|
1626
1642
|
keys = []
|
|
1627
1643
|
values = []
|
|
1628
1644
|
|
|
@@ -1796,3 +1812,6 @@ class Snowflake(Dialect):
|
|
|
1796
1812
|
return f"{self.sql(this)}:{self.sql(expression, 'expression')}"
|
|
1797
1813
|
|
|
1798
1814
|
return super().dot_sql(expression)
|
|
1815
|
+
|
|
1816
|
+
def modelattribute_sql(self, expression: exp.ModelAttribute) -> str:
|
|
1817
|
+
return f"{self.sql(expression, 'this')}!{self.sql(expression, 'expression')}"
|
sqlglot/expressions.py
CHANGED
|
@@ -1584,6 +1584,11 @@ class Detach(Expression):
|
|
|
1584
1584
|
arg_types = {"this": True, "exists": False}
|
|
1585
1585
|
|
|
1586
1586
|
|
|
1587
|
+
# https://duckdb.org/docs/sql/statements/load_and_install.html
|
|
1588
|
+
class Install(Expression):
|
|
1589
|
+
arg_types = {"this": True, "from": False, "force": False}
|
|
1590
|
+
|
|
1591
|
+
|
|
1587
1592
|
# https://duckdb.org/docs/guides/meta/summarize.html
|
|
1588
1593
|
class Summarize(Expression):
|
|
1589
1594
|
arg_types = {"this": True, "table": False}
|
|
@@ -7027,6 +7032,12 @@ class MLForecast(Func):
|
|
|
7027
7032
|
arg_types = {"this": True, "expression": False, "params_struct": False}
|
|
7028
7033
|
|
|
7029
7034
|
|
|
7035
|
+
# Represents Snowflake's <model>!<attribute> syntax. For example: SELECT model!PREDICT(INPUT_DATA => {*})
|
|
7036
|
+
# See: https://docs.snowflake.com/en/guides-overview-ml-functions
|
|
7037
|
+
class ModelAttribute(Expression):
|
|
7038
|
+
arg_types = {"this": True, "expression": True}
|
|
7039
|
+
|
|
7040
|
+
|
|
7030
7041
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search
|
|
7031
7042
|
class VectorSearch(Func):
|
|
7032
7043
|
arg_types = {
|
sqlglot/generator.py
CHANGED
|
@@ -5198,6 +5198,10 @@ class Generator(metaclass=_Generator):
|
|
|
5198
5198
|
self.unsupported("Unsupported SHOW statement")
|
|
5199
5199
|
return ""
|
|
5200
5200
|
|
|
5201
|
+
def install_sql(self, expression: exp.Install) -> str:
|
|
5202
|
+
self.unsupported("Unsupported INSTALL statement")
|
|
5203
|
+
return ""
|
|
5204
|
+
|
|
5201
5205
|
def get_put_sql(self, expression: exp.Put | exp.Get) -> str:
|
|
5202
5206
|
# Snowflake GET/PUT statements:
|
|
5203
5207
|
# PUT <file> <internalStage> <properties>
|
|
@@ -5302,3 +5306,7 @@ class Generator(metaclass=_Generator):
|
|
|
5302
5306
|
starts = f" STARTS {starts}" if starts else ""
|
|
5303
5307
|
|
|
5304
5308
|
return f"REFRESH {method} ON {kind}{every}{starts}"
|
|
5309
|
+
|
|
5310
|
+
def modelattribute_sql(self, expression: exp.ModelAttribute) -> str:
|
|
5311
|
+
self.unsupported("The model!attribute syntax is not supported")
|
|
5312
|
+
return ""
|
sqlglot/tokens.py
CHANGED
|
@@ -88,6 +88,7 @@ class TokenType(AutoName):
|
|
|
88
88
|
QMARK_AMP = auto()
|
|
89
89
|
QMARK_PIPE = auto()
|
|
90
90
|
HASH_DASH = auto()
|
|
91
|
+
EXCLAMATION = auto()
|
|
91
92
|
|
|
92
93
|
URI_START = auto()
|
|
93
94
|
|
|
@@ -313,6 +314,7 @@ class TokenType(AutoName):
|
|
|
313
314
|
INDEX = auto()
|
|
314
315
|
INNER = auto()
|
|
315
316
|
INSERT = auto()
|
|
317
|
+
INSTALL = auto()
|
|
316
318
|
INTERSECT = auto()
|
|
317
319
|
INTERVAL = auto()
|
|
318
320
|
INTO = auto()
|
|
@@ -1,11 +1,11 @@
|
|
|
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=pe_JolvIq4cAd7WBQAd1t0lSa40mXWFHOUlV1QYW-uU,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=HSHMIHOo1QmSfpZa6-0q2SrTqOfICf7A8f1_8V0f2e4,255862
|
|
8
|
+
sqlglot/generator.py,sha256=Twp2rdS57BxztRQx9z6d_e-GOAd4hW0UeSnywiIrbws,225487
|
|
9
9
|
sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
|
|
10
10
|
sqlglot/jsonpath.py,sha256=SQgaxzaEYBN7At9dkTK4N1Spk6xHxvHL6QtCIP6iM30,7905
|
|
11
11
|
sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
|
|
@@ -15,7 +15,7 @@ sqlglot/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
15
15
|
sqlglot/schema.py,sha256=13H2qKQs27EKdTpDLOvcNnSTDAUbYNKjWtJs4aQCSOA,20509
|
|
16
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=M6E-2vbIs41CYwyLIFtRqre9Mh9kO7Qt9rQvpfVeB7w,49217
|
|
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
|
|
@@ -28,7 +28,7 @@ sqlglot/dialects/doris.py,sha256=CFnF955Oav3IjZWA80ickOI8tPpCjxk7BN5R4Z6pA1U,252
|
|
|
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=GylLuN7ANQmC-1o-8k51T4nIP4r5LbLOpZ-JBr13j0E,54328
|
|
32
32
|
sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
|
|
33
33
|
sqlglot/dialects/exasol.py,sha256=ay3g_VyT5WvHTgNyJuCQu0nBt4bpllLZ9IdMBizEgYM,15761
|
|
34
34
|
sqlglot/dialects/fabric.py,sha256=BdkvzM8s-m5DIdBwdjEYskp32ub7aHCAex_xlhQn92I,10222
|
|
@@ -42,7 +42,7 @@ sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
|
|
|
42
42
|
sqlglot/dialects/redshift.py,sha256=FIwtP3yEg-way9pa32kxCJc6IaFkHVIvgYKZA-Ilmi0,15919
|
|
43
43
|
sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
|
|
44
44
|
sqlglot/dialects/singlestore.py,sha256=0QqNYOucNklPQuyeGcsisLI97qPGx_RfWKOFarJz2qw,61711
|
|
45
|
-
sqlglot/dialects/snowflake.py,sha256=
|
|
45
|
+
sqlglot/dialects/snowflake.py,sha256=lmTewBaYn96gFNy8NfqUlwm-H_5T2tuT9Yz7RcSSi3o,76283
|
|
46
46
|
sqlglot/dialects/spark.py,sha256=PzyhkelDzbCMgJ3RVHD6yyzLIFp9NdZfwVas5IymowM,10147
|
|
47
47
|
sqlglot/dialects/spark2.py,sha256=qz36FT9k4iuiqboRpyG4VpKGkPR0P2fifmqgZ9gNUEU,14851
|
|
48
48
|
sqlglot/dialects/sqlite.py,sha256=zzXEbnaLjJeg6hPLHricjpfSkuf8tpXECnjcHtoqIbw,13263
|
|
@@ -76,8 +76,8 @@ sqlglot/optimizer/qualify_tables.py,sha256=dA4ZazL7ShQh2JgBwpHuG-4c5lBw1TNzCnuN7
|
|
|
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.15.
|
|
80
|
-
sqlglot-27.15.
|
|
81
|
-
sqlglot-27.15.
|
|
82
|
-
sqlglot-27.15.
|
|
83
|
-
sqlglot-27.15.
|
|
79
|
+
sqlglot-27.15.2.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
|
|
80
|
+
sqlglot-27.15.2.dist-info/METADATA,sha256=eQcMYgKG3ZBrlkUUZftRPXx1uA7wzwSPV87r_6cjgbA,20682
|
|
81
|
+
sqlglot-27.15.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
82
|
+
sqlglot-27.15.2.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
|
|
83
|
+
sqlglot-27.15.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|