sqlglot 27.17.0__py3-none-any.whl → 27.18.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/_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.17.0'
32
- __version_tuple__ = version_tuple = (27, 17, 0)
31
+ __version__ = version = '27.18.0'
32
+ __version_tuple__ = version_tuple = (27, 18, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -88,6 +88,7 @@ DIALECTS = [
88
88
  "RisingWave",
89
89
  "SingleStore",
90
90
  "Snowflake",
91
+ "Solr",
91
92
  "Spark",
92
93
  "Spark2",
93
94
  "SQLite",
@@ -99,6 +99,7 @@ class Dialects(str, Enum):
99
99
  REDSHIFT = "redshift"
100
100
  RISINGWAVE = "risingwave"
101
101
  SNOWFLAKE = "snowflake"
102
+ SOLR = "solr"
102
103
  SPARK = "spark"
103
104
  SPARK2 = "spark2"
104
105
  SQLITE = "sqlite"
@@ -291,6 +292,12 @@ class _Dialect(type):
291
292
  TokenType.SEMI,
292
293
  }
293
294
 
295
+ klass.VALID_INTERVAL_UNITS = {
296
+ *klass.VALID_INTERVAL_UNITS,
297
+ *klass.DATE_PART_MAPPING.keys(),
298
+ *klass.DATE_PART_MAPPING.values(),
299
+ }
300
+
294
301
  return klass
295
302
 
296
303
 
@@ -551,6 +558,8 @@ class Dialect(metaclass=_Dialect):
551
558
  IDENTIFIER_START = '"'
552
559
  IDENTIFIER_END = '"'
553
560
 
561
+ VALID_INTERVAL_UNITS: t.Set[str] = set()
562
+
554
563
  # Delimiters for bit, hex, byte and unicode literals
555
564
  BIT_START: t.Optional[str] = None
556
565
  BIT_END: t.Optional[str] = None
sqlglot/dialects/mysql.py CHANGED
@@ -179,6 +179,21 @@ class MySQL(Dialect):
179
179
  "%W": "%A",
180
180
  }
181
181
 
182
+ VALID_INTERVAL_UNITS = {
183
+ *Dialect.VALID_INTERVAL_UNITS,
184
+ "SECOND_MICROSECOND",
185
+ "MINUTE_MICROSECOND",
186
+ "MINUTE_SECOND",
187
+ "HOUR_MICROSECOND",
188
+ "HOUR_SECOND",
189
+ "HOUR_MINUTE",
190
+ "DAY_MICROSECOND",
191
+ "DAY_SECOND",
192
+ "DAY_MINUTE",
193
+ "DAY_HOUR",
194
+ "YEAR_MONTH",
195
+ }
196
+
182
197
  class Tokenizer(tokens.Tokenizer):
183
198
  QUOTES = ["'", '"']
184
199
  COMMENTS = ["--", "#", ("/*", "*/")]
@@ -535,17 +535,20 @@ class Snowflake(Dialect):
535
535
  exp.Length,
536
536
  exp.BitLength,
537
537
  exp.Levenshtein,
538
+ exp.JarowinklerSimilarity,
538
539
  },
539
540
  exp.DataType.Type.VARCHAR: {
540
541
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.VARCHAR],
541
542
  exp.Base64DecodeString,
542
543
  exp.Base64Encode,
544
+ exp.DecompressString,
543
545
  exp.MD5,
544
546
  exp.AIAgg,
545
547
  exp.AIClassify,
546
548
  exp.AISummarizeAgg,
547
549
  exp.Chr,
548
550
  exp.Collate,
551
+ exp.Collation,
549
552
  exp.HexDecodeString,
550
553
  exp.HexEncode,
551
554
  exp.Initcap,
@@ -562,6 +565,7 @@ class Snowflake(Dialect):
562
565
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.BINARY],
563
566
  exp.Base64DecodeBinary,
564
567
  exp.Compress,
568
+ exp.DecompressBinary,
565
569
  exp.MD5Digest,
566
570
  exp.SHA1Digest,
567
571
  exp.SHA2Digest,
@@ -588,7 +592,9 @@ class Snowflake(Dialect):
588
592
  expr_type: lambda self, e: self._annotate_by_args(e, "this")
589
593
  for expr_type in (
590
594
  exp.Left,
595
+ exp.Pad,
591
596
  exp.Right,
597
+ exp.Stuff,
592
598
  exp.Substring,
593
599
  )
