sqlglot 27.3.1__py3-none-any.whl → 27.4.1__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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '27.3.1'
21
- __version_tuple__ = version_tuple = (27, 3, 1)
20
+ __version__ = version = '27.4.1'
21
+ __version_tuple__ = version_tuple = (27, 4, 1)
@@ -365,6 +365,33 @@ def _annotate_concat(self: TypeAnnotator, expression: exp.Concat) -> exp.Concat:
365
365
  return annotated
366
366
 
367
367
 
368
+ def _annotate_array(self: TypeAnnotator, expression: exp.Array) -> exp.Array:
369
+ array_args = expression.expressions
370
+
371
+ # BigQuery behaves as follows:
372
+ #
373
+ # SELECT t, TYPEOF(t) FROM (SELECT 'foo') AS t -- foo, STRUCT<STRING>
374
+ # SELECT ARRAY(SELECT 'foo'), TYPEOF(ARRAY(SELECT 'foo')) -- foo, ARRAY<STRING>
375
+ if (
376
+ len(array_args) == 1
377
+ and isinstance(select := array_args[0].unnest(), exp.Select)
378
+ and (query_type := select.meta.get("query_type")) is not None
379
+ and query_type.is_type(exp.DataType.Type.STRUCT)
380
+ and len(query_type.expressions) == 1
381
+ and isinstance(col_def := query_type.expressions[0], exp.ColumnDef)
382
+ and (projection_type := col_def.kind) is not None
383
+ and not projection_type.is_type(exp.DataType.Type.UNKNOWN)
384
+ ):
385
+ array_type = exp.DataType(
386
+ this=exp.DataType.Type.ARRAY,
387
+ expressions=[projection_type.copy()],
388
+ nested=True,
389
+ )
390
+ return self._annotate_with_type(expression, array_type)
391
+
392
+ return self._annotate_by_args(expression, "expressions", array=True)
393
+
394
+
368
395
  class BigQuery(Dialect):
369
396
  WEEK_OFFSET = -1
370
397
  UNNEST_COLUMN_ONLY = True
@@ -445,6 +472,7 @@ class BigQuery(Dialect):
445
472
  exp.Substring,
446
473
  )
447
474
  },
475
+ exp.Array: _annotate_array,
448
476
  exp.ArrayConcat: lambda self, e: self._annotate_by_args(e, "this", "expressions"),
449
477
  exp.Ascii: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
450
478
  exp.BitwiseAndAgg: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
@@ -13,6 +13,12 @@ from sqlglot.generator import unsupported_args
13
13
  from sqlglot.tokens import TokenType
14
14
 
15
15
 
16
+ def _sha2_sql(self: Exasol.Generator, expression: exp.SHA2) -> str:
17
+ length = expression.text("length")
18
+ func_name = "HASH_SHA256" if length == "256" else "HASH_SHA512"
19
+ return self.func(func_name, expression.this)
20
+
21
+
16
22
  class Exasol(Dialect):
17
23
  TIME_MAPPING = {
18
24
  "yyyy": "%Y",
@@ -59,6 +65,10 @@ class Exasol(Dialect):
59
65
  "BIT_RSHIFT": binary_from_function(exp.BitwiseRightShift),
60
66
  "EVERY": lambda args: exp.All(this=seq_get(args, 0)),
61
67
  "EDIT_DISTANCE": exp.Levenshtein.from_arg_list,
68
+ "HASH_SHA": exp.SHA.from_arg_list,
69
+ "HASH_SHA1": exp.SHA.from_arg_list,
70
+ "HASH_MD5": exp.MD5.from_arg_list,
71
+ "HASHTYPE_MD5": exp.MD5Digest.from_arg_list,
62
72
  "REGEXP_REPLACE": lambda args: exp.RegexpReplace(
63
73
  this=seq_get(args, 0),
64
74
  expression=seq_get(args, 1),
@@ -66,6 +76,12 @@ class Exasol(Dialect):
66
76
  position=seq_get(args, 3),
67
77
  occurrence=seq_get(args, 4),
68
78
  ),
79
+ "HASH_SHA256": lambda args: exp.SHA2(
80
+ this=seq_get(args, 0), length=exp.Literal.number(256)
81
+ ),
82
+ "HASH_SHA512": lambda args: exp.SHA2(
83
+ this=seq_get(args, 0), length=exp.Literal.number(512)
84
+ ),
69
85
  "VAR_POP": exp.VariancePop.from_arg_list,
70
86
  "APPROXIMATE_COUNT_DISTINCT": exp.ApproxDistinct.from_arg_list,
71
87
  "TO_CHAR": build_formatted_time(exp.ToChar, "exasol"),
@@ -173,6 +189,14 @@ class Exasol(Dialect):
173
189
  self, e, func_name="INSTR", supports_position=True, supports_occurrence=True
174
190
  )
