sqlglotc 30.21.0__tar.gz → 30.23.0__tar.gz

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.
Files changed (119) hide show
  1. {sqlglotc-30.21.0/sqlglotc.egg-info → sqlglotc-30.23.0}/PKG-INFO +3 -3
  2. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/pyproject.toml +2 -2
  3. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/setup.py +0 -1
  4. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/anonymize.py +1 -0
  5. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/array.py +15 -1
  6. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/builders.py +55 -6
  7. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/constraints.py +1 -0
  8. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/core.py +13 -3
  9. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/ddl.py +3 -1
  10. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/json.py +1 -0
  11. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/properties.py +20 -5
  12. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/query.py +37 -3
  13. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/string.py +4 -0
  14. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generator.py +127 -34
  15. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/athena.py +5 -1
  16. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/bigquery.py +4 -2
  17. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/clickhouse.py +53 -1
  18. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/doris.py +7 -0
  19. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/dremio.py +1 -0
  20. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/drill.py +7 -0
  21. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/duckdb.py +85 -11
  22. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/hive.py +1 -0
  23. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/materialize.py +6 -1
  24. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/mysql.py +25 -1
  25. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/oracle.py +23 -0
  26. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/postgres.py +15 -1
  27. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/presto.py +11 -1
  28. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/redshift.py +8 -0
  29. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/risingwave.py +2 -1
  30. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/singlestore.py +5 -1
  31. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/snowflake.py +5 -48
  32. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/spark2.py +2 -1
  33. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/sqlite.py +2 -1
  34. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/starrocks.py +29 -0
  35. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/teradata.py +19 -0
  36. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/trino.py +1 -0
  37. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/tsql.py +12 -4
  38. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/lineage.py +19 -6
  39. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/qualify.py +0 -3
  40. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/qualify_columns.py +96 -25
  41. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/qualify_tables.py +36 -9
  42. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/resolver.py +29 -25
  43. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/scope.py +31 -13
  44. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/simplify.py +9 -2
  45. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parser.py +275 -87
  46. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/athena.py +8 -0
  47. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/clickhouse.py +19 -1
  48. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/doris.py +43 -0
  49. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/duckdb.py +10 -2
  50. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/mysql.py +43 -5
  51. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/oracle.py +77 -2
  52. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/postgres.py +4 -0
  53. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/snowflake.py +11 -0
  54. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/spark.py +4 -0
  55. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/spark2.py +13 -5
  56. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/starrocks.py +75 -1
  57. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/teradata.py +44 -0
  58. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/trino.py +25 -0
  59. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/tsql.py +72 -2
  60. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/tokenizer_core.py +101 -20
  61. {sqlglotc-30.21.0 → sqlglotc-30.23.0/sqlglotc.egg-info}/PKG-INFO +3 -3
  62. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglotc.egg-info/SOURCES.txt +0 -1
  63. sqlglotc-30.23.0/sqlglotc.egg-info/requires.txt +6 -0
  64. sqlglotc-30.23.0/sqlglotc.egg-info/scm_version.json +8 -0
  65. sqlglotc-30.21.0/sqlglot/schema.py +0 -813
  66. sqlglotc-30.21.0/sqlglotc.egg-info/requires.txt +0 -6
  67. sqlglotc-30.21.0/sqlglotc.egg-info/scm_version.json +0 -8
  68. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/MANIFEST.in +0 -0
  69. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/setup.cfg +0 -0
  70. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/errors.py +0 -0
  71. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/executor/table.py +0 -0
  72. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/aggregate.py +0 -0
  73. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/datatypes.py +0 -0
  74. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/dml.py +0 -0
  75. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/functions.py +0 -0
  76. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/math.py +0 -0
  77. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/expressions/temporal.py +0 -0
  78. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/databricks.py +0 -0
  79. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/dax.py +0 -0
  80. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/druid.py +0 -0
  81. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/dune.py +0 -0
  82. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/exasol.py +0 -0
  83. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/fabric.py +0 -0
  84. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/prql.py +0 -0
  85. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/python.py +0 -0
  86. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/solr.py +0 -0
  87. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/spark.py +0 -0
  88. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/generators/tableau.py +0 -0
  89. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/helper.py +0 -0
  90. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/annotate_types.py +0 -0
  91. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/canonicalize_internal_names.py +0 -0
  92. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  93. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  94. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/base.py +0 -0
  95. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/bigquery.py +0 -0
  96. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/databricks.py +0 -0
  97. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/dax.py +0 -0
  98. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/dremio.py +0 -0
  99. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/drill.py +0 -0
  100. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/druid.py +0 -0
  101. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/dune.py +0 -0
  102. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/exasol.py +0 -0
  103. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/fabric.py +0 -0
  104. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/hive.py +0 -0
  105. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/materialize.py +0 -0
  106. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/presto.py +0 -0
  107. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/prql.py +0 -0
  108. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/redshift.py +0 -0
  109. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/risingwave.py +0 -0
  110. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/singlestore.py +0 -0
  111. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/solr.py +0 -0
  112. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/sqlite.py +0 -0
  113. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/parsers/tableau.py +0 -0
  114. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/serde.py +0 -0
  115. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/time.py +0 -0
  116. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglot/trie.py +0 -0
  117. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglotc.egg-info/dependency_links.txt +0 -0
  118. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglotc.egg-info/scm_file_list.json +0 -0
  119. {sqlglotc-30.21.0 → sqlglotc-30.23.0}/sqlglotc.egg-info/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglotc
