Repository: drill
Updated Branches:
  refs/heads/master 40de8ca4f -> e25c58f7b


DRILL-6028: Allow splitting generated code in ChainedHashTable into blocks to 
avoid "code too large" error

1. Added new parameter seedValue to getHashBuild and getHashProbe methods in 
HashTableTemplate.
2. Generate logical expression for each key so its  can be split into blocks if 
number of expressions in method exceeds upper limit.
3. ParameterExpression was added to generate reference to method parameter 
during code generation.

closes #1071


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/ef4c63d5
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/ef4c63d5
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/ef4c63d5

Branch: refs/heads/master
Commit: ef4c63d56e2339721867a964b724883a9b5d1fbe
Parents: 40de8ca
Author: Arina Ielchiieva <[email protected]>
Authored: Tue Dec 12 18:45:57 2017 +0200
Committer: Arina Ielchiieva <[email protected]>
Committed: Fri Dec 22 13:35:51 2017 +0200

----------------------------------------------------------------------
 .../sig/ConstantExpressionIdentifier.java       |  7 +++-
 .../apache/drill/exec/expr/ClassGenerator.java  | 18 +++++++--
 .../drill/exec/expr/EvaluationVisitor.java      | 23 ++++++++++++
 .../physical/impl/common/ChainedHashTable.java  | 29 ++++++++++-----
 .../physical/impl/common/HashTableTemplate.java |  9 +++--
 .../exec/planner/physical/HashPrelUtil.java     | 20 +++++++---
 .../org/apache/drill/TestUnionDistinct.java     | 35 ++++++++++++++++++
 .../common/expression/ValueExpressions.java     | 39 ++++++++++++++++++++
 .../visitors/AbstractExprVisitor.java           |  7 +++-
 .../expression/visitors/AggregateChecker.java   |  8 +++-
 .../expression/visitors/ConstantChecker.java    |  8 +++-
 .../common/expression/visitors/ExprVisitor.java |  4 +-
 .../visitors/ExpressionValidator.java           |  7 +++-
 13 files changed, 187 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java
index d98c06b..1e71773 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -226,4 +226,9 @@ public class ConstantExpressionIdentifier implements 
ExprVisitor<Boolean, Identi
       IdentityHashMap<LogicalExpression, Object> value) throws 
RuntimeException {
     return e.getInput().accept(this, value);
   }
