@@ -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
0 commit comments