Thanks, Julian.

JIRA filed. https://issues.apache.org/jira/browse/CALCITE-1310


2016-07-08 11:31 GMT+08:00 Julian Hyde <[email protected]>:

> Can you please log a JIRA case for this? I was able to reproduce it by
> adding a single line to SqlValidatorTest.testBind:
>
>   sql("select * from emp where deptno between ? and ?").ok();
>
> and also
>
>   sql("select * from emp where ? between deptno and ?").ok();
>   sql("select * from emp where ? between ? and deptno").ok();
>
> The fix is probably to give SqlBetweenOperator a SqlOperandTypeInference
> like the one in SqlBinaryOperator, where the type of unknown operands is
> deduced to be the same as the type of known operands.
>
> Julian
>
> > On Jul 7, 2016, at 8:10 PM, Yiming Liu <[email protected]> wrote:
> >
> > Hi Calcite developers,
> >
> > I was using Kylin for JDBC query. I know Kylin's SQL parser is based on
> > Calcite. The following PreparedStatement does not work in SQL validation
> > phase.
> >
> > I did some investigation on the Calcite code. It seems the
> > SqlBetweenOperator does not infer the operand type when parsing. So in
> the
> > SQL validation phase, the NULL operandTypeInference will throw out
> > exceptions. At the other side, The SqlInOperator will defer the parameter
> > type when parsing.
> >
> > I did the check on Calcite 1.6-1.8.
> >
> >        final String sql = "select count(*) from kylin_sales where
> > LSTG_SITE_ID between ? and ?";
> >
> >        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
> >            stmt.setInt(1, 0);
> >            stmt.setInt(2, 5);
> >
> >            try (ResultSet rs = stmt.executeQuery()) {
> >                printResultSet(rs);
> >            }
> >        }
> >
> >
> > Following is the detail exception log
> >
> > Caused by: org.apache.calcite.runtime.CalciteContextException: At line 1,
> > column 61: Illegal use of dynamic parameter
> > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> > at
> >
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
> > at
> >
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> > at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> > at
> >
> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
> > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:715)
> > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:703)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3932)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.inferUnknownTypes(SqlValidatorImpl.java:1565)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.inferUnknownTypes(SqlValidatorImpl.java:1648)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateWhereOrOn(SqlValidatorImpl.java:3374)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateWhereClause(SqlValidatorImpl.java:3366)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2961)
> > at
> >
> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
> > at
> >
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:848)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:834)
> > at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:207)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:808)
> > at
> >
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:522)
> > at
> >
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:534)
> > at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:226)
> > at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:196)
> > at
> >
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:721)
> > at
> >
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:588)
> > at
> >
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:558)
> > at
> >
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:214)
> > at
> >
> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:194)
> > ... 78 more
> > Caused by: org.apache.calcite.sql.validate.SqlValidatorException: Illegal
> > use of dynamic parameter
> > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> > at
> >
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
> > at
> >
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> > at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> > at
> >
> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
> > at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:514)
> > ... 101 more
> > --
> > With Warm regards
> >
> > Yiming Liu (刘一鸣)
>
>


-- 
With Warm regards

Yiming Liu (刘一鸣)

Reply via email to