Merging upstream version 26.0.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
27e05888f9
commit
ae1eb339f9
57 changed files with 26226 additions and 25977 deletions
2
.github/workflows/python-package.yml
vendored
2
.github/workflows/python-package.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
|
|
2
.github/workflows/python-publish.yml
vendored
2
.github/workflows/python-publish.yml
vendored
|
@ -56,7 +56,7 @@ jobs:
|
|||
uses: PyO3/maturin-action@v1
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
args: --release --out dist --interpreter 3.7 3.8 3.9 3.10 3.11 3.12
|
||||
args: --release --out dist --interpreter 3.7 3.8 3.9 3.10 3.11 3.12 3.13
|
||||
sccache: 'true'
|
||||
manylinux: auto
|
||||
working-directory: ./sqlglotrs
|
||||
|
|
36
CHANGELOG.md
36
CHANGELOG.md
|
@ -1,6 +1,40 @@
|
|||
Changelog
|
||||
=========
|
||||
|
||||
## [v25.34.1] - 2024-12-10
|
||||
### :boom: BREAKING CHANGES
|
||||
- due to [`f70f124`](https://github.com/tobymao/sqlglot/commit/f70f12408fbaf021dd105f2eac957b9e6fac045d) - transpile MySQL FORMAT to DuckDB *(PR [#4488](https://github.com/tobymao/sqlglot/pull/4488) by [@georgesittas](https://github.com/georgesittas))*:
|
||||
|
||||
transpile MySQL FORMAT to DuckDB (#4488)
|
||||
|
||||
|
||||
### :sparkles: New Features
|
||||
- [`f70f124`](https://github.com/tobymao/sqlglot/commit/f70f12408fbaf021dd105f2eac957b9e6fac045d) - transpile MySQL FORMAT to DuckDB *(PR [#4488](https://github.com/tobymao/sqlglot/pull/4488) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- :arrow_lower_right: *addresses issue [#4445](https://github.com/tobymao/sqlglot/issues/4445) opened by [@fanyang01](https://github.com/fanyang01)*
|
||||
- [`5a276f3`](https://github.com/tobymao/sqlglot/commit/5a276f33df48dab96e77c560c4b193f9634974f7) - add parse into tuple *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
### :wrench: Chores
|
||||
- [`ddf7483`](https://github.com/tobymao/sqlglot/commit/ddf74833c3e033067e731eab387db658a9a803be) - enable python 3.13 in CI *(PR [#4483](https://github.com/tobymao/sqlglot/pull/4483) by [@simon-pactum](https://github.com/simon-pactum))*
|
||||
|
||||
|
||||
## [v25.34.0] - 2024-12-06
|
||||
### :boom: BREAKING CHANGES
|
||||
- due to [`41c6d24`](https://github.com/tobymao/sqlglot/commit/41c6d24c99e130b3c8e35e348a25a59e9e3d5553) - Alias expanded USING STRUCT fields *(PR [#4474](https://github.com/tobymao/sqlglot/pull/4474) by [@VaggelisD](https://github.com/VaggelisD))*:
|
||||
|
||||
Alias expanded USING STRUCT fields (#4474)
|
||||
|
||||
|
||||
### :sparkles: New Features
|
||||
- [`41c6d24`](https://github.com/tobymao/sqlglot/commit/41c6d24c99e130b3c8e35e348a25a59e9e3d5553) - **optimizer**: Alias expanded USING STRUCT fields *(PR [#4474](https://github.com/tobymao/sqlglot/pull/4474) by [@VaggelisD](https://github.com/VaggelisD))*
|
||||
- :arrow_lower_right: *addresses issue [#3465](https://github.com/TobikoData/sqlmesh/issues/3465) opened by [@esciara](https://github.com/esciara)*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`a34bcde`](https://github.com/tobymao/sqlglot/commit/a34bcde1f7b4b2974a0132555477fa5a788126b4) - **bigquery**: properly consume dashed table parts *(PR [#4477](https://github.com/tobymao/sqlglot/pull/4477) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- :arrow_lower_right: *fixes issue [#4476](https://github.com/tobymao/sqlglot/issues/4476) opened by [@matthewcyy](https://github.com/matthewcyy)*
|
||||
- [`438ae4c`](https://github.com/tobymao/sqlglot/commit/438ae4c0691fb3ad43ef95e613118a116cb7924c) - **bigquery**: Do not generate NULL ordering on Windows *(PR [#4480](https://github.com/tobymao/sqlglot/pull/4480) by [@VaggelisD](https://github.com/VaggelisD))*
|
||||
- :arrow_lower_right: *fixes issue [#4478](https://github.com/tobymao/sqlglot/issues/4478) opened by [@goldmedal](https://github.com/goldmedal)*
|
||||
|
||||
|
||||
## [v25.33.0] - 2024-12-04
|
||||
### :boom: BREAKING CHANGES
|
||||
- due to [`07fa69d`](https://github.com/tobymao/sqlglot/commit/07fa69dcb8970167ba0c55fff39175ab856ea9f3) - Make TIMESTAMP map to Type.TIMESTAMPTZ *(PR [#4451](https://github.com/tobymao/sqlglot/pull/4451) by [@VaggelisD](https://github.com/VaggelisD))*:
|
||||
|
@ -5412,3 +5446,5 @@ Changelog
|
|||
[v25.32.0]: https://github.com/tobymao/sqlglot/compare/v25.31.4...v25.32.0
|
||||
[v25.32.1]: https://github.com/tobymao/sqlglot/compare/v25.32.0...v25.32.1
|
||||
[v25.33.0]: https://github.com/tobymao/sqlglot/compare/v25.32.1...v25.33.0
|
||||
[v25.34.0]: https://github.com/tobymao/sqlglot/compare/v25.33.0...v25.34.0
|
||||
[v25.34.1]: https://github.com/tobymao/sqlglot/compare/v25.34.0...v25.34.1
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -76,8 +76,8 @@
|
|||
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'25.33.0'</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'25.34.1'</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -97,7 +97,7 @@
|
|||
<section id="version">
|
||||
<div class="attr variable">
|
||||
<span class="name">version</span><span class="annotation">: str</span> =
|
||||
<span class="default_value">'25.33.0'</span>
|
||||
<span class="default_value">'25.34.1'</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -109,7 +109,7 @@
|
|||
<section id="version_tuple">
|
||||
<div class="attr variable">
|
||||
<span class="name">version_tuple</span><span class="annotation">: object</span> =
|
||||
<span class="default_value">(25, 33, 0)</span>
|
||||
<span class="default_value">(25, 34, 1)</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -59705,7 +59705,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div id="DataType.STRUCT_TYPES" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">STRUCT_TYPES</span> =
|
||||
<span class="default_value">{<Type.NESTED: 'NESTED'>, <Type.OBJECT: 'OBJECT'>, <Type.UNION: 'UNION'>, <Type.STRUCT: 'STRUCT'>}</span>
|
||||
<span class="default_value">{<Type.UNION: 'UNION'>, <Type.NESTED: 'NESTED'>, <Type.STRUCT: 'STRUCT'>, <Type.OBJECT: 'OBJECT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59717,7 +59717,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div id="DataType.ARRAY_TYPES" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">ARRAY_TYPES</span> =
|
||||
<span class="default_value">{<Type.LIST: 'LIST'>, <Type.ARRAY: 'ARRAY'>}</span>
|
||||
<span class="default_value">{<Type.ARRAY: 'ARRAY'>, <Type.LIST: 'LIST'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59730,7 +59730,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">NESTED_TYPES</span> =
|
||||
<input id="DataType.NESTED_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.NESTED_TYPES-view-value"></label><span class="default_value">{<Type.LIST: 'LIST'>, <Type.OBJECT: 'OBJECT'>, <Type.UNION: 'UNION'>, <Type.STRUCT: 'STRUCT'>, <Type.NESTED: 'NESTED'>, <Type.ARRAY: 'ARRAY'>, <Type.MAP: 'MAP'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.NESTED_TYPES-view-value"></label><span class="default_value">{<Type.STRUCT: 'STRUCT'>, <Type.MAP: 'MAP'>, <Type.ARRAY: 'ARRAY'>, <Type.UNION: 'UNION'>, <Type.NESTED: 'NESTED'>, <Type.LIST: 'LIST'>, <Type.OBJECT: 'OBJECT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59743,7 +59743,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">TEXT_TYPES</span> =
|
||||
<input id="DataType.TEXT_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.TEXT_TYPES-view-value"></label><span class="default_value">{<Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.CHAR: 'CHAR'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.TEXT_TYPES-view-value"></label><span class="default_value">{<Type.VARCHAR: 'VARCHAR'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NAME: 'NAME'>, <Type.NCHAR: 'NCHAR'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59756,7 +59756,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">SIGNED_INTEGER_TYPES</span> =
|
||||
<input id="DataType.SIGNED_INTEGER_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.SIGNED_INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.INT: 'INT'>, <Type.BIGINT: 'BIGINT'>, <Type.INT256: 'INT256'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.INT128: 'INT128'>, <Type.SMALLINT: 'SMALLINT'>, <Type.TINYINT: 'TINYINT'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.SIGNED_INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.INT256: 'INT256'>, <Type.BIGINT: 'BIGINT'>, <Type.INT: 'INT'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.INT128: 'INT128'>, <Type.TINYINT: 'TINYINT'>, <Type.SMALLINT: 'SMALLINT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59769,7 +59769,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">UNSIGNED_INTEGER_TYPES</span> =
|
||||
<input id="DataType.UNSIGNED_INTEGER_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.UNSIGNED_INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.UBIGINT: 'UBIGINT'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.UINT128: 'UINT128'>, <Type.UINT256: 'UINT256'>, <Type.USMALLINT: 'USMALLINT'>, <Type.UINT: 'UINT'>, <Type.UTINYINT: 'UTINYINT'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.UNSIGNED_INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.UTINYINT: 'UTINYINT'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.UINT256: 'UINT256'>, <Type.UINT: 'UINT'>, <Type.UINT128: 'UINT128'>, <Type.USMALLINT: 'USMALLINT'>, <Type.UBIGINT: 'UBIGINT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59782,7 +59782,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">INTEGER_TYPES</span> =
|
||||
<input id="DataType.INTEGER_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.UBIGINT: 'UBIGINT'>, <Type.INT: 'INT'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.BIGINT: 'BIGINT'>, <Type.UINT128: 'UINT128'>, <Type.UINT256: 'UINT256'>, <Type.USMALLINT: 'USMALLINT'>, <Type.INT256: 'INT256'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.UINT: 'UINT'>, <Type.INT128: 'INT128'>, <Type.SMALLINT: 'SMALLINT'>, <Type.TINYINT: 'TINYINT'>, <Type.UTINYINT: 'UTINYINT'>, <Type.BIT: 'BIT'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.INTEGER_TYPES-view-value"></label><span class="default_value">{<Type.INT256: 'INT256'>, <Type.BIT: 'BIT'>, <Type.BIGINT: 'BIGINT'>, <Type.UTINYINT: 'UTINYINT'>, <Type.UBIGINT: 'UBIGINT'>, <Type.UINT256: 'UINT256'>, <Type.INT: 'INT'>, <Type.UINT: 'UINT'>, <Type.UINT128: 'UINT128'>, <Type.USMALLINT: 'USMALLINT'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.INT128: 'INT128'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.TINYINT: 'TINYINT'>, <Type.SMALLINT: 'SMALLINT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59807,7 +59807,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">REAL_TYPES</span> =
|
||||
<input id="DataType.REAL_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.REAL_TYPES-view-value"></label><span class="default_value">{<Type.DOUBLE: 'DOUBLE'>, <Type.MONEY: 'MONEY'>, <Type.DECIMAL32: 'DECIMAL32'>, <Type.DECIMAL128: 'DECIMAL128'>, <Type.FLOAT: 'FLOAT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.BIGDECIMAL: 'BIGDECIMAL'>, <Type.DECIMAL256: 'DECIMAL256'>, <Type.SMALLMONEY: 'SMALLMONEY'>, <Type.DECIMAL64: 'DECIMAL64'>, <Type.UDECIMAL: 'UDECIMAL'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.REAL_TYPES-view-value"></label><span class="default_value">{<Type.DECIMAL128: 'DECIMAL128'>, <Type.MONEY: 'MONEY'>, <Type.DECIMAL256: 'DECIMAL256'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DECIMAL32: 'DECIMAL32'>, <Type.DECIMAL64: 'DECIMAL64'>, <Type.SMALLMONEY: 'SMALLMONEY'>, <Type.FLOAT: 'FLOAT'>, <Type.UDECIMAL: 'UDECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.BIGDECIMAL: 'BIGDECIMAL'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59820,7 +59820,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">NUMERIC_TYPES</span> =
|
||||
<input id="DataType.NUMERIC_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.NUMERIC_TYPES-view-value"></label><span class="default_value">{<Type.UBIGINT: 'UBIGINT'>, <Type.INT: 'INT'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.UINT128: 'UINT128'>, <Type.FLOAT: 'FLOAT'>, <Type.UINT: 'UINT'>, <Type.TINYINT: 'TINYINT'>, <Type.UDECIMAL: 'UDECIMAL'>, <Type.DECIMAL64: 'DECIMAL64'>, <Type.BIGINT: 'BIGINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.UINT256: 'UINT256'>, <Type.MONEY: 'MONEY'>, <Type.DECIMAL32: 'DECIMAL32'>, <Type.DECIMAL128: 'DECIMAL128'>, <Type.USMALLINT: 'USMALLINT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.INT256: 'INT256'>, <Type.BIGDECIMAL: 'BIGDECIMAL'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.DECIMAL256: 'DECIMAL256'>, <Type.UTINYINT: 'UTINYINT'>, <Type.INT128: 'INT128'>, <Type.SMALLINT: 'SMALLINT'>, <Type.SMALLMONEY: 'SMALLMONEY'>, <Type.BIT: 'BIT'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.NUMERIC_TYPES-view-value"></label><span class="default_value">{<Type.DECIMAL128: 'DECIMAL128'>, <Type.USMALLINT: 'USMALLINT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.UINT256: 'UINT256'>, <Type.DECIMAL64: 'DECIMAL64'>, <Type.SMALLMONEY: 'SMALLMONEY'>, <Type.MEDIUMINT: 'MEDIUMINT'>, <Type.UDECIMAL: 'UDECIMAL'>, <Type.TINYINT: 'TINYINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.BIGDECIMAL: 'BIGDECIMAL'>, <Type.INT256: 'INT256'>, <Type.MONEY: 'MONEY'>, <Type.DECIMAL256: 'DECIMAL256'>, <Type.BIGINT: 'BIGINT'>, <Type.UTINYINT: 'UTINYINT'>, <Type.UMEDIUMINT: 'UMEDIUMINT'>, <Type.DECIMAL32: 'DECIMAL32'>, <Type.INT: 'INT'>, <Type.UINT: 'UINT'>, <Type.FLOAT: 'FLOAT'>, <Type.UINT128: 'UINT128'>, <Type.BIT: 'BIT'>, <Type.INT128: 'INT128'>, <Type.UBIGINT: 'UBIGINT'>, <Type.SMALLINT: 'SMALLINT'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -59833,7 +59833,7 @@ Otherwise, this resets the expressions.</li>
|
|||
<div class="attr variable">
|
||||
<span class="name">TEMPORAL_TYPES</span> =
|
||||
<input id="DataType.TEMPORAL_TYPES-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DataType.TEMPORAL_TYPES-view-value"></label><span class="default_value">{<Type.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <Type.TIMETZ: 'TIMETZ'>, <Type.TIME: 'TIME'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <Type.DATE: 'DATE'>, <Type.DATETIME64: 'DATETIME64'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.DATE32: 'DATE32'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.DATETIME: 'DATETIME'>, <Type.TIMESTAMP_S: 'TIMESTAMP_S'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DataType.TEMPORAL_TYPES-view-value"></label><span class="default_value">{<Type.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <Type.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <Type.DATETIME64: 'DATETIME64'>, <Type.TIME: 'TIME'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.TIMESTAMP_S: 'TIMESTAMP_S'>, <Type.DATE32: 'DATE32'>, <Type.DATE: 'DATE'>, <Type.TIMETZ: 'TIMETZ'>, <Type.DATETIME: 'DATETIME'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1920,7 +1920,7 @@ belong to some totally-ordered set.</p>
|
|||
<section id="DATE_UNITS">
|
||||
<div class="attr variable">
|
||||
<span class="name">DATE_UNITS</span> =
|
||||
<span class="default_value">{'quarter', 'day', 'year', 'year_month', 'month', 'week'}</span>
|
||||
<span class="default_value">{'quarter', 'year', 'year_month', 'month', 'week', 'day'}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -640,7 +640,7 @@
|
|||
<div class="attr variable">
|
||||
<span class="name">ALL_JSON_PATH_PARTS</span> =
|
||||
<input id="ALL_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="ALL_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>'>, <class '<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>'>, <class '<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>, <class '<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>'>, <class '<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>, <class '<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>'>, <class '<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>'>, <class '<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>'>, <class '<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="ALL_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>'>, <class '<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>, <class '<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>'>, <class '<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>'>, <class '<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>'>, <class '<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>'>, <class '<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>'>, <class '<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>'>, <class '<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -581,7 +581,7 @@ queries if it would result in multiple table selects in a single query:</p>
|
|||
<div class="attr variable">
|
||||
<span class="name">UNMERGABLE_ARGS</span> =
|
||||
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'qualify', 'prewhere', 'windows', 'options', 'operation_modifiers', 'settings', 'match', 'with', 'pivots', 'locks', 'having', 'sample', 'format', 'limit', 'distribute', 'sort', 'connect', 'kind', 'group', 'offset', 'distinct', 'into', 'laterals', 'cluster'}</span>
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'locks', 'sample', 'options', 'match', 'laterals', 'into', 'limit', 'windows', 'kind', 'operation_modifiers', 'pivots', 'distinct', 'prewhere', 'having', 'connect', 'offset', 'qualify', 'cluster', 'group', 'settings', 'with', 'format', 'sort', 'distribute'}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3231,7 +3231,7 @@ prefix are statically known.</p>
|
|||
<div class="attr variable">
|
||||
<span class="name">DATETRUNC_COMPARISONS</span> =
|
||||
<input id="DATETRUNC_COMPARISONS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>'>, <class '<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>'>, <class '<a href="../expressions.html#GT">sqlglot.expressions.GT</a>'>, <class '<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>'>, <class '<a href="../expressions.html#LT">sqlglot.expressions.LT</a>'>, <class '<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>'>, <class '<a href="../expressions.html#In">sqlglot.expressions.In</a>'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>'>, <class '<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>'>, <class '<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>'>, <class '<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>'>, <class '<a href="../expressions.html#In">sqlglot.expressions.In</a>'>, <class '<a href="../expressions.html#GT">sqlglot.expressions.GT</a>'>, <class '<a href="../expressions.html#LT">sqlglot.expressions.LT</a>'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -3315,7 +3315,7 @@ prefix are statically known.</p>
|
|||
<section id="JOINS">
|
||||
<div class="attr variable">
|
||||
<span class="name">JOINS</span> =
|
||||
<span class="default_value">{('RIGHT', ''), ('', 'INNER'), ('RIGHT', 'OUTER'), ('', '')}</span>
|
||||
<span class="default_value">{('', ''), ('RIGHT', 'OUTER'), ('RIGHT', ''), ('', 'INNER')}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
27780
docs/sqlglot/parser.html
27780
docs/sqlglot/parser.html
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -9164,7 +9164,7 @@
|
|||
<div class="attr variable">
|
||||
<span class="name">TOKENS_PRECEDING_HINT</span> =
|
||||
<input id="Tokenizer.TOKENS_PRECEDING_HINT-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.TOKENS_PRECEDING_HINT-view-value"></label><span class="default_value">{<<a href="#TokenType.INSERT">TokenType.INSERT</a>: 'INSERT'>, <<a href="#TokenType.UPDATE">TokenType.UPDATE</a>: 'UPDATE'>, <<a href="#TokenType.DELETE">TokenType.DELETE</a>: 'DELETE'>, <<a href="#TokenType.SELECT">TokenType.SELECT</a>: 'SELECT'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.TOKENS_PRECEDING_HINT-view-value"></label><span class="default_value">{<<a href="#TokenType.INSERT">TokenType.INSERT</a>: 'INSERT'>, <<a href="#TokenType.UPDATE">TokenType.UPDATE</a>: 'UPDATE'>, <<a href="#TokenType.SELECT">TokenType.SELECT</a>: 'SELECT'>, <<a href="#TokenType.DELETE">TokenType.DELETE</a>: 'DELETE'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -9203,7 +9203,7 @@
|
|||
<div class="attr variable">
|
||||
<span class="name">COMMANDS</span> =
|
||||
<input id="Tokenizer.COMMANDS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.RENAME">TokenType.RENAME</a>: 'RENAME'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>, <<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>, <<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>, <<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.RENAME">TokenType.RENAME</a>: 'RENAME'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -884,6 +884,8 @@ class ClickHouse(Dialect):
|
|||
exp.DataType.Type.BIGINT: "Int64",
|
||||
exp.DataType.Type.DATE32: "Date32",
|
||||
exp.DataType.Type.DATETIME: "DateTime",
|
||||
exp.DataType.Type.DATETIME2: "DateTime",
|
||||
exp.DataType.Type.SMALLDATETIME: "DateTime",
|
||||
exp.DataType.Type.DATETIME64: "DateTime64",
|
||||
exp.DataType.Type.DECIMAL: "Decimal",
|
||||
exp.DataType.Type.DECIMAL32: "Decimal32",
|
||||
|
|
|
@ -1547,7 +1547,7 @@ def merge_without_target_sql(self: Generator, expression: exp.Merge) -> str:
|
|||
if alias:
|
||||
targets.add(normalize(alias.this))
|
||||
|
||||
for when in expression.expressions:
|
||||
for when in expression.args["whens"].expressions:
|
||||
# only remove the target names from the THEN clause
|
||||
# theyre still valid in the <condition> part of WHEN MATCHED / WHEN NOT MATCHED
|
||||
# ref: https://github.com/TobikoData/sqlmesh/issues/2934
|
||||
|
|
|
@ -297,6 +297,7 @@ class DuckDB(Dialect):
|
|||
return super().to_json_path(path)
|
||||
|
||||
class Tokenizer(tokens.Tokenizer):
|
||||
BYTE_STRINGS = [("e'", "'"), ("E'", "'")]
|
||||
HEREDOC_STRINGS = ["$"]
|
||||
|
||||
HEREDOC_TAG_IS_IDENTIFIER = True
|
||||
|
@ -1021,3 +1022,12 @@ class DuckDB(Dialect):
|
|||
return self.func(
|
||||
"REGEXP_EXTRACT", expression.this, expression.expression, group, params
|
||||
)
|
||||
|
||||
@unsupported_args("culture")
|
||||
def numbertostr_sql(self, expression: exp.NumberToStr) -> str:
|
||||
fmt = expression.args.get("format")
|
||||
if fmt and fmt.is_int:
|
||||
return self.func("FORMAT", f"'{{:,.{fmt.name}f}}'", expression.this)
|
||||
|
||||
self.unsupported("Only integer formats are supported by NumberToStr")
|
||||
return self.function_fallback_sql(expression)
|
||||
|
|
|
@ -307,6 +307,7 @@ class MySQL(Dialect):
|
|||
"DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||
"DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||
"DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||
"FORMAT": exp.NumberToStr.from_arg_list,
|
||||
"FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"),
|
||||
"ISNULL": isnull_to_is_null,
|
||||
"LOCATE": locate_to_strposition,
|
||||
|
@ -735,6 +736,7 @@ class MySQL(Dialect):
|
|||
exp.Month: _remove_ts_or_ds_to_date(),
|
||||
exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"),
|
||||
exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}",
|
||||
exp.NumberToStr: rename_func("FORMAT"),
|
||||
exp.Pivot: no_pivot_sql,
|
||||
exp.Select: transforms.preprocess(
|
||||
[
|
||||
|
@ -786,6 +788,8 @@ class MySQL(Dialect):
|
|||
}
|
||||
|
||||
TIMESTAMP_TYPE_MAPPING = {
|
||||
exp.DataType.Type.DATETIME2: "DATETIME",
|
||||
exp.DataType.Type.SMALLDATETIME: "DATETIME",
|
||||
exp.DataType.Type.TIMESTAMP: "DATETIME",
|
||||
exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP",
|
||||
exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP",
|
||||
|
|
|
@ -107,6 +107,13 @@ def _build_date_time_add(expr_type: t.Type[E]) -> t.Callable[[t.List], E]:
|
|||
return _builder
|
||||
|
||||
|
||||
def _build_bitor(args: t.List) -> exp.BitwiseOr | exp.Anonymous:
|
||||
if len(args) == 3:
|
||||
return exp.Anonymous(this="BITOR", expressions=args)
|
||||
|
||||
return binary_from_function(exp.BitwiseOr)(args)
|
||||
|
||||
|
||||
# https://docs.snowflake.com/en/sql-reference/functions/div0
|
||||
def _build_if_from_div0(args: t.List) -> exp.If:
|
||||
lhs = exp._wrap(seq_get(args, 0), exp.Binary)
|
||||
|
@ -393,6 +400,8 @@ class Snowflake(Dialect):
|
|||
),
|
||||
"BITXOR": binary_from_function(exp.BitwiseXor),
|
||||
"BIT_XOR": binary_from_function(exp.BitwiseXor),
|
||||
"BITOR": _build_bitor,
|
||||
"BIT_OR": _build_bitor,
|
||||
"BOOLXOR": binary_from_function(exp.Xor),
|
||||
"DATE": _build_datetime("DATE", exp.DataType.Type.DATE),
|
||||
"DATE_TRUNC": _date_trunc_to_time,
|
||||
|
@ -790,6 +799,14 @@ class Snowflake(Dialect):
|
|||
|
||||
return this
|
||||
|
||||
def _parse_foreign_key(self) -> exp.ForeignKey:
|
||||
# inlineFK, the REFERENCES columns are implied
|
||||
if self._match(TokenType.REFERENCES, advance=False):
|
||||
return self.expression(exp.ForeignKey)
|
||||
|
||||
# outoflineFK, explicitly names the columns
|
||||
return super()._parse_foreign_key()
|
||||
|
||||
class Tokenizer(tokens.Tokenizer):
|
||||
STRING_ESCAPES = ["\\", "'"]
|
||||
HEX_STRINGS = [("x'", "'"), ("X'", "'")]
|
||||
|
@ -869,6 +886,7 @@ class Snowflake(Dialect):
|
|||
"CONVERT_TIMEZONE", e.args.get("zone"), e.this
|
||||
),
|
||||
exp.BitwiseXor: rename_func("BITXOR"),
|
||||
exp.BitwiseOr: rename_func("BITOR"),
|
||||
exp.Create: transforms.preprocess([_flatten_structured_types_unless_iceberg]),
|
||||
exp.DateAdd: date_delta_sql("DATEADD"),
|
||||
exp.DateDiff: date_delta_sql("DATEDIFF"),
|
||||
|
|
|
@ -111,7 +111,7 @@ def _build_formatted_time(
|
|||
assert len(args) == 2
|
||||
|
||||
return exp_class(
|
||||
this=exp.cast(args[1], exp.DataType.Type.DATETIME),
|
||||
this=exp.cast(args[1], exp.DataType.Type.DATETIME2),
|
||||
format=exp.Literal.string(
|
||||
format_time(
|
||||
args[0].name.lower(),
|
||||
|
@ -492,7 +492,7 @@ class TSQL(Dialect):
|
|||
KEYWORDS = {
|
||||
**tokens.Tokenizer.KEYWORDS,
|
||||
"CLUSTERED INDEX": TokenType.INDEX,
|
||||
"DATETIME2": TokenType.DATETIME,
|
||||
"DATETIME2": TokenType.DATETIME2,
|
||||
"DATETIMEOFFSET": TokenType.TIMESTAMPTZ,
|
||||
"DECLARE": TokenType.DECLARE,
|
||||
"EXEC": TokenType.COMMAND,
|
||||
|
@ -507,7 +507,7 @@ class TSQL(Dialect):
|
|||
"PROC": TokenType.PROCEDURE,
|
||||
"REAL": TokenType.FLOAT,
|
||||
"ROWVERSION": TokenType.ROWVERSION,
|
||||
"SMALLDATETIME": TokenType.DATETIME,
|
||||
"SMALLDATETIME": TokenType.SMALLDATETIME,
|
||||
"SMALLMONEY": TokenType.SMALLMONEY,
|
||||
"SQL_VARIANT": TokenType.VARIANT,
|
||||
"SYSTEM_USER": TokenType.CURRENT_USER,
|
||||
|
@ -873,14 +873,15 @@ class TSQL(Dialect):
|
|||
TYPE_MAPPING = {
|
||||
**generator.Generator.TYPE_MAPPING,
|
||||
exp.DataType.Type.BOOLEAN: "BIT",
|
||||
exp.DataType.Type.DATETIME2: "DATETIME2",
|
||||
exp.DataType.Type.DECIMAL: "NUMERIC",
|
||||
exp.DataType.Type.DATETIME: "DATETIME2",
|
||||
exp.DataType.Type.DOUBLE: "FLOAT",
|
||||
exp.DataType.Type.INT: "INTEGER",
|
||||
exp.DataType.Type.ROWVERSION: "ROWVERSION",
|
||||
exp.DataType.Type.TEXT: "VARCHAR(MAX)",
|
||||
exp.DataType.Type.TIMESTAMP: "DATETIME2",
|
||||
exp.DataType.Type.TIMESTAMPTZ: "DATETIMEOFFSET",
|
||||
exp.DataType.Type.SMALLDATETIME: "SMALLDATETIME",
|
||||
exp.DataType.Type.UTINYINT: "TINYINT",
|
||||
exp.DataType.Type.VARIANT: "SQL_VARIANT",
|
||||
}
|
||||
|
|
|
@ -2113,7 +2113,7 @@ class Directory(Expression):
|
|||
|
||||
class ForeignKey(Expression):
|
||||
arg_types = {
|
||||
"expressions": True,
|
||||
"expressions": False,
|
||||
"reference": False,
|
||||
"delete": False,
|
||||
"update": False,
|
||||
|
@ -4347,6 +4347,7 @@ class DataType(Expression):
|
|||
DATEMULTIRANGE = auto()
|
||||
DATERANGE = auto()
|
||||
DATETIME = auto()
|
||||
DATETIME2 = auto()
|
||||
DATETIME64 = auto()
|
||||
DECIMAL = auto()
|
||||
DECIMAL32 = auto()
|
||||
|
@ -4406,6 +4407,7 @@ class DataType(Expression):
|
|||
ROWVERSION = auto()
|
||||
SERIAL = auto()
|
||||
SET = auto()
|
||||
SMALLDATETIME = auto()
|
||||
SMALLINT = auto()
|
||||
SMALLMONEY = auto()
|
||||
SMALLSERIAL = auto()
|
||||
|
@ -4529,7 +4531,9 @@ class DataType(Expression):
|
|||
Type.DATE,
|
||||
Type.DATE32,
|
||||
Type.DATETIME,
|
||||
Type.DATETIME2,
|
||||
Type.DATETIME64,
|
||||
Type.SMALLDATETIME,
|
||||
Type.TIME,
|
||||
Type.TIMESTAMP,
|
||||
Type.TIMESTAMPNTZ,
|
||||
|
@ -6678,16 +6682,22 @@ class Merge(DML):
|
|||
"this": True,
|
||||
"using": True,
|
||||
"on": True,
|
||||
"expressions": True,
|
||||
"whens": True,
|
||||
"with": False,
|
||||
"returning": False,
|
||||
}
|
||||
|
||||
|
||||
class When(Func):
|
||||
class When(Expression):
|
||||
arg_types = {"matched": True, "source": False, "condition": False, "then": True}
|
||||
|
||||
|
||||
class Whens(Expression):
|
||||
"""Wraps around one or more WHEN [NOT] MATCHED [...] clauses."""
|
||||
|
||||
arg_types = {"expressions": True}
|
||||
|
||||
|
||||
# https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljnextvaluefor.html
|
||||
# https://learn.microsoft.com/en-us/sql/t-sql/functions/next-value-for-transact-sql?view=sql-server-ver16
|
||||
class NextValueFor(Func):
|
||||
|
@ -7345,14 +7355,17 @@ def merge(
|
|||
Returns:
|
||||
Merge: The syntax tree for the MERGE statement.
|
||||
"""
|
||||
expressions = []
|
||||
for when_expr in when_exprs:
|
||||
expressions.extend(
|
||||
maybe_parse(when_expr, dialect=dialect, copy=copy, into=Whens, **opts).expressions
|
||||
)
|
||||
|
||||
merge = Merge(
|
||||
this=maybe_parse(into, dialect=dialect, copy=copy, **opts),
|
||||
using=maybe_parse(using, dialect=dialect, copy=copy, **opts),
|
||||
on=maybe_parse(on, dialect=dialect, copy=copy, **opts),
|
||||
expressions=[
|
||||
maybe_parse(when_expr, dialect=dialect, copy=copy, into=When, **opts)
|
||||
for when_expr in when_exprs
|
||||
],
|
||||
whens=Whens(expressions=expressions),
|
||||
)
|
||||
if returning:
|
||||
merge = merge.returning(returning, dialect=dialect, copy=False, **opts)
|
||||
|
|
|
@ -453,6 +453,7 @@ class Generator(metaclass=_Generator):
|
|||
ARRAY_SIZE_DIM_REQUIRED: t.Optional[bool] = None
|
||||
|
||||
TYPE_MAPPING = {
|
||||
exp.DataType.Type.DATETIME2: "TIMESTAMP",
|
||||
exp.DataType.Type.NCHAR: "CHAR",
|
||||
exp.DataType.Type.NVARCHAR: "VARCHAR",
|
||||
exp.DataType.Type.MEDIUMTEXT: "TEXT",
|
||||
|
@ -463,6 +464,7 @@ class Generator(metaclass=_Generator):
|
|||
exp.DataType.Type.TINYBLOB: "BLOB",
|
||||
exp.DataType.Type.INET: "INET",
|
||||
exp.DataType.Type.ROWVERSION: "VARBINARY",
|
||||
exp.DataType.Type.SMALLDATETIME: "TIMESTAMP",
|
||||
}
|
||||
|
||||
TIME_PART_SINGULARS = {
|
||||
|
@ -2829,13 +2831,14 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
def foreignkey_sql(self, expression: exp.ForeignKey) -> str:
|
||||
expressions = self.expressions(expression, flat=True)
|
||||
expressions = f" ({expressions})" if expressions else ""
|
||||
reference = self.sql(expression, "reference")
|
||||
reference = f" {reference}" if reference else ""
|
||||
delete = self.sql(expression, "delete")
|
||||
delete = f" ON DELETE {delete}" if delete else ""
|
||||
update = self.sql(expression, "update")
|
||||
update = f" ON UPDATE {update}" if update else ""
|
||||
return f"FOREIGN KEY ({expressions}){reference}{delete}{update}"
|
||||
return f"FOREIGN KEY{expressions}{reference}{delete}{update}"
|
||||
|
||||
def primarykey_sql(self, expression: exp.ForeignKey) -> str:
|
||||
expressions = self.expressions(expression, flat=True)
|
||||
|
@ -3693,6 +3696,9 @@ class Generator(metaclass=_Generator):
|
|||
then = self.sql(then_expression)
|
||||
return f"WHEN {matched}{source}{condition} THEN {then}"
|
||||
|
||||
def whens_sql(self, expression: exp.Whens) -> str:
|
||||
return self.expressions(expression, sep=" ", indent=False)
|
||||
|
||||
def merge_sql(self, expression: exp.Merge) -> str:
|
||||
table = expression.this
|
||||
table_alias = ""
|
||||
|
@ -3705,16 +3711,17 @@ class Generator(metaclass=_Generator):
|
|||
this = self.sql(table)
|
||||
using = f"USING {self.sql(expression, 'using')}"
|
||||
on = f"ON {self.sql(expression, 'on')}"
|
||||
expressions = self.expressions(expression, sep=" ", indent=False)
|
||||
whens = self.sql(expression, "whens")
|
||||
|
||||
returning = self.sql(expression, "returning")
|
||||
if returning:
|
||||
expressions = f"{expressions}{returning}"
|
||||
whens = f"{whens}{returning}"
|
||||
|
||||
sep = self.sep()
|
||||
|
||||
return self.prepend_ctes(
|
||||
expression,
|
||||
f"MERGE INTO {this}{table_alias}{sep}{using}{sep}{on}{sep}{expressions}",
|
||||
f"MERGE INTO {this}{table_alias}{sep}{using}{sep}{on}{sep}{whens}",
|
||||
)
|
||||
|
||||
@unsupported_args("format")
|
||||
|
@ -4056,7 +4063,7 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
if to.this == exp.DataType.Type.DATE:
|
||||
transformed = exp.StrToDate(this=value, format=fmt)
|
||||
elif to.this == exp.DataType.Type.DATETIME:
|
||||
elif to.this in (exp.DataType.Type.DATETIME, exp.DataType.Type.DATETIME2):
|
||||
transformed = exp.StrToTime(this=value, format=fmt)
|
||||
elif to.this in self.PARAMETERIZABLE_TEXT_TYPES:
|
||||
transformed = cast(this=exp.TimeToStr(this=value, format=fmt), to=to, safe=safe)
|
||||
|
|
|
@ -332,7 +332,9 @@ class Parser(metaclass=_Parser):
|
|||
TokenType.TIMESTAMPLTZ,
|
||||
TokenType.TIMESTAMPNTZ,
|
||||
TokenType.DATETIME,
|
||||
TokenType.DATETIME2,
|
||||
TokenType.DATETIME64,
|
||||
TokenType.SMALLDATETIME,
|
||||
TokenType.DATE,
|
||||
TokenType.DATE32,
|
||||
TokenType.INT4RANGE,
|
||||
|
@ -775,7 +777,8 @@ class Parser(metaclass=_Parser):
|
|||
exp.Sort: lambda self: self._parse_sort(exp.Sort, TokenType.SORT_BY),
|
||||
exp.Table: lambda self: self._parse_table_parts(),
|
||||
exp.TableAlias: lambda self: self._parse_table_alias(),
|
||||
exp.When: lambda self: seq_get(self._parse_when_matched(), 0),
|
||||
exp.Tuple: lambda self: self._parse_value(),
|
||||
exp.Whens: lambda self: self._parse_when_matched(),
|
||||
exp.Where: lambda self: self._parse_where(),
|
||||
exp.Window: lambda self: self._parse_named_window(),
|
||||
exp.With: lambda self: self._parse_with(),
|
||||
|
@ -7007,11 +7010,11 @@ class Parser(metaclass=_Parser):
|
|||
this=target,
|
||||
using=using,
|
||||
on=on,
|
||||
expressions=self._parse_when_matched(),
|
||||
whens=self._parse_when_matched(),
|
||||
returning=self._parse_returning(),
|
||||
)
|
||||
|
||||
def _parse_when_matched(self) -> t.List[exp.When]:
|
||||
def _parse_when_matched(self) -> exp.Whens:
|
||||
whens = []
|
||||
|
||||
while self._match(TokenType.WHEN):
|
||||
|
@ -7060,7 +7063,7 @@ class Parser(metaclass=_Parser):
|
|||
then=then,
|
||||
)
|
||||
)
|
||||
return whens
|
||||
return self.expression(exp.Whens, expressions=whens)
|
||||
|
||||
def _parse_show(self) -> t.Optional[exp.Expression]:
|
||||
parser = self._find_parser(self.SHOW_PARSERS, self.SHOW_TRIE)
|
||||
|
|
|
@ -157,7 +157,9 @@ class TokenType(AutoName):
|
|||
TIMESTAMP_MS = auto()
|
||||
TIMESTAMP_NS = auto()
|
||||
DATETIME = auto()
|
||||
DATETIME2 = auto()
|
||||
DATETIME64 = auto()
|
||||
SMALLDATETIME = auto()
|
||||
DATE = auto()
|
||||
DATE32 = auto()
|
||||
INT4RANGE = auto()
|
||||
|
|
|
@ -899,6 +899,16 @@ class TestDuckDB(Validator):
|
|||
"NOT a ILIKE b",
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"SELECT e'Hello\nworld'",
|
||||
read={
|
||||
"duckdb": "SELECT E'Hello\nworld'",
|
||||
},
|
||||
write={
|
||||
"duckdb": "SELECT e'Hello\nworld'",
|
||||
},
|
||||
)
|
||||
|
||||
def test_array_index(self):
|
||||
with self.assertLogs(helper_logger) as cm:
|
||||
self.validate_all(
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import unittest
|
||||
import sys
|
||||
|
||||
from sqlglot import expressions as exp
|
||||
from sqlglot import UnsupportedError, expressions as exp
|
||||
from sqlglot.dialects.mysql import MySQL
|
||||
from tests.dialects.test_dialect import Validator
|
||||
|
||||
|
@ -1344,3 +1344,33 @@ COMMENT='客户账户表'"""
|
|||
|
||||
for format in ("JSON", "TRADITIONAL", "TREE"):
|
||||
self.validate_identity(f"DESCRIBE FORMAT={format} UPDATE test SET test_col = 'abc'")
|
||||
|
||||
def test_number_format(self):
|
||||
self.validate_all(
|
||||
"SELECT FORMAT(12332.123456, 4)",
|
||||
write={
|
||||
"duckdb": "SELECT FORMAT('{:,.4f}', 12332.123456)",
|
||||
"mysql": "SELECT FORMAT(12332.123456, 4)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT FORMAT(12332.1, 4)",
|
||||
write={
|
||||
"duckdb": "SELECT FORMAT('{:,.4f}', 12332.1)",
|
||||
"mysql": "SELECT FORMAT(12332.1, 4)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT FORMAT(12332.2, 0)",
|
||||
write={
|
||||
"duckdb": "SELECT FORMAT('{:,.0f}', 12332.2)",
|
||||
"mysql": "SELECT FORMAT(12332.2, 0)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT FORMAT(12332.2, 2, 'de_DE')",
|
||||
write={
|
||||
"duckdb": UnsupportedError,
|
||||
"mysql": "SELECT FORMAT(12332.2, 2, 'de_DE')",
|
||||
},
|
||||
)
|
||||
|
|
|
@ -976,6 +976,12 @@ WHERE
|
|||
"snowflake": "EDITDISTANCE(col1, col2, 3)",
|
||||
},
|
||||
)
|
||||
self.validate_identity("SELECT BITOR(a, b) FROM table")
|
||||
|
||||
self.validate_identity("SELECT BIT_OR(a, b) FROM table", "SELECT BITOR(a, b) FROM table")
|
||||
|
||||
# Test BITOR with three arguments, padding on the left
|
||||
self.validate_identity("SELECT BITOR(a, b, 'LEFT') FROM table_name")
|
||||
|
||||
def test_null_treatment(self):
|
||||
self.validate_all(
|
||||
|
@ -1450,6 +1456,9 @@ WHERE
|
|||
self.validate_identity(
|
||||
"""CREATE OR REPLACE FUNCTION ibis_udfs.public.object_values("obj" OBJECT) RETURNS ARRAY LANGUAGE JAVASCRIPT STRICT AS ' return Object.values(obj) '"""
|
||||
)
|
||||
self.validate_identity(
|
||||
"CREATE OR REPLACE TABLE TEST (SOME_REF DECIMAL(38, 0) NOT NULL FOREIGN KEY REFERENCES SOME_OTHER_TABLE (ID))"
|
||||
)
|
||||
self.validate_identity(
|
||||
"CREATE OR REPLACE FUNCTION my_udf(location OBJECT(city VARCHAR, zipcode DECIMAL(38, 0), val ARRAY(BOOLEAN))) RETURNS VARCHAR AS $$ SELECT 'foo' $$",
|
||||
"CREATE OR REPLACE FUNCTION my_udf(location OBJECT(city VARCHAR, zipcode DECIMAL(38, 0), val ARRAY(BOOLEAN))) RETURNS VARCHAR AS ' SELECT \\'foo\\' '",
|
||||
|
|
|
@ -515,16 +515,6 @@ class TestTSQL(Validator):
|
|||
self.validate_identity("CAST(x AS SQL_VARIANT)")
|
||||
self.validate_identity("CAST(x AS BIT)")
|
||||
|
||||
self.validate_all(
|
||||
"CAST(x AS DATETIME2)",
|
||||
read={
|
||||
"": "CAST(x AS DATETIME)",
|
||||
},
|
||||
write={
|
||||
"mysql": "CAST(x AS DATETIME)",
|
||||
"tsql": "CAST(x AS DATETIME2)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"CAST(x AS DATETIME2(6))",
|
||||
write={
|
||||
|
@ -542,6 +532,19 @@ class TestTSQL(Validator):
|
|||
},
|
||||
)
|
||||
|
||||
for temporal_type in ("SMALLDATETIME", "DATETIME", "DATETIME2"):
|
||||
self.validate_all(
|
||||
f"CAST(x AS {temporal_type})",
|
||||
read={
|
||||
"": f"CAST(x AS {temporal_type})",
|
||||
},
|
||||
write={
|
||||
"mysql": "CAST(x AS DATETIME)",
|
||||
"duckdb": "CAST(x AS TIMESTAMP)",
|
||||
"tsql": f"CAST(x AS {temporal_type})",
|
||||
},
|
||||
)
|
||||
|
||||
def test_types_ints(self):
|
||||
self.validate_all(
|
||||
"CAST(X AS INT)",
|
||||
|
@ -750,14 +753,6 @@ class TestTSQL(Validator):
|
|||
},
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"CAST(x as SMALLDATETIME)",
|
||||
write={
|
||||
"spark": "CAST(x AS TIMESTAMP)",
|
||||
"tsql": "CAST(x AS DATETIME2)",
|
||||
},
|
||||
)
|
||||
|
||||
def test_types_bin(self):
|
||||
self.validate_all(
|
||||
"CAST(x as BIT)",
|
||||
|
@ -1094,7 +1089,7 @@ WHERE
|
|||
|
||||
expected_sqls = [
|
||||
"CREATE PROCEDURE [TRANSF].[SP_Merge_Sales_Real] @Loadid INTEGER, @NumberOfRows INTEGER WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION AS BEGIN SET XACT_ABORT ON",
|
||||
"DECLARE @DWH_DateCreated AS DATETIME2 = CONVERT(DATETIME2, GETDATE(), 104)",
|
||||
"DECLARE @DWH_DateCreated AS DATETIME = CONVERT(DATETIME, GETDATE(), 104)",
|
||||
"DECLARE @DWH_DateModified AS DATETIME2 = CONVERT(DATETIME2, GETDATE(), 104)",
|
||||
"DECLARE @DWH_IdUserCreated AS INTEGER = SUSER_ID(CURRENT_USER())",
|
||||
"DECLARE @DWH_IdUserModified AS INTEGER = SUSER_ID(CURRENT_USER())",
|
||||
|
@ -1438,7 +1433,7 @@ WHERE
|
|||
"CONVERT(DATETIME, x, 121)",
|
||||
write={
|
||||
"spark": "TO_TIMESTAMP(x, 'yyyy-MM-dd HH:mm:ss.SSSSSS')",
|
||||
"tsql": "CONVERT(DATETIME2, x, 121)",
|
||||
"tsql": "CONVERT(DATETIME, x, 121)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
|
@ -1899,7 +1894,7 @@ WHERE
|
|||
*
|
||||
FROM OPENJSON(@json) WITH (
|
||||
Number VARCHAR(200) '$.Order.Number',
|
||||
Date DATETIME2 '$.Order.Date',
|
||||
Date DATETIME '$.Order.Date',
|
||||
Customer VARCHAR(200) '$.AccountNumber',
|
||||
Quantity INTEGER '$.Item.Quantity',
|
||||
[Order] NVARCHAR(MAX) AS JSON
|
||||
|
|
|
@ -14,6 +14,10 @@ class TestParser(unittest.TestCase):
|
|||
parse_one("")
|
||||
|
||||
def test_parse_into(self):
|
||||
self.assertIsInstance(parse_one("(1)", into=exp.Tuple), exp.Tuple)
|
||||
self.assertIsInstance(parse_one("(1,)", into=exp.Tuple), exp.Tuple)
|
||||
self.assertIsInstance(parse_one("(x=1)", into=exp.Tuple), exp.Tuple)
|
||||
|
||||
self.assertIsInstance(parse_one("select * from t", into=exp.Select), exp.Select)
|
||||
self.assertIsInstance(parse_one("select * from t limit 5", into=exp.Select), exp.Select)
|
||||
self.assertIsInstance(parse_one("left join foo", into=exp.Join), exp.Join)
|
||||
|
@ -23,9 +27,9 @@ class TestParser(unittest.TestCase):
|
|||
self.assertIsInstance(
|
||||
parse_one(
|
||||
"WHEN MATCHED THEN UPDATE SET target.salary = COALESCE(source.salary, target.salary)",
|
||||
into=exp.When,
|
||||
into=exp.Whens,
|
||||
),
|
||||
exp.When,
|
||||
exp.Whens,
|
||||
)
|
||||
|
||||
with self.assertRaises(ParseError) as ctx:
|
||||
|
|
Loading…
Add table
Reference in a new issue