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 0211489637 IGNITE-19654 Sql. Remove redundant planing timeout and use 
correct one (#2214)
0211489637 is described below

commit 02114896375874320c4ea76fd4ec9d67ed77bb96
Author: ygerzhedovich <[email protected]>
AuthorDate: Mon Jul 17 15:02:16 2023 +0300

    IGNITE-19654 Sql. Remove redundant planing timeout and use correct one 
(#2214)
---
 .../java/org/apache/ignite/lang/ErrorGroups.java   |  3 +
 modules/jdbc/build.gradle                          |  2 +-
 .../internal/jdbc/ItJdbcMetadataSelfTest.java      |  2 +-
 .../internal/jdbc/JdbcPreparedStatement.java       |  1 +
 .../internal/jdbc/PreparedStatementParamsTest.java | 44 ++++++------
 .../ignite/internal/sql/api/ItCommonApiTest.java   |  9 +--
 .../internal/sql/engine/ItDataTypesTest.java       |  3 +-
 .../ignite/internal/sql/engine/ItDmlTest.java      | 49 +++++--------
 .../sql/engine/ItDynamicParameterTest.java         |  8 +--
 .../internal/sql/engine/ItFunctionsTest.java       |  3 +-
 .../internal/sql/engine/ItImplicitCastsTest.java   |  4 +-
 .../ignite/internal/sql/engine/ItIntervalTest.java | 22 +++---
 .../datatypes/tests/BaseDmlDataTypeTest.java       | 12 ++--
 .../tests/BaseExpressionDataTypeTest.java          |  4 +-
 .../datatypes/tests/BaseQueryDataTypeTest.java     |  4 +-
 .../sql/engine/datatypes/uuid/ItUuidQueryTest.java |  4 +-
 .../datatypes/varbinary/ItVarBinaryQueryTest.java  |  4 +-
 modules/sql-engine/build.gradle                    |  1 +
 .../internal/sql/api/SessionBuilderImpl.java       |  1 -
 .../ignite/internal/sql/api/SessionImpl.java       |  8 +--
 .../internal/sql/engine/SqlQueryProcessor.java     |  4 --
 .../internal/sql/engine/prepare/IgnitePlanner.java |  9 +++
 .../sql/engine/prepare/PlanningContext.java        | 82 +++++++++-------------
 .../sql/engine/prepare/PrepareService.java         |  5 ++
 .../sql/engine/prepare/PrepareServiceImpl.java     | 48 ++++++++++---
 .../internal/sql/engine/util/BaseQueryContext.java | 20 +-----
 .../sql/engine/exec/ExecutionServiceImplTest.java  |  5 +-
 .../internal/sql/engine/framework/TestNode.java    |  3 +-
 .../sql/engine/planner/PlannerTimeoutTest.java     | 38 +++++++++-
 .../internal/sql/engine}/util/SqlTestUtils.java    | 23 +++++-
 30 files changed, 237 insertions(+), 188 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroups.java 
b/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroups.java
index 5de26568b0..982d186f02 100755
--- a/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroups.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroups.java
@@ -203,6 +203,9 @@ public class ErrorGroups {
 
         /** Execution cancelled. */
         public static final int EXECUTION_CANCELLED_ERR = 
SQL_ERR_GROUP.registerErrorCode((short) 33);
+
+        /** Planning timeouted without any valid plan. */
+        public static final int PLANNING_TIMEOUTED_ERR = 
SQL_ERR_GROUP.registerErrorCode((short) 34);
     }
 
     /** Meta storage error group. */
diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle
index 90f1a6e7f5..ddfa9b3928 100644
--- a/modules/jdbc/build.gradle
+++ b/modules/jdbc/build.gradle
@@ -38,7 +38,7 @@ dependencies {
 
     integrationTestImplementation testFixtures(project(":ignite-api"))
     integrationTestImplementation testFixtures(project(":ignite-core"))
-    integrationTestImplementation testFixtures(project(":ignite-runner"))
+    integrationTestImplementation testFixtures(project(":ignite-sql-engine"))
     integrationTestImplementation project(":ignite-runner")
     integrationTestImplementation project(":ignite-api")
 }
diff --git 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
index 7cf9047807..0e031f7557 100644
--- 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
+++ 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
@@ -45,7 +45,7 @@ import java.util.StringJoiner;
 import java.util.UUID;
 import org.apache.ignite.internal.client.proto.ProtocolVersion;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcColumnMeta;
-import org.apache.ignite.internal.sql.util.SqlTestUtils;
+import org.apache.ignite.internal.sql.engine.util.SqlTestUtils;
 import org.apache.ignite.jdbc.AbstractJdbcSelfTest;
 import org.apache.ignite.sql.ColumnType;
 import org.junit.jupiter.api.BeforeAll;
diff --git 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcPreparedStatement.java
 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcPreparedStatement.java
index a95c6946a0..408657d215 100644
--- 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcPreparedStatement.java
+++ 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcPreparedStatement.java
@@ -83,6 +83,7 @@ public class JdbcPreparedStatement extends JdbcStatement 
implements PreparedStat
             JDBCType.VARCHAR,
             JDBCType.BINARY,
             JDBCType.VARBINARY,
+            JDBCType.NULL,
             JDBCType.OTHER // UUID.
     );
 
diff --git 
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/PreparedStatementParamsTest.java
 
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/PreparedStatementParamsTest.java
index 3a0fc139a6..26cdccea60 100644
--- 
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/PreparedStatementParamsTest.java
+++ 
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/PreparedStatementParamsTest.java
@@ -39,6 +39,7 @@ import java.sql.Timestamp;
 import java.time.LocalTime;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.TreeSet;
