首页 > 解决方案 > 方解石解析器 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();
        }
    }

标签: apache-calcite

解决方案


推荐阅读