[
https://issues.apache.org/jira/browse/CALCITE-6109?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
asdfgh19 updated CALCITE-6109:
------------------------------
Description:
{code:java}
// org.apache.calcite.linq4j.tree.BlockBuilder#toBlock
public BlockStatement toBlock() {
if (optimizing && removeUnused) {
// We put an artificial limit of 10 iterations just to prevent an endless
// loop. Optimize should not loop forever, however it is hard to prove if
// it always finishes in reasonable time.
for (int i = 0; i < 10; i++) {
if (!optimize(createOptimizeShuttle(), true)) {
break;
}
}
optimize(createFinishingOptimizeShuttle(), false);
}
return Expressions.block(statements);
} {code}
The above code is
If the issue hasn't been fixed, we can reproduce it in the following ways.
# Add some statements with ternary expressions to BlockBuilder through the
BlockBuilder#add().
# Call the BlockBuilder#toBlock() method.
# Observe the for loop in the BlockBuilder#toBlock() method, which is always
executed 10 times.
The reason is that when OptimizeShuttle traverses the statement, a new instance
of TernaryExpression will always be created, regardless of whether the
optimization is actually performed.
was:
{code:java}
// org.apache.calcite.linq4j.tree.BlockBuilder#toBlock
public BlockStatement toBlock() {
if (optimizing && removeUnused) {
// We put an artificial limit of 10 iterations just to prevent an endless
// loop. Optimize should not loop forever, however it is hard to prove if
// it always finishes in reasonable time.
for (int i = 0; i < 10; i++) {
if (!optimize(createOptimizeShuttle(), true)) {
break;
}
}
optimize(createFinishingOptimizeShuttle(), false);
}
return Expressions.block(statements);
} {code}
When there are statements with ternary expressions in BlockBuilder#statements,
the optimize method always returns true, causing the loop in the toBlock method
to always be executed 10 times.
The reason is that when OptimizeShuttle traverses the statement, a new instance
of TernaryExpression will always be created, regardless of whether the
optimization is actually performed.
> Avoid extra loops when optimizing statements with ternary expressions
> ---------------------------------------------------------------------
>
> Key: CALCITE-6109
> URL: https://issues.apache.org/jira/browse/CALCITE-6109
> Project: Calcite
> Issue Type: Improvement
> Components: linq4j
> Reporter: asdfgh19
> Assignee: asdfgh19
> Priority: Minor
> Labels: pull-request-available
>
> {code:java}
> // org.apache.calcite.linq4j.tree.BlockBuilder#toBlock
> public BlockStatement toBlock() {
> if (optimizing && removeUnused) {
> // We put an artificial limit of 10 iterations just to prevent an endless
> // loop. Optimize should not loop forever, however it is hard to prove if
> // it always finishes in reasonable time.
> for (int i = 0; i < 10; i++) {
> if (!optimize(createOptimizeShuttle(), true)) {
> break;
> }
> }
> optimize(createFinishingOptimizeShuttle(), false);
> }
> return Expressions.block(statements);
> } {code}
> The above code is
> If the issue hasn't been fixed, we can reproduce it in the following ways.
> # Add some statements with ternary expressions to BlockBuilder through the
> BlockBuilder#add().
> # Call the BlockBuilder#toBlock() method.
> # Observe the for loop in the BlockBuilder#toBlock() method, which is always
> executed 10 times.
> The reason is that when OptimizeShuttle traverses the statement, a new
> instance of TernaryExpression will always be created, regardless of whether
> the optimization is actually performed.
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)