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