You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Wang Weidong (Jira)" <ji...@apache.org> on 2019/08/29 13:44:00 UTC

[jira] [Updated] (CALCITE-3299) Replace star identifier as select list of if no operands given while in the method "createCall"

     [ https://issues.apache.org/jira/browse/CALCITE-3299?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Wang Weidong updated CALCITE-3299:
----------------------------------
    Summary: Replace star identifier as select list of  if no operands given while in the method "createCall"  (was: Handle validating exception for SqlNode of select star converted by RelNode )

> Replace star identifier as select list of  if no operands given while in the method "createCall"
> ------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-3299
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3299
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.21.0
>            Reporter: Wang Weidong
>            Assignee: Wang Weidong
>            Priority: Major
>
> h4. Procedure to reproduce the problem:
>  - create table {{~^t^~}}
>  - parse query  ^{{~select * from t~}}^ to SqlNode
>  - convert SqlNode to RelNode
>  - convert RelNode to SqlNode
>  - validate the result SqlNode
> test code is like this
> {code:java}
> // code placeholder
> @Test
> public void testSelectAll() throws Exception {
>   try (Statement s = parserContext.getStatement()) {
>     s.execute("create table if not exists t (i int not null)");
>     String sql = "select * from t";
>     SqlNode sqlNode = parserContext.parseStmt(sql);
>     parserContext.getSqlValidator().validate(sqlNode);
>     RelNode relNode = parserContext.getSqlToRelConverter().convertQuery(sqlNode, true, true).rel;
>     SqlNode sqlNodeNew = toSqlNode(relNode);
>     parserContext.getSqlValidator().validate(sqlNodeNew);
>   }
> }
> {code}
> Finally we will get an exception as follow:
> {code:java}
> // code placeholder
> org.apache.calcite.rel.rel2sql.SqlImplementor#wrapSelectorg.apache.calcite.rel.rel2sql.SqlImplementor#wrapSelectjava.lang.NullPointerException at org.apache.calcite.sql.validate.AggFinder.findAgg(AggFinder.java:58) at org.apache.calcite.sql.validate.SqlValidatorImpl.getAgg(SqlValidatorImpl.java:2774) at org.apache.calcite.sql.validate.SqlValidatorImpl.getAggregate(SqlValidatorImpl.java:2761) at org.apache.calcite.sql.validate.SqlValidatorImpl.isAggregate(SqlValidatorImpl.java:2720) at org.apache.calcite.sql.validate.SqlValidatorImpl.registerQuery(SqlValidatorImpl.java:2406) at org.apache.calcite.sql.validate.SqlValidatorImpl.registerQuery(SqlValidatorImpl.java:2326) at org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:916) at org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:628) at org.apache.calcite.test.OptimizeTest.testSelectAll(OptimizeTest.java:206) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70){code}
>  
> After debugging, I found that the *main causes* of this exception are as follows.
> First, while converting RelNode to SqlNode, in the method {{~{color:#172b4d}^org.apache.calcite.rel.rel2sql.SqlImplementor#wrapSelect^{color}~}}
>  [https://github.com/apache/calcite/blob/c3108bc1231b2aa4ba25227d225544fef4576508/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java#L420],
> the selectList of SqlSelect instance was set to null.
> Second,  while validating  the result SqlNode, in the method  {{org.apache.calcite.sql.validate.AggFinder#findAgg}}
>  [https://github.com/apache/calcite/blob/c3108bc1231b2aa4ba25227d225544fef4576508/core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java#L59] ,
> there is with no nullable checking.
>  
> *How to solve this problem?*  
> I think we can solve it either in the first or second step, but solving it in the second step is more appropriate because SqlNode converted from RelNode should be same with the result parsed from sql string possibly.
>  



--
This message was sent by Atlassian Jira
(v8.3.2#803003)