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/03/12 16:15:36 UTC

[ignite] branch sql-calcite updated: IGNITE-14176 Calcite. Register system indexes

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 7ca32d3  IGNITE-14176 Calcite. Register system indexes
7ca32d3 is described below

commit 7ca32d33c0b0073a87ef6591af3b6ee8c6ea9eda
Author: Stanilovsky Evgeny <st...@gmail.com>
AuthorDate: Fri Mar 12 19:15:12 2021 +0300

    IGNITE-14176 Calcite. Register system indexes
---
 .../query/calcite/prepare/QueryPlanCacheImpl.java  |   7 +-
 .../query/calcite/schema/SchemaHolderImpl.java     |   3 +-
 .../query/calcite/schema/TableDescriptorImpl.java  |   1 -
 .../query/calcite/AggregatesIntegrationTest.java   |   2 -
 .../CalciteBasicSecondaryIndexIntegrationTest.java | 126 +++++++++++++++++++--
 .../CalciteErrorHandlilngIntegrationTest.java      |   2 +-
 .../query/calcite/CalciteQueryProcessorTest.java   |   4 +-
 .../query/QuerySysIndexDescriptorImpl.java         |  69 +++++++++++
 .../query/schema/SchemaChangeListener.java         |   3 +-
 .../processors/query/h2/SchemaManager.java         |  54 ++++++++-
 .../query/h2/database/H2PkHashIndex.java           |   1 -
 .../processors/query/h2/opt/GridH2Table.java       |   7 +-
 12 files changed, 250 insertions(+), 29 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryPlanCacheImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryPlanCacheImpl.java
index d05c653..53dec31 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryPlanCacheImpl.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryPlanCacheImpl.java
@@ -122,8 +122,11 @@ public class QueryPlanCacheImpl extends AbstractService implements QueryPlanCach
     }
 
     /** {@inheritDoc} */
