Я пытаюсь выполнить запрос соединения SQL в двух разных базах данных (Tackroachdb и H2), используя Apache Calcite. Запрос работает нормально при выполнении непосредственно в соответствующих базах данных, но когда я пытаюсь запустить его через кальцит, я сталкиваюсь с следующей ошибкой: < /p>
Error executing query: Error while executing SQL "EXPLAIN PLAN FOR SELECT c.customer_name, o.order_id, o.order_date FROM CRDB.customers c JOIN H2DB.orders o ON c.customer_id = o.customer_id": Multiple entries with same key: primary=JdbcTable {primary} and primary=JdbcTable {primary}
< /code>
Вот соответствующая часть моего кода Java: < /p>
// Initialize Calcite connection with case-sensitive settings
Properties info = new Properties();
info.setProperty("lex", Lex.MYSQL.name());
info.setProperty("caseSensitive", "true");
Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
// Connect to CockroachDB
org.postgresql.ds.PGSimpleDataSource cockroachDS = new org.postgresql.ds.PGSimpleDataSource();
cockroachDS.setUrl("jdbc:postgresql://localhost:26257/sample");
cockroachDS.setUser("root");
cockroachDS.setPassword("");
// Connect to H2
org.h2.jdbcx.JdbcDataSource h2DS = new org.h2.jdbcx.JdbcDataSource();
h2DS.setURL("jdbc:h2:testdata;AUTO_SERVER=TRUE");
h2DS.setUser("");
h2DS.setPassword("");
// Add schemas
rootSchema.add("CRDB",
JdbcSchema.create(rootSchema, "CRDB", cockroachDS,
"sample", // catalog
"public")); // schema
rootSchema.add("H2DB",
JdbcSchema.create(rootSchema, "H2DB", h2DS,
"DEFAULT", // catalog
"PUBLIC")); // schema
// Execute join query with simplified schema references
String sql =
"SELECT c.customer_name, o.order_id, o.order_date " +
"FROM CRDB.customers c " +
"JOIN H2DB.orders o ON c.customer_id = o.customer_id";
try (Statement statement = calciteConnection.createStatement()) {
System.out.println("Executing query: " + sql);
// Enable debug logging
statement.execute("EXPLAIN PLAN FOR " + sql);
ResultSet explainRs = statement.getResultSet();
System.out.println("\nQuery Plan:");
while (explainRs.next()) {
System.out.println(explainRs.getString(1));
}
// Execute actual query
ResultSet rs = statement.executeQuery(sql);
// Print results
System.out.println("\nQuery Results:");
while (rs.next()) {
System.out.printf("Customer: %s, Order ID: %s, Date: %s%n",
rs.getString(1),
rs.getString(2),
rs.getString(3));
}
} catch (SQLException e) {
System.err.println("Error executing query: " + e.getMessage());
e.printStackTrace();
}
// Clean up
connection.close();
< /code>
[b] Дополнительная информация: < /strong>
версия кальцита: 1.38.0
tockroachdb Версия: 24.*
H2 Версия базы данных: 2.3
java версия: 21 < /p>
Что я попробовал: < /strong> < /p>
[list]
[*] Убедился, что таблицы клиентов
и orders существуют в их соответствующих базах данных. > Попробовал запустить запрос непосредственно в обеих базах данных, что работает нормально.
[/list]
Вопрос: [/b] < Br /> Что может вызвать ошибку «несколько записей с тем же ключом» в кальците, и как я могу решить ее для успешного выполнения запроса соединения в двух базах данных? Если возможно, исправьте код.
Я пытаюсь выполнить запрос соединения SQL в двух разных базах данных (Tackroachdb и H2), используя Apache Calcite. Запрос работает нормально при выполнении непосредственно в соответствующих базах данных, но когда я пытаюсь запустить его через кальцит, я сталкиваюсь с следующей ошибкой: < /p> [code]Error executing query: Error while executing SQL "EXPLAIN PLAN FOR SELECT c.customer_name, o.order_id, o.order_date FROM CRDB.customers c JOIN H2DB.orders o ON c.customer_id = o.customer_id": Multiple entries with same key: primary=JdbcTable {primary} and primary=JdbcTable {primary} < /code> Вот соответствующая часть моего кода Java: < /p> // Initialize Calcite connection with case-sensitive settings Properties info = new Properties(); info.setProperty("lex", Lex.MYSQL.name()); info.setProperty("caseSensitive", "true"); Connection connection = DriverManager.getConnection("jdbc:calcite:", info); CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); SchemaPlus rootSchema = calciteConnection.getRootSchema();
// Connect to CockroachDB org.postgresql.ds.PGSimpleDataSource cockroachDS = new org.postgresql.ds.PGSimpleDataSource(); cockroachDS.setUrl("jdbc:postgresql://localhost:26257/sample"); cockroachDS.setUser("root"); cockroachDS.setPassword("");
// Connect to H2 org.h2.jdbcx.JdbcDataSource h2DS = new org.h2.jdbcx.JdbcDataSource(); h2DS.setURL("jdbc:h2:testdata;AUTO_SERVER=TRUE"); h2DS.setUser(""); h2DS.setPassword("");
// Clean up connection.close(); < /code> [b] Дополнительная информация: < /strong> версия кальцита: 1.38.0 tockroachdb Версия: 24.* H2 Версия базы данных: 2.3 java версия: 21 < /p> Что я попробовал: < /strong> < /p> [list] [*] Убедился, что таблицы клиентов [/code] и orders существуют в их соответствующих базах данных. > Попробовал запустить запрос непосредственно в обеих базах данных, что работает нормально. [/list] Вопрос: [/b] < Br /> Что может вызвать ошибку «несколько записей с тем же ключом» в кальците, и как я могу решить ее для успешного выполнения запроса соединения в двух базах данных? Если возможно, исправьте код.
Я хочу использовать возможности Apache Calcite для построения абстрактных синтаксических деревьев с несколькими фильтрами, но, к сожалению, Apache Calcite работает только на Java. Есть ли ему альтернатива на платформе .NET?
I want to parse a few DDL statements for my use case. I am using SqlDDLParserImpl provided by Calcite Server for my use case. version : org.apache.calcite:calcite-server:1.36.0
I am able to parse the create statements who don't have any kind of...
Я работал над анализом SQL-запросов, а затем превращал их в деревья анализа, но в кальците самый маленький узел разбивается на SqlIdentifier. Который не определяет контекст узла.
Я хочу знать, является ли этот узел идентификатора именем таблицы или...