Skip to content

Commit ff4ab68

Browse files
committed
Add support for ROW keyword.
1 parent 393f935 commit ff4ab68

2 files changed

Lines changed: 22 additions & 29 deletions

File tree

crates/gitql-parser/src/parser.rs

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3267,7 +3267,10 @@ fn parse_primary_expression(
32673267
TokenKind::Symbol(_) => parse_symbol_expression(context, env, tokens, position),
32683268
TokenKind::Array => parse_array_value_expression(context, env, tokens, position),
32693269
TokenKind::LeftBracket => parse_array_value_expression(context, env, tokens, position),
3270-
TokenKind::LeftParen => parse_column_or_row_expression(context, env, tokens, position),
3270+
TokenKind::LeftParen => {
3271+
parse_column_or_row_expression(context, env, tokens, position, false)
3272+
}
3273+
TokenKind::Row => parse_column_or_row_expression(context, env, tokens, position, true),
32713274
TokenKind::Case => parse_case_expression(context, env, tokens, position),
32723275
TokenKind::Cast => parse_cast_call_expression(context, env, tokens, position),
32733276
TokenKind::Benchmark => parse_benchmark_call_expression(context, env, tokens, position),
@@ -3519,51 +3522,37 @@ fn parse_column_or_row_expression(
35193522
env: &mut Environment,
35203523
tokens: &[Token],
35213524
position: &mut usize,
3525+
has_row_keyword: bool,
35223526
) -> Result<Box<dyn Expr>, Box<Diagnostic>> {
3523-
// Consume '(' token
3524-
consume_token_or_error(
3527+
// Consume 'row' keyword if present
3528+
if has_row_keyword {
3529+
*position += 1;
3530+
}
3531+
3532+
let exprs = parse_zero_or_more_values_with_comma_between(
3533+
context,
3534+
env,
35253535
tokens,
35263536
position,
3527-
TokenKind::LeftParen,
3528-
"Expect `(` at the start of column or row expression",
3537+
"Column or Row",
35293538
)?;
35303539

3531-
let mut exprs = vec![];
3532-
while !is_current_token(tokens, position, TokenKind::RightParen) {
3533-
exprs.push(parse_expression(context, env, tokens, position)?);
3534-
3535-
if !is_current_token(tokens, position, TokenKind::Comma) {
3536-
break;
3537-
}
3538-
3539-
// Consume `,`
3540-
*position += 1;
3541-
}
3542-
35433540
if exprs.is_empty() {
35443541
return Err(Diagnostic::error("Column or Row expression can't be empty")
35453542
.with_location(calculate_safe_location(tokens, *position))
35463543
.as_boxed());
35473544
}
35483545

3549-
// Consume ')' token
3550-
consume_token_or_error(
3551-
tokens,
3552-
position,
3553-
TokenKind::RightParen,
3554-
"Expect `(` at the end of column or row expression",
3555-
)?;
3556-
3557-
if exprs.len() == 1 {
3558-
let expr = exprs[0].clone();
3559-
Ok(Box::new(ColumnExpr { expr }))
3560-
} else {
3546+
if has_row_keyword || exprs.len() > 1 {
35613547
let mut column_types = Vec::with_capacity(exprs.len());
35623548
for expr in exprs.iter() {
35633549
column_types.push(expr.expr_type());
35643550
}
35653551
let row_type = RowType::new(column_types);
35663552
Ok(Box::new(RowExpr { exprs, row_type }))
3553+
} else {
3554+
let expr = exprs[0].clone();
3555+
Ok(Box::new(ColumnExpr { expr }))
35673556
}
35683557
}
35693558

crates/gitql-parser/src/token.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub enum TokenKind {
6767
Interval,
6868

6969
// Values
70+
Row,
7071
Symbol(String),
7172
GlobalVariable(String),
7273
String(String),
@@ -187,6 +188,7 @@ impl Display for TokenKind {
187188
TokenKind::Interval => "INTERVAL",
188189

189190
// Values
191+
TokenKind::Row => "Row",
190192
TokenKind::Symbol(literal) => literal,
191193
TokenKind::GlobalVariable(literal) => literal,
192194
TokenKind::String(string) => string,
@@ -386,6 +388,8 @@ fn resolve_symbol_kind(symbol: String) -> TokenKind {
386388
"some" => TokenKind::Some,
387389
"any" => TokenKind::Any,
388390

391+
"row" => TokenKind::Row,
392+
389393
// True, False and Null
390394
"true" => TokenKind::True,
391395
"false" => TokenKind::False,

0 commit comments

Comments
 (0)