-    @Override public void onSqlTypeCreate(String schemaName, GridQueryTypeDescriptor typeDescriptor,
-        GridCacheContextInfo<?, ?> cacheInfo) {
+    @Override public void onSqlTypeCreate(
+        String schemaName,
+        GridQueryTypeDescriptor typeDesc,
+        GridCacheContextInfo<?, ?> cacheInfo
+    ) {
         // No-op
     }
 }
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java
index bac2f37..9cfd787 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java
@@ -168,7 +168,8 @@ public class SchemaHolderImpl extends AbstractService implements SchemaHolder, S
     @Override public synchronized void onSqlTypeCreate(
         String schemaName,
         GridQueryTypeDescriptor typeDesc,
-        GridCacheContextInfo<?, ?> cacheInfo) {
+        GridCacheContextInfo<?, ?> cacheInfo
+    ) {
         IgniteSchema schema = igniteSchemas.computeIfAbsent(schemaName, IgniteSchema::new);
 
         String tblName = typeDesc.tableName();
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/TableDescriptorImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/TableDescriptorImpl.java
index 08d895f..1949415 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/TableDescriptorImpl.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/TableDescriptorImpl.java
@@ -73,7 +73,6 @@ import static java.util.Collections.singletonList;
 /**
  *
  */
-@SuppressWarnings({"AssignmentOrReturnOfFieldWithMutableType", "rawtypes"})
 public class TableDescriptorImpl extends NullInitializerExpressionFactory
     implements TableDescriptor {
     /** */
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
index 26cef02..5eb8649 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
@@ -17,8 +17,6 @@
 
 package org.apache.ignite.internal.processors.query.calcite;
 
-import org.apache.ignite.IgniteCache;
-import org.hamcrest.Matcher;
 import org.junit.Test;
 
 /**
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteBasicSecondaryIndexIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteBasicSecondaryIndexIntegrationTest.java
index 0c9de8d..a947333 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteBasicSecondaryIndexIntegrationTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteBasicSecondaryIndexIntegrationTest.java
@@ -23,9 +23,14 @@ import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.QueryEntity;
 import org.apache.ignite.cache.QueryIndex;
 import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
 import org.apache.ignite.internal.processors.query.QueryEngine;
 import org.apache.ignite.internal.processors.query.calcite.util.Commons;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -38,6 +43,9 @@ import static org.apache.ignite.internal.processors.query.calcite.QueryChecker.c
 import static org.apache.ignite.internal.processors.query.calcite.QueryChecker.containsSubPlan;
 import static org.apache.ignite.internal.processors.query.calcite.QueryChecker.containsTableScan;
 import static org.apache.ignite.internal.processors.query.calcite.QueryChecker.containsUnion;
+import static org.apache.ignite.internal.processors.query.h2.H2TableDescriptor.AFFINITY_KEY_IDX_NAME;
+import static org.apache.ignite.internal.processors.query.h2.H2TableDescriptor.PK_IDX_NAME;
+import static org.apache.ignite.internal.processors.query.h2.opt.GridH2Table.generateProxyIdxName;
 import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.CoreMatchers.not;
 
@@ -120,6 +128,46 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
         devCache.put(22, new Developer("Prokofiev", 21, "", -1));
         devCache.put(23, new Developer("Musorgskii", 22, "", -1));
 
+        IgniteCache<CalciteQueryProcessorTest.Key, CalciteQueryProcessorTest.Developer> tblWithAff =
+            grid.getOrCreateCache(new CacheConfiguration<CalciteQueryProcessorTest.Key, CalciteQueryProcessorTest.Developer>()
+            .setName("TBL_WITH_AFF_KEY")
+            .setSqlSchema("PUBLIC")
+            .setBackups(1)
+            .setQueryEntities(F.asList(new QueryEntity(CalciteQueryProcessorTest.Key.class, CalciteQueryProcessorTest.Developer.class)
+            .setTableName("TBL_WITH_AFF_KEY")))
+        );
+
+        tblWithAff.put(new CalciteQueryProcessorTest.Key(1, 2), new CalciteQueryProcessorTest.Developer("Petr", 10));
+        tblWithAff.put(new CalciteQueryProcessorTest.Key(2, 3), new CalciteQueryProcessorTest.Developer("Ivan", 11));
+
+        IgniteCache<Integer, CalciteQueryProcessorTest.Developer> tblConstrPk =
+            grid.getOrCreateCache(new CacheConfiguration<Integer, CalciteQueryProcessorTest.Developer>()
+                .setName("TBL_CONSTR_PK")
+                .setSqlSchema("PUBLIC")
+                .setBackups(0)
+                .setQueryEntities(F.asList(new QueryEntity(Integer.class, CalciteQueryProcessorTest.Developer.class)
+                    .setTableName("TBL_CONSTR_PK")
+                    .setKeyFieldName("id")
+                    .addQueryField("id", Integer.class.getName(), null)))
+            );
+
+        tblConstrPk.put(1, new CalciteQueryProcessorTest.Developer("Petr", 10));
+        tblConstrPk.put(2, new CalciteQueryProcessorTest.Developer("Ivan", 11));
+
+        GridQueryProcessor qryProc = ((IgniteEx)grid).context().query();
+
+        qryProc.querySqlFields(new SqlFieldsQuery("CREATE TABLE PUBLIC.UNWRAP_PK" + " (F1 VARCHAR, F2 LONG, F3 LONG, F4 LONG, " +
+            "CONSTRAINT PK PRIMARY KEY (F2, F1)) WITH \"backups=0, affinity_key=F1\""), true).getAll();
+
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Petr', 1, 2, 3)"), true);
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan', 2, 2, 4)"), true);
+
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan1', 21, 2, 4)"), true);
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan2', 22, 2, 4)"), true);
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan3', 23, 2, 4)"), true);
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan4', 24, 2, 4)"), true);
+        qryProc.querySqlFields(new SqlFieldsQuery("INSERT INTO PUBLIC.UNWRAP_PK(F1, F2, F3, F4) values ('Ivan5', 25, 2, 4)"), true);
+
         awaitPartitionMapExchange();
     }
 
@@ -134,6 +182,23 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
 
     /** */
     @Test
+    public void testEqualsFilterWithUnwrpKey() {
+        assertQuery("SELECT F1 FROM UNWRAP_PK WHERE F2=2")
+            .matches(containsIndexScan("PUBLIC", "UNWRAP_PK", PK_IDX_NAME))
+            .returns("Ivan")
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testEqualsFilterWithUnwrpKeyAndAff() {
+        assertQuery("SELECT F2 FROM UNWRAP_PK WHERE F1='Ivan'")
+            .matches(containsIndexScan("PUBLIC", "UNWRAP_PK", AFFINITY_KEY_IDX_NAME))
+            .check();
+    }
+
+    /** */
+    @Test
     public void testIndexLoopJoin() {
         assertQuery("" +
             "SELECT /*+ DISABLE_RULE('MergeJoinConverter', 'NestedLoopJoinConverter') */ d1.name, d2.name FROM Developer d1, Developer d2 WHERE d1.id = d2.id")
@@ -237,16 +302,39 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     @Test
     public void testKeyColumnEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE _key=1")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", PK_IDX_NAME))
+            .returns(1, "Mozart", 3, "Vienna", 33)
+            .check();
+
+        assertQuery("SELECT * FROM Developer WHERE id=1")
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(1, "Mozart", 3, "Vienna", 33)
             .check();
     }
 
     /** */
     @Test
+    public void testEqualsFilterWithAffIdx() {
+        assertQuery("SELECT * FROM TBL_WITH_AFF_KEY WHERE affinityKey=3")
+            .matches(containsIndexScan("PUBLIC", "TBL_WITH_AFF_KEY", AFFINITY_KEY_IDX_NAME))
+            .returns(2, 3, "Ivan", 11)
+            .check();
+    }
+
+    /** */
+    @Test
+    public void testEqualsFilterWithPkIdx1() {
+        assertQuery("SELECT * FROM TBL_CONSTR_PK WHERE id=2")
+            .matches(containsIndexScan("PUBLIC", "TBL_CONSTR_PK", generateProxyIdxName(PK_IDX_NAME)))
+            .returns("Ivan", 11, 2)
+            .check();
+    }
+
+    /** */
+    @Test
     public void testKeyColumnGreaterThanFilter() {
         assertQuery("SELECT * FROM Developer WHERE _key>3 and _key<12")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", PK_IDX_NAME))
             .returns(4, "Strauss", 2, "Munich", 66)
             .returns(5, "Vagner", 4, "Leipzig", 70)
             .returns(6, "Chaikovsky", 5, "Votkinsk", 53)
@@ -263,7 +351,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     public void testKeyColumnGreaterThanOrEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE _key>=? and _key<=?")
             .withParams(3, 11)
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", PK_IDX_NAME))
             .returns(3, "Bach", 1, "Leipzig", 55)
             .returns(4, "Strauss", 2, "Munich", 66)
             .returns(5, "Vagner", 4, "Leipzig", 70)
@@ -303,7 +391,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     @Test
     public void testKeyAliasEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE id=2")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(2, "Beethoven", 2, "Vienna", 44)
             .check();
     }
@@ -313,7 +401,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     public void testKeyAliasGreaterThanFilter() {
         assertQuery("SELECT * FROM Developer WHERE id>? and id<?")
             .withParams(3, 12)
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(4, "Strauss", 2, "Munich", 66)
             .returns(5, "Vagner", 4, "Leipzig", 70)
             .returns(6, "Chaikovsky", 5, "Votkinsk", 53)
@@ -329,7 +417,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     @Test
     public void testKeyAliasGreaterThanOrEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE id>=3 and id<12")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(3, "Bach", 1, "Leipzig", 55)
             .returns(4, "Strauss", 2, "Munich", 66)
             .returns(5, "Vagner", 4, "Leipzig", 70)
@@ -346,7 +434,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     @Test
     public void testKeyAliasLessThanFilter() {
         assertQuery("SELECT * FROM Developer WHERE id<3")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(1, "Mozart", 3, "Vienna", 33)
             .returns(2, "Beethoven", 2, "Vienna", 44)
             .check();
@@ -356,7 +444,7 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     @Test
     public void testKeyAliasLessThanOrEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE id<=2")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER", generateProxyIdxName(PK_IDX_NAME)))
             .returns(1, "Mozart", 3, "Vienna", 33)
             .returns(2, "Beethoven", 2, "Vienna", 44)
             .check();
@@ -750,11 +838,10 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
     }
 
     /** */
