[
https://issues.apache.org/jira/browse/DRILL-4715?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15345296#comment-15345296
]
ASF GitHub Bot commented on DRILL-4715:
---------------------------------------
Github user jinfengni commented on a diff in the pull request:
https://github.com/apache/drill/pull/521#discussion_r68147991
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java ---
@@ -215,22 +218,47 @@ public JVar
declareVectorValueSetupAndMember(DirectExpression batchName, TypedFi
return vv;
}
+ public enum BlkCreateMode {
+ TRUE, // Create new block
+ FALSE, // Do not create block; put into existing block.
+ TRUE_IF_BOUND // Create new block only if # of expressions added hit
upper-bound (ExecConstants.CODE_GEN_EXP_IN_METHOD_SIZE)
+ }
+
public HoldingContainer addExpr(LogicalExpression ex) {
- return addExpr(ex, true);
+ // default behavior is always to put expression into new block.
+ return addExpr(ex, BlkCreateMode.TRUE);
}
- public HoldingContainer addExpr(LogicalExpression ex, boolean rotate) {
-// logger.debug("Adding next write {}", ex);
- if (rotate) {
- rotateBlock();
+ public HoldingContainer addExpr(LogicalExpression ex, BlkCreateMode
mode) {
+ if (mode == BlkCreateMode.TRUE || mode == BlkCreateMode.TRUE_IF_BOUND)
{
+ rotateBlock(mode);
}
+
+ for (LinkedList<SizedJBlock> b : blocks) {
+ b.getLast().incCounter();
+ }
+
return evaluationVisitor.addExpr(ex, this);
}
public void rotateBlock() {
- evaluationVisitor.previousExpressions.clear();
- for (LinkedList<JBlock> b : blocks) {
- b.add(new JBlock(true, true));
+ // default behavior is always to create new block.
+ rotateBlock(BlkCreateMode.TRUE);
+ }
+
+ private void rotateBlock(BlkCreateMode mode) {
+ boolean blockRotated = false;
+ for (LinkedList<SizedJBlock> b : blocks) {
+ if (mode == BlkCreateMode.TRUE ||
+ (mode == BlkCreateMode.TRUE_IF_BOUND &&
+ optionManager != null &&
+ b.getLast().getCount() >
optionManager.getOption(ExecConstants.CODE_GEN_EXP_IN_METHOD_SIZE).num_val)) {
--- End diff --
Done.
> Java compilation error for a query with large number of expressions
> -------------------------------------------------------------------
>
> Key: DRILL-4715
> URL: https://issues.apache.org/jira/browse/DRILL-4715
> Project: Apache Drill
> Issue Type: Bug
> Components: Execution - Codegen
> Reporter: Jinfeng Ni
>
> The following query would hit compilation error, when Drill generates and
> compiles the run-time code.
> Q1 :
> {code}
> select expr1, expr2, expr3, ...., exprN
> from table
> {code}
> In Q1, expr1, expr2, ..., exprN are non-trivial expression (in stead of
> simply column reference), and N is big enough, then the run-time generated
> code may have a method which goes beyond the 64k limit imposed by JVM.
> This seems to be a regression from DRILL-3912 (Common subexpression
> elimination). CSE tries to put as many expressions in one block as possible,
> to detect and eliminate as many CSE as possible. However, this implies we may
> end up with big method with compilation error.
>
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)