From e93c3afadad05fa16ae42de0097facf425971370 Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Wed, 9 Sep 2020 23:03:07 +0800 Subject: [PATCH 1/7] enable sequence col --- fe/fe-core/src/main/cup/sql_parser.cup | 4 ++ .../doris/alter/MaterializedViewHandler.java | 13 ---- .../doris/alter/SchemaChangeHandler.java | 12 ++++ .../apache/doris/analysis/AlterTableStmt.java | 69 +++++++++++++++---- .../org/apache/doris/analysis/ColumnDef.java | 9 +++ .../doris/analysis/EnableFeatureClause.java | 27 ++++++++ .../org/apache/doris/catalog/OlapTable.java | 7 +- 7 files changed, 114 insertions(+), 27 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index e79acd39eb736b..f40a077a307079 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -981,6 +981,10 @@ alter_table_clause ::= {: RESULT = new EnableFeatureClause(featureName); :} + | KW_ENABLE KW_FEATURE STRING_LITERAL:featureName KW_WITH opt_properties:properties + {: + RESULT = new EnableFeatureClause(featureName, properties); + :} ; alter_system_clause ::= diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java index d6c7c037be95b3..9a8feabe761672 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java @@ -553,19 +553,6 @@ public List checkAndPrepareMaterializedView(AddRollupClause addRollupCla } } } - if (KeysType.UNIQUE_KEYS == keysType && olapTable.hasSequenceCol()) { - if (meetValue) { - // check sequence column already exist in the rollup schema - for (Column col : rollupSchema) { - if (col.isSequenceColumn()) { - throw new DdlException("sequence column already exist in the Rollup schema"); - } - } - // add the sequence column - rollupSchema.add(new Column(Column.SEQUENCE_COL, olapTable.getSequenceType(), - false, AggregateType.REPLACE, true, null, "", false)); - } - } } else if (KeysType.DUP_KEYS == keysType) { // supplement the duplicate key if (addRollupClause.getDupKeys() == null || addRollupClause.getDupKeys().isEmpty()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index 916eb73398bcaa..b4c5617afdeede 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -55,6 +55,7 @@ import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Tablet; import org.apache.doris.catalog.TabletMeta; +import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; @@ -890,6 +891,17 @@ private void createJob(long dbId, OlapTable olapTable, Map clauses = new ArrayList<>(); for (AlterClause alterClause : ops) { - if (alterClause instanceof EnableFeatureClause - && ((EnableFeatureClause) alterClause).getFeature() == EnableFeatureClause.Features.BATCH_DELETE) { + if (alterClause instanceof EnableFeatureClause) { + EnableFeatureClause.Features alterFeature = ((EnableFeatureClause) alterClause).getFeature(); + if (alterFeature == null || alterFeature == EnableFeatureClause.Features.UNKNOWN) { + throw new AnalysisException("unknown feature for alter clause"); + } if (table.getKeysType() != KeysType.UNIQUE_KEYS) { - throw new AnalysisException("Batch delete only supported in unique tables."); + throw new AnalysisException("enable feature only supported in unique tables now."); } + // analyse sequence column + Type sequenceColType = null; + if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + Map propertyMap = alterClause.getProperties(); + try { + sequenceColType = PropertyAnalyzer.analyzeSequenceType(propertyMap, table.getKeysType()); + if (sequenceColType == null) { + throw new AnalysisException("unknown sequence column type"); + } + } catch (Exception e) { + throw new AnalysisException(e.getMessage()); + } + } + // has rollup table if (table.getVisibleIndex().size() > 1) { for (MaterializedIndex idx : table.getVisibleIndex()) { @@ -92,27 +112,50 @@ public void rewriteAlterClause(OlapTable table) throws UserException { if (idx.getId() == table.getBaseIndexId()) { continue; } - AddColumnClause addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, - table.getIndexNameById(idx.getId()), null); + AddColumnClause addColumnClause = null; + if (alterFeature == EnableFeatureClause.Features.BATCH_DELETE) { + addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, + table.getIndexNameById(idx.getId()), null); + } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + addColumnClause = new AddColumnClause(ColumnDef.newSequenceColumnDef(sequenceColType), null, + table.getIndexNameById(idx.getId()), null); + } else { + throw new AnalysisException("unknown feature : " + alterFeature); + } addColumnClause.analyze(analyzer); clauses.add(addColumnClause); } } else { // no rollup tables - AddColumnClause addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, - null, null); + AddColumnClause addColumnClause = null; + if (alterFeature == EnableFeatureClause.Features.BATCH_DELETE) { + addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, + null, null); + } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + addColumnClause = new AddColumnClause(ColumnDef.newSequenceColumnDef(sequenceColType), null, + null, null); + } addColumnClause.analyze(analyzer); clauses.add(addColumnClause); } // add hidden column to rollup table } else if (alterClause instanceof AddRollupClause && table.getKeysType() == KeysType.UNIQUE_KEYS - && table.getColumn(Column.DELETE_SIGN) != null) { - if (!((AddRollupClause) alterClause).getColumnNames() - .stream() - .anyMatch(x -> x.equalsIgnoreCase(Column.DELETE_SIGN))) { - ((AddRollupClause) alterClause).getColumnNames().add(Column.DELETE_SIGN); - alterClause.analyze(analyzer); + && table.hasHiddenColumn()) { + if (table.getColumn(Column.DELETE_SIGN) != null) { + if (!((AddRollupClause) alterClause).getColumnNames() + .stream() + .anyMatch(x -> x.equalsIgnoreCase(Column.DELETE_SIGN))) { + ((AddRollupClause) alterClause).getColumnNames().add(Column.DELETE_SIGN); + } + } + if (table.getColumn(Column.SEQUENCE_COL) != null) { + if (!((AddRollupClause) alterClause).getColumnNames() + .stream() + .anyMatch(x -> x.equalsIgnoreCase(Column.SEQUENCE_COL))) { + ((AddRollupClause) alterClause).getColumnNames().add(Column.SEQUENCE_COL); + } } + alterClause.analyze(analyzer); clauses.add(alterClause); } else { clauses.add(alterClause); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java index 19aae854e9dd6d..11a97d9060fe23 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -118,6 +118,15 @@ public static ColumnDef newDeleteSignColumnDef(AggregateType aggregateType) { new ColumnDef.DefaultValue(true, "0"), "doris delete flag hidden column", false); } + public static ColumnDef newSequenceColumnDef(Type type) { + return new ColumnDef(Column.SEQUENCE_COL, new TypeDef(type), false, null, true, DefaultValue.NULL_DEFAULT_VALUE, + "sequence column hidden column", false); + } + + public static ColumnDef newSequenceColumnDef(Type type, AggregateType aggregateType) { + return new ColumnDef(Column.SEQUENCE_COL, new TypeDef(type), false, aggregateType, true, DefaultValue.NULL_DEFAULT_VALUE, + "sequence column hidden column", false); + } public boolean isAllowNull() { return isAllowNull; } public String getDefaultValue() { return defaultValue.value; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java index 56c0cd5971c748..6adbe0a6cf07c9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java @@ -21,25 +21,35 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; +import org.apache.doris.common.util.PrintableMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Map; + public class EnableFeatureClause extends AlterTableClause { private static final Logger LOG = LogManager.getLogger(EnableFeatureClause.class); public enum Features { BATCH_DELETE, + SEQUENCE_COLUMN, UNKNOWN } private String featureName; private boolean needSchemaChange; private Features feature; + private Map properties; public EnableFeatureClause(String featureName) { + this(featureName, null); + } + + public EnableFeatureClause(String featureName, Map properties) { super(AlterOpType.ENABLE_FEATURE); this.featureName = featureName; this.needSchemaChange = false; + this.properties = properties; } public boolean needSchemaChange() { @@ -50,6 +60,11 @@ public Features getFeature() { return feature; } + @Override + public Map getProperties() { + return this.properties; + } + @Override public void analyze(Analyzer analyzer) throws UserException { switch (featureName.toUpperCase()) { @@ -57,6 +72,13 @@ public void analyze(Analyzer analyzer) throws UserException { this.needSchemaChange = true; this.feature = Features.BATCH_DELETE; break; + case "SEQUENCE_COLUMN": + this.needSchemaChange = true; + this.feature = Features.SEQUENCE_COLUMN; + if (properties == null || properties.isEmpty()) { + throw new AnalysisException("Properties is not set"); + } + break; default: throw new AnalysisException("unknown feature name: " + featureName); } @@ -66,6 +88,11 @@ public void analyze(Analyzer analyzer) throws UserException { public String toSql() { StringBuilder sb = new StringBuilder(); sb.append("ENABLE FEATURE \"").append(featureName).append("\""); + if (properties != null && !properties.isEmpty()) { + sb.append(" WITH PROPERTIES ("); + sb.append(new PrintableMap(properties, "=", true, false)); + sb.append(")"); + } return sb.toString(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index bb8deb4c1fc0eb..b2e334eb23bfc4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -19,6 +19,7 @@ import org.apache.doris.alter.MaterializedViewHandler; import org.apache.doris.analysis.AggregateInfo; +import org.apache.doris.analysis.ColumnDef; import org.apache.doris.analysis.CreateTableStmt; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.SlotDescriptor; @@ -810,7 +811,7 @@ public void setSequenceInfo(Type type) { this.sequenceType = type; // sequence column is value column with REPLACE aggregate type - Column sequenceCol = new Column(Column.SEQUENCE_COL, type, false, AggregateType.REPLACE, true, null, "", false); + Column sequenceCol = ColumnDef.newSequenceColumnDef(type, AggregateType.REPLACE).toColumn(); // add sequence column at last fullSchema.add(sequenceCol); nameToColumn.put(Column.SEQUENCE_COL, sequenceCol); @@ -833,6 +834,10 @@ public Boolean hasSequenceCol() { return getSequenceCol() != null; } + public boolean hasHiddenColumn() { + return getBaseSchema().stream().anyMatch(column -> !column.isVisible()); + } + public Type getSequenceType() { if (getSequenceCol() == null) { return null; From 0fca435eff2b2b3c87c95ef633d539f6dcd5d589 Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Thu, 10 Sep 2020 13:10:48 +0800 Subject: [PATCH 2/7] fix for materialized view --- .../java/org/apache/doris/alter/MaterializedViewHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java index 9a8feabe761672..d121a29ec7c5eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java @@ -478,6 +478,9 @@ private List checkAndPrepareMaterializedView(CreateMaterializedViewStmt if (KeysType.UNIQUE_KEYS == olapTable.getKeysType() && olapTable.hasDeleteSign()) { newMVColumns.add(new Column(olapTable.getDeleteSignColumn())); } + if (KeysType.UNIQUE_KEYS == olapTable.getKeysType() && olapTable.hasSequenceCol()) { + newMVColumns.add(new Column(olapTable.getSequenceCol())); + } return newMVColumns; } From 4891534a9607a72c579ca451dc7644f1136a8d7a Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Thu, 10 Sep 2020 15:52:27 +0800 Subject: [PATCH 3/7] add some test --- .../org/apache/doris/alter/AlterTest.java | 24 +++++++++++++++++++ .../doris/analysis/AlterTableStmtTest.java | 16 +++++++++++++ 2 files changed, 40 insertions(+) diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java index 5431eccb587396..416660c23edcd0 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java @@ -124,6 +124,21 @@ public static void beforeClass() throws Exception { " 'storage_medium' = 'SSD',\n" + " 'storage_cooldown_time' = '9999-12-31 00:00:00'\n" + ");"); + + createTable("CREATE TABLE test.tbl5\n" + + "(\n" + + " k1 date,\n" + + " k2 int,\n" + + " v1 int \n" + + ") ENGINE=OLAP\n" + + "UNIQUE KEY (k1,k2)\n" + + "PARTITION BY RANGE(k1)\n" + + "(\n" + + " PARTITION p1 values less than('2020-02-01'),\n" + + " PARTITION p2 values less than('2020-03-01')\n" + + ")\n" + + "DISTRIBUTED BY HASH(k2) BUCKETS 3\n" + + "PROPERTIES('replication_num' = '1');"); } @AfterClass @@ -161,6 +176,15 @@ private static void alterTableWithExceptionMsg(String sql, String msg) throws Ex } } + @Test + public void alterTableWithEnableFeature() throws Exception { + String stmt = "alter table test.tbl5 enable feature \"SEQUENCE_COLUMN\" with properties (\"function_column.sequence_type\" = \"int\") "; + alterTable(stmt, false); + + stmt = "alter table test.tbl5 enable feature \"SEQUENCE_COLUMN\" with properties (\"function_column.sequence_type\" = \"double\") "; + alterTable(stmt, true); + } + @Test public void testConflictAlterOperations() throws Exception { String stmt = "alter table test.tbl1 add partition p3 values less than('2020-04-01'), add partition p4 values less than('2020-05-01')"; diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java index 42da34ddbb7740..430df6946ef3cf 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java @@ -17,6 +17,7 @@ package org.apache.doris.analysis; +import com.google.common.collect.Maps; import mockit.Expectations; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; @@ -31,6 +32,7 @@ import org.junit.Test; import java.util.List; +import java.util.Map; import mockit.Mocked; @@ -106,4 +108,18 @@ public void testNoClause() throws UserException { Assert.fail("No exception throws."); } + + @Test + public void testEnableFeature() throws UserException { + List ops = Lists.newArrayList(); + Map properties = Maps.newHashMap(); + properties.put("function_column.sequence_type", "int"); + ops.add(new EnableFeatureClause("sequence_column", properties)); + AlterTableStmt stmt = new AlterTableStmt(new TableName("testDb", "testTbl"), ops); + stmt.analyze(analyzer); + + Assert.assertEquals("ALTER TABLE `testCluster:testDb`.`testTbl` ENABLE FEATURE \"sequence_column\" WITH PROPERTIES (\"function_column.sequence_type\" = \"int\")", + stmt.toSql()); + Assert.assertEquals("testCluster:testDb", stmt.getTbl().getDb()); + } } \ No newline at end of file From 98a646e6c6bddc6c2c2d344142424cffe714cf9d Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Thu, 10 Sep 2020 17:27:41 +0800 Subject: [PATCH 4/7] remove unuse --- .../org/apache/doris/alter/SchemaChangeHandler.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index b4c5617afdeede..916eb73398bcaa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -55,7 +55,6 @@ import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Tablet; import org.apache.doris.catalog.TabletMeta; -import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; @@ -891,17 +890,6 @@ private void createJob(long dbId, OlapTable olapTable, Map Date: Thu, 10 Sep 2020 21:35:00 +0800 Subject: [PATCH 5/7] fix by comment --- fe/fe-core/src/main/cup/sql_parser.cup | 16 +++++++++++----- .../apache/doris/analysis/AlterTableStmt.java | 6 +++--- .../doris/analysis/EnableFeatureClause.java | 6 +++--- .../java/org/apache/doris/alter/AlterTest.java | 4 ++-- .../doris/analysis/AlterTableStmtTest.java | 4 ++-- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index f40a077a307079..f3f09eebc71c1a 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -400,7 +400,7 @@ nonterminal SetVar option_value, option_value_follow_option_type, option_value_n nonterminal List option_value_list, option_value_list_continued, start_option_value_list, start_option_value_list_following_option_type, user_property_list; -nonterminal Map key_value_map, opt_key_value_map, opt_properties, opt_ext_properties; +nonterminal Map key_value_map, opt_key_value_map, opt_properties, opt_ext_properties, opt_enable_feature_properties; nonterminal ColumnDef column_definition; nonterminal IndexDef index_definition; nonterminal ArrayList column_definition_list; @@ -977,13 +977,19 @@ alter_table_clause ::= {: RESULT = new DropIndexClause(indexName, null, true); :} - | KW_ENABLE KW_FEATURE STRING_LITERAL:featureName + | KW_ENABLE KW_FEATURE STRING_LITERAL:featureName opt_enable_feature_properties:properties {: - RESULT = new EnableFeatureClause(featureName); + RESULT = new EnableFeatureClause(featureName, properties); :} - | KW_ENABLE KW_FEATURE STRING_LITERAL:featureName KW_WITH opt_properties:properties + ; + +opt_enable_feature_properties ::= {: - RESULT = new EnableFeatureClause(featureName, properties); + RESULT = null; + :} + | KW_WITH KW_PROPERTIES LPAREN key_value_map:map RPAREN + {: + RESULT = map; :} ; diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java index 0187a58db13bdf..0706a3ecde41dc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java @@ -92,7 +92,7 @@ public void rewriteAlterClause(OlapTable table) throws UserException { } // analyse sequence column Type sequenceColType = null; - if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + if (alterFeature == EnableFeatureClause.Features.SEQUENCE_LOAD) { Map propertyMap = alterClause.getProperties(); try { sequenceColType = PropertyAnalyzer.analyzeSequenceType(propertyMap, table.getKeysType()); @@ -116,7 +116,7 @@ public void rewriteAlterClause(OlapTable table) throws UserException { if (alterFeature == EnableFeatureClause.Features.BATCH_DELETE) { addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, table.getIndexNameById(idx.getId()), null); - } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_LOAD) { addColumnClause = new AddColumnClause(ColumnDef.newSequenceColumnDef(sequenceColType), null, table.getIndexNameById(idx.getId()), null); } else { @@ -131,7 +131,7 @@ public void rewriteAlterClause(OlapTable table) throws UserException { if (alterFeature == EnableFeatureClause.Features.BATCH_DELETE) { addColumnClause = new AddColumnClause(ColumnDef.newDeleteSignColumnDef(), null, null, null); - } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_COLUMN) { + } else if (alterFeature == EnableFeatureClause.Features.SEQUENCE_LOAD) { addColumnClause = new AddColumnClause(ColumnDef.newSequenceColumnDef(sequenceColType), null, null, null); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java index 6adbe0a6cf07c9..b145af5607dd57 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/EnableFeatureClause.java @@ -32,7 +32,7 @@ public class EnableFeatureClause extends AlterTableClause { public enum Features { BATCH_DELETE, - SEQUENCE_COLUMN, + SEQUENCE_LOAD, UNKNOWN } @@ -72,9 +72,9 @@ public void analyze(Analyzer analyzer) throws UserException { this.needSchemaChange = true; this.feature = Features.BATCH_DELETE; break; - case "SEQUENCE_COLUMN": + case "SEQUENCE_LOAD": this.needSchemaChange = true; - this.feature = Features.SEQUENCE_COLUMN; + this.feature = Features.SEQUENCE_LOAD; if (properties == null || properties.isEmpty()) { throw new AnalysisException("Properties is not set"); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java index 416660c23edcd0..0f9946c113c583 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java @@ -178,10 +178,10 @@ private static void alterTableWithExceptionMsg(String sql, String msg) throws Ex @Test public void alterTableWithEnableFeature() throws Exception { - String stmt = "alter table test.tbl5 enable feature \"SEQUENCE_COLUMN\" with properties (\"function_column.sequence_type\" = \"int\") "; + String stmt = "alter table test.tbl5 enable feature \"SEQUENCE_LOAD\" with properties (\"function_column.sequence_type\" = \"int\") "; alterTable(stmt, false); - stmt = "alter table test.tbl5 enable feature \"SEQUENCE_COLUMN\" with properties (\"function_column.sequence_type\" = \"double\") "; + stmt = "alter table test.tbl5 enable feature \"SEQUENCE_LOAD\" with properties (\"function_column.sequence_type\" = \"double\") "; alterTable(stmt, true); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java index 430df6946ef3cf..1a1b38118e051e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AlterTableStmtTest.java @@ -114,11 +114,11 @@ public void testEnableFeature() throws UserException { List ops = Lists.newArrayList(); Map properties = Maps.newHashMap(); properties.put("function_column.sequence_type", "int"); - ops.add(new EnableFeatureClause("sequence_column", properties)); + ops.add(new EnableFeatureClause("sequence_load", properties)); AlterTableStmt stmt = new AlterTableStmt(new TableName("testDb", "testTbl"), ops); stmt.analyze(analyzer); - Assert.assertEquals("ALTER TABLE `testCluster:testDb`.`testTbl` ENABLE FEATURE \"sequence_column\" WITH PROPERTIES (\"function_column.sequence_type\" = \"int\")", + Assert.assertEquals("ALTER TABLE `testCluster:testDb`.`testTbl` ENABLE FEATURE \"sequence_load\" WITH PROPERTIES (\"function_column.sequence_type\" = \"int\")", stmt.toSql()); Assert.assertEquals("testCluster:testDb", stmt.getTbl().getDb()); } From afdb402561c2923e5f158ca167ed7453588f055f Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Fri, 11 Sep 2020 17:48:08 +0800 Subject: [PATCH 6/7] fix by comment --- .../java/org/apache/doris/analysis/AlterTableStmt.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java index 0706a3ecde41dc..96f87dd7be58b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterTableStmt.java @@ -87,8 +87,11 @@ public void rewriteAlterClause(OlapTable table) throws UserException { if (alterFeature == null || alterFeature == EnableFeatureClause.Features.UNKNOWN) { throw new AnalysisException("unknown feature for alter clause"); } - if (table.getKeysType() != KeysType.UNIQUE_KEYS) { - throw new AnalysisException("enable feature only supported in unique tables now."); + if (table.getKeysType() != KeysType.UNIQUE_KEYS && alterFeature == EnableFeatureClause.Features.BATCH_DELETE) { + throw new AnalysisException("Batch delete only supported in unique tables."); + } + if (table.getKeysType() != KeysType.UNIQUE_KEYS && alterFeature == EnableFeatureClause.Features.SEQUENCE_LOAD) { + throw new AnalysisException("Sequence load only supported in unique tables."); } // analyse sequence column Type sequenceColType = null; From 404ca600718bdf00a1806e0cb8bc1ec269ee191b Mon Sep 17 00:00:00 2001 From: yangwenbo6 Date: Sat, 12 Sep 2020 16:35:31 +0800 Subject: [PATCH 7/7] add doc --- .../Data Definition/ALTER TABLE.md | 16 ++++++++++++- .../Data Definition/ALTER TABLE.md | 24 +++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md b/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md index d74633a85f0cbb..2b6bf0a667dbde 100644 --- a/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md +++ b/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md @@ -183,8 +183,16 @@ under the License. grammar: ENABLE FEATURE "BATCH_DELETE" note: - Only support unique tables + 1) Only support unique tables + 2) Batch deletion is supported for old tables, while new tables are already supported when they are created + 8. Enable the ability to import in order by the value of the sequence column + grammer: + ENABLE FEATURE "SEQUENCE_LOAD" WITH PROPERTIES ("function_column.sequence_type" = "Date") + note: + 1) Only support unique tables + 2) The sequence_type is used to specify the type of the sequence column, which can be integral and time type + 3) Only the orderliness of newly imported data is supported. Historical data cannot be changed   Rename supports modification of the following names: @@ -355,6 +363,12 @@ under the License. 15. Modify the in_memory property of the table ALTER TABLE example_db.my_table set ("in_memory" = "true"); + 16. Enable batch delete support + + ALTER TABLE example_db.my_table ENABLE FEATURE "BATCH_DELETE" + 17. Enable the ability to import in order by the value of the Sequence column + + ALTER TABLE example_db.my_table ENABLE FEATURE "SEQUENCE_LOAD" WITH PROPERTIES ("function_column.sequence_type" = "Date") [rename] 1. Modify the table named table1 to table2 diff --git a/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md b/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md index c6c626167c29aa..9af539ad3c1fb5 100644 --- a/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md +++ b/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md @@ -170,19 +170,27 @@ under the License. 注意: 1) index 中的所有列都要写出来 2) value 列在 key 列之后 + + 6. 修改table的属性,目前支持修改bloom filter列, colocate_with 属性和dynamic_partition属性,replication_num和default.replication_num属性 + 语法: + PROPERTIES ("key"="value") + 注意: + 也可以合并到上面的schema change操作中来修改,见下面例子 - 6. 启用批量删除支持 + 7. 启用批量删除支持 语法: ENABLE FEATURE "BATCH_DELETE" 注意: 1) 只能用在unique 表 2) 用于旧表支持批量删除功能,新表创建时已经支持 - - 6. 修改table的属性,目前支持修改bloom filter列, colocate_with 属性和dynamic_partition属性,replication_num和default.replication_num属性 - 语法: - PROPERTIES ("key"="value") + + 8. 启用按照sequence column的值来保证导入顺序的功能 + 语法: + ENABLE FEATURE "SEQUENCE_LOAD" WITH PROPERTIES ("function_column.sequence_type" = "Date") 注意: - 也可以合并到上面的schema change操作中来修改,见下面例子 + 1)只能用在unique表 + 2) sequence_type用来指定sequence列的类型,可以为整型和时间类型 + 3) 只支持新导入数据的有序性,历史数据无法更改 rename 支持对以下名称进行修改: @@ -352,7 +360,9 @@ under the License. ALTER TABLE example_db.my_table set ("in_memory" = "true"); 16. 启用 批量删除功能 ALTER TABLE example_db.my_table ENABLE FEATURE "BATCH_DELETE" - + 17. 启用按照sequence column的值来保证导入顺序的功能 + + ALTER TABLE example_db.my_table ENABLE FEATURE "SEQUENCE_LOAD" WITH PROPERTIES ("function_column.sequence_type" = "Date") [rename] 1. 将名为 table1 的表修改为 table2