-    @Ignore("TODO")
     @Test
     public void testOrderByKeyAlias() {
-        assertQuery("SELECT * FROM Developer ORDER BY id")
-            .matches(containsTableScan("PUBLIC", "DEVELOPER"))
+        assertQuery("SELECT * FROM Developer WHERE id<=4 ORDER BY id")
+            .matches(containsIndexScan("PUBLIC", "DEVELOPER"))
             .matches(not(containsSubPlan("IgniteSort")))
             .returns(1, "Mozart", 3, "Vienna", 33)
             .returns(2, "Beethoven", 2, "Vienna", 44)
@@ -956,4 +1043,21 @@ public class CalciteBasicSecondaryIndexIntegrationTest extends GridCommonAbstrac
                 '}';
         }
     }
+
+    /** */
+    public static class Key {
+        /** */
+        @QuerySqlField
+        public int id;
+
+        /** */
+        @QuerySqlField
+        public int id2;
+
+        /** */
+        public Key(int id, int id2) {
+            this.id = id;
+            this.id2 = id2;
+        }
+    }
 }
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteErrorHandlilngIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteErrorHandlilngIntegrationTest.java
index 43733f8..82e52a2 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteErrorHandlilngIntegrationTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteErrorHandlilngIntegrationTest.java
@@ -174,7 +174,7 @@ public class CalciteErrorHandlilngIntegrationTest extends GridCommonAbstractTest
                         BPlusTree.Result res =
                             delegate.run(cacheId, pageId, page, pageAddr, io, walPlc, arg, intArg, statHolder);
 