594
600
  },
@@ -1503,13 +1509,23 @@ class Snowflake(Dialect):
1503
1509
 
1504
1510
  def datatype_sql(self, expression: exp.DataType) -> str:
1505
1511
  expressions = expression.expressions
1506
- if (
1507
- expressions
1508
- and expression.is_type(*exp.DataType.STRUCT_TYPES)
1509
- and any(isinstance(field_type, exp.DataType) for field_type in expressions)
1510
- ):
1511
- # The correct syntax is OBJECT [ (<key> <value_type [NOT NULL] [, ...]) ]
1512
- return "OBJECT"
1512
+ if expressions and expression.is_type(*exp.DataType.STRUCT_TYPES):
1513
+ for field_type in expressions:
1514
+ # The correct syntax is OBJECT [ (<key> <value_type [NOT NULL] [, ...]) ]
1515
+ if isinstance(field_type, exp.DataType):
1516
+ return "OBJECT"
1517
+ if (
1518
+ isinstance(field_type, exp.ColumnDef)
1519
+ and field_type.this
1520
+ and field_type.this.is_string
1521
+ ):
1522
+ # Doing OBJECT('foo' VARCHAR) is invalid snowflake Syntax. Moreover, besides
1523
+ # converting 'foo' into an identifier, we also need to quote it because these
1524
+ # keys are case-sensitive. For example:
1525
+ #
1526
+ # WITH t AS (SELECT OBJECT_CONSTRUCT('x', 'y') AS c) SELECT c:x FROM t -- correct
1527
+ # WITH t AS (SELECT OBJECT_CONSTRUCT('x', 'y') AS c) SELECT c:X FROM t -- incorrect, returns NULL
1528
+ field_type.this.replace(exp.to_identifier(field_type.name, quoted=True))
1513
1529
 
1514
1530
  return super().datatype_sql(expression)
1515
1531
 
@@ -0,0 +1,22 @@
1
+ from sqlglot import exp, parser, tokens
2
+ from sqlglot.dialects.dialect import Dialect, NormalizationStrategy
3
+ from sqlglot.tokens import TokenType
4
+
5
+
6
+ # https://solr.apache.org/guide/solr/latest/query-guide/sql-query.html
7
+
8
+
9
+ class Solr(Dialect):
10
+ NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE
11
+ DPIPE_IS_STRING_CONCAT = False
12
+ SUPPORTS_SEMI_ANTI_JOIN = False
13
+
14
+ class Parser(parser.Parser):
15
+ DISJUNCTION = {
16
+ **parser.Parser.DISJUNCTION,
17
+ TokenType.DPIPE: exp.Or,
18
+ }
19
+
20
+ class Tokenizer(tokens.Tokenizer):
21
+ QUOTES = ["'"]
22
+ IDENTIFIERS = ["`"]
sqlglot/expressions.py CHANGED
@@ -5531,6 +5531,10 @@ class EuclideanDistance(Func):
5531
5531
  arg_types = {"this": True, "expression": True}
5532
5532
 
5533
5533
 
5534
+ class JarowinklerSimilarity(Func):
5535
+ arg_types = {"this": True, "expression": True}
5536
+
5537
+
5534
5538
  class AggFunc(Func):
5535
5539
  pass
5536
5540
 
@@ -6022,6 +6026,10 @@ class Collate(Binary, Func):
6022
6026
  pass
6023
6027
 
6024
6028
 
6029
+ class Collation(Func):
6030
+ pass
6031
+
6032
+
6025
6033
  class Ceil(Func):
6026
6034
  arg_types = {"this": True, "decimals": False, "to": False}
6027
6035
  _sql_names = ["CEIL", "CEILING"]
@@ -6483,6 +6491,7 @@ class HexDecodeString(Func):
6483
6491
  pass
6484
6492
 
6485
6493
 
6494
+ # https://docs.snowflake.com/en/sql-reference/functions/hex_encode
6486
6495
  class HexEncode(Func):
6487
6496
  arg_types = {"this": True, "case": False}
6488
6497
 
@@ -6493,6 +6502,16 @@ class Compress(Func):
6493
6502
  arg_types = {"this": True, "method": False}
6494
6503
 
6495
6504
 
