Skip to content

Commit b95f4d9

Browse files
guojn1githubgxll
authored andcommitted
[fix][dingo-executor] Support alter index properties
1 parent 828ce59 commit b95f4d9

File tree

11 files changed

+186
-6
lines changed

11 files changed

+186
-6
lines changed

dingo-calcite/src/main/java/io/dingodb/calcite/DingoDdlExecutor.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,20 @@ public void execute(@NonNull SqlAlterIndex sqlAlterIndex, CalcitePrepare.Context
11481148
sqlAlterIndex.setPreValidate(false);
11491149
return;
11501150
}
1151-
indexTable.getProperties().putAll(sqlAlterIndex.getProperties());
1151+
List<ColumnDefinition> columnInfoList = indexTable.getColumns().stream().map(col -> {
1152+
return mapTo(col);
1153+
}).collect(Collectors.toList());
1154+
TableDefinition tableDefinition = IndexDefinition.builder()
1155+
.properties(sqlAlterIndex.getProperties())
1156+
.name(sqlAlterIndex.getIndex())
1157+
.columns(columnInfoList)
1158+
.build();
1159+
IndexDefinition indexDefinition = IndexDefinition.createIndexDefinition(
1160+
sqlAlterIndex.getIndex(), tableDefinition, false, null, null
1161+
);
1162+
DdlService.root().alterIndex(schema.getSchemaId(), schema.getSchemaName(),
1163+
table.getTable(), indexDefinition);
1164+
LogUtils.info(log, "DDL:" + sqlAlterIndex + " done");
11521165
}
11531166