175
191
  ),
192
+ # https://docs.exasol.com/db/latest/sql_references/functions/alphabeticallistfunctions/hash_sha%5B1%5D.htm#HASH_SHA%5B1%5D
193
+ exp.SHA: rename_func("HASH_SHA"),
194
+ # https://docs.exasol.com/db/latest/sql_references/functions/alphabeticallistfunctions/hash_sha256.htm
195
+ # https://docs.exasol.com/db/latest/sql_references/functions/alphabeticallistfunctions/hash_sha512.htm
196
+ exp.SHA2: _sha2_sql,
197
+ exp.MD5: rename_func("HASH_MD5"),
198
+ # https://docs.exasol.com/db/latest/sql_references/functions/alphabeticallistfunctions/hashtype_md5.htm
199
+ exp.MD5Digest: rename_func("HASHTYPE_MD5"),
176
200
  # https://docs.exasol.com/db/latest/sql/create_view.htm
177
201
  exp.CommentColumnConstraint: lambda self, e: f"COMMENT IS {self.sql(e, 'this')}",
178
202
  }
@@ -1673,3 +1673,17 @@ class Snowflake(Dialect):
1673
1673
  to=exp.DataType(this=exp.DataType.Type.DATE),
1674
1674
  )
1675
1675
  return self.sql(expr)
1676
+
1677
+ def dot_sql(self, expression: exp.Dot) -> str:
1678
+ this = expression.this
1679
+
1680
+ if not this.type:
1681
+ from sqlglot.optimizer.annotate_types import annotate_types
1682
+
1683
+ this = annotate_types(this, dialect=self.dialect)
1684
+
1685
+ if not isinstance(this, exp.Dot) and this.is_type(exp.DataType.Type.STRUCT):
1686
+ # Generate colon notation for the top level STRUCT
1687
+ return f"{self.sql(this)}:{self.sql(expression, 'expression')}"
1688
+
1689
+ return super().dot_sql(expression)
@@ -96,7 +96,12 @@ class SQLite(Dialect):
96
96
 
97
97
  NESTED_COMMENTS = False
98
98
 
99
- KEYWORDS = tokens.Tokenizer.KEYWORDS.copy()
99
+ KEYWORDS = {
100
+ **tokens.Tokenizer.KEYWORDS,
101
+ "ATTACH": TokenType.ATTACH,
102
+ "DETACH": TokenType.DETACH,
103
+ }
104
+
100
105
  KEYWORDS.pop("/*+")
101
106
 
102
107
  COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE}
@@ -114,6 +119,12 @@ class SQLite(Dialect):
114
119
  "TIME": lambda args: exp.Anonymous(this="TIME", expressions=args),
115
120
  }
116
121
 
122
+ STATEMENT_PARSERS = {
123
+ **parser.Parser.STATEMENT_PARSERS,
124
+ TokenType.ATTACH: lambda self: self._parse_attach_detach(),
125
+ TokenType.DETACH: lambda self: self._parse_attach_detach(is_attach=False),
126
+ }
127
+
117
128
  def _parse_unique(self) -> exp.UniqueColumnConstraint:
118
129
  # Do not consume more tokens if UNIQUE is used as a standalone constraint, e.g:
119
130
  # CREATE TABLE foo (bar TEXT UNIQUE REFERENCES baz ...)
@@ -122,6 +133,16 @@ class SQLite(Dialect):
122
133
 
123
134
  return super()._parse_unique()
124
135
 
136
+ def _parse_attach_detach(self, is_attach=True) -> exp.Attach | exp.Detach:
137
+ self._match(TokenType.DATABASE)
138
+ this = self._parse_expression()
139
+
140
+ return (
141
+ self.expression(exp.Attach, this=this)
142
+ if is_attach
143
+ else self.expression(exp.Detach, this=this)
144
+ )
145
+
125
146
  class Generator(generator.Generator):
126
147
  JOIN_HINTS = False
127
148
  TABLE_HINTS = False
sqlglot/expressions.py CHANGED
@@ -4942,7 +4942,7 @@ class AddConstraint(Expression):
4942
4942
 
4943
4943
 
4944
4944
  class AddPartition(Expression):
