Skip to content

Commit 35d10e0

Browse files
authored
Sync upstream (#31)
This brings couple of fixes I put for databricks and bigquery: - apache#1598 - apache#1600
2 parents e095d53 + a223c9b commit 35d10e0

39 files changed

+3510
-1429
lines changed

.github/workflows/rust.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
- uses: actions/checkout@v4
2828
- name: Setup Rust Toolchain
2929
uses: ./.github/actions/setup-builder
30-
- run: cargo fmt -- --check
30+
- run: cargo fmt --all -- --check
3131

3232
lint:
3333
runs-on: ubuntu-latest

Cargo.toml

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
[package]
1919
name = "sqlparser"
2020
description = "Extensible SQL Lexer and Parser with support for ANSI SQL:2011"
21-
version = "0.52.0"
21+
version = "0.53.0"
2222
authors = ["Apache DataFusion <[email protected]>"]
2323
homepage = "https://github.com/apache/datafusion-sqlparser-rs"
2424
documentation = "https://docs.rs/sqlparser/"
@@ -37,15 +37,18 @@ name = "sqlparser"
3737
path = "src/lib.rs"
3838

3939
[features]
40-
default = ["std"]
40+
default = ["std", "recursive-protection"]
4141
std = []
42+
recursive-protection = ["std", "recursive"]
4243
# Enable JSON output in the `cli` example:
4344
json_example = ["serde_json", "serde"]
4445
visitor = ["sqlparser_derive"]
4546

4647
[dependencies]
4748
bigdecimal = { version = "0.4.1", features = ["serde"], optional = true }
4849
log = "0.4"
50+
recursive = { version = "0.1.1", optional = true}
51+
4952
serde = { version = "1.0", features = ["derive"], optional = true }
5053
# serde_json is only used in examples/cli, but we have to put it outside
5154
# of dev-dependencies because of

README.md

+6-3
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ The following optional [crate features](https://doc.rust-lang.org/cargo/referen
6363

6464
* `serde`: Adds [Serde](https://serde.rs/) support by implementing `Serialize` and `Deserialize` for all AST nodes.
6565
* `visitor`: Adds a `Visitor` capable of recursively walking the AST tree.
66-
66+
* `recursive-protection` (enabled by default), uses [recursive](https://docs.rs/recursive/latest/recursive/) for stack overflow protection.
6767

6868
## Syntax vs Semantics
6969

@@ -240,11 +240,14 @@ You can run them with:
240240
```
241241
git checkout main
242242
cd sqlparser_bench
243-
cargo bench
243+
cargo bench -- --save-baseline main
244244
git checkout <your branch>
245-
cargo bench
245+
cargo bench -- --baseline main
246246
```
247247

248+
By adding the `--save-baseline main` and `--baseline main` you can track the
249+
progress of your improvements as you continue working on the feature branch.
250+
248251
## Licensing
249252

250253
All code in this repository is licensed under the [Apache Software License 2.0](LICENSE.txt).

changelog/0.53.0.md

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<!--
2+
Licensed to the Apache Software Foundation (ASF) under one
3+
or more contributor license agreements. See the NOTICE file
4+
distributed with this work for additional information
5+
regarding copyright ownership. The ASF licenses this file
6+
to you under the Apache License, Version 2.0 (the
7+
"License"); you may not use this file except in compliance
8+
with the License. You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing,
13+
software distributed under the License is distributed on an
14+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
KIND, either express or implied. See the License for the
16+
specific language governing permissions and limitations
17+
under the License.
18+
-->
19+
20+
# sqlparser-rs 0.53.0 Changelog
21+
22+
This release consists of 47 commits from 16 contributors. See credits at the end of this changelog for more information.
23+
24+
**Other:**
25+
26+
- hive: support for special not expression `!a` and raise error for `a!` factorial operator [#1472](https://github.com/apache/datafusion-sqlparser-rs/pull/1472) (wugeer)
27+
- Add support for MSSQL's `OPENJSON WITH` clause [#1498](https://github.com/apache/datafusion-sqlparser-rs/pull/1498) (gaoqiangz)
28+
- Parse true and false as identifiers in mssql [#1510](https://github.com/apache/datafusion-sqlparser-rs/pull/1510) (lovasoa)
29+
- Fix the parsing error in MSSQL for multiple statements that include `DECLARE` statements [#1497](https://github.com/apache/datafusion-sqlparser-rs/pull/1497) (wugeer)
30+
- Add support for Snowflake SHOW DATABASES/SCHEMAS/TABLES/VIEWS/COLUMNS statements [#1501](https://github.com/apache/datafusion-sqlparser-rs/pull/1501) (yoavcloud)
31+
- Add support of COMMENT ON syntax for Snowflake [#1516](https://github.com/apache/datafusion-sqlparser-rs/pull/1516) (git-hulk)
32+
- Add support for MYSQL's `CREATE TABLE SELECT` expr [#1515](https://github.com/apache/datafusion-sqlparser-rs/pull/1515) (wugeer)
33+
- Add support for MSSQL's `XQuery` methods [#1500](https://github.com/apache/datafusion-sqlparser-rs/pull/1500) (gaoqiangz)
34+
- Add support for Hive's `LOAD DATA` expr [#1520](https://github.com/apache/datafusion-sqlparser-rs/pull/1520) (wugeer)
35+
- Fix ClickHouse document link from `Russian` to `English` [#1527](https://github.com/apache/datafusion-sqlparser-rs/pull/1527) (git-hulk)
36+
- Support ANTI and SEMI joins without LEFT/RIGHT [#1528](https://github.com/apache/datafusion-sqlparser-rs/pull/1528) (delamarch3)
37+
- support sqlite's OR clauses in update statements [#1530](https://github.com/apache/datafusion-sqlparser-rs/pull/1530) (lovasoa)
38+
- support column type definitions in table aliases [#1526](https://github.com/apache/datafusion-sqlparser-rs/pull/1526) (lovasoa)
39+
- Add support for MSSQL's `JSON_ARRAY`/`JSON_OBJECT` expr [#1507](https://github.com/apache/datafusion-sqlparser-rs/pull/1507) (gaoqiangz)
40+
- Add support for PostgreSQL `UNLISTEN` syntax and Add support for Postgres `LOAD extension` expr [#1531](https://github.com/apache/datafusion-sqlparser-rs/pull/1531) (wugeer)
41+
- Parse byte/bit string literals in MySQL and Postgres [#1532](https://github.com/apache/datafusion-sqlparser-rs/pull/1532) (mvzink)
42+
- Allow example CLI to read from stdin [#1536](https://github.com/apache/datafusion-sqlparser-rs/pull/1536) (mvzink)
43+
- recursive select calls are parsed with bad trailing_commas parameter [#1521](https://github.com/apache/datafusion-sqlparser-rs/pull/1521) (tomershaniii)
44+
- PartiQL queries in Redshift [#1534](https://github.com/apache/datafusion-sqlparser-rs/pull/1534) (yoavcloud)
45+
- Include license file in sqlparser_derive crate [#1543](https://github.com/apache/datafusion-sqlparser-rs/pull/1543) (ankane)
46+
- Fallback to identifier parsing if expression parsing fails [#1513](https://github.com/apache/datafusion-sqlparser-rs/pull/1513) (yoavcloud)
47+
- support `json_object('k':'v')` in postgres [#1546](https://github.com/apache/datafusion-sqlparser-rs/pull/1546) (lovasoa)
48+
- Document micro benchmarks [#1555](https://github.com/apache/datafusion-sqlparser-rs/pull/1555) (alamb)
49+
- Implement `Spanned` to retrieve source locations on AST nodes [#1435](https://github.com/apache/datafusion-sqlparser-rs/pull/1435) (Nyrox)
50+
- Fix error in benchmark queries [#1560](https://github.com/apache/datafusion-sqlparser-rs/pull/1560) (alamb)
51+
- Fix clippy warnings on rust 1.83 [#1570](https://github.com/apache/datafusion-sqlparser-rs/pull/1570) (iffyio)
52+
- Support relation visitor to visit the `Option` field [#1556](https://github.com/apache/datafusion-sqlparser-rs/pull/1556) (goldmedal)
53+
- Rename `TokenWithLocation` to `TokenWithSpan`, in backwards compatible way [#1562](https://github.com/apache/datafusion-sqlparser-rs/pull/1562) (alamb)
54+
- Support MySQL size variants for BLOB and TEXT columns [#1564](https://github.com/apache/datafusion-sqlparser-rs/pull/1564) (mvzink)
55+
- Increase version of sqlparser_derive from 0.2.2 to 0.3.0 [#1571](https://github.com/apache/datafusion-sqlparser-rs/pull/1571) (alamb)
56+
- `json_object('k' VALUE 'v')` in postgres [#1547](https://github.com/apache/datafusion-sqlparser-rs/pull/1547) (lovasoa)
57+
- Support snowflake double dot notation for object name [#1540](https://github.com/apache/datafusion-sqlparser-rs/pull/1540) (ayman-sigma)
58+
- Update comments / docs for `Spanned` [#1549](https://github.com/apache/datafusion-sqlparser-rs/pull/1549) (alamb)
59+
- Support Databricks struct literal [#1542](https://github.com/apache/datafusion-sqlparser-rs/pull/1542) (ayman-sigma)
60+
- Encapsulate CreateFunction [#1573](https://github.com/apache/datafusion-sqlparser-rs/pull/1573) (philipcristiano)
61+
- Support BIT column types [#1577](https://github.com/apache/datafusion-sqlparser-rs/pull/1577) (mvzink)
62+
- Support parsing optional nulls handling for unique constraint [#1567](https://github.com/apache/datafusion-sqlparser-rs/pull/1567) (mvzink)
63+
- Fix displaying WORK or TRANSACTION after BEGIN [#1565](https://github.com/apache/datafusion-sqlparser-rs/pull/1565) (mvzink)
64+
- Add support of the ENUM8|ENUM16 for ClickHouse dialect [#1574](https://github.com/apache/datafusion-sqlparser-rs/pull/1574) (git-hulk)
65+
- Parse Snowflake USE ROLE and USE SECONDARY ROLES [#1578](https://github.com/apache/datafusion-sqlparser-rs/pull/1578) (yoavcloud)
66+
- Snowflake ALTER TABLE clustering options [#1579](https://github.com/apache/datafusion-sqlparser-rs/pull/1579) (yoavcloud)
67+
- Support INSERT OVERWRITE INTO syntax [#1584](https://github.com/apache/datafusion-sqlparser-rs/pull/1584) (yuval-illumex)
68+
- Parse `INSERT` with subquery when lacking column names [#1586](https://github.com/apache/datafusion-sqlparser-rs/pull/1586) (iffyio)
69+
- Add support for ODBC functions [#1585](https://github.com/apache/datafusion-sqlparser-rs/pull/1585) (iffyio)
70+
71+
## Credits
72+
73+
Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
74+
75+
```
76+
8 Andrew Lamb
77+
6 Michael Victor Zink
78+
5 Ophir LOJKINE
79+
5 Yoav Cohen
80+
5 wugeer
81+
3 Ifeanyi Ubah
82+
3 gaoqiangz
83+
3 hulk
84+
2 Ayman Elkfrawy
85+
1 Andrew Kane
86+
1 Jax Liu
87+
1 Mark-Oliver Junge
88+
1 Philip Cristiano
89+
1 Yuval Shkolar
90+
1 delamarch3
91+
1 tomershaniii
92+
```
93+
94+
Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
95+

derive/src/lib.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
use proc_macro2::TokenStream;
1919
use quote::{format_ident, quote, quote_spanned, ToTokens};
2020
use syn::spanned::Spanned;
21-
use syn::{parse::{Parse, ParseStream}, parse_macro_input, parse_quote, Attribute, Data, DeriveInput, Fields, GenericParam, Generics, Ident, Index, LitStr, Meta, Token, Type, TypePath};
21+
use syn::{
22+
parse::{Parse, ParseStream},
23+
parse_macro_input, parse_quote, Attribute, Data, DeriveInput, Fields, GenericParam, Generics,
24+
Ident, Index, LitStr, Meta, Token, Type, TypePath,
25+
};
2226
use syn::{Path, PathArguments};
2327

2428
/// Implementation of `[#derive(Visit)]`
@@ -74,7 +78,10 @@ fn derive_visit(input: proc_macro::TokenStream, visit_type: &VisitType) -> proc_
7478

7579
let expanded = quote! {
7680
// The generated impl.
81+
// Note that it uses [`recursive::recursive`] to protect from stack overflow.
82+
// See tests in https://github.com/apache/datafusion-sqlparser-rs/pull/1522/ for more info.
7783
impl #impl_generics sqlparser::ast::#visit_trait for #name #ty_generics #where_clause {
84+
#[cfg_attr(feature = "recursive-protection", recursive::recursive)]
7885
fn visit<V: sqlparser::ast::#visitor_trait>(
7986
&#modifier self,
8087
visitor: &mut V
@@ -267,7 +274,11 @@ fn visit_children(
267274
}
268275

269276
fn is_option(ty: &Type) -> bool {
270-
if let Type::Path(TypePath { path: Path { segments, .. }, .. }) = ty {
277+
if let Type::Path(TypePath {
278+
path: Path { segments, .. },
279+
..
280+
}) = ty
281+
{
271282
if let Some(segment) = segments.last() {
272283
if segment.ident == "Option" {
273284
if let PathArguments::AngleBracketed(args) = &segment.arguments {

dev/release/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ Move artifacts to the release location in SVN, using the `release-tarball.sh` sc
146146
```shell
147147
./dev/release/release-tarball.sh 0.52.0 1
148148
```
149+
150+
Promote the rc tag to the release tag
151+
```shell
152+
git tag v0.52.0 v0.52.0-rc3
153+
git push apache v0.52.0
154+
```
149155

150156
Congratulations! The release is now official!
151157

sqlparser_bench/benches/sqlparser_bench.rs

+40
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,46 @@ fn basic_queries(c: &mut Criterion) {
4242
group.bench_function("sqlparser::with_select", |b| {
4343
b.iter(|| Parser::parse_sql(&dialect, with_query).unwrap());
4444
});
45+
46+
let large_statement = {
47+
let expressions = (0..1000)
48+
.map(|n| format!("FN_{}(COL_{})", n, n))
49+
.collect::<Vec<_>>()
50+
.join(", ");
51+
let tables = (0..1000)
52+
.map(|n| format!("TABLE_{}", n))
53+
.collect::<Vec<_>>()
54+
.join(" JOIN ");
55+
let where_condition = (0..1000)
56+
.map(|n| format!("COL_{} = {}", n, n))
57+
.collect::<Vec<_>>()
58+
.join(" OR ");
59+
let order_condition = (0..1000)
60+
.map(|n| format!("COL_{} DESC", n))
61+
.collect::<Vec<_>>()
62+
.join(", ");
63+
64+
format!(
65+
"SELECT {} FROM {} WHERE {} ORDER BY {}",
66+
expressions, tables, where_condition, order_condition
67+
)
68+
};
69+
70+
group.bench_function("parse_large_statement", |b| {
71+
b.iter(|| Parser::parse_sql(&dialect, criterion::black_box(large_statement.as_str())));
72+
});
73+
74+
let large_statement = Parser::parse_sql(&dialect, large_statement.as_str())
75+
.unwrap()
76+
.pop()
77+
.unwrap();
78+
79+
group.bench_function("format_large_statement", |b| {
80+
b.iter(|| {
81+
let formatted_query = large_statement.to_string();
82+
assert_eq!(formatted_query, large_statement);
83+
});
84+
});
4585
}
4686

4787
criterion_group!(benches, basic_queries);

src/ast/data_type.rs

+48-8
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,21 @@ use serde::{Deserialize, Serialize};
2525
#[cfg(feature = "visitor")]
2626
use sqlparser_derive::{Visit, VisitMut};
2727

28-
use crate::ast::{display_comma_separated, ObjectName, StructField, UnionField};
28+
use crate::ast::{display_comma_separated, Expr, ObjectName, StructField, UnionField};
2929

3030
use super::{value::escape_single_quote_string, ColumnDef};
3131

32+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
33+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
34+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
35+
pub enum EnumMember {
36+
Name(String),
37+
/// ClickHouse allows to specify an integer value for each enum value.
38+
///
39+
/// [clickhouse](https://clickhouse.com/docs/en/sql-reference/data-types/enum)
40+
NamedValue(String, Expr),
41+
}
42+
3243
/// SQL data types
3344
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3445
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -243,7 +254,7 @@ pub enum DataType {
243254
/// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
244255
Float8,
245256
/// Double
246-
Double,
257+
Double(ExactNumberInfo),
247258
/// Double PRECISION e.g. [standard], [postgresql]
248259
///
249260
/// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type
@@ -307,6 +318,16 @@ pub enum DataType {
307318
FixedString(u64),
308319
/// Bytea
309320
Bytea,
321+
/// Bit string, e.g. [Postgres], [MySQL], or [MSSQL]
322+
///
323+
/// [Postgres]: https://www.postgresql.org/docs/current/datatype-bit.html
324+
/// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/bit-type.html
325+
/// [MSSQL]: https://learn.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver16
326+
Bit(Option<u64>),
327+
/// Variable-length bit string e.g. [Postgres]
328+
///
329+
/// [Postgres]: https://www.postgresql.org/docs/current/datatype-bit.html
330+
BitVarying(Option<u64>),
310331
/// Custom type such as enums
311332
Custom(ObjectName, Vec<String>),
312333
/// Arrays
@@ -324,7 +345,7 @@ pub enum DataType {
324345
/// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/nested-data-structures/nested
325346
Nested(Vec<ColumnDef>),
326347
/// Enums
327-
Enum(Vec<String>),
348+
Enum(Vec<EnumMember>, Option<u8>),
328349
/// Set
329350
Set(Vec<String>),
330351
/// Struct
@@ -352,6 +373,10 @@ pub enum DataType {
352373
///
353374
/// [postgresql]: https://www.postgresql.org/docs/current/plpgsql-trigger.html
354375
Trigger,
376+
/// Any data type, used in BigQuery UDF definitions for templated parameters
377+
///
378+
/// [bigquery]: https://cloud.google.com/bigquery/docs/user-defined-functions#templated-sql-udf-parameters
379+
AnyType,
355380
}
356381

357382
impl fmt::Display for DataType {
@@ -362,7 +387,6 @@ impl fmt::Display for DataType {
362387
DataType::CharacterVarying(size) => {
363388
format_character_string_type(f, "CHARACTER VARYING", size)
364389
}
365-
366390
DataType::CharVarying(size) => format_character_string_type(f, "CHAR VARYING", size),
367391
DataType::Varchar(size) => format_character_string_type(f, "VARCHAR", size),
368392
DataType::Nvarchar(size) => format_character_string_type(f, "NVARCHAR", size),
@@ -484,7 +508,7 @@ impl fmt::Display for DataType {
484508
DataType::Float4 => write!(f, "FLOAT4"),
485509
DataType::Float32 => write!(f, "Float32"),
486510
DataType::Float64 => write!(f, "FLOAT64"),
487-
DataType::Double => write!(f, "DOUBLE"),
511+
DataType::Double(info) => write!(f, "DOUBLE{info}"),
488512
DataType::Float8 => write!(f, "FLOAT8"),
489513
DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"),
490514
DataType::Bool => write!(f, "BOOL"),
@@ -518,6 +542,10 @@ impl fmt::Display for DataType {
518542
DataType::LongText => write!(f, "LONGTEXT"),
519543
DataType::String(size) => format_type_with_optional_length(f, "STRING", size, false),
520544
DataType::Bytea => write!(f, "BYTEA"),
545+
DataType::Bit(size) => format_type_with_optional_length(f, "BIT", size, false),
546+
DataType::BitVarying(size) => {
547+
format_type_with_optional_length(f, "BIT VARYING", size, false)
548+
}
521549
DataType::Array(ty) => match ty {
522550
ArrayElemTypeDef::None => write!(f, "ARRAY"),
523551
ArrayElemTypeDef::SquareBracket(t, None) => write!(f, "{t}[]"),
@@ -532,13 +560,24 @@ impl fmt::Display for DataType {
532560
write!(f, "{}({})", ty, modifiers.join(", "))
533561
}
534562
}
535-
DataType::Enum(vals) => {
536-
write!(f, "ENUM(")?;
563+
DataType::Enum(vals, bits) => {
564+
match bits {
565+
Some(bits) => write!(f, "ENUM{}", bits),
566+
None => write!(f, "ENUM"),
567+
}?;
568+
write!(f, "(")?;
537569
for (i, v) in vals.iter().enumerate() {
538570
if i != 0 {
539571
write!(f, ", ")?;
540572
}
541-
write!(f, "'{}'", escape_single_quote_string(v))?;
573+
match v {
574+
EnumMember::Name(name) => {
575+
write!(f, "'{}'", escape_single_quote_string(name))?
576+
}
577+
EnumMember::NamedValue(name, value) => {
578+
write!(f, "'{}' = {}", escape_single_quote_string(name), value)?
579+
}
580+
}
542581
}
543582
write!(f, ")")
544583
}
@@ -590,6 +629,7 @@ impl fmt::Display for DataType {
590629
}
591630
DataType::Unspecified => Ok(()),
592631
DataType::Trigger => write!(f, "TRIGGER"),
632+
DataType::AnyType => write!(f, "ANY TYPE"),
593633
}
594634
}
595635
}

0 commit comments

Comments
 (0)