apache-calcite - 方解石解析器 sqlJoin 节点异常 未启动列表
问题描述
我使用 cacite JDBC 连接到 MySQL 测试用例,以连接来自两个不同 JDBC 数据库的表。方法抛出“java.lang.RuntimeException”异常。无法评估 org.apache.calcite.sql.SqlJoin.toString()
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";
String dataCubeUrl = "jdbc:mysql://localhost:3306/ds";
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().withCaseSensitive(false);
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";
execute(calciteConnection, sql);
SqlNode originSqlNode = planner.parse(sql);
Pair<SqlNode, RelDataType> sqlNodeRelDataTypePair = planner.validateAndGetType(originSqlNode);
SqlNode sqlNode = sqlNodeRelDataTypePair.getKey();
SqlSelect sqlSelect = (SqlSelect) sqlNode;
SqlNode from = sqlSelect.getFrom();
System.out.println(from);
}
private static void execute(CalciteConnection calciteConnection, String sql) throws SQLException {
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();
}
}
解决方案
推荐阅读
- amazon-web-services - AWS DynamoDB。我是否过度使用了我的写入容量?
- angular - 授权不记名令牌Angular 6不起作用
- angular - rxjs 获取正在输入的人员列表
- excel - 比较VBA中列单元格的值
- docker - 如何在单个图像中执行此操作 - Docker 容器。请提出一个简单的方法,因为我是 Docker 新手
- c++ - 转换 VS 2010 和 2015 之间的差异
- neo4j - Neo4j 中特定 DBMS 的连接问题 localhost7474
- scala - Scala:如何将任何通用序列作为此方法的输入
- android - 带有约束布局的 TextView 走出屏幕
- c# - 来自 SQLCLR 的异步 API 调用中的问题