@@ -61,25 +62,28 @@ import org.mockito.Mockito;
 public class PreparedStatementParamsTest {
 
     /** Values for supported JDBC types. */
-    private static final Map<JDBCType, Object> SUPPORTED_TYPES = Map.ofEntries(
-            Map.entry(JDBCType.BOOLEAN, true),
-            Map.entry(JDBCType.TINYINT, (byte) 1),
-            Map.entry(JDBCType.SMALLINT, (short) 1),
-            Map.entry(JDBCType.INTEGER, 1),
-            Map.entry(JDBCType.BIGINT, 1L),
-            Map.entry(JDBCType.FLOAT, 1.0f),
-            Map.entry(JDBCType.REAL, 1.0f),
-            Map.entry(JDBCType.DOUBLE, 1.0d),
-            Map.entry(JDBCType.DECIMAL, new BigDecimal("123")),
-            Map.entry(JDBCType.CHAR, "123"),
-            Map.entry(JDBCType.VARCHAR, "123"),
-            Map.entry(JDBCType.BINARY, new byte[]{1, 2, 3}),
-            Map.entry(JDBCType.VARBINARY, new byte[]{1, 2, 3}),
-            Map.entry(JDBCType.DATE, new Date(1)),
-            Map.entry(JDBCType.TIME, Time.valueOf(LocalTime.NOON)),
-            Map.entry(JDBCType.TIMESTAMP, Timestamp.valueOf("2000-01-01 
00:00:00.000")),
-            Map.entry(JDBCType.OTHER, new UUID(1, 1))
-    );
+    private static final Map<JDBCType, Object> SUPPORTED_TYPES = new 
HashMap<>();
+
+    static {
+        SUPPORTED_TYPES.put(JDBCType.BOOLEAN, true);
+        SUPPORTED_TYPES.put(JDBCType.TINYINT, (byte) 1);
+        SUPPORTED_TYPES.put(JDBCType.SMALLINT, (short) 1);
+        SUPPORTED_TYPES.put(JDBCType.INTEGER, 1);
+        SUPPORTED_TYPES.put(JDBCType.BIGINT, 1L);
+        SUPPORTED_TYPES.put(JDBCType.FLOAT, 1.0f);
+        SUPPORTED_TYPES.put(JDBCType.REAL, 1.0f);
+        SUPPORTED_TYPES.put(JDBCType.DOUBLE, 1.0d);
+        SUPPORTED_TYPES.put(JDBCType.DECIMAL, new BigDecimal("123"));
+        SUPPORTED_TYPES.put(JDBCType.CHAR, "123");
+        SUPPORTED_TYPES.put(JDBCType.VARCHAR, "123");
+        SUPPORTED_TYPES.put(JDBCType.BINARY, new byte[]{1, 2, 3});
+        SUPPORTED_TYPES.put(JDBCType.VARBINARY, new byte[]{1, 2, 3});
+        SUPPORTED_TYPES.put(JDBCType.DATE, new Date(1));
+        SUPPORTED_TYPES.put(JDBCType.TIME, Time.valueOf(LocalTime.NOON));
+        SUPPORTED_TYPES.put(JDBCType.TIMESTAMP, Timestamp.valueOf("2000-01-01 
00:00:00.000"));
+        SUPPORTED_TYPES.put(JDBCType.OTHER, new UUID(1, 1));
+        SUPPORTED_TYPES.put(JDBCType.NULL, null);
+    }
 
     private JdbcConnection conn;
 
@@ -357,7 +361,7 @@ public class PreparedStatementParamsTest {
                 .map(e -> {
                     JDBCType jdbcType = e.getKey();
                     Object value = e.getValue();
-                    String javaTypeName = value.getClass().getTypeName();
+                    String javaTypeName = (value != null) ? 
value.getClass().getTypeName() : "NULL";
 
                     return Arguments.of(jdbcType, value, javaTypeName);
                 });
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
index d19cfd1bf2..84a994aeab 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
@@ -186,11 +186,8 @@ public class ItCommonApiTest extends 
ClusterPerClassIntegrationTest {
         TxManager txManagerInternal =
                 (TxManager) 
IgniteTestUtils.getFieldValue(CLUSTER_NODES.get(0), IgniteImpl.class, 
"txManager");
 
-        SqlQueryProcessor queryProc =
-                (SqlQueryProcessor) 
IgniteTestUtils.getFieldValue(CLUSTER_NODES.get(0), IgniteImpl.class, 
"qryEngine");
-
         SqlSchemaManager oldManager =
-                (SqlSchemaManager) IgniteTestUtils.getFieldValue(queryProc, 
SqlQueryProcessor.class, "sqlSchemaManager");
+                (SqlSchemaManager) 
IgniteTestUtils.getFieldValue(queryProcessor(), SqlQueryProcessor.class, 
"sqlSchemaManager");
 
         int txPrevCnt = txManagerInternal.finished();
 
@@ -219,7 +216,7 @@ public class ItCommonApiTest extends 
ClusterPerClassIntegrationTest {
         var schemaManager = new ErroneousSchemaManager();
 
         // TODO: refactor after 
https://issues.apache.org/jira/browse/IGNITE-17694
-        IgniteTestUtils.setFieldValue(queryProc, "sqlSchemaManager", 
schemaManager);
+        IgniteTestUtils.setFieldValue(queryProcessor(), "sqlSchemaManager", 
schemaManager);
 
         try {
             sql("SELECT a FROM NOTEXIST.TEST");
@@ -236,7 +233,7 @@ public class ItCommonApiTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(4, txManagerInternal.finished() - txPrevCnt);
         assertEquals(0, txManagerInternal.pending());
 
-        IgniteTestUtils.setFieldValue(queryProc, "sqlSchemaManager", 
oldManager);
+        IgniteTestUtils.setFieldValue(queryProcessor(), "sqlSchemaManager", 
oldManager);
     }
 
     private static class ErroneousSchemaManager implements SqlSchemaManager {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
index adb6be9f34..4d54c7911d 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
@@ -32,7 +32,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.type.SqlTypeUtil;
 import org.apache.ignite.internal.sql.engine.util.Commons;
@@ -126,7 +125,7 @@ public class ItDataTypesTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(Set.of(101), rows.stream().map(r -> 
r.get(0)).collect(Collectors.toSet()));
 
         //todo: correct exception 
https://issues.apache.org/jira/browse/IGNITE-16095
-        assertThrows(CalciteContextException.class, () -> sql("INSERT INTO 
tbl(c1, c2) VALUES (2, NULL)"));
+        assertThrows(IgniteException.class, () -> sql("INSERT INTO tbl(c1, c2) 
VALUES (2, NULL)"));
     }
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
index 47849caa6e..e4d8894503 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine;
 
+import static 
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.assertThrowsSqlException;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
@@ -27,12 +28,10 @@ import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
 import org.apache.ignite.lang.ErrorGroups.Sql;
 import org.apache.ignite.lang.IgniteException;
-import org.apache.ignite.sql.SqlException;
 import org.apache.ignite.tx.Transaction;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
@@ -74,11 +73,7 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
                 .returns(1)
                 .check();
 
-        {
-            SqlException ex = assertThrows(SqlException.class, () -> 
sql("INSERT INTO my VALUES (?, ?)", 0, 2));
-
-            assertEquals(ex.code(), Sql.DUPLICATE_KEYS_ERR);
-        }
+        assertThrowsSqlException(Sql.DUPLICATE_KEYS_ERR, () -> sql("INSERT 
INTO my VALUES (?, ?)", 0, 2));
 
         assertQuery("DELETE FROM my WHERE id=?")
                 .withParams(0)
@@ -94,11 +89,7 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
                 .returns(2)
                 .check();
 
-        {
-            SqlException ex = assertThrows(SqlException.class, () -> 
sql("INSERT INTO my VALUES (?, ?)", 0, 3));
-
-            assertEquals(ex.code(), Sql.DUPLICATE_KEYS_ERR);
-        }
+        assertThrowsSqlException(Sql.DUPLICATE_KEYS_ERR, () -> sql("INSERT 
INTO my VALUES (?, ?)", 0, 3));
     }
 
     @Test
@@ -111,7 +102,7 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
                 + "WHEN MATCHED THEN UPDATE SET b = src.b, k1 = src.k1 "
                 + "WHEN NOT MATCHED THEN INSERT (k1, k2, a, b) VALUES (src.k1, 
src.k2, src.a, src.b)";
 
-        assertThrows(CalciteContextException.class, () -> sql(sql));
+        assertThrows(IgniteException.class, () -> sql(sql));
     }
 
     @Test
@@ -124,13 +115,11 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
                 .returns(1L)
                 .check();
 
-        var sqlException = assertThrows(
-                SqlException.class,
+        assertThrowsSqlException(
+                Sql.DUPLICATE_KEYS_ERR,
                 () -> sql("INSERT INTO test VALUES (0, 0), (1, 1), (2, 2)")
         );
 
-        assertEquals(Sql.DUPLICATE_KEYS_ERR, sqlException.code());
-
         assertQuery("SELECT count(*) FROM test")
                 .returns(1L)
                 .check();
@@ -174,13 +163,11 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
                 .map(Object::toString)
                 .collect(Collectors.joining("), (", "(", ")"));
 
-        SqlException sqlException = assertThrows(
-                SqlException.class,
+        assertThrowsSqlException(
+                Sql.DUPLICATE_KEYS_ERR,
                 () -> sql(insertStatement)
         );
 
-        assertEquals(Sql.DUPLICATE_KEYS_ERR, sqlException.code());
-
         assertQuery("SELECT count(*) FROM test")
                 .returns(0L)
                 .check();
@@ -343,11 +330,11 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
         assertQuery("SELECT * FROM test2").returns(1, 0, 0, "0").check();
 
         // Target table alias duplicate source table name.
-        assertThrows(CalciteContextException.class, () -> sql("MERGE INTO 
test2 test1 USING test1 ON c = e "
+        assertThrows(IgniteException.class, () -> sql("MERGE INTO test2 test1 
USING test1 ON c = e "
                 + "WHEN MATCHED THEN UPDATE SET d = b + 1"), "Duplicate 
relation name");
 
         // Source table alias duplicate target table name.
-        assertThrows(CalciteContextException.class, () -> sql("MERGE INTO 
test2 USING test1 test2 ON c = e "
+        assertThrows(IgniteException.class, () -> sql("MERGE INTO test2 USING 
test1 test2 ON c = e "
                 + "WHEN MATCHED THEN UPDATE SET d = b + 1"), "Duplicate 
relation name");
 
         // Without aliases, reference columns by table name.
@@ -357,11 +344,11 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
         assertQuery("SELECT * FROM test2").returns(1, 1, 0, "0").check();
 
         // Ambiguous column name in condition.
-        assertThrows(CalciteContextException.class, () -> sql("MERGE INTO 
test2 USING test1 ON a = test1.a "
+        assertThrows(IgniteException.class, () -> sql("MERGE INTO test2 USING 
test1 ON a = test1.a "
                 + "WHEN MATCHED THEN UPDATE SET a = test1.a + 1"), "Column 'A' 
is ambiguous");
 
         // Ambiguous column name in update statement.
-        assertThrows(CalciteContextException.class, () -> sql("MERGE INTO 
test2 USING test1 ON c = e "
+        assertThrows(IgniteException.class, () -> sql("MERGE INTO test2 USING 
test1 ON c = e "
                 + "WHEN MATCHED THEN UPDATE SET a = a + 1"), "Column 'A' is 
ambiguous");
 
         // With aliases, reference columns by table alias.
@@ -384,12 +371,10 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
 
         sql("CREATE TABLE test2 (k int PRIMARY KEY, a int, b int)");
 
-        IgniteException ex = assertThrows(IgniteException.class, () -> sql(
-                        "MERGE INTO test2 USING test1 ON test1.a = test2.a "
-                                + "WHEN MATCHED THEN UPDATE SET b = test1.b + 
1 "
-                                + "WHEN NOT MATCHED THEN INSERT (k, a, b) 
VALUES (0, a, b)"));
-
-        assertEquals(Sql.DUPLICATE_KEYS_ERR, ex.code());
+        assertThrowsSqlException(Sql.DUPLICATE_KEYS_ERR, () -> sql(
+                "MERGE INTO test2 USING test1 ON test1.a = test2.a "
+                        + "WHEN MATCHED THEN UPDATE SET b = test1.b + 1 "
+                        + "WHEN NOT MATCHED THEN INSERT (k, a, b) VALUES (0, 
a, b)"));
     }
 
     /**
@@ -537,7 +522,7 @@ public class ItDmlTest extends 
ClusterPerClassIntegrationTest {
     public void testCheckNullValueErrorMessageForColumnWithDefaultValue() {
         sql("CREATE TABLE tbl(key int DEFAULT 9 primary key, val varchar)");
 
-        var e = assertThrows(CalciteContextException.class,
+        var e = assertThrows(IgniteException.class,
                 () -> sql("INSERT INTO tbl (key, val) VALUES (NULL,'AA')"));
 
         var expectedMessage = "From line 1, column 28 to line 1, column 45: 
Column 'KEY' does not allow NULLs";
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
index 3058d7f581..7b28998f8c 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDynamicParameterTest.java
@@ -29,13 +29,13 @@ import java.time.LocalDate;
 import java.util.List;
 import java.util.stream.Stream;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.MetadataMatcher;
-import org.apache.ignite.internal.sql.util.SqlTestUtils;
+import org.apache.ignite.internal.sql.engine.util.SqlTestUtils;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.sql.ColumnType;
 import org.apache.ignite.sql.SqlException;
 import org.junit.jupiter.api.AfterEach;
@@ -159,8 +159,8 @@ public class ItDynamicParameterTest extends 
ClusterPerClassIntegrationTest {
      */
     @Test
     public void testWithDifferentParametersTypesMismatch() {
-        assertThrows(CalciteContextException.class, () -> assertQuery("SELECT 
COALESCE(12.2, ?)").withParams("b").check());
-        assertThrows(CalciteContextException.class, () -> assertQuery("SELECT 
COALESCE(?, ?)").withParams(12.2, "b").check());
+        assertThrows(IgniteException.class, () -> assertQuery("SELECT 
COALESCE(12.2, ?)").withParams("b").check());
+        assertThrows(IgniteException.class, () -> assertQuery("SELECT 
COALESCE(?, ?)").withParams(12.2, "b").check());
     }
 
     @Test
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index 0a134e139c..e57be49b74 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -31,7 +31,6 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.Temporal;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.validate.SqlValidatorException;
 import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.api.Test;
@@ -300,7 +299,7 @@ public class ItFunctionsTest extends 
ClusterPerClassIntegrationTest {
 
         assertThrowsWithCause(() -> sql("SELECT TYPEOF(1, 2)"), 
SqlValidatorException.class, "Invalid number of arguments");
 
-        assertThrowsWithCause(() -> sql("SELECT TYPEOF(SELECT 1, 2)"), 
CalciteContextException.class);
+        assertThrowsWithCause(() -> sql("SELECT TYPEOF(SELECT 1, 2)"), 
IgniteException.class);
     }
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
index 9597b5578f..9ec89d3306 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.UUID;
 import java.util.stream.Stream;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.type.SqlTypeUtil;
 import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
@@ -34,6 +33,7 @@ import 
org.apache.ignite.internal.sql.engine.type.IgniteCustomTypeCoercionRules;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.sql.engine.type.UuidType;
 import org.apache.ignite.internal.sql.engine.util.Commons;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.tx.Transaction;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -155,7 +155,7 @@ public class ItImplicitCastsTest extends 
ClusterPerClassIntegrationTest {
      */
     @Test
     public void expressionWithMixedParametersIsIllegal() {
-        assertThrows(CalciteContextException.class, () -> assertQuery("SELECT 
COALESCE(12.2, 'b')").check());
+        assertThrows(IgniteException.class, () -> assertQuery("SELECT 
COALESCE(12.2, 'b')").check());
     }
 
     private static Stream<ColumnPair> columnPairs() {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
index 84fdad78ff..b5b51f2aba 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIntervalTest.java
@@ -27,7 +27,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.Period;
-import org.apache.calcite.runtime.CalciteContextException;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -62,7 +62,7 @@ public class ItIntervalTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(Duration.ofSeconds(3723), eval("INTERVAL '1:2:3' HOUR TO 
SECOND"));
         assertEquals(Duration.ofMillis(3723456), eval("INTERVAL '0 1:2:3.456' 
DAY TO SECOND"));
 
-        assertThrowsEx("SELECT INTERVAL '123' SECONDS", 
CalciteContextException.class, "exceeds precision");
+        assertThrowsEx("SELECT INTERVAL '123' SECONDS", IgniteException.class, 
"exceeds precision");
     }
 
     /**
@@ -91,11 +91,11 @@ public class ItIntervalTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(Period.ofYears(6), eval("CAST(6 AS INTERVAL YEARS)"));
 
         // Compound interval types cannot be cast.
-        assertThrowsEx("SELECT CAST(INTERVAL '1-2' YEAR TO MONTH AS INT)", 
CalciteContextException.class, "cannot convert");
-        assertThrowsEx("SELECT CAST(INTERVAL '1 2' DAY TO HOUR AS INT)", 
CalciteContextException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(INTERVAL '1-2' YEAR TO MONTH AS INT)", 
IgniteException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(INTERVAL '1 2' DAY TO HOUR AS INT)", 
IgniteException.class, "cannot convert");
 
-        assertThrowsEx("SELECT CAST(1 AS INTERVAL YEAR TO MONTH)", 
CalciteContextException.class, "cannot convert");
-        assertThrowsEx("SELECT CAST(1 AS INTERVAL DAY TO HOUR)", 
CalciteContextException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(1 AS INTERVAL YEAR TO MONTH)", 
IgniteException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(1 AS INTERVAL DAY TO HOUR)", 
IgniteException.class, "cannot convert");
     }
 
     /**
@@ -145,8 +145,8 @@ public class ItIntervalTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(Period.ofYears(1), eval("CAST(INTERVAL 12 MONTHS AS 
INTERVAL YEARS)"));
 
         // Cannot convert between month-year and day-time interval types.
-        assertThrowsEx("SELECT CAST(INTERVAL 1 MONTHS AS INTERVAL DAYS)", 
CalciteContextException.class, "cannot convert");
-        assertThrowsEx("SELECT CAST(INTERVAL 1 DAYS AS INTERVAL MONTHS)", 
CalciteContextException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(INTERVAL 1 MONTHS AS INTERVAL DAYS)", 
IgniteException.class, "cannot convert");
+        assertThrowsEx("SELECT CAST(INTERVAL 1 DAYS AS INTERVAL MONTHS)", 
IgniteException.class, "cannot convert");
     }
 
     /**
@@ -313,7 +313,7 @@ public class ItIntervalTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(Period.of(1, 1, 0), eval("INTERVAL 1 YEAR + INTERVAL 1 
MONTH"));
         assertEquals(Period.ofMonths(11), eval("INTERVAL 1 YEAR - INTERVAL 1 
MONTH"));
         assertEquals(Period.ofMonths(11), eval("INTERVAL 1 YEAR + INTERVAL -1 
MONTH"));
-        assertThrowsEx("SELECT INTERVAL 1 DAY + INTERVAL 1 MONTH", 
CalciteContextException.class, "Cannot apply");
+        assertThrowsEx("SELECT INTERVAL 1 DAY + INTERVAL 1 MONTH", 
IgniteException.class, "Cannot apply");
 
         // Interval * scalar.
         assertEquals(Duration.ofSeconds(2), eval("INTERVAL 1 SECONDS * 2"));
@@ -372,8 +372,8 @@ public class ItIntervalTest extends 
ClusterPerClassIntegrationTest {
         assertEquals(-4L, eval("EXTRACT(SECOND FROM INTERVAL '-1 2:3:4.567' 
DAY TO SECOND)"));
         assertEquals(-4567L, eval("EXTRACT(MILLISECOND FROM INTERVAL '-1 
2:3:4.567' DAY TO SECOND)"));
 
-        assertThrowsEx("SELECT EXTRACT(DAY FROM INTERVAL 1 MONTH)", 
CalciteContextException.class, "Cannot apply");
-        assertThrowsEx("SELECT EXTRACT(MONTH FROM INTERVAL 1 DAY)", 
CalciteContextException.class, "Cannot apply");
+        assertThrowsEx("SELECT EXTRACT(DAY FROM INTERVAL 1 MONTH)", 
IgniteException.class, "Cannot apply");
+        assertThrowsEx("SELECT EXTRACT(MONTH FROM INTERVAL 1 DAY)", 
IgniteException.class, "Cannot apply");
     }
 
     /**
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
index 01a3bafec9..79a61a5f57 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
@@ -23,7 +23,7 @@ import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.stream.Stream;
-import org.apache.calcite.runtime.CalciteContextException;
+import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -48,7 +48,7 @@ public abstract class BaseDmlDataTypeTest<T extends 
Comparable<T>> extends BaseD
     @ParameterizedTest
     @MethodSource("convertedFrom")
     public void 
testInsertFromDynamicParameterFromConvertible(TestTypeArguments<T> arguments) {
-        var t = assertThrows(CalciteContextException.class, () -> {
+        var t = assertThrows(IgniteException.class, () -> {
             runSql("INSERT INTO t VALUES (1, ?)", arguments.argValue(0));
         });
 
@@ -107,7 +107,7 @@ public abstract class BaseDmlDataTypeTest<T extends 
Comparable<T>> extends BaseD
         String insert = format("INSERT INTO t VALUES (1, {})", 
arguments.valueExpr(0));
         runSql(insert);
 
-        var t = assertThrows(CalciteContextException.class, () -> {
+        var t = assertThrows(IgniteException.class, () -> {
             checkQuery("UPDATE t SET test_key = ? WHERE id=1")
                     .withParams(arguments.argValue(0))
                     .returns(1L)
@@ -125,7 +125,7 @@ public abstract class BaseDmlDataTypeTest<T extends 
Comparable<T>> extends BaseD
     @MethodSource("convertedFrom")
     public void testDisallowMismatchTypesOnInsert(TestTypeArguments<T> 
arguments) {
         var query = format("INSERT INTO t (id, test_key) VALUES (10, null), 
(20, {})", arguments.valueExpr(0));
-        var t = assertThrows(CalciteContextException.class, () -> 
runSql(query));
+        var t = assertThrows(IgniteException.class, () -> runSql(query));
 
         assertThat(t.getMessage(), containsString("Values passed to VALUES 
operator must have compatible types"));
     }
@@ -139,7 +139,7 @@ public abstract class BaseDmlDataTypeTest<T extends 
Comparable<T>> extends BaseD
         Object value1 = arguments.argValue(0);
 
         var query = "INSERT INTO t (id, test_key) VALUES (1, null), (2, ?)";
-        var t = assertThrows(CalciteContextException.class, () -> 
runSql(query, value1));
+        var t = assertThrows(IgniteException.class, () -> runSql(query, 
value1));
         assertThat(t.getMessage(), containsString("Values passed to VALUES 
operator must have compatible types"));
     }
 
@@ -152,7 +152,7 @@ public abstract class BaseDmlDataTypeTest<T extends 
Comparable<T>> extends BaseD
         Object value1 = arguments.argValue(0);
 
         var query = "INSERT INTO t (id, test_key) VALUES (1, 'str'), (2, ?)";
-        var t = assertThrows(CalciteContextException.class, () -> 
runSql(query, value1));
+        var t = assertThrows(IgniteException.class, () -> runSql(query, 
value1));
         assertThat(t.getMessage(), containsString("Values passed to VALUES 
operator must have compatible types"));
     }
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseExpressionDataTypeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseExpressionDataTypeTest.java
index 52b6474320..60adb2705d 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseExpressionDataTypeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseExpressionDataTypeTest.java
@@ -24,9 +24,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Objects;
 import java.util.stream.Stream;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.ignite.internal.sql.engine.util.MetadataMatcher;
 import org.apache.ignite.internal.sql.engine.util.QueryChecker;
+import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -127,7 +127,7 @@ public abstract class BaseExpressionDataTypeTest<T extends 
Comparable<T>> extend
     @ParameterizedTest
     @MethodSource("convertedFrom")
     public void testCoalesceMissingTypesIsIllegal(TestTypeArguments arguments) 
{
-        CalciteContextException t = 
assertThrows(CalciteContextException.class, () -> {
+        IgniteException t = assertThrows(IgniteException.class, () -> {
             checkQuery(format("SELECT COALESCE($0, {})", 
arguments.valueExpr(0))).check();
         });
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
index 17cb89ab93..4e1a5162a7 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
@@ -23,7 +23,7 @@ import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.stream.Stream;
-import org.apache.calcite.runtime.CalciteContextException;
+import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -107,7 +107,7 @@ public abstract class BaseQueryDataTypeTest<T extends 
Comparable<T>> extends Bas
 
         runSql("INSERT INTO t VALUES(1, ?)", value1);
 
-        var err = assertThrows(CalciteContextException.class, () -> {
+        var err = assertThrows(IgniteException.class, () -> {
             checkQuery("SELECT id FROM t where test_key = ? ORDER BY id")
                     .withParams(arguments.argValue(0))
                     .returns(1)
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
index 10bd70b984..6ed097f2f2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
@@ -23,11 +23,11 @@ import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.UUID;
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.ignite.internal.sql.engine.datatypes.DataTypeTestSpecs;
 import 
org.apache.ignite.internal.sql.engine.datatypes.tests.BaseQueryDataTypeTest;
 import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
 import org.apache.ignite.internal.sql.engine.type.UuidType;
+import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
@@ -44,7 +44,7 @@ public class ItUuidQueryTest extends 
BaseQueryDataTypeTest<UUID> {
     public void testInvalidComparisonOperation(String opSql) {
         String query = format("SELECT * FROM t WHERE test_key {} 1", opSql);
 
-        CalciteContextException t = 
assertThrows(CalciteContextException.class, () -> checkQuery(query).check());
+        IgniteException t = assertThrows(IgniteException.class, () -> 
checkQuery(query).check());
         String error = format("Cannot apply '{}'", opSql);
         assertThat(t.getMessage(), containsString(error));
     }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryQueryTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryQueryTest.java
index 4080694803..34e012b6a1 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryQueryTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryQueryTest.java
@@ -23,12 +23,12 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.ignite.internal.sql.engine.datatypes.DataTypeTestSpecs;
 import 
org.apache.ignite.internal.sql.engine.datatypes.tests.BaseQueryDataTypeTest;
 import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
 import org.apache.ignite.internal.sql.engine.util.VarBinary;
+import org.apache.ignite.lang.IgniteException;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
@@ -45,7 +45,7 @@ public class ItVarBinaryQueryTest extends 
BaseQueryDataTypeTest<VarBinary> {
     public void testInvalidComparisonOperation(String opSql) {
         String query = format("SELECT * FROM t WHERE test_key {} 1", opSql);
 
-        CalciteContextException t = 
assertThrows(CalciteContextException.class, () -> checkQuery(query).check());
+        IgniteException t = assertThrows(IgniteException.class, () -> 
checkQuery(query).check());
         String error = format("Cannot apply '{}'", opSql);
         assertThat(t.getMessage(), containsString(error));
     }
diff --git a/modules/sql-engine/build.gradle b/modules/sql-engine/build.gradle
index 6d11817373..b8c6352a83 100644
--- a/modules/sql-engine/build.gradle
+++ b/modules/sql-engine/build.gradle
@@ -86,6 +86,7 @@ dependencies {
     testImplementation libs.archunit.core
     testImplementation libs.archunit.junit5
 
+    testFixturesImplementation project(':ignite-core')
     testFixturesImplementation project(':ignite-api')
     testFixturesImplementation project(':ignite-schema')
     testFixturesImplementation libs.jetbrains.annotations
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionBuilderImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionBuilderImpl.java
index c1de8e84c4..042088cde5 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionBuilderImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionBuilderImpl.java
@@ -145,7 +145,6 @@ public class SessionBuilderImpl implements SessionBuilder {
                 sessionId,
                 qryProc,
                 pageSize,
-                sessionTimeout,
                 propsHolder
         );
     }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
index 134fdf472f..e05f48423c 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
@@ -44,6 +44,7 @@ import org.apache.ignite.internal.sql.engine.SqlQueryType;
 import org.apache.ignite.internal.sql.engine.property.PropertiesHolder;
 import org.apache.ignite.internal.sql.engine.property.Property;
 import org.apache.ignite.internal.sql.engine.session.SessionId;
+import org.apache.ignite.internal.sql.engine.session.SessionProperty;
 import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.internal.util.ExceptionUtils;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
@@ -75,8 +76,6 @@ public class SessionImpl implements Session {
 
     private final int pageSize;
 
-    private final long sessionTimeout;
-
     private final PropertiesHolder props;
 
     /**
@@ -84,20 +83,17 @@ public class SessionImpl implements Session {
      *
      * @param qryProc Query processor.
      * @param pageSize Query fetch page size.
-     * @param sessionTimeoutMs Session timeout in milliseconds.
      * @param props Session's properties.
      */
     SessionImpl(
             SessionId sessionId,
             QueryProcessor qryProc,
             int pageSize,
-            long sessionTimeoutMs,
             PropertiesHolder props
     ) {
         this.qryProc = qryProc;
         this.sessionId = sessionId;
         this.pageSize = pageSize;
-        this.sessionTimeout = sessionTimeoutMs;
         this.props = props;
     }
 
@@ -122,7 +118,7 @@ public class SessionImpl implements Session {
     /** {@inheritDoc} */
     @Override
     public long idleTimeout(TimeUnit timeUnit) {
-        return timeUnit.convert(sessionTimeout, TimeUnit.MILLISECONDS);
+        return timeUnit.convert(props.get(SessionProperty.IDLE_TIMEOUT), 
TimeUnit.MILLISECONDS);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
index 9b56c73757..da300e257e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
@@ -107,9 +107,6 @@ import org.jetbrains.annotations.Nullable;
 public class SqlQueryProcessor implements QueryProcessor {
     private static final IgniteLogger LOG = 
Loggers.forClass(SqlQueryProcessor.class);
 
-    /** Default planner timeout, in ms. */
-    private static final long PLANNER_TIMEOUT = 15000L;
-
     /** Size of the cache for query plans. */
     private static final int PLAN_CACHE_SIZE = 1024;
 
@@ -449,7 +446,6 @@ public class SqlQueryProcessor implements QueryProcessor {
                             .logger(LOG)
                             .cancel(queryCancel)
                             .parameters(params)
-                            .plannerTimeout(PLANNER_TIMEOUT)
                             .build();
 
                     return prepareSvc.prepareAsync(result, ctx)
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgnitePlanner.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgnitePlanner.java
index 2061f268b9..faa5c9cb50 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgnitePlanner.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgnitePlanner.java
@@ -75,6 +75,8 @@ import org.apache.calcite.tools.Planner;
 import org.apache.calcite.tools.Program;
 import org.apache.calcite.tools.RuleSets;
 import org.apache.calcite.util.Pair;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.sql.engine.metadata.IgniteMetadata;
 import org.apache.ignite.internal.sql.engine.metadata.RelMetadataQueryEx;
 import org.apache.ignite.internal.sql.engine.rex.IgniteRexBuilder;
@@ -538,6 +540,8 @@ public class IgnitePlanner implements Planner, 
RelOptTable.ViewExpander {
     }
 
     private static class VolcanoPlannerExt extends VolcanoPlanner {
+        private static final IgniteLogger LOG = 
Loggers.forClass(IgnitePlanner.class);
+
         protected VolcanoPlannerExt(RelOptCostFactory costFactory, Context 
externalCtx) {
             super(costFactory, externalCtx);
             setTopDownOpt(true);
@@ -560,6 +564,11 @@ public class IgnitePlanner implements Planner, 
RelOptTable.ViewExpander {
                 long startTs = ctx.startTs();
 
                 if (FastTimestamps.coarseCurrentTimeMillis() - startTs > 
timeout) {
+                    LOG.debug("Planning of a query aborted due to planner 
timeout threshold is reached [timeout={}, query={}]",
+                            timeout,
+                            ctx.query());
+
+                    ctx.abortByTimeout();
                     cancelFlag.set(true);
                 }
             }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlanningContext.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlanningContext.java
index 071d005b48..1a1b6b49a4 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlanningContext.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlanningContext.java
@@ -42,19 +42,24 @@ public final class PlanningContext implements Context {
 
     private final String qry;
 
+    /** CancelFlag is used to post and check cancellation requests. */
     private final CancelFlag cancelFlag = new CancelFlag(new AtomicBoolean());
 
+    /** Rules which should be excluded for planning. */
     private Function<RuleSet, RuleSet> rulesFilter;
 
     private IgnitePlanner planner;
 
+    /** Start planning timestamp in millis. */
     private final long startTs;
 
+    /** The maximum possible planning time. If this time is exceeded, the 
planning will be cancelled. */
     private final long plannerTimeout;
 
-    /**
-     * Private constructor, used by a builder.
-     */
+    /** Flag indicated if planning has been canceled due to timeout. */
+    private boolean timeouted = false;
+
+    /** Private constructor, used by a builder. */
     private PlanningContext(
             Context parentCtx,
             String qry,
@@ -67,60 +72,44 @@ public final class PlanningContext implements Context {
         this.plannerTimeout = plannerTimeout;
     }
 
-    /**
-     * Get framework config.
-     */
+    /** Get framework config. */
     public FrameworkConfig config() {
         return unwrap(BaseQueryContext.class).config();
     }
 
-    /**
-     * Get query.
-     */
+    /** Get query. */
     public String query() {
         return qry;
     }
 
-    /**
-     * Get query parameters.
-     */
+    /** Get query parameters. */
     public Object[] parameters() {
         return unwrap(BaseQueryContext.class).parameters();
     }
 
     // Helper methods
 
-    /**
-     * Get sql operators table.
-     */
+    /**  Get sql operators table. */
     public SqlOperatorTable opTable() {
         return config().getOperatorTable();
     }
 
-    /**
-     * Get sql conformance.
-     */
+    /** Get sql conformance. */
     public SqlConformance conformance() {
         return config().getParserConfig().conformance();
     }
 
-    /**
-     * Get start planning timestamp in millis.
-     */
+    /** Get start planning timestamp in millis. */
     public long startTs() {
         return startTs;
     }
 
-    /**
-     * Get planning timeout in millis.
-     */
+    /** Get planning timeout in millis. */
     public long plannerTimeout() {
         return plannerTimeout;
     }
 
-    /**
-     * Get planner.
-     */
+    /** Get planner. */
     public IgnitePlanner planner() {
         if (planner == null) {
             planner = new IgnitePlanner(this);
@@ -129,37 +118,27 @@ public final class PlanningContext implements Context {
         return planner;
     }
 
-    /**
-     * Get schema name.
-     */
+    /** Get schema name. */
     public String schemaName() {
         return schema().getName();
     }
 
-    /**
-     * Get schema.
-     */
+    /** Get schema. */
     public SchemaPlus schema() {
         return config().getDefaultSchema();
     }
 
-    /**
-     * Get type factory.
-     */
+    /** Get type factory. */
     public IgniteTypeFactory typeFactory() {
         return unwrap(BaseQueryContext.class).typeFactory();
     }
 
-    /**
-     * Get new catalog reader.
-     */
+    /** Get new catalog reader. */
     public CalciteCatalogReader catalogReader() {
         return unwrap(BaseQueryContext.class).catalogReader();
     }
 
-    /**
-     * Get cluster based on a planner and its configuration.
-     */
+    /** Get cluster based on a planner and its configuration. */
     public RelOptCluster cluster() {
         return planner().cluster();
     }
@@ -178,24 +157,31 @@ public final class PlanningContext implements Context {
         return parentCtx.unwrap(clazz);
     }
 
-    /**
-     * Get context builder.
-     */
+    /** Get context builder. */
     public static Builder builder() {
         return new Builder();
     }
 
+    /** Get rules filer. */
     public RuleSet rules(RuleSet set) {
         return rulesFilter != null ? rulesFilter.apply(set) : set;
     }
 
-    /**
-     * Set rules filter.
-     */
+    /** Set rules filter. */
     public void rulesFilter(Function<RuleSet, RuleSet> rulesFilter) {
         this.rulesFilter = rulesFilter;
     }
 
+    /** Set a flag indicating that the planning was canceled due to a timeout. 
*/
+    public void abortByTimeout() {
+        timeouted = true;
+    }
+
+    /** Returns a flag indicates if planning has been canceled due to timeout. 
*/
+    public boolean timeouted() {
+        return timeouted;
+    }
+
     /**
      * Planner context builder.
      */
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareService.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareService.java
index 907ef4c9a2..8c0de1a4b7 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareService.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareService.java
@@ -28,6 +28,11 @@ import 
org.apache.ignite.internal.sql.engine.util.BaseQueryContext;
 public interface PrepareService extends LifecycleAware {
     /**
      * Prepare query plan.
+     *
+     * @param parsedResult Represent of parsed query as AST, which need to be 
planned.
+     * @param ctx Query context.
+     *
+     * @return Future that contains prepared query plan when completes.
      */
     CompletableFuture<QueryPlan> prepareAsync(ParsedResult parsedResult, 
BaseQueryContext ctx);
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
index b3992f0076..65d39af6d4 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
@@ -32,6 +32,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeField;
@@ -53,9 +54,13 @@ import 
org.apache.ignite.internal.sql.engine.util.BaseQueryContext;
 import org.apache.ignite.internal.sql.engine.util.TypeUtils;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
+import org.apache.ignite.internal.util.ExceptionUtils;
+import org.apache.ignite.lang.ErrorGroups;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.sql.ColumnMetadata;
 import org.apache.ignite.sql.ResultSetMetadata;
+import org.apache.ignite.sql.SqlException;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -64,6 +69,9 @@ import org.jetbrains.annotations.Nullable;
 public class PrepareServiceImpl implements PrepareService, 
SchemaUpdateListener {
     private static final IgniteLogger LOG = 
Loggers.forClass(PrepareServiceImpl.class);
 
+    /** Default planner timeout, in ms. */
+    public static final long DEFAULT_PLANNER_TIMEOUT = 15000L;
+
     private static final long THREAD_TIMEOUT_MS = 60_000;
 
     private static final int THREAD_COUNT = 4;
@@ -76,6 +84,8 @@ public class PrepareServiceImpl implements PrepareService, 
SchemaUpdateListener
 
     private volatile ThreadPoolExecutor planningPool;
 
+    private final long plannerTimeout;
+
     /**
      * Factory method.
      *
@@ -93,7 +103,8 @@ public class PrepareServiceImpl implements PrepareService, 
SchemaUpdateListener
         return new PrepareServiceImpl(
                 nodeName,
                 cacheSize,
-                new DdlSqlToCommandConverter(dataStorageFields, 
dataStorageManager::defaultDataStorage)
+                new DdlSqlToCommandConverter(dataStorageFields, 
dataStorageManager::defaultDataStorage),
+                DEFAULT_PLANNER_TIMEOUT
         );
     }
 
@@ -103,14 +114,17 @@ public class PrepareServiceImpl implements 
PrepareService, SchemaUpdateListener
      * @param nodeName Name of the current Ignite node. Will be used in thread 
factory as part of the thread name.
      * @param cacheSize Size of the cache of query plans. Should be non 
negative.
      * @param ddlConverter A converter of the DDL-related AST to the actual 
command.
+     * @param plannerTimeout Timeout in milliseconds to planning.
      */
     public PrepareServiceImpl(
             String nodeName,
             int cacheSize,
-            DdlSqlToCommandConverter ddlConverter
+            DdlSqlToCommandConverter ddlConverter,
+            long plannerTimeout
     ) {
         this.nodeName = nodeName;
         this.ddlConverter = ddlConverter;
+        this.plannerTimeout = plannerTimeout;
 
         cache = Caffeine.newBuilder()
                 .maximumSize(cacheSize)
@@ -142,24 +156,38 @@ public class PrepareServiceImpl implements 
PrepareService, SchemaUpdateListener
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<QueryPlan> prepareAsync(ParsedResult 
parsedResult, BaseQueryContext ctx) {
-        try {
-            PlanningContext planningContext = PlanningContext.builder()
-                    .parentContext(ctx)
-                    .build();
+        CompletableFuture<QueryPlan> result;
+
+        PlanningContext planningContext = PlanningContext.builder()
+                .parentContext(ctx)
+                .query(parsedResult.originalQuery())
+                .plannerTimeout(plannerTimeout)
+                .build();
+
+        result = prepareAsync0(parsedResult, planningContext);
+
+        return result.exceptionally(ex -> {
+                    Throwable th = ExceptionUtils.unwrapCause(ex);
+                    if (planningContext.timeouted() && th instanceof 
RelOptPlanner.CannotPlanException) {
+                        throw new 
SqlException(ErrorGroups.Sql.PLANNING_TIMEOUTED_ERR);
+                    }
+
+                    throw new IgniteException(th);
+                }
+        );
+    }
 
+    private CompletableFuture<QueryPlan> prepareAsync0(ParsedResult 
parsedResult, PlanningContext planningContext) {
+        try {
             switch (parsedResult.queryType()) {
                 case QUERY:
                     return prepareQuery(parsedResult, planningContext);
-
                 case DDL:
                     return prepareDdl(parsedResult, planningContext);
-
                 case DML:
                     return prepareDml(parsedResult, planningContext);
-
                 case EXPLAIN:
                     return prepareExplain(parsedResult, planningContext);
-
                 default:
                     throw new AssertionError("Unexpected queryType=" + 
parsedResult.queryType());
             }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
index c1e23788d6..c6a8cc0743 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
@@ -154,8 +154,6 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
 
     private CalciteCatalogReader catalogReader;
 
-    private final long plannerTimeout;
-
     /**
      * Private constructor, used by a builder.
      */
@@ -164,8 +162,7 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
             FrameworkConfig cfg,
             QueryCancel cancel,
             Object[] parameters,
-            IgniteLogger log,
-            long plannerTimeout
+            IgniteLogger log
     ) {
         super(Contexts.chain(cfg.getContext()));
 
@@ -176,7 +173,6 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
         this.log = log;
         this.cancel = cancel;
         this.parameters = parameters;
-        this.plannerTimeout = plannerTimeout;
 
         typeFactory = TYPE_FACTORY;
 
@@ -225,10 +221,6 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
         return rexBuilder;
     }
 
-    public long plannerTimeout() {
-        return plannerTimeout;
-    }
-
     public long schemaVersion() {
         return 
Objects.requireNonNull(schema().unwrap(IgniteSchema.class)).schemaVersion();
     }
@@ -293,8 +285,6 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
 
         private Object[] parameters = ArrayUtils.OBJECT_EMPTY_ARRAY;
 
-        private long plannerTimeout;
-
         public Builder frameworkConfig(FrameworkConfig frameworkCfg) {
             this.frameworkCfg = Objects.requireNonNull(frameworkCfg);
             return this;
@@ -320,14 +310,8 @@ public final class BaseQueryContext extends 
AbstractQueryContext {
             return this;
         }
 
-        public Builder plannerTimeout(long plannerTimeout) {
-            this.plannerTimeout = plannerTimeout;
-            return this;
-        }
-
         public BaseQueryContext build() {
-            return new BaseQueryContext(queryId, frameworkCfg, cancel, 
parameters,
-                    log, plannerTimeout);
+            return new BaseQueryContext(queryId, frameworkCfg, cancel, 
parameters, log);
         }
     }
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index e6ed94b63c..f96eed7c9c 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -126,6 +126,9 @@ public class ExecutionServiceImplTest {
     /** Timeout in ms for async operations. */
     private static final long TIMEOUT_IN_MS = 2_000;
 
+    /** Timeout in ms for SQL planning phase. */
+    public static final long PLANNING_TIMEOUT = 5_000;
+
     private static final int SCHEMA_VERSION = -1;
 
     private final List<String> nodeNames = List.of("node_1", "node_2", 
"node_3");
@@ -157,7 +160,7 @@ public class ExecutionServiceImplTest {
     public void init() {
         testCluster = new TestCluster();
         executionServices = 
nodeNames.stream().map(this::create).collect(Collectors.toList());
-        prepareService = new PrepareServiceImpl("test", 0, null);
+        prepareService = new PrepareServiceImpl("test", 0, null, 
PLANNING_TIMEOUT);
         parserService = new ParserServiceImpl(0, EmptyCacheFactory.INSTANCE);
 
         prepareService.start();
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestNode.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestNode.java
index 0ab72ec015..934d30d4c7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestNode.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestNode.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.framework;
 
+import static 
org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImplTest.PLANNING_TIMEOUT;
 import static 
org.apache.ignite.internal.sql.engine.util.Commons.FRAMEWORK_CONFIG;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -98,7 +99,7 @@ public class TestNode implements LifecycleAware {
             SqlSchemaManager schemaManager
     ) {
         this.nodeName = nodeName;
-        this.prepareService = registerService(new PrepareServiceImpl(nodeName, 
0, mock(DdlSqlToCommandConverter.class)));
+        this.prepareService = registerService(new PrepareServiceImpl(nodeName, 
0, mock(DdlSqlToCommandConverter.class), PLANNING_TIMEOUT));
         this.schema = schemaManager.schema("PUBLIC");
 
         TopologyService topologyService = clusterService.topologyService();
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTimeoutTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTimeoutTest.java
index 29b7b89abf..6abd10b48e 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTimeoutTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PlannerTimeoutTest.java
@@ -18,6 +18,8 @@
 package org.apache.ignite.internal.sql.engine.planner;
 
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
+import static org.apache.ignite.lang.ErrorGroups.Sql.PLANNING_TIMEOUTED_ERR;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -35,9 +37,17 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.ignite.internal.sql.engine.prepare.IgnitePlanner;
 import org.apache.ignite.internal.sql.engine.prepare.PlanningContext;
+import org.apache.ignite.internal.sql.engine.prepare.PrepareService;
+import org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl;
 import org.apache.ignite.internal.sql.engine.rel.IgniteConvention;
 import org.apache.ignite.internal.sql.engine.rel.IgniteRel;
 import org.apache.ignite.internal.sql.engine.schema.IgniteSchema;
+import org.apache.ignite.internal.sql.engine.sql.ParsedResult;
+import org.apache.ignite.internal.sql.engine.sql.ParserService;
+import org.apache.ignite.internal.sql.engine.sql.ParserServiceImpl;
+import org.apache.ignite.internal.sql.engine.util.BaseQueryContext;
+import org.apache.ignite.internal.sql.engine.util.EmptyCacheFactory;
+import org.apache.ignite.internal.sql.engine.util.SqlTestUtils;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Test;
 
@@ -45,10 +55,32 @@ import org.junit.jupiter.api.Test;
  * Test planner timeout.
  */
 public class PlannerTimeoutTest extends AbstractPlannerTest {
-    private static final long PLANNER_TIMEOUT = 500;
+
+    @Test
+    public void testPlannerTimeout() throws Exception {
+        long plannerTimeout = 1L;
+        IgniteSchema schema = createSchema(createTestTable("T1", "A", 
Integer.class, "B", Integer.class));
+        BaseQueryContext ctx = 
baseQueryContext(Collections.singletonList(schema), null);
+
+        PrepareService prepareService = new PrepareServiceImpl("test", 0, 
null, plannerTimeout);
+        prepareService.start();
+        try {
+            ParserService parserService = new ParserServiceImpl(0, 
EmptyCacheFactory.INSTANCE);
+
+            ParsedResult parsedResult = parserService.parse("SELECT * FROM T1 
t, T1 t1, T1 t2, T1 t3");
+
+            SqlTestUtils.assertThrowsSqlException(
+                    PLANNING_TIMEOUTED_ERR,
+                    () -> await(prepareService.prepareAsync(parsedResult, 
ctx)));
+        } finally {
+            prepareService.stop();
+        }
+    }
 
     @Test
     public void testLongPlanningTimeout() throws Exception {
+        final long plannerTimeout = 500;
+
         IgniteSchema schema = createSchema(
                 createTestTable("T1", "A", Integer.class, "B", Integer.class),
                 createTestTable("T2", "A", Integer.class, "B", Integer.class)
@@ -58,14 +90,14 @@ public class PlannerTimeoutTest extends AbstractPlannerTest 
{
 
         PlanningContext ctx = PlanningContext.builder()
                 
.parentContext(baseQueryContext(Collections.singletonList(schema), null))
-                .plannerTimeout(PLANNER_TIMEOUT)
+                .plannerTimeout(plannerTimeout)
                 .query(sql)
                 .build();
 
         AtomicReference<IgniteRel> plan = new AtomicReference<>();
         AtomicReference<RelOptPlanner.CannotPlanException> plannerError = new 
AtomicReference<>();
 
-        assertTimeoutPreemptively(Duration.ofMillis(10 * PLANNER_TIMEOUT), () 
-> {
+        assertTimeoutPreemptively(Duration.ofMillis(10 * plannerTimeout), () 
-> {
             try (IgnitePlanner planner = ctx.planner()) {
                 plan.set(physicalPlan(planner, ctx.query()));
 
diff --git 
a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/sql/util/SqlTestUtils.java
 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
similarity index 86%
rename from 
modules/runner/src/testFixtures/java/org/apache/ignite/internal/sql/util/SqlTestUtils.java
rename to 
modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
index 76aecbd34a..1808763a72 100644
--- 
a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/sql/util/SqlTestUtils.java
+++ 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
@@ -15,7 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.sql.util;
+package org.apache.ignite.internal.sql.engine.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -32,6 +35,8 @@ import java.util.concurrent.ThreadLocalRandom;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.ignite.internal.sql.engine.type.UuidType;
 import org.apache.ignite.sql.ColumnType;
+import org.apache.ignite.sql.SqlException;
+import org.junit.jupiter.api.function.Executable;
 
 /**
  * Test utils for SQL.
@@ -39,6 +44,22 @@ import org.apache.ignite.sql.ColumnType;
 public class SqlTestUtils {
     private static final ThreadLocalRandom RND = ThreadLocalRandom.current();
 
+
+    /**
+     * <em>Assert</em> that execution of the supplied {@code executable} throws
+     * an {@link SqlException} with expected error code and return the 
exception.
+     *
+     * @param expectedCode Expected error code of {@link SqlException}
+     * @param executable Supplier to execute and check thrown exception.
+     * @return Thrown the {@link SqlException}.
+     */
+    public static SqlException assertThrowsSqlException(int expectedCode, 
Executable executable) {
+        SqlException ex = assertThrows(SqlException.class, executable);
+        assertEquals(expectedCode, ex.code());
+
+        return ex;
+    }
+
     /**
      * Convert {@link ColumnType} to string representation of SQL type.
      *

Reply via email to