Skip to content

Commit 8edd767

Browse files
IGNITE-25712 SQL: Fix key fields wrapping in index for tables created with DDL on existing cache
1 parent 45c02d6 commit 8edd767

4 files changed

Lines changed: 237 additions & 34 deletions

File tree

modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,11 +336,16 @@ public void onKernalStart(boolean checkConsistency) throws IgniteCheckedExceptio
336336
CacheData cacheData = gridData.gridData.caches().get(locCfg.getName());
337337

338338
if (cacheData != null) {
339-
if (!Objects.equals(cacheData.sql(), locCacheInfo.sql())) {
340-
throw new IgniteCheckedException("Cache configuration mismatch (local cache was created " +
341-
"via " + (locCacheInfo.sql() ? "CREATE TABLE" : "Ignite API") + ", while remote cache " +
342-
"was created via " + (cacheData.sql() ? "CREATE TABLE" : "Ignite API") + "): " +
343-
locCacheInfo.cacheData().config().getName());
339+
if (cacheData.sql() != locCacheInfo.sql()) {
340+
// Local configuration entities can be upgraded from the cluster (added by dynamic CREATE TABLE),
341+
// in this case SQL flag is changed too.
342+
if (!cacheData.sql() || F.isEmpty(cacheData.schema().entities())
343+
|| !F.isEmpty(locCacheInfo.cacheData().queryEntities())) {
344+
throw new IgniteCheckedException("Cache configuration mismatch (local cache was created " +
345+
"via " + (locCacheInfo.sql() ? "CREATE TABLE" : "Ignite API" ) + ", while remote cache " +
346+
"was created via " + (cacheData.sql() ? "CREATE TABLE" : "Ignite API" ) + "): " +
347+
locCacheInfo.cacheData().config().getName());
348+
}
344349
}
345350

346351
if (checkConsistency) {

modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
3333
import org.apache.ignite.internal.processors.query.schema.operation.SchemaAddQueryEntityOperation;
3434
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
35+
import org.apache.ignite.internal.util.typedef.F;
3536
import org.apache.ignite.internal.util.typedef.T2;
3637
import org.apache.ignite.internal.util.typedef.internal.CU;
3738
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -368,6 +369,8 @@ public void schemaChangeFinish(SchemaFinishDiscoveryMessage msg) {
368369
schema.finish(msg);
369370

370371
if (msg.operation() instanceof SchemaAddQueryEntityOperation) {
372+
sql = true;
373+
371374
cacheCfg = GridCacheUtils.patchCacheConfiguration(cacheCfg,
372375
(SchemaAddQueryEntityOperation)msg.operation());
373376
}
@@ -412,8 +415,12 @@ public boolean applySchemaPatch(QuerySchemaPatch patch) {
412415

413416
if (res) {
414417
for (SchemaAbstractOperation op: patch.getPatchOperations()) {
415-
if (op instanceof SchemaAddQueryEntityOperation)
418+
if (op instanceof SchemaAddQueryEntityOperation) {
419+
if (!F.isEmpty(((SchemaAddQueryEntityOperation)op).entities()))
420+
sql = true;
421+
416422
cacheCfg = GridCacheUtils.patchCacheConfiguration(cacheCfg, (SchemaAddQueryEntityOperation)op);
423+
}
417424
}
418425
}
419426

modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2196,7 +2196,7 @@ else if (op instanceof SchemaAddQueryEntityOperation) {
21962196
candRes = createQueryCandidates(op0.cacheName(), op0.schemaName(), cacheInfo, op0.entities(),
21972197
op0.isSqlEscape());
21982198

2199-
registerCache0(op0.cacheName(), op.schemaName(), cacheInfo, candRes.get1(), false);
2199+
registerCache0(op0.cacheName(), op.schemaName(), cacheInfo, candRes.get1(), true);
22002200

22012201
if (idxRebuildFutStorage.prepareRebuildIndexes(singleton(cacheInfo.cacheId()), null).isEmpty())
22022202
rebuildIndexesFromHash0(cacheInfo.cacheContext(), false, cancelTok);

0 commit comments

Comments
 (0)