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());
	}

}

Reply via email to