You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by st...@apache.org on 2023/12/26 03:19:13 UTC
(doris) branch master updated: [feature](nereids)support partition property in nereids (#28982)
This is an automated email from the ASF dual-hosted git repository.
starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 065eb9a72b5 [feature](nereids)support partition property in nereids (#28982)
065eb9a72b5 is described below
commit 065eb9a72b599d5ca0058fa80135ea37240de96f
Author: starocean999 <40...@users.noreply.github.com>
AuthorDate: Tue Dec 26 11:19:04 2023 +0800
[feature](nereids)support partition property in nereids (#28982)
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 2 +-
fe/fe-core/src/main/cup/sql_parser.cup | 26 ---
.../apache/doris/analysis/SinglePartitionDesc.java | 19 +-
.../doris/nereids/parser/LogicalPlanBuilder.java | 27 ++-
.../plans/commands/info/ColumnDefinition.java | 260 ++++++++++++++++++++-
.../plans/commands/info/FixedRangePartition.java | 21 +-
.../trees/plans/commands/info/InPartition.java | 19 +-
.../plans/commands/info/LessThanPartition.java | 31 ++-
.../plans/commands/info/PartitionDefinition.java | 88 ++++++-
.../trees/plans/commands/info/StepPartition.java | 11 +-
.../nereids/rules/exploration/mv/MappingTest.java | 2 +-
.../correctness_p0/test_agg_materialize.groovy | 2 +-
.../suites/datatype_p0/date/test_date_key.groovy | 2 +-
.../datatype_p0/date/test_datetime_key.groovy | 2 +-
.../datetimev1/test_datetimev1_calc.groovy | 2 +-
.../datatype_p0/datev1/test_datev1_calc.groovy | 2 +-
.../decimalv2/test_decimalv2_calc.groovy | 2 +-
.../test_decimalv2_calc_with_conversion.groovy | 2 +-
.../decimalv3/test_decimalv3_overflow.groovy | 2 +-
.../decimalv3/test_uniq_tab_decimalv2.groovy | 2 +-
.../create_nestedtypes_with_unsupport_types.groovy | 8 +-
.../ddl/dup_tbl_basic_multi_table_create.sql | 2 +-
...st_date_or_datetime_computation_negative.groovy | 2 +-
.../session_variable/test_default_limit.groovy | 4 +-
...test_count_distinct_with_collection_type.groovy | 2 +-
.../array_functions/test_array_functions.groovy | 2 +-
.../size_funciton/test_size_function.groovy | 2 +-
27 files changed, 444 insertions(+), 102 deletions(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index abef9ffa6d7..a2f90ea2166 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -502,7 +502,7 @@ partitionsDef
;
partitionDef
- : (lessThanPartitionDef | fixedPartitionDef | stepPartitionDef | inPartitionDef) properties=propertyClause?
+ : (lessThanPartitionDef | fixedPartitionDef | stepPartitionDef | inPartitionDef) (LEFT_PAREN partitionProperties=propertyItemList RIGHT_PAREN)?
;
lessThanPartitionDef
diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup
index 26b221c128c..7e8f4dd96b5 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -1800,19 +1800,6 @@ create_stmt ::=
RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, engineName, keys, partition,
distribution, tblProperties, extProperties, tableComment, index);
:}
- | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name
- LPAREN column_definition_list:columns COMMA RPAREN opt_engine:engineName
- opt_keys:keys
- opt_comment:tableComment
- opt_partition:partition
- opt_distribution:distribution
- opt_rollup:index
- opt_properties:tblProperties
- opt_ext_properties:extProperties
- {:
- RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, null, engineName, keys, partition,
- distribution, tblProperties, extProperties, tableComment, index);
- :}
| KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name
LPAREN column_definition_list:columns COMMA index_definition_list:indexes RPAREN opt_engine:engineName
opt_keys:keys
@@ -1826,19 +1813,6 @@ create_stmt ::=
RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, indexes, engineName, keys, partition,
distribution, tblProperties, extProperties, tableComment, index);
:}
- | KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name
- LPAREN column_definition_list:columns COMMA index_definition_list:indexes COMMA RPAREN opt_engine:engineName
- opt_keys:keys
- opt_comment:tableComment
- opt_partition:partition
- opt_distribution:distribution
- opt_rollup:index
- opt_properties:tblProperties
- opt_ext_properties:extProperties
- {:
- RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, indexes, engineName, keys, partition,
- distribution, tblProperties, extProperties, tableComment, index);
- :}
| KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name
opt_col_list:columns
opt_engine:engineName
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SinglePartitionDesc.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SinglePartitionDesc.java
index ac6cad493ef..e25adbaba0f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SinglePartitionDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SinglePartitionDesc.java
@@ -68,19 +68,22 @@ public class SinglePartitionDesc implements AllPartitionDesc {
/**
* for Nereids
*/
- public SinglePartitionDesc(boolean ifNotExists, String partName, PartitionKeyDesc partitionKeyDesc,
- ReplicaAllocation replicaAlloc, Map<String, String> properties) {
- this.ifNotExists = ifNotExists;
-
+ public SinglePartitionDesc(boolean ifNotExists, String partName,
+ PartitionKeyDesc partitionKeyDesc, ReplicaAllocation replicaAlloc,
+ Map<String, String> properties, DataProperty partitionDataProperty, boolean isInMemory,
+ TTabletType tabletType, Long versionInfo, String storagePolicy, boolean isMutable) {
this.isAnalyzed = true;
-
+ this.ifNotExists = ifNotExists;
this.partName = partName;
this.partitionKeyDesc = partitionKeyDesc;
this.properties = properties;
-
- this.partitionDataProperty = new DataProperty(DataProperty.DEFAULT_STORAGE_MEDIUM);
+ this.partitionDataProperty = partitionDataProperty;
this.replicaAlloc = replicaAlloc;
- this.storagePolicy = "";
+ this.isInMemory = isInMemory;
+ this.tabletType = tabletType;
+ this.versionInfo = versionInfo;
+ this.storagePolicy = storagePolicy;
+ this.isMutable = isMutable;
}
public boolean isSetIfNotExists() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 37b42c7123f..0d24a8b9377 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -2430,7 +2430,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
String indexName = ctx.indexName.getText();
List<String> indexCols = visitIdentifierList(ctx.cols);
Map<String, String> properties = visitPropertyItemList(ctx.properties);
- String indexType = ctx.indexType.getText();
+ String indexType = ctx.indexType != null ? ctx.indexType.getText() : null;
String comment = ctx.comment != null ? ctx.comment.getText() : "";
return new IndexDefinition(indexName, indexCols, indexType, properties, comment);
}
@@ -2438,8 +2438,16 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
@Override
public List<PartitionDefinition> visitPartitionsDef(PartitionsDefContext ctx) {
return ctx.partitions.stream()
- .map(p -> ((PartitionDefinition) visit(p)).withProperties(visitPropertyClause(p.properties)))
- .collect(Collectors.toList());
+ .map(p -> ((PartitionDefinition) visit(p))).collect(Collectors.toList());
+ }
+
+ @Override
+ public PartitionDefinition visitPartitionDef(DorisParser.PartitionDefContext ctx) {
+ PartitionDefinition partitionDefinition = (PartitionDefinition) visit(ctx.getChild(0));
+ if (ctx.partitionProperties != null) {
+ partitionDefinition.withProperties(visitPropertyItemList(ctx.partitionProperties));
+ }
+ return partitionDefinition;
}
@Override
@@ -2447,9 +2455,10 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
String partitionName = ctx.partitionName.getText();
if (ctx.MAXVALUE() == null) {
List<Expression> lessThanValues = visitConstantSeq(ctx.constantSeq());
- return new LessThanPartition(partitionName, lessThanValues);
+ return new LessThanPartition(ctx.EXISTS() != null, partitionName, lessThanValues);
} else {
- return new LessThanPartition(partitionName, ImmutableList.of(MaxValue.INSTANCE));
+ return new LessThanPartition(ctx.EXISTS() != null, partitionName,
+ ImmutableList.of(MaxValue.INSTANCE));
}
}
@@ -2458,15 +2467,15 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
String partitionName = ctx.partitionName.getText();
List<Expression> lowerBounds = visitConstantSeq(ctx.lower);
List<Expression> upperBounds = visitConstantSeq(ctx.upper);
- return new FixedRangePartition(partitionName, lowerBounds, upperBounds);
+ return new FixedRangePartition(ctx.EXISTS() != null, partitionName, lowerBounds, upperBounds);
}
@Override
public PartitionDefinition visitStepPartitionDef(StepPartitionDefContext ctx) {
List<Expression> fromExpression = visitConstantSeq(ctx.from);
List<Expression> toExpression = visitConstantSeq(ctx.to);
- return new StepPartition(fromExpression, toExpression, Long.parseLong(ctx.unitsAmount.getText()),
- ctx.unit != null ? ctx.unit.getText() : null);
+ return new StepPartition(false, null, fromExpression, toExpression,
+ Long.parseLong(ctx.unitsAmount.getText()), ctx.unit != null ? ctx.unit.getText() : null);
}
@Override
@@ -2479,7 +2488,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
values = visitConstantSeq(ctx.constants).stream().map(ImmutableList::of)
.collect(Collectors.toList());
}
- return new InPartition(ctx.partitionName.getText(), values);
+ return new InPartition(ctx.EXISTS() != null, ctx.partitionName.getText(), values);
}
@Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java
index 2736d71a50c..5832a0534c0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java
@@ -21,6 +21,9 @@ import org.apache.doris.analysis.ColumnDef;
import org.apache.doris.catalog.AggregateType;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.KeysType;
+import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
import org.apache.doris.common.Config;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.types.ArrayType;
@@ -33,10 +36,13 @@ import org.apache.doris.nereids.types.StructField;
import org.apache.doris.nereids.types.StructType;
import org.apache.doris.nereids.types.TinyIntType;
import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.qe.SessionVariable;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -176,9 +182,7 @@ public class ColumnDefinition {
* validate column definition and analyze
*/
public void validate(boolean isOlap, Set<String> keysSet, boolean isEnableMergeOnWrite, KeysType keysType) {
- if (Config.disable_nested_complex_type && isNestedComplexType(type)) {
- throw new AnalysisException("Unsupported data type: " + type.toSql());
- }
+ validateDataType(type.toCatalogDataType());
type = updateCharacterTypeLength(type);
if (type.isArrayType()) {
int depth = 0;
@@ -369,6 +373,256 @@ public class ColumnDefinition {
return false;
}
+ // from TypeDef.java analyze()
+ private void validateDataType(Type catalogType) {
+ if (catalogType.exceedsMaxNestingDepth()) {
+ throw new AnalysisException(
+ String.format("Type exceeds the maximum nesting depth of %s:\n%s",
+ Type.MAX_NESTING_DEPTH, catalogType.toSql()));
+ }
+ if (!catalogType.isSupported()) {
+ throw new AnalysisException("Unsupported data type: " + catalogType.toSql());
+ }
+
+ if (catalogType.isScalarType()) {
+ validateScalarType((ScalarType) catalogType);
+ } else if (catalogType.isComplexType()) {
+ // now we not support array / map / struct nesting complex type
+ if (catalogType.isArrayType()) {
+ Type itemType = ((org.apache.doris.catalog.ArrayType) catalogType).getItemType();
+ if (itemType instanceof ScalarType) {
+ validateNestedType(catalogType, (ScalarType) itemType);
+ } else if (Config.disable_nested_complex_type
+ && !(itemType instanceof org.apache.doris.catalog.ArrayType)) {
+ // now we can array nesting array
+ throw new AnalysisException(
+ "Unsupported data type: ARRAY<" + itemType.toSql() + ">");
+ }
+ }
+ if (catalogType.isMapType()) {
+ org.apache.doris.catalog.MapType mt =
+ (org.apache.doris.catalog.MapType) catalogType;
+ if (Config.disable_nested_complex_type && (!(mt.getKeyType() instanceof ScalarType)
+ || !(mt.getValueType() instanceof ScalarType))) {
+ throw new AnalysisException("Unsupported data type: MAP<"
+ + mt.getKeyType().toSql() + "," + mt.getValueType().toSql() + ">");
+ }
+ if (mt.getKeyType() instanceof ScalarType) {
+ validateNestedType(catalogType, (ScalarType) mt.getKeyType());
+ }
+ if (mt.getValueType() instanceof ScalarType) {
+ validateNestedType(catalogType, (ScalarType) mt.getValueType());
+ }
+ }
+ if (catalogType.isStructType()) {
+ ArrayList<org.apache.doris.catalog.StructField> fields =
+ ((org.apache.doris.catalog.StructType) catalogType).getFields();
+ Set<String> fieldNames = new HashSet<>();
+ for (org.apache.doris.catalog.StructField field : fields) {
+ Type fieldType = field.getType();
+ if (fieldType instanceof ScalarType) {
+ validateNestedType(catalogType, (ScalarType) fieldType);
+ if (!fieldNames.add(field.getName())) {
+ throw new AnalysisException("Duplicate field name " + field.getName()
+ + " in struct " + catalogType.toSql());
+ }
+ } else if (Config.disable_nested_complex_type) {
+ throw new AnalysisException(
+ "Unsupported field type: " + fieldType.toSql() + " for STRUCT");
+ }
+ }
+ }
+ }
+ }
+
+ private void validateScalarType(ScalarType scalarType) {
+ PrimitiveType type = scalarType.getPrimitiveType();
+ // When string type length is not assigned, it needs to be assigned to 1.
+ if (scalarType.getPrimitiveType().isStringType() && !scalarType.isLengthSet()) {
+ if (scalarType.getPrimitiveType() == PrimitiveType.VARCHAR) {
+ // always set varchar length MAX_VARCHAR_LENGTH
+ scalarType.setLength(ScalarType.MAX_VARCHAR_LENGTH);
+ } else if (scalarType.getPrimitiveType() == PrimitiveType.STRING) {
+ // always set text length MAX_STRING_LENGTH
+ scalarType.setLength(ScalarType.MAX_STRING_LENGTH);
+ } else {
+ scalarType.setLength(1);
+ }
+ }
+ switch (type) {
+ case CHAR:
+ case VARCHAR: {
+ String name;
+ int maxLen;
+ if (type == PrimitiveType.VARCHAR) {
+ name = "VARCHAR";
+ maxLen = ScalarType.MAX_VARCHAR_LENGTH;
+ } else {
+ name = "CHAR";
+ maxLen = ScalarType.MAX_CHAR_LENGTH;
+ return;
+ }
+ int len = scalarType.getLength();
+ // len is decided by child, when it is -1.
+
+ if (len <= 0) {
+ throw new AnalysisException(name + " size must be > 0: " + len);
+ }
+ if (scalarType.getLength() > maxLen) {
+ throw new AnalysisException(name + " size must be <= " + maxLen + ": " + len);
+ }
+ break;
+ }
+ case DECIMALV2: {
+ int precision = scalarType.decimalPrecision();
+ int scale = scalarType.decimalScale();
+ // precision: [1, 27]
+ if (precision < 1 || precision > ScalarType.MAX_DECIMALV2_PRECISION) {
+ throw new AnalysisException("Precision of decimal must between 1 and 27."
+ + " Precision was set to: " + precision + ".");
+ }
+ // scale: [0, 9]
+ if (scale < 0 || scale > ScalarType.MAX_DECIMALV2_SCALE) {
+ throw new AnalysisException("Scale of decimal must between 0 and 9."
+ + " Scale was set to: " + scale + ".");
+ }
+ if (precision - scale > ScalarType.MAX_DECIMALV2_PRECISION
+ - ScalarType.MAX_DECIMALV2_SCALE) {
+ throw new AnalysisException("Invalid decimal type with precision = " + precision
+ + ", scale = " + scale);
+ }
+ // scale < precision
+ if (scale > precision) {
+ throw new AnalysisException("Scale of decimal must be smaller than precision."
+ + " Scale is " + scale + " and precision is " + precision);
+ }
+ break;
+ }
+ case DECIMAL32: {
+ int decimal32Precision = scalarType.decimalPrecision();
+ int decimal32Scale = scalarType.decimalScale();
+ if (decimal32Precision < 1
+ || decimal32Precision > ScalarType.MAX_DECIMAL32_PRECISION) {
+ throw new AnalysisException("Precision of decimal must between 1 and 9."
+ + " Precision was set to: " + decimal32Precision + ".");
+ }
+ // scale >= 0
+ if (decimal32Scale < 0) {
+ throw new AnalysisException("Scale of decimal must not be less than 0."
+ + " Scale was set to: " + decimal32Scale + ".");
+ }
+ // scale < precision
+ if (decimal32Scale > decimal32Precision) {
+ throw new AnalysisException(
+ "Scale of decimal must be smaller than precision." + " Scale is "
+ + decimal32Scale + " and precision is " + decimal32Precision);
+ }
+ break;
+ }
+ case DECIMAL64: {
+ int decimal64Precision = scalarType.decimalPrecision();
+ int decimal64Scale = scalarType.decimalScale();
+ if (decimal64Precision < 1
+ || decimal64Precision > ScalarType.MAX_DECIMAL64_PRECISION) {
+ throw new AnalysisException("Precision of decimal64 must between 1 and 18."
+ + " Precision was set to: " + decimal64Precision + ".");
+ }
+ // scale >= 0
+ if (decimal64Scale < 0) {
+ throw new AnalysisException("Scale of decimal must not be less than 0."
+ + " Scale was set to: " + decimal64Scale + ".");
+ }
+ // scale < precision
+ if (decimal64Scale > decimal64Precision) {
+ throw new AnalysisException(
+ "Scale of decimal must be smaller than precision." + " Scale is "
+ + decimal64Scale + " and precision is " + decimal64Precision);
+ }
+ break;
+ }
+ case DECIMAL128: {
+ int decimal128Precision = scalarType.decimalPrecision();
+ int decimal128Scale = scalarType.decimalScale();
+ if (decimal128Precision < 1
+ || decimal128Precision > ScalarType.MAX_DECIMAL128_PRECISION) {
+ throw new AnalysisException("Precision of decimal128 must between 1 and 38."
+ + " Precision was set to: " + decimal128Precision + ".");
+ }
+ // scale >= 0
+ if (decimal128Scale < 0) {
+ throw new AnalysisException("Scale of decimal must not be less than 0."
+ + " Scale was set to: " + decimal128Scale + ".");
+ }
+ // scale < precision
+ if (decimal128Scale > decimal128Precision) {
+ throw new AnalysisException(
+ "Scale of decimal must be smaller than precision." + " Scale is "
+ + decimal128Scale + " and precision is " + decimal128Precision);
+ }
+ break;
+ }
+ case DECIMAL256: {
+ if (SessionVariable.getEnableDecimal256()) {
+ int precision = scalarType.decimalPrecision();
+ int scale = scalarType.decimalScale();
+ if (precision < 1 || precision > ScalarType.MAX_DECIMAL256_PRECISION) {
+ throw new AnalysisException("Precision of decimal256 must between 1 and 76."
+ + " Precision was set to: " + precision + ".");
+ }
+ // scale >= 0
+ if (scale < 0) {
+ throw new AnalysisException("Scale of decimal must not be less than 0."
+ + " Scale was set to: " + scale + ".");
+ }
+ // scale < precision
+ if (scale > precision) {
+ throw new AnalysisException(
+ "Scale of decimal must be smaller than precision." + " Scale is "
+ + scale + " and precision is " + precision);
+ }
+ break;
+ } else {
+ int precision = scalarType.decimalPrecision();
+ throw new AnalysisException("Column of type Decimal256 with precision "
+ + precision + " in not supported.");
+ }
+ }
+ case TIMEV2:
+ case DATETIMEV2: {
+ int precision = scalarType.decimalPrecision();
+ int scale = scalarType.decimalScale();
+ // precision: [1, 27]
+ if (precision != ScalarType.DATETIME_PRECISION) {
+ throw new AnalysisException(
+ "Precision of Datetime/Time must be " + ScalarType.DATETIME_PRECISION
+ + "." + " Precision was set to: " + precision + ".");
+ }
+ // scale: [0, 9]
+ if (scale < 0 || scale > 6) {
+ throw new AnalysisException("Scale of Datetime/Time must between 0 and 6."
+ + " Scale was set to: " + scale + ".");
+ }
+ break;
+ }
+ case INVALID_TYPE:
+ throw new AnalysisException("Invalid type.");
+ default:
+ break;
+ }
+ }
+
+ private void validateNestedType(Type parent, Type child) throws AnalysisException {
+ if (child.isNull()) {
+ throw new AnalysisException("Unsupported data type: " + child.toSql());
+ }
+ // check whether the sub-type is supported
+ if (!parent.supportSubType(child)) {
+ throw new AnalysisException(
+ parent.getPrimitiveType() + " unsupported sub-type: " + child.toSql());
+ }
+ validateDataType(child);
+ }
+
/**
* translate to catalog create table stmt
*/
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/FixedRangePartition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/FixedRangePartition.java
index 7655c6b3285..104ea0a3eba 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/FixedRangePartition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/FixedRangePartition.java
@@ -20,10 +20,10 @@ package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.analysis.PartitionKeyDesc;
import org.apache.doris.analysis.PartitionValue;
import org.apache.doris.analysis.SinglePartitionDesc;
+import org.apache.doris.common.FeNameFormat;
+import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
-import com.google.common.collect.Maps;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -33,12 +33,12 @@ import java.util.stream.Collectors;
* represent fixed range partition
*/
public class FixedRangePartition extends PartitionDefinition {
- private final String partitionName;
private List<Expression> lowerBounds;
private List<Expression> upperBounds;
- public FixedRangePartition(String partitionName, List<Expression> lowerBounds, List<Expression> upperBounds) {
- this.partitionName = partitionName;
+ public FixedRangePartition(boolean ifNotExists, String partitionName,
+ List<Expression> lowerBounds, List<Expression> upperBounds) {
+ super(ifNotExists, partitionName);
this.lowerBounds = lowerBounds;
this.upperBounds = upperBounds;
}
@@ -46,6 +46,11 @@ public class FixedRangePartition extends PartitionDefinition {
@Override
public void validate(Map<String, String> properties) {
super.validate(properties);
+ try {
+ FeNameFormat.checkPartitionName(partitionName);
+ } catch (Exception e) {
+ throw new AnalysisException(e.getMessage(), e.getCause());
+ }
List<Expression> newLowerBounds = new ArrayList<>();
List<Expression> newUpperBounds = new ArrayList<>();
for (int i = 0; i < partitionTypes.size(); ++i) {
@@ -72,7 +77,9 @@ public class FixedRangePartition extends PartitionDefinition {
.collect(Collectors.toList());
List<PartitionValue> upperValues = upperBounds.stream().map(this::toLegacyPartitionValueStmt)
.collect(Collectors.toList());
- return new SinglePartitionDesc(false, partitionName,
- PartitionKeyDesc.createFixed(lowerValues, upperValues), replicaAllocation, Maps.newHashMap());
+ return new SinglePartitionDesc(ifNotExists, partitionName,
+ PartitionKeyDesc.createFixed(lowerValues, upperValues), replicaAllocation,
+ properties, partitionDataProperty, isInMemory, tabletType, versionInfo,
+ storagePolicy, isMutable);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/InPartition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/InPartition.java
index 30dfcb9efce..611da907e15 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/InPartition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/InPartition.java
@@ -21,11 +21,10 @@ import org.apache.doris.analysis.AllPartitionDesc;
import org.apache.doris.analysis.PartitionKeyDesc;
import org.apache.doris.analysis.PartitionValue;
import org.apache.doris.analysis.SinglePartitionDesc;
+import org.apache.doris.common.FeNameFormat;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
-import com.google.common.collect.Maps;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -35,17 +34,21 @@ import java.util.stream.Collectors;
* represent in partition
*/
public class InPartition extends PartitionDefinition {
- private final String partitionName;
private final List<List<Expression>> values;
- public InPartition(String partitionName, List<List<Expression>> values) {
- this.partitionName = partitionName;
+ public InPartition(boolean ifNotExists, String partitionName, List<List<Expression>> values) {
+ super(ifNotExists, partitionName);
this.values = values;
}
@Override
public void validate(Map<String, String> properties) {
super.validate(properties);
+ try {
+ FeNameFormat.checkPartitionName(partitionName);
+ } catch (Exception e) {
+ throw new AnalysisException(e.getMessage(), e.getCause());
+ }
if (values.stream().anyMatch(l -> l.stream().anyMatch(MaxValue.class::isInstance))) {
throw new AnalysisException("MAXVALUE cannot be used in 'in partition'");
}
@@ -65,7 +68,9 @@ public class InPartition extends PartitionDefinition {
List<List<PartitionValue>> catalogValues = values.stream().map(l -> l.stream()
.map(this::toLegacyPartitionValueStmt)
.collect(Collectors.toList())).collect(Collectors.toList());
- return new SinglePartitionDesc(false, partitionName, PartitionKeyDesc.createIn(catalogValues),
- replicaAllocation, Maps.newHashMap());
+ return new SinglePartitionDesc(ifNotExists, partitionName,
+ PartitionKeyDesc.createIn(catalogValues), replicaAllocation, properties,
+ partitionDataProperty, isInMemory, tabletType, versionInfo, storagePolicy,
+ isMutable);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/LessThanPartition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/LessThanPartition.java
index 11a6f4f50da..627c514a550 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/LessThanPartition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/LessThanPartition.java
@@ -20,10 +20,10 @@ package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.analysis.PartitionKeyDesc;
import org.apache.doris.analysis.PartitionValue;
import org.apache.doris.analysis.SinglePartitionDesc;
+import org.apache.doris.common.FeNameFormat;
+import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
-import com.google.common.collect.Maps;
-
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -32,17 +32,21 @@ import java.util.stream.Collectors;
* represent less than partition
*/
public class LessThanPartition extends PartitionDefinition {
- private final String partitionName;
private final List<Expression> values;
- public LessThanPartition(String partitionName, List<Expression> values) {
- this.partitionName = partitionName;
+ public LessThanPartition(boolean ifNotExists, String partitionName, List<Expression> values) {
+ super(ifNotExists, partitionName);
this.values = values;
}
@Override
public void validate(Map<String, String> properties) {
super.validate(properties);
+ try {
+ FeNameFormat.checkPartitionName(partitionName);
+ } catch (Exception e) {
+ throw new AnalysisException(e.getMessage(), e.getCause());
+ }
}
public String getPartitionName() {
@@ -54,13 +58,16 @@ public class LessThanPartition extends PartitionDefinition {
*/
public SinglePartitionDesc translateToCatalogStyle() {
if (values.get(0) instanceof MaxValue) {
- return new SinglePartitionDesc(false, partitionName, PartitionKeyDesc.createMaxKeyDesc(),
- replicaAllocation, Maps.newHashMap());
+ return new SinglePartitionDesc(ifNotExists, partitionName,
+ PartitionKeyDesc.createMaxKeyDesc(), replicaAllocation, properties,
+ partitionDataProperty, isInMemory, tabletType, versionInfo, storagePolicy,
+ isMutable);
}
- List<PartitionValue> partitionValues = values.stream()
- .map(this::toLegacyPartitionValueStmt)
- .collect(Collectors.toList());
- return new SinglePartitionDesc(false, partitionName,
- PartitionKeyDesc.createLessThan(partitionValues), replicaAllocation, Maps.newHashMap());
+ List<PartitionValue> partitionValues =
+ values.stream().map(this::toLegacyPartitionValueStmt).collect(Collectors.toList());
+ return new SinglePartitionDesc(ifNotExists, partitionName,
+ PartitionKeyDesc.createLessThan(partitionValues), replicaAllocation, properties,
+ partitionDataProperty, isInMemory, tabletType, versionInfo, storagePolicy,
+ isMutable);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionDefinition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionDefinition.java
index 2d89ed94909..81ddd7b2ac2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionDefinition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionDefinition.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.plans.commands.info;
import org.apache.doris.analysis.AllPartitionDesc;
import org.apache.doris.analysis.PartitionValue;
+import org.apache.doris.catalog.DataProperty;
import org.apache.doris.catalog.ReplicaAllocation;
import org.apache.doris.common.util.PropertyAnalyzer;
import org.apache.doris.nereids.exceptions.AnalysisException;
@@ -27,6 +28,11 @@ import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.thrift.TTabletType;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
@@ -35,9 +41,25 @@ import java.util.Map;
* abstract class for partition definition
*/
public abstract class PartitionDefinition {
- protected List<DataType> partitionTypes;
+
+ protected boolean ifNotExists;
+ protected String partitionName;
protected Map<String, String> properties;
+
+ protected List<DataType> partitionTypes;
+ protected DataProperty partitionDataProperty =
+ new DataProperty(DataProperty.DEFAULT_STORAGE_MEDIUM);
protected ReplicaAllocation replicaAllocation = ReplicaAllocation.DEFAULT_ALLOCATION;
+ protected boolean isInMemory = false;
+ protected TTabletType tabletType = TTabletType.TABLET_TYPE_DISK;
+ protected Long versionInfo;
+ protected String storagePolicy = "";
+ protected boolean isMutable;
+
+ public PartitionDefinition(boolean ifNotExists, String partName) {
+ this.ifNotExists = ifNotExists;
+ this.partitionName = partName;
+ }
public PartitionDefinition withProperties(Map<String, String> properties) {
this.properties = properties;
@@ -50,12 +72,74 @@ public abstract class PartitionDefinition {
* Validate the properties.
* Derived class can override this method to do more validation.
*/
- public void validate(Map<String, String> properties) {
+ public void validate(Map<String, String> otherProperties) {
try {
+ if (PropertyAnalyzer.analyzeUniqueKeyMergeOnWrite(otherProperties)) {
+ String storagePolicy = PropertyAnalyzer.analyzeStoragePolicy(properties);
+ if (!storagePolicy.isEmpty()) {
+ throw new AnalysisException(
+ "Can not create UNIQUE KEY table that enables Merge-On-write"
+ + " with storage policy(" + storagePolicy + ")");
+ }
+ }
+ boolean hasStoragePolicy = false;
+ if (properties != null) {
+ hasStoragePolicy = properties.keySet().stream().anyMatch(iter -> {
+ boolean equal = iter
+ .compareToIgnoreCase(PropertyAnalyzer.PROPERTIES_STORAGE_POLICY) == 0;
+ // when find has storage policy properties, here will set it in partition
+ if (equal) {
+ storagePolicy = properties.get(iter);
+ }
+ return equal;
+ });
+ }
+
+ Map<String, String> mergedMap = Maps.newHashMap();
+ // Should putAll `otherProperties` before `this.properties`,
+ // because the priority of partition is higher than table
+ if (otherProperties != null) {
+ mergedMap.putAll(otherProperties);
+ }
+ if (this.properties != null) {
+ mergedMap.putAll(this.properties);
+ }
+ this.properties = mergedMap;
+
+ // analyze data property
+ partitionDataProperty = PropertyAnalyzer.analyzeDataProperty(properties,
+ new DataProperty(DataProperty.DEFAULT_STORAGE_MEDIUM));
+ Preconditions.checkNotNull(partitionDataProperty);
replicaAllocation = PropertyAnalyzer.analyzeReplicaAllocation(properties, "");
if (replicaAllocation.isNotSet()) {
replicaAllocation = ReplicaAllocation.DEFAULT_ALLOCATION;
}
+ // analyze version info
+ versionInfo = PropertyAnalyzer.analyzeVersionInfo(properties);
+
+ // analyze in memory
+ isInMemory = PropertyAnalyzer.analyzeBooleanProp(properties,
+ PropertyAnalyzer.PROPERTIES_INMEMORY, false);
+ if (isInMemory == true) {
+ throw new AnalysisException("Not support set 'in_memory'='true' now!");
+ }
+
+ // analyze is mutable
+ isMutable = PropertyAnalyzer.analyzeBooleanProp(properties,
+ PropertyAnalyzer.PROPERTIES_MUTABLE, true);
+
+ tabletType = PropertyAnalyzer.analyzeTabletType(properties);
+
+ if (otherProperties == null) {
+ // check unknown properties
+ if (properties != null && !properties.isEmpty()) {
+ if (!hasStoragePolicy) {
+ Joiner.MapJoiner mapJoiner = Joiner.on(", ").withKeyValueSeparator(" = ");
+ throw new AnalysisException(
+ "Unknown properties: " + mapJoiner.join(properties));
+ }
+ }
+ }
} catch (Exception e) {
throw new AnalysisException(e.getMessage(), e.getCause());
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/StepPartition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/StepPartition.java
index a02013d3770..1de00369913 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/StepPartition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/StepPartition.java
@@ -23,8 +23,6 @@ import org.apache.doris.analysis.PartitionValue;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Expression;
-import com.google.common.collect.Maps;
-
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -38,8 +36,9 @@ public class StepPartition extends PartitionDefinition {
private final long unit;
private final String unitString;
- public StepPartition(List<Expression> fromExpression, List<Expression> toExpression, long unit,
- String unitString) {
+ public StepPartition(boolean ifNotExists, String partitionName, List<Expression> fromExpression,
+ List<Expression> toExpression, long unit, String unitString) {
+ super(ifNotExists, partitionName);
this.fromExpression = fromExpression;
this.toExpression = toExpression;
this.unit = unit;
@@ -68,10 +67,10 @@ public class StepPartition extends PartitionDefinition {
try {
if (unitString == null) {
return new MultiPartitionDesc(PartitionKeyDesc.createMultiFixed(fromValues, toValues, unit),
- replicaAllocation, Maps.newHashMap());
+ replicaAllocation, properties);
}
return new MultiPartitionDesc(PartitionKeyDesc.createMultiFixed(fromValues, toValues, unit, unitString),
- replicaAllocation, Maps.newHashMap());
+ replicaAllocation, properties);
} catch (Exception e) {
throw new AnalysisException(e.getMessage(), e.getCause());
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MappingTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MappingTest.java
index e0322852433..d818c15b4b9 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MappingTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/MappingTest.java
@@ -64,7 +64,7 @@ public class MappingTest extends TestWithFeService {
+ ")");
createTable("CREATE TABLE IF NOT EXISTS customer (\n"
+ " C_CUSTKEY INTEGER NOT NULL,\n"
- + " C_NAME VARCHAR(25) NOT NULL,\n"
+ + " C_NAME VARCHAR(25) NOT NULL\n"
+ ")\n"
+ "DUPLICATE KEY(C_CUSTKEY, C_NAME)\n"
+ "DISTRIBUTED BY HASH(C_CUSTKEY) BUCKETS 3\n"
diff --git a/regression-test/suites/correctness_p0/test_agg_materialize.groovy b/regression-test/suites/correctness_p0/test_agg_materialize.groovy
index 3f79013ea01..eb44b85fafc 100644
--- a/regression-test/suites/correctness_p0/test_agg_materialize.groovy
+++ b/regression-test/suites/correctness_p0/test_agg_materialize.groovy
@@ -34,7 +34,7 @@ suite("test_agg_materialize") {
sql """drop table if exists c5749_bug_t;"""
sql """CREATE TABLE `c5749_bug_t` (
`org_code` varchar(255) NULL ,
- `cash_amt` decimal(27, 9) NULL ,
+ `cash_amt` decimal(27, 9) NULL
) ENGINE=OLAP
DUPLICATE KEY(`org_code`)
diff --git a/regression-test/suites/datatype_p0/date/test_date_key.groovy b/regression-test/suites/datatype_p0/date/test_date_key.groovy
index 22c9a018dd3..dbbe7f68705 100644
--- a/regression-test/suites/datatype_p0/date/test_date_key.groovy
+++ b/regression-test/suites/datatype_p0/date/test_date_key.groovy
@@ -20,7 +20,7 @@ suite("test_date_key") {
sql """
create table `test_date_key` (
`k1` datev1, `k2` int,
- INDEX idx_k1 (`k1`) USING BITMAP,
+ INDEX idx_k1 (`k1`) USING BITMAP
) duplicate key(`k1`)
distributed by hash(k2) buckets 3
properties("replication_num" = "1");
diff --git a/regression-test/suites/datatype_p0/date/test_datetime_key.groovy b/regression-test/suites/datatype_p0/date/test_datetime_key.groovy
index 848cdc1a4c5..e349244adc4 100644
--- a/regression-test/suites/datatype_p0/date/test_datetime_key.groovy
+++ b/regression-test/suites/datatype_p0/date/test_datetime_key.groovy
@@ -20,7 +20,7 @@ suite("test_datetime_key") {
sql """
create table `test_datetime_key` (
`k1` datetimev1, `k2` int,
- INDEX idx_k1 (`k1`) USING BITMAP,
+ INDEX idx_k1 (`k1`) USING BITMAP
) duplicate key(`k1`)
distributed by hash(k2) buckets 3
properties("replication_num" = "1");
diff --git a/regression-test/suites/datatype_p0/datetimev1/test_datetimev1_calc.groovy b/regression-test/suites/datatype_p0/datetimev1/test_datetimev1_calc.groovy
index 8b404db4e69..399d49bc94a 100644
--- a/regression-test/suites/datatype_p0/datetimev1/test_datetimev1_calc.groovy
+++ b/regression-test/suites/datatype_p0/datetimev1/test_datetimev1_calc.groovy
@@ -29,7 +29,7 @@ suite("test_datetimev1_calc", "nonConcurrent") {
CREATE TABLE IF NOT EXISTS `${table1}` (
`id` int,
`value1` datetimev1 NULL COMMENT "",
- `value2` datetimev1 NULL COMMENT "",
+ `value2` datetimev1 NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
COMMENT "OLAP"
diff --git a/regression-test/suites/datatype_p0/datev1/test_datev1_calc.groovy b/regression-test/suites/datatype_p0/datev1/test_datev1_calc.groovy
index 3c875633e94..ec7a2738e45 100644
--- a/regression-test/suites/datatype_p0/datev1/test_datev1_calc.groovy
+++ b/regression-test/suites/datatype_p0/datev1/test_datev1_calc.groovy
@@ -29,7 +29,7 @@ suite("test_datev1_calc", "nonConcurrent") {
CREATE TABLE IF NOT EXISTS `${table1}` (
`id` int,
`value1` datev1 NULL COMMENT "",
- `value2` datev1 NULL COMMENT "",
+ `value2` datev1 NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
COMMENT "OLAP"
diff --git a/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc.groovy b/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc.groovy
index e2439c6229d..30aa98c9fb6 100644
--- a/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc.groovy
+++ b/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc.groovy
@@ -31,7 +31,7 @@ suite("test_decimalv2_calc", "nonConcurrent") {
`decimal_key1` decimalv2(8, 5) NULL COMMENT "",
`decimal_key2` decimalv2(16, 5) NULL COMMENT "",
`decimal_value1` decimalv2(8, 5) NULL COMMENT "",
- `decimal_value2` decimalv2(16, 5) NULL COMMENT "",
+ `decimal_value2` decimalv2(16, 5) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`decimal_key1`, `decimal_key2`)
COMMENT "OLAP"
diff --git a/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc_with_conversion.groovy b/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc_with_conversion.groovy
index f500c195b26..c8c196311f4 100644
--- a/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc_with_conversion.groovy
+++ b/regression-test/suites/datatype_p0/decimalv2/test_decimalv2_calc_with_conversion.groovy
@@ -31,7 +31,7 @@ suite("test_decimalv2_calc_with_conversion", "nonConcurrent") {
`decimal_key1` decimalv2(8, 5) NULL COMMENT "",
`decimal_key2` decimalv2(16, 5) NULL COMMENT "",
`decimal_value1` decimalv2(8, 5) NULL COMMENT "",
- `decimal_value2` decimalv2(16, 5) NULL COMMENT "",
+ `decimal_value2` decimalv2(16, 5) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`decimal_key1`, `decimal_key2`)
COMMENT "OLAP"
diff --git a/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_overflow.groovy b/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_overflow.groovy
index f371c4c812f..384ba1fd8c3 100644
--- a/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_overflow.groovy
+++ b/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_overflow.groovy
@@ -32,7 +32,7 @@ suite("test_decimalv3_overflow") {
def tblName2 = "test_decimalv3_overflow2"
sql "drop table if exists ${tblName2}"
sql """ CREATE TABLE ${tblName2} (
- `c2` decimalv3(20, 2),
+ `c2` decimalv3(20, 2)
) ENGINE=OLAP
UNIQUE KEY(`c2`)
DISTRIBUTED BY HASH(`c2`) BUCKETS 10
diff --git a/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv2.groovy b/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv2.groovy
index 90efdd3a216..ca2ea138d6b 100644
--- a/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv2.groovy
+++ b/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv2.groovy
@@ -26,7 +26,7 @@ suite("test_uniq_tab_decimalv2") {
`decimal_key1` decimalv2(8, 5) NULL COMMENT "",
`decimal_key2` decimalv2(16, 5) NULL COMMENT "",
`decimal_value1` decimalv2(8, 5) NULL COMMENT "",
- `decimal_value2` decimalv2(16, 5) NULL COMMENT "",
+ `decimal_value2` decimalv2(16, 5) NULL COMMENT ""
) ENGINE=OLAP
UNIQUE KEY(`decimal_key1`, `decimal_key2`)
COMMENT "OLAP"
diff --git a/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_unsupport_types.groovy b/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_unsupport_types.groovy
index 45b4176c0ba..7a6b1218b7d 100644
--- a/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_unsupport_types.groovy
+++ b/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_unsupport_types.groovy
@@ -25,7 +25,7 @@ suite("create_nestedtypes_with_unsupport_types") {
sql """
CREATE TABLE IF NOT EXISTS ${testTablex} (
`k1` INT(11) NULL,
- `k2` array<${columnType}> NULL,
+ `k2` array<${columnType}> NULL
)
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -48,7 +48,7 @@ suite("create_nestedtypes_with_unsupport_types") {
sql """
CREATE TABLE IF NOT EXISTS ${testTablex} (
`k1` INT(11) NULL,
- `k2` map<${columnType}, String> NULL,
+ `k2` map<${columnType}, String> NULL
)
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -60,7 +60,7 @@ suite("create_nestedtypes_with_unsupport_types") {
sql """
CREATE TABLE IF NOT EXISTS ${testTablex} (
`k1` INT(11) NULL,
- `k2` map<String, ${columnType}> NULL,
+ `k2` map<String, ${columnType}> NULL
)
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -84,7 +84,7 @@ suite("create_nestedtypes_with_unsupport_types") {
sql """
CREATE TABLE IF NOT EXISTS ${testTablex} (
`k1` INT(11) NULL,
- `k2` STRUCT<f1:${columnType}> NULL,
+ `k2` STRUCT<f1:${columnType}> NULL
)
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
diff --git a/regression-test/suites/load_p0/routine_load/ddl/dup_tbl_basic_multi_table_create.sql b/regression-test/suites/load_p0/routine_load/ddl/dup_tbl_basic_multi_table_create.sql
index ea0a1fe63d6..63ab9c268a5 100644
--- a/regression-test/suites/load_p0/routine_load/ddl/dup_tbl_basic_multi_table_create.sql
+++ b/regression-test/suites/load_p0/routine_load/ddl/dup_tbl_basic_multi_table_create.sql
@@ -29,7 +29,7 @@ CREATE TABLE routine_load_dup_tbl_basic_multi_table
INDEX idx_ngrambf_k116 (`k16`) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="256"),
INDEX idx_ngrambf_k117 (`k17`) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="256"),
- INDEX idx_bitmap_k104 (`k02`) USING BITMAP,
+ INDEX idx_bitmap_k104 (`k02`) USING BITMAP
)
DUPLICATE KEY(k00)
diff --git a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.groovy b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.groovy
index 83431ede6ab..1a5d3ca7a0a 100644
--- a/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.groovy
+++ b/regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.groovy
@@ -23,7 +23,7 @@ suite("test_date_or_datetime_computation_negative") {
`dateV2` DATEV2 NOT NULL,
`dateV2_null` DATEV2 NULL,
`datetime` DATETIME NOT NULL,
- `datetime_null` DATETIME NULL, )
+ `datetime_null` DATETIME NULL )
DUPLICATE KEY(`row_id`)
DISTRIBUTED BY HASH(`row_id`) BUCKETS 1
PROPERTIES (
diff --git a/regression-test/suites/query_p0/session_variable/test_default_limit.groovy b/regression-test/suites/query_p0/session_variable/test_default_limit.groovy
index ad28f98aa39..4133ccc3397 100644
--- a/regression-test/suites/query_p0/session_variable/test_default_limit.groovy
+++ b/regression-test/suites/query_p0/session_variable/test_default_limit.groovy
@@ -23,7 +23,7 @@ suite('test_default_limit', "arrow_flight_sql") {
create table baseall (
k0 int,
k1 int,
- k2 int,
+ k2 int
)
distributed by hash(k0) buckets 16
properties(
@@ -35,7 +35,7 @@ suite('test_default_limit', "arrow_flight_sql") {
create table bigtable (
k0 int,
k1 int,
- k2 int,
+ k2 int
)
distributed by hash(k0) buckets 16
properties(
diff --git a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_count_distinct_with_collection_type.groovy b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_count_distinct_with_collection_type.groovy
index 96cdc229de8..b062920aa44 100644
--- a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_count_distinct_with_collection_type.groovy
+++ b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_count_distinct_with_collection_type.groovy
@@ -24,7 +24,7 @@ suite("test_count_distinct_with_collection_type", "p0") {
`id` int(11) NULL,
`a` array<text> NULL,
`m` map<text, int> NULL,
- `s` STRUCT<f1:INT, f2:VARCHAR(30), f3: DECIMAL> NULL,
+ `s` STRUCT<f1:INT, f2:VARCHAR(30), f3: DECIMAL> NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
COMMENT 'OLAP'
diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
index c043ada07af..858a4bdbd37 100644
--- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
+++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
@@ -314,7 +314,7 @@ suite("test_array_functions") {
`kdcmlv3s1` decimalv3(9, 3) null,
`kdcmlv3s2` decimalv3(15, 5) null,
`kdcmlv3s3` decimalv3(27, 9) null,
- `kadcml` array<decimal(27, 9)> null,
+ `kadcml` array<decimal(27, 9)> null
) engine=olap
DISTRIBUTED BY HASH(`id`) BUCKETS 1
properties("replication_num" = "1")
diff --git a/regression-test/suites/query_p0/sql_functions/size_funciton/test_size_function.groovy b/regression-test/suites/query_p0/sql_functions/size_funciton/test_size_function.groovy
index fe2607ecb12..93f1b581587 100644
--- a/regression-test/suites/query_p0/sql_functions/size_funciton/test_size_function.groovy
+++ b/regression-test/suites/query_p0/sql_functions/size_funciton/test_size_function.groovy
@@ -37,7 +37,7 @@ suite("test_size_function") {
`id` int(11) NULL,
`c_array1` array<int(11)> NULL,
`c_array2` array<varchar(20)> NULL,
- `c_map` map<int(11), string> NULL,
+ `c_map` map<int(11), string> NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 1
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org