Skip to content

Commit 862fe61

Browse files
committed
SQL: Fix precedence of :: psql like CAST operator (#40665)
Previously, an expression like `10 + 2::long` would be interpreted as `CAST(10 + 2 AS LONG)` instead of `10 + CAST(2 AS LONG)`. (cherry picked from commit e34cc2f)
1 parent 31776a4 commit 862fe61

File tree

8 files changed

+633
-576
lines changed

8 files changed

+633
-576
lines changed

x-pack/plugin/sql/src/main/antlr/SqlBase.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,11 @@ valueExpression
210210
| left=valueExpression operator=(ASTERISK | SLASH | PERCENT) right=valueExpression #arithmeticBinary
211211
| left=valueExpression operator=(PLUS | MINUS) right=valueExpression #arithmeticBinary
212212
| left=valueExpression comparisonOperator right=valueExpression #comparison
213-
| valueExpression CAST_OP dataType #castOperatorExpression
214213
;
215214

216215
primaryExpression
217216
: castExpression #cast
217+
| primaryExpression CAST_OP dataType #castOperatorExpression
218218
| extractExpression #extract
219219
| builtinDateTimeFunction #currentDateTimeFunction
220220
| constant #constantDefault

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ private static DataType dataType(Source ctx, String string) {
416416

417417
@Override
418418
public Object visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) {
419-
return new Cast(source(ctx), expression(ctx.valueExpression()), typedParsing(ctx.dataType(), DataType.class));
419+
return new Cast(source(ctx), expression(ctx.primaryExpression()), typedParsing(ctx.dataType(), DataType.class));
420420
}
421421

422422
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -604,37 +604,37 @@ class SqlBaseBaseListener implements SqlBaseListener {
604604
*
605605
* <p>The default implementation does nothing.</p>
606606
*/
607-
@Override public void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
607+
@Override public void enterArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
608608
/**
609609
* {@inheritDoc}
610610
*
611611
* <p>The default implementation does nothing.</p>
612612
*/
613-
@Override public void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
613+
@Override public void exitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
614614
/**
615615
* {@inheritDoc}
616616
*
617617
* <p>The default implementation does nothing.</p>
618618
*/
619-
@Override public void enterArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
619+
@Override public void enterArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
620620
/**
621621
* {@inheritDoc}
622622
*
623623
* <p>The default implementation does nothing.</p>
624624
*/
625-
@Override public void exitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
625+
@Override public void exitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
626626
/**
627627
* {@inheritDoc}
628628
*
629629
* <p>The default implementation does nothing.</p>
630630
*/
631-
@Override public void enterArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
631+
@Override public void enterDereference(SqlBaseParser.DereferenceContext ctx) { }
632632
/**
633633
* {@inheritDoc}
634634
*
635635
* <p>The default implementation does nothing.</p>
636636
*/
637-
@Override public void exitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
637+
@Override public void exitDereference(SqlBaseParser.DereferenceContext ctx) { }
638638
/**
639639
* {@inheritDoc}
640640
*
@@ -652,37 +652,37 @@ class SqlBaseBaseListener implements SqlBaseListener {
652652
*
653653
* <p>The default implementation does nothing.</p>
654654
*/
655-
@Override public void enterExtract(SqlBaseParser.ExtractContext ctx) { }
655+
@Override public void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
656656
/**
657657
* {@inheritDoc}
658658
*
659659
* <p>The default implementation does nothing.</p>
660660
*/
661-
@Override public void exitExtract(SqlBaseParser.ExtractContext ctx) { }
661+
@Override public void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
662662
/**
663663
* {@inheritDoc}
664664
*
665665
* <p>The default implementation does nothing.</p>
666666
*/
667-
@Override public void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
667+
@Override public void enterExtract(SqlBaseParser.ExtractContext ctx) { }
668668
/**
669669
* {@inheritDoc}
670670
*
671671
* <p>The default implementation does nothing.</p>
672672
*/
673-
@Override public void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
673+
@Override public void exitExtract(SqlBaseParser.ExtractContext ctx) { }
674674
/**
675675
* {@inheritDoc}
676676
*
677677
* <p>The default implementation does nothing.</p>
678678
*/
679-
@Override public void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
679+
@Override public void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
680680
/**
681681
* {@inheritDoc}
682682
*
683683
* <p>The default implementation does nothing.</p>
684684
*/
685-
@Override public void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
685+
@Override public void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
686686
/**
687687
* {@inheritDoc}
688688
*
@@ -700,49 +700,49 @@ class SqlBaseBaseListener implements SqlBaseListener {
700700
*
701701
* <p>The default implementation does nothing.</p>
702702
*/
703-
@Override public void enterFunction(SqlBaseParser.FunctionContext ctx) { }
703+
@Override public void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
704704
/**
705705
* {@inheritDoc}
706706
*
707707
* <p>The default implementation does nothing.</p>
708708
*/
709-
@Override public void exitFunction(SqlBaseParser.FunctionContext ctx) { }
709+
@Override public void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
710710
/**
711711
* {@inheritDoc}
712712
*
713713
* <p>The default implementation does nothing.</p>
714714
*/
715-
@Override public void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
715+
@Override public void enterFunction(SqlBaseParser.FunctionContext ctx) { }
716716
/**
717717
* {@inheritDoc}
718718
*
719719
* <p>The default implementation does nothing.</p>
720720
*/
721-
@Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
721+
@Override public void exitFunction(SqlBaseParser.FunctionContext ctx) { }
722722
/**
723723
* {@inheritDoc}
724724
*
725725
* <p>The default implementation does nothing.</p>
726726
*/
727-
@Override public void enterDereference(SqlBaseParser.DereferenceContext ctx) { }
727+
@Override public void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
728728
/**
729729
* {@inheritDoc}
730730
*
731731
* <p>The default implementation does nothing.</p>
732732
*/
733-
@Override public void exitDereference(SqlBaseParser.DereferenceContext ctx) { }
733+
@Override public void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
734734
/**
735735
* {@inheritDoc}
736736
*
737737
* <p>The default implementation does nothing.</p>
738738
*/
739-
@Override public void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
739+
@Override public void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
740740
/**
741741
* {@inheritDoc}
742742
*
743743
* <p>The default implementation does nothing.</p>
744744
*/
745-
@Override public void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
745+
@Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
746746
/**
747747
* {@inheritDoc}
748748
*

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -360,21 +360,21 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
360360
* <p>The default implementation returns the result of calling
361361
* {@link #visitChildren} on {@code ctx}.</p>
362362
*/
363-
@Override public T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { return visitChildren(ctx); }
363+
@Override public T visitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { return visitChildren(ctx); }
364364
/**
365365
* {@inheritDoc}
366366
*
367367
* <p>The default implementation returns the result of calling
368368
* {@link #visitChildren} on {@code ctx}.</p>
369369
*/
370-
@Override public T visitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { return visitChildren(ctx); }
370+
@Override public T visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { return visitChildren(ctx); }
371371
/**
372372
* {@inheritDoc}
373373
*
374374
* <p>The default implementation returns the result of calling
375375
* {@link #visitChildren} on {@code ctx}.</p>
376376
*/
377-
@Override public T visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { return visitChildren(ctx); }
377+
@Override public T visitDereference(SqlBaseParser.DereferenceContext ctx) { return visitChildren(ctx); }
378378
/**
379379
* {@inheritDoc}
380380
*
@@ -388,21 +388,21 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
388388
* <p>The default implementation returns the result of calling
389389
* {@link #visitChildren} on {@code ctx}.</p>
390390
*/
391-
@Override public T visitExtract(SqlBaseParser.ExtractContext ctx) { return visitChildren(ctx); }
391+
@Override public T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { return visitChildren(ctx); }
392392
/**
393393
* {@inheritDoc}
394394
*
395395
* <p>The default implementation returns the result of calling
396396
* {@link #visitChildren} on {@code ctx}.</p>
397397
*/
398-
@Override public T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { return visitChildren(ctx); }
398+
@Override public T visitExtract(SqlBaseParser.ExtractContext ctx) { return visitChildren(ctx); }
399399
/**
400400
* {@inheritDoc}
401401
*
402402
* <p>The default implementation returns the result of calling
403403
* {@link #visitChildren} on {@code ctx}.</p>
404404
*/
405-
@Override public T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { return visitChildren(ctx); }
405+
@Override public T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); }
406406
/**
407407
* {@inheritDoc}
408408
*
@@ -416,28 +416,28 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
416416
* <p>The default implementation returns the result of calling
417417
* {@link #visitChildren} on {@code ctx}.</p>
418418
*/
419-
@Override public T visitFunction(SqlBaseParser.FunctionContext ctx) { return visitChildren(ctx); }
419+
@Override public T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { return visitChildren(ctx); }
420420
/**
421421
* {@inheritDoc}
422422
*
423423
* <p>The default implementation returns the result of calling
424424
* {@link #visitChildren} on {@code ctx}.</p>
425425
*/
426-
@Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
426+
@Override public T visitFunction(SqlBaseParser.FunctionContext ctx) { return visitChildren(ctx); }
427427
/**
428428
* {@inheritDoc}
429429
*
430430
* <p>The default implementation returns the result of calling
431431
* {@link #visitChildren} on {@code ctx}.</p>
432432
*/
433-
@Override public T visitDereference(SqlBaseParser.DereferenceContext ctx) { return visitChildren(ctx); }
433+
@Override public T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { return visitChildren(ctx); }
434434
/**
435435
* {@inheritDoc}
436436
*
437437
* <p>The default implementation returns the result of calling
438438
* {@link #visitChildren} on {@code ctx}.</p>
439439
*/
440-
@Override public T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); }
440+
@Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
441441
/**
442442
* {@inheritDoc}
443443
*

0 commit comments

Comments
 (0)