From 40a8dc14cd0fd63cbd9d75823d02580caeddc3b1 Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Sun, 9 Feb 2025 12:54:30 +0200 Subject: [PATCH] sqlite3-parser: separate boxed SelectInner struct --- core/translate/select.rs | 17 +++++----- .../sqlite3-parser/src/parser/ast/check.rs | 5 ++- vendored/sqlite3-parser/src/parser/ast/fmt.rs | 17 +++++----- vendored/sqlite3-parser/src/parser/ast/mod.rs | 32 +++++++++++-------- vendored/sqlite3-parser/src/parser/parse.y | 8 ++--- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/core/translate/select.rs b/core/translate/select.rs index b5091af64..22168ab7a 100644 --- a/core/translate/select.rs +++ b/core/translate/select.rs @@ -11,8 +11,8 @@ use crate::util::normalize_ident; use crate::vdbe::builder::{ProgramBuilderOpts, QueryMode}; use crate::SymbolTable; use crate::{schema::Schema, vdbe::builder::ProgramBuilder, Result}; -use sqlite3_parser::ast::ResultColumn; use sqlite3_parser::ast::{self}; +use sqlite3_parser::ast::{ResultColumn, SelectInner}; pub fn translate_select( query_mode: QueryMode, @@ -42,13 +42,14 @@ pub fn prepare_select_plan( syms: &SymbolTable, ) -> Result { match *select.body.select { - ast::OneSelect::Select { - mut columns, - from, - where_clause, - group_by, - .. - } => { + ast::OneSelect::Select(select_inner) => { + let SelectInner { + mut columns, + from, + where_clause, + group_by, + .. + } = *select_inner; let col_count = columns.len(); if col_count == 0 { crate::bail_parse_error!("SELECT without columns is not allowed"); diff --git a/vendored/sqlite3-parser/src/parser/ast/check.rs b/vendored/sqlite3-parser/src/parser/ast/check.rs index 7e65d6852..d885f5485 100644 --- a/vendored/sqlite3-parser/src/parser/ast/check.rs +++ b/vendored/sqlite3-parser/src/parser/ast/check.rs @@ -305,7 +305,10 @@ impl OneSelect { /// Like `sqlite3_column_count` but more limited pub fn column_count(&self) -> ColumnCount { match self { - Self::Select { columns, .. } => column_count(columns), + Self::Select(select) => { + let SelectInner { columns, .. } = &**select; + column_count(columns) + } Self::Values(values) => { assert!(!values.is_empty()); // TODO Validate ColumnCount::Fixed(values[0].len()) diff --git a/vendored/sqlite3-parser/src/parser/ast/fmt.rs b/vendored/sqlite3-parser/src/parser/ast/fmt.rs index 313177a39..5fc10dc89 100644 --- a/vendored/sqlite3-parser/src/parser/ast/fmt.rs +++ b/vendored/sqlite3-parser/src/parser/ast/fmt.rs @@ -893,14 +893,15 @@ impl Display for CompoundOperator { impl ToTokens for OneSelect { fn to_tokens(&self, s: &mut S) -> Result<(), S::Error> { match self { - Self::Select { - distinctness, - columns, - from, - where_clause, - group_by, - window_clause, - } => { + Self::Select(select) => { + let SelectInner { + distinctness, + columns, + from, + where_clause, + group_by, + window_clause, + } = &**select; s.append(TK_SELECT, None)?; if let Some(ref distinctness) = distinctness { distinctness.to_tokens(s)?; diff --git a/vendored/sqlite3-parser/src/parser/ast/mod.rs b/vendored/sqlite3-parser/src/parser/ast/mod.rs index 6b0ac88df..58af258bd 100644 --- a/vendored/sqlite3-parser/src/parser/ast/mod.rs +++ b/vendored/sqlite3-parser/src/parser/ast/mod.rs @@ -779,24 +779,28 @@ pub enum CompoundOperator { #[derive(Clone, Debug, PartialEq, Eq)] pub enum OneSelect { /// `SELECT` - Select { - /// `DISTINCT` - distinctness: Option, - /// columns - columns: Vec, - /// `FROM` clause - from: Option, - /// `WHERE` clause - where_clause: Option, - /// `GROUP BY` - group_by: Option, - /// `WINDOW` definition - window_clause: Option>, - }, + Select(Box), /// `VALUES` Values(Vec>), } +#[derive(Clone, Debug, PartialEq, Eq)] +/// `SELECT` core +pub struct SelectInner { + /// `DISTINCT` + pub distinctness: Option, + /// columns + pub columns: Vec, + /// `FROM` clause + pub from: Option, + /// `WHERE` clause + pub where_clause: Option, + /// `GROUP BY` + pub group_by: Option, + /// `WINDOW` definition + pub window_clause: Option>, +} + /// `SELECT` ... `FROM` clause // https://sqlite.org/syntax/join-clause.html #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/vendored/sqlite3-parser/src/parser/parse.y b/vendored/sqlite3-parser/src/parser/parse.y index 889bb4690..f24204d81 100644 --- a/vendored/sqlite3-parser/src/parser/parse.y +++ b/vendored/sqlite3-parser/src/parser/parse.y @@ -525,14 +525,14 @@ multiselect_op(A) ::= INTERSECT. {A = CompoundOperator::Intersect;} oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) groupby_opt(P). { - A = OneSelect::Select{ distinctness: D, columns: W, from: X, where_clause: Y, - group_by: P, window_clause: None }; + A = OneSelect::Select(Box::new(SelectInner{ distinctness: D, columns: W, from: X, where_clause: Y, + group_by: P, window_clause: None })); } %ifndef SQLITE_OMIT_WINDOWFUNC oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) groupby_opt(P) window_clause(R). { - A = OneSelect::Select{ distinctness: D, columns: W, from: X, where_clause: Y, - group_by: P, window_clause: Some(R) }; + A = OneSelect::Select(Box::new(SelectInner{ distinctness: D, columns: W, from: X, where_clause: Y, + group_by: P, window_clause: Some(R) })); } %endif