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 3d41223c985 IGNITE-25091 Sql. Migrate to calcite's UUID (#5662)
3d41223c985 is described below
commit 3d41223c98531528e3a2d9bf3dd5341dd92de9ab
Author: korlov42 <[email protected]>
AuthorDate: Thu Apr 24 09:23:14 2025 +0300
IGNITE-25091 Sql. Migrate to calcite's UUID (#5662)
---
.../internal/sql/engine/ItImplicitCastsTest.java | 20 +--
.../sql/engine/datatypes/DataTypeTestSpecs.java | 11 +-
.../datatypes/tests/BaseDmlDataTypeTest.java | 11 ++
.../datatypes/tests/BaseQueryDataTypeTest.java | 11 ++
.../engine/datatypes/uuid/ItUuidAggregateTest.java | 4 +-
.../sql/engine/datatypes/uuid/ItUuidDmlTest.java | 4 +-
.../datatypes/uuid/ItUuidExpressionTest.java | 4 +-
.../sql/engine/datatypes/uuid/ItUuidIndexTest.java | 4 +-
.../sql/engine/datatypes/uuid/ItUuidJoinTest.java | 4 +-
.../sql/engine/datatypes/uuid/ItUuidQueryTest.java | 4 +-
.../sql/engine/datatypes/uuid/ItUuidSetOpTest.java | 4 +-
modules/sql-engine/src/main/codegen/config.fmpp | 2 +-
.../src/main/codegen/includes/parserImpls.ftl | 4 +-
.../sql/engine/exec/exp/ConverterUtils.java | 6 +
.../internal/sql/engine/exec/exp/RexImpTable.java | 5 +-
.../sql/engine/exec/exp/RexToLixTranslator.java | 11 ++
.../internal/sql/engine/externalize/RelJson.java | 8 +-
.../sql/engine/prepare/IgniteSqlValidator.java | 12 +-
.../sql/engine/prepare/IgniteTypeCoercion.java | 22 +++-
.../prepare/ddl/DdlSqlToCommandConverter.java | 47 ++++---
.../internal/sql/engine/rex/IgniteRexBuilder.java | 7 +
.../sql/engine/schema/TableDescriptorImpl.java | 14 --
.../sql/engine/sql/IgniteSqlColumnDeclaration.java | 144 ---------------------
.../internal/sql/engine/sql/IgniteSqlParser.java | 15 ---
.../sql/engine/sql/fun/IgniteSqlOperatorTable.java | 3 +-
.../sql/engine/type/IgniteTypeFactory.java | 92 +++++++------
.../ignite/internal/sql/engine/type/UuidType.java | 62 ---------
.../engine/util/IgniteCustomAssignmentsRules.java | 5 +
.../ignite/internal/sql/engine/util/TypeUtils.java | 21 +--
.../engine/exec/exp/ExpressionFactoryImplTest.java | 15 +--
.../sql/engine/planner/CastResolutionTest.java | 5 +-
.../sql/engine/planner/DmlPlannerTest.java | 6 +-
.../sql/engine/planner/DynamicParametersTest.java | 4 +-
.../pruning/PartitionPruningPredicateSelfTest.java | 4 +-
.../internal/sql/engine/sql/SqlDdlParserTest.java | 49 +++----
.../sql/engine/type/IgniteTypeFactorySelfTest.java | 61 ---------
.../internal/sql/engine/util/TypeUtilsTest.java | 4 +-
.../internal/sql/engine/util/SqlTestUtils.java | 27 +---
38 files changed, 243 insertions(+), 493 deletions(-)
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
index 0606d5e4ce7..2579a14ed93 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItImplicitCastsTest.java
@@ -30,9 +30,10 @@ import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
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.internal.sql.engine.util.SqlTestUtils;
import org.apache.ignite.lang.IgniteException;
+import org.apache.ignite.sql.ColumnType;
import org.apache.ignite.tx.Transaction;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -204,23 +205,14 @@ public class ItImplicitCastsTest extends
BaseSqlIntegrationTest {
static String generateValue(RelDataType type, int i, boolean literal) {
if (SqlTypeUtil.isNumeric(type)) {
return Integer.toString(i);
- } else if (type instanceof UuidType
- || type.getSqlTypeName() == SqlTypeName.CHAR
+ } else if (type.getSqlTypeName() == SqlTypeName.UUID) {
+ return SqlTestUtils.makeLiteral(new UUID(i, i),
ColumnType.UUID);
+ } else if (type.getSqlTypeName() == SqlTypeName.CHAR
|| type.getSqlTypeName() == SqlTypeName.VARCHAR) {
- // We need to generate valid UUID string so cast operations
won't fail at runtime.
- return generateUuid(i, literal);
+ return SqlTestUtils.makeLiteral(new UUID(i, i),
ColumnType.STRING);
} else {
throw new IllegalArgumentException("Unsupported type: " +
type);
}
}
-
- private static String generateUuid(int i, boolean literal) {
- UUID val = new UUID(i, i);
- if (!literal) {
- return val.toString();
- } else {
- return format("'{}'", val);
- }
- }
}
}
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/DataTypeTestSpecs.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/DataTypeTestSpecs.java
index a91c8af9deb..dd6d7830fbf 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/DataTypeTestSpecs.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/DataTypeTestSpecs.java
@@ -27,7 +27,6 @@ import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
import org.apache.ignite.internal.sql.engine.datatypes.tests.TestDataSamples;
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.VarBinary;
import org.apache.ignite.sql.ColumnType;
@@ -37,24 +36,24 @@ import org.apache.ignite.sql.ColumnType;
public final class DataTypeTestSpecs {
/**
- * Test type spec for {@link UuidType UUID} data type.
+ * Test type spec for {@link SqlTypeName#UUID} data type.
*/
public static final DataTypeTestSpec<UUID> UUID_TYPE = new
DataTypeTestSpec<>(
- ColumnType.UUID, UuidType.NAME, UUID.class) {
+ ColumnType.UUID, ColumnType.UUID.name(), UUID.class) {
@Override
public boolean hasLiterals() {
- return false;
+ return true;
}
@Override
public String toLiteral(UUID value) {
- throw new UnsupportedOperationException();
+ return "uuid '" + value + "'";
}
@Override
public String toValueExpr(UUID value) {
- return format("'{}'::UUID", value);
+ return toLiteral(value);
}
@Override
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
index 60a0b1bbb0f..475b0e948f2 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseDmlDataTypeTest.java
@@ -54,6 +54,17 @@ public abstract class BaseDmlDataTypeTest<T extends
Comparable<T>> extends BaseD
checkQuery("SELECT id FROM t").returns(2).returns(3).check();
}
+ @Test
+ public void testInsertDefaultLiteral() {
+ runSql("CREATE TABLE test_table (id INT PRIMARY KEY, val <type>
DEFAULT $0)");
+ runSql("INSERT INTO test_table(id) VALUES (0)");
+
+ assertQuery("SELECT val FROM test_table WHERE id = ?")
+ .withParam(0)
+ .returns(values.get(0))
+ .check();
+ }
+
/** {@code UPDATE} from a dynamic parameter. */
@Test
public void testUpdateFromDynamicParam() {
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
index be4146f43d1..deb6071fdcd 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/tests/BaseQueryDataTypeTest.java
@@ -51,6 +51,17 @@ public abstract class BaseQueryDataTypeTest<T extends
Comparable<T>> extends Bas
.check();
}
+ @Test
+ public void testSelectLiteral() {
+ T expected = values.get(0);
+
+ String literal = testTypeSpec.toLiteral(expected);
+
+ checkQuery("SELECT " + literal)
+ .returns(expected)
+ .check();
+ }
+
/** Test for equality predicate. */
@ParameterizedTest
@MethodSource("eq")
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidAggregateTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidAggregateTest.java
index 3a97ed36626..5c4800ee0cb 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidAggregateTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidAggregateTest.java
@@ -18,13 +18,13 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.BaseAggregateDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
/**
- * Tests for aggregates for {@link UuidType UUID data type}.
+ * Tests for aggregates for {@link SqlTypeName#UUID UUID data type}.
*/
public class ItUuidAggregateTest extends BaseAggregateDataTypeTest<UUID> {
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidDmlTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidDmlTest.java
index 922b49d3573..266bf15b383 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidDmlTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidDmlTest.java
@@ -18,13 +18,13 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.BaseDmlDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
/**
- * Tests for DML statements for {@link UuidType UUID data type}.
+ * Tests for DML statements for {@link SqlTypeName#UUID UUID data type}.
*/
public class ItUuidDmlTest extends BaseDmlDataTypeTest<UUID> {
/** {@inheritDoc} **/
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidExpressionTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidExpressionTest.java
index 9310160d2ff..c90a4b81306 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidExpressionTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidExpressionTest.java
@@ -21,16 +21,16 @@ import static
org.apache.ignite.internal.lang.IgniteStringFormatter.format;
import static
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.assertThrowsSqlException;
import java.util.UUID;
+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.BaseExpressionDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.lang.ErrorGroups.Sql;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
/**
- * Tests for expressions for {@link UuidType UUID data type}.
+ * Tests for expressions for {@link SqlTypeName#UUID UUID data type}.
*/
public class ItUuidExpressionTest extends BaseExpressionDataTypeTest<UUID> {
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidIndexTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidIndexTest.java
index 54a79041467..9aaa2639d72 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidIndexTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidIndexTest.java
@@ -18,13 +18,13 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.BaseIndexDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
/**
- * Tests for queries that use indexes with {@link UuidType UUID data type}.
+ * Tests for queries that use indexes with {@link SqlTypeName#UUID UUID data
type}.
*/
public class ItUuidIndexTest extends BaseIndexDataTypeTest<UUID> {
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidJoinTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidJoinTest.java
index 1109be22b35..e9357b90e67 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidJoinTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidJoinTest.java
@@ -18,15 +18,15 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.BaseJoinDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
/**
- * Tests for {@code JOIN} operator for {@link UuidType UUID data type}.
+ * Tests for {@code JOIN} operator for {@link SqlTypeName#UUID UUID data type}.
*/
public class ItUuidJoinTest extends BaseJoinDataTypeTest<UUID> {
/** {@inheritDoc} */
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
index 851471895e8..0f4574f5034 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidQueryTest.java
@@ -18,13 +18,13 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.type.UuidType;
/**
- * Tests for {@code SELECT} operations for {@link UuidType UUID data type}.
+ * Tests for {@code SELECT} operations for {@link SqlTypeName#UUID UUID data
type}.
*/
public class ItUuidQueryTest extends BaseQueryDataTypeTest<UUID> {
@Override
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidSetOpTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidSetOpTest.java
index 3bd6fd5a69d..bd1519c2a05 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidSetOpTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/uuid/ItUuidSetOpTest.java
@@ -18,13 +18,13 @@
package org.apache.ignite.internal.sql.engine.datatypes.uuid;
import java.util.UUID;
+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.BaseSetOpDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
/**
- * Tests for set operators for {@link UuidType UUID data type}.
+ * Tests for set operators for {@link SqlTypeName#UUID UUID data type}.
*/
public class ItUuidSetOpTest extends BaseSetOpDataTypeTest<UUID> {
diff --git a/modules/sql-engine/src/main/codegen/config.fmpp
b/modules/sql-engine/src/main/codegen/config.fmpp
index 10a70255e6e..42ba9ccb02c 100644
--- a/modules/sql-engine/src/main/codegen/config.fmpp
+++ b/modules/sql-engine/src/main/codegen/config.fmpp
@@ -33,8 +33,8 @@ data: {
"org.apache.calcite.sql.SqlDdl",
"org.apache.calcite.sql.SqlLiteral",
"org.apache.calcite.schema.ColumnStrategy",
+ "org.apache.calcite.sql.ddl.SqlDdlNodes",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlParserUtil",
- "org.apache.ignite.internal.sql.engine.sql.IgniteSqlColumnDeclaration",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterTableAddColumn",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterTableDropColumn",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterColumn",
diff --git a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
index c0d458f8525..982c258f97a 100644
--- a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
+++ b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
@@ -97,7 +97,7 @@ void TableElement(List<SqlNode> list) :
]
{
list.add(
- new IgniteSqlColumnDeclaration(s.add(id).end(this), id,
+ SqlDdlNodes.column(s.add(id).end(this), id,
type.withNullable(nullable), dflt, strategy));
}
|
@@ -411,7 +411,7 @@ SqlNode ColumnWithType() :
}
)
{
- return new IgniteSqlColumnDeclaration(s.add(id).end(this), id,
type.withNullable(nullable), dflt, strategy);
+ return SqlDdlNodes.column(s.add(id).end(this), id,
type.withNullable(nullable), dflt, strategy);
}
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
index 85b2e72eeb2..2250b8e5d31 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
@@ -21,6 +21,7 @@ import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import org.apache.calcite.adapter.enumerable.EnumUtils;
import org.apache.calcite.adapter.enumerable.RexImpTable;
import org.apache.calcite.linq4j.tree.ConstantUntypedNull;
@@ -310,6 +311,11 @@ public class ConverterUtils {
}
}
+ // EnumUtils.convert lacks UUID handling, therefore we will WA on our
side.
+ if (toType == UUID.class && fromType == String.class) {
+ return Expressions.call(UUID.class, "fromString", operand);
+ }
+
var toCustomType = CustomTypesConversion.INSTANCE.tryConvert(operand,
toType);
return toCustomType != null ? toCustomType :
EnumUtils.convert(operand, toType);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
index 80941b9d234..30635a30d61 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
@@ -3402,7 +3402,10 @@ public class RexImpTable {
/** Returns whether any of a call's operands have ANY type. */
private static boolean anyAnyOperands(RexCall call) {
for (RexNode operand : call.operands) {
- if (operand.getType().getSqlTypeName() == SqlTypeName.ANY) {
+ // org.apache.calcite.runtime.SqlFunctions class lacks overrides for
UUID,
+ // but "*Any" counterparts handles UUID just fine, therefore let's
reuse
+ // these methods for UUID as well.
+ if (operand.getType().getSqlTypeName() == SqlTypeName.ANY ||
operand.getType().getSqlTypeName() == SqlTypeName.UUID) {
return true;
}
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexToLixTranslator.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexToLixTranslator.java
index d4ad8f40567..705174bd5cf 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexToLixTranslator.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexToLixTranslator.java
@@ -41,6 +41,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import java.util.function.Supplier;
import org.apache.calcite.DataContext;
import org.apache.calcite.adapter.enumerable.PhysType;
@@ -996,6 +997,16 @@ public class RexToLixTranslator implements
RexVisitor<RexToLixTranslator.Result>
() -> "getValueAs(Enum.class) for " + literal);
javaClass = value2.getClass();
break;
+ case UUID: {
+ UUID value = literal.getValueAs(UUID.class);
+
+ // Literal NULL is covered at the very beginning of this method.
+ assert value != null;
+
+ return Expressions.new_(
+ UUID.class, constant(value.getMostSignificantBits()),
constant(value.getLeastSignificantBits())
+ );
+ }
default:
final Primitive primitive = Primitive.ofBoxOr(javaClass);
final Comparable value = literal.getValueAs(Comparable.class);
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
index fa496c97bc4..604ecee8ae3 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/externalize/RelJson.java
@@ -39,6 +39,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -264,7 +265,8 @@ class RelJson {
if (value == null
|| value instanceof Number
|| value instanceof String
- || value instanceof Boolean) {
+ || value instanceof Boolean
+ || value instanceof UUID) {
return value;
} else if (value instanceof Enum) {
return toJson((Enum) value);
@@ -897,6 +899,10 @@ class RelJson {
literal = toByteString(literal);
} else if (type.getSqlTypeName().getFamily() ==
SqlTypeFamily.TIMESTAMP && literal instanceof Integer) {
literal = ((Integer) literal).longValue();
+ } else if (type.getSqlTypeName() == SqlTypeName.UUID) {
+ assert literal instanceof String : literal;
+
+ literal = UUID.fromString((String) literal);
}
return rexBuilder.makeLiteral(literal, type, true);
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
index 12b748f6325..cd7dc32fd07 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
@@ -79,7 +79,6 @@ import org.apache.calcite.sql.SqlTypeNameSpec;
import org.apache.calcite.sql.SqlUnknownLiteral;
import org.apache.calcite.sql.SqlUpdate;
import org.apache.calcite.sql.SqlUtil;
-import org.apache.calcite.sql.SqlUuidLiteral;
import org.apache.calcite.sql.SqlWithItem;
import org.apache.calcite.sql.dialect.CalciteSqlDialect;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
@@ -109,7 +108,6 @@ import
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
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.internal.sql.engine.util.IgniteCustomAssignmentsRules;
import org.apache.ignite.internal.sql.engine.util.IgniteResource;
@@ -585,9 +583,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
SqlLiteral resolved = super.resolveLiteral(literal);
SqlTypeName typeName = resolved.getTypeName();
- if (resolved instanceof SqlUuidLiteral) {
- throw newValidationError(resolved,
IgniteResource.INSTANCE.unsupportedExpression("UUID literal"));
- } else if (typeName == SqlTypeName.TIMESTAMP) {
+ if (typeName == SqlTypeName.TIMESTAMP) {
long ts =
resolved.getValueAs(TimestampString.class).getMillisSinceEpoch();
if (ts < IgniteSqlFunctions.TIMESTAMP_MIN_INTERNAL || ts >
IgniteSqlFunctions.TIMESTAMP_MAX_INTERNAL) {
@@ -985,7 +981,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
} else if (returnCustomType != null) {
check = coercionRules.needToCast(operandType, (IgniteCustomType)
returnCustomType);
} else {
- check = SqlTypeUtil.canCastFrom(returnType, operandType, true);
+ check = IgniteCustomAssignmentsRules.instance().canApplyFrom(
+ returnType.getSqlTypeName(), operandType.getSqlTypeName()
+ );
}
if (!check) {
@@ -1557,7 +1555,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
case FLOAT: return typeFactory.createSqlType(SqlTypeName.REAL);
case DOUBLE: return typeFactory.createSqlType(SqlTypeName.DOUBLE);
case BOOLEAN: return
typeFactory.createSqlType(SqlTypeName.BOOLEAN);
- case UUID: return typeFactory().createCustomType(UuidType.NAME);
+ case UUID: return typeFactory.createSqlType(SqlTypeName.UUID);
case DATE: return typeFactory.createSqlType(SqlTypeName.DATE);
case TIME: return typeFactory.createSqlType(SqlTypeName.TIME);
case DATETIME: return
typeFactory.createSqlType(SqlTypeName.TIMESTAMP);
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteTypeCoercion.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteTypeCoercion.java
index 22820b3f198..02c63fa8e4d 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteTypeCoercion.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteTypeCoercion.java
@@ -36,6 +36,7 @@ import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeFactoryImpl;
import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.sql.SqlBasicTypeNameSpec;
import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlCallBinding;
import org.apache.calcite.sql.SqlCollation;
@@ -64,6 +65,7 @@ import org.apache.calcite.util.Util;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
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.util.IgniteCustomAssignmentsRules;
import org.apache.ignite.internal.sql.engine.util.IgniteResource;
import org.apache.ignite.internal.sql.engine.util.TypeUtils;
import org.jetbrains.annotations.Nullable;
@@ -446,8 +448,11 @@ public class IgniteTypeCoercion extends TypeCoercionImpl {
return false;
}
- // No need to cast between binary types.
- if (SqlTypeUtil.isBinary(toType) && SqlTypeUtil.isBinary(fromType)) {
+ if (SqlTypeUtil.equalSansNullability(typeFactory, fromType, toType)) {
+ // Implicit type coercion does not handle nullability.
+ return false;
+ } else if (SqlTypeUtil.isBinary(toType) &&
SqlTypeUtil.isBinary(fromType)) {
+ // No need to cast between binary types.
return false;
} else if (SqlTypeUtil.isInterval(toType)) {
if (SqlTypeUtil.isInterval(fromType)) {
@@ -455,9 +460,6 @@ public class IgniteTypeCoercion extends TypeCoercionImpl {
return fromType.getSqlTypeName().getFamily() !=
toType.getSqlTypeName().getFamily();
}
} else if (SqlTypeUtil.isIntType(toType)) {
- if (fromType == null) {
- return false;
- }
// The following checks ensure that there no ClassCastException
when casting from one
// integer type to another (e.g. int to smallint, int to bigint)
if (SqlTypeUtil.isIntType(fromType) && fromType.getSqlTypeName()
!= toType.getSqlTypeName()) {
@@ -466,9 +468,13 @@ public class IgniteTypeCoercion extends TypeCoercionImpl {
} else if (toType.getSqlTypeName() == SqlTypeName.ANY ||
fromType.getSqlTypeName() == SqlTypeName.ANY) {
// IgniteCustomType: whether we need implicit cast from one type
to another.
return TypeUtils.customDataTypeNeedCast(typeFactory, fromType,
toType);
+ } else if (SqlTypeUtil.isNull(fromType)) {
+ // Need to cast NULL literal because type-checkers of built-in
function cannot properly handle explicit NULL
+ // since it belongs to a particular type family.
+ return true;
}
- return super.needToCast(scope, node, toType);
+ return
IgniteCustomAssignmentsRules.instance().canApplyFrom(toType.getSqlTypeName(),
fromType.getSqlTypeName());
}
/** {@inheritDoc} */
@@ -645,6 +651,10 @@ public class IgniteTypeCoercion extends TypeCoercionImpl {
var nameSpec = customType.createTypeNameSpec();
targetDataType = new SqlDataTypeSpec(nameSpec, SqlParserPos.ZERO);
+ } else if (type.getSqlTypeName() == SqlTypeName.UUID) {
+ targetDataType = new SqlDataTypeSpec(
+ new SqlBasicTypeNameSpec(SqlTypeName.UUID,
SqlParserPos.ZERO), null, type.isNullable(), SqlParserPos.ZERO
+ );
} else {
targetDataType =
SqlTypeUtil.convertTypeToSpec(type).withNullable(type.isNullable());
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
index cd3ab93aea7..94319deb6a7 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
@@ -56,6 +56,7 @@ import java.util.stream.Collectors;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.runtime.CalciteContextException;
import org.apache.calcite.schema.ColumnStrategy;
+import org.apache.calcite.sql.SqlBasicTypeNameSpec;
import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlCharStringLiteral;
import org.apache.calcite.sql.SqlDataTypeSpec;
@@ -69,6 +70,8 @@ import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.SqlNumericLiteral;
+import org.apache.calcite.sql.ddl.SqlColumnDeclaration;
+import org.apache.calcite.sql.ddl.SqlDdlNodes;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.parser.SqlParserUtil;
import org.apache.calcite.sql.type.SqlTypeName;
@@ -119,7 +122,6 @@ import
org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterTableDropColumn;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneRenameTo;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSet;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSetDefault;
-import org.apache.ignite.internal.sql.engine.sql.IgniteSqlColumnDeclaration;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateIndex;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateSchema;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateTable;
@@ -132,10 +134,8 @@ import
org.apache.ignite.internal.sql.engine.sql.IgniteSqlDropZone;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlIndexType;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlPrimaryKeyConstraint;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlPrimaryKeyIndexType;
-import org.apache.ignite.internal.sql.engine.sql.IgniteSqlTypeNameSpec;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlZoneOption;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlZoneOptionMode;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.internal.sql.engine.util.Commons;
import org.apache.ignite.internal.type.NativeTypeSpec;
import org.apache.ignite.lang.IgniteException;
@@ -315,8 +315,8 @@ public class DdlSqlToCommandConverter {
.collect(Collectors.toList());
for (SqlNode sqlNode : createTblNode.columnList().getList()) {
- if (sqlNode instanceof IgniteSqlColumnDeclaration) {
- String colName = ((IgniteSqlColumnDeclaration)
sqlNode).name().getSimple();
+ if (sqlNode instanceof SqlColumnDeclaration) {
+ String colName = ((SqlColumnDeclaration)
sqlNode).name.getSimple();
if (IgniteSqlValidator.isSystemFieldName(colName)) {
throw new SqlException(STMT_VALIDATION_ERR, "Failed to
validate query. "
@@ -331,9 +331,8 @@ public class DdlSqlToCommandConverter {
pkConstraints.add(new
IgniteSqlPrimaryKeyConstraint(SqlParserPos.ZERO, null, SqlNodeList.of(colName),
IgniteSqlPrimaryKeyIndexType.IMPLICIT_HASH));
- SqlIdentifier uuidTypeName = new SqlIdentifier(UuidType.NAME,
SqlParserPos.ZERO);
- SqlDataTypeSpec type = new SqlDataTypeSpec(new
IgniteSqlTypeNameSpec(uuidTypeName, SqlParserPos.ZERO), SqlParserPos.ZERO);
- SqlNode col = new IgniteSqlColumnDeclaration(SqlParserPos.ZERO,
colName, type, null, ColumnStrategy.DEFAULT);
+ SqlDataTypeSpec type = new SqlDataTypeSpec(new
SqlBasicTypeNameSpec(SqlTypeName.UUID, SqlParserPos.ZERO), SqlParserPos.ZERO);
+ SqlNode col = SqlDdlNodes.column(SqlParserPos.ZERO, colName, type,
null, ColumnStrategy.DEFAULT);
createTblNode.columnList().add(0, col);
}
@@ -387,21 +386,21 @@ public class DdlSqlToCommandConverter {
.map(SqlIdentifier::getSimple)
.collect(Collectors.toList());
- List<IgniteSqlColumnDeclaration> colDeclarations =
createTblNode.columnList().getList().stream()
- .filter(IgniteSqlColumnDeclaration.class::isInstance)
- .map(IgniteSqlColumnDeclaration.class::cast)
+ List<SqlColumnDeclaration> colDeclarations =
createTblNode.columnList().getList().stream()
+ .filter(SqlColumnDeclaration.class::isInstance)
+ .map(SqlColumnDeclaration.class::cast)
.collect(Collectors.toList());
List<ColumnParams> columns = new ArrayList<>(colDeclarations.size());
- for (IgniteSqlColumnDeclaration col : colDeclarations) {
- if (!col.name().isSimple()) {
+ for (SqlColumnDeclaration col : colDeclarations) {
+ if (!col.name.isSimple()) {
throw new SqlException(STMT_VALIDATION_ERR, "Unexpected value
of columnName ["
- + "expected a simple identifier, but was " +
col.name() + "; "
+ + "expected a simple identifier, but was " + col.name
+ "; "
+ "querySql=\"" + ctx.query() + "\"]");
}
- columns.add(convertColumnDeclaration(col, ctx.planner(),
!pkColumns.contains(col.name().getSimple())));
+ columns.add(convertColumnDeclaration(col, ctx.planner(),
!pkColumns.contains(col.name.getSimple())));
}
String storageProfile = null;
@@ -425,14 +424,14 @@ public class DdlSqlToCommandConverter {
.build();
}
- private static ColumnParams
convertColumnDeclaration(IgniteSqlColumnDeclaration col, IgnitePlanner planner,
boolean nullable) {
- assert col.name().isSimple();
+ private static ColumnParams convertColumnDeclaration(SqlColumnDeclaration
col, IgnitePlanner planner, boolean nullable) {
+ assert col.name.isSimple();
- String name = col.name().getSimple();
+ String name = col.name.getSimple();
RelDataType relType;
try {
- relType = planner.convert(col.dataType(), nullable);
+ relType = planner.convert(col.dataType, nullable);
} catch (CalciteContextException e) {
String errorMessage = e.getMessage();
if (errorMessage == null) {
@@ -463,7 +462,7 @@ public class DdlSqlToCommandConverter {
.precision(typeParams.precision)
.scale(typeParams.scale)
.length(typeParams.length)
- .defaultValue(convertDefault(col.expression(), relType, name))
+ .defaultValue(convertDefault(col.expression, relType, name))
.build();
}
@@ -490,11 +489,11 @@ public class DdlSqlToCommandConverter {
List<ColumnParams> columns = new
ArrayList<>(alterTblNode.columns().size());
for (SqlNode colNode : alterTblNode.columns()) {
- assert colNode instanceof IgniteSqlColumnDeclaration :
colNode.getClass();
- IgniteSqlColumnDeclaration col = (IgniteSqlColumnDeclaration)
colNode;
- Boolean nullable = col.dataType().getNullable();
+ assert colNode instanceof SqlColumnDeclaration :
colNode.getClass();
+ SqlColumnDeclaration col = (SqlColumnDeclaration) colNode;
+ Boolean nullable = col.dataType.getNullable();
- String colName = col.name().getSimple();
+ String colName = col.name.getSimple();
if (IgniteSqlValidator.isSystemFieldName(colName)) {
throw new SqlException(STMT_VALIDATION_ERR, "Failed to
validate query. "
+ "Column '" + colName + "' is reserved name.");
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rex/IgniteRexBuilder.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rex/IgniteRexBuilder.java
index 293f13273f7..c73c42a758c 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rex/IgniteRexBuilder.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rex/IgniteRexBuilder.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.sql.engine.rex;
+import java.util.UUID;
import org.apache.calcite.avatica.util.ByteString;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
@@ -89,6 +90,12 @@ public class IgniteRexBuilder extends RexBuilder {
}
}
+ if (value instanceof UUID && type.getSqlTypeName() ==
SqlTypeName.UUID) {
+ // Generic super.makeLiteral() lacks handling of UUID type,
therefore we will
+ // WA this on our side.
+ return makeUuidLiteral((UUID) value);
+ }
+
return super.makeLiteral(value, type, allowCast, trim);
}
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/TableDescriptorImpl.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/TableDescriptorImpl.java
index cbd44c0126f..afa3c83b48f 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/TableDescriptorImpl.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/TableDescriptorImpl.java
@@ -24,7 +24,6 @@ import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.UUID;
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
@@ -32,14 +31,12 @@ import
org.apache.calcite.rel.type.RelDataTypeFactory.Builder;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.schema.ColumnStrategy;
-import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql2rel.InitializerContext;
import org.apache.calcite.sql2rel.NullInitializerExpressionFactory;
import org.apache.calcite.util.ImmutableBitSet;
import org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable;
import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
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.internal.sql.engine.util.TypeUtils;
import org.apache.ignite.internal.type.NativeType;
@@ -136,17 +133,6 @@ public class TableDescriptorImpl extends
NullInitializerExpressionFactory implem
Object internalValue = defaultVal == null ? defaultVal :
TypeUtils.toInternal(defaultVal, nativeType.spec());
RelDataType relDataType =
deriveLogicalType(rexBuilder.getTypeFactory(), descriptor);
- // UUID literals are not supported, so we replace it with
CAST(uuid.toString() AS UUID)
- if (internalValue != null && relDataType instanceof UuidType) {
- assert internalValue instanceof UUID;
-
- RelDataType charType =
rexBuilder.getTypeFactory().createSqlType(SqlTypeName.VARCHAR);
-
- RexNode literal =
rexBuilder.makeLiteral(internalValue.toString(), charType, false);
-
- return rexBuilder.makeCast(relDataType, literal);
- }
-
return rexBuilder.makeLiteral(internalValue, relDataType,
false);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlColumnDeclaration.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlColumnDeclaration.java
deleted file mode 100644
index 77b8dd1846b..00000000000
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlColumnDeclaration.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.sql.engine.sql;
-
-import java.util.Arrays;
-import java.util.List;
-import org.apache.calcite.schema.ColumnStrategy;
-import org.apache.calcite.sql.SqlCall;
-import org.apache.calcite.sql.SqlDataTypeSpec;
-import org.apache.calcite.sql.SqlIdentifier;
-import org.apache.calcite.sql.SqlKind;
-import org.apache.calcite.sql.SqlLiteral;
-import org.apache.calcite.sql.SqlNode;
-import org.apache.calcite.sql.SqlOperator;
-import org.apache.calcite.sql.SqlWriter;
-import org.apache.calcite.sql.ddl.SqlDdlNodes;
-import org.apache.calcite.sql.parser.SqlParserPos;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Creates a SqlColumnDeclaration. Should be used instead of {@link
SqlDdlNodes#column} because it supports cloning.
- */
-public class IgniteSqlColumnDeclaration extends SqlCall {
- /** Column declaration operator. */
- protected static class Operator extends IgniteSqlSpecialOperator {
-
- private final ColumnStrategy columnStrategy;
-
- /** Constructor. */
- protected Operator(ColumnStrategy columnStrategy) {
- super("COLUMN_DECL", SqlKind.COLUMN_DECL);
- this.columnStrategy = columnStrategy;
- }
-
- /** {@inheritDoc} */
- @Override
- public SqlCall createCall(@Nullable SqlLiteral name, SqlParserPos pos,
@Nullable SqlNode... operands) {
- SqlIdentifier id = (SqlIdentifier) operands[0];
- SqlDataTypeSpec dataType = (SqlDataTypeSpec) operands[1];
- SqlNode expression = operands.length > 2 ? operands[2] : null;
-
- return new IgniteSqlColumnDeclaration(pos, id, dataType,
expression, columnStrategy);
- }
- }
-
- private final Operator operator;
- private final SqlIdentifier name;
- private final SqlDataTypeSpec dataType;
- private final @Nullable SqlNode expression;
- private final ColumnStrategy strategy;
-
- /** Constructor. */
- public IgniteSqlColumnDeclaration(SqlParserPos pos, SqlIdentifier name,
- SqlDataTypeSpec dataType, @Nullable SqlNode expression,
- ColumnStrategy strategy) {
- super(pos);
-
- this.operator = new Operator(strategy);
- this.name = name;
- this.dataType = dataType;
- this.expression = expression;
- this.strategy = strategy;
- }
-
- /** {@inheritDoc} */
- @Override
- public SqlOperator getOperator() {
- return operator;
- }
-
- /** {@inheritDoc} */
- @Override
- public List<SqlNode> getOperandList() {
- return Arrays.asList(name, dataType, expression);
- }
-
- public SqlIdentifier name() {
- return name;
- }
-
- public SqlDataTypeSpec dataType() {
- return dataType;
- }
-
- public @Nullable SqlNode expression() {
- return expression;
- }
-
- public ColumnStrategy strategy() {
- return strategy;
- }
-
- /** {@inheritDoc} */
- @Override
- public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
- name.unparse(writer, 0, 0);
- dataType.unparse(writer, 0, 0);
- if (Boolean.FALSE.equals(dataType.getNullable())) {
- writer.keyword("NOT NULL");
- }
- SqlNode expression = this.expression;
- if (expression != null) {
- switch (strategy) {
- case VIRTUAL:
- case STORED:
- writer.keyword("AS");
- exp(writer, expression);
- writer.keyword(strategy.name());
- break;
- case DEFAULT:
- writer.keyword("DEFAULT");
- exp(writer, expression);
- break;
- default:
- throw new AssertionError("unexpected: " + strategy);
- }
- }
- }
-
- private static void exp(SqlWriter writer, SqlNode expression) {
- if (writer.isAlwaysUseParentheses()) {
- expression.unparse(writer, 0, 0);
- } else {
- writer.sep("(");
- expression.unparse(writer, 0, 0);
- writer.sep(")");
- }
- }
-}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlParser.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlParser.java
index 25f91315f38..26c95cf48ff 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlParser.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlParser.java
@@ -27,7 +27,6 @@ import java.util.List;
import java.util.Map;
import org.apache.calcite.config.Lex;
import org.apache.calcite.sql.SqlBasicCall;
-import org.apache.calcite.sql.SqlBasicTypeNameSpec;
import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlCollectionTypeNameSpec;
import org.apache.calcite.sql.SqlDataTypeSpec;
@@ -54,7 +53,6 @@ import
org.apache.ignite.internal.generated.query.calcite.sql.ParseException;
import org.apache.ignite.internal.generated.query.calcite.sql.Token;
import org.apache.ignite.internal.generated.query.calcite.sql.TokenMgrError;
import org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.internal.sql.engine.util.Commons;
import org.apache.ignite.internal.sql.engine.util.IgniteResource;
import org.apache.ignite.internal.util.StringUtils;
@@ -362,19 +360,6 @@ public final class IgniteSqlParser {
public @Nullable SqlNode visit(SqlDataTypeSpec type) {
this.visit(type.getTypeName());
- // Replace calcite's UUID with IgniteCustomDataType UUID because
calcite's UUID is not usable until
- // calcite's runtime expression engine supports it.
- if (type.getTypeNameSpec() instanceof SqlBasicTypeNameSpec) {
- SqlBasicTypeNameSpec basicTypeNameSpec =
(SqlBasicTypeNameSpec) type.getTypeNameSpec();
-
- if (basicTypeNameSpec.getTypeName().isSimple() &&
basicTypeNameSpec.getTypeName().getSimple().equals(UuidType.NAME)) {
- SqlIdentifier typeName = new SqlIdentifier(UuidType.NAME,
basicTypeNameSpec.getParserPos());
- IgniteSqlTypeNameSpec uuidTypeNameSpec = new
IgniteSqlTypeNameSpec(typeName, basicTypeNameSpec.getParserPos());
-
- return new SqlDataTypeSpec(uuidTypeNameSpec, null,
type.getNullable(), type.getParserPosition());
- }
- }
-
// getComponentTypeSpec throws AssertionError if typeNameSpec is
not an instance of CollectionTypeNameSpec.
if (type.getTypeNameSpec() instanceof SqlCollectionTypeNameSpec) {
SqlDataTypeSpec componentTypeSpec =
type.getComponentTypeSpec();
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
index 17060d10faf..36e3b4906f8 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
@@ -46,7 +46,6 @@ import org.apache.calcite.sql.type.SqlTypeTransforms;
import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.calcite.sql.util.ReflectiveSqlOperatorTable;
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.internal.sql.engine.util.TypeUtils;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -151,7 +150,7 @@ public class IgniteSqlOperatorTable extends
ReflectiveSqlOperatorTable {
new SqlFunction(
"RAND_UUID",
SqlKind.OTHER_FUNCTION,
- ReturnTypes.explicit(new UuidType(false)),
+ ReturnTypes.explicit(SqlTypeName.UUID),
null,
OperandTypes.NILADIC,
SqlFunctionCategory.SYSTEM
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
index e086749caa9..1b7cf455f8b 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
@@ -41,6 +41,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
+import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.calcite.avatica.util.ByteString;
@@ -56,6 +57,7 @@ import org.apache.calcite.sql.type.IntervalSqlType;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.ignite.internal.sql.engine.util.Commons;
+import org.apache.ignite.internal.sql.engine.util.IgniteCustomAssignmentsRules;
import org.apache.ignite.internal.type.NativeType;
import org.apache.ignite.internal.type.NativeTypes;
import org.jetbrains.annotations.Nullable;
@@ -114,22 +116,7 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl
{
charset = StandardCharsets.UTF_8;
}
- // IgniteCustomType: all custom data types are registered here
- NewCustomType uuidType = new NewCustomType(UuidType.SPEC, (nullable,
precision) -> new UuidType(nullable));
- // UUID type can be converted from character types.
- uuidType.addCoercionRules(SqlTypeName.CHAR_TYPES);
-
- customDataTypes = new CustomDataTypes(Set.of(uuidType));
- }
-
- /** {@inheritDoc} */
- @Override
- public RelDataType createSqlType(SqlTypeName typeName) {
- if (typeName == SqlTypeName.UUID) {
- return createCustomType(UuidType.NAME);
- } else {
- return super.createSqlType(typeName);
- }
+ customDataTypes = new CustomDataTypes(Set.of());
}
/** {@inheritDoc} */
@@ -243,6 +230,8 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
return Object.class;
case NULL:
return Void.class;
+ case UUID:
+ return UUID.class;
default:
break;
}
@@ -327,6 +316,8 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
return relType.getPrecision() == PRECISION_NOT_SPECIFIED
? NativeTypes.blobOf(DEFAULT_VARLEN_LENGTH)
: NativeTypes.blobOf(relType.getPrecision());
+ case UUID:
+ return NativeTypes.UUID;
case ANY:
if (relType instanceof IgniteCustomType) {
var customType = (IgniteCustomType) relType;
@@ -446,28 +437,10 @@ public class IgniteTypeFactory extends
JavaTypeFactoryImpl {
return first(types);
}
- RelDataType resultType = super.leastRestrictive(types);
-
- if (resultType == null) {
- return null;
- }
-
- if (resultType.getSqlTypeName() != SqlTypeName.ANY) {
- // leastRestrictive defined by calcite returns leas restrictive
even among types of different families.
- // We need to trim such variants.
- if (!typeFamiliesAreCompatible(this, types)) {
- return null;
- }
-
- return resultType;
- }
-
- // leastRestrictive defined by calcite returns an instance of
BasicSqlType that represents an ANY type,
- // when at least one of its arguments have sqlTypeName = ANY.
- assert resultType instanceof BasicSqlType : "leastRestrictive is
expected to return a new instance of a type: " + resultType;
-
IgniteCustomType firstCustomType = null;
boolean hasAnyType = false;
+ boolean hasNullOrNullable = false;
+ boolean hasUuidType = false;
boolean hasBuiltInType = false;
boolean hasNullable = false;
IgniteCustomType firstNullable = null;
@@ -476,9 +449,14 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl
{
SqlTypeName sqlTypeName = type.getSqlTypeName();
// NULL types should be ignored when we are trying to determine
the least restrictive type.
if (sqlTypeName == SqlTypeName.NULL) {
+ hasNullOrNullable = true;
continue;
}
+ if (type.isNullable()) {
+ hasNullOrNullable = true;
+ }
+
if (type instanceof IgniteCustomType) {
if (firstCustomType == null) {
firstCustomType = (IgniteCustomType) type;
@@ -498,10 +476,50 @@ public class IgniteTypeFactory extends
JavaTypeFactoryImpl {
} else if (sqlTypeName == SqlTypeName.ANY) {
hasAnyType = true;
} else {
+ if (sqlTypeName == SqlTypeName.UUID) {
+ hasUuidType = true;
+ }
+
hasBuiltInType = true;
}
}
+ // Calcite's implementation of TypeFactory cannot derive least
restrictive type between UUID and NULL.
+ if (hasUuidType) {
+ // UUID doesn't have any other types in the family, therefore it's
safe to assume if all types are compatible,
+ // then there are either UUID or NULL types.
+ if (!typeFamiliesAreCompatible(this, types)) {
+ return null;
+ }
+
+ RelDataType returnType = createSqlType(SqlTypeName.UUID);
+ if (hasNullOrNullable) {
+ returnType = createTypeWithNullability(returnType, true);
+ }
+
+ return returnType;
+ }
+
+ RelDataType resultType = leastRestrictive(types,
IgniteCustomAssignmentsRules.instance());
+
+ if (resultType == null) {
+ return null;
+ }
+
+ if (resultType.getSqlTypeName() != SqlTypeName.ANY) {
+ // leastRestrictive defined by calcite returns least restrictive
even among types of different families.
+ // We need to trim such variants.
+ if (!typeFamiliesAreCompatible(this, types)) {
+ return null;
+ }
+
+ return resultType;
+ }
+
+ // leastRestrictive defined by calcite returns an instance of
BasicSqlType that represents an ANY type,
+ // when at least one of its arguments have sqlTypeName = ANY.
+ assert resultType instanceof BasicSqlType : "leastRestrictive is
expected to return a new instance of a type: " + resultType;
+
if (hasAnyType && hasBuiltInType && firstCustomType != null) {
// There is no least restrictive type between ANY, built-in type,
and a custom data type.
return null;
@@ -558,8 +576,6 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
public RelDataType createTypeWithNullability(RelDataType type, boolean
nullable) {
if (type instanceof IgniteCustomType) {
return canonize(((IgniteCustomType)
type).createWithNullability(nullable));
- } else if (type.getSqlTypeName() == SqlTypeName.UUID) {
- return
canonize(createCustomType(UuidType.NAME).createWithNullability(nullable));
} else {
return super.createTypeWithNullability(type, nullable);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/UuidType.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/UuidType.java
deleted file mode 100644
index 83b1503aa40..00000000000
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/UuidType.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.sql.engine.type;
-
-import java.util.UUID;
-import org.apache.ignite.internal.type.NativeTypes;
-import org.apache.ignite.sql.ColumnType;
-
-/** UUID SQL type. */
-public final class UuidType extends IgniteCustomType {
-
- /** A string name of this type: {@code UUID}. **/
- public static final String NAME = "UUID";
-
- /** Type spec of this type. **/
- public static final IgniteCustomTypeSpec SPEC = new
IgniteCustomTypeSpec(NAME, NativeTypes.UUID,
- ColumnType.UUID, UUID.class,
IgniteCustomTypeSpec.getCastFunction(UuidType.class, "cast"));
-
- /** Constructor. */
- public UuidType(boolean nullable) {
- super(SPEC, nullable, PRECISION_NOT_SPECIFIED);
- }
-
- /** {@inheritDoc} */
- @Override protected void generateTypeString(StringBuilder sb, boolean
withDetail) {
- sb.append(NAME);
- }
-
- /** {@inheritDoc} */
- @Override
- public UuidType createWithNullability(boolean nullable) {
- return new UuidType(nullable);
- }
-
- /**
- * Implementation of a cast function for {@code UUID} data type.
- */
- public static UUID cast(Object value) {
- // It would be better to generate Expression tree that is equivalent
to the code below
- // from type checking rules for this type in order to avoid code
duplication.
- if (value instanceof String) {
- return UUID.fromString((String) value);
- } else {
- return (UUID) value;
- }
- }
-}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteCustomAssignmentsRules.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteCustomAssignmentsRules.java
index 833c897fde7..7e33a746934 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteCustomAssignmentsRules.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteCustomAssignmentsRules.java
@@ -130,10 +130,14 @@ public class IgniteCustomAssignmentsRules implements
SqlTypeMappingRule {
rule.add(SqlTypeName.TIME);
rule.add(SqlTypeName.TIMESTAMP);
rule.add(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE);
+ rule.add(SqlTypeName.UUID);
rules.add(SqlTypeName.CHAR, rule);
rules.add(SqlTypeName.VARCHAR, rule);
+ // UUID is assignable from...
+ rules.add(SqlTypeName.UUID, EnumSet.of(SqlTypeName.UUID,
SqlTypeName.CHAR, SqlTypeName.VARCHAR));
+
// BOOLEAN is assignable from...
rules.add(SqlTypeName.BOOLEAN, EnumSet.of(SqlTypeName.BOOLEAN,
SqlTypeName.CHAR, SqlTypeName.VARCHAR));
@@ -243,6 +247,7 @@ public class IgniteCustomAssignmentsRules implements
SqlTypeMappingRule {
rule.add(SqlTypeName.DATE);
rule.add(SqlTypeName.TIMESTAMP);
rule.add(SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE);
+ rule.add(SqlTypeName.UUID);
rules.add(SqlTypeName.ANY, rule);
INSTANCE = new IgniteCustomAssignmentsRules(rules.map);
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/TypeUtils.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/TypeUtils.java
index bc06f8356da..9583221959d 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/TypeUtils.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/TypeUtils.java
@@ -69,7 +69,6 @@ import
org.apache.ignite.internal.sql.engine.exec.row.TypeSpec;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
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.type.DecimalNativeType;
import org.apache.ignite.internal.type.NativeType;
import org.apache.ignite.internal.type.NativeTypeSpec;
@@ -497,6 +496,8 @@ public class TypeUtils {
return ColumnType.DURATION;
case NULL:
return ColumnType.NULL;
+ case UUID:
+ return ColumnType.UUID;
default:
throw new IllegalArgumentException("Unexpected type: " +
type.getSqlTypeName());
}
@@ -532,8 +533,7 @@ public class TypeUtils {
return factory.createSqlType(SqlTypeName.DECIMAL,
decimal.precision(), decimal.scale());
case UUID:
- IgniteTypeFactory concreteTypeFactory = (IgniteTypeFactory)
factory;
- return concreteTypeFactory.createCustomType(UuidType.NAME);
+ return factory.createSqlType(SqlTypeName.UUID);
case STRING: {
assert nativeType instanceof VarlenNativeType;
@@ -964,18 +964,9 @@ public class TypeUtils {
*/
// TODO this method can be removed after
https://issues.apache.org/jira/browse/IGNITE-22295
public static boolean typesRepresentTheSameColumnTypes(RelDataType lhs,
RelDataType rhs) {
- // IgniteCustomType: check for custom data type, otherwise this
expression can fail when type is converted into column type.
- if (isCustomType(lhs) && isCustomType(rhs) ||
SqlTypeUtil.isAtomic(lhs) && SqlTypeUtil.isAtomic(rhs)) {
- ColumnType col1 = columnType(lhs);
- ColumnType col2 = columnType(rhs);
-
- return col1 == col2;
- } else {
- return false;
- }
- }
+ ColumnType col1 = columnType(lhs);
+ ColumnType col2 = columnType(rhs);
- private static boolean isCustomType(RelDataType type) {
- return type instanceof IgniteCustomType;
+ return col1 == col2;
}
}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/ExpressionFactoryImplTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/ExpressionFactoryImplTest.java
index a5794385abf..2d29760760e 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/ExpressionFactoryImplTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/ExpressionFactoryImplTest.java
@@ -726,19 +726,17 @@ public class ExpressionFactoryImplTest extends
BaseIgniteAbstractTest {
* </ul>
*
* @param columnType Column type.
- * @param literalsOnly Flag indicating that the list of input expressions
should contain only literals.
*/
@ParameterizedTest(name = "type={0}, literals={1}")
@MethodSource("rowSourceTestArgs")
- public void testRowSource(ColumnType columnType, boolean literalsOnly) {
+ public void testRowSource(ColumnType columnType) {
Object val =
SqlTestUtils.generateValueByTypeWithMaxScalePrecisionForSql(columnType);
- RexNode expr1 = SqlTestUtils.generateLiteralOrValueExpr(columnType,
val);
+ RexNode expr1 = SqlTestUtils.generateLiteral(columnType, val);
assertInstanceOf(RexLiteral.class, expr1);
- Object val2 = literalsOnly ? 1 : randomUUID();
- RexNode expr2 = SqlTestUtils.generateLiteralOrValueExpr(literalsOnly ?
ColumnType.INT32 : ColumnType.UUID, val2);
- assertEquals(literalsOnly, expr2 instanceof RexLiteral);
+ Object val2 = randomUUID();
+ RexNode expr2 = SqlTestUtils.generateLiteral(ColumnType.UUID, val2);
ExpressionFactoryImpl<Object[]> expFactorySpy =
Mockito.spy(expFactory);
@@ -877,8 +875,6 @@ public class ExpressionFactoryImplTest extends
BaseIgniteAbstractTest {
private static List<Arguments> rowSourceTestArgs() {
EnumSet<ColumnType> ignoredTypes = EnumSet.of(
- // UUID literal doesn't exists.
- ColumnType.UUID,
// TODO https://issues.apache.org/jira/browse/IGNITE-17373
ColumnType.DURATION,
ColumnType.PERIOD
@@ -891,8 +887,7 @@ public class ExpressionFactoryImplTest extends
BaseIgniteAbstractTest {
continue;
}
- arguments.add(Arguments.of(columnType, true));
- arguments.add(Arguments.of(columnType, false));
+ arguments.add(Arguments.of(columnType));
}
return arguments;
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/CastResolutionTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/CastResolutionTest.java
index 2f8514b3abb..34f390bc6cd 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/CastResolutionTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/CastResolutionTest.java
@@ -50,7 +50,6 @@ import java.util.stream.Stream;
import org.apache.calcite.sql.type.SqlTypeCoercionRule;
import org.apache.calcite.sql.type.SqlTypeMappingRule;
import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.internal.sql.engine.util.IgniteCustomAssignmentsRules;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
@@ -108,7 +107,7 @@ public class CastResolutionTest extends AbstractPlannerTest
{
ALL_BESIDES_BINARY_NAMES.addAll(YM_INTERVAL);
ALL_BESIDES_BINARY_NAMES.addAll(DAY_INTERVAL);
ALL_BESIDES_BINARY_NAMES.add("NUMERIC");
- ALL_BESIDES_BINARY_NAMES.add(UuidType.NAME);
+ ALL_BESIDES_BINARY_NAMES.add(SqlTypeName.UUID.getName());
CHAR_NUMERIC_AND_INTERVAL_NAMES.addAll(NUMERIC_NAMES);
CHAR_NUMERIC_AND_INTERVAL_NAMES.addAll(CHAR_NAMES);
@@ -333,7 +332,7 @@ public class CastResolutionTest extends AbstractPlannerTest
{
NUMERIC("NUMERIC", CHAR_NUMERIC_AND_INTERVAL_NAMES),
- UUID(UuidType.NAME, new HashSet<>(CHAR_NAMES)),
+ UUID(SqlTypeName.UUID.getName(), new HashSet<>(CHAR_NAMES)),
VARCHAR(SqlTypeName.VARCHAR.getName(), ALL_BESIDES_BINARY_NAMES),
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
index 62fa935a32b..006d5238b35 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DmlPlannerTest.java
@@ -17,6 +17,8 @@
package org.apache.ignite.internal.sql.engine.planner;
+import static org.apache.ignite.internal.sql.engine.util.Commons.cast;
+
import java.util.List;
import java.util.UUID;
import java.util.function.Predicate;
@@ -297,6 +299,8 @@ public class DmlPlannerTest extends AbstractPlannerTest {
kvModifyNodeWithExpressionsOfExpectedTypes
);
+ Predicate<IgniteValues> valuesNodeWithProjectionsOfExpectedTypes =
isInstanceOf(IgniteValues.class)
+ .and(project ->
expressionsAsOfExpectedType.test(cast(project.getTuples().get(0))));
Predicate<IgniteProject> projectNodeWithProjectionsOfExpectedTypes =
isInstanceOf(IgniteProject.class)
.and(project ->
expressionsAsOfExpectedType.test(project.getProjects()));
@@ -305,7 +309,7 @@ public class DmlPlannerTest extends AbstractPlannerTest {
schema,
hasChildThat(
isInstanceOf(IgniteUnionAll.class)
- .and(input(0,
projectNodeWithProjectionsOfExpectedTypes))
+ .and(input(0,
valuesNodeWithProjectionsOfExpectedTypes))
.and(input(1,
projectNodeWithProjectionsOfExpectedTypes))
)
);
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DynamicParametersTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DynamicParametersTest.java
index 5987580fe7d..caa2a88c4a4 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DynamicParametersTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/DynamicParametersTest.java
@@ -880,12 +880,12 @@ public class DynamicParametersTest extends
AbstractPlannerTest {
checkStatement()
.sql("SELECT COALESCE(?, 'UUID'::UUID)", new UUID(0,
0))
.parameterTypes(nullable(NativeTypes.UUID))
- .project("CASE(IS NOT NULL(?0), ?0,
CAST(_UTF-8'UUID'):UUID NOT NULL)"),
+ .project("CASE(IS NOT NULL(?0), CAST(?0):UUID NOT
NULL, CAST(_UTF-8'UUID'):UUID NOT NULL)"),
checkStatement()
.sql("SELECT NULLIF(?, 'UUID'::UUID)", new UUID(0, 0))
.parameterTypes(nullable(NativeTypes.UUID))
- .project("CASE(=(?0, CAST(_UTF-8'UUID'):UUID NOT
NULL), null:NULL, ?0)"),
+ .project("CASE(=(?0, CAST(_UTF-8'UUID'):UUID NOT
NULL), null:UUID, ?0)"),
// Set operations
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
index 3f54c5f7129..f8e98f05b1d 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
@@ -18,7 +18,7 @@
package org.apache.ignite.internal.sql.engine.prepare.pruning;
import static java.util.UUID.randomUUID;
-import static
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.generateLiteralOrValueExpr;
+import static
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.generateLiteral;
import static org.junit.jupiter.api.Assertions.assertEquals;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
@@ -106,7 +106,7 @@ public class PartitionPruningPredicateSelfTest extends
BaseIgniteAbstractTest {
int fieldIndex = 0;
Object val = generateFieldValue(table, fieldIndex);
- RexNode expr = generateLiteralOrValueExpr(columnType, val);
+ RexNode expr = generateLiteral(columnType, val);
PartitionPruningColumns columns = new
PartitionPruningColumns(List.of(Int2ObjectMaps.singleton(fieldIndex, expr)));
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java
index fedc9f56352..378020473e7 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java
@@ -44,6 +44,7 @@ import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlNumericLiteral;
import org.apache.calcite.sql.SqlUnknownLiteral;
+import org.apache.calcite.sql.ddl.SqlColumnDeclaration;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.ignite.lang.ErrorGroups.Sql;
import org.hamcrest.CustomMatcher;
@@ -99,10 +100,10 @@ public class SqlDdlParserTest extends AbstractParserTest {
assertThat(createTable.name().names, is(List.of("MY_TABLE")));
assertThat(createTable.columnList(), hasItem(ofTypeMatching(
"Column with function's identifier as default",
- IgniteSqlColumnDeclaration.class,
- col -> "ID".equals(col.name().getSimple())
- && col.expression() instanceof SqlIdentifier
- && "RAND_UUID".equals(((SqlIdentifier)
col.expression()).getSimple())
+ SqlColumnDeclaration.class,
+ col -> "ID".equals(col.name.getSimple())
+ && col.expression instanceof SqlIdentifier
+ && "RAND_UUID".equals(((SqlIdentifier)
col.expression).getSimple())
)));
assertThat(createTable.columnList(), hasItem(ofTypeMatching(
"PK constraint with name \"ID\"",
IgniteSqlPrimaryKeyConstraint.class,
@@ -251,7 +252,7 @@ public class SqlDdlParserTest extends AbstractParserTest {
() -> parse(stmt));
}
- private <T extends SqlLiteral> Matcher<Iterable<? super
IgniteSqlColumnDeclaration>> hasColumnWithDefault(
+ private <T extends SqlLiteral> Matcher<Iterable<? super
SqlColumnDeclaration>> hasColumnWithDefault(
String columnName,
Class<T> nodeType,
String literalValue
@@ -264,7 +265,7 @@ public class SqlDdlParserTest extends AbstractParserTest {
);
}
- private static <T extends SqlNode> Matcher<Iterable<? super
IgniteSqlColumnDeclaration>> hasColumnWithDefaultExpr(
+ private static <T extends SqlNode> Matcher<Iterable<? super
SqlColumnDeclaration>> hasColumnWithDefaultExpr(
String columnName,
Class<T> nodeType,
String message,
@@ -272,10 +273,10 @@ public class SqlDdlParserTest extends AbstractParserTest {
) {
return hasItem(ofTypeMatching(
message,
- IgniteSqlColumnDeclaration.class,
- col -> columnName.equals(col.name().getSimple())
- && nodeType.isInstance(col.expression())
- && valCheck.test(nodeType.cast(col.expression()))
+ SqlColumnDeclaration.class,
+ col -> columnName.equals(col.name.getSimple())
+ && nodeType.isInstance(col.expression)
+ && valCheck.test(nodeType.cast(col.expression))
));
}
@@ -909,12 +910,12 @@ public class SqlDdlParserTest extends AbstractParserTest {
SqlNode sqlNode = parse("ALTER TABLE t ADD COLUMN c INT");
IgniteSqlAlterTableAddColumn addColumn =
assertInstanceOf(IgniteSqlAlterTableAddColumn.class, sqlNode);
- IgniteSqlColumnDeclaration declaration = (IgniteSqlColumnDeclaration)
addColumn.columns().get(0);
+ SqlColumnDeclaration declaration = (SqlColumnDeclaration)
addColumn.columns().get(0);
assertThat(addColumn.name.names, is(List.of("T")));
expectColumnBasic(declaration, "C", ColumnStrategy.NULLABLE,
"INTEGER", true);
- assertThat(declaration.expression(), is(nullValue()));
+ assertThat(declaration.expression, is(nullValue()));
expectUnparsed(addColumn, "ALTER TABLE \"T\" ADD COLUMN \"C\"
INTEGER");
}
@@ -924,12 +925,12 @@ public class SqlDdlParserTest extends AbstractParserTest {
SqlNode sqlNode = parse("ALTER TABLE t ADD COLUMN c INT NULL");
IgniteSqlAlterTableAddColumn addColumn =
assertInstanceOf(IgniteSqlAlterTableAddColumn.class, sqlNode);
- IgniteSqlColumnDeclaration column = (IgniteSqlColumnDeclaration)
addColumn.columns().get(0);
+ SqlColumnDeclaration column = (SqlColumnDeclaration)
addColumn.columns().get(0);
assertThat(addColumn.name.names, is(List.of("T")));
expectColumnBasic(column, "C", ColumnStrategy.NULLABLE, "INTEGER",
true);
- assertThat(column.expression(), is(nullValue()));
+ assertThat(column.expression, is(nullValue()));
expectUnparsed(addColumn, "ALTER TABLE \"T\" ADD COLUMN \"C\"
INTEGER");
}
@@ -939,12 +940,12 @@ public class SqlDdlParserTest extends AbstractParserTest {
SqlNode sqlNode = parse("ALTER TABLE t ADD COLUMN c INT NOT NULL");
IgniteSqlAlterTableAddColumn addColumn =
assertInstanceOf(IgniteSqlAlterTableAddColumn.class, sqlNode);
- IgniteSqlColumnDeclaration column = (IgniteSqlColumnDeclaration)
addColumn.columns().get(0);
+ SqlColumnDeclaration column = (SqlColumnDeclaration)
addColumn.columns().get(0);
assertThat(addColumn.name.names, is(List.of("T")));
expectColumnBasic(column, "C", ColumnStrategy.NOT_NULLABLE, "INTEGER",
false);
- assertThat(column.expression(), is(nullValue()));
+ assertThat(column.expression, is(nullValue()));
expectUnparsed(addColumn, "ALTER TABLE \"T\" ADD COLUMN \"C\" INTEGER
NOT NULL");
}
@@ -1037,25 +1038,25 @@ public class SqlDdlParserTest extends
AbstractParserTest {
* @param name Expected name.
* @return {@code true} in case name in the column declaration equals to
the expected one.
*/
- private static <T extends IgniteSqlColumnDeclaration> Matcher<T>
columnWithName(String name) {
+ private static <T extends SqlColumnDeclaration> Matcher<T>
columnWithName(String name) {
return new CustomMatcher<T>("column with name=" + name) {
/** {@inheritDoc} */
@Override
public boolean matches(Object item) {
- return item instanceof IgniteSqlColumnDeclaration
- && ((IgniteSqlColumnDeclaration)
item).name().names.get(0).equals(name);
+ return item instanceof SqlColumnDeclaration
+ && ((SqlColumnDeclaration)
item).name.names.get(0).equals(name);
}
};
}
/** Checks basic column properties such as name, type name and type's
nullability. */
- private static void expectColumnBasic(IgniteSqlColumnDeclaration
declaration,
+ private static void expectColumnBasic(SqlColumnDeclaration declaration,
String columnName, ColumnStrategy columnStrategy,
String typeName, Boolean nullable) {
- assertThat(List.of(columnName), is(declaration.name().names));
- assertThat(columnStrategy, is(declaration.strategy()));
- assertThat(List.of(typeName),
is(declaration.dataType().getTypeName().names));
- assertThat(nullable, is(declaration.dataType().getNullable()));
+ assertThat(List.of(columnName), is(declaration.name.names));
+ assertThat(columnStrategy, is(declaration.strategy));
+ assertThat(List.of(typeName),
is(declaration.dataType.getTypeName().names));
+ assertThat(nullable, is(declaration.dataType.getNullable()));
}
}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactorySelfTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactorySelfTest.java
deleted file mode 100644
index 312a4bae595..00000000000
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactorySelfTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.sql.engine.type;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.ignite.internal.sql.engine.util.Commons;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests for {@link IgniteTypeFactory}.
- */
-public class IgniteTypeFactorySelfTest extends BaseIgniteAbstractTest {
-
- @Test
- public void createUuidProducesIgniteUuid() {
- IgniteTypeFactory typeFactory = Commons.typeFactory();
-
- RelDataType uuid = typeFactory.createSqlType(SqlTypeName.UUID);
- assertInstanceOf(UuidType.class, uuid);
- assertFalse(uuid.isNullable());
-
- RelDataType varchar = typeFactory.createSqlType(SqlTypeName.VARCHAR);
- assertEquals(varchar.isNullable(), uuid.isNullable(), "default
nullability");
-
- // Use customType method
- assertEquals(typeFactory.createCustomType(UuidType.NAME), uuid);
-
- // Nullable
- RelDataType nullable = typeFactory.createTypeWithNullability(uuid,
true);
- assertTrue(nullable.isNullable());
- assertNotEquals(uuid, nullable, uuid.getFullTypeString() + " | " +
nullable.getFullTypeString());
-
- // Not Nullable
- RelDataType notNullable = typeFactory.createTypeWithNullability(uuid,
false);
- assertFalse(notNullable.isNullable());
- assertEquals(uuid, notNullable, uuid.getFullTypeString() + " | " +
notNullable.getFullTypeString());
- }
-}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/TypeUtilsTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/TypeUtilsTest.java
index 20bf8be5e93..4a46aa7ddd6 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/TypeUtilsTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/TypeUtilsTest.java
@@ -53,7 +53,6 @@ import
org.apache.ignite.internal.sql.engine.framework.ArrayRowHandler;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomTypeSpec;
import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.apache.ignite.internal.type.NativeTypeSpec;
import org.apache.ignite.internal.type.NativeTypes;
@@ -464,8 +463,7 @@ public class TypeUtilsTest extends BaseIgniteAbstractTest {
testCaseList.add(new
RelToExecTestCase(TYPE_FACTORY.createSqlIntervalType(dayTime), INT64));
}
- // IgniteCustomTypes
- testCaseList.add(new
RelToExecTestCase(TYPE_FACTORY.createCustomType(UuidType.NAME), UUID));
+ testCaseList.add(new RelToExecTestCase(SqlTypeName.UUID, UUID));
// Add test cases for nullable variants
for (RelToExecTestCase testCase : new ArrayList<>(testCaseList)) {
diff --git
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
index d3dc43f600b..76fb0552495 100644
---
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
+++
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/SqlTestUtils.java
@@ -56,7 +56,6 @@ import java.util.stream.StreamSupport;
import org.apache.calcite.avatica.util.ByteString;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.util.DateString;
@@ -65,10 +64,8 @@ import org.apache.calcite.util.TimestampString;
import org.apache.ignite.internal.sql.engine.InternalSqlRow;
import org.apache.ignite.internal.sql.engine.QueryCancelledException;
import org.apache.ignite.internal.sql.engine.SqlQueryProcessor;
-import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
import org.apache.ignite.internal.sql.engine.type.IgniteTypeSystem;
-import org.apache.ignite.internal.sql.engine.type.UuidType;
import org.apache.ignite.internal.testframework.IgniteTestUtils;
import org.apache.ignite.internal.type.DecimalNativeType;
import org.apache.ignite.internal.type.NativeType;
@@ -122,7 +119,7 @@ public class SqlTestUtils {
COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.STRING,
SqlTypeName.VARCHAR);
COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.BYTE_ARRAY,
SqlTypeName.VARBINARY);
COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.NULL,
SqlTypeName.NULL);
- COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.UUID, SqlTypeName.ANY);
+ COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.UUID,
SqlTypeName.UUID);
COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.PERIOD, null);
COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.put(ColumnType.DURATION, null);
@@ -213,15 +210,6 @@ public class SqlTestUtils {
public static String toSqlType(ColumnType columnType) {
SqlTypeName type = COLUMN_TYPE_TO_SQL_TYPE_NAME_MAP.get(columnType);
- if (type == SqlTypeName.ANY) {
- switch (columnType) {
- case UUID:
- return UuidType.NAME;
- default:
- throw new IllegalArgumentException("Unsupported type " +
columnType);
- }
- }
-
if (type == null) {
throw new IllegalArgumentException("Unsupported type " +
columnType);
}
@@ -427,8 +415,9 @@ public class SqlTestUtils {
case BYTE_ARRAY:
assert value instanceof byte[];
return "X'" + StringUtils.toHexString((byte[]) value) + "'";
- case NULL:
case UUID:
+ return "UUID '" + value + "'";
+ case NULL:
case PERIOD:
case DURATION:
throw new IllegalArgumentException("The type " + type + "
isn't supported right now");
@@ -461,8 +450,8 @@ public class SqlTestUtils {
return result;
}
- /** Generates literal or value expression using specified column type and
value. */
- public static RexNode generateLiteralOrValueExpr(ColumnType type,
@Nullable Object value) {
+ /** Generates literal using specified column type and value. */
+ public static RexNode generateLiteral(ColumnType type, @Nullable Object
value) {
RexBuilder rexBuilder = Commons.rexBuilder();
IgniteTypeFactory typeFactory = Commons.typeFactory();
@@ -512,11 +501,7 @@ public class SqlTestUtils {
return
rexBuilder.makeTimestampLiteral(TimestampString.fromMillisSinceEpoch(requireNonNull(instant).toEpochMilli()),
6);
case UUID:
- RexLiteral uuidStr =
rexBuilder.makeLiteral(requireNonNull(value).toString(),
- typeFactory.createSqlType(SqlTypeName.VARCHAR));
- IgniteCustomType uuidType =
typeFactory.createCustomType(UuidType.NAME);
-
- return rexBuilder.makeCast(uuidType, uuidStr);
+ return rexBuilder.makeUuidLiteral((UUID) value);
case STRING:
return rexBuilder.makeLiteral(value,
typeFactory.createSqlType(SqlTypeName.VARCHAR));
case BYTE_ARRAY: