From 35c13acaa1278b3e045dd2ec999272790d12897b Mon Sep 17 00:00:00 2001 From: guojn1 Date: Wed, 29 Apr 2026 11:35:59 +0800 Subject: [PATCH] [fix][dingo-calcite] Add schemaVersion to table --- .../calcite/schema/RootSnapshotSchema.java | 9 ----- .../calcite/schema/SubCalciteSchema.java | 17 ++++++++ .../calcite/schema/SubSnapshotSchema.java | 40 ------------------- .../java/io/dingodb/driver/DingoMeta.java | 13 +++++- .../main/java/io/dingodb/meta/DdlService.java | 2 + .../java/io/dingodb/meta/entity/Table.java | 2 + .../dingodb/store/proxy/ddl/DdlService.java | 18 +++++++++ .../store/service/InfoSchemaService.java | 5 +-- .../dingodb/meta/local/LocalDdlService.java | 4 ++ 9 files changed, 57 insertions(+), 53 deletions(-) diff --git a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/RootSnapshotSchema.java b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/RootSnapshotSchema.java index 98c14f57e4..ae5bd8a59d 100644 --- a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/RootSnapshotSchema.java +++ b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/RootSnapshotSchema.java @@ -178,13 +178,4 @@ public Schema snapshot(SchemaVersion schemaVersion) { return this; } - public void applyDiff(SchemaDiff schemaDiff) { - if (is == null) { - return; - } - InfoSchemaInTxnBuilder schemaInTxnBuilder = new InfoSchemaInTxnBuilder(is); - schemaInTxnBuilder.applyDiff(InfoSchemaService.root(), schemaDiff); - this.is = schemaInTxnBuilder.build(); - } - } diff --git a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubCalciteSchema.java b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubCalciteSchema.java index 3946168e43..4044c153f1 100644 --- a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubCalciteSchema.java +++ b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubCalciteSchema.java @@ -21,7 +21,9 @@ import com.google.common.collect.ImmutableSortedSet; import io.dingodb.calcite.DingoTable; import io.dingodb.common.log.LogUtils; +import io.dingodb.common.mysql.DingoErrUtil; import io.dingodb.common.util.Optional; +import io.dingodb.meta.DdlService; import lombok.Builder; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.jdbc.CalciteSchema; @@ -36,6 +38,8 @@ import java.util.List; +import static io.dingodb.common.mysql.error.ErrorCode.ErrNoSuchTable; + @Slf4j public class SubCalciteSchema extends CalciteSchema { RootCalciteSchema rootCalciteSchema; @@ -72,7 +76,20 @@ protected SubCalciteSchema( boolean inTxn = subSnapshotSchema.inTransaction(); Table table = schema.getTable(tableName); if (table != null && inTxn) { + // Add schemaVersion consistency check DingoTable dingoTable = (DingoTable) table; + long schemaVersion = dingoTable.getTable().getSchemaVersion(); + int status = DdlService.root().checkTableSchemaVersion(dingoTable.getTableId(), schemaVersion); + if (status == 3) { + // table not exists + throw DingoErrUtil.newStdErr(ErrNoSuchTable, dingoTable.getTable().getName()); + } else if (status == 2) { + // refresh schema + io.dingodb.meta.entity.Table table1 = DdlService.root().getIsLatest().getTable(dingoTable.getTableId().seq); + table = new DingoTable(dingoTable.getContext(), dingoTable.getNames(), table1); + } + // check method + // throw exception rootCalciteSchema.putRelatedTable(dingoTable.getTableId().seq, ((SubSnapshotSchema) schema).getSchemaVer(), subSnapshotSchema.txnId); } diff --git a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubSnapshotSchema.java b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubSnapshotSchema.java index d1546b416c..ec16baf2fb 100644 --- a/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubSnapshotSchema.java +++ b/dingo-calcite/src/main/java/io/dingodb/calcite/schema/SubSnapshotSchema.java @@ -96,46 +96,6 @@ public SubSnapshotSchema(CommonId txnId, InfoSchema is, String schemaName, ); } - public @Nullable DingoTable getValidateTable(String tableName) { - tableName = convertName(tableName); - SchemaTables schemaTables; - if (is == null) { - InfoSchema isTmp = DdlService.root().getIsLatest(); - if (isTmp == null) { - return null; - } - schemaTables = isTmp.schemaMap.get(schemaName); - } else { - schemaTables = is.schemaMap.get(schemaName);; - } - if (schemaTables == null) { - return null; - } - Table table = schemaTables.getTables().get(tableName); - if (table == null) { - return null; - } - boolean hasHidden = table.getColumns() - .stream().anyMatch(column -> column.getState() != 1 - || - (column.getSchemaState() != SchemaState.SCHEMA_PUBLIC && column.getSchemaState() != null) - ); - if (hasHidden) { - List columnList = table.getColumns() - .stream() - .filter(column -> (column.getSchemaState() == null - || column.getSchemaState() == SchemaState.SCHEMA_PUBLIC) - && column.getState() == 1) - .collect(Collectors.toList()); - table = table.copyWithColumns(columnList); - } - return new DingoTable( - context, - ImmutableList.builder().addAll(names).add(tableName).build(), - table - ); - } - @Override public Set getTableNames() { SchemaTables schemaTables; diff --git a/dingo-driver/host/src/main/java/io/dingodb/driver/DingoMeta.java b/dingo-driver/host/src/main/java/io/dingodb/driver/DingoMeta.java index 05827e878f..3117b97fcc 100644 --- a/dingo-driver/host/src/main/java/io/dingodb/driver/DingoMeta.java +++ b/dingo-driver/host/src/main/java/io/dingodb/driver/DingoMeta.java @@ -85,6 +85,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -194,7 +195,17 @@ private Collection getMatchedTables( .flatMap(s -> s.getTableNames().stream() .filter(filter) .filter(name -> verifyPrivilege((SubSnapshotSchema) s.schema, name, "getTables")) - .map(name -> s.getImplicitTable(name, caseSensitive()))) + .map(name -> { + try { + return s.getImplicitTable(name, caseSensitive()); + } catch (DingoSqlException e) { + if (e.getSqlCode() == 1146 && "42S02".equalsIgnoreCase(e.getSqlState())) { + return null; + } else { + throw e; + } + } + }).filter(Objects::nonNull)) .collect(Collectors.toList()); } diff --git a/dingo-meta-api/src/main/java/io/dingodb/meta/DdlService.java b/dingo-meta-api/src/main/java/io/dingodb/meta/DdlService.java index dc5e555a95..609f6d30b6 100644 --- a/dingo-meta-api/src/main/java/io/dingodb/meta/DdlService.java +++ b/dingo-meta-api/src/main/java/io/dingodb/meta/DdlService.java @@ -158,4 +158,6 @@ default void alterTableTruncatePart(SchemaInfo schemaInfo, Table table, String p void refreshMeta(SchemaInfo schemaInfo, String tableName); void addPrimaryKey(SchemaInfo schemaInfo, Table table, List primaryKeyList); + + int checkTableSchemaVersion(CommonId tableId, long schemaVersion); } diff --git a/dingo-meta-api/src/main/java/io/dingodb/meta/entity/Table.java b/dingo-meta-api/src/main/java/io/dingodb/meta/entity/Table.java index d644d16118..48525e6045 100644 --- a/dingo-meta-api/src/main/java/io/dingodb/meta/entity/Table.java +++ b/dingo-meta-api/src/main/java/io/dingodb/meta/entity/Table.java @@ -119,6 +119,8 @@ public class Table { @JsonProperty public boolean visible; + public long schemaVersion; + public TupleType tupleType() { return DingoTypeFactory.tuple(columns.stream() .map(col -> { diff --git a/dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlService.java b/dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlService.java index 03d9f4229e..e71298d963 100644 --- a/dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlService.java +++ b/dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlService.java @@ -272,4 +272,22 @@ public void addPrimaryKey(SchemaInfo schemaInfo, Table table, List prima DdlHandler.doDdlJob(job); } + public int checkTableSchemaVersion(CommonId tableId, long schemaVersion) { + InfoSchema infoSchema = InfoCache.infoCache.getLatest(); + if (infoSchema == null) { + return 0; + } else { + Table table = infoSchema.getTable(tableId.seq); + if (table != null) { + if (table.getSchemaVersion() == schemaVersion) { + return 1; + } else { + return 2; + } + } else { + return 3; + } + } + } + } diff --git a/dingo-store-proxy/src/main/java/io/dingodb/store/service/InfoSchemaService.java b/dingo-store-proxy/src/main/java/io/dingodb/store/service/InfoSchemaService.java index 04d9124718..1046e83ac6 100644 --- a/dingo-store-proxy/src/main/java/io/dingodb/store/service/InfoSchemaService.java +++ b/dingo-store-proxy/src/main/java/io/dingodb/store/service/InfoSchemaService.java @@ -424,10 +424,9 @@ public Object getTable(long schemaId, String tableName, long tenantId) { ? tableDefinitionWithId.getTableDefinition().getName().equalsIgnoreCase(table) : tableDefinitionWithId.getTableDefinition().getName().equals(table)) .filter(tableDefinitionWithId -> { - return tableDefinitionWithId.getTableDefinition().getSchemaState() + return tableDefinitionWithId.getTableDefinition().getSchemaState() == SchemaState.SCHEMA_PUBLIC; - } - ) + }) .findFirst().orElse(null); } diff --git a/dingo-test/meta-local/src/main/java/io/dingodb/meta/local/LocalDdlService.java b/dingo-test/meta-local/src/main/java/io/dingodb/meta/local/LocalDdlService.java index 571e454416..ce89d7b306 100644 --- a/dingo-test/meta-local/src/main/java/io/dingodb/meta/local/LocalDdlService.java +++ b/dingo-test/meta-local/src/main/java/io/dingodb/meta/local/LocalDdlService.java @@ -142,4 +142,8 @@ public void refreshMeta(SchemaInfo schemaInfo, String tableName) { public void addPrimaryKey(SchemaInfo schemaInfo, Table table, List primaryKeyList) { } + + public int checkTableSchemaVersion(CommonId tableId, long schemaVersion) { + return 1; + } }