请问下用calcite parse 测试时获取SqlJoin时为什么报错
120003808 opened this issue · 0 comments
calcite 1.27.0 添加多个schema是获取sqlJoin node报错,但是sql验证通过并且可以正常执行返回结果,请问下要怎么弄
`import org.apache.calcite.adapter.jdbc.JdbcSchema;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlSelect;
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.util.Pair;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Properties;
public class MySqlTest {
private static final String report = "report";
private static final String ds = "ds";
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.setProperty("caseSensitive", "false");
Connection connection = DriverManager.getConnection("jdbc:calcite:", properties);
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
String reportUrl = "jdbc:mysql://localhost:3306/report?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
String dataCubeUrl = "jdbc:mysql://localhost:3306/ds?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
DataSource reportDs = JdbcSchema.dataSource(reportUrl, "com.mysql.jdbc.Driver", "root", "root");
DataSource cubeDs = JdbcSchema.dataSource(dataCubeUrl, "com.mysql.jdbc.Driver", "root", "root");
SqlParser.Config builder = SqlParser.config()
.withQuotedCasing(Casing.TO_UPPER)
.withUnquotedCasing(Casing.TO_UPPER)
.withCaseSensitive(false)
.withQuoting(Quoting.BACK_TICK)
.withUnquotedCasing(Casing.UNCHANGED);
final FrameworkConfig config = Frameworks.newConfigBuilder()
.defaultSchema(rootSchema)
.parserConfig(builder)
.build();
Planner planner = Frameworks.getPlanner(config);
rootSchema.add(ds, JdbcSchema.create(rootSchema, ds, reportDs, ds, null));
rootSchema.add(report, JdbcSchema.create(rootSchema, report, cubeDs, report, null));
String sql = "select t1.* from report.sys_conn t1 left join ds.ds_conn t2 on t1.id = t2.id limit 10";
SqlNode originSqlNode = planner.parse(sql);
Pair<SqlNode, RelDataType> sqlNodeRelDataTypePair = planner.validateAndGetType(originSqlNode);
SqlNode sqlNode = sqlNodeRelDataTypePair.getKey();
SqlSelect sqlSelect = (SqlSelect) sqlNode;
System.out.println(sqlSelect);
Statement statement = calciteConnection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
ResultSetMetaData metaData = resultSet.getMetaData();
while (resultSet.next()) {
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnLabel(i) + ":\t" + resultSet.getObject(i) + "\t");
}
System.out.println();
}
SqlNode from = sqlSelect.getFrom();
System.out.println(from);
}
}`