Skip to content

Commit f1498da

Browse files
authored
Add VALUES clause (#117)
1 parent 6712c9c commit f1498da

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

partiql-ast/src/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ pub enum QuerySet {
268268
SetOp(Box<SetExprAst>),
269269
Select(Box<SelectAst>),
270270
Expr(Box<Expr>),
271+
Values(Vec<Box<Expr>>),
271272
}
272273

273274
#[derive(Clone, Debug, PartialEq)]

partiql-parser/src/lexer.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,8 @@ pub enum Token<'input> {
592592
Using,
593593
#[regex("(?i:Value)")]
594594
Value,
595+
#[regex("(?i:Values)")]
596+
Values,
595597
#[regex("(?i:Where)")]
596598
Where,
597599
#[regex("(?i:With)")]
@@ -690,6 +692,7 @@ impl<'input> fmt::Display for Token<'input> {
690692
| Token::Unpivot
691693
| Token::Using
692694
| Token::Value
695+
| Token::Values
693696
| Token::Where
694697
| Token::With => {
695698
write!(f, "{}", format!("{:?}", self).to_uppercase())
@@ -717,7 +720,7 @@ mod tests {
717720
"WiTH Where Value uSiNg Unpivot UNION True Select right Preserve pivoT Outer Order Or \
718721
On Offset Nulls Null Not Natural Missing Limit Like Left Lateral Last Join \
719722
Intersect Is Inner In Having Group From Full First False Except Escape Desc \
720-
Cross By Between At As And Asc All";
723+
Cross By Between At As And Asc All Values";
721724
let symbols = symbols.split(' ').chain(primitives.split(' '));
722725
let keywords = keywords.split(' ');
723726

@@ -737,7 +740,7 @@ mod tests {
737740
"LIMIT", "/", "LIKE", "^", "LEFT", ".", "LATERAL", "||", "LAST", ":", "JOIN",
738741
"--", "INTERSECT", "/**/", "IS", "<ident:IDENT>", "INNER", "<atident:@IDENT>", "IN",
739742
"HAVING", "GROUP", "FROM", "FULL", "FIRST", "FALSE", "EXCEPT", "ESCAPE", "DESC",
740-
"CROSS", "BY", "BETWEEN", "AT", "AS", "AND", "ASC", "ALL"
743+
"CROSS", "BY", "BETWEEN", "AT", "AS", "AND", "ASC", "ALL", "VALUES"
741744
];
742745
let displayed = toks
743746
.into_iter()

partiql-parser/src/parse/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,15 @@ mod tests {
384384
}
385385
}
386386

387+
mod values {
388+
use super::*;
389+
390+
#[test]
391+
fn values() {
392+
parse!("VALUES ('A', `5e0`), ('B', 3.0), ('X', 9.0)");
393+
}
394+
}
395+
387396
mod set_ops {
388397
use super::*;
389398

partiql-parser/src/parse/partiql.lalrpop

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,16 @@ pub SingleQuery: ast::QuerySetAst = {
9191
}
9292
},
9393
<lo:@L> <sfw:SfwQuery> <hi:@R> => ast::QuerySet::Select( Box::new(sfw) ).ast(lo..hi),
94+
<lo:@L> <values:Values> <hi:@R> => values,
95+
}
96+
97+
Values: ast::QuerySetAst = {
98+
<lo:@L> "VALUES" <rows:CommaSepPlus<ValueRow>> <hi:@R> => ast::QuerySet::Values( rows ).ast(lo..hi)
99+
}
100+
101+
#[inline]
102+
ValueRow: Box<ast::Expr> = {
103+
<array:ExprTermArrayParens> => Box::new(array)
94104
}
95105

96106
// ------------------------------------------------------------------------------ //
@@ -735,11 +745,34 @@ pub ExprTerm: ast::Expr = {
735745
"(" <q:Query> ")" => *q,
736746
<lo:@L> <lit:Literal> <hi:@R> => ast::Expr{ kind: ast::ExprKind::Lit( lit.ast(lo..hi) ) },
737747
<lo:@L> <path:PathExpr> <hi:@R> => ast::Expr{ kind: ast::ExprKind::Path( path.ast(lo..hi) ) },
738-
<lo:@L> "{" <fields:CommaTermStar<ExprPair>> "}" <hi:@R> => ast::Expr{ kind: ast::ExprKind::Struct( ast::Struct{fields}.ast(lo..hi) ) },
739-
<lo:@L> "[" <values:CommaTermStar<ExprQuery>> "]" <hi:@R> => ast::Expr{ kind: ast::ExprKind::List( ast::List{values}.ast(lo..hi) ) },
748+
<ExprTermArray>,
749+
<ExprTermBag>,
750+
<ExprTermTuple>,
751+
! => { errors.push(<>); ast::Expr{ kind: ast::ExprKind::Error} },
752+
}
753+
754+
#[inline]
755+
ExprTermArray: ast::Expr = {
756+
<ExprTermArrayBrackets>,
757+
<ExprTermArrayParens>
758+
}
759+
#[inline]
760+
ExprTermArrayBrackets: ast::Expr = {
761+
<lo:@L> "[" <values:CommaTermStar<ExprQuery>> "]" <hi:@R> => ast::Expr{ kind: ast::ExprKind::List( ast::List{values}.ast(lo..hi) ) }
762+
}
763+
#[inline]
764+
ExprTermArrayParens: ast::Expr = {
740765
<lo:@L> "(" <values:CommaTermPlus<ExprQuery>> ")" <hi:@R> => ast::Expr{ kind: ast::ExprKind::List( ast::List{values}.ast(lo..hi) ) },
766+
}
767+
768+
#[inline]
769+
ExprTermBag: ast::Expr = {
741770
<lo:@L> "<<" <values:CommaTermStar<ExprQuery>> ">>" <hi:@R> => ast::Expr{ kind: ast::ExprKind::Bag( ast::Bag{values}.ast(lo..hi) ) },
742-
! => { errors.push(<>); ast::Expr{ kind: ast::ExprKind::Error} },
771+
}
772+
773+
#[inline]
774+
ExprTermTuple: ast::Expr = {
775+
<lo:@L> "{" <fields:CommaTermStar<ExprPair>> "}" <hi:@R> => ast::Expr{ kind: ast::ExprKind::Struct( ast::Struct{fields}.ast(lo..hi) ) }
743776
}
744777

745778
ExprPair: ast::ExprPair = {
@@ -1035,6 +1068,7 @@ extern {
10351068
"UNPIVOT" => lexer::Token::Unpivot,
10361069
"USING" => lexer::Token::Using,
10371070
"VALUE" => lexer::Token::Value,
1071+
"VALUES" => lexer::Token::Values,
10381072
"WHERE" => lexer::Token::Where,
10391073
"WITH" => lexer::Token::With,
10401074
}

0 commit comments

Comments
 (0)