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

ppa 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 16caf8f396 IGNITE-19103 Sql. Change implicit primary key column's type 
to UUID (#3786)
16caf8f396 is described below

commit 16caf8f3966e9256cfdaafc7f267af9be3c205f9
Author: Max Zhuravkov <[email protected]>
AuthorDate: Wed May 22 13:54:44 2024 +0300

    IGNITE-19103 Sql. Change implicit primary key column's type to UUID (#3786)
---
 assembly/README.md                                 |  2 +-
 docs/_docs/sql-reference/grammar-reference.adoc    |  6 +++---
 .../commands/AlterTableAlterColumnCommand.java     |  2 +-
 .../internal/catalog/commands/CatalogUtils.java    | 24 ++++++++++-----------
 .../catalog/commands/CreateTableCommand.java       |  2 +-
 .../AlterTableAddColumnCommandValidationTest.java  |  2 +-
 ...AlterTableAlterColumnCommandValidationTest.java | 13 ++++++-----
 .../commands/CreateTableCommandValidationTest.java |  3 ++-
 .../internal/schema/DefaultValueGenerator.java     | 10 ++++-----
 .../CatalogToSchemaDescriptorConverterTest.java    |  2 +-
 .../sql/engine/ItAlterTableAlterColumnTest.java    | 10 ++++-----
 .../internal/sql/engine/ItCreateTableDdlTest.java  |  8 +++----
 .../sql/engine/ItHashSpoolIntegrationTest.java     |  6 +++---
 .../sql/engine/exec/exp/IgniteSqlFunctions.java    |  6 +++---
 .../internal/sql/engine/exec/exp/RexImpTable.java  |  3 +--
 .../prepare/ddl/DdlSqlToCommandConverter.java      |  6 ++++--
 .../internal/sql/engine/rel/IgniteProject.java     |  4 ++--
 .../sql/engine/schema/TableDescriptorImpl.java     |  2 +-
 .../sql/engine/sql/fun/IgniteSqlOperatorTable.java | 25 ----------------------
 .../sql/engine/type/IgniteCustomTypeSpec.java      |  5 ++---
 .../internal/sql/engine/util/IgniteMethod.java     |  6 +-----
 .../sql/engine/prepare/TypeCoercionTest.java       |  2 --
 .../prepare/ddl/DdlSqlToCommandConverterTest.java  |  8 +++----
 .../engine/schema/SqlSchemaManagerImplTest.java    |  8 +++----
 .../internal/sql/engine/sql/SqlDdlParserTest.java  |  6 +++---
 25 files changed, 70 insertions(+), 101 deletions(-)

diff --git a/assembly/README.md b/assembly/README.md
index 7331cbf9ce..a2cd7c5440 100644
--- a/assembly/README.md
+++ b/assembly/README.md
@@ -12,7 +12,7 @@ with system services.
 additional network transmissions and lowers operations latency.
 * C++ client:  Basic C++ client, able to perform operations on data.
 * Autogenerated values: now a function can be specified as a default value 
generator during a table creation.
-Currently only gen_random_uuid is supported.
+Currently only rand_uuid is supported.
 * SQL Transactions.
 * Transactional Protocol: improved locking model, multi-version based
 lock-free read-only transactions.
diff --git a/docs/_docs/sql-reference/grammar-reference.adoc 
b/docs/_docs/sql-reference/grammar-reference.adoc
index 44a9acfff0..80d8fb18de 100644
--- a/docs/_docs/sql-reference/grammar-reference.adoc
+++ b/docs/_docs/sql-reference/grammar-reference.adoc
@@ -166,7 +166,7 @@ Keywords and parameters:
 
 * `column_name` - a column name.
 * `DATA TYPE` - the link:sql-reference/data-types[data type] allowed in the 
column.
-* `identifier` - the random identifier for the row. Can be generated by using 
the <<gen_random_uuid>> function.
+* `identifier` - the random identifier for the row. Can be generated by using 
the <<rand_uuid>> function.
 * `literal_value` - a value to be assigned as default.
 * `CURRENT TIMESTAMP` - the function that returns current time. Can only be 
used for `TIMESTAMP` columns.
 * `interval` - the time interval by which the timestamp should be offset.
@@ -227,7 +227,7 @@ Referenced by:
 
 == System Functions
 
-=== gen_random_uuid
+=== rand_uuid
 
 This function generates a random UUID value each time it is called.
 
@@ -235,7 +235,7 @@ Example:
 
 [source,sql]
 ----
-CREATE TABLE t (id varchar default gen_random_uuid primary key, val int)
+CREATE TABLE t (id uuid default rand_uuid primary key, val int)
 ----
 
 Referenced by:
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommand.java
index 1fda646d11..6559b59ce6 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommand.java
@@ -152,7 +152,7 @@ public class AlterTableAlterColumnCommand extends 
AbstractTableCommand {
         if (deferredDefault != null) {
             DefaultValue defaultValue = deferredDefault.derive(origin.type());
 
-            CatalogUtils.ensureSupportedDefault(columnName, defaultValue);
+            CatalogUtils.ensureSupportedDefault(columnName, origin.type(), 
defaultValue);
         }
     }
 
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index 269ec442b9..67834813b8 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -26,7 +26,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.util.Collection;
 import java.util.EnumMap;
 import java.util.EnumSet;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -127,7 +127,7 @@ public class CatalogUtils {
     /**
      * Functions that are allowed to be used as columns' functional default. 
The set contains uppercase function names.
      */
-    private static final Set<String> FUNCTIONAL_DEFAULT_FUNCTIONS = new 
HashSet<>();
+    private static final Map<String, ColumnType> FUNCTIONAL_DEFAULT_FUNCTIONS 
= new HashMap<>();
 
     static {
         ALTER_COLUMN_TYPE_TRANSITIONS.put(ColumnType.INT8, 
EnumSet.of(ColumnType.INT8, ColumnType.INT16, ColumnType.INT32,
@@ -141,7 +141,7 @@ public class CatalogUtils {
         ALTER_COLUMN_TYPE_TRANSITIONS.put(ColumnType.BYTE_ARRAY, 
EnumSet.of(ColumnType.BYTE_ARRAY));
         ALTER_COLUMN_TYPE_TRANSITIONS.put(ColumnType.DECIMAL, 
EnumSet.of(ColumnType.DECIMAL));
 
-        FUNCTIONAL_DEFAULT_FUNCTIONS.add("GEN_RANDOM_UUID");
+        FUNCTIONAL_DEFAULT_FUNCTIONS.put("RAND_UUID", ColumnType.UUID);
     }
 
     public static final List<String> SYSTEM_SCHEMAS = 
List.of(SYSTEM_SCHEMA_NAME);
@@ -593,28 +593,28 @@ public class CatalogUtils {
         return defaultZone != null ? defaultZone.id() : null;
     }
 
-    /**
-     * Return {@code true} if a function with given name is allowed to be used 
as functional default for a column, {@code false} otherwise.
-     */
-    static boolean isSupportedFunctionalDefault(String functionName) {
-        return 
FUNCTIONAL_DEFAULT_FUNCTIONS.contains(functionName.toUpperCase());
-    }
-
     /**
      * Check if provided default value is a constant or a functional default 
of supported function, or fail otherwise.
      */
-    static void ensureSupportedDefault(String columnName, @Nullable 
DefaultValue defaultValue) {
+    static void ensureSupportedDefault(String columnName, ColumnType 
columnType, @Nullable DefaultValue defaultValue) {
         if (defaultValue == null || defaultValue.type == Type.CONSTANT) {
             return;
         }
 
         if (defaultValue.type == FUNCTION_CALL) {
             String functionName = ((FunctionCall) defaultValue).functionName();
+            ColumnType returnType = 
FUNCTIONAL_DEFAULT_FUNCTIONS.get(functionName.toUpperCase());
 
-            if (isSupportedFunctionalDefault(functionName)) {
+            if (returnType == columnType) {
                 return;
             }
 
+            if (returnType != null) {
+                throw new CatalogValidationException(
+                        format("Functional default type mismatch: [col={}, 
functionName={}, expectedType={}, actualType={}]",
+                                columnName, functionName, returnType, 
columnType));
+            }
+
             throw new CatalogValidationException(
                     format("Functional default contains unsupported function: 
[col={}, functionName={}]",
                             columnName, functionName));
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
index 7a05f4458e..63f0b5f732 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
@@ -179,7 +179,7 @@ public class CreateTableCommand extends 
AbstractTableCommand {
         for (ColumnParams column : columns) {
             boolean partOfPk = primaryKey.columns().contains(column.name());
             if (partOfPk) {
-                CatalogUtils.ensureSupportedDefault(column.name(), 
column.defaultValueDefinition());
+                CatalogUtils.ensureSupportedDefault(column.name(), 
column.type(), column.defaultValueDefinition());
             } else {
                 CatalogUtils.ensureNonFunctionalDefault(column.name(), 
column.defaultValueDefinition());
             }
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAddColumnCommandValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAddColumnCommandValidationTest.java
index 7b2a831512..f741f410af 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAddColumnCommandValidationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAddColumnCommandValidationTest.java
@@ -178,7 +178,7 @@ public class AlterTableAddColumnCommandValidationTest 
extends AbstractCommandVal
         );
 
         ColumnParams columnParams = 
ColumnParams.builder().name(columnName).type(STRING).length(10)
-                
.defaultValue(DefaultValue.functionCall("gen_random_uuid")).build();
+                .defaultValue(DefaultValue.functionCall("rand_uuid")).build();
 
         AlterTableAddColumnCommandBuilder builder = 
AlterTableAddColumnCommand.builder()
                 .schemaName(SCHEMA_NAME)
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommandValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommandValidationTest.java
index c9a15803ec..8f8b472bcc 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommandValidationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AlterTableAlterColumnCommandValidationTest.java
@@ -23,6 +23,7 @@ import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThr
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.catalog.Catalog;
 import org.apache.ignite.internal.catalog.CatalogCommand;
@@ -546,14 +547,12 @@ public class AlterTableAlterColumnCommandValidationTest 
extends AbstractCommandV
                                 .build(),
                         ColumnParams.builder()
                                 .name(columnName)
-                                .type(ColumnType.STRING)
-                                .length(10)
+                                .type(ColumnType.UUID)
                                 .build(),
                         ColumnParams.builder()
                                 .name(columnName2)
-                                .type(ColumnType.STRING)
-                                .length(10)
-                                .defaultValue(DefaultValue.constant("some 
string"))
+                                .type(ColumnType.UUID)
+                                
.defaultValue(DefaultValue.constant(UUID.randomUUID()))
                                 .build())
                 )
                 .primaryKey(primaryKey("ID"))
@@ -567,7 +566,7 @@ public class AlterTableAlterColumnCommandValidationTest 
extends AbstractCommandV
                     .schemaName(SCHEMA_NAME)
                     .tableName(tableName)
                     .columnName(columnName)
-                    .deferredDefaultValue(type -> 
DefaultValue.functionCall("gen_random_uuid"))
+                    .deferredDefaultValue(type -> 
DefaultValue.functionCall("rand_uuid"))
                     .build();
 
             assertThrowsWithCause(
@@ -583,7 +582,7 @@ public class AlterTableAlterColumnCommandValidationTest 
extends AbstractCommandV
                     .schemaName(SCHEMA_NAME)
                     .tableName(tableName)
                     .columnName(columnName2)
-                    .deferredDefaultValue(type -> 
DefaultValue.functionCall("gen_random_uuid"))
+                    .deferredDefaultValue(type -> 
DefaultValue.functionCall("rand_uuid"))
                     .build();
 
             assertThrowsWithCause(
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
index 7a5bc311d2..8c2e93ec0d 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.catalog.commands;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.sql.ColumnType.INT32;
+import static org.apache.ignite.sql.ColumnType.UUID;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 
 import java.util.List;
@@ -112,7 +113,7 @@ public class CreateTableCommandValidationTest extends 
AbstractCommandValidationT
         builder = fillProperties(builder);
 
         builder.columns(List.of(
-                
ColumnParams.builder().name("C").type(INT32).defaultValue(DefaultValue.functionCall("gen_random_uuid")).build(),
+                
ColumnParams.builder().name("C").type(UUID).defaultValue(DefaultValue.functionCall("rand_uuid")).build(),
                 
ColumnParams.builder().name("D").type(INT32).defaultValue(DefaultValue.constant(1)).build()
 
         )).primaryKey(primaryKey("C", "D"));
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/DefaultValueGenerator.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/DefaultValueGenerator.java
index dcd7ef5e6f..a5d7b71ed0 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/DefaultValueGenerator.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/DefaultValueGenerator.java
@@ -27,8 +27,8 @@ import java.util.UUID;
  * (i.e. could be specified as a default in column definition).
  */
 public enum DefaultValueGenerator {
-    /** Generator that generates random UUID string. */
-    GEN_RANDOM_UUID("genRandomUuid", String.class);
+    /** Generator that generates random UUID. */
+    RAND_UUID("randUuid", UUID.class);
 
     private final MethodHandle methodHandle;
 
@@ -51,9 +51,9 @@ public enum DefaultValueGenerator {
         }
     }
 
-    /** Returns random UUID string. */
+    /** Returns random UUID. */
     @SuppressWarnings("unused") // actually method is called via reflection
-    public static String genRandomUuid() {
-        return UUID.randomUUID().toString();
+    public static UUID randUuid() {
+        return UUID.randomUUID();
     }
 }
diff --git 
a/modules/schema/src/test/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverterTest.java
 
b/modules/schema/src/test/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverterTest.java
index 488faceef5..8a5376fbd1 100644
--- 
a/modules/schema/src/test/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverterTest.java
+++ 
b/modules/schema/src/test/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverterTest.java
@@ -105,7 +105,7 @@ public class CatalogToSchemaDescriptorConverterTest extends 
AbstractSchemaConver
     @Test
     public void convertColumnDescriptorFunctionalDefault() {
         String columnName = "UUID";
-        String functionName = DefaultValueGenerator.GEN_RANDOM_UUID.name();
+        String functionName = DefaultValueGenerator.RAND_UUID.name();
         DefaultValue defaultValue = DefaultValue.functionCall(functionName);
 
         CatalogTableColumnDescriptor columnDescriptor = new 
CatalogTableColumnDescriptor(
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAlterTableAlterColumnTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAlterTableAlterColumnTest.java
index 1262a776cf..6f5c68f58a 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAlterTableAlterColumnTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItAlterTableAlterColumnTest.java
@@ -222,20 +222,20 @@ public class ItAlterTableAlterColumnTest extends 
BaseSqlIntegrationTest {
     @Test
     @SuppressWarnings("ThrowableNotThrown")
     public void functionalDefaultIsNotSupportedForNonPkColumns() {
-        sql("CREATE TABLE t (id VARCHAR PRIMARY KEY, val VARCHAR)");
+        sql("CREATE TABLE t (id UUID PRIMARY KEY, val VARCHAR)");
 
         // PK column
         assertThrowsSqlException(
                 STMT_PARSE_ERR,
-                "Failed to parse query: Encountered \"gen_random_uuid\"",
-                () -> sql("ALTER TABLE t ALTER COLUMN id SET DEFAULT 
gen_random_uuid")
+                "Failed to parse query: Encountered \"rand_uuid\"",
+                () -> sql("ALTER TABLE t ALTER COLUMN id SET DEFAULT 
rand_uuid")
         );
 
         // Non-pk column
         assertThrowsSqlException(
                 STMT_PARSE_ERR,
-                "Failed to parse query: Encountered \"gen_random_uuid\"",
-                () -> sql("ALTER TABLE t ALTER COLUMN val SET DEFAULT 
gen_random_uuid")
+                "Failed to parse query: Encountered \"rand_uuid\"",
+                () -> sql("ALTER TABLE t ALTER COLUMN val SET DEFAULT 
rand_uuid")
         );
     }
 
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
index a2aaff1ed2..67fb4c1456 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
@@ -136,7 +136,7 @@ public class ItCreateTableDdlTest extends 
BaseSqlIntegrationTest {
 
     @Test
     public void pkWithFunctionalDefault() {
-        sql("create table t (id varchar default gen_random_uuid primary key, 
val int)");
+        sql("create table t (id uuid default rand_uuid primary key, val int)");
         sql("insert into t (val) values (1), (2)");
 
         var result = sql("select * from t");
@@ -372,15 +372,15 @@ public class ItCreateTableDdlTest extends 
BaseSqlIntegrationTest {
         assertThrowsSqlException(
                 STMT_VALIDATION_ERR,
                 "Functional defaults are not supported for non-primary key 
columns",
-                () -> sql("CREATE TABLE t (id VARCHAR PRIMARY KEY, val VARCHAR 
DEFAULT gen_random_uuid)")
+                () -> sql("CREATE TABLE t (id VARCHAR PRIMARY KEY, val UUID 
DEFAULT rand_uuid)")
         );
 
         sql("CREATE TABLE t (id VARCHAR PRIMARY KEY, val VARCHAR)");
 
         assertThrowsSqlException(
                 STMT_PARSE_ERR,
-                "Failed to parse query: Encountered \"gen_random_uuid\"",
-                () -> sql("ALTER TABLE t ADD COLUMN val2 VARCHAR DEFAULT 
gen_random_uuid")
+                "Failed to parse query: Encountered \"rand_uuid\"",
+                () -> sql("ALTER TABLE t ADD COLUMN val2 VARCHAR DEFAULT 
rand_uuid")
         );
     }
 
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
index c7ddb8eceb..1c8bace374 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItHashSpoolIntegrationTest.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
 public class ItHashSpoolIntegrationTest extends BaseSqlIntegrationTest {
     @Test
     public void testNullsInSearchRow() {
-        sql("CREATE TABLE t(pk varchar default gen_random_uuid PRIMARY KEY, i1 
INTEGER, i2 INTEGER)");
+        sql("CREATE TABLE t(pk uuid default rand_uuid PRIMARY KEY, i1 INTEGER, 
i2 INTEGER)");
         sql("INSERT INTO t (i1, i2) VALUES (null, 0), (1, 1), (2, 2), (3, 
null)");
 
         assertQuery("SELECT i1, (SELECT i2 FROM t WHERE i1=t1.i1) FROM t t1")
@@ -48,8 +48,8 @@ public class ItHashSpoolIntegrationTest extends 
BaseSqlIntegrationTest {
     @Test
     @Disabled("https://issues.apache.org/jira/browse/IGNITE-21286";)
     public void testNullsInSearchRowMultipleColumns() {
-        sql("CREATE TABLE t0(pk varchar default gen_random_uuid PRIMARY KEY, 
i1 INTEGER, i2 INTEGER)");
-        sql("CREATE TABLE t1(pk varchar default gen_random_uuid PRIMARY KEY, 
i1 INTEGER, i2 INTEGER)");
+        sql("CREATE TABLE t0(pk UUID default rand_uuid PRIMARY KEY, i1 
INTEGER, i2 INTEGER)");
+        sql("CREATE TABLE t1(pk UUID default rand_uuid PRIMARY KEY, i1 
INTEGER, i2 INTEGER)");
         sql("INSERT INTO t0(i1, i2) VALUES (null, 0), (1, null), (null, 2), 
(3, null), (1, 1)");
         sql("INSERT INTO t1(i1, i2) VALUES (null, 0), (null, 1), (2, null), 
(3, null), (1, 1)");
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
index 7aa41bb3b1..313b7a275d 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
@@ -534,10 +534,10 @@ public class IgniteSqlFunctions {
         return leastOrGreatest(false, arg0, arg1);
     }
 
-    /** Generates a random UUID and converts it to string. **/
+    /** Generates a random UUID. **/
     @NonDeterministic
-    public static String genRandomUuid() {
-        return UUID.randomUUID().toString();
+    public static UUID randUuid() {
+        return UUID.randomUUID();
     }
 
     /** Returns the second argument and ignores the first. */
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 ef62472443..185cf95be0 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
@@ -334,7 +334,6 @@ import static 
org.apache.calcite.sql.fun.SqlStdOperatorTable.USER;
 import static org.apache.calcite.util.ReflectUtil.isStatic;
 import static 
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable.SUBSTR;
 import static 
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable.TYPEOF;
-import static 
org.apache.ignite.internal.sql.engine.util.IgniteMethod.GEN_RANDOM_UUID;
 import static 
org.apache.ignite.internal.sql.engine.util.IgniteMethod.GREATEST2;
 import static org.apache.ignite.internal.sql.engine.util.IgniteMethod.LEAST2;
 import static org.apache.ignite.internal.sql.engine.util.IgniteMethod.LENGTH;
@@ -1007,7 +1006,7 @@ public class RexImpTable {
 
       defineMethod(IgniteSqlOperatorTable.RAND_UUID, RAND_UUID.method(), 
NullPolicy.NONE);
       defineMethod(IgniteSqlOperatorTable.GREATEST2, GREATEST2.method(), 
NullPolicy.NONE);
-      defineMethod(IgniteSqlOperatorTable.GEN_RANDOM_UUID, 
GEN_RANDOM_UUID.method(), NullPolicy.NONE);
+      defineMethod(IgniteSqlOperatorTable.RAND_UUID, RAND_UUID.method(), 
NullPolicy.NONE);
       defineMethod(IS_NOT_DISTINCT_FROM, 
IgniteMethod.IS_NOT_DISTINCT_FROM.method(), NullPolicy.NONE);
       defineMethod(IgniteSqlOperatorTable.LEAST2, LEAST2.method(), 
NullPolicy.NONE);
       defineMethod(IgniteSqlOperatorTable.LENGTH, LENGTH.method(), 
NullPolicy.STRICT);
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 4f0ad6f94b..aa5e213d8a 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
@@ -61,7 +61,6 @@ 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.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlDdl;
@@ -128,7 +127,9 @@ 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.type.UuidType;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.SchemaNotFoundException;
@@ -294,7 +295,8 @@ public class DdlSqlToCommandConverter {
             pkConstraints.add(new 
IgniteSqlPrimaryKeyConstraint(SqlParserPos.ZERO, null, SqlNodeList.of(colName),
                     IgniteSqlPrimaryKeyIndexType.IMPLICIT_HASH));
 
-            SqlDataTypeSpec type = new SqlDataTypeSpec(new 
SqlBasicTypeNameSpec(SqlTypeName.VARCHAR, SqlParserPos.ZERO), 
SqlParserPos.ZERO);
+            SqlIdentifier uuidTypeName = new SqlIdentifier(UuidType.NAME, 
SqlParserPos.ZERO);
+            SqlDataTypeSpec type = new SqlDataTypeSpec(new 
IgniteSqlTypeNameSpec(uuidTypeName, SqlParserPos.ZERO), SqlParserPos.ZERO);
             SqlNode col = SqlDdlNodes.column(SqlParserPos.ZERO, colName, type, 
null, ColumnStrategy.DEFAULT);
 
             createTblNode.columnList().add(0, col);
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteProject.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteProject.java
index d8273005f0..1671d38c2b 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteProject.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteProject.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.sql.engine.rel;
 
 import static org.apache.calcite.rel.RelDistribution.Type.HASH_DISTRIBUTED;
-import static 
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable.GEN_RANDOM_UUID;
+import static 
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable.RAND_UUID;
 import static 
org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.broadcast;
 import static 
org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.hash;
 import static 
org.apache.ignite.internal.sql.engine.trait.IgniteDistributions.single;
@@ -197,7 +197,7 @@ public class IgniteProject extends Project implements 
TraitsAwareIgniteRel {
         RexVisitor<Void> v = new RexVisitorImpl<>(true) {
             @Override
             public Void visitCall(RexCall call) {
-                if (call.getOperator() == GEN_RANDOM_UUID) {
+                if (call.getOperator() == RAND_UUID) {
                     throw Util.FoundOne.NULL;
                 }
                 return super.visitCall(call);
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 0550fd5e2b..c9062bffea 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
@@ -123,7 +123,7 @@ public class TableDescriptorImpl extends 
NullInitializerExpressionFactory implem
             case DEFAULT_COMPUTED: {
                 assert descriptor.key() : "DEFAULT_COMPUTED is only supported 
for primary key columns. Column: " + descriptor.name();
 
-                return 
rexBuilder.makeCall(IgniteSqlOperatorTable.GEN_RANDOM_UUID);
+                return rexBuilder.makeCall(IgniteSqlOperatorTable.RAND_UUID);
             }
             default:
                 throw new IllegalStateException("Unknown default strategy: " + 
descriptor.defaultStrategy());
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 38c9ffd2a4..5556873c2b 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
@@ -149,30 +149,6 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
                 }
             };
 
-    /**
-     * This function is used to generate a value for implicit primary key.
-     */
-    // TODO This function should removed when 
https://issues.apache.org/jira/browse/IGNITE-19103 is complete.
-    public static final SqlFunction GEN_RANDOM_UUID =
-            new SqlFunction(
-                    "GEN_RANDOM_UUID",
-                    SqlKind.OTHER_FUNCTION,
-                    ReturnTypes.explicit(SqlTypeName.VARCHAR),
-                    null,
-                    OperandTypes.NILADIC,
-                    SqlFunctionCategory.SYSTEM
-            ) {
-                @Override
-                public boolean isDynamicFunction() {
-                    return true;
-                }
-
-                @Override
-                public boolean isDeterministic() {
-                    return false;
-                }
-            };
-
     /** The {@code ROUND(numeric [, numeric])} function. */
     public static final SqlFunction ROUND = SqlBasicFunction.create("ROUND",
             new SetScaleToZeroIfSingleArgument(),
@@ -488,7 +464,6 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
         register(LEAST2);
         register(GREATEST2);
         register(RAND_UUID);
-        register(GEN_RANDOM_UUID);
     }
 
     /** Sets scale to {@code 0} for single argument variants of ROUND/TRUNCATE 
operators. */
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteCustomTypeSpec.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteCustomTypeSpec.java
index 25ac4a25a7..36a305ae1d 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteCustomTypeSpec.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteCustomTypeSpec.java
@@ -21,7 +21,6 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.util.Objects;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.ignite.internal.sql.engine.exec.ExecutionContext;
 import org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl;
 import org.apache.ignite.internal.sql.engine.exec.exp.ExpressionFactoryImpl;
 import org.apache.ignite.internal.sql.engine.util.TypeUtils;
@@ -105,8 +104,8 @@ public final class IgniteCustomTypeSpec {
      * {@link TypeUtils TypeUtils} in type conversions.
      *
      * @see ExpressionFactoryImpl
-     * @see TypeUtils#toInternal(ExecutionContext, Object, Type)
-     * @see TypeUtils#fromInternal(ExecutionContext, Object, Type)
+     * @see TypeUtils#toInternal(Object, Type)
+     * @see TypeUtils#fromInternal(Object, Type)
      */
     public Class<?> storageType() {
         return storageType;
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
index 6ed1ff9d43..01b6a69539 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
@@ -98,17 +98,13 @@ public enum IgniteMethod {
     IS_NOT_DISTINCT_FROM(Objects.class, "equals", Object.class, Object.class),
 
     /** See {@link UUID#randomUUID()}. */
-    RAND_UUID(UUID.class, "randomUUID"),
+    RAND_UUID(IgniteSqlFunctions.class, "randUuid"),
 
     LENGTH(IgniteSqlFunctions.class, "length", Object.class),
 
     OCTET_LENGTH(IgniteSqlFunctions.class, "octetLength", ByteString.class),
     OCTET_LENGTH2(IgniteSqlFunctions.class, "octetLength", String.class),
 
-    /** See {@link IgniteSqlFunctions#genRandomUuid()}. */
-    // TODO This function should removed when 
https://issues.apache.org/jira/browse/IGNITE-19103 is complete.
-    GEN_RANDOM_UUID(IgniteSqlFunctions.class, "genRandomUuid"),
-
     /** See {@link IgniteSqlFunctions#consumeFirstArgument(Object, Object)}. 
**/
     CONSUME_FIRST_ARGUMENT(IgniteSqlFunctions.class, "consumeFirstArgument", 
Object.class, Object.class),
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/TypeCoercionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/TypeCoercionTest.java
index 3a0eac2e99..8a96b91058 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/TypeCoercionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/TypeCoercionTest.java
@@ -319,11 +319,9 @@ public class TypeCoercionTest extends AbstractPlannerTest {
         List<Arguments> arguments = new ArrayList<>();
         arguments.add(Arguments.of("INSERT INTO t VALUES (123)", 
SqlTypeName.CHAR, true));
         arguments.add(Arguments.of("INSERT INTO t VALUES (123 || '1')", 
SqlTypeName.CHAR, true));
-        arguments.add(Arguments.of("INSERT INTO t VALUES (gen_random_uuid())", 
SqlTypeName.CHAR, true));
         arguments.add(Arguments.of("INSERT INTO t VALUES ('123')", 
SqlTypeName.CHAR, false));
         arguments.add(Arguments.of("INSERT INTO t VALUES (123)", 
SqlTypeName.VARCHAR, true));
         arguments.add(Arguments.of("INSERT INTO t VALUES (123 || '1')", 
SqlTypeName.VARCHAR, true));
-        arguments.add(Arguments.of("INSERT INTO t VALUES (gen_random_uuid())", 
SqlTypeName.VARCHAR, true));
         arguments.add(Arguments.of("INSERT INTO t VALUES ('123')", 
SqlTypeName.VARCHAR, false));
         return arguments.stream();
     }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
index f18e37e121..2ff25506e7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
@@ -179,7 +179,7 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
                 allOf(
                         hasItem(columnThat("column with name \"VAL\"", cd -> 
"VAL".equals(cd.name()))),
                         hasItem(columnThat("implicit PK col", cd -> 
Commons.IMPLICIT_PK_COL_NAME.equals(cd.name())
-                                && !cd.nullable() && ColumnType.STRING == 
cd.type()))
+                                && !cd.nullable() && ColumnType.UUID == 
cd.type()))
                 )
         );
 
@@ -613,7 +613,7 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
 
     @Test
     public void tableWithAutogenPkColumn() throws SqlParseException {
-        var node = parse("CREATE TABLE t (id varchar default gen_random_uuid 
primary key, val int) WITH STORAGE_PROFILE='"
+        var node = parse("CREATE TABLE t (id uuid default rand_uuid primary 
key, val int) WITH STORAGE_PROFILE='"
                 + DEFAULT_STORAGE_PROFILE + "'");
 
         assertThat(node, instanceOf(SqlDdl.class));
@@ -633,9 +633,9 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
                         hasItem(columnThat("PK with functional default",
                                 col -> "ID".equals(col.name())
                                         && !col.nullable()
-                                        && ColumnType.STRING == col.type()
+                                        && ColumnType.UUID == col.type()
                                         && col.defaultValue().type() == 
DefaultValue.Type.FUNCTION_CALL
-                                        && 
"GEN_RANDOM_UUID".equals(((DefaultValue.FunctionCall) 
col.defaultValue()).functionName())
+                                        && 
"RAND_UUID".equals(((DefaultValue.FunctionCall) 
col.defaultValue()).functionName())
                                 )
                         )
                 )
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
index f74b5e648a..8e9cb189aa 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImplTest.java
@@ -320,8 +320,8 @@ public class SqlSchemaManagerImplTest extends 
BaseIgniteAbstractTest {
                                         
.defaultValue(DefaultValue.constant(null)).build(),
                                 
ColumnParams.builder().name("C3").type(ColumnType.INT32)
                                         
.defaultValue(DefaultValue.constant(1)).build(),
-                                
ColumnParams.builder().name("C4").type(ColumnType.STRING).length(256)
-                                        
.defaultValue(DefaultValue.functionCall(DefaultValueGenerator.GEN_RANDOM_UUID.name())).build()
+                                
ColumnParams.builder().name("C4").type(ColumnType.UUID)
+                                        
.defaultValue(DefaultValue.functionCall(DefaultValueGenerator.RAND_UUID.name())).build()
                         ))
                         .primaryKey(primaryKey("C1", "C4"))
                         .zone("Default")
@@ -371,8 +371,8 @@ public class SqlSchemaManagerImplTest extends 
BaseIgniteAbstractTest {
                                 
ColumnParams.builder().name("C1").type(ColumnType.INT32).nullable(false).build(),
                                 
ColumnParams.builder().name("C2").type(ColumnType.INT32)
                                         
.defaultValue(DefaultValue.constant(null)).build(),
-                                
ColumnParams.builder().name("C3").type(ColumnType.STRING).length(256)
-                                        
.defaultValue(DefaultValue.functionCall(DefaultValueGenerator.GEN_RANDOM_UUID.name())).build(),
+                                
ColumnParams.builder().name("C3").type(ColumnType.UUID)
+                                        
.defaultValue(DefaultValue.functionCall(DefaultValueGenerator.RAND_UUID.name())).build(),
                                 
ColumnParams.builder().name("C4").type(ColumnType.INT8).nullable(true).build()
                         ))
                         .primaryKey(primaryKey)
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 1d6a507f39..3b1c3e3175 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
@@ -86,7 +86,7 @@ public class SqlDdlParserTest extends AbstractParserTest {
      */
     @Test
     public void createTableAutogenFuncDefault() {
-        String query = "create table my_table(id varchar default 
gen_random_uuid primary key, val varchar)";
+        String query = "create table my_table(id uuid default rand_uuid 
primary key, val varchar)";
 
         SqlNode node = parse(query);
 
@@ -100,7 +100,7 @@ public class SqlDdlParserTest extends AbstractParserTest {
                 SqlColumnDeclaration.class,
                 col -> "ID".equals(col.name.getSimple())
                         && col.expression instanceof SqlIdentifier
-                        && "GEN_RANDOM_UUID".equals(((SqlIdentifier) 
col.expression).getSimple())
+                        && "RAND_UUID".equals(((SqlIdentifier) 
col.expression).getSimple())
         )));
         assertThat(createTable.columnList(), hasItem(ofTypeMatching(
                 "PK constraint with name \"ID\"", 
IgniteSqlPrimaryKeyConstraint.class,
@@ -112,7 +112,7 @@ public class SqlDdlParserTest extends AbstractParserTest {
 
         expectUnparsed(node, "CREATE TABLE \"MY_TABLE\" ("
                 + "PRIMARY KEY (\"ID\"), "
-                + "\"ID\" VARCHAR DEFAULT (\"GEN_RANDOM_UUID\"), "
+                + "\"ID\" UUID DEFAULT (\"RAND_UUID\"), "
                 + "\"VAL\" VARCHAR)"
         );
     }


Reply via email to