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

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

commit 1a298c1e729ecf0eb581b3c35f09292225e3d0df
Author: amashenkov <[email protected]>
AuthorDate: Tue Aug 1 00:22:25 2023 +0300

    Fix column default params.
---
 .../internal/catalog/commands/CatalogUtils.java    | 95 +++++++++++++++++++++-
 .../internal/catalog/commands/ColumnParams.java    |  5 ++
 .../internal/sql/engine/type/IgniteTypeSystem.java |  9 +-
 3 files changed, 102 insertions(+), 7 deletions(-)

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 d085f4ca0d..a831eb0ba6 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
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.catalog.commands;
 
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.lang.IgniteStringFormatter.format;
 
 import java.util.EnumMap;
 import java.util.EnumSet;
@@ -32,12 +33,50 @@ import 
org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescript
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.util.StringUtils;
+import org.apache.ignite.lang.ErrorGroups.Sql;
 import org.apache.ignite.sql.ColumnType;
+import org.apache.ignite.sql.SqlException;
 
 /**
  * Catalog utils.
  */
 public class CatalogUtils {
+    /**
+     * Default TIMESTAMP type precision: microseconds.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 36
+     */
+    public static final int DEFAULT_TIMESTAMP_PRECISION = 6;
+
+    /**
+     * Default TIME type precision: seconds.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 36
+     */
+    public static final int DEFAULT_TIME_PRECISION = 0;
+
+    /**
+     * Default DECIMAL precision is implementation-defined.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 25
+     */
+    public static final int DEFAULT_DECIMAL_PRECISION = 19;
+
+    /**
+     * Default DECIMAL scale is implementation-defined.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 25
+     */
+    public static final int DEFAULT_DECIMAL_SCALE = 3;
+
+    /**
+     * Maximum TIME and TIMESTAMP precision is implementation-defined.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 38
+     */
+    public static final int MAX_TIME_PRECISION = 9;
+
     private static final Map<ColumnType, Set<ColumnType>> 
ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
 
     static {
@@ -126,9 +165,10 @@ public class CatalogUtils {
      * @return Column descriptor.
      */
     public static CatalogTableColumnDescriptor fromParams(ColumnParams params) 
{
-        int precision = params.precision() != null ? params.precision() : 0;
-        int scale = params.scale() != null ? params.scale() : 0;
-        int length = params.length() != null ? params.length() : 0;
+        int precision = params.precision() != null ? params.precision() : 
defaultPrecision(params.type());
+        int scale = params.scale() != null ? params.scale() : 
defaultScale(params.type());
+        int length = params.length() != null ? params.length() : 
defaultLength(params.type());
+
         DefaultValue defaultValue = params.defaultValueDefinition();
 
         return new CatalogTableColumnDescriptor(params.name(), params.type(), 
params.nullable(),
@@ -147,4 +187,53 @@ public class CatalogUtils {
 
         return supportedTransitions != null && 
supportedTransitions.contains(target);
     }
+
+    private static int defaultPrecision(ColumnType columnType) {
+        //TODO IGNITE-19938: Add REAL,FLOAT and DOUBLE precision. See SQL`16 
part 2 section 6.1 syntax rule 29-31
+        switch (columnType) {
+            case NUMBER:
+            case DECIMAL:
+                return DEFAULT_DECIMAL_PRECISION;
+            case TIME:
+                return DEFAULT_TIME_PRECISION;
+            case TIMESTAMP:
+            case DATETIME:
+                return DEFAULT_TIMESTAMP_PRECISION;
+            default:
+                /*
+                 * Precision shall be great than 0.
+                 * SQL`16 part 2 section 6.1 syntax rule 21
+                 */
+                return 1;
+        }
+    }
+
+    private static int defaultScale(ColumnType columnType) {
+        //TODO IGNITE-19938: Add REAL,FLOAT and DOUBLE precision. See SQL`16 
part 2 section 6.1 syntax rule 29-31
+        if (columnType == ColumnType.DECIMAL) {
+            return DEFAULT_DECIMAL_SCALE;
+        }
+
+        /*
+         * Default scale is 0.
+         * SQL`16 part 2 section 6.1 syntax rule 22
+         */
+        return 0;
+    }
+
+    private static int defaultLength(ColumnType columnType) {
+        //TODO IGNITE-19938: Return length for other types. See SQL`16 part 2 
section 6.1 syntax rule 39
+        switch (columnType) {
+            case BITMASK:
+            case STRING:
+            case BYTE_ARRAY:
+                return Integer.MAX_VALUE;
+            default:
+                /*
+                 * Default length is 1.
+                 * SQL`16 part 2 section 6.1 syntax rule 5
+                 */
+                return 1;
+        }
+    }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
index f95e0544d7..6a926e67ce 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
@@ -17,7 +17,12 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
+import static org.apache.ignite.lang.IgniteStringFormatter.format;
+
+import org.apache.ignite.internal.util.StringUtils;
+import org.apache.ignite.lang.ErrorGroups.Sql;
 import org.apache.ignite.sql.ColumnType;
+import org.apache.ignite.sql.SqlException;
 
 /** Defines a particular column within table. */
 public class ColumnParams {
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
index 4371fe3651..4a01047135 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
@@ -24,7 +24,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.ignite.internal.schema.TemporalNativeType;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 
 /**
  * Ignite type system.
@@ -45,7 +45,6 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl 
implements Serializa
     }
 
 
-
     /** {@inheritDoc} */
     @Override
     public int getMaxPrecision(SqlTypeName typeName) {
@@ -54,7 +53,7 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl 
implements Serializa
             case TIME_WITH_LOCAL_TIME_ZONE:
             case TIMESTAMP:
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
-                return TemporalNativeType.MAX_TIME_PRECISION;
+                return CatalogUtils.MAX_TIME_PRECISION;
             default:
                 return super.getMaxPrecision(typeName);
         }
@@ -66,7 +65,9 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl 
implements Serializa
         switch (typeName) {
             case TIMESTAMP: // DATETIME
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE: // TIMESTAMP
-                return TemporalNativeType.DEFAULT_TIMESTAMP_PRECISION;
+                return CatalogUtils.DEFAULT_TIMESTAMP_PRECISION;
+            case DECIMAL:
+                return CatalogUtils.DEFAULT_DECIMAL_PRECISION;
             case FLOAT:
                 // TODO: https://issues.apache.org/jira/browse/IGNITE-18556
                 // Fixes leastRestrictive(FLOAT, DOUBLE) != 
leastRestrictive(DOUBLE, FLOAT).

Reply via email to