3
- Version: 30.21.0
3
+ Version: 30.23.0
4
4
  Summary: mypyc-compiled extensions for sqlglot
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://sqlglot.com/
8
8
  Project-URL: Repository, https://github.com/tobymao/sqlglot
9
9
  Requires-Python: >=3.10
10
- Requires-Dist: sqlglot==30.21.0
10
+ Requires-Dist: sqlglot==30.23.0
11
11
  Provides-Extra: dev
12
12
  Requires-Dist: setuptools>=61.0; extra == "dev"
13
13
  Requires-Dist: setuptools_scm; extra == "dev"
14
- Requires-Dist: sqlglot-mypy>=2.3.0.post2; extra == "dev"
14
+ Requires-Dist: mypy>=2.4.0; extra == "dev"
15
15
  Dynamic: requires-dist
@@ -7,7 +7,7 @@ license = "MIT"
7
7
  requires-python = ">= 3.10"
8
8
 
9
9
  [project.optional-dependencies]
10
- dev = ["setuptools >= 61.0", "setuptools_scm", "sqlglot-mypy >= 2.3.0.post2"]
10
+ dev = ["setuptools >= 61.0", "setuptools_scm", "mypy >= 2.4.0"]
11
11
 
12
12
  [project.urls]
13
13
  Homepage = "https://sqlglot.com/"
@@ -17,7 +17,7 @@ Repository = "https://github.com/tobymao/sqlglot"
17
17
  requires = [
18
18
  "setuptools >= 61.0",
19
19
  "setuptools_scm",
20
- "sqlglot-mypy >= 2.3.0.post2",
20
+ "mypy >= 2.4.0",
21
21
  "types-python-dateutil",
22
22
  "sqlglot",
23
23
  ]
@@ -49,7 +49,6 @@ def _source_files(src_dir):
49
49
  "helper.py",
50
50
  "lineage.py",
51
51
  "parser.py",
52
- "schema.py",
53
52
  "serde.py",
54
53
  "time.py",
55
54
  "tokenizer_core.py",
@@ -15,6 +15,7 @@ ANONYMIZED_TYPES = {
15
15
  TokenType.HEX_STRING,
16
16
  TokenType.HEREDOC_STRING,
17
17
  TokenType.IDENTIFIER,
18
+ TokenType.NATIONAL_RAW_STRING,
18
19
  TokenType.NATIONAL_STRING,
19
20
  TokenType.NUMBER,
20
21
  TokenType.RAW_STRING,
@@ -23,6 +23,7 @@ class Array(Expression, Func):
23
23
  "expressions": False,
24
24
  "bracket_notation": False,
25
25
  "struct_name_inheritance": False,
26
+ "value_constructor": False,
26
27
  }
27
28
  is_var_len_args = True
28
29
 
@@ -84,7 +85,16 @@ class ArrayReverse(Expression, Func):
84
85
 
85
86
 
86
87
  class ArraySlice(Expression, Func):
87
- arg_types = {"this": True, "start": True, "end": False, "step": False, "zero_based": False}
88
+ """Slice by end index, or by length when is_length is set."""
89
+
90
+ arg_types = {
91
+ "this": True,
92
+ "start": True,
93
+ "end": False,
94
+ "step": False,
95
+ "zero_based": False,
96
+ "is_length": False,
97
+ }
88
98
 
