Steven Talbot created CALCITE-3831:
--------------------------------------
Summary: AbstractMaterializedViewRule throws exception with an
Aggregate on a Project projecting duplicate RexNodes
Key: CALCITE-3831
URL: https://issues.apache.org/jira/browse/CALCITE-3831
Project: Calcite
Issue Type: Bug
Reporter: Steven Talbot
Note that this only happens when a rollup is required ("forceRollup" in the
terminology of "rewriteView").
Here's a test in MaterializationTest that shows the behavior:
{code:java}
@Test public void testAggregateMaterializationOnProjectWithDuplicates() {
checkMaterialize(
"select \"empid\" / 2, \"empid\", floor(cast('1997-01-20 12:34:56' as
timestamp) to month), count(*) + 1 as c, sum(\"empid\") as s\n"
+ "from \"emps\" group by \"empid\" / 2, \"empid\", floor(cast('1997-01-20
12:34:56' as timestamp) to month)",
"select e1, e2, f, sum(e1) as s from (select \"empid\" as e1, \"empid\" as e2,
floor(cast('1997-01-20 12:34:56' as timestamp) to year) as f\n"
+ "from \"emps\" ) t1 " +
"group by e1,e2,f");
}{code}
The query SQL uses that somewhat artificial subquery to force the SQL to rel
parser to create the project with duplicates for the test.
Obviously this is a silly SQL query to write, but in the process of building
more complex queries it's not absurd to end up with a project with duplicate
RexNodes.
Here's the top of the stack produced by that test:
{noformat}
Caused by: org.apache.calcite.util.mapping.Mappings$NoElementException: source
#0 has no target in mapping [size=3, sourceCount=4, targetCount=23,
elements=[1:1, 2:5, 3:4]]Caused by:
org.apache.calcite.util.mapping.Mappings$NoElementException: source #0 has no
target in mapping [size=3, sourceCount=4, targetCount=23, elements=[1:1, 2:5,
3:4]] at
org.apache.calcite.util.mapping.Mappings$AbstractMapping.getTarget(Mappings.java:879)
at
org.apache.calcite.rel.rules.AbstractMaterializedViewRule$MaterializedViewAggregateRule.rewriteView(AbstractMaterializedViewRule.java:1502)
at
org.apache.calcite.rel.rules.AbstractMaterializedViewRule.perform(AbstractMaterializedViewRule.java:521){noformat}
I tried to make a quick fix for this, since on the surface the problem in the
code seems simple, at [the site of the
exception|[https://github.com/apache/calcite/blob/134430e481bb5495d0852434041428104e29874e/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java#L1513]]
we do a lookup in a mapping. The mapping comes about from inverting a mapping
that maps projects in the view to matching projects in the query ([the relevant
line is
here|[https://github.com/apache/calcite/blob/134430e481bb5495d0852434041428104e29874e/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java#L1436]]),
and so if two query projects match the same view project, they will overwrite
each other, and the lookup on the inverse mapping will fail.
Trying the quick fix of setting the inverse mapping at the same time we set the
rewriting mapping (i.e. `inverseMapping.set(i, k);` for the above line, and a
couple others) fixed the above exception, but led to a different exception. I
didn't spend too long digging in though, and I worry I was missing something.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)