TaoJIn created CALCITE-4430:
-------------------------------

             Summary: RelToSqlConverter stack error
                 Key: CALCITE-4430
                 URL: https://issues.apache.org/jira/browse/CALCITE-4430
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.26.0, 1.25.0, 1.24.0
         Environment: jdk

{code}

openjdk version "11.0.9.1" 2020-11-04 
OpenJDK Runtime Environment (build 11.0.9.1+1-post-Debian-1deb10u2) 
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-post-Debian-1deb10u2, mixed mode, 
sharing)

{code}

maven pom

{code:xml}

                <dependency>
                        <groupId>org.apache.calcite</groupId>
                        <artifactId>calcite-core</artifactId>
                        <version>1.26.0</version>
                </dependency>
                <dependency>
                        <groupId>com.google.guava</groupId>
                        <artifactId>guava</artifactId>
                        <version>23.0</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-dbcp2</artifactId>
                        <version>2.7.0</version>
                </dependency>
                <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>42.2.18</version>
                </dependency>

{code}
            Reporter: TaoJIn


quer:
{code:sql}
SELECT id, CAST(uptime AS DATE) 
FROM public.testdata
WHERE uptime < '2011-12-01 00:00:00.000' AND id > 100
{code}
The logical plan as below:
{code:java}
      LogicalProject(id=[$0], CAST=[CAST($1):DATE])
        LogicalFilter(condition=[AND(<($1, 2011-12-01 00:00:00), >($0, 100))])
          JdbcTableScan(table=[[public, testdata]])
{code}
Convert it to sql ,
{code:java}
        RelToSqlConverter converter = new 
RelToSqlConverter(PostgresqlSqlDialect.DEFAULT);
        SqlSelect select = converter.visit(project1).asSelect();
{code}
it throw exception:
{code:java}
Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:221)
    at 
org.apache.calcite.rel.rel2sql.RelToSqlConverter.result(RelToSqlConverter.java:152)
    at 
org.apache.calcite.rel.rel2sql.SqlImplementor.result(SqlImplementor.java:483)
    at 
org.apache.calcite.rel.rel2sql.SqlImplementor$Builder.result(SqlImplementor.java:1970)
    at 
org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(RelToSqlConverter.java:351)
    at com.glodon.newcalcite.App.main(App.java:111)
{code}
Here is this the bug explain:

In class *RelToSqlConverter*,the stack generate 2 frames :
 * JdbcTableScan(parent was LogicalFilter)
 * LogicalFilter(parent was LogicalProject)

On function "*public Result visit(TableScan e)*" the stack would peek and 
generate a result;on function "*public Result visit(Filter e)*" ,it would peek 
another frame and generate the result too.So on "*public Result visit(Project 
e)*",the stack is empty,this cause the exception happened.

I'm not sure when "visitInput" in LogicalProject ,it should push 
LogicalProject(parent is NULL) instead of LogicalFilter(parent was 
LogicalProject).?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to