From 0ceb65a80b04c1cb2caeff850f51c4f241e927c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Anast=C3=A1cio?= Date: Fri, 20 Jun 2025 17:31:34 -0300 Subject: [PATCH] Bump up sqlparser version to 0.56.0 --- mix.lock | 12 +- native/sqlparser_parse/Cargo.lock | 79 ++++++- native/sqlparser_parse/Cargo.toml | 2 +- native/sqlparser_parse/src/datatypes.rs | 278 ++++++++++++++++-------- 4 files changed, 275 insertions(+), 96 deletions(-) diff --git a/mix.lock b/mix.lock index fc39145..3fbd607 100644 --- a/mix.lock +++ b/mix.lock @@ -2,12 +2,20 @@ "castore": {:hex, :castore, "1.0.1", "240b9edb4e9e94f8f56ab39d8d2d0a57f49e46c56aced8f873892df8ff64ff5a", [:mix], [], "hexpm", "b4951de93c224d44fac71614beabd88b71932d0b1dea80d2f80fb9044e01bbb3"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, + "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, + "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "rustler": {:hex, :rustler, "0.27.0", "53ffe86586fd1a2ea60ad07f1506962914eb669dba26c23010cf672662ec8d64", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "d7f5ccaec6e7a96f700330898ff2e9d48818e40789fd2951ba41ecf457986e92"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "req": {:hex, :req, "0.5.10", "a3a063eab8b7510785a467f03d30a8d95f66f5c3d9495be3474b61459c54376c", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "8a604815743f8a2d3b5de0659fa3137fa4b1cffd636ecb69b30b2b9b2c2559be"}, + "rustler": {:hex, :rustler, "0.35.1", "ec81961ef9ee833d721dafb4449cab29b16b969a3063a842bb9e3ea912f6b938", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "3713b2e70e68ec2bfa8291dfd9cb811fe64a770f254cd9c331f8b34fa7989115"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.6.1", "160b545bce8bf9a3f1b436b2c10f53574036a0db628e40f393328cbbe593602f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "0dd269fa261c4e3df290b12031c575fff07a542749f7b0e8b744d72d66c43600"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "toml": {:hex, :toml, "0.7.0", "fbcd773caa937d0c7a02c301a1feea25612720ac3fa1ccb8bfd9d30d822911de", [:mix], [], "hexpm", "0690246a2478c1defd100b0c9b89b4ea280a22be9a7b313a8a058a2408a2fa70"}, } diff --git a/native/sqlparser_parse/Cargo.lock b/native/sqlparser_parse/Cargo.lock index aeb15e6..d38498e 100644 --- a/native/sqlparser_parse/Cargo.lock +++ b/native/sqlparser_parse/Cargo.lock @@ -1,6 +1,15 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "cc" +version = "1.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -23,6 +32,12 @@ dependencies = [ "rustversion", ] +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + [[package]] name = "libloading" version = "0.8.6" @@ -51,6 +66,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +dependencies = [ + "cc", +] + [[package]] name = "quote" version = "1.0.38" @@ -60,6 +84,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "recursive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" +dependencies = [ + "recursive-proc-macro-impl", + "stacker", +] + +[[package]] +name = "recursive-proc-macro-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "regex-lite" version = "0.1.6" @@ -97,13 +141,20 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "sqlparser" -version = "0.30.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db67dc6ef36edb658196c3fef0464a80b53dbbc194a904e81f9bd4190f9ecc5b" +checksum = "e68feb51ffa54fc841e086f58da543facfe3d7ae2a60d69b0a8cbbd30d16ae8d" dependencies = [ "log", + "recursive", ] [[package]] @@ -114,6 +165,19 @@ dependencies = [ "sqlparser", ] +[[package]] +name = "stacker" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys", +] + [[package]] name = "syn" version = "2.0.91" @@ -131,6 +195,15 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" diff --git a/native/sqlparser_parse/Cargo.toml b/native/sqlparser_parse/Cargo.toml index 8704376..5f8751a 100644 --- a/native/sqlparser_parse/Cargo.toml +++ b/native/sqlparser_parse/Cargo.toml @@ -11,4 +11,4 @@ crate-type = ["cdylib"] [dependencies] rustler = "0.35.1" -sqlparser = "0.30.0" +sqlparser = "0.56.0" diff --git a/native/sqlparser_parse/src/datatypes.rs b/native/sqlparser_parse/src/datatypes.rs index fa3c7d7..f742c11 100644 --- a/native/sqlparser_parse/src/datatypes.rs +++ b/native/sqlparser_parse/src/datatypes.rs @@ -50,7 +50,7 @@ impl Document { .iter() .map(|s| match s { sqlparser::ast::Statement::Query(query) => { - Statement::Query(Query::new(*query.clone())) + Statement::Query(Box::new(Query::new(*query.clone()))) } _ => Statement::NotImplemented(result_atoms::not_implemented()), @@ -116,6 +116,7 @@ impl From for sqlparser::ast::Expr { sqlparser::ast::Expr::Identifier(sqlparser::ast::Ident { value: ident.value, quote_style: None, + span: sqlparser::tokenizer::Span::empty(), }) } ExprEnum::CompoundIdentifier(idents) => sqlparser::ast::Expr::CompoundIdentifier( @@ -124,11 +125,15 @@ impl From for sqlparser::ast::Expr { .map(|i| sqlparser::ast::Ident { value: i.value.clone(), quote_style: None, + span: sqlparser::tokenizer::Span::empty(), }) .collect(), ), ExprEnum::Value(value) => { - sqlparser::ast::Expr::Value(sqlparser::ast::Value::from(value)) + sqlparser::ast::Expr::Value(sqlparser::ast::ValueWithSpan { + value: sqlparser::ast::Value::from(value), + span: sqlparser::tokenizer::Span::empty(), + }) } ExprEnum::BinaryOp(op) => sqlparser::ast::Expr::BinaryOp { left: Box::new(sqlparser::ast::Expr::from(*op.left.clone())), @@ -178,6 +183,7 @@ impl From for sqlparser::ast::Expr { sqlparser::ast::Expr::Identifier(sqlparser::ast::Ident { value: "abd".to_string(), quote_style: None, + span: sqlparser::tokenizer::Span::empty(), }) } } @@ -190,16 +196,13 @@ impl From for sqlparser::ast::SelectItem { sqlparser::ast::SelectItem::UnnamedExpr(sqlparser::ast::Expr::from(expr)) } SelectItem::Wildcard(_) => { - sqlparser::ast::SelectItem::Wildcard(sqlparser::ast::WildcardAdditionalOptions { - opt_exclude: None, - opt_except: None, - opt_rename: None, - }) + sqlparser::ast::SelectItem::Wildcard(sqlparser::ast::WildcardAdditionalOptions::default()) } _ => sqlparser::ast::SelectItem::UnnamedExpr(sqlparser::ast::Expr::Identifier( sqlparser::ast::Ident { value: "abd".to_string(), quote_style: None, + span: sqlparser::tokenizer::Span::empty(), }, )), } @@ -210,18 +213,18 @@ impl From for sqlparser::ast::Ident { sqlparser::ast::Ident { value: ident.value, quote_style: None, + span: sqlparser::tokenizer::Span::empty(), } } } impl From for sqlparser::ast::ObjectName { fn from(object_name: ObjectName) -> Self { - sqlparser::ast::ObjectName( - object_name - .names - .iter() - .map(|l| sqlparser::ast::Ident::from(l.clone())) - .collect(), - ) + let idents: Vec = object_name + .names + .iter() + .map(|l| sqlparser::ast::Ident::from(l.clone())) + .collect(); + sqlparser::ast::ObjectName::from(idents) } } impl From for sqlparser::ast::TableFactor { @@ -233,12 +236,24 @@ impl From for sqlparser::ast::TableFactor { alias: None, args: None, with_hints: [].to_vec(), + version: None, + with_ordinality: false, + partitions: vec![], + json_path: None, + sample: None, + index_hints: vec![], }, _ => sqlparser::ast::TableFactor::Table { name, alias: None, args: None, with_hints: [].to_vec(), + version: None, + with_ordinality: false, + partitions: vec![], + json_path: None, + sample: None, + index_hints: vec![], }, } } @@ -253,6 +268,7 @@ impl From for sqlparser::ast::Join { sqlparser::ast::Join { relation: sqlparser::ast::TableFactor::from(join.relation), join_operator: sqlparser::ast::JoinOperator::from(join.join_operator), + global: false, } } } @@ -272,8 +288,11 @@ impl From for sqlparser::ast::OrderByExpr { fn from(order_by_expr: OrderByExpr) -> Self { sqlparser::ast::OrderByExpr { expr: sqlparser::ast::Expr::from(order_by_expr.expr), - asc: order_by_expr.asc, - nulls_first: order_by_expr.nulls_first, + options: sqlparser::ast::OrderByOptions { + asc: order_by_expr.asc, + nulls_first: order_by_expr.nulls_first, + }, + with_fill: None, } } } @@ -282,7 +301,7 @@ impl From for sqlparser::ast::SetExpr { match setexpr { SetExpr::Select(select) => { sqlparser::ast::SetExpr::Select(Box::new(sqlparser::ast::Select { - distinct: select.distinct, + distinct: if select.distinct { Some(sqlparser::ast::Distinct::Distinct) } else { None }, top: None, projection: select .projection @@ -297,11 +316,14 @@ impl From for sqlparser::ast::SetExpr { .collect(), lateral_views: [].to_vec(), selection: select.selection.map(sqlparser::ast::Expr::from), - group_by: select - .group_by - .iter() - .map(|l| sqlparser::ast::Expr::from(l.clone())) - .collect(), + group_by: sqlparser::ast::GroupByExpr::Expressions( + select + .group_by + .iter() + .map(|l| sqlparser::ast::Expr::from(l.clone())) + .collect(), + vec![], + ), cluster_by: [].to_vec(), distribute_by: [].to_vec(), sort_by: select @@ -311,22 +333,38 @@ impl From for sqlparser::ast::SetExpr { .collect(), having: select.having.map(sqlparser::ast::Expr::from), qualify: None, + connect_by: None, + named_window: vec![], + window_before_qualify: false, + value_table_mode: None, + prewhere: None, + flavor: sqlparser::ast::SelectFlavor::Standard, + select_token: sqlparser::ast::helpers::attached_token::AttachedToken::empty(), + top_before_distinct: false, })) } _ => sqlparser::ast::SetExpr::Select(Box::new(sqlparser::ast::Select { - distinct: false, + distinct: None, top: None, projection: [].to_vec(), into: None, from: [].to_vec(), lateral_views: [].to_vec(), selection: None, - group_by: [].to_vec(), + group_by: sqlparser::ast::GroupByExpr::Expressions(vec![], vec![]), cluster_by: [].to_vec(), distribute_by: [].to_vec(), sort_by: [].to_vec(), having: None, qualify: None, + connect_by: None, + named_window: vec![], + window_before_qualify: false, + value_table_mode: None, + prewhere: None, + flavor: sqlparser::ast::SelectFlavor::Standard, + select_token: sqlparser::ast::helpers::attached_token::AttachedToken::empty(), + top_before_distinct: false, })), } } @@ -337,43 +375,68 @@ impl From for sqlparser::ast::Statement { Statement::Query(query) => { sqlparser::ast::Statement::Query(Box::new(sqlparser::ast::Query { body: Box::new(sqlparser::ast::SetExpr::from(query.body)), - limit: query.limit.map(sqlparser::ast::Expr::from), + limit_clause: query.limit.map(|expr| sqlparser::ast::LimitClause::LimitOffset { + limit: Some(sqlparser::ast::Expr::from(expr)), + offset: None, + limit_by: vec![], + }), with: None, - order_by: query - .order_by - .iter() - .map(|l| sqlparser::ast::OrderByExpr::from(l.clone())) - .collect(), + order_by: if query.order_by.is_empty() { + None + } else { + Some(sqlparser::ast::OrderBy { + kind: sqlparser::ast::OrderByKind::Expressions( + query + .order_by + .iter() + .map(|l| sqlparser::ast::OrderByExpr::from(l.clone())) + .collect() + ), + interpolate: None, + }) + }, locks: [].to_vec(), fetch: None, - offset: None, + for_clause: None, + settings: None, + format_clause: None, })) } _ => sqlparser::ast::Statement::Query(Box::new(sqlparser::ast::Query { body: Box::new(sqlparser::ast::SetExpr::Select(Box::new( sqlparser::ast::Select { - distinct: false, + distinct: None, top: None, projection: [].to_vec(), into: None, from: [].to_vec(), lateral_views: [].to_vec(), selection: None, - group_by: [].to_vec(), + group_by: sqlparser::ast::GroupByExpr::Expressions(vec![], vec![]), cluster_by: [].to_vec(), distribute_by: [].to_vec(), sort_by: [].to_vec(), having: None, qualify: None, + connect_by: None, + named_window: vec![], + window_before_qualify: false, + value_table_mode: None, + prewhere: None, + flavor: sqlparser::ast::SelectFlavor::Standard, + select_token: sqlparser::ast::helpers::attached_token::AttachedToken::empty(), + top_before_distinct: false, }, ))), - limit: None, + limit_clause: None, with: None, - order_by: [].to_vec(), + order_by: None, locks: [].to_vec(), fetch: None, - offset: None, + for_clause: None, + settings: None, + format_clause: None, })), } } @@ -479,7 +542,9 @@ impl From for JoinConstraint { }, sqlparser::ast::JoinConstraint::Using(ident) => JoinConstraint { constraint: JoinConstraintEnum::Using( - ident.iter().map(|i| Ident::from(i.clone())).collect(), + ident.iter().flat_map(|name| { + name.0.iter().filter_map(|part| part.as_ident()).map(|i| Ident::from(i.clone())).collect::>() + }).collect(), ), kind: join_constraints_atoms::using(), }, @@ -525,7 +590,7 @@ pub enum JoinOperatorEnum { LeftOuter(JoinConstraint), RightOuter(JoinConstraint), FullOuter(JoinConstraint), - // CrossJoin, + CrossJoin(JoinConstraint), LeftSemi(JoinConstraint), RightSemi(JoinConstraint), LeftAnti(JoinConstraint), @@ -553,7 +618,13 @@ impl From for JoinOperator { kind: join_operator_atoms::full_outer(), operator: JoinOperatorEnum::FullOuter(JoinConstraint::from(constraint)), }, - // sqlparser::ast::JoinOperator::CrossJoin => JoinOperator{ operator: JoinOperatorEnum::CrossJoin, }, + sqlparser::ast::JoinOperator::CrossJoin => JoinOperator { + kind: join_operator_atoms::cross_join(), + operator: JoinOperatorEnum::CrossJoin(JoinConstraint { + constraint: JoinConstraintEnum::None(join_constraints_atoms::none()), + kind: join_constraints_atoms::none(), + }), + }, sqlparser::ast::JoinOperator::LeftSemi(constraint) => JoinOperator { kind: join_operator_atoms::left_semi(), operator: JoinOperatorEnum::LeftSemi(JoinConstraint::from(constraint)), @@ -570,7 +641,11 @@ impl From for JoinOperator { kind: join_operator_atoms::right_anti(), operator: JoinOperatorEnum::RightAnti(JoinConstraint::from(constraint)), }, - _ => todo!(), + sqlparser::ast::JoinOperator::Join(constraint) => JoinOperator { + kind: join_operator_atoms::inner(), + operator: JoinOperatorEnum::Inner(JoinConstraint::from(constraint)), + }, + _ => panic!("Unsupported join operator: {:?}", join_operator), // sqlparser::ast::JoinOperator::CrossApply => JoinOperator{ operator: JoinOperatorEnum::CrossApply, }, // sqlparser::ast::JoinOperator::OuterApply => JoinOperator{ operator: JoinOperatorEnum::OuterApply }, } @@ -653,7 +728,7 @@ impl From for TableFactor { match table_factor { sqlparser::ast::TableFactor::Table { name, .. } => TableFactor::Table(Table { name: ObjectName { - names: name.0.iter().map(|p| Ident::from(p.clone())).collect(), + names: name.0.iter().filter_map(|p| p.as_ident()).map(|i| Ident::from(i.clone())).collect(), }, }), sqlparser::ast::TableFactor::NestedJoin { .. } => { @@ -665,7 +740,14 @@ impl From for TableFactor { sqlparser::ast::TableFactor::TableFunction { .. } => { TableFactor::NotImplemented(result_atoms::not_implemented()) } - sqlparser::ast::TableFactor::UNNEST { .. } => { + sqlparser::ast::TableFactor::UNNEST { .. } + | sqlparser::ast::TableFactor::Function { .. } + | sqlparser::ast::TableFactor::JsonTable { .. } + | sqlparser::ast::TableFactor::OpenJsonTable { .. } + | sqlparser::ast::TableFactor::Unpivot { .. } + | sqlparser::ast::TableFactor::Pivot { .. } + | sqlparser::ast::TableFactor::MatchRecognize { .. } + | sqlparser::ast::TableFactor::XmlTable { .. } => { TableFactor::NotImplemented(result_atoms::not_implemented()) } } @@ -739,7 +821,7 @@ impl From for BinaryOperator { sqlparser::ast::BinaryOperator::PGRegexIMatch => Self::PGRegexIMatch, sqlparser::ast::BinaryOperator::PGRegexNotMatch => Self::PGRegexNotMatch, sqlparser::ast::BinaryOperator::PGRegexNotIMatch => Self::PGRegexNotIMatch, - sqlparser::ast::BinaryOperator::PGCustomBinaryOperator(_) => Self::NotImplemented, + _ => Self::NotImplemented, } } } @@ -768,6 +850,7 @@ impl From for UnaryOperator { sqlparser::ast::UnaryOperator::PGPostfixFactorial => Self::PGPostfixFactorial, sqlparser::ast::UnaryOperator::PGPrefixFactorial => Self::PGPrefixFactorial, sqlparser::ast::UnaryOperator::PGAbs => Self::PGAbs, + _ => Self::Not, // Default to Not for unhandled cases } } } @@ -856,7 +939,7 @@ impl From for Value { sqlparser::ast::Value::Boolean(boolean) => Self::Boolean(Boolean { value: boolean }), sqlparser::ast::Value::Null => Self::Null(Null {}), sqlparser::ast::Value::Placeholder(placeholder) => Self::Placeholder(placeholder), - sqlparser::ast::Value::UnQuotedString(string) => Self::UnQuotedString(string), + _ => Self::NotImplemented(result_atoms::not_implemented()), } } } @@ -984,13 +1067,6 @@ impl Expr { idents.iter().map(|p| Ident::from(p.clone())).collect(), ), }, - sqlparser::ast::Expr::CompositeAccess { expr, key } => Expr { - r#type: type_atoms::composite_access(), - value: ExprEnum::CompositeAccess(CompositeAccess { - expr: Box::new(Expr::new(*expr)), - key: Ident::from(key), - }), - }, sqlparser::ast::Expr::IsFalse(expr) => Expr { r#type: type_atoms::is_false(), value: ExprEnum::IsFalse(Box::new(Expr::new(*expr))), @@ -1043,7 +1119,17 @@ impl Expr { r#type: type_atoms::in_subquery(), value: ExprEnum::InSubquery(InSubquery { expr: Box::new(Expr::new(*expr)), - subquery: Box::new(Query::new(*subquery)), + subquery: Box::new(Query::new(sqlparser::ast::Query { + body: subquery, + with: None, + order_by: None, + limit_clause: None, + fetch: None, + locks: vec![], + for_clause: None, + settings: None, + format_clause: None, + })), negated, }), }, @@ -1086,6 +1172,7 @@ impl Expr { expr, pattern, escape_char, + any: _, } => Expr { r#type: type_atoms::like(), value: ExprEnum::Like(Like { @@ -1100,6 +1187,7 @@ impl Expr { expr, pattern, escape_char, + any: _, } => Expr { r#type: type_atoms::ilike(), value: ExprEnum::ILike(ILike { @@ -1123,13 +1211,13 @@ impl Expr { escape_char: escape_char.map(|c| c.to_string()), }), }, - sqlparser::ast::Expr::AnyOp(expr) => Expr { - r#type: type_atoms::any_op(), - value: ExprEnum::AnyOp(Box::new(Expr::new(*expr))), + sqlparser::ast::Expr::AnyOp { .. } => Expr { + r#type: result_atoms::not_implemented(), + value: ExprEnum::NotImplemented(result_atoms::not_implemented()), }, - sqlparser::ast::Expr::AllOp(expr) => Expr { - r#type: type_atoms::all_op(), - value: ExprEnum::AllOp(Box::new(Expr::new(*expr))), + sqlparser::ast::Expr::AllOp { .. } => Expr { + r#type: result_atoms::not_implemented(), + value: ExprEnum::NotImplemented(result_atoms::not_implemented()), }, sqlparser::ast::Expr::Nested(expr) => Expr { r#type: type_atoms::nested(), @@ -1144,11 +1232,9 @@ impl Expr { }, sqlparser::ast::Expr::Value(value) => Expr { r#type: type_atoms::value(), - value: ExprEnum::Value(value.into()), + value: ExprEnum::Value(Value::from(value.value)), }, - sqlparser::ast::Expr::SafeCast { .. } - | sqlparser::ast::Expr::TryCast { .. } - | sqlparser::ast::Expr::Cast { .. } + sqlparser::ast::Expr::Cast { .. } | sqlparser::ast::Expr::JsonAccess { .. } | sqlparser::ast::Expr::IsDistinctFrom(_, _) | sqlparser::ast::Expr::AtTimeZone { .. } @@ -1161,20 +1247,14 @@ impl Expr { | sqlparser::ast::Expr::Overlay { .. } | sqlparser::ast::Expr::Collate { .. } | sqlparser::ast::Expr::TypedString { .. } - | sqlparser::ast::Expr::MapAccess { .. } | sqlparser::ast::Expr::Function(_) - | sqlparser::ast::Expr::AggregateExpressionWithFilter { .. } | sqlparser::ast::Expr::Case { .. } | sqlparser::ast::Expr::Exists { .. } | sqlparser::ast::Expr::Subquery { .. } - | sqlparser::ast::Expr::ArraySubquery(_) - | sqlparser::ast::Expr::ListAgg(_) - | sqlparser::ast::Expr::ArrayAgg(_) | sqlparser::ast::Expr::GroupingSets(_) | sqlparser::ast::Expr::Cube(_) | sqlparser::ast::Expr::Rollup(_) | sqlparser::ast::Expr::Tuple(_) - | sqlparser::ast::Expr::ArrayIndex { .. } | sqlparser::ast::Expr::Array(_) | sqlparser::ast::Expr::Interval { .. } | sqlparser::ast::Expr::MatchAgainst { .. } @@ -1182,6 +1262,10 @@ impl Expr { r#type: result_atoms::not_implemented(), value: ExprEnum::NotImplemented(result_atoms::not_implemented()), }, + _ => Expr { + r#type: result_atoms::not_implemented(), + value: ExprEnum::NotImplemented(result_atoms::not_implemented()), + }, } } } @@ -1207,7 +1291,7 @@ pub struct Select { impl Select { pub fn new(ast: sqlparser::ast::Select) -> Self { Self { - distinct: ast.distinct, + distinct: ast.distinct.is_some(), projection: ast .projection .iter() @@ -1231,11 +1315,12 @@ impl Select { .collect(), from: ast.from.iter().map(TableWithJoins::new).collect(), selection: ast.selection.map(Expr::new), - group_by: ast - .group_by - .iter() - .map(|expr| Expr::new(expr.clone())) - .collect(), + group_by: match &ast.group_by { + sqlparser::ast::GroupByExpr::Expressions(exprs, _) => { + exprs.iter().map(|expr| Expr::new(expr.clone())).collect() + } + _ => vec![], + }, sort_by: ast .sort_by .iter() @@ -1306,16 +1391,21 @@ impl From for SetExpr { sqlparser::ast::SetOperator::Union => SetOperator::Union, sqlparser::ast::SetOperator::Except => SetOperator::Except, sqlparser::ast::SetOperator::Intersect => SetOperator::Intersect, + sqlparser::ast::SetOperator::Minus => SetOperator::Except, // Use Except as fallback }, set_quantifier: match set_quantifier { sqlparser::ast::SetQuantifier::All => SetQuantifier::All, sqlparser::ast::SetQuantifier::Distinct => SetQuantifier::Distinct, sqlparser::ast::SetQuantifier::None => SetQuantifier::None, + _ => SetQuantifier::None, // Default to None for new variants }, left: Box::new((*left).into()), right: Box::new((*right).into()), }), - sqlparser::ast::SetExpr::Insert(_) | sqlparser::ast::SetExpr::Table(_) => { + sqlparser::ast::SetExpr::Insert(_) + | sqlparser::ast::SetExpr::Table(_) + | sqlparser::ast::SetExpr::Update(_) + | sqlparser::ast::SetExpr::Delete(_) => { SetExpr::NotImplemented(result_atoms::not_implemented()) } } @@ -1326,26 +1416,34 @@ impl Query { pub fn new(ast: sqlparser::ast::Query) -> Self { Self { body: (*ast.body).into(), - order_by: ast - .order_by - .iter() - .map(|order_by_expr| OrderByExpr { - expr: Expr::new(order_by_expr.expr.clone()), - asc: order_by_expr.asc, - nulls_first: order_by_expr.nulls_first, - }) - .collect(), - limit: ast.limit.map(Expr::new), - offset: match ast.offset { - Some(offset) => Some(Offset { - value: Expr::new(offset.value), + order_by: match &ast.order_by { + Some(order_by) => match &order_by.kind { + sqlparser::ast::OrderByKind::Expressions(exprs) => { + exprs.iter().map(|order_by_expr| OrderByExpr { + expr: Expr::new(order_by_expr.expr.clone()), + asc: order_by_expr.options.asc, + nulls_first: order_by_expr.options.nulls_first, + }) + .collect() + } + _ => vec![], + }, + None => vec![], + }, + limit: match &ast.limit_clause { + Some(sqlparser::ast::LimitClause::LimitOffset { limit, .. }) => limit.clone().map(Expr::new), + _ => None, + }, + offset: match &ast.limit_clause { + Some(sqlparser::ast::LimitClause::LimitOffset { offset: Some(offset), .. }) => Some(Offset { + value: Expr::new(offset.value.clone()), rows: match offset.rows { sqlparser::ast::OffsetRows::None => OffsetRows::None, sqlparser::ast::OffsetRows::Row => OffsetRows::Row, sqlparser::ast::OffsetRows::Rows => OffsetRows::Rows, }, }), - None => None, + _ => None, }, } } @@ -1354,6 +1452,6 @@ impl Query { #[derive(Clone, NifUntaggedEnum)] // #[rustler(encode)] pub enum Statement { - Query(Query), + Query(Box), NotImplemented(Atom), }