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.
*