You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "xiong duan (Jira)" <ji...@apache.org> on 2025/04/08 07:01:00 UTC

[jira] [Resolved] (CALCITE-6934) The examples for DDL extension on the official website cannot run

     [ https://issues.apache.org/jira/browse/CALCITE-6934?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

xiong duan resolved CALCITE-6934.
---------------------------------
    Fix Version/s: 1.40.0
       Resolution: Fixed

> 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
>              Labels: pull-request-available
>             Fix For: 1.40.0
>
>
> 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)