89
99
 
90
100
  class ArraySort(Expression, Func):
@@ -244,6 +254,10 @@ class Inline(Expression, Func, UDTF):
244
254
  pass
245
255
 
246
256
 
257
+ class SplitToTable(Expression, Func, UDTF):
258
+ arg_types = {"this": True, "expression": True}
259
+
260
+
247
261
  class Stack(Expression, Func, UDTF):
248
262
  arg_types = {"this": True, "expressions": True}
249
263
  is_var_len_args = True
@@ -10,14 +10,25 @@ from sqlglot.errors import ParseError, TokenError
10
10
  from sqlglot.expressions.core import (
11
11
  Alias,
12
12
  Anonymous,
13
+ AtTimeZone,
14
+ Between,
15
+ Binary,
16
+ BitwiseNot,
13
17
  Boolean,
18
+ Bracket,
14
19
  Column,
15
20
  Condition,
21
+ Dot,
16
22
  EQ,
17
23
  Expr,
24
+ Func,
18
25
  Identifier,
26
+ In,
19
27
  Literal,
28
+ Neg,
29
+ Not,
20
30
  Null,
31
+ Paren,
21
32
  Placeholder,
22
33
  TABLE_PARTS,
23
34
  Var,
@@ -36,6 +47,8 @@ from sqlglot.expressions.query import (
36
47
  From,
37
48
  Schema,
38
49
  Select,
50
+ SetOperation,
51
+ Subquery,
39
52
  Table,
40
53
  TableAlias,
41
54
  Tuple,
@@ -44,7 +57,7 @@ from sqlglot.expressions.query import (
44
57
  With,
45
58
  Query,
46
59
  )
47
- from sqlglot.expressions.ddl import Alter, AlterRename, RenameColumn
60
+ from sqlglot.expressions.ddl import Alter, AlterRename, Create, RenameColumn
48
61
  from sqlglot.expressions.dml import Delete, Insert, Merge, Update, When, Whens
49
62
  from sqlglot.expressions.functions import Case, Cast
50
63
  from sqlglot.expressions.array import Array
@@ -53,11 +66,10 @@ from sqlglot.expressions.array import Array
53
66
  if t.TYPE_CHECKING:
54
67
  from collections.abc import Sequence, Iterable, Iterator
55
68
  from sqlglot.dialects.dialect import DialectType
56
- from sqlglot.expressions.core import ExpOrStr, Func
69
+ from sqlglot.expressions.core import ExpOrStr
57
70
  from sqlglot.expressions.datatypes import DATA_TYPE
58
71
  from sqlglot._typing import ParserArgs, ParserNoDialectArgs, E, P
59
72
  from typing_extensions import Unpack, Concatenate
60
- from sqlglot.expressions.core import Dot
61
73
 
62
74
 
63
75
  def select(
@@ -516,7 +528,7 @@ def cast(
516
528
 
517
529
 
518
530
  def table_(
519
- table: Identifier | str,
531
+ table: Identifier | str | None,
520
532
  db: Identifier | str | None = None,
521
533
  catalog: Identifier | str | None = None,
522
534
  quoted: bool | None = None,
@@ -849,6 +861,43 @@ def replace_tables(
849
861
  return expression.transform(_replace_tables, copy=copy) # type: ignore
850
862
 
851
863
 
864
+ OPERATORS = (AtTimeZone, Between, Binary, BitwiseNot, In, Neg, Not)
865
+
866
+
867
+ def _is_operand(placeholder: Placeholder) -> bool:
868
+ parent = placeholder.parent
869
+ if isinstance(parent, (Bracket, In)):
870
+ return placeholder.arg_key == "this"
871
+ return isinstance(parent, OPERATORS)
872
+
873
+
874
+ def _takes_query(placeholder: Placeholder) -> bool:
875
+ parent = placeholder.parent
876
+ if isinstance(parent, In):
877
+ return placeholder.arg_key == "expressions" and len(parent.expressions) == 1
878
+ if isinstance(parent, Func):
879
+ return len(list(parent.iter_expressions())) == 1
880
+ if isinstance(parent, Table):
881
+ return isinstance(parent.parent, (Create, Subquery))
882
+ return not parent or isinstance(parent, (CTE, Paren, SetOperation))
883
+
884
+
885
+ def _replace_placeholder(placeholder: Placeholder, expression: Expr) -> Expr:
886
+ if (
887
+ isinstance(expression, Query)
888
+ and not isinstance(expression, Subquery)
889
+ and not _takes_query(placeholder)
890
+ ):
891
+ return expression.subquery(copy=False)
892
+ if (
893
+ _is_operand(placeholder)
894
+ and isinstance(expression, OPERATORS)
895
+ and not isinstance(expression, Dot)
896
+ ):
897
+ return Paren(this=expression)
898
+ return expression
899
+
900
+
852
901
  def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Expr:
853
902
  """Replace placeholders in an expression.
854
903
 
@@ -874,10 +923,10 @@ def replace_placeholders(expression: Expr, *args: object, **kwargs: t.Any) -> Ex
874
923
  if node.this:
875
924
  new_name = kwargs.get(node.this)
876
925
  if new_name is not None:
877
- return convert(new_name)
926
+ return _replace_placeholder(node, convert(new_name))
878
927
  else:
879
928
  try:
880
- return convert(next(args))
929
+ return _replace_placeholder(node, convert(next(args)))
881
930
  except StopIteration:
882
931
  pass
883
932
  return node
@@ -208,6 +208,7 @@ class Constraint(Expression):
208
208
 
209
209
  class ForeignKey(Expression):
210
210
  arg_types = {
211
+ "this": False,
211
212
  "expressions": False,
212
213
  "reference": False,
213
214
  "delete": False,
@@ -867,7 +867,7 @@ class Expression(Expr):
867
867
  for k in sorted(node.args):
868
868
  v = node.args[k]
869
869
  if v:
870
- hash_ = hash((hash_, k, v))
870
+ hash_ = hash((hash_, k, tuple(v) if type(v) is list else v))
871
871
  else:
872
872
  for k in sorted(node.args):
873
873
  v = node.args[k]
@@ -1595,7 +1595,14 @@ class Uncache(Expression):
1595
1595
 
1596
1596
 
1597
1597
  class Refresh(Expression):
1598
- arg_types = {"this": True, "kind": True}
1598
+ arg_types = {
1599
+ "this": True,
1600
+ "kind": True,
1601
+ "partition_start": False,
1602
+ "partition_end": False,
1603
+ "force": False,
1604
+ "mode": False,
1605
+ }
1599
1606
 
1600
1607
 
1601
1608
  class LockingStatement(Expression):
@@ -1859,6 +1866,7 @@ class SessionParameter(Expression, Condition):
1859
1866
 
1860
1867
  class Placeholder(Expression, Condition):
1861
1868
  arg_types = {"this": False, "kind": False, "widget": False, "jdbc": False}
1869
+ _hash_raw_args = True
1862
1870
 
1863
1871
  @property
1864
1872
  def name(self) -> str:
@@ -1994,6 +2002,7 @@ class Typeof(Expression, Func):
1994
2002
 
1995
2003
  class ParameterizedAgg(Expression, AggFunc):
1996
2004
  arg_types = {"this": True, "expressions": True, "params": True}
2005
+ _hash_raw_args = True
1997
2006
 
1998
2007
 
1999
2008
  class Anonymous(Expression, Func):
@@ -2008,6 +2017,7 @@ class Anonymous(Expression, Func):
2008
2017
  class AnonymousAggFunc(Expression, AggFunc):
2009
2018
  arg_types = {"this": True, "expressions": False}
2010
2019
  is_var_len_args = True
2020
+ _hash_raw_args = True
2011
2021
 
2012
2022
 
2013
2023
  class CombinedAggFunc(AnonymousAggFunc):
@@ -2211,7 +2221,7 @@ class Like(Expression, Binary, Predicate):
2211
2221
 
2212
2222
 
2213
2223
  class Match(Expression, Binary, Predicate):
2214
- pass
2224
+ arg_types = {"this": True, "expression": True, "kind": False, "analyzer": False}
2215
2225
 
2216
2226
 
2217
2227
  class LT(Expression, Binary, Predicate):
@@ -176,6 +176,7 @@ class Set(Expression):
176
176
 
177
177
  class Heredoc(Expression):
178
178
  arg_types = {"this": True, "tag": False}
179
+ _hash_raw_args = True
179
180
 
180
181
 
181
182
  class SetItem(Expression):
@@ -382,6 +383,7 @@ class Undrop(Expression):
382
383
 
383
384
  class Command(Expression):
384
385
  arg_types = {"this": True, "expression": False}
386
+ _hash_raw_args = True
385
387
 
386
388
 
387
389
  class Transaction(Expression):
@@ -400,7 +402,7 @@ class Alter(Expression):
400
402
  arg_types = {
401
403
  "this": False,
402
404
  "kind": True,
403
- "actions": True,
405
+ "actions": False,
404
406
  "exists": False,
405
407
  "only": False,
406
408
  "options": False,
@@ -100,6 +100,7 @@ class JSONExists(Expression, Func):
100
100
  "on_condition": False,
101
101
  "from_dcolonqmark": False,
102
102
  }
103
+ _hash_raw_args = True
103
104
 
104
105
 
105
106
  class JSONExtract(Expression, Binary, Func):
@@ -25,6 +25,10 @@ class AllowedValuesProperty(Expression):
25
25
  arg_types = {"expressions": True}
26
26
 
27
27
 
28
+ class AggregateKeyProperty(Property):
29
+ arg_types = {"expressions": True}
30
+
31
+
28
32
  class AlgorithmProperty(Property):
29
33
  arg_types = {"this": True}
30
34
 
@@ -123,6 +127,7 @@ class DatabaseProperty(Property):
123
127
 
124
128
  class DefinerProperty(Property):
125
129
  arg_types = {"this": True}
130
+ _hash_raw_args = True
126
131
 
127
132
 
128
133
  class DistKeyProperty(Property):
@@ -390,6 +395,10 @@ class PartitionedOfProperty(Property):
390
395
  arg_types = {"this": True, "expression": True}
391
396
 
392
397
 
398
+ class PhysicalProperty(Property):
399
+ arg_types = {"this": True, "value": False}
400
+
401
+
393
402
  class StreamingTableProperty(Property):
394
403
  arg_types = {}
395
404
 
@@ -497,6 +506,10 @@ class StorageHandlerProperty(Property):
497
506
  arg_types = {"this": True}
498
507
 
499
508
 
509
+ class StorageProperty(Property):
510
+ arg_types = {"expressions": True}
511
+
512
+
500
513
  class UsingProperty(Property):
501
514
  # kind: JAR, FILE, or ARCHIVE; this: the resource path (string literal)
502
515
  arg_types = {"this": True, "kind": True}
@@ -522,6 +535,10 @@ class Tags(Property, ColumnConstraintKind):
522
535
  arg_types = {"expressions": True}
523
536
 
524
537
 
538
+ class TableSpaceProperty(Property):
539
+ arg_types = {"this": True}
540
+
541
+
525
542
  class PropertiesLocation(AutoName):
526
543
  POST_CREATE = auto()
527
544
  POST_NAME = auto()
@@ -624,7 +641,9 @@ class Properties(Expression):
624
641
  "INCLUDE": IncludeProperty,
625
642
  }
626
643
 
627
- PROPERTY_TO_NAME: t.ClassVar[dict[type[Property], str]] = {}
644
+ PROPERTY_TO_NAME: t.ClassVar[dict[type[Property], str]] = {
645
+ v: k for k, v in NAME_TO_PROPERTY.items()
646
+ }
628
647
 
629
648
  # CREATE property locations
630
649
  # Form: schema specified
@@ -652,7 +671,3 @@ class Properties(Expression):
652
671
  expressions.append(Property(this=Literal.string(key), value=convert(value)))
653
672
 
654
673
  return cls(expressions=expressions)
655
-
656
-
657
- # TODO (mypyc)
658
- Properties.PROPERTY_TO_NAME = {v: k for k, v in Properties.NAME_TO_PROPERTY.items()}
@@ -19,6 +19,7 @@ from sqlglot.expressions.core import (
19
19
  Hint,
20
20
  Identifier,
21
21
  In,
22
+ Var,
22
23
  _apply_builder,
23
24
  _apply_child_list_builder,
24
25
  _apply_list_builder,
@@ -441,11 +442,24 @@ class QueryBand(Expression):
441
442
 
442
443
 
443
444
  class RecursiveWithSearch(Expression):
444
- arg_types = {"kind": True, "this": True, "expression": True, "using": False}
445
+ arg_types = {
446
+ "kind": True,
447
+ "this": True,
448
+ "expression": True,
449
+ "to": False,
450
+ "default": False,
451
+ "using": False,
452
+ }
445
453
 
446
454
 
447
455
  class With(Expression):
448
- arg_types = {"expressions": False, "recursive": False, "search": False, "udfs": False}
456
+ arg_types = {
457
+ "expressions": False,
458
+ "recursive": False,
459
+ "search": False,
460
+ "cycle": False,
461
+ "udfs": False,
462
+ }
449
463
 
450
464
  @property
451
465
  def recursive(self) -> bool:
@@ -486,14 +500,17 @@ class HexString(Expression, Condition):
486
500
  class ByteString(Expression, Condition):
487
501
  arg_types = {"this": True, "is_bytes": False}
488
502
  is_primitive = True
503
+ _hash_raw_args = True
489
504
 
490
505
 
491
506
  class RawString(Expression, Condition):
492
507
  is_primitive = True
508
+ _hash_raw_args = True
493
509
 
494
510
 
495
511
  class UnicodeString(Expression, Condition):
496
512
  arg_types = {"this": True, "escape": False}
513
+ _hash_raw_args = True
497
514
 
498
515
 
499
516
  class ColumnPosition(Expression):
@@ -572,7 +589,7 @@ class ConditionalInsert(Expression):
572
589
 
573
590
 
574
591
  class MultitableInserts(Expression):
575
- arg_types = {"expressions": True, "kind": True, "source": True}
592
+ arg_types = {"with_": False, "expressions": True, "kind": False, "source": True}
576
593
 
577
594
 
578
595
  class OnCondition(Expression):
@@ -585,6 +602,7 @@ class Introducer(Expression):
585
602
 
586
603
  class National(Expression):
587
604
  is_primitive = True
605
+ _hash_raw_args = True
588
606
 
589
607
 
590
608
  class Partition(Expression):
@@ -657,6 +675,11 @@ class Limit(Expression):
657
675
  "expressions": False,
658
676
  }
659
677
 
678
+ @property
679
+ def is_limit_all(self) -> bool:
680
+ limit_expression = self.args.get("expression")
681
+ return isinstance(limit_expression, Var) and limit_expression.name.upper() == "ALL"
682
+
660
683
 
661
684
  class LimitOptions(Expression):
662
685
  arg_types = {
@@ -954,6 +977,12 @@ class Get(Expression):
954
977
  arg_types = {"this": True, "target": True, "properties": False}
955
978
 
956
979
 
980
+ class ListStage(Expression):
981
+ """Lists files in a Snowflake stage or Git repository clone."""
982
+
983
+ arg_types = {"this": True, "pattern": False}
984
+
985
+
957
986
  class Table(Expression, Selectable):
958
987
  arg_types = {
959
988
  "this": False,
@@ -2022,14 +2051,17 @@ class JSONPathPart(Expression):
2022
2051
 
2023
2052
  class JSONPathFilter(JSONPathPart):
2024
2053
  arg_types = {"this": True}
2054
+ _hash_raw_args = True
2025
2055
 
2026
2056
 
2027
2057
  class JSONPathKey(JSONPathPart):
2028
2058
  arg_types = {"this": True, "quoted": False}
2059
+ _hash_raw_args = True
2029
2060
 
2030
2061
 
2031
2062
  class JSONPathRecursive(JSONPathPart):
2032
2063
  arg_types = {"this": False}
2064
+ _hash_raw_args = True
2033
2065
 
2034
2066
 
2035
2067
  class JSONPathRoot(JSONPathPart):
@@ -2038,6 +2070,7 @@ class JSONPathRoot(JSONPathPart):
2038
2070
 
2039
2071
  class JSONPathScript(JSONPathPart):
2040
2072
  arg_types = {"this": True}
2073
+ _hash_raw_args = True
2041
2074
 
2042
2075
 
2043
2076
  class JSONPathSlice(JSONPathPart):
@@ -2054,6 +2087,7 @@ class JSONPathSubscript(JSONPathPart):
2054
2087
 
2055
2088
  class JSONPathUnion(JSONPathPart):
2056
2089
  arg_types = {"expressions": True}
2090
+ _hash_raw_args = True
2057
2091
 
2058
2092
 
2059
2093
  class JSONPathWildcard(JSONPathPart):
@@ -260,6 +260,10 @@ class Upper(Expression, Func):
260
260
  _sql_names = ["UPPER", "UCASE"]
261
261
 
262
262
 
263
+ class WeightString(Expression, Func):
264
+ arg_types = {"this": True, "to": False}
265
+
266
+
263
267
  # Encoding / base conversion
264
268
 
265
269