11541167
public void execute(@NonNull SqlAlterIndexVisible sqlAlterIndexVisible, CalcitePrepare.Context context) {

dingo-calcite/src/main/java/io/dingodb/calcite/DingoParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.dingodb.calcite.grammar.ddl.SqlAlterDropIndex;
3333
import io.dingodb.calcite.grammar.ddl.SqlAlterDropPart;
3434
import io.dingodb.calcite.grammar.ddl.SqlAlterExchangePart;
35+
import io.dingodb.calcite.grammar.ddl.SqlAlterIndex;
3536
import io.dingodb.calcite.grammar.ddl.SqlAlterModifyColumn;
3637
import io.dingodb.calcite.grammar.ddl.SqlAlterRenameIndex;
3738
import io.dingodb.calcite.grammar.ddl.SqlAlterRenameTable;
@@ -551,7 +552,8 @@ protected static boolean ddlTxn(SqlNode sqlNode) {
551552
|| sqlNode instanceof SqlAlterDropPart
552553
|| sqlNode instanceof SqlAlterTruncatePart
553554
|| sqlNode instanceof SqlAlterExchangePart
554-
|| sqlNode instanceof SqlAlterTableOptions;
555+
|| sqlNode instanceof SqlAlterTableOptions
556+
|| sqlNode instanceof SqlAlterIndex;
555557
}
556558

557559
public long getGcLifeTime() {

dingo-common/src/main/java/io/dingodb/common/ddl/ActionType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public enum ActionType {
4848
ActionAlterCheckConstraint(45),
4949
ActionCreateTables(60),
5050
ActionResetAutoInc(61),
51-
ActionRecoverSchema(63)
51+
ActionRecoverSchema(63),
52+
ActionAlterIndex(64)
5253
;
5354

5455
private final int code;

dingo-common/src/main/java/io/dingodb/common/ddl/DdlJob.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ public String decodeArgs() {
276276
t = new TypeReference<List<String>>() {};
277277
} else if (actionType == ActionType.ActionDropSequence) {
278278
t = new TypeReference<List<String>>() {};
279+
} else if (actionType == ActionType.ActionAlterIndex) {
280+
t = new TypeReference<List<IndexDefinition>>() {};
279281
}
280282

281283
this.args = (List<Object>) objectMapper.readValue(rawArgs, t);

dingo-executor/src/main/java/io/dingodb/server/executor/ddl/DdlWorker.java

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,22 @@
5050
import io.dingodb.meta.entity.IndexTable;
5151
import io.dingodb.meta.entity.IndexType;
5252
import io.dingodb.meta.entity.Table;
53+
import io.dingodb.sdk.service.CoordinatorService;
54+
import io.dingodb.sdk.service.Services;
55+
import io.dingodb.sdk.service.entity.common.IndexParameter;
56+
import io.dingodb.sdk.service.entity.common.RawEngine;
57+
import io.dingodb.sdk.service.entity.common.RegionType;
58+
import io.dingodb.sdk.service.entity.coordinator.CreateIdsRequest;
59+
import io.dingodb.sdk.service.entity.coordinator.CreateRegionRequest;
60+
import io.dingodb.sdk.service.entity.coordinator.IdEpochType;
5361
import io.dingodb.sdk.service.entity.meta.ColumnDefinition;
5462
import io.dingodb.sdk.service.entity.meta.DingoCommonId;
63+
import io.dingodb.sdk.service.entity.meta.EntityType;
5564
import io.dingodb.sdk.service.entity.meta.Partition;
5665
import io.dingodb.sdk.service.entity.meta.TableDefinitionWithId;
66+
import io.dingodb.sdk.service.entity.meta.TableIdWithPartIds;
5767
import io.dingodb.server.executor.schedule.SafePointUpdateTask;
68+
import io.dingodb.store.proxy.Configuration;
5869
import io.dingodb.store.proxy.mapper.Mapper;
5970
import io.dingodb.store.proxy.mapper.MapperImpl;
6071
import io.dingodb.store.proxy.service.AutoIncrementService;
@@ -84,7 +95,6 @@
8495
import static io.dingodb.common.mysql.error.ErrorCode.ErrKeyDoesNotExist;
8596
import static io.dingodb.common.mysql.error.ErrorCode.ErrNoSuchTable;
8697
import static io.dingodb.common.mysql.error.ErrorCode.ErrPartitionMgmtOnNonpartitioned;
87-
import static io.dingodb.common.util.NameCaseUtils.caseSensitive;
8898
import static io.dingodb.common.util.NameCaseUtils.convertName;
8999
import static io.dingodb.common.util.NameCaseUtils.convertSql;
90100
import static io.dingodb.sdk.service.entity.common.SchemaState.SCHEMA_DELETE_ONLY;
@@ -93,6 +103,7 @@
93103
import static io.dingodb.sdk.service.entity.common.SchemaState.SCHEMA_PUBLIC;
94104
import static io.dingodb.sdk.service.entity.common.SchemaState.SCHEMA_WRITE_ONLY;
95105
import static io.dingodb.sdk.service.entity.common.SchemaState.SCHEMA_WRITE_REORG;
106+
import static io.dingodb.store.proxy.mapper.Mapper.MAPPER;
96107

97108
@Slf4j
98109
public class DdlWorker {
@@ -305,6 +316,9 @@ public Pair<Long, String> runDdlJob(DdlContext dc, DdlJob job) {
305316
case ActionTruncateTablePartition:
306317
res = onTruncatePart(dc, job);
307318
break;
319+
case ActionAlterIndex:
320+
res = onAlterIndex(dc, job);
321+
break;
308322
default:
309323
job.setState(JobState.jobStateCancelled);
310324
break;
@@ -2182,4 +2196,115 @@ public Pair<Long, String> onTruncatePart(DdlContext dc, DdlJob job) {
21822196
}
21832197
return Pair.of(0L, error);
21842198
}
2199+
2200+
public Pair<Long, String> onAlterIndex(DdlContext dc, DdlJob job) {
2201+
String error = job.decodeArgs();
2202+
if (error != null) {
2203+
job.setState(JobState.jobStateCancelled);
2204+
return Pair.of(0L, error);
2205+
}
2206+
Pair<TableDefinitionWithId, String> tableRes = checkTableExistAndCancelNonExistJob(job, job.getSchemaId());
2207+
if (tableRes.getValue() != null && tableRes.getKey() == null) {
2208+
return Pair.of(0L, tableRes.getValue());
2209+
}
2210+
boolean empty = JobTableUtil.validateTableEmpty(job.getSchemaName(), job.getTableName());
2211+
if (!empty) {
2212+
job.setState(JobState.jobStateCancelled);
2213+
return Pair.of(0L, "table is not empty");
2214+
}
2215+
IndexDefinition indexDef = (IndexDefinition) job.getArgs().get(0);
2216+
String indexName = convertName(indexDef.getName());
2217+
List<Object> indexList = InfoSchemaService.root().allIndex(job.getSchemaId(), job.getTableId());
2218+
TableDefinitionWithId indexWithId = indexList.stream()
2219+
.map(idxTable -> (TableDefinitionWithId)idxTable)
2220+
.filter(idxTable ->
2221+
idxTable.getTableDefinition().getName().toUpperCase().endsWith(indexName.toUpperCase()))
2222+
.findFirst()
2223+
.orElse(null);
2224+
if (indexWithId == null) {
2225+
job.setState(JobState.jobStateCancelled);
2226+
job.setDingoErr(DingoErrUtil.newInternalErr(ErrKeyDoesNotExist, indexName, job.getTableName()));
2227+
return Pair.of(0L, job.getDingoErr().errorMsg);
2228+
}
2229+
indexDef.getProperties().forEach((k, v) -> {
2230+
indexWithId.getTableDefinition().getProperties().put(k.toString(), v.toString());
2231+
});
2232+
2233+
MAPPER.resetIndexParameter(indexWithId.getTableDefinition(), indexDef);
2234+
DingoCommonId originIndexId = indexWithId.getTableId();
2235+
2236+
CoordinatorService coordinatorService = Services.coordinatorService(Configuration.coordinatorSet());
2237+
List<DingoCommonId> indexIds = coordinatorService.createIds(
2238+
TsoService.getDefault().cacheTso(),
2239+
CreateIdsRequest.builder().idEpochType(IdEpochType.ID_NEXT_TABLE).count(1).build()
2240+
).getIds()
2241+
.stream()
2242+
.map(id -> DingoCommonId.builder()
2243+
.entityId(id)
2244+
.entityType(EntityType.ENTITY_TYPE_INDEX)
2245+
.parentEntityId(job.getTableId())
2246+
.build())
2247+
.collect(Collectors.toList());
2248+
2249+
List<DingoCommonId> indexPartIds = coordinatorService.createIds(
2250+
TsoService.getDefault().cacheTso(), CreateIdsRequest.builder()
2251+
.idEpochType(IdEpochType.ID_NEXT_TABLE)
2252+
.count(indexWithId.getTableDefinition()
2253+
.getTablePartition().getPartitions().size())
2254+
.build()
2255+
).getIds().stream()
2256+
.map(id -> DingoCommonId.builder()
2257+
.entityType(EntityType.ENTITY_TYPE_PART)
2258+
.parentEntityId(indexIds.get(0).getEntityId())
2259+
.entityId(id)
2260+
.build())
2261+
.collect(Collectors.toList());
2262+
TableIdWithPartIds indexIdWithPartIds = TableIdWithPartIds.builder()
2263+
.tableId(indexIds.get(0))
2264+
.partIds(indexPartIds)
2265+
.build();
2266+
io.dingodb.store.proxy.meta.MetaService.resetTableId(indexIdWithPartIds, indexWithId);
2267+
2268+
io.dingodb.sdk.service.entity.meta.TableDefinition definition = indexWithId.getTableDefinition();
2269+
for (Partition partition : definition.getTablePartition().getPartitions()) {
2270+
IndexParameter indexParameter = definition.getIndexParameter();
2271+
if (indexParameter.getVectorIndexParameter() != null) {
2272+
indexParameter.setIndexType(io.dingodb.sdk.service.entity.common.IndexType.INDEX_TYPE_VECTOR);
2273+
} else if (indexParameter.getDocumentIndexParameter() != null) {
2274+
indexParameter.setIndexType(io.dingodb.sdk.service.entity.common.IndexType.INDEX_TYPE_DOCUMENT);
2275+
}
2276+
CreateRegionRequest request = CreateRegionRequest.builder()
2277+
.regionName("I_" + job.getSchemaId() + "_" + definition.getName() + "_part_"
2278+
+ partition.getId().getEntityId())
2279+
.regionType(definition.getIndexParameter().getIndexType() == io.dingodb.sdk.service.entity.common.IndexType.INDEX_TYPE_SCALAR
2280+
? RegionType.STORE_REGION : RegionType.INDEX_REGION)
2281+
.replicaNum(indexWithId.getTableDefinition().getReplica())
2282+
.range(partition.getRange())
2283+
.rawEngine(RawEngine.RAW_ENG_ROCKSDB)
2284+
.storeEngine(definition.getStoreEngine())
2285+
.schemaId(job.getSchemaId())
2286+
.tableId(job.getTableId())
2287+
.partId(partition.getId().getEntityId())
2288+
.tenantId(indexWithId.getTenantId())
2289+
.indexId(indexWithId.getTableId().getEntityId())
2290+
.indexParameter(indexParameter)
2291+
.build();
2292+
try {
2293+
LogUtils.info(log, "create region, range:{}", partition.getRange());
2294+
coordinatorService.createRegion(TsoService.getDefault().cacheTso(), request);
2295+
} catch (Exception e) {
2296+
LogUtils.error(log, "create region error,schemaId:{},regionId:{}",
2297+
job.getSchemaId(), partition.getRange(), e);
2298+
job.setState(JobState.jobStateCancelled);
2299+
return Pair.of(0L, "create index region error");
2300+
}
2301+
}
2302+
MetaService.root().dropIndex(
2303+
MAPPER.idFrom(tableRes.getKey().getTableId()),
2304+
MAPPER.idFrom(originIndexId),
2305+
job.getId(), job.getSnapshotVer()
2306+
);
2307+
job.finishTableJob(JobState.jobStateDone, SchemaState.SCHEMA_PUBLIC);
2308+
return TableUtil.updateVersionAndIndexInfos(dc, job, indexWithId, true);
2309+
}
21852310
}

dingo-executor/src/main/java/io/dingodb/server/executor/ddl/JobTableUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,4 +325,19 @@ public static void insertGcDeleteRange(
325325
}
326326
}
327327

328+
public static boolean validateTableEmpty(String schema, String table) {
329+
String sql = "select * from %s.%s limit 1";
330+
sql = String.format(sql, schema, table);
331+
Session session = SessionUtil.INSTANCE.getSession();
332+
try {
333+
List<Object[]> res = session.executeQuery(sql);
334+
return res.isEmpty();
335+
} catch (Exception e) {
336+
LogUtils.error(log, "validateTableEmpty error", e);
337+
return true;
338+
} finally {
339+
SessionUtil.INSTANCE.closeSession(session);
340+
}
341+
}
342+
328343
}

dingo-meta-api/src/main/java/io/dingodb/meta/DdlService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.dingodb.common.partition.PartitionDetailDefinition;
2424
import io.dingodb.common.sequence.SequenceDefinition;
2525
import io.dingodb.common.table.ColumnDefinition;
26+
import io.dingodb.common.table.IndexDefinition;
2627
import io.dingodb.common.table.TableDefinition;
2728
import io.dingodb.meta.entity.InfoSchema;
2829
import io.dingodb.meta.entity.Table;
@@ -38,6 +39,8 @@ static DdlService root() {
3839

3940
void dropSchema(SchemaInfo schemaInfo, String connId);
4041

42+
void alterIndex(long schemaId, String schemaName, Table table, IndexDefinition indexDef);
43+
4144
void createTableWithInfo(String schemaName,
4245
TableDefinition tableDefinition, String connId, String sql);
4346

dingo-meta-api/src/main/java/io/dingodb/meta/ddl/InfoSchemaBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public Pair<List<Long>, String> applyDiff(InfoSchemaService infoSchemaService, S
204204
case ActionRenameIndex:
205205
case ActionModifyTableComment:
206206
case ActionAlterIndexVisibility:
207+
case ActionAlterIndex:
207208
case ActionAddTablePartition:
208209
case ActionDropTablePartition:
209210
case ActionTruncateTablePartition:

dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlHandler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.dingodb.common.sequence.SequenceDefinition;
3434
import io.dingodb.common.session.SessionUtil;
3535
import io.dingodb.common.table.ColumnDefinition;
36+
import io.dingodb.common.table.IndexDefinition;
3637
import io.dingodb.common.table.TableDefinition;
3738
import io.dingodb.common.util.Pair;
3839
import io.dingodb.common.util.Utils;
@@ -287,6 +288,18 @@ public void dropSchema(SchemaInfo schemaInfo, String connId) {
287288
doDdlJob(job);
288289
}
289290

291+
public void alterIndex(long schemaId, String schemaName, Table table, IndexDefinition indexDef) {
292+
DdlJob job = DdlJob.builder()
293+
.actionType(ActionType.ActionAlterIndex)
294+
.schemaState(SchemaState.SCHEMA_PUBLIC)
295+
.schemaName(convertName(schemaName))
296+
.schemaId(schemaId).tableId(table.tableId.seq).tableName(table.getName()).build();
297+
List<Object> args = new ArrayList<>();
298+
args.add(indexDef);
299+
job.setArgs(args);
300+
doDdlJob(job);
301+
}
302+
290303
public void truncateTable(SchemaInfo schemaInfo, Table table, String connId) {
291304
DdlJob job = DdlJob.builder()
292305
.actionType(ActionType.ActionTruncateTable)

dingo-store-proxy/src/main/java/io/dingodb/store/proxy/meta/MetaService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,7 @@ public long generatePartId() {
12391239
.getIds().get(0);
12401240
}
12411241

1242-
private static void resetTableId(TableIdWithPartIds newTableId, TableDefinitionWithId table) {
1242+
public static void resetTableId(TableIdWithPartIds newTableId, TableDefinitionWithId table) {
12431243
table.setTableId(newTableId.getTableId());
12441244
List<Partition> partitions = table.getTableDefinition().getTablePartition().getPartitions();
12451245
for (int i = 0; i < newTableId.getPartIds().size(); i++) {

0 commit comments

Comments
 (0)