[
https://issues.apache.org/jira/browse/CALCITE-5254?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Steven Talbot updated CALCITE-5254:
-----------------------------------
Description:
Happens when you have a materialization "target" of an Aggregate/Scan
attempting to substitute for an a "query" with a matching Scan.
The following test should repro (in CustomMaterializedViewRecognitionRuleTest)
{code:java}
@Test void testNoInifiniteLoopOnAggregateScanMaterialization() {
final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
rootSchema.add("mv1", new AbstractTable() {
@Override public RelDataType getRowType(RelDataTypeFactory typeFactory) {
return typeFactory.builder()
.add("count", SqlTypeName.INTEGER)
.build();
}
});
final Frameworks.ConfigBuilder config = Frameworks.newConfigBuilder()
.parserConfig(SqlParser.Config.DEFAULT)
.defaultSchema(
CalciteAssert.addSchema(rootSchema,
CalciteAssert.SchemaSpec.SCOTT_WITH_TEMPORAL))
.traitDefs((List<RelTraitDef>) null);
final RelBuilder relBuilder = RelBuilder.create(config.build());
final RelNode query = relBuilder.scan("EMP")
.project(relBuilder.field("DEPTNO"))
.aggregate(
relBuilder.groupKey(0),
relBuilder.aggregateCall(SqlStdOperatorTable.COUNT)
)
.build();
final RelNode target = relBuilder.scan("EMP")
.aggregate(relBuilder.groupKey(),
relBuilder.aggregateCall(SqlStdOperatorTable.COUNT))
.build();
final RelNode replacement = relBuilder.scan("mv1").build();
final RelOptMaterialization relOptMaterialization =
new RelOptMaterialization(replacement,
target, null, Lists.newArrayList("mv1"));
final List<Pair<RelNode, List<RelOptMaterialization>>> relOptimized =
RelOptMaterializations.useMaterializedViews(query,
ImmutableList.of(relOptMaterialization),
SubstitutionVisitor.DEFAULT_RULES);
System.out.println("never get here!");
} {code}
was:
Happens when you have a materialization "target" of an Aggregate/Scan
attempting to substitute for an a "query" with a matching Scan.
The following test should repro (in CustomMaterializedViewRecognitionRuleTest)
{code:java}
@Test void testNoInifiniteLoopOnAggregateScanMaterialization() {
final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
rootSchema.add("mv1", new AbstractTable() {
@Override public RelDataType getRowType(RelDataTypeFactory typeFactory) {
return typeFactory.builder()
.add("count", SqlTypeName.INTEGER)
.build();
}
});
final Frameworks.ConfigBuilder config = Frameworks.newConfigBuilder()
.parserConfig(SqlParser.Config.DEFAULT)
.defaultSchema(
CalciteAssert.addSchema(rootSchema,
CalciteAssert.SchemaSpec.SCOTT_WITH_TEMPORAL))
.traitDefs((List<RelTraitDef>) null);
final RelBuilder relBuilder = RelBuilder.create(config.build());
final RelNode query = relBuilder.scan("EMP")
.project(relBuilder.field("DEPTNO"))
.aggregate(
relBuilder.groupKey(0),
relBuilder.aggregateCall(SqlStdOperatorTable.COUNT)
)
.build();
final RelNode target = relBuilder.scan("EMP")
.aggregate(relBuilder.groupKey(),
relBuilder.aggregateCall(SqlStdOperatorTable.COUNT))
.build();
final RelNode replacement = relBuilder.scan("mv1").build();
final RelOptMaterialization relOptMaterialization =
new RelOptMaterialization(replacement,
target, null, Lists.newArrayList("mv1"));
final List<Pair<RelNode, List<RelOptMaterialization>>> relOptimized =
RelOptMaterializations.useMaterializedViews(query,
ImmutableList.of(relOptMaterialization),
SubstitutionVisitor.DEFAULT_RULES);
System.out.println("never ger here!");
} {code}
> Infinite Loop in SubstitutionVisitor.go
> ---------------------------------------
>
> Key: CALCITE-5254
> URL: https://issues.apache.org/jira/browse/CALCITE-5254
> Project: Calcite
> Issue Type: Bug
> Reporter: Steven Talbot
> Priority: Major
>
> Happens when you have a materialization "target" of an Aggregate/Scan
> attempting to substitute for an a "query" with a matching Scan.
> The following test should repro (in CustomMaterializedViewRecognitionRuleTest)
> {code:java}
> @Test void testNoInifiniteLoopOnAggregateScanMaterialization() {
> final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
> rootSchema.add("mv1", new AbstractTable() {
> @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) {
> return typeFactory.builder()
> .add("count", SqlTypeName.INTEGER)
> .build();
> }
> });
> final Frameworks.ConfigBuilder config = Frameworks.newConfigBuilder()
> .parserConfig(SqlParser.Config.DEFAULT)
> .defaultSchema(
> CalciteAssert.addSchema(rootSchema,
> CalciteAssert.SchemaSpec.SCOTT_WITH_TEMPORAL))
> .traitDefs((List<RelTraitDef>) null);
> final RelBuilder relBuilder = RelBuilder.create(config.build());
> final RelNode query = relBuilder.scan("EMP")
> .project(relBuilder.field("DEPTNO"))
> .aggregate(
> relBuilder.groupKey(0),
> relBuilder.aggregateCall(SqlStdOperatorTable.COUNT)
> )
> .build();
> final RelNode target = relBuilder.scan("EMP")
> .aggregate(relBuilder.groupKey(),
> relBuilder.aggregateCall(SqlStdOperatorTable.COUNT))
> .build();
> final RelNode replacement = relBuilder.scan("mv1").build();
> final RelOptMaterialization relOptMaterialization =
> new RelOptMaterialization(replacement,
> target, null, Lists.newArrayList("mv1"));
> final List<Pair<RelNode, List<RelOptMaterialization>>> relOptimized =
> RelOptMaterializations.useMaterializedViews(query,
> ImmutableList.of(relOptMaterialization),
> SubstitutionVisitor.DEFAULT_RULES);
> System.out.println("never get here!");
> } {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)