4945
- arg_types = {"this": True, "exists": False}
4945
+ arg_types = {"this": True, "exists": False, "location": False}
4946
4946
 
4947
4947
 
4948
4948
  class AttachOption(Expression):
sqlglot/generator.py CHANGED
@@ -3549,7 +3549,9 @@ class Generator(metaclass=_Generator):
3549
3549
 
3550
3550
  def addpartition_sql(self, expression: exp.AddPartition) -> str:
3551
3551
  exists = "IF NOT EXISTS " if expression.args.get("exists") else ""
3552
- return f"ADD {exists}{self.sql(expression.this)}"
3552
+ location = self.sql(expression, "location")
3553
+ location = f" {location}" if location else ""
3554
+ return f"ADD {exists}{self.sql(expression.this)}{location}"
3553
3555
 
3554
3556
  def distinct_sql(self, expression: exp.Distinct) -> str:
3555
3557
  this = self.expressions(expression, flat=True)
@@ -313,9 +313,11 @@ class TypeAnnotator(metaclass=_TypeAnnotator):
313
313
  elif (
314
314
  isinstance(source, Scope)
315
315
  and isinstance(source.expression, exp.Query)
316
- and source.expression.is_type(exp.DataType.Type.STRUCT)
316
+ and (
317
+ source.expression.meta.get("query_type") or exp.DataType.build("UNKNOWN")
318
+ ).is_type(exp.DataType.Type.STRUCT)
317
319
  ):
318
- self._set_type(table_column, source.expression.type)
320
+ self._set_type(table_column, source.expression.meta["query_type"])
319
321
 
320
322
  # Then (possibly) annotate the remaining expressions in the scope
321
323
  self._maybe_annotate(scope.expression)
@@ -335,7 +337,10 @@ class TypeAnnotator(metaclass=_TypeAnnotator):
335
337
  for cd in struct_type.expressions
336
338
  if cd.kind
337
339
  ):
338
- self._set_type(scope.expression, struct_type)
340
+ # We don't use `_set_type` on purpose here. If we annotated the query directly, then
341
+ # using it in other contexts (e.g., ARRAY(<query>)) could result in incorrect type
342
+ # annotations, i.e., it shouldn't be interpreted as a STRUCT value.
343
+ scope.expression.meta["query_type"] = struct_type
339
344
 
340
345
  def _maybe_annotate(self, expression: E) -> E:
341
346
  if id(expression) in self._visited:
@@ -79,7 +79,8 @@ def normalize(expression):
79
79
  if join.kind == "CROSS":
80
80
  join.set("on", None)
81
81
  else:
82
- join.set("kind", None)
82
+ if join.kind in ("INNER", "OUTER"):
83
+ join.set("kind", None)
83
84
 
84
85
  if not join.args.get("on") and not join.args.get("using"):
85
86
  join.set("on", exp.true())
sqlglot/parser.py CHANGED
@@ -7394,7 +7394,11 @@ class Parser(metaclass=_Parser):
7394
7394
  exists = self._parse_exists(not_=True)
7395
7395
  if self._match_pair(TokenType.PARTITION, TokenType.L_PAREN, advance=False):
7396
7396
  return self.expression(
7397
- exp.AddPartition, exists=exists, this=self._parse_field(any_token=True)
7397
+ exp.AddPartition,
7398
+ exists=exists,
7399
+ this=self._parse_field(any_token=True),
7400
+ location=self._match_text_seq("LOCATION", advance=False)
7401
+ and self._parse_property(),
7398
7402
  )
7399
7403
 
7400
7404
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.3.1
3
+ Version: 27.4.1
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License: MIT License
@@ -1,15 +1,15 @@
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=yx0o7K0mJ3egOdO3iPTUmVRNy9BAvaId65-1Swt-3Og,513
4
+ sqlglot/_version.py,sha256=jOZXO_b65dIa3g-RaYPPvo31yJxPamFz_P4zbdxLZ2o,513
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=tf6BKT4mcn67ozGt4ADdUSagBXcy6l_w13ZBG3zEFBI,246103
8
- sqlglot/generator.py,sha256=mPTgK0auLfKKn0oIgBlgqc71w1YiTs8tFD9TaAtOfiM,216742
7
+ sqlglot/expressions.py,sha256=Q52dXK5i-R4jtqHd2-Tj533GiOHxATrPxot68oV7Vfc,246122
8
+ sqlglot/generator.py,sha256=6SXy3-2Lnn1UGPTe6aMKzeNJxU7mZwJaQcrBLHCVL_c,216858
9
9
  sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