-                        if (shouldThrow.get() && tree instanceof H2Tree)
+                        if (shouldThrow.get() && (tree instanceof H2Tree))
                             throw new RuntimeException("test exception");
 
                         return res;
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java
index 50d77cd..ac1b6ca0 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java
@@ -682,7 +682,7 @@ public class CalciteQueryProcessorTest extends GridCommonAbstractTest {
     /** */
     @Test
     public void testInsertPrimitiveKey() throws Exception {
-        IgniteCache<Integer, Developer> developer = grid(1).getOrCreateCache(new CacheConfiguration<Integer, Developer>()
+        grid(1).getOrCreateCache(new CacheConfiguration<Integer, Developer>()
             .setName("developer")
             .setSqlSchema("PUBLIC")
             .setIndexedTypes(Integer.class, Developer.class)
@@ -719,7 +719,7 @@ public class CalciteQueryProcessorTest extends GridCommonAbstractTest {
     /** */
     @Test
     public void testInsertUpdateDeleteNonPrimitiveKey() throws Exception {
-        IgniteCache<Key, Developer> developer = client.getOrCreateCache(new CacheConfiguration<Key, Developer>()
+        client.getOrCreateCache(new CacheConfiguration<Key, Developer>()
             .setName("developer")
             .setSqlSchema("PUBLIC")
             .setIndexedTypes(Key.class, Developer.class)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySysIndexDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySysIndexDescriptorImpl.java
new file mode 100644
index 0000000..b7e9b0d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySysIndexDescriptorImpl.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import java.util.Collection;
+import org.apache.ignite.cache.QueryIndexType;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+/**
+ * Sys Indexes descriptor.
+ */
+public class QuerySysIndexDescriptorImpl implements GridQueryIndexDescriptor {
+    /** Index name. */
+    private final String name;
+
+    /** Index fields. */
+    private final Collection<String> fields;
+
+    /**
+     * Constructor.
+     *
+     * @param name Index name.
+     * @param fields Index fields.
+     */
+    public QuerySysIndexDescriptorImpl(String name, Collection<String> fields) {
+        this.name = name;
+        this.fields = fields;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String name() {
+        return name;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<String> fields() {
+        return fields;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean descending(String field) {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public QueryIndexType type() {
+        throw new NotImplementedException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int inlineSize() {
+        throw new NotImplementedException();
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaChangeListener.java
index adc6112..78f03aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaChangeListener.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaChangeListener.java
@@ -47,8 +47,7 @@ public interface SchemaChangeListener {
      * @param typeDesc type descriptor.
      * @param cacheInfo Cache info.
      */
-    void onSqlTypeCreate(String schemaName, GridQueryTypeDescriptor typeDesc,
-        GridCacheContextInfo<?, ?> cacheInfo);
+    void onSqlTypeCreate(String schemaName, GridQueryTypeDescriptor typeDesc, GridCacheContextInfo<?, ?> cacheInfo);
 
     /**
      * Callback method.
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/SchemaManager.java
index 1d269e5..4c1f432 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/SchemaManager.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/SchemaManager.java
@@ -31,6 +31,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
@@ -52,8 +55,11 @@ import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.QueryField;
 import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl;
+import org.apache.ignite.internal.processors.query.QuerySysIndexDescriptorImpl;
 import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndexBase;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2ProxyIndex;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
 import org.apache.ignite.internal.processors.query.h2.sys.SqlSystemTableEngine;
@@ -74,6 +80,7 @@ import org.apache.ignite.spi.systemview.view.SqlTableView;
 import org.apache.ignite.spi.systemview.view.SqlViewColumnView;
 import org.apache.ignite.spi.systemview.view.SqlViewView;
 import org.h2.index.Index;
+import org.h2.table.Column;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
@@ -555,6 +562,8 @@ public class SchemaManager {
 
         lsnr.onSqlTypeCreate(schemaName, tbl.type(), tbl.cacheInfo());
 
+        registerSystemIndexes(h2Tbl, schemaName, tbl);
+
         for (GridH2IndexBase usrIdx : tbl.createUserIndexes())
             createInitialUserIndex(schemaName, tbl, usrIdx);
 
@@ -562,6 +571,35 @@ public class SchemaManager {
     }
 
     /**
+     * Registers all available indexes.
+     *
+     * @param h2Tbl Table representation.
+     * @param schemaName Current schema.
+     * @param tbl Table descriptor.
+     */
+    private void registerSystemIndexes(GridH2Table h2Tbl, String schemaName, H2TableDescriptor tbl) {
+        Collection<Index> sysIdxs = h2Tbl.getIndexes().stream()
+            .filter(idx -> (idx instanceof H2TreeIndexBase) || ((idx instanceof GridH2ProxyIndex)
+                && ((GridH2ProxyIndex)idx).underlyingIndex() instanceof H2TreeIndexBase))
+            .collect(Collectors.toList());
+
+        for (Index idx : sysIdxs) {
+            Collection<String> idxCols = Stream.of(idx.getColumns())
+                .map(Column::getName)
+                .collect(Collectors.toList());
+
+            String idxName = idx.getName();
+
+            if (idx instanceof GridH2ProxyIndex)
+                idx = ((GridH2ProxyIndex)idx).underlyingIndex();
+
+            QuerySysIndexDescriptorImpl desc = new QuerySysIndexDescriptorImpl(idxName, idxCols);
+
+            lsnr.onIndexCreate(schemaName, tbl.tableName(), idxName, desc, (GridIndex<?>)idx);
+        }
+    }
+
+    /**
      * Drops table form h2 database and clear all related indexes (h2 text, lucene).
      *
      * @param tbl Table to unregister.
@@ -880,8 +918,11 @@ public class SchemaManager {
         @Override public void onIndexDrop(String schemaName, String tblName, String idxName) {}
 
         /** {@inheritDoc} */
-        @Override public void onSqlTypeCreate(String schemaName, GridQueryTypeDescriptor typeDescriptor,
-            GridCacheContextInfo<?,?> cacheInfo) {}
+        @Override public void onSqlTypeCreate(
+            String schemaName,
+            GridQueryTypeDescriptor typeDesc,
+            GridCacheContextInfo<?, ?> cacheInfo
+        ) {}
 
         /** {@inheritDoc} */
         @Override public void onSqlTypeDrop(String schemaName, GridQueryTypeDescriptor typeDescriptor) {}
@@ -907,9 +948,12 @@ public class SchemaManager {
         }
 
         /** {@inheritDoc} */
-        @Override public void onSqlTypeCreate(String schemaName, GridQueryTypeDescriptor typeDescriptor,
-            GridCacheContextInfo<?,?> cacheInfo) {
-            lsnrs.forEach(lsnr -> lsnr.onSqlTypeCreate(schemaName, typeDescriptor, cacheInfo));
+        @Override public void onSqlTypeCreate(
+            String schemaName,
+            GridQueryTypeDescriptor typeDesc,
+            GridCacheContextInfo<?, ?> cacheInfo
+        ) {
+            lsnrs.forEach(lsnr -> lsnr.onSqlTypeCreate(schemaName, typeDesc, cacheInfo));
         }
 
         /** {@inheritDoc} */
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
index c56194e..73aef73 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
@@ -69,7 +69,6 @@ public class H2PkHashIndex extends GridH2IndexBase {
      * @param colsList Index columns.
      * @param segments Segments.
      */
-    @SuppressWarnings("ZeroLengthArrayAllocation")
     public H2PkHashIndex(
         GridCacheContext<?, ?> cctx,
         GridH2Table tbl,
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index 39e1735..39b6e6f 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -1424,7 +1424,7 @@ public class GridH2Table extends TableBase {
         }
 
         if (modified) {
-            String proxyName = target.getName() + "_proxy";
+            String proxyName = generateProxyIdxName(target.getName());
 
             if (target.getIndexType().isSpatial())
                 return new GridH2ProxySpatialIndex(this, proxyName, proxyCols, target);
@@ -1435,6 +1435,11 @@ public class GridH2Table extends TableBase {
         return null;
     }
 
+    /** */
+    public static String generateProxyIdxName(String idxName) {
+        return idxName + "_proxy";
+    }
+
     /**
      * Add new columns to this table.
      *