6505
+ # Snowflake: https://docs.snowflake.com/en/sql-reference/functions/decompress_binary
6506
+ class DecompressBinary(Func):
6507
+ arg_types = {"this": True, "method": True}
6508
+
6509
+
6510
+ # Snowflake: https://docs.snowflake.com/en/sql-reference/functions/decompress_string
6511
+ class DecompressString(Func):
6512
+ arg_types = {"this": True, "method": True}
6513
+
6514
+
6496
6515
  class LowerHex(Hex):
6497
6516
  pass
6498
6517
 
@@ -1588,7 +1588,7 @@ class Gen:
1588
1588
  kvs = []
1589
1589
  arg_types = list(node.arg_types)[arg_index:] if arg_index else node.arg_types
1590
1590
 
1591
- for k in arg_types or arg_types:
1591
+ for k in arg_types:
1592
1592
  v = node.args.get(k)
1593
1593
 
1594
1594
  if v is not None:
sqlglot/parser.py CHANGED
@@ -3123,21 +3123,26 @@ class Parser(metaclass=_Parser):
3123
3123
  )
3124
3124
 
3125
3125
  def _parse_update(self) -> exp.Update:
3126
- this = self._parse_table(joins=True, alias_tokens=self.UPDATE_ALIAS_TOKENS)
3127
- expressions = self._match(TokenType.SET) and self._parse_csv(self._parse_equality)
3128
- returning = self._parse_returning()
3129
- return self.expression(
3130
- exp.Update,
3131
- **{ # type: ignore
3132
- "this": this,
3133
- "expressions": expressions,
3134
- "from": self._parse_from(joins=True),
3135
- "where": self._parse_where(),
3136
- "returning": returning or self._parse_returning(),
3137
- "order": self._parse_order(),
3138
- "limit": self._parse_limit(),
3139
- },
3140
- )
3126
+ kwargs: t.Dict[str, t.Any] = {
3127
+ "this": self._parse_table(joins=True, alias_tokens=self.UPDATE_ALIAS_TOKENS),
3128
+ }
3129
+ while self._curr:
3130
+ if self._match(TokenType.SET):
3131
+ kwargs["expressions"] = self._parse_csv(self._parse_equality)
3132
+ elif self._match(TokenType.RETURNING, advance=False):
3133
+ kwargs["returning"] = self._parse_returning()
3134
+ elif self._match(TokenType.FROM, advance=False):
3135
+ kwargs["from"] = self._parse_from(joins=True)
3136
+ elif self._match(TokenType.WHERE, advance=False):
3137
+ kwargs["where"] = self._parse_where()
3138
+ elif self._match(TokenType.ORDER_BY, advance=False):
3139
+ kwargs["order"] = self._parse_order()
3140
+ elif self._match(TokenType.LIMIT, advance=False):
3141
+ kwargs["limit"] = self._parse_limit()
3142
+ else:
3143
+ break
3144
+
3145
+ return self.expression(exp.Update, **kwargs)
3141
3146
 
3142
3147
  def _parse_use(self) -> exp.Use:
3143
3148
  return self.expression(
@@ -4240,9 +4245,11 @@ class Parser(metaclass=_Parser):
4240
4245
  )
4241
4246
 
4242
4247
  def _parse_unnest(self, with_alias: bool = True) -> t.Optional[exp.Unnest]:
4243
- if not self._match(TokenType.UNNEST):
4248
+ if not self._match_pair(TokenType.UNNEST, TokenType.L_PAREN, advance=False):
4244
4249
  return None
4245
4250
 
4251
+ self._advance()
4252
+
4246
4253
  expressions = self._parse_wrapped_csv(self._parse_equality)
4247
4254
  offset = self._match_pair(TokenType.WITH, TokenType.ORDINALITY)
4248
4255
 
@@ -5104,7 +5111,8 @@ class Parser(metaclass=_Parser):
5104
5111
  isinstance(this, exp.Column)
5105
5112
  and not this.table
5106
5113
  and not this.this.quoted
5107
- and this.name.upper() in ("IS", "ROWS")
5114
+ and self._curr
5115
+ and self._curr.text.upper() not in self.dialect.VALID_INTERVAL_UNITS
5108
5116
  ):
5109
5117
  self._retreat(index)
5110
5118
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.17.0
3
+ Version: 27.18.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
@@ -39,7 +39,7 @@ Dynamic: provides-extra
39
39
 
40
40
  ![SQLGlot logo](sqlglot.png)
41
41
 