10
10
  sqlglot/jsonpath.py,sha256=jneO-A57n4ojVT2drCn2HBlx_Ka8wLcGpemW1JgvbjA,7666
11
11
  sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
12
- sqlglot/parser.py,sha256=ie7EHO5I82tJR2KYKPMLHkheVH7cZgJzgXhgHAk_E9k,326755
12
+ sqlglot/parser.py,sha256=LpUn9mCDkYfJPjzNRx9vHKl0tfYzhWSbCn_76yybbvY,326921
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
@@ -20,7 +20,7 @@ sqlglot/transforms.py,sha256=s96QMtR7rJbcLAU1I_IF1xLNxno6yvEbhERgbS5xmJ4,41164
20
20
  sqlglot/trie.py,sha256=v27uXMrHfqrXlJ6GmeTSMovsB_3o0ctnlKhdNt7W6fI,2245
21
21
  sqlglot/dialects/__init__.py,sha256=BQUv9EuMmvhP_wVitGLo0PlCi15atvfXgvREpsTsxeQ,3799
22
22
  sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
23
- sqlglot/dialects/bigquery.py,sha256=qCwbwz8Z7f3_TUKuoB1SDXceY-lVpuUxiZKEs1C9bWo,55292
23
+ sqlglot/dialects/bigquery.py,sha256=iNadAdOITTTaOcEwhL735BRNPoxtGG207L9fX7CR6zY,56446
24
24
  sqlglot/dialects/clickhouse.py,sha256=UY1hFC83RMO2bum1UFfGBey_wmKPBKlsWD5nxbrqeyg,57000
25
25
  sqlglot/dialects/databricks.py,sha256=mJN2lFpqgH95x3mtry3qWbuRf4q7NV5jbRAOspqclzY,4548
26
26
  sqlglot/dialects/dialect.py,sha256=O8fYmv1iFEfmXa1mUwEZ7GgPsfG51_VuHSv8E_zOw0k,71039
@@ -30,7 +30,7 @@ sqlglot/dialects/drill.py,sha256=FOh7_KjPx_77pv0DiHKZog0CcmzqeF9_PEmGnJ1ESSM,582
30
30
  sqlglot/dialects/druid.py,sha256=kh3snZtneehNOWqs3XcPjsrhNaRbkCQ8E4hHbWJ1fHM,690
31
31
  sqlglot/dialects/duckdb.py,sha256=MUGm1cqpWHBrQBefwPXq2F96G-Tthshcp97hGhVt4Bs,51376
32
32
  sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
33
- sqlglot/dialects/exasol.py,sha256=tyzDOyuff0c2gdlmWGMqBgDVHnsfhdUU2qsPLNm-L64,8770
33
+ sqlglot/dialects/exasol.py,sha256=imRzqWpgcQK0E5WrBTSy3JvTYs9zgkD3TC5Qbe4Hb7Y,10127
34
34
  sqlglot/dialects/fabric.py,sha256=4Sng2ZhQSaf6eK3ituR9DqDZERaVwYS_UfdpusjsISg,10220
35
35
  sqlglot/dialects/hive.py,sha256=bAZz0qnaOH9f5FyIMkqBu3XB2Cj7y-xnCPbxPsk8U9I,31959
36
36
  sqlglot/dialects/materialize.py,sha256=_DPLPt8YrdQIIXNrGJw1IMcGOoAEJ9NO9X9pDfy4hxs,3494
@@ -42,10 +42,10 @@ sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
42
42
  sqlglot/dialects/redshift.py,sha256=PAet4ka9JWyZImRl_b4qucgDGMrMlUt_pqry3XxZc1w,15783
43
43
  sqlglot/dialects/risingwave.py,sha256=fEB3ySAcF2N1UjwD_JjcOkRu3F6DQ852XBrwava-CjY,3250
44
44
  sqlglot/dialects/singlestore.py,sha256=S_NRGnHrzyDh5J8_NUs5fKACB7BL7t5SnkZ_0l0Cf0E,102
45
- sqlglot/dialects/snowflake.py,sha256=NzOIqncuHhHCDBYoj6k2NqEtbFso3CEDhw-929M06E4,70255
45
+ sqlglot/dialects/snowflake.py,sha256=PuAvhs6dhDg3Dwnygi6OBy9cxp7My2ZUH0j27eWnM8E,70805
46
46
  sqlglot/dialects/spark.py,sha256=hTumyd46Cc3HEl9KvlTla2eq_NKBI3w5Jis3FeMt_R8,8886
