sqlglot 27.11.0__py3-none-any.whl → 27.13.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.
@@ -279,6 +279,7 @@ def _expand_alias_refs(
279
279
 
280
280
  alias_to_expression: t.Dict[str, t.Tuple[exp.Expression, int]] = {}
281
281
  projections = {s.alias_or_name for s in expression.selects}
282
+ is_bigquery = dialect == "bigquery"
282
283
 
283
284
  def replace_columns(
284
285
  node: t.Optional[exp.Expression], resolve_table: bool = False, literal_index: bool = False
@@ -312,17 +313,30 @@ def _expand_alias_refs(
312
313
 
313
314
  # BigQuery's having clause gets confused if an alias matches a source.
314
315
  # SELECT x.a, max(x.b) as x FROM x GROUP BY 1 HAVING x > 1;
315
- # If HAVING x is expanded to max(x.b), bigquery treats x as the new projection x instead of the table
316
- if is_having and dialect == "bigquery":
316
+ # If "HAVING x" is expanded to "HAVING max(x.b)", BQ would blindly replace the "x" reference with the projection MAX(x.b)
317
+ # i.e HAVING MAX(MAX(x.b).b), resulting in the error: "Aggregations of aggregations are not allowed"
318
+ if is_having and is_bigquery:
317
319
  skip_replace = skip_replace or any(
318
320
  node.parts[0].name in projections
319
321
  for node in alias_expr.find_all(exp.Column)
320
322
  )
323
+ elif is_bigquery and (is_group_by or is_having):
324
+ column_table = table.name if table else column.table
325
+ if column_table in projections:
326
+ # BigQuery's GROUP BY and HAVING clauses get confused if the column name
327
+ # matches a source name and a projection. For instance:
328
+ # SELECT id, ARRAY_AGG(col) AS custom_fields FROM custom_fields GROUP BY id HAVING id >= 1
329
+ # We should not qualify "id" with "custom_fields" in either clause, since the aggregation shadows the actual table
330
+ # and we'd get the error: "Column custom_fields contains an aggregation function, which is not allowed in GROUP BY clause"
331
+ column.replace(exp.to_identifier(column.name))
332
+ return
321
333
 
322
334
  if table and (not alias_expr or skip_replace):
323
335
  column.set("table", table)
324
336
  elif not column.table and alias_expr and not skip_replace:
325
- if isinstance(alias_expr, exp.Literal) and (literal_index or resolve_table):
337
+ if (isinstance(alias_expr, exp.Literal) or alias_expr.is_number) and (
338
+ literal_index or resolve_table
339
+ ):
326
340
  if literal_index:
327
341
  column.replace(exp.Literal.number(i))
328
342
  else:
@@ -442,6 +456,7 @@ def _expand_positional_references(
442
456
 
443
457
  if (
444
458
  isinstance(select, exp.CONSTANTS)
459
+ or select.is_number
445
460
  or select.find(exp.Explode, exp.Unnest)
446
461
  or ambiguous
447
462
  ):
sqlglot/parser.py CHANGED
@@ -1,13 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import itertools
3
4
  import logging
4
5
  import re
5
6
  import typing as t
6
- import itertools
7
7
  from collections import defaultdict
8
8
 
9
9
  from sqlglot import exp
10
- from sqlglot.errors import ErrorLevel, ParseError, concat_messages, merge_errors
10
+ from sqlglot.errors import ErrorLevel, ParseError, TokenError, concat_messages, merge_errors
11
11
  from sqlglot.helper import apply_index_offset, ensure_list, seq_get
12
12
  from sqlglot.time import format_time
13
13
  from sqlglot.tokens import Token, Tokenizer, TokenType
@@ -479,6 +479,7 @@ class Parser(metaclass=_Parser):
479
479
  TokenType.INDEX,
480
480
  TokenType.TABLE,
481
481
  TokenType.VIEW,
482
+ TokenType.SESSION,
482
483
  }
483
484
 
484
485
  # Tokens that can represent identifiers
@@ -641,6 +642,9 @@ class Parser(metaclass=_Parser):
641
642
  TokenType.TIMESTAMP,
642
643
  TokenType.TIMESTAMPTZ,
643
644
  TokenType.TRUNCATE,
645
+ TokenType.UTC_DATE,
646
+ TokenType.UTC_TIME,
647
+ TokenType.UTC_TIMESTAMP,
644
648
  TokenType.WINDOW,
645
649
  TokenType.XOR,
646
650
  *TYPE_TOKENS,
@@ -5295,18 +5299,21 @@ class Parser(metaclass=_Parser):
5295
5299
  this: t.Optional[exp.Expression] = None
5296
5300
  prefix = self._match_text_seq("SYSUDTLIB", ".")
5297
5301
 
5298
- if not self._match_set(self.TYPE_TOKENS):
5302
+ if self._match_set(self.TYPE_TOKENS):
5303
+ type_token = self._prev.token_type
5304
+ else:
5305
+ type_token = None
5299
5306
  identifier = allow_identifiers and self._parse_id_var(
5300
5307
  any_token=False, tokens=(TokenType.VAR,)
5301
5308
  )
5302
5309
  if isinstance(identifier, exp.Identifier):
5303
- tokens = self.dialect.tokenize(identifier.sql(dialect=self.dialect))
5310
+ try:
5311
+ tokens = self.dialect.tokenize(identifier.name)
5312
+ except TokenError:
5313
+ tokens = None
5304
5314
 
5305
- if len(tokens) != 1:
5306
- self.raise_error("Unexpected identifier", self._prev)
5307
-
5308
- if tokens[0].token_type in self.TYPE_TOKENS:
5309
- self._prev = tokens[0]
5315
+ if tokens and len(tokens) == 1 and tokens[0].token_type in self.TYPE_TOKENS:
5316
+ type_token = tokens[0].token_type
5310
5317
  elif self.dialect.SUPPORTS_USER_DEFINED_TYPES:
5311
5318
  this = self._parse_user_defined_type(identifier)
5312
5319
  else:
@@ -5315,8 +5322,6 @@ class Parser(metaclass=_Parser):
5315
5322
  else:
5316
5323
  return None
5317
5324
 
5318
- type_token = self._prev.token_type
5319
-
5320
5325
  if type_token == TokenType.PSEUDO_TYPE:
5321
5326
  return self.expression(exp.PseudoType, this=self._prev.text.upper())
5322
5327
 
@@ -6859,7 +6864,15 @@ class Parser(metaclass=_Parser):
6859
6864
  )
6860
6865
 
6861
6866
  def _parse_match_against(self) -> exp.MatchAgainst:
6862
- expressions = self._parse_csv(self._parse_column)
6867
+ if self._match_text_seq("TABLE"):
6868
+ # parse SingleStore MATCH(TABLE ...) syntax
6869
+ # https://docs.singlestore.com/cloud/reference/sql-reference/full-text-search-functions/match/
6870
+ expressions = []
6871
+ table = self._parse_table()
6872
+ if table:
6873
+ expressions = [table]
6874
+ else:
6875
+ expressions = self._parse_csv(self._parse_column)
6863
6876
 
6864
6877
  self._match_text_seq(")", "AGAINST", "(")
6865
6878
 
@@ -7316,10 +7329,13 @@ class Parser(metaclass=_Parser):
7316
7329
  return self._parse_csv(self._parse_expression)
7317
7330
 
7318
7331
  def _parse_select_or_expression(self, alias: bool = False) -> t.Optional[exp.Expression]:
7319
- return self._parse_select() or self._parse_set_operations(
7320
- self._parse_alias(self._parse_assignment(), explicit=True)
7321
- if alias
7322
- else self._parse_assignment()
7332
+ return (
7333
+ self._parse_set_operations(
7334
+ self._parse_alias(self._parse_assignment(), explicit=True)
7335
+ if alias
7336
+ else self._parse_assignment()
7337
+ )
7338
+ or self._parse_select()
7323
7339
  )
7324
7340
 
7325
7341
  def _parse_ddl_select(self) -> t.Optional[exp.Expression]:
@@ -7337,7 +7353,7 @@ class Parser(metaclass=_Parser):
7337
7353
  modes = []
7338
7354
  while True:
7339
7355
  mode = []
7340
- while self._match(TokenType.VAR):
7356
+ while self._match(TokenType.VAR) or self._match(TokenType.NOT):
7341
7357
  mode.append(self._prev.text)
7342
7358
 
7343
7359
  if mode:
@@ -7580,6 +7596,18 @@ class Parser(metaclass=_Parser):
7580
7596
 
7581
7597
  return alter_set
7582
7598
 
7599
+ def _parse_alter_session(self) -> exp.AlterSession:
7600
+ """Parse ALTER SESSION SET/UNSET statements."""
7601
+ if self._match(TokenType.SET):
7602
+ expressions = self._parse_csv(lambda: self._parse_set_item_assignment())
7603
+ return self.expression(exp.AlterSession, expressions=expressions, unset=False)
7604
+
7605
+ self._match_text_seq("UNSET")
7606
+ expressions = self._parse_csv(
7607
+ lambda: self.expression(exp.SetItem, this=self._parse_id_var(any_token=True))
7608
+ )
7609
+ return self.expression(exp.AlterSession, expressions=expressions, unset=True)
7610
+
7583
7611
  def _parse_alter(self) -> exp.Alter | exp.Command:
7584
7612
  start = self._prev
7585
7613
 
@@ -7589,12 +7617,18 @@ class Parser(metaclass=_Parser):
7589
7617
 
7590
7618
  exists = self._parse_exists()
7591
7619
  only = self._match_text_seq("ONLY")
7592
- this = self._parse_table(schema=True)
7593
- check = self._match_text_seq("WITH", "CHECK")
7594
- cluster = self._parse_on_property() if self._match(TokenType.ON) else None
7595
7620
 
7596
- if self._next:
7597
- self._advance()
7621
+ if alter_token.token_type == TokenType.SESSION:
7622
+ this = None
7623
+ check = None
7624
+ cluster = None
7625
+ else:
7626
+ this = self._parse_table(schema=True)
7627
+ check = self._match_text_seq("WITH", "CHECK")
7628
+ cluster = self._parse_on_property() if self._match(TokenType.ON) else None
7629
+
7630
+ if self._next:
7631
+ self._advance()
7598
7632
 
7599
7633
  parser = self.ALTER_PARSERS.get(self._prev.text.upper()) if self._prev else None
7600
7634
  if parser:
sqlglot/tokens.py CHANGED
@@ -80,6 +80,7 @@ class TokenType(AutoName):
80
80
  AT_GT = auto()
81
81
  DOLLAR = auto()
82
82
  PARAMETER = auto()
83
+ SESSION = auto()
83
84
  SESSION_PARAMETER = auto()
84
85
  DAMP = auto()
85
86
  XOR = auto()
@@ -423,6 +424,9 @@ class TokenType(AutoName):
423
424
  WINDOW = auto()
424
425
  WITH = auto()
425
426
  UNIQUE = auto()
427
+ UTC_DATE = auto()
428
+ UTC_TIME = auto()
429
+ UTC_TIMESTAMP = auto()
426
430
  VERSION_SNAPSHOT = auto()
427
431
  TIMESTAMP_SNAPSHOT = auto()
428
432
  OPTION = auto()
@@ -835,6 +839,7 @@ class Tokenizer(metaclass=_Tokenizer):
835
839
  "SCHEMA": TokenType.SCHEMA,
836
840
  "SELECT": TokenType.SELECT,
837
841
  "SEMI": TokenType.SEMI,
842
+ "SESSION": TokenType.SESSION,
838
843
  "SET": TokenType.SET,
839
844
  "SETTINGS": TokenType.SETTINGS,
840
845
  "SHOW": TokenType.SHOW,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.11.0
3
+ Version: 27.13.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,49 +1,49 @@
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=oM65QlZoKN_nkllGdqeZbvnaN1K37Ouzx2i0_B4cs3k,708
4
+ sqlglot/_version.py,sha256=rluv89UD57hyJpJketKgm-v1FgO0kt8reB1Qn-G8n-E,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=u7_1s9-VxVvo4SAqC84nktRr-3lw00OwU-_rmGiFm-c,252520
8
- sqlglot/generator.py,sha256=69I3fUEnnE_-JPrqf56B3x12VsN99PRlWIC_QAiFo3E,223240
7
+ sqlglot/expressions.py,sha256=oestq-dQt-OC2XLgG0B-I3cDgg7DptuXmcUW7_uP6aQ,253755
8
+ sqlglot/generator.py,sha256=jYYVwMaqFWEuBWCmjdA-cd2m5_3QzePcKv1U_s0wogE,224655
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=QL4ELtwIv8acNgQ3eFQOfMA-q7N7reAalvvtBb8JIGU,331692
12
+ sqlglot/parser.py,sha256=1FYhCQb6V_Oytucf671GJ6eD_gANaHrFkLlIbCP8t4w,333060
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=gRIc8NnZJcLPdXmsjRysoGWKrM8Fse8sLF7b-uHc6Do,49002
18
+ sqlglot/tokens.py,sha256=446Hfn6SDnma1WYz2O3snM2vKFn1y4MXIKbAs-rAh3s,49132
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=fp1uAPhRHOh5yeFtR8NbrpyJFpM-IJ8PsxzTMvSqvnk,69316
24
- sqlglot/dialects/clickhouse.py,sha256=OuaDWpvVrHCF9N-u3ZmHZUCs7DSKq_aaRt8yOh2CtaY,58301
25
- sqlglot/dialects/databricks.py,sha256=761qPlGOFHa9V8mdQYNAEw0pv4HUJYMkGEuFsdsLC7s,4714
26
- sqlglot/dialects/dialect.py,sha256=02W-j8nYJduA78_BMxMTMGXv2i9mcAGAmXBt1YsH0CQ,73055
27
- sqlglot/dialects/doris.py,sha256=NvDGHIKGJDVp0b4oOnMu1fyAprJPOiC8J6M85V75iuU,25136
28
- sqlglot/dialects/dremio.py,sha256=D2YwjqbTjJ8VZ94GQs7GBRCKUiizwggcEaR_drKpnoc,8242
23
+ sqlglot/dialects/bigquery.py,sha256=IO5u1sdT0wzl76_z3FVm8FgtVnnMBrFPab-HhxuxROs,72078
24
+ sqlglot/dialects/clickhouse.py,sha256=YLY8s7oCfdCoD0X2iOIltivXXjtT_nJdb3931P0TDeU,58553
25
+ sqlglot/dialects/databricks.py,sha256=H4QTq7gg6tJylKc_YWsGp6049KydoI_wlQUHM7iCJtI,4753
26
+ sqlglot/dialects/dialect.py,sha256=MFP2WHesP-wf2HXub8s0_XyeUnjXCk8QNcqn5AIhARw,73361
27
+ sqlglot/dialects/doris.py,sha256=CFnF955Oav3IjZWA80ickOI8tPpCjxk7BN5R4Z6pA1U,25263
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=vCIjZV9lszyXt-hNylVyUdHHlD_F9zsYznzcZLaqGDg,52241
31
+ sqlglot/dialects/duckdb.py,sha256=ANzn5L5KS5pe9hn81Ta_4h5ngdPxMS1k_LdMuYGiff8,52470
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=4Sng2ZhQSaf6eK3ituR9DqDZERaVwYS_UfdpusjsISg,10220
35
- sqlglot/dialects/hive.py,sha256=bAZz0qnaOH9f5FyIMkqBu3XB2Cj7y-xnCPbxPsk8U9I,31959
35
+ sqlglot/dialects/hive.py,sha256=zFr6WmNZXw5C0m3nFc9ynrbzk8Wtb5gyzmJ0tPlMge8,32014
36
36
  sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
37
- sqlglot/dialects/mysql.py,sha256=tQHedJthtXdjgHi3cDfdt71kJ4w6ju6J8kD4_MYFwyE,47308
38
- sqlglot/dialects/oracle.py,sha256=DpckKjR3FauVmXDIDaNTFqJE0KzXnW4sUlnZjQC8z0Y,15735
39
- sqlglot/dialects/postgres.py,sha256=RAwAhrp_Gbz5Oi8OEuLcmHKnYXydvczYexd81Co0N9Y,33901
37
+ sqlglot/dialects/mysql.py,sha256=pAIWuwvirUrFbJE06UiST9iyiA4-IkA1sGiMgkeo1DY,47884
38
+ sqlglot/dialects/oracle.py,sha256=zWPCpzGiTlgCJ5E6FjfX3Rszjcw4SnHg6xeVboMYIyo,15972
39
+ sqlglot/dialects/postgres.py,sha256=NsaNBKUrqzb3bjVi16IBlYi8FPJnHRTl46lQX1GDNzw,33849
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
42
  sqlglot/dialects/redshift.py,sha256=_sQTom4CGozFDZXW9y6bHQcZ-KiQ7QJjjQqM5rVagSc,15889
43
43
  sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
44
- sqlglot/dialects/singlestore.py,sha256=YxBHLKOyinFbXSZ720XDzgA7g9KrI5aAnjEl0JBA01w,49592
45
- sqlglot/dialects/snowflake.py,sha256=QvsWQzhabC6zG7QfrBBVc_Dv6E70-xAwTjMg5ExrPeM,70572
46
- sqlglot/dialects/spark.py,sha256=5dKMb9cGl0GMreEyFfjClvW1Cwm1JEx3W-hFnxjqW8E,9362
44
+ sqlglot/dialects/singlestore.py,sha256=_42yJP-YYbHswIBCKO5qxP5Z_AVksLh3bMX394iivwQ,55764
45
+ sqlglot/dialects/snowflake.py,sha256=xIftl1twnug9C-MW-jUncKskKVOwds3jpBvCDFmp5kM,72084
46
+ sqlglot/dialects/spark.py,sha256=PzyhkelDzbCMgJ3RVHD6yyzLIFp9NdZfwVas5IymowM,10147
47
47
  sqlglot/dialects/spark2.py,sha256=qz36FT9k4iuiqboRpyG4VpKGkPR0P2fifmqgZ9gNUEU,14851
48
48
  sqlglot/dialects/sqlite.py,sha256=UIQ66shIt2bQoLd7tYG4NVzh4HwCfERgAaLyukz8HjE,13231
49
49
  sqlglot/dialects/starrocks.py,sha256=2gav0PSNgRdAGXzawdznZliBpglJoQ0wBxPI7ZIMsRw,11314
@@ -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=EweCIUeb9iDuv3Lo0iYHCrqva4G31CwCfrOg_N3IV_8,43936
74
+ sqlglot/optimizer/qualify_columns.py,sha256=LUlHSSyKshgWIhn4es2PzR1iAvMoSkwHY2t8h07Y32I,45037
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.11.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
- sqlglot-27.11.0.dist-info/METADATA,sha256=GoUJQsTzum00ctJVKTRCOnO1d19dqBDV7ptg1MKksWE,20682
81
- sqlglot-27.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.11.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.11.0.dist-info/RECORD,,
79
+ sqlglot-27.13.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
+ sqlglot-27.13.0.dist-info/METADATA,sha256=4SxxpIW6OjBvvVK7v-l1ZTZkrygK-UJ4K6YEh7qEe_Y,20682
81
+ sqlglot-27.13.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
+ sqlglot-27.13.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
+ sqlglot-27.13.0.dist-info/RECORD,,