[ 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)