You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2021/04/27 10:39:55 UTC

[ignite] branch sql-calcite updated: IGNITE-14648 Calcite. Fallback into h2 engine only "alter table|(create|drop) index" commands (#9043)

This is an automated email from the ASF dual-hosted git repository.

tledkov pushed a commit to branch sql-calcite
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/sql-calcite by this push:
     new ea47c04  IGNITE-14648 Calcite. Fallback into h2 engine only "alter table|(create|drop) index" commands (#9043)
ea47c04 is described below

commit ea47c0421a3fc29ed6bfab714b5d8bfa50f247d6
Author: zstan <st...@gmail.com>
AuthorDate: Tue Apr 27 13:39:34 2021 +0300

    IGNITE-14648 Calcite. Fallback into h2 engine only "alter table|(create|drop) index" commands (#9043)
---
 .../query/calcite/exec/rel/MinusNode.java          |  3 +--
 .../query/calcite/exec/rel/MinusExecutionTest.java |  2 +-
 .../query/calcite/jdbc/JdbcQueryTest.java          | 23 +++++++++++-----------
 .../processors/odbc/jdbc/JdbcRequestHandler.java   |  4 ++--
 .../processors/query/GridQueryProcessor.java       | 15 +++++---------
 5 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusNode.java
index 4859119..72c8025 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusNode.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusNode.java
@@ -337,7 +337,7 @@ public class MinusNode<Row> extends AbstractNode<Row> {
 
                 int availableRows = availableRows(entry.getValue());
 
-                if (availableRows <= cnt){
+                if (availableRows <= cnt) {
                     it.remove();
 
                     if (availableRows == 0)
@@ -378,7 +378,6 @@ public class MinusNode<Row> extends AbstractNode<Row> {
             cntrs[0] -= amount;
         }
 
-
         /** */
         private boolean isEmpty() {
             return groups.isEmpty();
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusExecutionTest.java
index 772c246..bb7b32c 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusExecutionTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/MinusExecutionTest.java
@@ -153,7 +153,7 @@ public class MinusExecutionTest extends AbstractExecutionTest {
             );
         }
         else {
-            minusNode =  new MinusNode<>(
+            minusNode = new MinusNode<>(
                 ctx,
                 rowType,
                 MAP,
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
index 4aac4ea..164bb6d 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
@@ -114,7 +114,9 @@ public class JdbcQueryTest extends GridCommonAbstractTest {
             "float_col FLOAT, " +
             "double_col DOUBLE, " +
             "time_col TIME, " +
-            "timestamp_col TIMESTAMP, " +
+            "timestamp_col_14 TIMESTAMP(14), " +
+            "timestamp_col_10 TIMESTAMP(10), " +
+            "timestamp_col_def TIMESTAMP, " +
             "date_col DATE, " +
             "PRIMARY KEY (id));");
 
@@ -122,8 +124,8 @@ public class JdbcQueryTest extends GridCommonAbstractTest {
             new AffinityTopologyVersion(3, 2)).get(10_000, TimeUnit.MILLISECONDS);
 
         stmt.executeUpdate("INSERT INTO t1 (id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, " +
-            "varchar_col, char_col, float_col, double_col, time_col, timestamp_col, date_col) VALUES (1, null, null, " +
-            "null, null, null, null, null, null, null, null, null, null);");
+            "varchar_col, char_col, float_col, double_col, time_col, timestamp_col_14, timestamp_col_10, timestamp_col_def, date_col) " +
+            "VALUES (1, null, null, null, null, null, null, null, null, null, null, null, null, null, null);");
 
         try (ResultSet rs = stmt.executeQuery("SELECT * FROM t1;")) {
             assertTrue(rs.next());
@@ -138,17 +140,14 @@ public class JdbcQueryTest extends GridCommonAbstractTest {
             assertEquals(Types.INTEGER, md.getColumnType(5));
             assertEquals(Types.BIGINT, md.getColumnType(6));
             assertEquals(Types.VARCHAR, md.getColumnType(7));
-            // TODO https://issues.apache.org/jira/browse/IGNITE-13547 H2 maps SQL type FLOAT to Value.DOUBLE and
-            //  SQL type CHAR to Value.STRING_FIXED, which are maped to java classes Double/String,
-            //  and to Types.DOUBLE/Types.VARCHAR respectively. Calcite DDL can map this types in a different way.
-            //assertEquals(Types.CHAR, md.getColumnType(8));
-            //assertEquals(Types.FLOAT, md.getColumnType(9));
             assertEquals(Types.VARCHAR, md.getColumnType(8));
-            assertEquals(Types.DOUBLE, md.getColumnType(9));
+            assertEquals(Types.FLOAT, md.getColumnType(9));
             assertEquals(Types.DOUBLE, md.getColumnType(10));
-            assertEquals(Types.TIME, md.getColumnType(11));
-            assertEquals(Types.TIMESTAMP, md.getColumnType(12));
-            assertEquals(Types.DATE, md.getColumnType(13));
+            assertEquals(Types.INTEGER, md.getColumnType(11));
+            assertEquals(Types.BIGINT, md.getColumnType(12));
+            assertEquals(Types.BIGINT, md.getColumnType(13));
+            assertEquals(Types.BIGINT, md.getColumnType(14));
+            assertEquals(Types.INTEGER, md.getColumnType(15));
         }
 
         stmt.execute("DROP TABLE t1");
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
index 769e357..99a6200 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
@@ -116,7 +116,7 @@ import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_CL
 import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_EXEC;
 import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_FETCH;
 import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_META;
-import static org.apache.ignite.internal.processors.query.GridQueryProcessor.shouldRedirectToCalcite;
+import static org.apache.ignite.internal.processors.query.GridQueryProcessor.executeWithExperimentalEngine;
 
 /**
  * JDBC request handler.
@@ -787,7 +787,7 @@ public class JdbcRequestHandler implements ClientListenerRequestHandler {
     /** */
     private List<FieldsQueryCursor<List<?>>> querySqlFields(SqlFieldsQueryEx qry, GridQueryCancel cancel) {
         if (experimentalQueryEngine != null) {
-            if (shouldRedirectToCalcite(qry.getSql()))
+            if (executeWithExperimentalEngine(qry.getSql()))
                 return experimentalQueryEngine.query(QueryContext.of(qry, cancel), qry.getSchema(), qry.getSql(), qry.getArgs());
         }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 476495e..4659309 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -167,8 +167,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     private static final ThreadLocal<AffinityTopologyVersion> requestTopVer = new ThreadLocal<>();
 
     /** Patter to test incoming query to decide whether this query should be executed with Calcite or H2. */
-    private static final Pattern IS_SELECT_OR_EXPLAIN_PATTERN =
-        Pattern.compile("^\\s*(select|explain plan)", CASE_INSENSITIVE);
+    public static final Pattern H2_REDIRECTION_RULES =
+        Pattern.compile("\\s*(alter\\s*table|create\\s*index|drop\\s*index)", CASE_INSENSITIVE);
 
     /** For tests. */
     public static Class<? extends GridQueryIndexing> idxCls;
@@ -2838,7 +2838,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             throw new CacheException("Execution of local SqlFieldsQuery on client node disallowed.");
 
         if (experimentalQueryEngine != null && useExperimentalSqlEngine) {
-            if (shouldRedirectToCalcite(qry.getSql()))
+            if (executeWithExperimentalEngine(qry.getSql()))
                 return experimentalQueryEngine.query(QueryContext.of(qry), qry.getSchema(), qry.getSql(), X.EMPTY_OBJECT_ARRAY);
         }
 
@@ -2872,11 +2872,6 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         });
     }
 
-    /** Calcite baseb engine is available. */
-    public boolean useExperimentalEngine() {
-        return experimentalQueryEngine != null;
-    }
-
     /**
      * @param cctx Cache context.
      * @param qry Query.
@@ -3634,8 +3629,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
      * @param sql Query to execute.
      * @return {@code true} if the given query should be executed with Calcite-based engine.
      */
-    public static boolean shouldRedirectToCalcite(String sql) {
-        return IS_SELECT_OR_EXPLAIN_PATTERN.matcher(sql).find();
+    public static boolean executeWithExperimentalEngine(String sql) {
+        return !H2_REDIRECTION_RULES.matcher(sql).find();
     }
 
     /**