Skip to content

Commit fc455df

Browse files
SWJTU-ZhangLeiLchangliang
authored andcommitted
[bugfix](schema change) fix multi alter clauses for light schema change. (#2)
1 parent 5413fab commit fc455df

File tree

6 files changed

+51
-28
lines changed

6 files changed

+51
-28
lines changed

fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ protected void runWaitingTxnJob() throws AlterCancelException {
381381
AlterReplicaTask rollupTask = new AlterReplicaTask(rollupReplica.getBackendId(), dbId, tableId,
382382
partitionId, rollupIndexId, baseIndexId, rollupTabletId, baseTabletId,
383383
rollupReplica.getId(), rollupSchemaHash, baseSchemaHash, visibleVersion, jobId,
384-
JobType.ROLLUP, defineExprs, descTable);
384+
JobType.ROLLUP, defineExprs, descTable, null);
385385
rollupBatchTask.addTask(rollupTask);
386386
}
387387
}

fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java

+28-22
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,8 @@ public void process(List<AlterClause> alterClauses, String clusterName, Database
15471547
throws UserException {
15481548
olapTable.writeLockOrDdlException();
15491549
try {
1550+
//alterClauses can or cannot light schema change
1551+
boolean ligthSchemaChange = true;
15501552
// index id -> index schema
15511553
Map<Long, List<Column>> indexSchemaMap = new HashMap<>();
15521554
for (Map.Entry<Long, List<Column>> entry : olapTable.getIndexIdToSchema(true).entrySet()) {
@@ -1610,55 +1612,59 @@ public void process(List<AlterClause> alterClauses, String clusterName, Database
16101612

16111613
if (alterClause instanceof AddColumnClause) {
16121614
// add column
1613-
boolean ligthSchemaChange = processAddColumn((AddColumnClause) alterClause, olapTable, indexSchemaMap);
1614-
LOG.debug("processAddColumn, table: {}({}), getMaxColUniqueId(): {}, ligthSchemaChange: {}", olapTable.getName(), olapTable.getId(),
1615-
olapTable.getMaxColUniqueId(), ligthSchemaChange);
1616-
if (ligthSchemaChange) {
1617-
//for schema change add column optimize, direct modify table meta.
1618-
Catalog.getCurrentCatalog().modifyTableAddOrDropColumns(db, olapTable, indexSchemaMap, newIndexes, false);
1619-
return;
1615+
boolean clauseCanLigthSchemaChange = processAddColumn((AddColumnClause) alterClause, olapTable, indexSchemaMap);
1616+
if (clauseCanLigthSchemaChange == false) {
1617+
ligthSchemaChange = false;
16201618
}
16211619
} else if (alterClause instanceof AddColumnsClause) {
16221620
// add columns
1623-
boolean ligthSchemaChange = processAddColumns((AddColumnsClause) alterClause, olapTable, indexSchemaMap, false);
1624-
LOG.debug("processAddColumns, table: {}({}), getMaxColUniqueId(): {}, ligthSchemaChange: {}", olapTable.getName(), olapTable.getId(),
1625-
olapTable.getMaxColUniqueId(), ligthSchemaChange);
1626-
if (ligthSchemaChange) {
1627-
//for schema change add column optimize, direct modify table meta.
1628-
Catalog.getCurrentCatalog().modifyTableAddOrDropColumns(db, olapTable, indexSchemaMap, newIndexes, false);
1629-
return;
1621+
boolean clauseCanLigthSchemaChange = processAddColumns((AddColumnsClause) alterClause, olapTable, indexSchemaMap, false);
1622+
if (clauseCanLigthSchemaChange == false) {
1623+
ligthSchemaChange = false;
16301624
}
16311625
} else if (alterClause instanceof DropColumnClause) {
16321626
// drop column and drop indexes on this column
1633-
boolean ligthSchemaChange = processDropColumn((DropColumnClause) alterClause, olapTable, indexSchemaMap, newIndexes);
1634-
LOG.debug("processDropColumn, table: {}({}), getMaxColUniqueId(): {}", olapTable.getName(), olapTable.getId(), olapTable.getMaxColUniqueId());
1635-
if (ligthSchemaChange) {
1636-
//for schema change add column optimize, direct modify table meta.
1637-
Catalog.getCurrentCatalog().modifyTableAddOrDropColumns(db, olapTable, indexSchemaMap, newIndexes, false);
1638-
return;
1627+
boolean clauseCanLigthSchemaChange = processDropColumn((DropColumnClause) alterClause, olapTable, indexSchemaMap, newIndexes);
1628+
if (clauseCanLigthSchemaChange == false) {
1629+
ligthSchemaChange = false;
16391630
}
16401631
} else if (alterClause instanceof ModifyColumnClause) {
16411632
// modify column
16421633
processModifyColumn((ModifyColumnClause) alterClause, olapTable, indexSchemaMap);
1634+
ligthSchemaChange = false;
16431635
} else if (alterClause instanceof ReorderColumnsClause) {
16441636
// reorder column
16451637
processReorderColumn((ReorderColumnsClause) alterClause, olapTable, indexSchemaMap);
1638+
ligthSchemaChange = false;
16461639
} else if (alterClause instanceof ModifyTablePropertiesClause) {
16471640
// modify table properties
16481641
// do nothing, properties are already in propertyMap
1642+
ligthSchemaChange = false;
16491643
} else if (alterClause instanceof CreateIndexClause) {
16501644
if (processAddIndex((CreateIndexClause) alterClause, olapTable, newIndexes)) {
16511645
return;
16521646
}
1647+
ligthSchemaChange = false;
16531648
} else if (alterClause instanceof DropIndexClause) {
16541649
if (processDropIndex((DropIndexClause) alterClause, olapTable, newIndexes)) {
16551650
return;
16561651
}
1652+
ligthSchemaChange = false;
16571653
} else {
16581654
Preconditions.checkState(false);
16591655
}
1660-
} // end for alter clausesnnnnnn
1661-
createJob(db.getId(), olapTable, indexSchemaMap, propertyMap, newIndexes);
1656+
} // end for alter clauses
1657+
1658+
LOG.debug("processAddColumns, table: {}({}), getMaxColUniqueId(): {}, ligthSchemaChange: {}", olapTable.getName(),
1659+
olapTable.getId(), olapTable.getMaxColUniqueId(), ligthSchemaChange);
1660+
1661+
if (ligthSchemaChange) {
1662+
//for schema change add/drop value column optimize, direct modify table meta.
1663+
Catalog.getCurrentCatalog().modifyTableAddOrDropColumns(db, olapTable, indexSchemaMap, newIndexes, false);
1664+
return;
1665+
} else {
1666+
createJob(db.getId(), olapTable, indexSchemaMap, propertyMap, newIndexes);
1667+
}
16621668
} finally {
16631669
olapTable.writeUnlock();
16641670
}

fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ protected void runWaitingTxnJob() throws AlterCancelException {
431431
long originIdxId = indexIdMap.get(shadowIdxId);
432432
int shadowSchemaHash = indexSchemaVersionAndHashMap.get(shadowIdxId).schemaHash;
433433
int originSchemaHash = tbl.getSchemaHashByIndexId(indexIdMap.get(shadowIdxId));
434-
434+
List<Column> originSchemaColumns = tbl.getSchemaByIndexId(originIdxId);
435435
for (Tablet shadowTablet : shadowIdx.getTablets()) {
436436
long shadowTabletId = shadowTablet.getId();
437437
long originTabletId = partitionIndexTabletMap.get(partitionId, shadowIdxId).get(shadowTabletId);
@@ -440,7 +440,7 @@ protected void runWaitingTxnJob() throws AlterCancelException {
440440
AlterReplicaTask rollupTask = new AlterReplicaTask(shadowReplica.getBackendId(), dbId,
441441
tableId, partitionId, shadowIdxId, originIdxId, shadowTabletId, originTabletId,
442442
shadowReplica.getId(), shadowSchemaHash, originSchemaHash, visibleVersion, jobId,
443-
JobType.SCHEMA_CHANGE, defineExprs, descTable);
443+
JobType.SCHEMA_CHANGE, defineExprs, descTable, originSchemaColumns);
444444
schemaChangeBatchTask.addTask(rollupTask);
445445
}
446446
}

fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public SlotRef(TableName tblName, String col) {
7171
public SlotRef(SlotDescriptor desc) {
7272
super();
7373
this.tblName = null;
74-
this.col = null;
74+
this.col = desc.getColumn().getName();
7575
this.desc = desc;
7676
this.type = desc.getType();
7777
// TODO(zc): label is meaningful

fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,11 @@ private TOlapTableSchemaParam createSchema(long dbId, OlapTable table) {
189189
List<String> columns = Lists.newArrayList();
190190
List<TColumn> columns_desc = Lists.newArrayList();
191191
columns.addAll(indexMeta.getSchema().stream().map(Column::getName).collect(Collectors.toList()));
192-
columns_desc.addAll(indexMeta.getSchema().stream().map(Column::toThrift).collect(Collectors.toList()));
192+
for (Column column : indexMeta.getSchema()) {
193+
TColumn tColumn = column.toThrift();
194+
column.setIndexFlag(tColumn, table.getIndexes());
195+
columns_desc.add(tColumn);
196+
}
193197
TOlapTableIndexSchema indexSchema = new TOlapTableIndexSchema(pair.getKey(), columns,
194198
indexMeta.getSchemaHash(), columns_desc);
195199
schemaParam.addToIndexes(indexSchema);

fe/fe-core/src/main/java/org/apache/doris/task/AlterReplicaTask.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
import org.apache.doris.analysis.DescriptorTable;
2222
import org.apache.doris.analysis.Expr;
2323
import org.apache.doris.analysis.SlotRef;
24+
import org.apache.doris.catalog.Column;
2425
import org.apache.doris.thrift.TAlterMaterializedViewParam;
2526
import org.apache.doris.thrift.TAlterTabletReqV2;
27+
import org.apache.doris.thrift.TColumn;
2628
import org.apache.doris.thrift.TTaskType;
2729

2830
import com.google.common.collect.Lists;
2931

32+
import java.util.ArrayList;
3033
import java.util.List;
3134
import java.util.Map;
3235

@@ -48,6 +51,7 @@ public class AlterReplicaTask extends AgentTask {
4851

4952
private Map<String, Expr> defineExprs;
5053
private DescriptorTable descTable;
54+
private List<Column> baseSchemaColumns;
5155

5256
/**
5357
* AlterReplicaTask constructor.
@@ -56,7 +60,7 @@ public class AlterReplicaTask extends AgentTask {
5660
public AlterReplicaTask(long backendId, long dbId, long tableId, long partitionId, long rollupIndexId,
5761
long baseIndexId, long rollupTabletId, long baseTabletId, long newReplicaId, int newSchemaHash,
5862
int baseSchemaHash, long version, long jobId, AlterJobV2.JobType jobType, Map<String, Expr> defineExprs,
59-
DescriptorTable descTable) {
63+
DescriptorTable descTable, List<Column> baseSchemaColumns) {
6064
super(null, backendId, TTaskType.ALTER, dbId, tableId, partitionId, rollupIndexId, rollupTabletId);
6165

6266
this.baseTabletId = baseTabletId;
@@ -71,6 +75,7 @@ public AlterReplicaTask(long backendId, long dbId, long tableId, long partitionI
7175
this.jobType = jobType;
7276
this.defineExprs = defineExprs;
7377
this.descTable = descTable;
78+
this.baseSchemaColumns = baseSchemaColumns;
7479
}
7580

7681
public long getBaseTabletId() {
@@ -115,6 +120,14 @@ public TAlterTabletReqV2 toThrift() {
115120
}
116121
}
117122
req.setDescTbl(descTable.toThrift());
123+
124+
if (baseSchemaColumns != null) {
125+
List<TColumn> columns = new ArrayList<TColumn>();
126+
for (Column column : baseSchemaColumns) {
127+
columns.add(column.toThrift());
128+
}
129+
req.setColumns(columns);
130+
}
118131
return req;
119132
}
120133
}

0 commit comments

Comments
 (0)