Browse Source

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)`.
Marios Trivyzas 6 years ago
parent
commit
e34cc2f38b

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

@@ -210,11 +210,11 @@ valueExpression
     | left=valueExpression operator=(ASTERISK | SLASH | PERCENT) right=valueExpression  #arithmeticBinary
     | left=valueExpression operator=(PLUS | MINUS) right=valueExpression                #arithmeticBinary
     | left=valueExpression comparisonOperator right=valueExpression                     #comparison
-    | valueExpression CAST_OP dataType                                                  #castOperatorExpression
     ;
 
 primaryExpression
     : castExpression                                                                 #cast
+    | primaryExpression CAST_OP dataType                                             #castOperatorExpression
     | extractExpression                                                              #extract
     | builtinDateTimeFunction                                                        #currentDateTimeFunction
     | constant                                                                       #constantDefault

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

@@ -416,7 +416,7 @@ abstract class ExpressionBuilder extends IdentifierBuilder {
 
     @Override
     public Object visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) {
-        return new Cast(source(ctx), expression(ctx.valueExpression()), typedParsing(ctx.dataType(), DataType.class));
+        return new Cast(source(ctx), expression(ctx.primaryExpression()), typedParsing(ctx.dataType(), DataType.class));
     }
 
     @Override

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

@@ -604,37 +604,37 @@ class SqlBaseBaseListener implements SqlBaseListener {
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
+  @Override public void enterArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
+  @Override public void exitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
+  @Override public void enterArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { }
+  @Override public void exitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
+  @Override public void enterDereference(SqlBaseParser.DereferenceContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { }
+  @Override public void exitDereference(SqlBaseParser.DereferenceContext ctx) { }
   /**
    * {@inheritDoc}
    *
@@ -652,37 +652,37 @@ class SqlBaseBaseListener implements SqlBaseListener {
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterExtract(SqlBaseParser.ExtractContext ctx) { }
+  @Override public void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitExtract(SqlBaseParser.ExtractContext ctx) { }
+  @Override public void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
+  @Override public void enterExtract(SqlBaseParser.ExtractContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
+  @Override public void exitExtract(SqlBaseParser.ExtractContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
+  @Override public void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { }
+  @Override public void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *
@@ -700,49 +700,49 @@ class SqlBaseBaseListener implements SqlBaseListener {
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterFunction(SqlBaseParser.FunctionContext ctx) { }
+  @Override public void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitFunction(SqlBaseParser.FunctionContext ctx) { }
+  @Override public void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
+  @Override public void enterFunction(SqlBaseParser.FunctionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
+  @Override public void exitFunction(SqlBaseParser.FunctionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterDereference(SqlBaseParser.DereferenceContext ctx) { }
+  @Override public void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitDereference(SqlBaseParser.DereferenceContext ctx) { }
+  @Override public void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
+  @Override public void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation does nothing.</p>
    */
-  @Override public void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { }
+  @Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
   /**
    * {@inheritDoc}
    *

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

@@ -360,21 +360,21 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { return visitChildren(ctx); }
+  @Override public T visitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitArithmeticBinary(SqlBaseParser.ArithmeticBinaryContext ctx) { return visitChildren(ctx); }
+  @Override public T visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx) { return visitChildren(ctx); }
+  @Override public T visitDereference(SqlBaseParser.DereferenceContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
@@ -388,21 +388,21 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitExtract(SqlBaseParser.ExtractContext ctx) { return visitChildren(ctx); }
+  @Override public T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { return visitChildren(ctx); }
+  @Override public T visitExtract(SqlBaseParser.ExtractContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx) { return visitChildren(ctx); }
+  @Override public T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
@@ -416,28 +416,28 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitFunction(SqlBaseParser.FunctionContext ctx) { return visitChildren(ctx); }
+  @Override public T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
+  @Override public T visitFunction(SqlBaseParser.FunctionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitDereference(SqlBaseParser.DereferenceContext ctx) { return visitChildren(ctx); }
+  @Override public T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *
    * <p>The default implementation returns the result of calling
    * {@link #visitChildren} on {@code ctx}.</p>
    */
-  @Override public T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); }
+  @Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *

+ 40 - 40
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java

@@ -549,18 +549,6 @@ interface SqlBaseListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitComparison(SqlBaseParser.ComparisonContext ctx);
-  /**
-   * Enter a parse tree produced by the {@code castOperatorExpression}
-   * labeled alternative in {@link SqlBaseParser#valueExpression}.
-   * @param ctx the parse tree
-   */
-  void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
-  /**
-   * Exit a parse tree produced by the {@code castOperatorExpression}
-   * labeled alternative in {@link SqlBaseParser#valueExpression}.
-   * @param ctx the parse tree
-   */
-  void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
   /**
    * Enter a parse tree produced by the {@code arithmeticBinary}
    * labeled alternative in {@link SqlBaseParser#valueExpression}.
@@ -585,6 +573,18 @@ interface SqlBaseListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx);
+  /**
+   * Enter a parse tree produced by the {@code dereference}
+   * labeled alternative in {@link SqlBaseParser#primaryExpression}.
+   * @param ctx the parse tree
+   */
+  void enterDereference(SqlBaseParser.DereferenceContext ctx);
+  /**
+   * Exit a parse tree produced by the {@code dereference}
+   * labeled alternative in {@link SqlBaseParser#primaryExpression}.
+   * @param ctx the parse tree
+   */
+  void exitDereference(SqlBaseParser.DereferenceContext ctx);
   /**
    * Enter a parse tree produced by the {@code cast}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
@@ -598,41 +598,41 @@ interface SqlBaseListener extends ParseTreeListener {
    */
   void exitCast(SqlBaseParser.CastContext ctx);
   /**
-   * Enter a parse tree produced by the {@code extract}
+   * Enter a parse tree produced by the {@code constantDefault}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterExtract(SqlBaseParser.ExtractContext ctx);
+  void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
   /**
-   * Exit a parse tree produced by the {@code extract}
+   * Exit a parse tree produced by the {@code constantDefault}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitExtract(SqlBaseParser.ExtractContext ctx);
+  void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
   /**
-   * Enter a parse tree produced by the {@code currentDateTimeFunction}
+   * Enter a parse tree produced by the {@code extract}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
+  void enterExtract(SqlBaseParser.ExtractContext ctx);
   /**
-   * Exit a parse tree produced by the {@code currentDateTimeFunction}
+   * Exit a parse tree produced by the {@code extract}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
+  void exitExtract(SqlBaseParser.ExtractContext ctx);
   /**
-   * Enter a parse tree produced by the {@code constantDefault}
+   * Enter a parse tree produced by the {@code parenthesizedExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
+  void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
   /**
-   * Exit a parse tree produced by the {@code constantDefault}
+   * Exit a parse tree produced by the {@code parenthesizedExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
+  void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
   /**
    * Enter a parse tree produced by the {@code star}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
@@ -646,53 +646,53 @@ interface SqlBaseListener extends ParseTreeListener {
    */
   void exitStar(SqlBaseParser.StarContext ctx);
   /**
-   * Enter a parse tree produced by the {@code function}
+   * Enter a parse tree produced by the {@code castOperatorExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterFunction(SqlBaseParser.FunctionContext ctx);
+  void enterCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
   /**
-   * Exit a parse tree produced by the {@code function}
+   * Exit a parse tree produced by the {@code castOperatorExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitFunction(SqlBaseParser.FunctionContext ctx);
+  void exitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
   /**
-   * Enter a parse tree produced by the {@code subqueryExpression}
+   * Enter a parse tree produced by the {@code function}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
+  void enterFunction(SqlBaseParser.FunctionContext ctx);
   /**
-   * Exit a parse tree produced by the {@code subqueryExpression}
+   * Exit a parse tree produced by the {@code function}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
+  void exitFunction(SqlBaseParser.FunctionContext ctx);
   /**
-   * Enter a parse tree produced by the {@code dereference}
+   * Enter a parse tree produced by the {@code currentDateTimeFunction}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterDereference(SqlBaseParser.DereferenceContext ctx);
+  void enterCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
   /**
-   * Exit a parse tree produced by the {@code dereference}
+   * Exit a parse tree produced by the {@code currentDateTimeFunction}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitDereference(SqlBaseParser.DereferenceContext ctx);
+  void exitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
   /**
-   * Enter a parse tree produced by the {@code parenthesizedExpression}
+   * Enter a parse tree produced by the {@code subqueryExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void enterParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
+  void enterSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
   /**
-   * Exit a parse tree produced by the {@code parenthesizedExpression}
+   * Exit a parse tree produced by the {@code subqueryExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    */
-  void exitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
+  void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
   /**
    * Enter a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
    * @param ctx the parse tree

File diff suppressed because it is too large
+ 243 - 208
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java


+ 21 - 21
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java

@@ -330,13 +330,6 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitComparison(SqlBaseParser.ComparisonContext ctx);
-  /**
-   * Visit a parse tree produced by the {@code castOperatorExpression}
-   * labeled alternative in {@link SqlBaseParser#valueExpression}.
-   * @param ctx the parse tree
-   * @return the visitor result
-   */
-  T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
   /**
    * Visit a parse tree produced by the {@code arithmeticBinary}
    * labeled alternative in {@link SqlBaseParser#valueExpression}.
@@ -351,6 +344,13 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext ctx);
+  /**
+   * Visit a parse tree produced by the {@code dereference}
+   * labeled alternative in {@link SqlBaseParser#primaryExpression}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitDereference(SqlBaseParser.DereferenceContext ctx);
   /**
    * Visit a parse tree produced by the {@code cast}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
@@ -359,26 +359,26 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
    */
   T visitCast(SqlBaseParser.CastContext ctx);
   /**
-   * Visit a parse tree produced by the {@code extract}
+   * Visit a parse tree produced by the {@code constantDefault}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitExtract(SqlBaseParser.ExtractContext ctx);
+  T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
   /**
-   * Visit a parse tree produced by the {@code currentDateTimeFunction}
+   * Visit a parse tree produced by the {@code extract}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
+  T visitExtract(SqlBaseParser.ExtractContext ctx);
   /**
-   * Visit a parse tree produced by the {@code constantDefault}
+   * Visit a parse tree produced by the {@code parenthesizedExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitConstantDefault(SqlBaseParser.ConstantDefaultContext ctx);
+  T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
   /**
    * Visit a parse tree produced by the {@code star}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
@@ -387,33 +387,33 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
    */
   T visitStar(SqlBaseParser.StarContext ctx);
   /**
-   * Visit a parse tree produced by the {@code function}
+   * Visit a parse tree produced by the {@code castOperatorExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitFunction(SqlBaseParser.FunctionContext ctx);
+  T visitCastOperatorExpression(SqlBaseParser.CastOperatorExpressionContext ctx);
   /**
-   * Visit a parse tree produced by the {@code subqueryExpression}
+   * Visit a parse tree produced by the {@code function}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
+  T visitFunction(SqlBaseParser.FunctionContext ctx);
   /**
-   * Visit a parse tree produced by the {@code dereference}
+   * Visit a parse tree produced by the {@code currentDateTimeFunction}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitDereference(SqlBaseParser.DereferenceContext ctx);
+  T visitCurrentDateTimeFunction(SqlBaseParser.CurrentDateTimeFunctionContext ctx);
   /**
-   * Visit a parse tree produced by the {@code parenthesizedExpression}
+   * Visit a parse tree produced by the {@code subqueryExpression}
    * labeled alternative in {@link SqlBaseParser#primaryExpression}.
    * @param ctx the parse tree
    * @return the visitor result
    */
-  T visitParenthesizedExpression(SqlBaseParser.ParenthesizedExpressionContext ctx);
+  T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
   /**
    * Visit a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
    * @param ctx the parse tree

+ 13 - 0
x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/ExpressionTests.java

@@ -282,6 +282,19 @@ public class ExpressionTests extends ESTestCase {
         assertEquals("line 1:12: Does not recognize type [InVaLiD]", ex.getMessage());
     }
 
+    public void testCastOperatorPrecedence() {
+        Expression expr = parser.createExpression("(10* 2::long)");
+        assertEquals(Mul.class, expr.getClass());
+        Mul mul = (Mul) expr;
+        assertEquals(DataType.LONG, mul.dataType());
+        assertEquals(DataType.INTEGER, mul.left().dataType());
+        assertEquals(Cast.class, mul.right().getClass());
+        Cast cast = (Cast) mul.right();
+        assertEquals(DataType.INTEGER, cast.from());
+        assertEquals(DataType.LONG, cast.to());
+        assertEquals(DataType.LONG, cast.dataType());
+    }
+
     public void testCastOperatorWithUnquotedDataType() {
         Expression expr = parser.createExpression("(10* 2)::long");
         assertEquals(Cast.class, expr.getClass());

Some files were not shown because too many files changed in this diff