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/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.set("from", from_)
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
- consume_pipe
3248
- and self._match(TokenType.PIPE_GT, advance=False)
3249
- and isinstance(query, exp.Query)
3250
- ):
3251
- query = self._parse_pipe_syntax_query(query)
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[0] = exp.DataType.build(expressions[0].name, dialect=self.dialect)
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._parse_csv(lambda: self._parse_lambda(alias=alias))
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(self.NULL_TOKENS):
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._parse_expression()
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
- def dump(node: Node) -> JSON:
18
+
19
+ def dump(expression: exp.Expression) -> t.List[t.Dict[str, t.Any]]:
13
20
  """
14
- Recursively dump an AST into a JSON-serializable dict.
21
+ Dump an Expression into a JSON serializable List.
15
22
  """
16
- if isinstance(node, list):
17
- return [dump(i) for i in node]
18
- if isinstance(node, exp.DataType.Type):
19
- return {
20
- "class": "DataType.Type",
21
- "value": node.value,
22
- }
23
- if isinstance(node, exp.Expression):
24
- klass = node.__class__.__qualname__
25
- if node.__class__.__module__ != exp.__name__:
26
- klass = f"{node.__module__}.{klass}"
27
- obj: t.Dict = {
28
- "class": klass,
29
- "args": {k: dump(v) for k, v in node.args.items() if v is not None and v != []},
30
- }
31
- if node.type:
32
- obj["type"] = dump(node.type)
33
- if node.comments:
34
- obj["comments"] = node.comments
35
- if node._meta is not None:
36
- obj["meta"] = node._meta
37
-
38
- return obj
39
- return node
40
-
41
-
42
- def load(obj: JSON) -> Node:
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
- Recursively load a dict (as returned by `dump`) into an AST.
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
- if class_name == "DataType.Type":
52
- return exp.DataType.Type(obj["value"])
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 "." in class_name:
55
- module_path, class_name = class_name.rsplit(".", maxsplit=1)
56
- module = __import__(module_path, fromlist=[class_name])
100
+ if payload.get(IS_ARRAY):
101
+ parent.append(arg_key, node)
57
102
  else:
58
- module = exp
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
- klass = getattr(module, class_name)
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
- expression = klass(**{k: load(v) for k, v in obj["args"].items()})
63
- expression.type = t.cast(exp.DataType, load(obj.get("type")))
64
- expression.comments = obj.get("comments")
65
- expression._meta = obj.get("meta")
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
- return expression
68
- return obj
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.13.2
3
+ Version: 27.15.0
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,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=Qfj_wDzloXYOzTK9Ff0q4plSvKrkjROgU8iPJJemDqA,708
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=oestq-dQt-OC2XLgG0B-I3cDgg7DptuXmcUW7_uP6aQ,253755
8
- sqlglot/generator.py,sha256=cO2HdHWKlL8Y7zs81hSsR-mFcy7U5x0Wd3A27jkn3lk,224692
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=wouCp_0fjj7xFqK6R3lt1LFVpk0f3qCsWQcvQnIWSQM,333289
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=DQVJ95WrIvhYfe02Ytb4NQug2aMwDCEwpMBW1LKDqzE,2031
16
+ sqlglot/serde.py,sha256=nWpBFUjwZh06Li4qBuNb0YRU_QyflzSVyWkFxujM0WM,3175
17
17
  sqlglot/time.py,sha256=Q62gv6kL40OiRBF6BMESxKJcMVn7ZLNw7sv8H34z5FI,18400
18
- sqlglot/tokens.py,sha256=GuRPOipxixWdEJDxIat9ZLPAn3JhQ2cP94qvOelXogU,49076
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=IO5u1sdT0wzl76_z3FVm8FgtVnnMBrFPab-HhxuxROs,72078
24
- sqlglot/dialects/clickhouse.py,sha256=YLY8s7oCfdCoD0X2iOIltivXXjtT_nJdb3931P0TDeU,58553
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=MFP2WHesP-wf2HXub8s0_XyeUnjXCk8QNcqn5AIhARw,73361
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=ANzn5L5KS5pe9hn81Ta_4h5ngdPxMS1k_LdMuYGiff8,52470
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=4Sng2ZhQSaf6eK3ituR9DqDZERaVwYS_UfdpusjsISg,10220
35
- sqlglot/dialects/hive.py,sha256=zFr6WmNZXw5C0m3nFc9ynrbzk8Wtb5gyzmJ0tPlMge8,32014
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=pAIWuwvirUrFbJE06UiST9iyiA4-IkA1sGiMgkeo1DY,47884
37
+ sqlglot/dialects/mysql.py,sha256=0s7RIpWPCaBYvxgR8Z6JWPub1BHBB_0Th7KHCIXVfms,49702
38
38
  sqlglot/dialects/oracle.py,sha256=zWPCpzGiTlgCJ5E6FjfX3Rszjcw4SnHg6xeVboMYIyo,15972
39
- sqlglot/dialects/postgres.py,sha256=NsaNBKUrqzb3bjVi16IBlYi8FPJnHRTl46lQX1GDNzw,33849
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=_sQTom4CGozFDZXW9y6bHQcZ-KiQ7QJjjQqM5rVagSc,15889
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=_42yJP-YYbHswIBCKO5qxP5Z_AVksLh3bMX394iivwQ,55764
45
- sqlglot/dialects/snowflake.py,sha256=A3k54EodIUxwTnnBazefDHO5mxon0zSg43mep-VG_7E,72042
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=UIQ66shIt2bQoLd7tYG4NVzh4HwCfERgAaLyukz8HjE,13231
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=kfzHDyKdciqwre6mjZaRHP9tnqfPSPjcM9SP9C045VA,54075
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=MfxXNzYgxaqhv1yBmzuigWjc1oIw1ikZ_lXjcdT3RDc,25128
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=LUlHSSyKshgWIhn4es2PzR1iAvMoSkwHY2t8h07Y32I,45037
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.13.2.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
- sqlglot-27.13.2.dist-info/METADATA,sha256=OL06yiI1dWjxy0Z_rIYYoKTcEzkYr1aCkOn-fvZ48Y4,20682
81
- sqlglot-27.13.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.13.2.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.13.2.dist-info/RECORD,,
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,,