[ https://issues.apache.org/jira/browse/CALCITE-4300?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ruben Q L resolved CALCITE-4300. -------------------------------- Resolution: Fixed Fixed via https://github.com/apache/calcite/commit/8a7e1be96faa1720de828748e5ed819f32dbcdb4 > 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 > Labels: pull-request-available > Fix For: 1.26.0 > > Time Spent: 10m > Remaining Estimate: 0h > > {{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 where the two batches of correlating variables > can be "pushed"), this variable naming can lead to issues if two EBNLJ are > nested: > {code:java} > /* 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)