This is an automated email from the ASF dual-hosted git repository.
alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new d0ad5a46f97 IGNITE-23235 SQL Calcite: Fix not-null count calculation
if index rebuild is in progress - Fixes #11542.
d0ad5a46f97 is described below
commit d0ad5a46f978d3e740c63dfdeb3dcd8819f48c4f
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Tue Sep 24 17:55:11 2024 +0300
IGNITE-23235 SQL Calcite: Fix not-null count calculation if index rebuild
is in progress - Fixes #11542.
Signed-off-by: Aleksey Plekhanov <[email protected]>
---
.../query/calcite/exec/LogicalRelImplementor.java | 12 +++++++++--
.../query/calcite/rel/IgniteIndexCount.java | 25 ++++++++++++++++------
.../query/calcite/rule/IndexCountRule.java | 6 ++++--
.../calcite/exec/LogicalRelImplementorTest.java | 15 +++++++++----
.../integration/IndexRebuildIntegrationTest.java | 8 +++++--
5 files changed, 50 insertions(+), 16 deletions(-)
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
index 3a07b684625..974113a0401 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java
@@ -447,8 +447,16 @@ public class LogicalRelImplementor<Row> implements
IgniteRelVisitor<Node<Row>> {
else {
CollectNode<Row> replacement =
CollectNode.createCountCollector(ctx);
- replacement.register(new ScanStorageNode<>(tbl.name(), ctx,
rel.getTable().getRowType(), tbl.scan(ctx,
- ctx.group(rel.sourceId()), ImmutableBitSet.of(0))));
+ replacement.register(
+ new ScanStorageNode<>(
+ tbl.name(),
+ ctx,
+ rel.getTable().getRowType(),
+ tbl.scan(ctx, ctx.group(rel.sourceId()),
ImmutableBitSet.of(rel.fieldIndex())),
+ rel.notNull() ? r -> ctx.rowHandler().get(0, r) != null :
null,
+ null
+ )
+ );
return replacement;
}
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteIndexCount.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteIndexCount.java
index 932768df877..55776870e2c 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteIndexCount.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteIndexCount.java
@@ -52,6 +52,9 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
/** */
private final boolean notNull;
+ /** */
+ private final int fieldIdx;
+
/**
* Constructor for deserialization.
*
@@ -70,6 +73,7 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
sourceId = -1L;
notNull = input.getBoolean("notNull", false);
+ fieldIdx = ((Number)input.get("fieldIdx")).intValue();
}
/**
@@ -86,9 +90,10 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
RelTraitSet traits,
RelOptTable tbl,
String idxName,
- boolean notNull
+ boolean notNull,
+ int fieldIdx
) {
- this(-1, cluster, traits, tbl, idxName, notNull);
+ this(-1, cluster, traits, tbl, idxName, notNull, fieldIdx);
}
/**
@@ -107,7 +112,8 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
RelTraitSet traits,
RelOptTable tbl,
String idxName,
- boolean notNull
+ boolean notNull,
+ int fieldIdx
) {
super(cluster, traits);
@@ -115,6 +121,7 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
this.tbl = tbl;
this.sourceId = sourceId;
this.notNull = notNull;
+ this.fieldIdx = fieldIdx;
}
/** {@inheritDoc} */
@@ -156,7 +163,8 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
.item("index", idxName)
.item("table", tbl.getQualifiedName())
.itemIf("sourceId", sourceId, sourceId != -1L)
- .item("notNull", notNull);
+ .item("notNull", notNull)
+ .item("fieldIdx", fieldIdx);
}
/** {@inheritDoc} */
@@ -166,16 +174,21 @@ public class IgniteIndexCount extends AbstractRelNode
implements SourceAwareIgni
/** {@inheritDoc} */
@Override public IgniteRel clone(RelOptCluster cluster, List<IgniteRel>
inputs) {
- return new IgniteIndexCount(sourceId, cluster, traitSet, tbl, idxName,
notNull);
+ return new IgniteIndexCount(sourceId, cluster, traitSet, tbl, idxName,
notNull, fieldIdx);
}
/** {@inheritDoc} */
@Override public IgniteRel clone(long srcId) {
- return new IgniteIndexCount(srcId, getCluster(), traitSet, tbl,
idxName, notNull);
+ return new IgniteIndexCount(srcId, getCluster(), traitSet, tbl,
idxName, notNull, fieldIdx);
}
/** */
public boolean notNull() {
return notNull;
}
+
+ /** */
+ public int fieldIndex() {
+ return fieldIdx;
+ }
}
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/IndexCountRule.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/IndexCountRule.java
index 67a9eecbe1a..67204eea790 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/IndexCountRule.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/IndexCountRule.java
@@ -76,6 +76,7 @@ public class IndexCountRule extends
RelRule<IndexCountRule.Config> {
IgniteIndex idx = null;
boolean notNull = false;
+ int fieldIdx = 0;
if (argList.isEmpty())
idx = table.getIndex(QueryUtils.PRIMARY_KEY_INDEX);
@@ -84,7 +85,7 @@ public class IndexCountRule extends
RelRule<IndexCountRule.Config> {
return;
notNull = true;
- int fieldIdx = argList.get(0);
+ fieldIdx = argList.get(0);
if (!scan.requiredColumns().isEmpty())
fieldIdx = scan.requiredColumns().nth(fieldIdx);
@@ -121,7 +122,8 @@ public class IndexCountRule extends
RelRule<IndexCountRule.Config> {
idxTraits,
scan.getTable(),
idx.name(),
- notNull
+ notNull,
+ fieldIdx
);
RelBuilder b = call.builder();
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementorTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementorTest.java
index 209eb75195c..31c39d3fa75 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementorTest.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementorTest.java
@@ -200,9 +200,9 @@ public class LogicalRelImplementorTest extends
GridCommonAbstractTest {
@Test
public void testIndexCountRewriter() {
IgniteIndexCount idxCnt = new IgniteIndexCount(cluster,
cluster.traitSet(),
- qctx.catalogReader().getTable(F.asList("PUBLIC", "TBL")),
QueryUtils.PRIMARY_KEY_INDEX, false);
+ qctx.catalogReader().getTable(F.asList("PUBLIC", "TBL")),
QueryUtils.PRIMARY_KEY_INDEX, false, 0);
- checkCollectNode(relImplementor.visit(idxCnt));
+ checkCollectNode(relImplementor.visit(idxCnt), false);
tbl.addIndex(QueryUtils.PRIMARY_KEY_INDEX, 2);
@@ -215,15 +215,22 @@ public class LogicalRelImplementorTest extends
GridCommonAbstractTest {
tbl.markIndexRebuildInProgress(true);
- checkCollectNode(relImplementor.visit(idxCnt));
+ checkCollectNode(relImplementor.visit(idxCnt), false);
+
+ // Check not-null filter.
+ idxCnt = new IgniteIndexCount(cluster, cluster.traitSet(),
+ qctx.catalogReader().getTable(F.asList("PUBLIC", "TBL")),
QueryUtils.PRIMARY_KEY_INDEX, true, 2);
+
+ checkCollectNode(relImplementor.visit(idxCnt), true);
}
/** */
- private void checkCollectNode(Node<Object[]> node) {
+ private void checkCollectNode(Node<Object[]> node, boolean hasFilter) {
assertTrue(node instanceof CollectNode);
assertTrue(node.sources() != null && node.sources().size() == 1);
assertTrue(node.sources().get(0) instanceof ScanNode);
assertNull(node.sources().get(0).sources());
+ assertEquals(hasFilter, ((ScanNode<?>)node.sources().get(0)).filter()
!= null);
assertEquals(tbl.getRowType(tf), node.sources().get(0).rowType());
}
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IndexRebuildIntegrationTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IndexRebuildIntegrationTest.java
index ec9a6e14fed..cc785af571e 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IndexRebuildIntegrationTest.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IndexRebuildIntegrationTest.java
@@ -285,8 +285,10 @@ public class IndexRebuildIntegrationTest extends
AbstractBasicIntegrationTest {
executeSql(ddl);
+ executeSql("CREATE INDEX idx_val ON tbl3(val)");
+
for (int i = 0; i < records; i++)
- executeSql("INSERT INTO tbl3 VALUES (?, ?, ?)", i, "val" + i,
"val" + i);
+ executeSql("INSERT INTO tbl3 VALUES (?, ?, ?)", i, i % 2 == 0
? null : "val" + i, "val" + i);
IgniteCacheTable tbl3 =
(IgniteCacheTable)srvEngine.schemaHolder().schema("PUBLIC").getTable("TBL3");
@@ -300,8 +302,10 @@ public class IndexRebuildIntegrationTest extends
AbstractBasicIntegrationTest {
});
try {
- for (int i = 0; i < iterations; ++i)
+ for (int i = 0; i < iterations; ++i) {
assertQuery("select COUNT(*) from
tbl3").returns((long)records).check();
+ assertQuery("select COUNT(val) from
tbl3").returns((long)records / 2L).check();
+ }
}
finally {
stop.set(true);