[ https://issues.apache.org/jira/browse/CALCITE-4300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17205557#comment-17205557 ]
Ruben Q L commented on CALCITE-4300: ------------------------------------ Code when the proposed fix is applied (noticed how corrList have different names): {code:java} /* 6 */ public com.onwbp.org.apache.calcite.linq4j.AbstractEnumerable apply(final java.util.List corrList4788) { // HERE ... /* 11 */ final com.onwbp.org.apache.calcite.linq4j.Enumerable _inputEnumerable = com.onwbp.org.apache.calcite.linq4j.EnumerableDefaults.correlateBatchJoin(..., ..., new com.onwbp.org.apache.calcite.linq4j.function.Function1() { /* 12 */ public com.onwbp.org.apache.calcite.linq4j.Enumerable apply(final java.util.List corrList4784) { // HERE ... /* 16 */ myContext.putCorrelatingValue("$cor10.0", ((Object[]) corrList4788.get(0))[0]); /* 17 */ myContext.putCorrelatingValue("$cor11.0", ((Object[]) corrList4788.get(1))[0]); /* 18 */ myContext.putCorrelatingValue("$cor34.0", (String) corrList4784.get(0)); /* 19 */ myContext.putCorrelatingValue("$cor35.0", (String) corrList4784.get(1)); {code} > EnumerableBatchNestedLoopJoin dynamic code generation can lead to variable > name issues if two EBNLJ are nested > -------------------------------------------------------------------------------------------------------------- > > Key: CALCITE-4300 > URL: https://issues.apache.org/jira/browse/CALCITE-4300 > Project: Calcite > Issue Type: Bug > Components: core > Reporter: Ruben Q L > Assignee: Ruben Q L > Priority: Major > Fix For: 1.26.0 > > > {{EnumerableBatchNestedLoopJoin#implement}} method defines a variable named > {{corrList}} in the dynamic code (which will store the correlating variables > of the EBNLJ operator). Under certain circumstances (virtually impossible to > reproduce on Calcite core, but feasible on downstream projects with further > optimizations like IndexScan), this variable naming can lead to issues if two > EBNLJ are nested: > {code} > /* 5 */ final com.onwbp.org.apache.calcite.linq4j.Enumerable > _inputEnumerable = > com.onwbp.org.apache.calcite.linq4j.EnumerableDefaults.correlateBatchJoin(..., > ..., new com.onwbp.org.apache.calcite.linq4j.function.Function1() { > /* 6 */ public com.onwbp.org.apache.calcite.linq4j.AbstractEnumerable > apply(final java.util.List corrList) { // corrList1 > /* 7 */ { > ... > /* 11 */ final com.onwbp.org.apache.calcite.linq4j.Enumerable > _inputEnumerable = > com.onwbp.org.apache.calcite.linq4j.EnumerableDefaults.correlateBatchJoin(..., > ..., new com.onwbp.org.apache.calcite.linq4j.function.Function1() { > /* 12 */ public com.onwbp.org.apache.calcite.linq4j.Enumerable > apply(final java.util.List corrList) { // corrList2 > /* 13 */ { > ... > /* 16 */ myContext.putCorrelatingValue("$cor10.0", > ((Object[]) corrList.get(0))[0]); // here it refers to corrList1, problem! > /* 17 */ myContext.putCorrelatingValue("$cor11.0", > ((Object[]) corrList.get(1))[0]); // here it refers to corrList1, problem! > /* 18 */ myContext.putCorrelatingValue("$cor34.0", (String) > corrList.get(0)); // here it refers to corrList2, works by chance > /* 19 */ myContext.putCorrelatingValue("$cor35.0", (String) > corrList.get(1)); // here it refers to corrList2, works by chance > . > {code} > Notice how dynamic code involves two "corrList" (lines 6 and 12); however > when they are referenced (lines 16-19), the second one is always used, since > they share the same name. > The fix is simple, each {{EnumerableBatchNestedLoopJoin}} must guarantee a > unique name for its {{corrList}} in the dynamic code. -- This message was sent by Atlassian Jira (v8.3.4#803005)