42
- SQLGlot is a no-dependency SQL parser, transpiler, optimizer, and engine. It can be used to format SQL or translate between [30 different dialects](https://github.com/tobymao/sqlglot/blob/main/sqlglot/dialects/__init__.py) like [DuckDB](https://duckdb.org/), [Presto](https://prestodb.io/) / [Trino](https://trino.io/), [Spark](https://spark.apache.org/) / [Databricks](https://www.databricks.com/), [Snowflake](https://www.snowflake.com/en/), and [BigQuery](https://cloud.google.com/bigquery/). It aims to read a wide variety of SQL inputs and output syntactically and semantically correct SQL in the targeted dialects.
42
+ SQLGlot is a no-dependency SQL parser, transpiler, optimizer, and engine. It can be used to format SQL or translate between [31 different dialects](https://github.com/tobymao/sqlglot/blob/main/sqlglot/dialects/__init__.py) like [DuckDB](https://duckdb.org/), [Presto](https://prestodb.io/) / [Trino](https://trino.io/), [Spark](https://spark.apache.org/) / [Databricks](https://www.databricks.com/), [Snowflake](https://www.snowflake.com/en/), and [BigQuery](https://cloud.google.com/bigquery/). It aims to read a wide variety of SQL inputs and output syntactically and semantically correct SQL in the targeted dialects.
43
43
 
44
44
  It is a very comprehensive generic SQL parser with a robust [test suite](https://github.com/tobymao/sqlglot/blob/main/tests/). It is also quite [performant](#benchmarks), while being written purely in Python.
45
45
 
@@ -613,6 +613,7 @@ x + interval '1' month
613
613
  | RisingWave | Community |
614
614
  | SingleStore | Community |
615
615
  | Snowflake | Official |
616
+ | Solr | Community |
616
617
  | Spark | Official |
617
618
  | SQLite | Official |
618
619
  | StarRocks | Official |
@@ -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=RQW_jRqTjxNrqe9v5PCSBGQGoLKZnnPnQlpUKXMTiY8,708
4
+ sqlglot/_version.py,sha256=7UxZQRE12m08A5rXKriqghWBW14eGYzdfIFlvSEPOcI,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=CXkTw8G84YP32iuWBAaRsGEg7MUTlvsDUgE7IF_pKgY,257541
7
+ sqlglot/expressions.py,sha256=KEMqwokmUV8udKzoUAQlkjZJXV-FkwAJLmSOIpGt4_k,258058
8
8
  sqlglot/generator.py,sha256=ZHFzi6_EOJl5V-dnz71QJOIwtxj66oJdF6tUQoxBpck,226436
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=-zOjkGkInw1Bu-OnrVPlhLP0VDJPCTKlgqxuEpS9IXk,336855
12
+ sqlglot/parser.py,sha256=wlw73WjzXAHC9AH7Ezkfyeh134P97HheLPueCgXk4Mc,337292
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
@@ -18,12 +18,12 @@ sqlglot/time.py,sha256=Q62gv6kL40OiRBF6BMESxKJcMVn7ZLNw7sv8H34z5FI,18400
18
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
- sqlglot/dialects/__init__.py,sha256=e3K2NHrZO7oXfBzEpRsvgWAgJ_UCEyg7SlUCRqvnPj4,3799
21
+ sqlglot/dialects/__init__.py,sha256=g3HRtyb32r3LooiHKTzuUNB0_rBO_RauuOegp42gB48,3811
22
22
  sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
23
23
  sqlglot/dialects/bigquery.py,sha256=9Q-oCXcpa2vrT2eMgVGHWwEvECMm4RQeV1XkjJj0nPA,72483
24
24
  sqlglot/dialects/clickhouse.py,sha256=6kx1cm0YhtHbg5kvcY64Hau2KdeC7Y26SVlVHGLyPEA,58579
25
25
  sqlglot/dialects/databricks.py,sha256=H4QTq7gg6tJylKc_YWsGp6049KydoI_wlQUHM7iCJtI,4753
26
- sqlglot/dialects/dialect.py,sha256=BU4-x1d8tRCSAfdpeP5b86me0wXfgpcEPdyk27wLgg4,73293
26
+ sqlglot/dialects/dialect.py,sha256=KfBctpr7VdrCdHrP1Tk7CqAml53tRq9x-aDAkaN-9l0,73540
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
@@ -34,7 +34,7 @@ sqlglot/dialects/exasol.py,sha256=ay3g_VyT5WvHTgNyJuCQu0nBt4bpllLZ9IdMBizEgYM,15
34
34
  sqlglot/dialects/fabric.py,sha256=BdkvzM8s-m5DIdBwdjEYskp32ub7aHCAex_xlhQn92I,10222
35
35
  sqlglot/dialects/hive.py,sha256=UGIkXjMCk5a9ndUXQtvfG560oi3emdpqOYLQCmGabBk,32046
36
36
  sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
37
- sqlglot/dialects/mysql.py,sha256=0s7RIpWPCaBYvxgR8Z6JWPub1BHBB_0Th7KHCIXVfms,49702
37
+ sqlglot/dialects/mysql.py,sha256=xxVAR-pXMljYCUioavP3nROtOqKmK4kfdp4WWXX7X9g,50049
38
38
  sqlglot/dialects/oracle.py,sha256=zWPCpzGiTlgCJ5E6FjfX3Rszjcw4SnHg6xeVboMYIyo,15972
39
39
  sqlglot/dialects/postgres.py,sha256=_pXSu29684utgeuzPziSJ0Sw54WEIIunwLugJw7KFD8,34853
40
40
  sqlglot/dialects/presto.py,sha256=XVeYr2NP86x5enlRqI7MYR6le85_ucYg_BBRocGN3jM,33413
@@ -42,7 +42,8 @@ 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=JK7FursV_ZdHU0UolaZFOy4TtEFqHTySZa1zxocCUww,77433
45
+ sqlglot/dialects/snowflake.py,sha256=RqCEW6nMXlkJ-XqS3W4HA-ZPSQTHv_bc_CMBTmvZJOk,78425
46
+ sqlglot/dialects/solr.py,sha256=pydnl4ml-3M1Fc4ALm6cMVO9h-5EtqZxPZH_91Nz1Ss,617
46
47
  sqlglot/dialects/spark.py,sha256=PzyhkelDzbCMgJ3RVHD6yyzLIFp9NdZfwVas5IymowM,10147
47
48
  sqlglot/dialects/spark2.py,sha256=qz36FT9k4iuiqboRpyG4VpKGkPR0P2fifmqgZ9gNUEU,14851
48
49
  sqlglot/dialects/sqlite.py,sha256=zzXEbnaLjJeg6hPLHricjpfSkuf8tpXECnjcHtoqIbw,13263
@@ -74,10 +75,10 @@ sqlglot/optimizer/qualify.py,sha256=oAPfwub7dEkrlCrsptcJWpLya4BgKhN6M5SwIs_86LY,
74
75
  sqlglot/optimizer/qualify_columns.py,sha256=7aabZhD-dKNiwIW_ZjOEr0RPbWfhSbuR-WI6NnVCZAA,45298
75
76
  sqlglot/optimizer/qualify_tables.py,sha256=dA4ZazL7ShQh2JgBwpHuG-4c5lBw1TNzCnuN7m0iVTA,6645
76
77
  sqlglot/optimizer/scope.py,sha256=UOTrbwqcTc5iRQf0WStgYWXpE24w6riZy-tJYA18yTw,31229
77
- sqlglot/optimizer/simplify.py,sha256=-_yus42OYwqjQ9a2TSGhtG2G0pSkInUry1z7hEMz2pY,51062
78
+ sqlglot/optimizer/simplify.py,sha256=27IYsqbz1kyMlURSfRkm_ADSQJg-4805AOMFOjKKytU,51049
78
79
  sqlglot/optimizer/unnest_subqueries.py,sha256=kzWUVDlxs8z9nmRx-8U-pHXPtVZhEIwkKqmKhr2QLvc,10908
79
- sqlglot-27.17.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
- sqlglot-27.17.0.dist-info/METADATA,sha256=XAZqZw1-AFuV3rTul6kbEoI8BzcX6_QnF1rChBhRyzQ,20682
81
- sqlglot-27.17.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.17.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.17.0.dist-info/RECORD,,
80
+ sqlglot-27.18.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
81
+ sqlglot-27.18.0.dist-info/METADATA,sha256=UxjiFljC-bu1PB4zuYgt_3aWXJu36fhzoq05oQnH8jU,20703
82
+ sqlglot-27.18.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
83
+ sqlglot-27.18.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
84
+ sqlglot-27.18.0.dist-info/RECORD,,