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 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.1'
32
- __version_tuple__ = version_tuple = (27, 15, 1)
31
+ __version__ = version = '27.15.2'
32
+ __version_tuple__ = version_tuple = (27, 15, 2)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -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
 
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.15.1
3
+ Version: 27.15.2
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -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=uBjOfOPRa2Q_ZQoGTa7Z6DXUQYBsQngq3pkSoTX6oxQ,708
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=P9Da86Bo1Ufv1oZFs3ESJ1WDlc6tjvr-qz5BAd8_ek8,255449
8
- sqlglot/generator.py,sha256=m4UHZpDrh52RZzv_iBqMnhv_j4DmhtpY1CtVyiGIJ8k,225187
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=fHH_44_p4-AH9o0scLPkF6bqKT-Tyc-Fk_ba-Gvp5-E,49171
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=ZVXloJqjz_LiMFJ80v14P01hAwerje5NT2FeQdzAaqc,53023
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=tgUJ77_Ntm1QcCbwlvI-j0_R96s0l6zFUUqysHIEez8,75351
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.1.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
- sqlglot-27.15.1.dist-info/METADATA,sha256=8AtINMRFBT71fI3AeuKwjYmOPm3PRDtPEnjqBauQHas,20682
81
- sqlglot-27.15.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.15.1.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.15.1.dist-info/RECORD,,
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,,