如何解决如何验证跨模式查询
我想验证跨多个jdbc模式运行的查询。 例如,我的数据库设置:
CREATE SCHEMA IF NOT EXISTS schema1;
CREATE SCHEMA IF NOT EXISTS schema2;
CREATE TABLE schema1.table1 (
id BIGINT PRIMARY KEY,value1 VARCHAR
);
CREATE TABLE schema2.table2 (
id BIGINT PRIMARY KEY,value2 VARCHAR
);
INSERT INTO schema1.table1 (id,value1) VALUES (1,'t-1-value');
INSERT INTO schema2.table2 (id,value2) VALUES (1,'t-2-value');
我的查询在Postgres中正常运行:
SELECT
t1.id,t1.value1,t2.value2
FROM
schema1.table1 AS t1
JOIN schema2.table2 AS t2
ON t1.id = t2.id
现在我要做的是让方解石连接到数据库,查看架构和表并说上述查询有效。
这是我程序的示例代码。
String query = "SELECT t1.id,t2.value2 FROM schema1.table1 AS t1 JOIN schema2.table2 AS t2 ON t1.id = t2.id";
// Parse Query
Config parserConfig = sqlParser.config()
.withCaseSensitive(false)
.withConformance(sqlConformanceEnum.BABEL)
.withParserFactory(sqlDdlParserImpl.FACTORY);
sqlParser sqlParser = sqlParser.create(query,parserConfig);
sqlNode sqlNode = sqlParser.parseQuery();
// Validate query
Connection connection = DriverManager.getConnection("jdbc:calcite:model=" + modelPath);
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
SchemaPlus schemaPlus = calciteConnection.getRootSchema().getSubSchema("MY_MODEL_SCHEMA");
CalciteSchema calciteSchema = CalciteSchema.from(schemaPlus);
CalciteCatalogReader calciteCatalogReader =
new CalciteCatalogReader(
calciteSchema,Arrays.asList("schema1","schema2"),calciteConnection.getTypeFactory(),CalciteConnectionConfig.DEFAULT);
sqlValidatorWithHints sqlValidator =
sqlValidatorUtil.newValidator(
sqlStdOperatorTable.instance(),calciteCatalogReader,calciteCatalogReader.getTypeFactory(),sqlValidator.Config.DEFAULT);
sqlValidator.validate(sqlNode);
哪个给我错误:
Caused by: org.apache.calcite.sql.validate.sqlValidatorException: Object 'schema1' not found
我的模型如下:
{
"version": "1.0","schemas": [
{
"name": "MY_MODEL_SCHEMA","type": "custom","factory": "org.apache.calcite.adapter.jdbc.JdbcSchema$Factory","operand": {
"jdbcDriver": "org.postgresql.Driver","jdbcUrl": "jdbc:postgresql://localhost:5432/db","jdbcUser": "user","jdbcPassword": "password"
}
}
]
}
当我在模型中添加public
时,验证适用于"jdbcSchema": "schema1"
模式中的表以及其他模式,但是我想访问这两种模式。我该怎么办?
这是我的pom版本:
<dependency>
<groupId>org.apache.calcite</groupId>
<artifactId>calcite-core</artifactId>
<version>1.26.0</version>
</dependency>
<dependency>
<groupId>org.apache.calcite</groupId>
<artifactId>calcite-server</artifactId>
<version>1.26.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。