[
https://issues.apache.org/jira/browse/CALCITE-6934?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
zhuyufeng reassigned CALCITE-6934:
----------------------------------
Assignee: zhuyufeng
> The examples for DDL extension on the official website cannot run
> -----------------------------------------------------------------
>
> Key: CALCITE-6934
> URL: https://issues.apache.org/jira/browse/CALCITE-6934
> Project: Calcite
> Issue Type: Bug
> Components: site
> Affects Versions: 1.39.0
> Reporter: zhuyufeng
> Assignee: zhuyufeng
> Priority: Minor
>
> When I was learning Calcite by browsing the official website, I found that
> the [examples|https://calcite.apache.org/docs/adapter.html#server] there
> couldn't run. I specifically wrote a demo to reproduce this issue.
> {code:java}
> // Some comments here
> public class PlayCalciteDdl {
> public static void main(String[] args) throws Exception {
> Class.forName("org.apache.calcite.jdbc.Driver");
> Connection connection =
> DriverManager.getConnection("jdbc:calcite:parserFactory=org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl#FACTORY");
> CalciteConnection calciteConnection =
> connection.unwrap(CalciteConnection.class);
> SchemaPlus rootSchema = calciteConnection.getRootSchema();
> Schema schema = new ReflectiveSchema(new HrSchema());
> rootSchema.add("hr", schema);
> Statement statement = calciteConnection.createStatement();
> statement.execute("CREATE TABLE t (i INTEGER, j VARCHAR(10))");
> statement.execute("INSERT INTO t VALUES (1, 'a'), (2, 'bc')");
> statement.execute("CREATE VIEW v AS SELECT * FROM t WHERE i > 1");
> ResultSet resultSet = statement.executeQuery("SELECT count(*) as num
> FROM v");
> while (resultSet.next()) {
> System.out.println(resultSet.getString("num"));
> }
> resultSet.close();
> statement.close();
> connection.close();
> }
> public static class HrSchema {
> public final Employee[] emp = new Employee[]{
> new Employee("1" , "A", "Tom"),
> new Employee("1", "B", "Lisa")
> };
> public final Department[] dept = new Department[]{new
> Department("1")};
> }
> public static class Employee {
> public final String deptNo;
> public final String empId;
> public final String empName;
> public Employee(String deptNo, String empId, String empName) {
> this.deptNo = deptNo;
> this.empId = empId;
> this.empName = empName;
> }
> }
> public static class Department {
> public final String deptNo;
> public Department(String deptNo) {
> this.deptNo = deptNo;
> }
> }
> }
> {code}
> it will throw an exception:
> {code:java}
> Caused by: java.lang.UnsupportedOperationException: DDL not supported: CREATE
> TABLE `T` (`I` INTEGER, `J` VARCHAR(10))
> at
> org.apache.calcite.server.DdlExecutor.lambda$static$0(DdlExecutor.java:28)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.executeDdl(CalcitePrepareImpl.java:370)
> at
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:635){code}
> after debugging, the parameter values in the JDBC connection link provided on
> the official website are incorrect
> {code:java}
> //wrong value
> parserFactory=org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl#FACTORY
> {code}
> The class SqlDdlParserImpl.FACTORY does not override the getDdlExecutor()
> method in the SqlParserImplFactory interface.
> Therefore, the default logic defined in the interface is used during runtime,
> and the default logic will throw an exception.
> The correct parameter value should be:
> {code:java}
> org.apache.calcite.server.ServerDdlExecutor#PARSER_FACTORY
> {code}
> After I replaced the parameter value in the JDBC connection with this one, it
> could run properly.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)