Sorry, the attached file was wrong,please ignore it.
I upload a new file.
On 8/10/20 4:38 PM, tonytao wrote:
hi team,
I met a NullPointerException when I used calcite 1.24.0 to convert a
relNode to sqlNode.
The trace:
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:454)
at
org.apache.calcite.rel.rel2sql.SqlImplementor$Builder.result(SqlImplementor.java:1822)
at
org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(RelToSqlConverter.java:392)
at server.TestRelToSqlConverter.test(TestRelToSqlConverter.java:84)
Attched file is a junit5 test case,you can repeat the issue with this
code.
Maven configuration:
<dependency>
<groupId>org.apache.calcite</groupId>
<artifactId>calcite-core</artifactId>
<version>1.24.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.12</version>
</dependency>
package server;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.calcite.adapter.jdbc.JdbcSchema;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.dialect.PostgresqlSqlDialect;
import org.apache.calcite.sql.parser.SqlParseException;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.Planner;
import org.apache.calcite.tools.RelConversionException;
import org.apache.calcite.tools.ValidationException;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
class TestRelToSqlConverter {
private static BasicDataSource dataSource = null;
private static Connection conn;
private static Statement stmt;
@BeforeAll
static void setUpBeforeClass() throws Exception {
String url = "jdbc:postgresql://127.0.0.1:5432/hdb2";
DriverManager.registerDriver(DriverManager.getDriver(url));
dataSource = new BasicDataSource();
dataSource.setUrl(url);
dataSource.setUsername("dev");
dataSource.setPassword("123456");
conn = dataSource.getConnection();
stmt = conn.createStatement();
stmt.execute("drop table if exists testdata;");
stmt.execute("create table testdata(" + " id int," + " uptime timestamp," + " x int," + " y int,"
+ " cmt text" + ");");
stmt.execute("insert into testdata " + "select id," + " uptime," + " round(random()*100),"
+ " round(random()*100)," + " md5(uptime::text) " + "from (" + "select"
+ " generate_series id," + " current_timestamp + make_interval(mins => generate_series) uptime"
+ " from generate_series(1,100000)) t");
}
@AfterAll
static void tearDownAfterClass() throws Exception {
stmt.execute("drop table testdata;");
stmt.close();
conn.close();
}
@Test
void test() throws SQLException, RelConversionException, SqlParseException, ValidationException {
SqlParser.Config insensitiveParser = SqlParser.configBuilder().setCaseSensitive(false).build();
SchemaPlus rootSchema = Frameworks.createRootSchema(true);
Schema schema = JdbcSchema.create(rootSchema, "public", dataSource, "hdb", "public");
rootSchema.add("public", schema);
FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(insensitiveParser).defaultSchema(rootSchema)
.build();
Planner planner = Frameworks.getPlanner(config);
String sql = "select year(uptime),sum(x) from public.testdata group by year(uptime)";
SqlNode sqlNode = planner.parse(sql);
System.out.println(sqlNode);
SqlNode sqlNodeValidated = planner.validate(sqlNode);
RelRoot relRoot = planner.rel(sqlNodeValidated);
RelNode relNode = relRoot.project();
System.out.println(RelOptUtil.toString(relNode));
RelToSqlConverter converter = new RelToSqlConverter(PostgresqlSqlDialect.DEFAULT);
System.out.println("\n optimized sql :");
System.out.println(converter.visit((Aggregate) relNode).asSelect());
}
}