Apache calcite: сбой синтаксического анализа: обнаружен "от \" " - PullRequest
0 голосов
/ 26 февраля 2019

В настоящее время я пытаюсь подключить MySQL с помощью кальцита.Однако у меня были проблемы с выполнением операторов SQL

Когда я использую этот sql для оправдания, он работает.

ResultSet resultSet = Statement.executeQuery ("select * from ex.depts");

Но я хотел бы получить доступ к таблице с именем, подобным этому "primary_test", это не удалось.

Исключение в потоке "main" java.sql.SQLException: Ошибкапри выполнении SQL «select * from ex.primary_test»: от строки 1, столбца 15 до строки 1, столбца 29: объект «primary_test» не найден в пределах «ex» в org.apache.calcite.avatica.Helper.createException (Helper.Java: 56) в org.apache.calcite.avatica.Helper.createException (Helper.java:41) в org.apache.calcite.avatica.AvaticaStatement.executeInternal (AvaticaStatement.java:163) в org.apache.calcite.avatica.AvaticaStatement.executeQuery (AvaticaStatement.java:227) в CalciteMysqlConnectionIns.main (CalciteMysqlConnectionIns.java:44) Вызывается: org.apache.calcite.runtime.CalciteContextException: от строки 1, столбца 15 до столбца 1, столбца 15 дляject «primary_test» не найден внутри «ex» в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (родной метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) в sun.reflect.DeccessInIctor45) в java.lang.reflect.Constructor.newInstance (Constructor.java:423) в org.apache.calcite.runtime.Resources $ ExInstWithCause.ex (Resources.java:463) в org.apache.calcite.sql.SqlUtilИсключениеorg.apache.calcite.sql.validate.IdentifierNamespace.resolveImpl (IdentifierNamespace.java:166) в org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl (IdentifierNamespace.java:177) в org.ap.validate.AbstractNamespace.validate (AbstractNamespace.java:84) в org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace (SqlValidatorImpl.java:977) в org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery (SqlValidator.alache.al3.SqlValidatorImpl.validateFrom (SqlValidatorImpl.java:3050) по адресу org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom (SqlValidatorImpl.java:3032) по адресу org.apache.calmplidIlidIvalid_Salid_Salid_Salid_Salid_Salid_Salid_Salid_Salid_Salid.Salid_Salid_Salid_Salid_Salid_Salid_Salid_Sal.3302) в org.apache.calcite.sql.validate.SelectNamespace.validateImpl (SelectNamespace.java:60) в org.apache.calcite.sql.validate.AbstractNamespace.validate (AbstractNamespace.java:84) в org.apache.calite.sql.validate.SqlValidatorImpl.validateNamepace.java: 216) в org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression (SqlValidatorImpl.java:928) в org.prepareSql (Prepare.java:265) в org.apache.calcite.prepare.Prepare.prepareSql (Prepare.java:231) в org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_ (CalcitePrepareImpl.javag: at2).calcite.prepare. Calcite.: 229)в org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute (CalciteMetaImpl.java:550) в org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal (AvaticaConnection.java.Exat.AvateState)(AvaticaStatement.java:156) ... еще 2 Причины: org.apache.calcite.sql.validate.SqlValidatorException: объект «primary_test» не найден в пределах «ex» в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) вsun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.renache.structor.calcite.runtime.Resources $ ExInstWithCause.ex (Resources.java:463) в org.apache.calcite.runtime.Resources $ ExInst.ex (Resources.java:572) ... еще 30

Я использовал много разных запросов, таких как

ResultSet resultSet = statement.executeQuery ("select * from ex. \" primary_test \ "");

, но это не работает.Может ли кто-нибудь помочь мне с этим вопросом?

мой код выглядит следующим образом:

import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.calcite.adapter.jdbc.JdbcSchema;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.commons.dbcp2.BasicDataSource;

public class CalciteMysqlConnectionIns {

  public static void main(String[] args) throws ClassNotFoundException, SQLException {

    Class.forName("org.apache.calcite.jdbc.Driver");

    Properties info = new Properties();
    info.setProperty("lex", "JAVA");
    Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
    CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
    SchemaPlus rootSchema = calciteConnection.getRootSchema();

    // 本地Schema.
    // Schema schema = ReflectiveSchema.create(calciteConnection, rootSchema, "hr",
    // new HrSchema());

    Class.forName("com.mysql.jdbc.Driver");
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setUrl("jdbc:mysql://192.168.130.7/hr");
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    Schema schema = JdbcSchema.create(rootSchema, "ex", dataSource, null, "sql_learn");

    rootSchema.add("ex", schema);
//    System.out.println(calciteConnection.getMetaData());
    DatabaseMetaData databaseMetaData = calciteConnection.getMetaData();
//    ResultSet rs = databaseMetaData.getTables(null, null, "%", new String[]{"TABLE"});
    Statement statement = calciteConnection.createStatement();
    ResultSet resultSet = statement.executeQuery(
        "select * from ex.\"primary_test\"");

    output(resultSet, System.out);
    resultSet.close();
    statement.close();
    connection.close();
  }

  private static void output(ResultSet resultSet, PrintStream out) throws SQLException {
    final ResultSetMetaData metaData = resultSet.getMetaData();
    final int columnCount = metaData.getColumnCount();
//    out.println(metaData.getColumnLabel(1) + " " + metaData.getColumnLabel(2));
//    out.println(metaData.getColumnTypeName(1) + " " + metaData.getColumnTypeName(2));
    while (resultSet.next()) {
      for (int i = 1; ; i++) {
        out.print(resultSet.getString(i));
        if (i < columnCount) {
          out.print(", ");
        } else {
          out.println();
          break;
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 08 апреля 2019

Вы можете попробовать это:

select * from ex.`primary_test`
...