[
https://issues.apache.org/jira/browse/CALCITE-3299?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Wang Weidong updated CALCITE-3299:
----------------------------------
Description:
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.
was:
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
// 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 in either the first or second step, but I think solving
it in the second step is more appropriate because SqlNode converting from
RelNode should be same as parsing possibly.
> Handle validating exception for SqlNode of select star converted by RelNode
> ----------------------------------------------------------------------------
>
> 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)