@@ -9,20 +9,28 @@ use partiql_ast::ast;
99
1010use partiql_source_map::location::{ByteOffset, BytePosition, Location, ToLocated};
1111
12- use crate::parse::parse_util::{strip_query, CallSite, Attrs, Synth};
12+ use crate::parse::parse_util::{strip_expr, strip_query, strip_query_set , CallSite, Attrs, Synth};
1313use crate::parse::parser_state::{ParserState, IdGenerator};
1414
1515grammar<'input, 'state, Id>(input: &'input str, state: &'state mut ParserState<'input, Id>) where Id: IdGenerator;
1616
1717
18- pub(crate) Query: Box <ast::Expr > = {
18+ pub(crate) TopLevelQuery: ast::AstNode <ast::TopLevelQuery > = {
1919 <lo:@L>
2020 <with:WithClause?>
21+ <query:Query>
22+ <hi:@R> => {
23+ state.node(ast::TopLevelQuery { with, query }, lo..hi)
24+ }
25+ }
26+
27+ Query: ast::AstNode<ast::Query> = {
28+ <lo:@L>
2129 <set:QuerySet>
2230 <order_by:OrderByClause?>
2331 <limit_offset:LimitOffsetClause>
2432 <hi:@R> => {
25- Box::new(ast::Expr::Query( state.node(ast::Query { with, set, order_by, limit_offset }, lo..hi) ) )
33+ state.node(ast::Query { set, order_by, limit_offset }, lo..hi)
2634 }
2735}
2836
@@ -94,7 +102,9 @@ WithCycleClause : () = {
94102// - all set operations are left-associative and are thus expressed as left-self-recursive rules
95103
96104QuerySet: ast::AstNode<ast::QuerySet> = {
97- <lo:@L> <lhs:QuerySet> <setop:SetOp> <setq:SetQuantifier> <rhs:SingleQuery> <hi:@R> => {
105+ <lo:@L> <lhs:Query> <setop:SetOp> <setq:SetQuantifier> <rhs:SingleQuery> <hi:@R> => {
106+ let lhs = strip_query(lhs);
107+ let rhs = strip_query_set(rhs, state, lo, hi);
98108 let set_expr = state.node(ast::SetExpr {
99109 setop,
100110 setq,
@@ -133,7 +143,7 @@ SetQuantifier: ast::SetQuantifier = {
133143SingleQuery: ast::AstNode<ast::QuerySet> = {
134144 <lo:@L> <expr:ExprQuery> <hi:@R> => {
135145 match *expr {
136- ast::Expr::Query(ast::AstNode{ node: ast::Query{with: None, set, order_by:None, limit_offset:None} , .. }) => set,
146+ ast::Expr::Query(ast::AstNode{ node: ast::Query{set, order_by:None, limit_offset:None} , .. }) => set,
137147 _ => state.node(ast::QuerySet::Expr( expr ), lo..hi),
138148 }
139149 },
@@ -907,7 +917,7 @@ ExprTerm: Synth<ast::Expr> = {
907917}
908918
909919SubQuery: ast::Expr = {
910- "(" <q:Query> ")" => *strip_query (q),
920+ "(" <q:Query> ")" => *strip_expr (q),
911921}
912922
913923SubQueryAst: ast::AstNode<ast::Expr> = {
@@ -1050,7 +1060,7 @@ FunctionCallArgs: Vec<ast::AstNode<ast::CallArg>> = {
10501060 // Special case subquery when it is the only sub-expression of a function call (e.g., `SELECT AVG(SELECT VALUE price FROM g AS v))... `)
10511061 <lo:@L> <subq:SfwQuery> <hi:@R> => {
10521062 let qset = state.node(ast::QuerySet::Select(Box::new(subq)), lo..hi);
1053- let query = state.node(ast::Query{ with: None, set: qset, order_by: None, limit_offset:None }, lo..hi);
1063+ let query = state.node(ast::Query{ set: qset, order_by: None, limit_offset:None }, lo..hi);
10541064 vec![state.node(ast::CallArg::Positional(Box::new(ast::Expr::Query(query))), lo..hi)]
10551065 },
10561066}
0 commit comments