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

korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 9a1f2f8efad IGNITE-25435 Sql. Explain. Improve test coverage of scan 
operators (#5859)
9a1f2f8efad is described below

commit 9a1f2f8efad8ee44d268f91d29a6fa77ec995a81
Author: korlov42 <[email protected]>
AuthorDate: Wed May 21 17:14:42 2025 +0300

    IGNITE-25435 Sql. Explain. Improve test coverage of scan operators (#5859)
---
 .../internal/sql/engine/ItSecondaryIndexTest.java  |   2 +-
 .../integrationTest/sql/group1/explain/scan.test   | 274 ++++++++++++-----
 .../sql/engine/prepare/ExplainRelAsTextWriter.java |  12 +-
 .../internal/sql/engine/rel/IgniteIndexScan.java   |   3 +-
 .../engine/rel/ProjectableFilterableTableScan.java |   3 +-
 .../src/test/resources/tpcds/plan/q64.plan         | 330 ++++++++++-----------
 .../src/test/resources/tpch/plan/q1.plan           |  16 +-
 .../src/test/resources/tpch/plan/q21.plan          |  72 ++---
 .../src/test/resources/tpch/plan/q5.plan           |  52 ++--
 .../src/test/resources/tpch/plan/q7.plan           |  52 ++--
 .../src/test/resources/tpch/plan/q8.plan           |  70 ++---
 .../src/test/resources/tpch/plan/q9.plan           |  52 ++--
 .../internal/sql/engine/util/QueryChecker.java     |  15 +-
 13 files changed, 552 insertions(+), 401 deletions(-)

diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
index 0c1d9c2692b..0982f6f1744 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
@@ -197,7 +197,7 @@ public class ItSecondaryIndexTest extends 
BaseSqlIntegrationTest {
     @Test
     public void testKeyEqualsFilter() {
         assertQuery("SELECT * FROM Developer WHERE id=2")
-                .matches(matchesOnce("KeyValueGet.*?table: \\[PUBLIC, 
DEVELOPER\\]"))
+                .matches(matchesOnce("KeyValueGet.*?table: 
PUBLIC\\.DEVELOPER"))
                 .returns(2, "Beethoven", 2, "Vienna", 44)
                 .check();
     }
diff --git 
a/modules/sql-engine/src/integrationTest/sql/group1/explain/scan.test 
b/modules/sql-engine/src/integrationTest/sql/group1/explain/scan.test
index 6fd926f5352..31280b43e23 100644
--- a/modules/sql-engine/src/integrationTest/sql/group1/explain/scan.test
+++ b/modules/sql-engine/src/integrationTest/sql/group1/explain/scan.test
@@ -7,11 +7,11 @@ SELECT * FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   TableScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       fields: [C1, C2, C3]
-      est. row count: 1
+      est: (rows=1)
 
 # select with trimming projection, no renames
 plan
@@ -19,11 +19,11 @@ SELECT c1, c2 FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   TableScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       fields: [C1, C2]
-      est. row count: 1
+      est: (rows=1)
 
 # select with trimming projection and renames
 plan
@@ -31,11 +31,11 @@ SELECT c1 AS renamed_c1, c2 FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   TableScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       fields: [RENAMED_C1, C2]
-      est. row count: 1
+      est: (rows=1)
 
 # select with expression projection, no renames
 plan
@@ -43,12 +43,12 @@ SELECT c1 + c3, c2 FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   TableScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       fields: [EXPR$0, C2]
       projects: [+(C1, C3), C2]
-      est. row count: 1
+      est: (rows=1)
 
 # select with expression projection and renames
 plan
@@ -56,12 +56,12 @@ SELECT c1 + c3 AS sum_of_c1_and_c3, c2 FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   TableScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       fields: [SUM_OF_C1_AND_C3, C2]
       projects: [+(C1, C3), C2]
-      est. row count: 1
+      est: (rows=1)
 
 # Similar set of tests but for IndexScan
 statement ok
@@ -73,14 +73,14 @@ SELECT /*+ FORCE_INDEX(test_table_idx) */ * FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   IndexScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       index: TEST_TABLE_IDX
       type: SORTED
       fields: [C1, C2, C3]
       collation: [C1 ASC, C2 ASC, C3 ASC]
-      est. row count: 1
+      est: (rows=1)
 
 # select with trimming projection, no renames
 plan
@@ -88,14 +88,14 @@ SELECT /*+ FORCE_INDEX(test_table_idx) */ c1, c2 FROM 
test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   IndexScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       index: TEST_TABLE_IDX
       type: SORTED
       fields: [C1, C2]
       collation: [C1 ASC, C2 ASC]
-      est. row count: 1
+      est: (rows=1)
 
 # select with trimming projection and renames
 plan
@@ -103,14 +103,14 @@ SELECT /*+ FORCE_INDEX(test_table_idx) */ c1 AS 
renamed_c1, c2 FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   IndexScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       index: TEST_TABLE_IDX
       type: SORTED
       fields: [RENAMED_C1, C2]
       collation: [C1 ASC, C2 ASC]
-      est. row count: 1
+      est: (rows=1)
 
 # select with expression projection, no renames
 plan
@@ -118,15 +118,15 @@ SELECT /*+ FORCE_INDEX(test_table_idx) */ c1 + c3, c2 
FROM test_table
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   IndexScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       index: TEST_TABLE_IDX
       type: SORTED
       fields: [EXPR$0, C2]
       projects: [+(C1, C3), C2]
       collation: []
-      est. row count: 1
+      est: (rows=1)
 
 # select with expression projection and renames
 plan
@@ -134,15 +134,15 @@ SELECT /*+ FORCE_INDEX(test_table_idx) */ c1 + c3 AS 
sum_of_c1_and_c3, c2 FROM t
 ----
 Exchange
     distribution: single
-    est. row count: 1
+    est: (rows=1)
   IndexScan
-      table: [PUBLIC, TEST_TABLE]
+      table: PUBLIC.TEST_TABLE
       index: TEST_TABLE_IDX
       type: SORTED
       fields: [SUM_OF_C1_AND_C3, C2]
       projects: [+(C1, C3), C2]
       collation: []
-      est. row count: 1
+      est: (rows=1)
 
 # Similar set of tests but for KeyValueGet
 # select all, no renames
@@ -150,52 +150,52 @@ plan
 SELECT * FROM test_table WHERE c1 = 1
 ----
 KeyValueGet
-    table: [PUBLIC, TEST_TABLE]
+    table: PUBLIC.TEST_TABLE
     fields: [C1, C2, C3]
     key: [1]
-    est. row count: 1
+    est: (rows=1)
 
 # select with trimming projection, no renames
 plan
 SELECT c1, c2 FROM test_table WHERE c1 = 1
 ----
 KeyValueGet
-    table: [PUBLIC, TEST_TABLE]
+    table: PUBLIC.TEST_TABLE
     fields: [C1, C2]
     key: [1]
-    est. row count: 1
+    est: (rows=1)
 
 # select with trimming projection and renames
 plan
 SELECT c1 AS renamed_c1, c2 FROM test_table WHERE c1 = 1
 ----
 KeyValueGet
-    table: [PUBLIC, TEST_TABLE]
+    table: PUBLIC.TEST_TABLE
     fields: [C1, C2]
     key: [1]
-    est. row count: 1
+    est: (rows=1)
 
 # select with expression projection, no renames
 plan
 SELECT c1 + c3, c2 FROM test_table WHERE c1 = 1
 ----
 KeyValueGet
-    table: [PUBLIC, TEST_TABLE]
+    table: PUBLIC.TEST_TABLE
     fields: [EXPR$0, C2]
     projects: [+(C1, C3), C2]
     key: [1]
-    est. row count: 1
+    est: (rows=1)
 
 # select with expression projection and renames
 plan
 SELECT c1 + c3 AS sum_of_c1_and_c3, c2 FROM test_table WHERE c1 = 1
 ----
 KeyValueGet
-    table: [PUBLIC, TEST_TABLE]
+    table: PUBLIC.TEST_TABLE
     fields: [SUM_OF_C1_AND_C3, C2]
     projects: [+(C1, C3), C2]
     key: [1]
-    est. row count: 1
+    est: (rows=1)
 
 # Similar set of tests but for SystemViewScan
 # select all, no renames
@@ -203,47 +203,47 @@ plan
 SELECT * FROM system.system_views
 ----
 SystemViewScan
-    table: [SYSTEM, SYSTEM_VIEWS]
+    table: SYSTEM.SYSTEM_VIEWS
     fields: [VIEW_ID, SCHEMA_NAME, VIEW_NAME, VIEW_TYPE, ID, SCHEMA, NAME, 
TYPE]
-    est. row count: 100
+    est: (rows=100)
 
 # select with trimming projection, no renames
 plan
 SELECT view_id, view_name FROM system.system_views
 ----
 SystemViewScan
-    table: [SYSTEM, SYSTEM_VIEWS]
+    table: SYSTEM.SYSTEM_VIEWS
     fields: [VIEW_ID, VIEW_NAME]
-    est. row count: 100
+    est: (rows=100)
 
 # select with trimming projection and renames
 plan
 SELECT view_id AS renamed_view_id, view_name FROM system.system_views
 ----
 SystemViewScan
-    table: [SYSTEM, SYSTEM_VIEWS]
+    table: SYSTEM.SYSTEM_VIEWS
     fields: [RENAMED_VIEW_ID, VIEW_NAME]
-    est. row count: 100
+    est: (rows=100)
 
 # select with expression projection, no renames
 plan
 SELECT view_id + 5, view_name FROM system.system_views
 ----
 SystemViewScan
-    table: [SYSTEM, SYSTEM_VIEWS]
+    table: SYSTEM.SYSTEM_VIEWS
     fields: [EXPR$0, VIEW_NAME]
     projects: [+(VIEW_ID, 5), VIEW_NAME]
-    est. row count: 100
+    est: (rows=100)
 
 # select with expression projection and renames
 plan
 SELECT view_id + 5 AS adjusted_view_id, view_name FROM system.system_views
 ----
 SystemViewScan
-    table: [SYSTEM, SYSTEM_VIEWS]
+    table: SYSTEM.SYSTEM_VIEWS
     fields: [ADJUSTED_VIEW_ID, VIEW_NAME]
     projects: [+(VIEW_ID, 5), VIEW_NAME]
-    est. row count: 100
+    est: (rows=100)
 
 # Complex query where column of source table is renamed, and this renamed 
column is referenced by
 # correlated scalar query. This rename MUST remains in the plan to preserve 
semantic of the query 
@@ -258,31 +258,31 @@ SELECT
 Project
     fields: [EXPR$0]
     exprs: [EXPR$0]
-    est. row count: 1
+    est: (rows=1)
   CorrelatedNestedLoopJoin
       condition: true
       joinType: left
       variablesSet: [$cor0]
-      est. row count: 1
+      est: (rows=1)
     Exchange
         distribution: single
-        est. row count: 1
+        est: (rows=1)
       TableScan
-          table: [PUBLIC, TEST_TABLE]
+          table: PUBLIC.TEST_TABLE
           fields: [RENAMED_C1]
-          est. row count: 1
+          est: (rows=1)
     ColocatedHashAggregate
         group: []
         aggs: [COUNT()]
-        est. row count: 1
+        est: (rows=1)
       Exchange
           distribution: single
-          est. row count: 1
+          est: (rows=1)
         TableScan
-            table: [PUBLIC, TEST_TABLE]
+            table: PUBLIC.TEST_TABLE
             filters: =(C1, $cor0.RENAMED_C1)
             fields: [C1]
-            est. row count: 1
+            est: (rows=1)
 
 # Complex query where expression involving a column of source table is 
renamed, and this renamed expression is referenced by
 # correlated scalar query. This rename MUST remains in the plan to preserve 
semantic of the query 
@@ -297,29 +297,167 @@ SELECT
 Project
     fields: [EXPR$0]
     exprs: [EXPR$0]
-    est. row count: 1
+    est: (rows=1)
   CorrelatedNestedLoopJoin
       condition: true
       joinType: left
       variablesSet: [$cor0]
-      est. row count: 1
+      est: (rows=1)
     Exchange
         distribution: single
-        est. row count: 1
+        est: (rows=1)
       TableScan
-          table: [PUBLIC, TEST_TABLE]
+          table: PUBLIC.TEST_TABLE
           fields: [DOUBLED_C1]
           projects: [*(C1, 2)]
-          est. row count: 1
+          est: (rows=1)
     ColocatedHashAggregate
         group: []
         aggs: [COUNT()]
-        est. row count: 1
+        est: (rows=1)
       Exchange
           distribution: single
-          est. row count: 1
+          est: (rows=1)
         TableScan
-            table: [PUBLIC, TEST_TABLE]
+            table: PUBLIC.TEST_TABLE
             filters: =(C1, $cor0.DOUBLED_C1)
             fields: [C1]
-            est. row count: 1
+            est: (rows=1)
+
+# table scan with simple predicate
+plan
+SELECT c1 FROM test_table WHERE c3 = 1 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  TableScan
+      table: PUBLIC.TEST_TABLE
+      filters: =(C3, 1)
+      fields: [C1]
+      projects: [C1]
+      est: (rows=1)
+
+# table scan with complex predicate
+plan
+SELECT c1 FROM test_table WHERE c3 IN (1, 2, 3) AND CURRENT_TIMESTAMP > 
timestamp '1970-01-01' 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  TableScan
+      table: PUBLIC.TEST_TABLE
+      filters: AND(SEARCH(C3, Sarg[1, 2, 3]), 
>(CAST(CURRENT_TIMESTAMP):TIMESTAMP(0) NOT NULL, 1970-01-01 00:00:00))
+      fields: [C1]
+      projects: [C1]
+      est: (rows=1)
+
+# index scan with simple predicate
+plan
+SELECT /*+ FORCE_INDEX(test_table_idx) */ c1 FROM test_table WHERE c1 > 1 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  IndexScan
+      table: PUBLIC.TEST_TABLE
+      index: TEST_TABLE_IDX
+      type: SORTED
+      searchBounds: [RangeBounds [lowerBound=1, upperBound=null:INTEGER, 
lowerInclude=false, upperInclude=false]]
+      filters: >(C1, 1)
+      fields: [C1]
+      collation: [C1 ASC]
+      est: (rows=1)
+
+# index scan with complex predicate
+plan
+SELECT /*+ FORCE_INDEX(test_table_idx) */ c1 FROM test_table WHERE c1 IN (1, 
2, 3) AND CURRENT_TIMESTAMP > timestamp '1970-01-01' 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  IndexScan
+      table: PUBLIC.TEST_TABLE
+      index: TEST_TABLE_IDX
+      type: SORTED
+      searchBounds: [MultiBounds [bounds=ArrayList [ExactBounds [bound=1], 
ExactBounds [bound=2], ExactBounds [bound=3]]]]
+      filters: AND(SEARCH(C1, Sarg[1, 2, 3]), 
>(CAST(CURRENT_TIMESTAMP):TIMESTAMP(0) NOT NULL, 1970-01-01 00:00:00))
+      fields: [C1]
+      collation: [C1 ASC]
+      est: (rows=1)
+
+statement ok
+CREATE INDEX hash_idx ON test_table USING HASH (c2);
+
+# look up by hash index
+plan
+SELECT /*+ FORCE_INDEX(hash_idx) */ c1 FROM test_table WHERE c2 = 10; 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  IndexScan
+      table: PUBLIC.TEST_TABLE
+      index: HASH_IDX
+      type: HASH
+      searchBounds: [ExactBounds [bound=10]]
+      filters: =(C2, 10)
+      fields: [C1]
+      projects: [C1]
+      est: (rows=1)
+
+statement ok
+CREATE INDEX test_table_different_collation_idx ON test_table USING SORTED (c2 
DESC NULLS LAST);
+
+# index scan with different collation
+plan
+SELECT /*+ FORCE_INDEX(test_table_different_collation_idx) */ c1, c2 FROM 
test_table 
+----
+Exchange
+    distribution: single
+    est: (rows=1)
+  IndexScan
+      table: PUBLIC.TEST_TABLE
+      index: TEST_TABLE_DIFFERENT_COLLATION_IDX
+      type: SORTED
+      fields: [C1, C2]
+      collation: [C2 DESC NULLS LAST]
+      est: (rows=1)
+
+# system view scan with simple predicate
+plan
+SELECT view_id, view_name FROM system.system_views WHERE view_id = 5
+----
+SystemViewScan
+    table: SYSTEM.SYSTEM_VIEWS
+    filters: =(VIEW_ID, 5)
+    fields: [VIEW_ID, VIEW_NAME]
+    est: (rows=33)
+
+# table scan with complex predicate
+plan
+SELECT view_id, view_name FROM system.system_views WHERE view_id IN (1, 2, 3) 
AND CURRENT_TIMESTAMP > timestamp '1970-01-01' 
+----
+SystemViewScan
+    table: SYSTEM.SYSTEM_VIEWS
+    filters: AND(SEARCH(VIEW_ID, Sarg[1, 2, 3]), 
>(CAST(CURRENT_TIMESTAMP):TIMESTAMP(0) NOT NULL, 1970-01-01 00:00:00))
+    fields: [VIEW_ID, VIEW_NAME]
+    est: (rows=38)
+
+# table function scan
+plan
+SELECT * FROM system_range(1, 10)
+----
+TableFunctionScan
+    invocation: SYSTEM_RANGE(1, 10)
+    rowType: RecordType(BIGINT X)
+    est: (rows=100)
+
+# another table function scan
+plan
+SELECT * FROM system_range(1, LENGTH(rand_uuid()::VARCHAR))
+----
+TableFunctionScan
+    invocation: SYSTEM_RANGE(1, LENGTH(CAST(RAND_UUID()):VARCHAR CHARACTER SET 
"UTF-8" NOT NULL))
+    rowType: RecordType(BIGINT X)
+    est: (rows=100)
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ExplainRelAsTextWriter.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ExplainRelAsTextWriter.java
index 8bdf568a301..c114bfe73fb 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ExplainRelAsTextWriter.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ExplainRelAsTextWriter.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.calcite.linq4j.Ord;
+import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.AggregateCall;
@@ -47,6 +48,7 @@ import org.apache.calcite.util.Pair;
 import 
org.apache.ignite.internal.sql.engine.rel.ProjectableFilterableTableScan;
 import org.apache.ignite.internal.sql.engine.schema.IgniteDataSource;
 import org.apache.ignite.internal.sql.engine.util.Commons;
+import org.apache.ignite.table.QualifiedNameHelper;
 import org.jetbrains.annotations.Nullable;
 
 /** Printer that dumps relation tree to a text representation for EXPLAIN 
command output. */
@@ -88,7 +90,7 @@ public class ExplainRelAsTextWriter extends RelWriterImpl {
         s.append(System.lineSeparator());
         spacer.spaces(s);
 
-        s.append("est. row count: 
").append(BigDecimal.valueOf(mq.getRowCount(rel)).setScale(0, 
RoundingMode.HALF_UP));
+        s.append("est: 
(rows=").append(BigDecimal.valueOf(mq.getRowCount(rel)).setScale(0, 
RoundingMode.HALF_UP)).append(')');
 
         spacer.subtract(OPERATOR_ATTRIBUTES_INDENT);
 
@@ -104,6 +106,14 @@ public class ExplainRelAsTextWriter extends RelWriterImpl {
             return null;
         }
 
+        if (object instanceof RelOptTable) {
+            List<String> parts = ((RelOptTable) object).getQualifiedName();
+
+            assert parts.size() == 2 : parts;
+
+            return QualifiedNameHelper.fromNormalized(parts.get(0), 
parts.get(1)).toCanonicalForm();
+        }
+
         RelDataType rowTypeToResolveExpressions;
         RelDataType rowTypeToResolveBitSet;
         if (node instanceof ProjectableFilterableTableScan) {
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteIndexScan.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteIndexScan.java
index f0307ffe148..05969322c0d 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteIndexScan.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteIndexScan.java
@@ -32,6 +32,7 @@ import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.ignite.internal.sql.engine.prepare.bounds.SearchBounds;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
+import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -147,7 +148,7 @@ public class IgniteIndexScan extends AbstractIndexScan 
implements SourceAwareIgn
     protected RelWriter explainTerms0(RelWriter pw) {
         return super.explainTerms0(pw)
                 .itemIf("sourceId", sourceId, sourceId != -1)
-                .item("collation", collation());
+                .itemIf("collation", collation(), type == Type.SORTED);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/ProjectableFilterableTableScan.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/ProjectableFilterableTableScan.java
index 647f00d88bf..9a348a01f29 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/ProjectableFilterableTableScan.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/ProjectableFilterableTableScan.java
@@ -131,7 +131,8 @@ public abstract class ProjectableFilterableTableScan 
extends TableScan {
     @Override
     public RelWriter explainTerms(RelWriter pw) {
         return explainTerms0(pw
-                .item("table", table.getQualifiedName())
+                .itemIf("table", table.getQualifiedName(), !forExplain(pw))
+                .itemIf("table", table, forExplain(pw))
                 .itemIf("tableId", 
Integer.toString(table.unwrap(IgniteDataSource.class).id()), !forExplain(pw)));
     }
 
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan 
b/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
index af36ea22714..10da74cc295 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q64.plan
@@ -1,473 +1,473 @@
 Sort
     collation: [PRODUCT_NAME ASC, STORE_NAME ASC, CNT0 ASC, S11 ASC, S12 ASC]
-    est. row count: 21
+    est: (rows=21)
   Project
       fields: [PRODUCT_NAME, STORE_NAME, STORE_ZIP, B_STREET_NUMBER, 
B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, C_CITY, C_ZIP, 
SYEAR, CNT, S11, S21, S31, S12, S22, S32, SYEAR0, CNT0]
       exprs: [PRODUCT_NAME, STORE_NAME, STORE_ZIP, B_STREET_NUMBER, 
B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, C_CITY, C_ZIP, 
SYEAR, CNT, S1, S2, S3, S10, S20, S30, SYEAR0, CNT0]
-      est. row count: 21
+      est: (rows=21)
     HashJoin
         condition: AND(=(ITEM_SK, ITEM_SK0), <=(CNT0, CNT), =(STORE_NAME, 
STORE_NAME0), =(STORE_ZIP, STORE_ZIP0))
         joinType: inner
-        est. row count: 21
+        est: (rows=21)
       ColocatedHashAggregate
           group: [PRODUCT_NAME, ITEM_SK, STORE_NAME, STORE_ZIP, 
B_STREET_NUMBER, B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, 
C_CITY, C_ZIP, SYEAR, FSYEAR, S2YEAR]
           aggs: [COUNT(), SUM(SS_WHOLESALE_COST), SUM(SS_LIST_PRICE), 
SUM(SS_COUPON_AMT)]
-          est. row count: 2887
+          est: (rows=2887)
         Project
             fields: [PRODUCT_NAME, ITEM_SK, STORE_NAME, STORE_ZIP, 
B_STREET_NUMBER, B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, 
C_CITY, C_ZIP, SYEAR, FSYEAR, S2YEAR, SS_WHOLESALE_COST, SS_LIST_PRICE, 
SS_COUPON_AMT]
             exprs: [I_PRODUCT_NAME, I_ITEM_SK, S_STORE_NAME, S_ZIP, 
CA_STREET_NUMBER, CA_STREET_NAME, CA_CITY, CA_ZIP, CA_STREET_NUMBER0, 
CA_STREET_NAME0, CA_CITY0, CA_ZIP0, D_YEAR00, D_YEAR, D_YEAR0, 
SS_WHOLESALE_COST, SS_LIST_PRICE, SS_COUPON_AMT]
-            est. row count: 2992
+            est: (rows=2992)
           HashJoin
               condition: AND(=(SS_ITEM_SK, SR_ITEM_SK), =(SS_TICKET_NUMBER, 
SR_TICKET_NUMBER))
               joinType: inner
-              est. row count: 2992
+              est: (rows=2992)
             Exchange
                 distribution: single
-                est. row count: 287514
+                est: (rows=287514)
               TableScan
-                  table: [PUBLIC, STORE_RETURNS]
+                  table: PUBLIC.STORE_RETURNS
                   fields: [SR_ITEM_SK, SR_TICKET_NUMBER]
-                  est. row count: 287514
+                  est: (rows=287514)
             HashJoin
                 condition: =(C_FIRST_SALES_DATE_SK, D_DATE_SK)
                 joinType: inner
-                est. row count: 90684167
+                est: (rows=90684167)
               Exchange
                   distribution: single
-                  est. row count: 73049
+                  est: (rows=73049)
                 TableScan
-                    table: [PUBLIC, DATE_DIM]
+                    table: PUBLIC.DATE_DIM
                     fields: [D_DATE_SK, D_YEAR]
-                    est. row count: 73049
+                    est: (rows=73049)
               HashJoin
                   condition: =(C_FIRST_SHIPTO_DATE_SK, D_DATE_SK)
                   joinType: inner
-                  est. row count: 90684167
+                  est: (rows=90684167)
                 Exchange
                     distribution: single
-                    est. row count: 73049
+                    est: (rows=73049)
                   TableScan
-                      table: [PUBLIC, DATE_DIM]
+                      table: PUBLIC.DATE_DIM
                       fields: [D_DATE_SK, D_YEAR]
-                      est. row count: 73049
+                      est: (rows=73049)
                 HashJoin
                     condition: =(SS_STORE_SK, S_STORE_SK)
                     joinType: inner
-                    est. row count: 90684167
+                    est: (rows=90684167)
                   HashJoin
                       condition: =(SS_PROMO_SK, P_PROMO_SK)
                       joinType: inner
-                      est. row count: 90684167
+                      est: (rows=90684167)
                     HashJoin
                         condition: =(SS_ADDR_SK, CA_ADDRESS_SK)
                         joinType: inner
-                        est. row count: 90684167
+                        est: (rows=90684167)
                       Exchange
                           distribution: single
-                          est. row count: 50000
+                          est: (rows=50000)
                         TableScan
-                            table: [PUBLIC, CUSTOMER_ADDRESS]
+                            table: PUBLIC.CUSTOMER_ADDRESS
                             fields: [CA_ADDRESS_SK, CA_STREET_NUMBER, 
CA_STREET_NAME, CA_CITY, CA_ZIP]
-                            est. row count: 50000
+                            est: (rows=50000)
                       HashJoin
                           condition: =(C_CURRENT_ADDR_SK, CA_ADDRESS_SK)
                           joinType: inner
-                          est. row count: 90684167
+                          est: (rows=90684167)
                         Exchange
                             distribution: single
-                            est. row count: 50000
+                            est: (rows=50000)
                           TableScan
-                              table: [PUBLIC, CUSTOMER_ADDRESS]
+                              table: PUBLIC.CUSTOMER_ADDRESS
                               fields: [CA_ADDRESS_SK, CA_STREET_NUMBER, 
CA_STREET_NAME, CA_CITY, CA_ZIP]
-                              est. row count: 50000
+                              est: (rows=50000)
                         HashJoin
                             condition: =(HD_INCOME_BAND_SK, IB_INCOME_BAND_SK0)
                             joinType: inner
-                            est. row count: 90684167
+                            est: (rows=90684167)
                           HashJoin
                               condition: =(SS_HDEMO_SK, HD_DEMO_SK)
                               joinType: inner
-                              est. row count: 90684167
+                              est: (rows=90684167)
                             Exchange
                                 distribution: single
-                                est. row count: 7200
+                                est: (rows=7200)
                               TableScan
-                                  table: [PUBLIC, HOUSEHOLD_DEMOGRAPHICS]
+                                  table: PUBLIC.HOUSEHOLD_DEMOGRAPHICS
                                   fields: [HD_DEMO_SK, HD_INCOME_BAND_SK]
-                                  est. row count: 7200
+                                  est: (rows=7200)
                             HashJoin
                                 condition: =(HD_INCOME_BAND_SK, 
IB_INCOME_BAND_SK)
                                 joinType: inner
-                                est. row count: 90684167
+                                est: (rows=90684167)
                               HashJoin
                                   condition: =(C_CURRENT_HDEMO_SK, HD_DEMO_SK)
                                   joinType: inner
-                                  est. row count: 90684167
+                                  est: (rows=90684167)
                                 Exchange
                                     distribution: single
-                                    est. row count: 7200
+                                    est: (rows=7200)
                                   TableScan
-                                      table: [PUBLIC, HOUSEHOLD_DEMOGRAPHICS]
+                                      table: PUBLIC.HOUSEHOLD_DEMOGRAPHICS
                                       fields: [HD_DEMO_SK, HD_INCOME_BAND_SK]
-                                      est. row count: 7200
+                                      est: (rows=7200)
                                 HashJoin
                                     condition: AND(<>(CD_MARITAL_STATUS, 
CD_MARITAL_STATUS0), =(SS_CDEMO_SK, CD_DEMO_SK))
                                     joinType: inner
-                                    est. row count: 90684167
+                                    est: (rows=90684167)
                                   Exchange
                                       distribution: single
-                                      est. row count: 1920800
+                                      est: (rows=1920800)
                                     TableScan
-                                        table: [PUBLIC, CUSTOMER_DEMOGRAPHICS]
+                                        table: PUBLIC.CUSTOMER_DEMOGRAPHICS
                                         fields: [CD_DEMO_SK, CD_MARITAL_STATUS]
-                                        est. row count: 1920800
+                                        est: (rows=1920800)
                                   HashJoin
                                       condition: =(C_CURRENT_CDEMO_SK, 
CD_DEMO_SK)
                                       joinType: inner
-                                      est. row count: 129548810
+                                      est: (rows=129548810)
                                     Exchange
                                         distribution: single
-                                        est. row count: 1920800
+                                        est: (rows=1920800)
                                       TableScan
-                                          table: [PUBLIC, 
CUSTOMER_DEMOGRAPHICS]
+                                          table: PUBLIC.CUSTOMER_DEMOGRAPHICS
                                           fields: [CD_DEMO_SK, 
CD_MARITAL_STATUS]
-                                          est. row count: 1920800
+                                          est: (rows=1920800)
                                     HashJoin
                                         condition: =(SS_CUSTOMER_SK, 
C_CUSTOMER_SK)
                                         joinType: inner
-                                        est. row count: 129548810
+                                        est: (rows=129548810)
                                       Exchange
                                           distribution: single
-                                          est. row count: 100000
+                                          est: (rows=100000)
                                         TableScan
-                                            table: [PUBLIC, CUSTOMER]
+                                            table: PUBLIC.CUSTOMER
                                             fields: [C_CUSTOMER_SK, 
C_CURRENT_CDEMO_SK, C_CURRENT_HDEMO_SK, C_CURRENT_ADDR_SK, 
C_FIRST_SHIPTO_DATE_SK, C_FIRST_SALES_DATE_SK]
-                                            est. row count: 100000
+                                            est: (rows=100000)
                                       HashJoin
                                           condition: =(SS_SOLD_DATE_SK, 
D_DATE_SK)
                                           joinType: inner
-                                          est. row count: 129548810
+                                          est: (rows=129548810)
                                         HashJoin
                                             condition: =(SS_ITEM_SK, 
CS_ITEM_SK)
                                             joinType: inner
-                                            est. row count: 389035465
+                                            est: (rows=389035465)
                                           HashJoin
                                               condition: =(SS_ITEM_SK, 
I_ITEM_SK)
                                               joinType: inner
-                                              est. row count: 180025
+                                              est: (rows=180025)
                                             Exchange
                                                 distribution: single
-                                                est. row count: 2880404
+                                                est: (rows=2880404)
                                               TableScan
-                                                  table: [PUBLIC, STORE_SALES]
+                                                  table: PUBLIC.STORE_SALES
                                                   fields: [SS_SOLD_DATE_SK, 
SS_ITEM_SK, SS_CUSTOMER_SK, SS_CDEMO_SK, SS_HDEMO_SK, SS_ADDR_SK, SS_STORE_SK, 
SS_PROMO_SK, SS_TICKET_NUMBER, SS_WHOLESALE_COST, SS_LIST_PRICE, SS_COUPON_AMT]
-                                                  est. row count: 2880404
+                                                  est: (rows=2880404)
                                             Exchange
                                                 distribution: single
-                                                est. row count: 1125
+                                                est: (rows=1125)
                                               TableScan
-                                                  table: [PUBLIC, ITEM]
+                                                  table: PUBLIC.ITEM
                                                   filters: AND(SEARCH(I_COLOR, 
Sarg[_UTF-8'azure':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'blush':VARCHAR(20) 
CHARACTER SET "UTF-8", _UTF-8'gainsboro':VARCHAR(20) CHARACTER SET "UTF-8", 
_UTF-8'hot':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'lemon':VARCHAR(20) 
CHARACTER SET "UTF-8", _UTF-8'misty':VARCHAR(20) CHARACTER SET 
"UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8"), 
>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 80.00), <=(CAST(I_CURRENT_PRICE):DE 
[...]
                                                   fields: [I_ITEM_SK, 
I_CURRENT_PRICE, I_COLOR, I_PRODUCT_NAME]
-                                                  est. row count: 1125
+                                                  est: (rows=1125)
                                           Filter
                                               condition: >(SALE, *(2, REFUND))
-                                              est. row count: 14407
+                                              est: (rows=14407)
                                             ReduceHashAggregate
                                                 rowType: RecordType(INTEGER 
CS_ITEM_SK, DECIMAL(32767, 2) SALE, DECIMAL(32767, 2) REFUND)
                                                 group: [CS_ITEM_SK]
                                                 aggs: [SUM(_ACC0), SUM(_ACC1)]
-                                                est. row count: 28813
+                                                est: (rows=28813)
                                               Exchange
                                                   distribution: single
-                                                  est. row count: 28813
+                                                  est: (rows=28813)
                                                 MapHashAggregate
                                                     group: [CS_ITEM_SK]
                                                     aggs: 
[SUM(CS_EXT_LIST_PRICE), SUM($f2)]
-                                                    est. row count: 28813
+                                                    est: (rows=28813)
                                                   Project
                                                       fields: [CS_ITEM_SK, 
CS_EXT_LIST_PRICE, $f2]
                                                       exprs: [CS_ITEM_SK, 
CS_EXT_LIST_PRICE, +(+(CR_REFUNDED_CASH, CR_REVERSED_CHARGE), CR_STORE_CREDIT)]
-                                                      est. row count: 144067
+                                                      est: (rows=144067)
                                                     HashJoin
                                                         condition: 
AND(=(CS_ITEM_SK, CR_ITEM_SK), =(CS_ORDER_NUMBER, CR_ORDER_NUMBER))
                                                         joinType: inner
-                                                        est. row count: 144067
+                                                        est: (rows=144067)
                                                       TableScan
-                                                          table: [PUBLIC, 
CATALOG_SALES]
+                                                          table: 
PUBLIC.CATALOG_SALES
                                                           fields: [CS_ITEM_SK, 
CS_ORDER_NUMBER, CS_EXT_LIST_PRICE]
-                                                          est. row count: 
1441548
+                                                          est: (rows=1441548)
                                                       Exchange
                                                           distribution: 
affinity[tableId=51, zoneId=51][0, 1]
-                                                          est. row count: 
144067
+                                                          est: (rows=144067)
                                                         TableScan
-                                                            table: [PUBLIC, 
CATALOG_RETURNS]
+                                                            table: 
PUBLIC.CATALOG_RETURNS
                                                             fields: 
[CR_ITEM_SK, CR_ORDER_NUMBER, CR_REFUNDED_CASH, CR_REVERSED_CHARGE, 
CR_STORE_CREDIT]
-                                                            est. row count: 
144067
+                                                            est: (rows=144067)
                                         Exchange
                                             distribution: single
-                                            est. row count: 24325
+                                            est: (rows=24325)
                                           TableScan
-                                              table: [PUBLIC, DATE_DIM]
+                                              table: PUBLIC.DATE_DIM
                                               filters: =(D_YEAR, 1999)
                                               fields: [D_DATE_SK, D_YEAR]
-                                              est. row count: 24325
+                                              est: (rows=24325)
                               Exchange
                                   distribution: single
-                                  est. row count: 20
+                                  est: (rows=20)
                                 TableScan
-                                    table: [PUBLIC, INCOME_BAND]
+                                    table: PUBLIC.INCOME_BAND
                                     fields: [IB_INCOME_BAND_SK]
-                                    est. row count: 20
+                                    est: (rows=20)
                           Exchange
                               distribution: single
-                              est. row count: 20
+                              est: (rows=20)
                             TableScan
-                                table: [PUBLIC, INCOME_BAND]
+                                table: PUBLIC.INCOME_BAND
                                 fields: [IB_INCOME_BAND_SK]
-                                est. row count: 20
+                                est: (rows=20)
                     Exchange
                         distribution: single
-                        est. row count: 300
+                        est: (rows=300)
                       TableScan
-                          table: [PUBLIC, PROMOTION]
+                          table: PUBLIC.PROMOTION
                           fields: [P_PROMO_SK]
-                          est. row count: 300
+                          est: (rows=300)
                   Exchange
                       distribution: single
-                      est. row count: 12
+                      est: (rows=12)
                     TableScan
-                        table: [PUBLIC, STORE]
+                        table: PUBLIC.STORE
                         fields: [S_STORE_SK, S_STORE_NAME, S_ZIP]
-                        est. row count: 12
+                        est: (rows=12)
       ColocatedHashAggregate
           group: [PRODUCT_NAME, ITEM_SK, STORE_NAME, STORE_ZIP, 
B_STREET_NUMBER, B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, 
C_CITY, C_ZIP, SYEAR, FSYEAR, S2YEAR]
           aggs: [COUNT(), SUM(SS_WHOLESALE_COST), SUM(SS_LIST_PRICE), 
SUM(SS_COUPON_AMT)]
-          est. row count: 2887
+          est: (rows=2887)
         Project
             fields: [PRODUCT_NAME, ITEM_SK, STORE_NAME, STORE_ZIP, 
B_STREET_NUMBER, B_STREET_NAME, B_CITY, B_ZIP, C_STREET_NUMBER, C_STREET_NAME, 
C_CITY, C_ZIP, SYEAR, FSYEAR, S2YEAR, SS_WHOLESALE_COST, SS_LIST_PRICE, 
SS_COUPON_AMT]
             exprs: [I_PRODUCT_NAME, I_ITEM_SK, S_STORE_NAME, S_ZIP, 
CA_STREET_NUMBER, CA_STREET_NAME, CA_CITY, CA_ZIP, CA_STREET_NUMBER0, 
CA_STREET_NAME0, CA_CITY0, CA_ZIP0, D_YEAR00, D_YEAR, D_YEAR0, 
SS_WHOLESALE_COST, SS_LIST_PRICE, SS_COUPON_AMT]
-            est. row count: 2992
+            est: (rows=2992)
           HashJoin
               condition: AND(=(SS_ITEM_SK, SR_ITEM_SK), =(SS_TICKET_NUMBER, 
SR_TICKET_NUMBER))
               joinType: inner
-              est. row count: 2992
+              est: (rows=2992)
             Exchange
                 distribution: single
-                est. row count: 287514
+                est: (rows=287514)
               TableScan
-                  table: [PUBLIC, STORE_RETURNS]
+                  table: PUBLIC.STORE_RETURNS
                   fields: [SR_ITEM_SK, SR_TICKET_NUMBER]
-                  est. row count: 287514
+                  est: (rows=287514)
             HashJoin
                 condition: =(C_FIRST_SALES_DATE_SK, D_DATE_SK)
                 joinType: inner
-                est. row count: 90684167
+                est: (rows=90684167)
               Exchange
                   distribution: single
-                  est. row count: 73049
+                  est: (rows=73049)
                 TableScan
-                    table: [PUBLIC, DATE_DIM]
+                    table: PUBLIC.DATE_DIM
                     fields: [D_DATE_SK, D_YEAR]
-                    est. row count: 73049
+                    est: (rows=73049)
               HashJoin
                   condition: =(C_FIRST_SHIPTO_DATE_SK, D_DATE_SK)
                   joinType: inner
-                  est. row count: 90684167
+                  est: (rows=90684167)
                 Exchange
                     distribution: single
-                    est. row count: 73049
+                    est: (rows=73049)
                   TableScan
-                      table: [PUBLIC, DATE_DIM]
+                      table: PUBLIC.DATE_DIM
                       fields: [D_DATE_SK, D_YEAR]
-                      est. row count: 73049
+                      est: (rows=73049)
                 HashJoin
                     condition: =(SS_STORE_SK, S_STORE_SK)
                     joinType: inner
-                    est. row count: 90684167
+                    est: (rows=90684167)
                   HashJoin
                       condition: =(SS_PROMO_SK, P_PROMO_SK)
                       joinType: inner
-                      est. row count: 90684167
+                      est: (rows=90684167)
                     HashJoin
                         condition: =(SS_ADDR_SK, CA_ADDRESS_SK)
                         joinType: inner
-                        est. row count: 90684167
+                        est: (rows=90684167)
                       Exchange
                           distribution: single
-                          est. row count: 50000
+                          est: (rows=50000)
                         TableScan
-                            table: [PUBLIC, CUSTOMER_ADDRESS]
+                            table: PUBLIC.CUSTOMER_ADDRESS
                             fields: [CA_ADDRESS_SK, CA_STREET_NUMBER, 
CA_STREET_NAME, CA_CITY, CA_ZIP]
-                            est. row count: 50000
+                            est: (rows=50000)
                       HashJoin
                           condition: =(C_CURRENT_ADDR_SK, CA_ADDRESS_SK)
                           joinType: inner
-                          est. row count: 90684167
+                          est: (rows=90684167)
                         Exchange
                             distribution: single
-                            est. row count: 50000
+                            est: (rows=50000)
                           TableScan
-                              table: [PUBLIC, CUSTOMER_ADDRESS]
+                              table: PUBLIC.CUSTOMER_ADDRESS
                               fields: [CA_ADDRESS_SK, CA_STREET_NUMBER, 
CA_STREET_NAME, CA_CITY, CA_ZIP]
-                              est. row count: 50000
+                              est: (rows=50000)
                         HashJoin
                             condition: =(HD_INCOME_BAND_SK, IB_INCOME_BAND_SK0)
                             joinType: inner
-                            est. row count: 90684167
+                            est: (rows=90684167)
                           HashJoin
                               condition: =(SS_HDEMO_SK, HD_DEMO_SK)
                               joinType: inner
-                              est. row count: 90684167
+                              est: (rows=90684167)
                             Exchange
                                 distribution: single
-                                est. row count: 7200
+                                est: (rows=7200)
                               TableScan
-                                  table: [PUBLIC, HOUSEHOLD_DEMOGRAPHICS]
+                                  table: PUBLIC.HOUSEHOLD_DEMOGRAPHICS
                                   fields: [HD_DEMO_SK, HD_INCOME_BAND_SK]
-                                  est. row count: 7200
+                                  est: (rows=7200)
                             HashJoin
                                 condition: =(HD_INCOME_BAND_SK, 
IB_INCOME_BAND_SK)
                                 joinType: inner
-                                est. row count: 90684167
+                                est: (rows=90684167)
                               HashJoin
                                   condition: =(C_CURRENT_HDEMO_SK, HD_DEMO_SK)
                                   joinType: inner
-                                  est. row count: 90684167
+                                  est: (rows=90684167)
                                 Exchange
                                     distribution: single
-                                    est. row count: 7200
+                                    est: (rows=7200)
                                   TableScan
-                                      table: [PUBLIC, HOUSEHOLD_DEMOGRAPHICS]
+                                      table: PUBLIC.HOUSEHOLD_DEMOGRAPHICS
                                       fields: [HD_DEMO_SK, HD_INCOME_BAND_SK]
-                                      est. row count: 7200
+                                      est: (rows=7200)
                                 HashJoin
                                     condition: AND(<>(CD_MARITAL_STATUS, 
CD_MARITAL_STATUS0), =(SS_CDEMO_SK, CD_DEMO_SK))
                                     joinType: inner
-                                    est. row count: 90684167
+                                    est: (rows=90684167)
                                   Exchange
                                       distribution: single
-                                      est. row count: 1920800
+                                      est: (rows=1920800)
                                     TableScan
-                                        table: [PUBLIC, CUSTOMER_DEMOGRAPHICS]
+                                        table: PUBLIC.CUSTOMER_DEMOGRAPHICS
                                         fields: [CD_DEMO_SK, CD_MARITAL_STATUS]
-                                        est. row count: 1920800
+                                        est: (rows=1920800)
                                   HashJoin
                                       condition: =(C_CURRENT_CDEMO_SK, 
CD_DEMO_SK)
                                       joinType: inner
-                                      est. row count: 129548810
+                                      est: (rows=129548810)
                                     Exchange
                                         distribution: single
-                                        est. row count: 1920800
+                                        est: (rows=1920800)
                                       TableScan
-                                          table: [PUBLIC, 
CUSTOMER_DEMOGRAPHICS]
+                                          table: PUBLIC.CUSTOMER_DEMOGRAPHICS
                                           fields: [CD_DEMO_SK, 
CD_MARITAL_STATUS]
-                                          est. row count: 1920800
+                                          est: (rows=1920800)
                                     HashJoin
                                         condition: =(SS_CUSTOMER_SK, 
C_CUSTOMER_SK)
                                         joinType: inner
-                                        est. row count: 129548810
+                                        est: (rows=129548810)
                                       Exchange
                                           distribution: single
-                                          est. row count: 100000
+                                          est: (rows=100000)
                                         TableScan
-                                            table: [PUBLIC, CUSTOMER]
+                                            table: PUBLIC.CUSTOMER
                                             fields: [C_CUSTOMER_SK, 
C_CURRENT_CDEMO_SK, C_CURRENT_HDEMO_SK, C_CURRENT_ADDR_SK, 
C_FIRST_SHIPTO_DATE_SK, C_FIRST_SALES_DATE_SK]
-                                            est. row count: 100000
+                                            est: (rows=100000)
                                       HashJoin
                                           condition: =(SS_SOLD_DATE_SK, 
D_DATE_SK)
                                           joinType: inner
-                                          est. row count: 129548810
+                                          est: (rows=129548810)
                                         HashJoin
                                             condition: =(SS_ITEM_SK, 
CS_ITEM_SK)
                                             joinType: inner
-                                            est. row count: 389035465
+                                            est: (rows=389035465)
                                           HashJoin
                                               condition: =(SS_ITEM_SK, 
I_ITEM_SK)
                                               joinType: inner
-                                              est. row count: 180025
+                                              est: (rows=180025)
                                             Exchange
                                                 distribution: single
-                                                est. row count: 2880404
+                                                est: (rows=2880404)
                                               TableScan
-                                                  table: [PUBLIC, STORE_SALES]
+                                                  table: PUBLIC.STORE_SALES
                                                   fields: [SS_SOLD_DATE_SK, 
SS_ITEM_SK, SS_CUSTOMER_SK, SS_CDEMO_SK, SS_HDEMO_SK, SS_ADDR_SK, SS_STORE_SK, 
SS_PROMO_SK, SS_TICKET_NUMBER, SS_WHOLESALE_COST, SS_LIST_PRICE, SS_COUPON_AMT]
-                                                  est. row count: 2880404
+                                                  est: (rows=2880404)
                                             Exchange
                                                 distribution: single
-                                                est. row count: 1125
+                                                est: (rows=1125)
                                               TableScan
-                                                  table: [PUBLIC, ITEM]
+                                                  table: PUBLIC.ITEM
                                                   filters: AND(SEARCH(I_COLOR, 
Sarg[_UTF-8'azure':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'blush':VARCHAR(20) 
CHARACTER SET "UTF-8", _UTF-8'gainsboro':VARCHAR(20) CHARACTER SET "UTF-8", 
_UTF-8'hot':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'lemon':VARCHAR(20) 
CHARACTER SET "UTF-8", _UTF-8'misty':VARCHAR(20) CHARACTER SET 
"UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8"), 
>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 80.00), <=(CAST(I_CURRENT_PRICE):DE 
[...]
                                                   fields: [I_ITEM_SK, 
I_CURRENT_PRICE, I_COLOR, I_PRODUCT_NAME]
-                                                  est. row count: 1125
+                                                  est: (rows=1125)
                                           Filter
                                               condition: >(SALE, *(2, REFUND))
-                                              est. row count: 14407
+                                              est: (rows=14407)
                                             ReduceHashAggregate
                                                 rowType: RecordType(INTEGER 
CS_ITEM_SK, DECIMAL(32767, 2) SALE, DECIMAL(32767, 2) REFUND)
                                                 group: [CS_ITEM_SK]
                                                 aggs: [SUM(_ACC0), SUM(_ACC1)]
-                                                est. row count: 28813
+                                                est: (rows=28813)
                                               Exchange
                                                   distribution: single
-                                                  est. row count: 28813
+                                                  est: (rows=28813)
                                                 MapHashAggregate
                                                     group: [CS_ITEM_SK]
                                                     aggs: 
[SUM(CS_EXT_LIST_PRICE), SUM($f2)]
-                                                    est. row count: 28813
+                                                    est: (rows=28813)
                                                   Project
                                                       fields: [CS_ITEM_SK, 
CS_EXT_LIST_PRICE, $f2]
                                                       exprs: [CS_ITEM_SK, 
CS_EXT_LIST_PRICE, +(+(CR_REFUNDED_CASH, CR_REVERSED_CHARGE), CR_STORE_CREDIT)]
-                                                      est. row count: 144067
+                                                      est: (rows=144067)
                                                     HashJoin
                                                         condition: 
AND(=(CS_ITEM_SK, CR_ITEM_SK), =(CS_ORDER_NUMBER, CR_ORDER_NUMBER))
                                                         joinType: inner
-                                                        est. row count: 144067
+                                                        est: (rows=144067)
                                                       TableScan
-                                                          table: [PUBLIC, 
CATALOG_SALES]
+                                                          table: 
PUBLIC.CATALOG_SALES
                                                           fields: [CS_ITEM_SK, 
CS_ORDER_NUMBER, CS_EXT_LIST_PRICE]
-                                                          est. row count: 
1441548
+                                                          est: (rows=1441548)
                                                       Exchange
                                                           distribution: 
affinity[tableId=51, zoneId=51][0, 1]
-                                                          est. row count: 
144067
+                                                          est: (rows=144067)
                                                         TableScan
-                                                            table: [PUBLIC, 
CATALOG_RETURNS]
+                                                            table: 
PUBLIC.CATALOG_RETURNS
                                                             fields: 
[CR_ITEM_SK, CR_ORDER_NUMBER, CR_REFUNDED_CASH, CR_REVERSED_CHARGE, 
CR_STORE_CREDIT]
-                                                            est. row count: 
144067
+                                                            est: (rows=144067)
                                         Exchange
                                             distribution: single
-                                            est. row count: 24325
+                                            est: (rows=24325)
                                           TableScan
-                                              table: [PUBLIC, DATE_DIM]
+                                              table: PUBLIC.DATE_DIM
                                               filters: =(D_YEAR, +(1999, 1))
                                               fields: [D_DATE_SK, D_YEAR]
-                                              est. row count: 24325
+                                              est: (rows=24325)
                               Exchange
                                   distribution: single
-                                  est. row count: 20
+                                  est: (rows=20)
                                 TableScan
-                                    table: [PUBLIC, INCOME_BAND]
+                                    table: PUBLIC.INCOME_BAND
                                     fields: [IB_INCOME_BAND_SK]
-                                    est. row count: 20
+                                    est: (rows=20)
                           Exchange
                               distribution: single
-                              est. row count: 20
+                              est: (rows=20)
                             TableScan
-                                table: [PUBLIC, INCOME_BAND]
+                                table: PUBLIC.INCOME_BAND
                                 fields: [IB_INCOME_BAND_SK]
-                                est. row count: 20
+                                est: (rows=20)
                     Exchange
                         distribution: single
-                        est. row count: 300
+                        est: (rows=300)
                       TableScan
-                          table: [PUBLIC, PROMOTION]
+                          table: PUBLIC.PROMOTION
                           fields: [P_PROMO_SK]
-                          est. row count: 300
+                          est: (rows=300)
                   Exchange
                       distribution: single
-                      est. row count: 12
+                      est: (rows=12)
                     TableScan
-                        table: [PUBLIC, STORE]
+                        table: PUBLIC.STORE
                         fields: [S_STORE_SK, S_STORE_NAME, S_ZIP]
-                        est. row count: 12
+                        est: (rows=12)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q1.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q1.plan
index 3e9a9bc1fd0..3029e9a4a8d 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q1.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q1.plan
@@ -1,28 +1,28 @@
 Sort
     collation: [L_RETURNFLAG ASC, L_LINESTATUS ASC]
-    est. row count: 1080219
+    est: (rows=1080219)
   Project
       fields: [L_RETURNFLAG, L_LINESTATUS, SUM_QTY, SUM_BASE_PRICE, 
SUM_DISC_PRICE, SUM_CHARGE, AVG_QTY, AVG_PRICE, AVG_DISC, COUNT_ORDER]
       exprs: [f0, f1, f0_2, f0_3, f0_4, f0_5, DECIMAL_DIVIDE(f0_6, f1_7, 29, 
16), DECIMAL_DIVIDE(f0_8, f1_9, 29, 16), DECIMAL_DIVIDE(f0_10, f1_11, 29, 16), 
CAST(f0_12):BIGINT NOT NULL]
-      est. row count: 1080219
+      est: (rows=1080219)
     ReduceHashAggregate
         rowType: RecordType(VARCHAR(1) f0, VARCHAR(1) f1, DECIMAL(32767, 2) 
f0_2, DECIMAL(32767, 2) f0_3, DECIMAL(32767, 4) f0_4, DECIMAL(32767, 6) f0_5, 
DECIMAL(32767, 2) f0_6, DECIMAL(32767, 0) f1_7, DECIMAL(32767, 2) f0_8, 
DECIMAL(32767, 0) f1_9, DECIMAL(32767, 2) f0_10, DECIMAL(32767, 0) f1_11, 
BIGINT f0_12)
         group: [0, 1]
         aggs: [SUM(2), SUM(3), SUM(4), SUM(5), SUM(6), $SUM0(7), SUM(8), 
$SUM0(9), SUM(10), $SUM0(11), $SUM0(12)]
-        est. row count: 1080219
+        est: (rows=1080219)
       Exchange
           distribution: single
-          est. row count: 1080219
+          est: (rows=1080219)
         Project
             fields: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
             exprs: [L_RETURNFLAG, L_LINESTATUS, _ACC0, _ACC1, _ACC2, _ACC3, 
_ACC4, CAST(_ACC5):DECIMAL(32767, 0) NOT NULL, _ACC6, 
CAST(_ACC7):DECIMAL(32767, 0) NOT NULL, _ACC8, CAST(_ACC9):DECIMAL(32767, 0) 
NOT NULL, _ACC10, _GROUP_ID]
-            est. row count: 1080219
+            est: (rows=1080219)
           MapHashAggregate
               group: [L_RETURNFLAG, L_LINESTATUS]
               aggs: [SUM(L_QUANTITY), SUM(L_EXTENDEDPRICE), SUM($f4), 
SUM($f5), SUM(L_QUANTITY), COUNT(L_QUANTITY), SUM(L_EXTENDEDPRICE), 
COUNT(L_EXTENDEDPRICE), SUM(L_DISCOUNT), COUNT(L_DISCOUNT), COUNT()]
-              est. row count: 1080219
+              est: (rows=1080219)
             IndexScan
-                table: [PUBLIC, LINEITEM]
+                table: PUBLIC.LINEITEM
                 index: L_SD
                 type: SORTED
                 searchBounds: [RangeBounds [lowerBound=null, 
upperBound=-(1998-12-01, 7776000000:INTERVAL DAY), lowerInclude=true, 
upperInclude=true]]
@@ -30,4 +30,4 @@ Sort
                 fields: [L_RETURNFLAG, L_LINESTATUS, L_QUANTITY, 
L_EXTENDEDPRICE, $f4, $f5, L_DISCOUNT]
                 projects: [L_RETURNFLAG, L_LINESTATUS, L_QUANTITY, 
L_EXTENDEDPRICE, *(L_EXTENDEDPRICE, -(1, L_DISCOUNT)), *(*(L_EXTENDEDPRICE, 
-(1, L_DISCOUNT)), +(1, L_TAX)), L_DISCOUNT]
                 collation: []
-                est. row count: 3000608
+                est: (rows=3000608)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q21.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q21.plan
index 5b440ee5371..7acd4887340 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q21.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q21.plan
@@ -1,107 +1,107 @@
 Limit
     fetch: 100
-    est. row count: 100
+    est: (rows=100)
   Sort
       collation: [NUMWAIT DESC, S_NAME ASC]
       fetch: 100
-      est. row count: 100
+      est: (rows=100)
     ColocatedSortAggregate
         group: [S_NAME]
         aggs: [COUNT()]
         collation: [S_NAME ASC]
-        est. row count: 332203730726418
+        est: (rows=332203730726418)
       Project
           fields: [S_NAME]
           exprs: [S_NAME]
-          est. row count: 1661018653632089
+          est: (rows=1661018653632089)
         Filter
             condition: IS NULL(i)
-            est. row count: 1661018653632089
+            est: (rows=1661018653632089)
           CorrelatedNestedLoopJoin
               condition: true
               joinType: left
               variablesSet: [$cor5]
-              est. row count: 6644074614528357
+              est: (rows=6644074614528357)
             CorrelatedNestedLoopJoin
                 condition: true
                 joinType: inner
                 variablesSet: [$cor6]
-                est. row count: 66493788407
+                est: (rows=66493788407)
               Sort
                   collation: [S_NAME ASC]
-                  est. row count: 332734
+                  est: (rows=332734)
                 Project
                     fields: [S_NAME, L_ORDERKEY, L_SUPPKEY]
                     exprs: [S_NAME, L_ORDERKEY, L_SUPPKEY]
-                    est. row count: 332734
+                    est: (rows=332734)
                   HashJoin
                       condition: =(O_ORDERKEY, L_ORDERKEY)
                       joinType: inner
-                      est. row count: 332734
+                      est: (rows=332734)
                     HashJoin
                         condition: =(S_SUPPKEY, L_SUPPKEY)
                         joinType: inner
-                        est. row count: 999202
+                        est: (rows=999202)
                       Exchange
                           distribution: single
-                          est. row count: 3000608
+                          est: (rows=3000608)
                         TableScan
-                            table: [PUBLIC, LINEITEM]
+                            table: PUBLIC.LINEITEM
                             filters: >(L_RECEIPTDATE, L_COMMITDATE)
                             fields: [L_ORDERKEY, L_SUPPKEY, L_COMMITDATE, 
L_RECEIPTDATE]
-                            est. row count: 3000608
+                            est: (rows=3000608)
                       MergeJoin
                           condition: =(S_NATIONKEY, N_NATIONKEY)
                           joinType: inner
                           leftCollation: [S_NATIONKEY ASC]
                           rightCollation: [S_SUPPKEY ASC]
-                          est. row count: 3330
+                          est: (rows=3330)
                         Exchange
                             distribution: single
-                            est. row count: 10000
+                            est: (rows=10000)
                           IndexScan
-                              table: [PUBLIC, SUPPLIER]
+                              table: PUBLIC.SUPPLIER
                               index: S_NK
                               type: SORTED
                               fields: [S_SUPPKEY, S_NAME, S_NATIONKEY]
                               collation: [S_NATIONKEY ASC]
-                              est. row count: 10000
+                              est: (rows=10000)
                         Exchange
                             distribution: single
-                            est. row count: 8
+                            est: (rows=8)
                           Sort
                               collation: [N_NATIONKEY ASC]
-                              est. row count: 8
+                              est: (rows=8)
                             TableScan
-                                table: [PUBLIC, NATION]
+                                table: PUBLIC.NATION
                                 filters: =(N_NAME, _UTF-8'SAUDI ARABIA')
                                 fields: [N_NATIONKEY, N_NAME]
-                                est. row count: 8
+                                est: (rows=8)
                     Exchange
                         distribution: single
-                        est. row count: 499500
+                        est: (rows=499500)
                       TableScan
-                          table: [PUBLIC, ORDERS]
+                          table: PUBLIC.ORDERS
                           filters: =(O_ORDERSTATUS, _UTF-8'F')
                           fields: [O_ORDERKEY, O_ORDERSTATUS]
-                          est. row count: 499500
+                          est: (rows=499500)
               Project
                   fields: []
                   exprs: []
-                  est. row count: 199840
+                  est: (rows=199840)
                 ReduceHashAggregate
                     rowType: RecordType(BOOLEAN i)
                     group: [i]
-                    est. row count: 199840
+                    est: (rows=199840)
                   Exchange
                       distribution: single
-                      est. row count: 199840
+                      est: (rows=199840)
                     MapHashAggregate
                         group: [i]
                         aggs: []
-                        est. row count: 199840
+                        est: (rows=199840)
                       IndexScan
-                          table: [PUBLIC, LINEITEM]
+                          table: PUBLIC.LINEITEM
                           index: L_OK
                           type: SORTED
                           searchBounds: [ExactBounds [bound=$cor6.L_ORDERKEY]]
@@ -109,20 +109,20 @@ Limit
                           fields: [i]
                           projects: [true]
                           collation: []
-                          est. row count: 999202
+                          est: (rows=999202)
             ReduceHashAggregate
                 rowType: RecordType(BOOLEAN i)
                 group: [i]
-                est. row count: 99920
+                est: (rows=99920)
               Exchange
                   distribution: single
-                  est. row count: 99920
+                  est: (rows=99920)
                 MapHashAggregate
                     group: [i]
                     aggs: []
-                    est. row count: 99920
+                    est: (rows=99920)
                   IndexScan
-                      table: [PUBLIC, LINEITEM]
+                      table: PUBLIC.LINEITEM
                       index: L_OK
                       type: SORTED
                       searchBounds: [ExactBounds [bound=$cor5.L_ORDERKEY]]
@@ -130,4 +130,4 @@ Limit
                       fields: [i]
                       projects: [true]
                       collation: []
-                      est. row count: 499601
+                      est: (rows=499601)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q5.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q5.plan
index 799dfa255c9..60381a64442 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q5.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q5.plan
@@ -1,75 +1,75 @@
 Sort
     collation: [REVENUE DESC]
-    est. row count: 69944
+    est: (rows=69944)
   ColocatedHashAggregate
       group: [N_NAME]
       aggs: [SUM($f1)]
-      est. row count: 69944
+      est: (rows=69944)
     Project
         fields: [N_NAME, $f1]
         exprs: [N_NAME, *(L_EXTENDEDPRICE, -(1, L_DISCOUNT))]
-        est. row count: 349721
+        est: (rows=349721)
       HashJoin
           condition: AND(=(C_NATIONKEY, S_NATIONKEY), =(L_SUPPKEY, S_SUPPKEY))
           joinType: inner
-          est. row count: 349721
+          est: (rows=349721)
         HashJoin
             condition: =(L_ORDERKEY, O_ORDERKEY)
             joinType: inner
-            est. row count: 1500304
+            est: (rows=1500304)
           Exchange
               distribution: single
-              est. row count: 6001215
+              est: (rows=6001215)
             TableScan
-                table: [PUBLIC, LINEITEM]
+                table: PUBLIC.LINEITEM
                 fields: [L_ORDERKEY, L_SUPPKEY, L_EXTENDEDPRICE, L_DISCOUNT]
-                est. row count: 6001215
+                est: (rows=6001215)
           HashJoin
               condition: =(C_CUSTKEY, O_CUSTKEY)
               joinType: inner
-              est. row count: 375000
+              est: (rows=375000)
             Exchange
                 distribution: single
-                est. row count: 375000
+                est: (rows=375000)
               TableScan
-                  table: [PUBLIC, ORDERS]
+                  table: PUBLIC.ORDERS
                   filters: AND(>=(O_ORDERDATE, 1994-01-01), <(O_ORDERDATE, 
+(1994-01-01, 12:INTERVAL YEAR)))
                   fields: [O_ORDERKEY, O_CUSTKEY, O_ORDERDATE]
-                  est. row count: 375000
+                  est: (rows=375000)
             Exchange
                 distribution: single
-                est. row count: 150000
+                est: (rows=150000)
               TableScan
-                  table: [PUBLIC, CUSTOMER]
+                  table: PUBLIC.CUSTOMER
                   fields: [C_CUSTKEY, C_NATIONKEY]
-                  est. row count: 150000
+                  est: (rows=150000)
         HashJoin
             condition: =(S_NATIONKEY, N_NATIONKEY)
             joinType: inner
-            est. row count: 3330
+            est: (rows=3330)
           Exchange
               distribution: single
-              est. row count: 10000
+              est: (rows=10000)
             TableScan
-                table: [PUBLIC, SUPPLIER]
+                table: PUBLIC.SUPPLIER
                 fields: [S_SUPPKEY, S_NATIONKEY]
-                est. row count: 10000
+                est: (rows=10000)
           HashJoin
               condition: =(N_REGIONKEY, R_REGIONKEY)
               joinType: inner
-              est. row count: 8
+              est: (rows=8)
             Exchange
                 distribution: single
-                est. row count: 25
+                est: (rows=25)
               TableScan
-                  table: [PUBLIC, NATION]
+                  table: PUBLIC.NATION
                   fields: [N_NATIONKEY, N_NAME, N_REGIONKEY]
-                  est. row count: 25
+                  est: (rows=25)
             Exchange
                 distribution: single
-                est. row count: 2
+                est: (rows=2)
               TableScan
-                  table: [PUBLIC, REGION]
+                  table: PUBLIC.REGION
                   filters: =(R_NAME, _UTF-8'ASIA')
                   fields: [R_REGIONKEY, R_NAME]
-                  est. row count: 2
+                  est: (rows=2)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q7.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q7.plan
index f4d5db42f0d..cefcfbc893b 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q7.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q7.plan
@@ -1,76 +1,76 @@
 Sort
     collation: [SUPP_NATION ASC, CUST_NATION ASC, L_YEAR ASC]
-    est. row count: 165618
+    est: (rows=165618)
   ColocatedHashAggregate
       group: [SUPP_NATION, CUST_NATION, L_YEAR]
       aggs: [SUM(VOLUME)]
-      est. row count: 165618
+      est: (rows=165618)
     Project
         fields: [SUPP_NATION, CUST_NATION, L_YEAR, VOLUME]
         exprs: [N_NAME, N_NAME0, EXTRACT(FLAG(YEAR), L_SHIPDATE), 
*(L_EXTENDEDPRICE, -(1, L_DISCOUNT))]
-        est. row count: 339381
+        est: (rows=339381)
       HashJoin
           condition: AND(=(O_ORDERKEY, L_ORDERKEY), OR(=(N_NAME, 
_UTF-8'FRANCE'), =(N_NAME0, _UTF-8'FRANCE')), OR(=(N_NAME0, _UTF-8'GERMANY'), 
=(N_NAME, _UTF-8'GERMANY')))
           joinType: inner
-          est. row count: 339381
+          est: (rows=339381)
         HashJoin
             condition: =(S_SUPPKEY, L_SUPPKEY)
             joinType: inner
-            est. row count: 852873
+            est: (rows=852873)
           Exchange
               distribution: single
-              est. row count: 1500304
+              est: (rows=1500304)
             TableScan
-                table: [PUBLIC, LINEITEM]
+                table: PUBLIC.LINEITEM
                 filters: SEARCH(L_SHIPDATE, Sarg[[1995-01-01..1996-12-31]])
                 fields: [L_ORDERKEY, L_SUPPKEY, L_EXTENDEDPRICE, L_DISCOUNT, 
L_SHIPDATE]
-                est. row count: 1500304
+                est: (rows=1500304)
           HashJoin
               condition: =(S_NATIONKEY, N_NATIONKEY)
               joinType: inner
-              est. row count: 5685
+              est: (rows=5685)
             Exchange
                 distribution: single
-                est. row count: 10000
+                est: (rows=10000)
               TableScan
-                  table: [PUBLIC, SUPPLIER]
+                  table: PUBLIC.SUPPLIER
                   fields: [S_SUPPKEY, S_NATIONKEY]
-                  est. row count: 10000
+                  est: (rows=10000)
             Exchange
                 distribution: single
-                est. row count: 14
+                est: (rows=14)
               TableScan
-                  table: [PUBLIC, NATION]
+                  table: PUBLIC.NATION
                   filters: SEARCH(N_NAME, Sarg[_UTF-8'FRANCE':CHAR(7) 
CHARACTER SET "UTF-8", _UTF-8'GERMANY']:CHAR(7) CHARACTER SET "UTF-8")
                   fields: [N_NATIONKEY, N_NAME]
-                  est. row count: 14
+                  est: (rows=14)
         HashJoin
             condition: =(C_CUSTKEY, O_CUSTKEY)
             joinType: inner
-            est. row count: 852700
+            est: (rows=852700)
           Exchange
               distribution: single
-              est. row count: 1500000
+              est: (rows=1500000)
             TableScan
-                table: [PUBLIC, ORDERS]
+                table: PUBLIC.ORDERS
                 fields: [O_ORDERKEY, O_CUSTKEY]
-                est. row count: 1500000
+                est: (rows=1500000)
           HashJoin
               condition: =(C_NATIONKEY, N_NATIONKEY)
               joinType: inner
-              est. row count: 85270
+              est: (rows=85270)
             Exchange
                 distribution: single
-                est. row count: 150000
+                est: (rows=150000)
               TableScan
-                  table: [PUBLIC, CUSTOMER]
+                  table: PUBLIC.CUSTOMER
                   fields: [C_CUSTKEY, C_NATIONKEY]
-                  est. row count: 150000
+                  est: (rows=150000)
             Exchange
                 distribution: single
-                est. row count: 14
+                est: (rows=14)
               TableScan
-                  table: [PUBLIC, NATION]
+                  table: PUBLIC.NATION
                   filters: SEARCH(N_NAME, Sarg[_UTF-8'FRANCE':CHAR(7) 
CHARACTER SET "UTF-8", _UTF-8'GERMANY']:CHAR(7) CHARACTER SET "UTF-8")
                   fields: [N_NATIONKEY, N_NAME]
-                  est. row count: 14
+                  est: (rows=14)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q8.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q8.plan
index 29d5503f6ea..465cbc5d37b 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q8.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q8.plan
@@ -1,102 +1,102 @@
 Sort
     collation: [O_YEAR ASC]
-    est. row count: 16635
+    est: (rows=16635)
   Project
       fields: [O_YEAR, MKT_SHARE]
       exprs: [O_YEAR, /($f1, $f2)]
-      est. row count: 16635
+      est: (rows=16635)
     ColocatedHashAggregate
         group: [O_YEAR]
         aggs: [SUM($f1), SUM(VOLUME)]
-        est. row count: 16635
+        est: (rows=16635)
       Project
           fields: [O_YEAR, $f1, VOLUME]
           exprs: [EXTRACT(FLAG(YEAR), O_ORDERDATE), CASE(=(N_NAME, 
_UTF-8'BRAZIL'), *(L_EXTENDEDPRICE, -(1, L_DISCOUNT)), 0.0000:DECIMAL(31, 4)), 
*(L_EXTENDEDPRICE, -(1, L_DISCOUNT))]
-          est. row count: 166367
+          est: (rows=166367)
         HashJoin
             condition: =(S_SUPPKEY, L_SUPPKEY)
             joinType: inner
-            est. row count: 166367
+            est: (rows=166367)
           HashJoin
               condition: =(P_PARTKEY, L_PARTKEY)
               joinType: inner
-              est. row count: 166367
+              est: (rows=166367)
             HashJoin
                 condition: =(L_ORDERKEY, O_ORDERKEY)
                 joinType: inner
-                est. row count: 499601
+                est: (rows=499601)
               Exchange
                   distribution: single
-                  est. row count: 6001215
+                  est: (rows=6001215)
                 TableScan
-                    table: [PUBLIC, LINEITEM]
+                    table: PUBLIC.LINEITEM
                     fields: [L_ORDERKEY, L_PARTKEY, L_SUPPKEY, 
L_EXTENDEDPRICE, L_DISCOUNT]
-                    est. row count: 6001215
+                    est: (rows=6001215)
               HashJoin
                   condition: =(O_CUSTKEY, C_CUSTKEY)
                   joinType: inner
-                  est. row count: 124875
+                  est: (rows=124875)
                 Exchange
                     distribution: single
-                    est. row count: 375000
+                    est: (rows=375000)
                   TableScan
-                      table: [PUBLIC, ORDERS]
+                      table: PUBLIC.ORDERS
                       filters: SEARCH(O_ORDERDATE, 
Sarg[[1995-01-01..1996-12-31]])
                       fields: [O_ORDERKEY, O_CUSTKEY, O_ORDERDATE]
-                      est. row count: 375000
+                      est: (rows=375000)
                 HashJoin
                     condition: =(C_NATIONKEY, N_NATIONKEY)
                     joinType: inner
-                    est. row count: 49950
+                    est: (rows=49950)
                   Exchange
                       distribution: single
-                      est. row count: 150000
+                      est: (rows=150000)
                     TableScan
-                        table: [PUBLIC, CUSTOMER]
+                        table: PUBLIC.CUSTOMER
                         fields: [C_CUSTKEY, C_NATIONKEY]
-                        est. row count: 150000
+                        est: (rows=150000)
                   HashJoin
                       condition: =(N_REGIONKEY, R_REGIONKEY)
                       joinType: inner
-                      est. row count: 8
+                      est: (rows=8)
                     Exchange
                         distribution: single
-                        est. row count: 25
+                        est: (rows=25)
                       TableScan
-                          table: [PUBLIC, NATION]
+                          table: PUBLIC.NATION
                           fields: [N_NATIONKEY, N_REGIONKEY]
-                          est. row count: 25
+                          est: (rows=25)
                     Exchange
                         distribution: single
-                        est. row count: 2
+                        est: (rows=2)
                       TableScan
-                          table: [PUBLIC, REGION]
+                          table: PUBLIC.REGION
                           filters: =(R_NAME, _UTF-8'AMERICA')
                           fields: [R_REGIONKEY, R_NAME]
-                          est. row count: 2
+                          est: (rows=2)
             Exchange
                 distribution: single
-                est. row count: 66600
+                est: (rows=66600)
               TableScan
-                  table: [PUBLIC, PART]
+                  table: PUBLIC.PART
                   filters: =(P_TYPE, _UTF-8'ECONOMY ANODIZED STEEL')
                   fields: [P_PARTKEY, P_TYPE]
-                  est. row count: 66600
+                  est: (rows=66600)
           HashJoin
               condition: =(S_NATIONKEY, N_NATIONKEY)
               joinType: inner
-              est. row count: 10000
+              est: (rows=10000)
             Exchange
                 distribution: single
-                est. row count: 10000
+                est: (rows=10000)
               TableScan
-                  table: [PUBLIC, SUPPLIER]
+                  table: PUBLIC.SUPPLIER
                   fields: [S_SUPPKEY, S_NATIONKEY]
-                  est. row count: 10000
+                  est: (rows=10000)
             Exchange
                 distribution: single
-                est. row count: 25
+                est: (rows=25)
               TableScan
-                  table: [PUBLIC, NATION]
+                  table: PUBLIC.NATION
                   fields: [N_NATIONKEY, N_NAME]
-                  est. row count: 25
+                  est: (rows=25)
diff --git a/modules/sql-engine/src/test/resources/tpch/plan/q9.plan 
b/modules/sql-engine/src/test/resources/tpch/plan/q9.plan
index 325a1aa0288..56afeb20124 100644
--- a/modules/sql-engine/src/test/resources/tpch/plan/q9.plan
+++ b/modules/sql-engine/src/test/resources/tpch/plan/q9.plan
@@ -1,74 +1,74 @@
 Sort
     collation: [NATION ASC, O_YEAR DESC]
-    est. row count: 540109
+    est: (rows=540109)
   ColocatedHashAggregate
       group: [NATION, O_YEAR]
       aggs: [SUM(AMOUNT)]
-      est. row count: 540109
+      est: (rows=540109)
     Project
         fields: [NATION, O_YEAR, AMOUNT]
         exprs: [N_NAME, EXTRACT(FLAG(YEAR), O_ORDERDATE), -(*(L_EXTENDEDPRICE, 
-(1, L_DISCOUNT)), *(PS_SUPPLYCOST, L_QUANTITY))]
-        est. row count: 1500304
+        est: (rows=1500304)
       HashJoin
           condition: AND(=(PS_SUPPKEY, L_SUPPKEY), =(PS_PARTKEY, L_PARTKEY))
           joinType: inner
-          est. row count: 1500304
+          est: (rows=1500304)
         HashJoin
             condition: =(O_ORDERKEY, L_ORDERKEY)
             joinType: inner
-            est. row count: 1500304
+            est: (rows=1500304)
           HashJoin
               condition: =(S_SUPPKEY, L_SUPPKEY)
               joinType: inner
-              est. row count: 1500304
+              est: (rows=1500304)
             HashJoin
                 condition: =(P_PARTKEY, L_PARTKEY)
                 joinType: inner
-                est. row count: 1500304
+                est: (rows=1500304)
               Exchange
                   distribution: single
-                  est. row count: 6001215
+                  est: (rows=6001215)
                 TableScan
-                    table: [PUBLIC, LINEITEM]
+                    table: PUBLIC.LINEITEM
                     fields: [L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_QUANTITY, 
L_EXTENDEDPRICE, L_DISCOUNT]
-                    est. row count: 6001215
+                    est: (rows=6001215)
               Exchange
                   distribution: single
-                  est. row count: 50000
+                  est: (rows=50000)
                 TableScan
-                    table: [PUBLIC, PART]
+                    table: PUBLIC.PART
                     filters: LIKE(P_NAME, _UTF-8'%green%')
                     fields: [P_PARTKEY, P_NAME]
-                    est. row count: 50000
+                    est: (rows=50000)
             HashJoin
                 condition: =(S_NATIONKEY, N_NATIONKEY)
                 joinType: inner
-                est. row count: 10000
+                est: (rows=10000)
               Exchange
                   distribution: single
-                  est. row count: 10000
+                  est: (rows=10000)
                 TableScan
-                    table: [PUBLIC, SUPPLIER]
+                    table: PUBLIC.SUPPLIER
                     fields: [S_SUPPKEY, S_NATIONKEY]
-                    est. row count: 10000
+                    est: (rows=10000)
               Exchange
                   distribution: single
-                  est. row count: 25
+                  est: (rows=25)
                 TableScan
-                    table: [PUBLIC, NATION]
+                    table: PUBLIC.NATION
                     fields: [N_NATIONKEY, N_NAME]
-                    est. row count: 25
+                    est: (rows=25)
           Exchange
               distribution: single
-              est. row count: 1500000
+              est: (rows=1500000)
             TableScan
-                table: [PUBLIC, ORDERS]
+                table: PUBLIC.ORDERS
                 fields: [O_ORDERKEY, O_ORDERDATE]
-                est. row count: 1500000
+                est: (rows=1500000)
         Exchange
             distribution: single
-            est. row count: 800000
+            est: (rows=800000)
           TableScan
-              table: [PUBLIC, PARTSUPP]
+              table: PUBLIC.PARTSUPP
               fields: [PS_PARTKEY, PS_SUPPKEY, PS_SUPPLYCOST]
-              est. row count: 800000
+              est: (rows=800000)
diff --git 
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
index 740b36be8f8..8ab541e5b17 100644
--- 
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
+++ 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryChecker.java
@@ -34,6 +34,7 @@ import java.util.Objects;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import org.apache.ignite.internal.lang.IgniteStringBuilder;
+import org.apache.ignite.table.QualifiedName;
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
@@ -61,7 +62,7 @@ public interface QueryChecker {
      * @return Matcher.
      */
     static Matcher<String> containsTableScan(String schema, String tblName) {
-        return matchesOnce("TableScan.*?table: \\[" + schema + ", " + tblName 
+ "\\]");
+        return matchesOnce("TableScan.*?table: " + QualifiedName.of(schema, 
tblName).toCanonicalForm());
     }
 
     /**
@@ -73,7 +74,7 @@ public interface QueryChecker {
      */
     static Matcher<String> nodeRowCount(String nodePattern, Matcher<Integer> 
rowCountMatcher) {
         Pattern pattern = Pattern.compile(".*" + nodePattern 
-                + ".*?est\\. row count: (?<rowcount>\\d+).*");
+                + ".*?est: \\(rows=(?<rowcount>\\d+).*");
 
         return new BaseMatcher<>() {
             @Override
@@ -110,7 +111,7 @@ public interface QueryChecker {
      * @return Matcher.
      */
     static Matcher<String> containsIndexScan(String schema, String tblName) {
-        return matchesOnce("IndexScan.*?table: \\[" + schema + ", " + tblName 
+ "\\]");
+        return matchesOnce("IndexScan.*?table: " + QualifiedName.of(schema, 
tblName).toCanonicalForm());
     }
 
     /**
@@ -122,7 +123,7 @@ public interface QueryChecker {
      * @return Matcher.
      */
     static Matcher<String> containsIndexScan(String schema, String tblName, 
String idxName) {
-        return matchesOnce("IndexScan.*?table: \\[" + schema + ", " + tblName 
+ "\\]" 
+        return matchesOnce("IndexScan.*?table: " + QualifiedName.of(schema, 
tblName).toCanonicalForm()
                 + ".*?index: " + idxName);
     }
 
@@ -135,8 +136,8 @@ public interface QueryChecker {
      * @return Matcher.
      */
     static Matcher<String> containsProject(String schema, String tblName, 
String... names) {
-        return matchesOnce("(Table|Index)Scan.*?table: \\[" + schema + ", "
-                + tblName + "\\].*?fields: \\[" + String.join(", ", 
List.of(names)) + "\\]");
+        return matchesOnce("(Table|Index)Scan.*?table: " + 
QualifiedName.of(schema, tblName).toCanonicalForm()
+                + ".*?fields: \\[" + String.join(", ", List.of(names)) + 
"\\]");
     }
 
     /**
@@ -276,7 +277,7 @@ public interface QueryChecker {
      */
     static Matcher<String> containsAnyScan(String schema, String tblName, 
String... idxNames) {
         if (nullOrEmpty(idxNames)) {
-            return matchesOnce("(Table|Index)Scan.*?table: \\[" + schema + ", 
" + tblName + "\\]");
+            return matchesOnce("(Table|Index)Scan.*?table: " + 
QualifiedName.of(schema, tblName).toCanonicalForm());
         }
 
         return anyOf(


Reply via email to