You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Jin Xing (Jira)" <ji...@apache.org> on 2020/01/26 12:59:00 UTC
[jira] [Comment Edited] (CALCITE-2885) SqlValidatorImpl fails when
processing an InferTypes.FIRST_KNOWN function containing a function with a
dynamic parameter as first operand
[ https://issues.apache.org/jira/browse/CALCITE-2885?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17023793#comment-17023793 ]
Jin Xing edited comment on CALCITE-2885 at 1/26/20 12:58 PM:
-------------------------------------------------------------
Hi, Ruben ~
I also came across this issue. *FIRST_KNOWN* infers operand types by calling *deriveType* on operands. In your case (+_select 2 * ? = 4_+), when deriving operand types for *EQUALS* function, type of the dynamic param in *MULTIPLY* is not inferred yet, thus the deriving failed for validation[1][2].
To my best knowledge, type validation might be not needed when infer operand types – – we will do operand type validation anyway after operand type inference. Currently *SqlOperator#checkOperandTypes* already has a param[3] to control whether to swallow the exception if type checking failed. I'm thinking that shall we have a switch to control whether to bypass type validation in *SqlValidatorImpl#deriveType* ? We can disable the type validation during operand type inference and enable afterwards. But note that this change is not trivial – – public methods will be changed to add param for switching.
[1][https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlOperator.java#L534]
[2][https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlOperator.java#L448]
[3][https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlOperator.java#L450]
was (Author: jinxing6042@126.com):
Hi, Ruben ~
I also came across this issue. *FIRST_KNOWN* infers operand types by calling *deriveType* on operands. In your case (+_select 2 * ? = 4_+), when deriving operand types for *EQUALS* function, type of the dynamic param in *MULTIPLY* is not inferred yet, thus the deriving failed for validation[1][2].
To my best knowledge, type validation might be not needed when infer operand types – – we will do operand type validation anyway after operand type inference. I'm thinking that shall we have a switch to control whether to bypass type validation in *SqlValidatorImpl#deriveType* ? We can disable the type validation during operand type inference and enable afterwards. But note that this change is not trivial – – public methods will be changed to add param for switching.
[1][https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlOperator.java#L534]
[2][https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql/SqlOperator.java#L448]
> SqlValidatorImpl fails when processing an InferTypes.FIRST_KNOWN function containing a function with a dynamic parameter as first operand
> -----------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CALCITE-2885
> URL: https://issues.apache.org/jira/browse/CALCITE-2885
> Project: Calcite
> Issue Type: Bug
> Affects Versions: 1.18.0
> Reporter: Ruben Q L
> Priority: Major
>
> Problem can be reproduced by adding following tests (e.g. to SqlValidatorDynamicTest.java):
> {code:java}
> @Test public void testDynamicParameter1() throws Exception {
> final String sql = "select 4 = 2*?";
> sql(sql).ok();
> }
> @Test public void testDynamicParameter2() throws Exception {
> final String sql = "select 2*? = 4";
> sql(sql).ok();
> }
> {code}
> The first test will run successfully, but the second one (which is the same query reversing the equality operands) will fail with the exception:
> {code}
> org.apache.calcite.sql.validate.SqlValidatorException: Cannot apply '*' to arguments of type '<INTEGER> * <UNKNOWN>'. Supported form(s): '<NUMERIC> * <NUMERIC>' '<DATETIME_INTERVAL> * <NUMERIC>' '<NUMERIC> * <DATETIME_INTERVAL>'
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)