47
47
  sqlglot/dialects/spark2.py,sha256=aCwPqLduLRSUSPtbI1VtBjydK6haKgEy3iahmueGRo4,14742
48
- sqlglot/dialects/sqlite.py,sha256=fwqmopeuoupD_2dh2q6rT3UFxWtFHkskZ1OXAYnPT9Q,12483
48
+ sqlglot/dialects/sqlite.py,sha256=XIDmiNTswWcrDwlFm8gOODCrJ_rPmXQKkm9U_-YAlVs,13183
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=qdV3wqh5NOOjGph5rj5qBXBSNDvCm4ByP0sonmurklc,15873
@@ -57,7 +57,7 @@ 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=Ndfdvc0OO07DCCFuryK1tHkX9ydS-dMxKPgaZU0knWY,24619
60
+ sqlglot/optimizer/annotate_types.py,sha256=mEhUmD6CBZ1HIgYJMvfMTIivoB-6nKHiDAvoktobocM,25025
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=5Whliegc7U8BnS6tlrl9wkeAgyP1NpgCCAPxChHzFfw,5874
@@ -66,7 +66,7 @@ sqlglot/optimizer/isolate_table_selects.py,sha256=_8rIKVMoL7eY3rrJsmgIdTRvfmBSLU
66
66
  sqlglot/optimizer/merge_subqueries.py,sha256=lg6Is78nUM2MbqbRjE6xapgErIO-5pteBE74Qh3z4Zk,15211
67
67
  sqlglot/optimizer/normalize.py,sha256=wu3GeKY36PLyAb9f534jDDfzDwvZJpZ8g_H5QH6acZQ,6667
68
68
  sqlglot/optimizer/normalize_identifiers.py,sha256=uD4xICJAgj0X7EFc2LYcDWxAW2aTHANO2wy7kfn9gfY,2098
69
- sqlglot/optimizer/optimize_joins.py,sha256=LLBH6Zk0Uegsff48soJgJqhpGXkQx5VstGEt40vsjrg,2991
69
+ sqlglot/optimizer/optimize_joins.py,sha256=tfEnTqBofveBXNKJ30GIvm2lyagAuD24bMNfu3iQi_k,3043
70
70
  sqlglot/optimizer/optimizer.py,sha256=vXEXDWHvbO-vJmSI7UqJuydM2WrD1xko7rETq2EtVJo,3533
71
71
  sqlglot/optimizer/pushdown_predicates.py,sha256=HGjs3Z4V3-X2d1VTfWhyByY3aL5SmKnVvt3aDXiiBM0,8414
72
72
  sqlglot/optimizer/pushdown_projections.py,sha256=7NoK5NAUVYVhs0YnYyo6WuXfaO-BShSwS6lA8Y-ATQ4,6668
@@ -76,8 +76,8 @@ sqlglot/optimizer/qualify_tables.py,sha256=rRo0rXMMDAloG_ut7nGPtIO3e__ooM2PqShxW
76
76
  sqlglot/optimizer/scope.py,sha256=HI3TZ4VWTgM6_x8k5ClA0lA0xidaKv4xgn8iGERJRjk,30824
77
77
  sqlglot/optimizer/simplify.py,sha256=-_yus42OYwqjQ9a2TSGhtG2G0pSkInUry1z7hEMz2pY,51062
78
78
  sqlglot/optimizer/unnest_subqueries.py,sha256=kzWUVDlxs8z9nmRx-8U-pHXPtVZhEIwkKqmKhr2QLvc,10908
79
- sqlglot-27.3.1.dist-info/licenses/LICENSE,sha256=AI3__mHZfOtzY3EluR_pIYBm3_pE7TbVx7qaHxoZ114,1065
80
- sqlglot-27.3.1.dist-info/METADATA,sha256=CquitatysuUWeuNeSMwjhPbhfMi52CuIOXH8XKwDMgI,20731
81
- sqlglot-27.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.3.1.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.3.1.dist-info/RECORD,,
79
+ sqlglot-27.4.1.dist-info/licenses/LICENSE,sha256=AI3__mHZfOtzY3EluR_pIYBm3_pE7TbVx7qaHxoZ114,1065
80
+ sqlglot-27.4.1.dist-info/METADATA,sha256=QgRU7ePRB-jDv1RMJMz1ey_5cK8TZqrmeJ5XKosvD7o,20731
81
+ sqlglot-27.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
+ sqlglot-27.4.1.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
+ sqlglot-27.4.1.dist-info/RECORD,,