+
+  @Override
+  public Boolean visitParameter(ValueExpressions.ParameterExpression e, 
IdentityHashMap<LogicalExpression, Object> value) throws RuntimeException {
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java
index 8547ed4..d4ee60a 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java
@@ -225,7 +225,7 @@ public class ClassGenerator<T>{
   }
 
   public JLabel getEvalBlockLabel (String prefix) {
-    return getEvalBlock().label(prefix + labelIndex ++);
+    return getEvalBlock().label(prefix + labelIndex++);
   }
 
   /**
@@ -543,12 +543,24 @@ public class ClassGenerator<T>{
   }
 
   public HoldingContainer declare(MajorType t, boolean includeNewInstance) {
+    return declare(t, "out", includeNewInstance);
+  }
+
+  /**
+   * Adds local variable declaration based on given name and type.
+   *
+   * @param t major type
+   * @param name variable name
+   * @param includeNewInstance whether to create new instance
+   * @return holder instance
+   */
+  public HoldingContainer declare(MajorType t, String name, boolean 
includeNewInstance) {
     JType holderType = getHolderType(t);
     JVar var;
     if (includeNewInstance) {
-      var = getEvalBlock().decl(holderType, "out" + index, 
JExpr._new(holderType));
+      var = getEvalBlock().decl(holderType, name + index, 
JExpr._new(holderType));
     } else {
-      var = getEvalBlock().decl(holderType, "out" + index);
+      var = getEvalBlock().decl(holderType, name + index);
     }
     JFieldRef outputSet = null;
     if (t.getMode() == DataMode.OPTIONAL) {

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
index cb62b27..dcc2668 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
@@ -37,6 +37,7 @@ import org.apache.drill.common.expression.NullExpression;
 import org.apache.drill.common.expression.PathSegment;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.expression.TypedNullConstant;
+import org.apache.drill.common.expression.ValueExpressions;
 import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
 import org.apache.drill.common.expression.ValueExpressions.DateExpression;
 import org.apache.drill.common.expression.ValueExpressions.Decimal18Expression;
@@ -350,6 +351,28 @@ public class EvaluationVisitor {
 
     }
 
+    /**
+     * <p>
+     * Creates local variable based on given parameter type and name and 
assigns parameter to this local instance.
+     * </p>
+     *
+     * <p>
+     * Example: <br/>
+     * IntHolder seedValue0 = new IntHolder();<br/>
+     * seedValue0 .value = seedValue;
+     * </p>
+     *
+     * @param e parameter expression
+     * @param generator class generator
+     * @return holder instance
+     */
+    @Override
+    public HoldingContainer 
visitParameter(ValueExpressions.ParameterExpression e, ClassGenerator<?> 
generator) {
+      HoldingContainer out = generator.declare(e.getMajorType(), e.getName(), 
true);
+      generator.getEvalBlock().assign(out.getValue(), JExpr.ref(e.getName()));
+      return out;
+    }
+
     private HoldingContainer 
visitValueVectorWriteExpression(ValueVectorWriteExpression e, ClassGenerator<?> 
generator) {
 
       final LogicalExpression child = e.getChild();

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
index dd4d76e..9bab67d 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
@@ -18,13 +18,14 @@
 package org.apache.drill.exec.physical.impl.common;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.drill.common.expression.ErrorCollector;
 import org.apache.drill.common.expression.ErrorCollectorImpl;
 import org.apache.drill.common.expression.LogicalExpression;
+import org.apache.drill.common.expression.ValueExpressions;
 import org.apache.drill.common.logical.data.NamedExpression;
+import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.compile.sig.GeneratorMapping;
 import org.apache.drill.exec.compile.sig.MappingSet;
@@ -154,7 +155,6 @@ public class ChainedHashTable {
 
     ErrorCollector collector = new ErrorCollectorImpl();
     VectorContainer htContainerOrig = new VectorContainer(); // original ht 
container from which others may be cloned
-    LogicalExpression[] htKeyExprs = new 
LogicalExpression[htConfig.getKeyExprsBuild().size()];
     TypedFieldId[] htKeyFieldIds = new 
TypedFieldId[htConfig.getKeyExprsBuild().size()];
 
     int i = 0;
@@ -241,10 +241,10 @@ public class ChainedHashTable {
       return;
     }
 
-    for (int i=0; i<keyExprs.length; i++) {
+    for (int i = 0; i < keyExprs.length; i++) {
       final LogicalExpression expr = keyExprs[i];
       cg.setMappingSet(incomingMapping);
-      HoldingContainer left = cg.addExpr(expr, 
ClassGenerator.BlkCreateMode.FALSE);
+      HoldingContainer left = cg.addExpr(expr, 
ClassGenerator.BlkCreateMode.TRUE_IF_BOUND);
 
       cg.setMappingSet(htableMapping);
       ValueVectorReadExpression vvrExpr = new 
ValueVectorReadExpression(htKeyFieldIds[i]);
@@ -286,7 +286,7 @@ public class ChainedHashTable {
       boolean useSetSafe = !Types.isFixedWidthType(expr.getMajorType()) || 
Types.isRepeated(expr.getMajorType());
       ValueVectorWriteExpression vvwExpr = new 
ValueVectorWriteExpression(htKeyFieldIds[i++], expr, useSetSafe);
 
-      cg.addExpr(vvwExpr, ClassGenerator.BlkCreateMode.FALSE); // this will 
write to the htContainer at htRowIdx
+      cg.addExpr(vvwExpr, ClassGenerator.BlkCreateMode.TRUE_IF_BOUND);
     }
   }
 
@@ -320,11 +320,22 @@ public class ChainedHashTable {
      * aggregate. For join we need to hash everything as double (both for 
distribution and for comparison) but
      * for aggregation we can avoid the penalty of casting to double
      */
-    LogicalExpression hashExpression = 
HashPrelUtil.getHashExpression(Arrays.asList(keyExprs), incomingProbe != null);
-    final LogicalExpression materializedExpr = 
ExpressionTreeMaterializer.materializeAndCheckErrors(hashExpression, batch, 
context.getFunctionRegistry());
-    HoldingContainer hash = cg.addExpr(materializedExpr);
-    cg.getEvalBlock()._return(hash.getValue());
 
 
+    /*
+      Generate logical expression for each key so expression can be split into 
blocks if number of expressions in method exceeds upper limit.
+      `seedValue` is used as holder to pass generated seed value for the new 
methods.
+    */
+    String seedValue = "seedValue";
+    LogicalExpression seed = 
ValueExpressions.getParameterExpression(seedValue, 
Types.required(TypeProtos.MinorType.INT));
+
+    for (LogicalExpression expr : keyExprs) {
+      LogicalExpression hashExpression = HashPrelUtil.getHashExpression(expr, 
seed, incomingProbe != null);
+      LogicalExpression materializedExpr = 
ExpressionTreeMaterializer.materializeAndCheckErrors(hashExpression, batch, 
context.getFunctionRegistry());
+      HoldingContainer hash = cg.addExpr(materializedExpr, 
ClassGenerator.BlkCreateMode.TRUE_IF_BOUND);
+      cg.getEvalBlock().assign(JExpr.ref(seedValue), hash.getValue());
+    }
+
+    cg.getEvalBlock()._return(JExpr.ref(seedValue));
   }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
index 7a086aa..6cbbdcb 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
@@ -578,7 +578,7 @@ public abstract class HashTableTemplate implements 
HashTable {
   }
 
   public int getHashCode(int incomingRowIdx) throws SchemaChangeException {
-    return getHashBuild(incomingRowIdx);
+    return getHashBuild(incomingRowIdx, 0);
   }
 
   /** put() uses the hash code (from gethashCode() above) to insert the key(s) 
from the incoming
@@ -667,7 +667,8 @@ public abstract class HashTableTemplate implements 
HashTable {
   // Return -1 if key is not found in the hash table. Otherwise, return the 
global index of the key
   @Override
   public int containsKey(int incomingRowIdx, boolean isProbe) throws 
SchemaChangeException {
-    int hash = isProbe ? getHashProbe(incomingRowIdx) : 
getHashBuild(incomingRowIdx);
+    int seedValue = 0;
+    int hash = isProbe ? getHashProbe(incomingRowIdx, seedValue) : 
getHashBuild(incomingRowIdx, seedValue);
     int bucketIndex = getBucketIndex(hash, numBuckets());
 
     for ( currentIdxHolder.value = startIndices.getAccessor().get(bucketIndex);
@@ -814,8 +815,8 @@ public abstract class HashTableTemplate implements 
HashTable {
   // These methods will be code-generated in the context of the outer class
   protected abstract void doSetup(@Named("incomingBuild") RecordBatch 
incomingBuild, @Named("incomingProbe") RecordBatch incomingProbe) throws 
SchemaChangeException;
 
-  protected abstract int getHashBuild(@Named("incomingRowIdx") int 
incomingRowIdx) throws SchemaChangeException;
+  protected abstract int getHashBuild(@Named("incomingRowIdx") int 
incomingRowIdx, @Named("seedValue") int seedValue) throws SchemaChangeException;
 
-  protected abstract int getHashProbe(@Named("incomingRowIdx") int 
incomingRowIdx) throws SchemaChangeException;
+  protected abstract int getHashProbe(@Named("incomingRowIdx") int 
incomingRowIdx, @Named("seedValue") int seedValue) throws SchemaChangeException;
 
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashPrelUtil.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashPrelUtil.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashPrelUtil.java
index 4300c82..25b7017 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashPrelUtil.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/HashPrelUtil.java
@@ -25,7 +25,13 @@ import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.expression.FunctionCall;
 import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.common.expression.ValueExpressions;
+import org.apache.drill.common.logical.data.NamedExpression;
+import org.apache.drill.common.types.TypeProtos;
+import org.apache.drill.common.types.Types;
+import org.apache.drill.exec.expr.DirectExpression;
+import org.apache.drill.exec.expr.ValueVectorReadExpression;
 import 
org.apache.drill.exec.planner.physical.DrillDistributionTrait.DistributionField;
+import org.apache.drill.exec.record.TypedFieldId;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -100,7 +106,7 @@ public class HashPrelUtil {
 
     final String functionName = hashAsDouble ? HASH32_DOUBLE_FUNCTION_NAME : 
HASH32_FUNCTION_NAME;
 
-    T func = helper.createCall(functionName,  
ImmutableList.of(inputExprs.get(0), seed ));
+    T func = helper.createCall(functionName,  
ImmutableList.of(inputExprs.get(0), seed));
     for (int i = 1; i<inputExprs.size(); i++) {
       func = helper.createCall(functionName, 
ImmutableList.of(inputExprs.get(i), func));
     }
@@ -109,11 +115,15 @@ public class HashPrelUtil {
   }
 
   /**
-   * Return a hash expression :  hash32(field1, hash32(field2, hash32(field3, 
0)));
+   * Creates hash expression for input field and seed.
+   *
+   * @param field field expression
+   * @param seed seed expression
+   * @param hashAsDouble whether to use the hash as double function or regular 
hash64 function
+   * @return hash expression
    */
-  public static LogicalExpression getHashExpression(List<LogicalExpression> 
fields, boolean hashAsDouble){
-    final LogicalExpression seed = ValueExpressions.getInt(0); // Hash Table 
seed
-    return createHashExpression(fields, seed, HASH_HELPER_LOGICALEXPRESSION, 
hashAsDouble);
+  public static LogicalExpression getHashExpression(LogicalExpression field, 
LogicalExpression seed, boolean hashAsDouble) {
+    return createHashExpression(ImmutableList.of(field), seed, 
HASH_HELPER_LOGICALEXPRESSION, hashAsDouble);
   }
 
 

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java 
b/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java
index b76d308..4b8140e 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestUnionDistinct.java
@@ -19,6 +19,7 @@ package org.apache.drill;
 
 import com.google.common.collect.Lists;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.drill.categories.OperatorTest;
 import org.apache.drill.categories.SqlTest;
@@ -32,6 +33,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import java.io.File;
 import java.nio.file.Paths;
 import java.util.List;
 
@@ -754,4 +756,37 @@ public class TestUnionDistinct extends BaseTestQuery {
     }
   }
 
+  @Test
+  public void testUnionWithManyColumns() throws Exception {
+    int columnsCount = 1200;
+    File file = new File(dirTestWatcher.getRootDir(), "union_for_" + 
columnsCount + "_columns.csv");
+
+    StringBuilder line = new StringBuilder();
+    StringBuilder columns = new StringBuilder();
+
+    for (int i = 0; i <= columnsCount; i++) {
+      line.append(i).append(",");
+      columns.append("columns[").append(i).append("]").append(",");
+    }
+    line.deleteCharAt(line.length() - 1);
+    columns.deleteCharAt(columns.length() - 1);
+
+    try {
+      /*
+      0,1,2...1200
+      0,1,2...1200
+       */
+      FileUtils.writeStringToFile(file, String.format("%1$s\n%1$s", 
line.toString()));
+
+      /*
+      select columns[0], columns[1] ... columns[1200] from 
dfs.`union_for_1200_columns.csv`
+      union
+      select columns[0], columns[1] ... columns[1200] from 
dfs.`union_for_1200_columns.csv`
+       */
+      test("select %1$s from dfs.`%2$s` union select %1$s from dfs.`%2$s`", 
columns.toString(), file.getName());
+    } finally {
+      FileUtils.deleteQuietly(file);
+    }
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java
 
b/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java
index 556135f..527b6b7 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/ValueExpressions.java
@@ -21,6 +21,7 @@ import java.math.BigDecimal;
 import java.util.GregorianCalendar;
 import java.util.Iterator;
 
+import com.google.common.collect.ImmutableList;
 import org.apache.drill.common.expression.visitors.ExprVisitor;
 import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MajorType;
@@ -135,6 +136,10 @@ public class ValueExpressions {
 
   }
 
+  public static LogicalExpression getParameterExpression(String name, 
MajorType type) {
+    return new ParameterExpression(name, type, ExpressionPosition.UNKNOWN);
+  }
+
   protected static abstract class ValueExpression<V> extends 
LogicalExpressionBase {
     public final V value;
 
@@ -679,4 +684,38 @@ public class ValueExpressions {
     }
   }
 
+  /**
+   * Is used to identify method parameter based on given name and type.
+   */
+  public static class ParameterExpression extends LogicalExpressionBase {
+
+    private final String name;
+    private final MajorType type;
+
+    protected ParameterExpression(String name, MajorType type, 
ExpressionPosition pos) {
+      super(pos);
+      this.name = name;
+      this.type = type;
+    }
+
+    public String getName() {
+      return name;
+    }
+
+    @Override
+    public MajorType getMajorType() {
+      return type;
+    }
+
+    @Override
+    public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, 
V value) throws E {
+      return visitor.visitParameter(this, value);
+    }
+
+    @Override
+    public Iterator<LogicalExpression> iterator() {
+      return ImmutableList.<LogicalExpression>of().iterator();
+    }
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/visitors/AbstractExprVisitor.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/AbstractExprVisitor.java
 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/AbstractExprVisitor.java
index a31e6e8..189e33d 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/AbstractExprVisitor.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/AbstractExprVisitor.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -39,6 +39,7 @@ import 
org.apache.drill.common.expression.ValueExpressions.IntExpression;
 import 
org.apache.drill.common.expression.ValueExpressions.IntervalDayExpression;
 import 
org.apache.drill.common.expression.ValueExpressions.IntervalYearExpression;
 import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.ParameterExpression;
 import org.apache.drill.common.expression.ValueExpressions.QuotedString;
 import org.apache.drill.common.expression.ValueExpressions.TimeExpression;
 import org.apache.drill.common.expression.ValueExpressions.TimeStampExpression;
@@ -172,5 +173,9 @@ public abstract class AbstractExprVisitor<T, VAL, EXCEP 
extends Exception> imple
     throw new UnsupportedOperationException(String.format("Expression of type 
%s not handled by visitor type %s.", e.getClass().getCanonicalName(), 
this.getClass().getCanonicalName()));
   }
 
+  @Override
+  public T visitParameter(ParameterExpression e, VAL value) throws EXCEP {
+    return visitUnknown(e, value);
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/visitors/AggregateChecker.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/AggregateChecker.java
 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/AggregateChecker.java
index 46789e3..9a3cdcc 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/AggregateChecker.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/AggregateChecker.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -29,6 +29,7 @@ import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.common.expression.NullExpression;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.expression.TypedNullConstant;
+import org.apache.drill.common.expression.ValueExpressions;
 import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
 import org.apache.drill.common.expression.ValueExpressions.DateExpression;
 import org.apache.drill.common.expression.ValueExpressions.Decimal18Expression;
@@ -203,4 +204,9 @@ public final class AggregateChecker implements 
ExprVisitor<Boolean, ErrorCollect
     return false;
   }
 
+  @Override
+  public Boolean visitParameter(ValueExpressions.ParameterExpression e, 
ErrorCollector value) throws RuntimeException {
+    return false;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/visitors/ConstantChecker.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ConstantChecker.java
 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ConstantChecker.java
index ccb11a6..67fe12f 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ConstantChecker.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ConstantChecker.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -29,6 +29,7 @@ import org.apache.drill.common.expression.LogicalExpression;
 import org.apache.drill.common.expression.NullExpression;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.expression.TypedNullConstant;
+import org.apache.drill.common.expression.ValueExpressions;
 import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
 import org.apache.drill.common.expression.ValueExpressions.DateExpression;
 import org.apache.drill.common.expression.ValueExpressions.Decimal18Expression;
@@ -207,4 +208,9 @@ final class ConstantChecker implements ExprVisitor<Boolean, 
ErrorCollector, Runt
     return true;
   }
 
+  @Override
+  public Boolean visitParameter(ValueExpressions.ParameterExpression e, 
ErrorCollector value) throws RuntimeException {
+    return false;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/visitors/ExprVisitor.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ExprVisitor.java
 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ExprVisitor.java
index 2d0cd8c..7c59f3c 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ExprVisitor.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ExprVisitor.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -39,6 +39,7 @@ import 
org.apache.drill.common.expression.ValueExpressions.IntExpression;
 import 
org.apache.drill.common.expression.ValueExpressions.IntervalDayExpression;
 import 
org.apache.drill.common.expression.ValueExpressions.IntervalYearExpression;
 import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.ParameterExpression;
 import org.apache.drill.common.expression.ValueExpressions.QuotedString;
 import org.apache.drill.common.expression.ValueExpressions.TimeExpression;
 import org.apache.drill.common.expression.ValueExpressions.TimeStampExpression;
@@ -69,4 +70,5 @@ public interface ExprVisitor<T, VAL, EXCEP extends Exception> 
{
   public T visitUnknown(LogicalExpression e, VAL value) throws EXCEP;
   public T visitCastExpression(CastExpression e, VAL value) throws EXCEP;
   public T visitConvertExpression(ConvertExpression e, VAL value) throws EXCEP;
+  public T visitParameter(ParameterExpression e, VAL value) throws EXCEP;
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/ef4c63d5/logical/src/main/java/org/apache/drill/common/expression/visitors/ExpressionValidator.java
----------------------------------------------------------------------
diff --git 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ExpressionValidator.java
 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ExpressionValidator.java
index eb1394c..e8cbc2b 100644
--- 
a/logical/src/main/java/org/apache/drill/common/expression/visitors/ExpressionValidator.java
+++ 
b/logical/src/main/java/org/apache/drill/common/expression/visitors/ExpressionValidator.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -231,4 +231,9 @@ public class ExpressionValidator implements 
ExprVisitor<Void, ErrorCollector, Ru
     return e.getInput().accept(this, value);
   }
 
+  @Override
+  public Void visitParameter(ValueExpressions.ParameterExpression e, 
ErrorCollector value) throws RuntimeException {
+    return null;
+  }
+
 }

Reply via email to