You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by ja...@apache.org on 2013/07/20 03:58:05 UTC

[44/53] [abbrv] git commit: Types transition

Types transition


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

Branch: refs/heads/master
Commit: ce0da88d2df38d079a11d2b269fad9e964e1c14a
Parents: e68bba2
Author: Jacques Nadeau <ja...@apache.org>
Authored: Mon Jun 24 08:06:43 2013 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Fri Jul 19 14:53:11 2013 -0700

----------------------------------------------------------------------
 sandbox/prototype/common/pom.xml                | 216 ++---
 .../drill/common/expression/parser/ExprParser.g |  64 +-
 .../org/apache/drill/common/expression/Arg.java |  44 +-
 .../common/expression/ArgumentValidator.java    |   2 +-
 .../common/expression/ArgumentValidators.java   |  62 +-
 .../expression/BasicArgumentValidator.java      |   8 +-
 .../drill/common/expression/ErrorCollector.java |  18 +-
 .../common/expression/ErrorCollectorImpl.java   |  40 +-
 .../common/expression/ExpressionPosition.java   |  27 +
 .../expression/ExpressionStringBuilder.java     | 102 +++
 .../common/expression/ExpressionValidator.java  |  86 ++
 .../drill/common/expression/FieldReference.java |  18 +-
 .../drill/common/expression/FunctionBase.java   |  94 --
 .../drill/common/expression/FunctionCall.java   |  55 +-
 .../common/expression/FunctionDefinition.java   |   8 +-
 .../common/expression/FunctionRegistry.java     |  13 +-
 .../drill/common/expression/IfExpression.java   |  65 +-
 .../common/expression/LogicalExpression.java    |  98 +-
 .../expression/LogicalExpressionBase.java       |  56 +-
 .../common/expression/OutputTypeDeterminer.java |  34 +-
 .../drill/common/expression/PathSegment.java    |  26 +
 .../drill/common/expression/SchemaPath.java     | 176 ++--
 .../common/expression/ValueExpressions.java     | 320 ++++---
 .../common/expression/fn/BooleanFunctions.java  |   6 +-
 .../common/expression/fn/MathFunctions.java     |  10 +-
 .../common/expression/fn/StringFunctions.java   |   7 +-
 .../common/expression/fn/UnaryFunctions.java    |   6 +-
 .../drill/common/expression/types/AtomType.java |  67 ++
 .../drill/common/expression/types/DataType.java |   2 +-
 .../visitors/AbstractExprVisitor.java           |  56 ++
 .../expression/visitors/AggregateChecker.java   |  25 +-
 .../expression/visitors/ConstantChecker.java    |  21 +-
 .../common/expression/visitors/ExprVisitor.java |  18 +-
 .../expression/visitors/SimpleExprVisitor.java  |  56 ++
 .../org/apache/drill/common/types/Types.java    | 134 +++
 .../common/src/main/protobuf/Types.proto        |  64 ++
 sandbox/prototype/exec/java-exec/pom.xml        | 360 ++++----
 .../org/apache/drill/exec/ExecConstants.java    |   1 +
 .../drill/exec/compile/ClassTransformer.java    |   1 +
 .../drill/exec/compile/CodeModelTools.java      |  31 +
 .../apache/drill/exec/expr/CodeGenerator.java   | 201 +++++
 .../apache/drill/exec/expr/DrillAggrFunc.java   |   9 +
 .../org/apache/drill/exec/expr/DrillFunc.java   |   9 +
 .../drill/exec/expr/EvaluationVisitor.java      | 201 +++++
 .../exec/expr/ExpressionTreeMaterializer.java   | 128 +++
 .../exec/expr/SingleClassStringWriter.java      |  40 +
 .../exec/expr/ValueVectorReadExpression.java    |  41 +
 .../exec/expr/ValueVectorWriteExpression.java   |  45 +
 .../exec/expr/annotations/FunctionTemplate.java |  25 +
 .../drill/exec/expr/annotations/Output.java     |  18 +
 .../drill/exec/expr/annotations/Param.java      |  18 +
 .../drill/exec/expr/annotations/WorkSpace.java  |  14 +
 .../drill/exec/expr/fn/FunctionConverter.java   | 186 ++++
 .../drill/exec/expr/fn/FunctionHolder.java      | 158 ++++
 .../expr/fn/FunctionImplementationRegistry.java |  43 +
 .../exec/expr/fn/MethodGrabbingVisitor.java     |  52 ++
 .../exec/expr/fn/ModifiedUnparseVisitor.java    | 891 +++++++++++++++++++
 .../drill/exec/expr/fn/impl/MathFunctions.java  |  48 +
 .../drill/exec/expr/holders/ValueHolder.java    |   4 +
 .../holders/ValueHolderImplmenetations.java     |  44 +
 .../exec/expr/holders/VarBinaryHolder.java      |  12 +
 .../apache/drill/exec/ops/FragmentContext.java  |  26 +-
 .../apache/drill/exec/opt/BasicOptimizer.java   |  28 +-
 .../apache/drill/exec/physical/RecordField.java |   8 +-
 .../exec/physical/config/MockRecordReader.java  |  19 +-
 .../drill/exec/physical/config/MockScanPOP.java |   8 +-
 .../exec/physical/impl/FilterRecordBatch.java   |  34 +
 .../drill/exec/physical/impl/OutputMutator.java |   9 +
 .../drill/exec/physical/impl/ScanBatch.java     |  72 +-
 .../drill/exec/physical/impl/VectorHolder.java  |  39 +
 .../exec/physical/impl/WireRecordBatch.java     |  32 +-
 .../impl/filter/EvalSetupException.java         |   5 +
 .../impl/filter/EvaluationPredicate.java        |  13 +
 .../physical/impl/filter/ExampleFilter.java     | 113 +++
 .../physical/impl/project/ProjectEvaluator.java |  12 +
 .../impl/project/ProjectRecordBatch.java        | 218 +++++
 .../exec/physical/impl/project/Projector.java   |  20 +
 .../impl/project/ProjectorTemplate.java         | 101 +++
 .../physical/impl/project/TransferPairing.java  |  35 +
 .../drill/exec/planner/PhysicalPlanReader.java  |   2 +-
 .../apache/drill/exec/record/BatchSchema.java   |  36 +-
 .../exec/record/ExpressionTreeMaterializer.java | 138 ---
 .../drill/exec/record/MajorTypeSerDe.java       |   6 +-
 .../drill/exec/record/MaterializedField.java    |  58 +-
 .../drill/exec/record/NullExpression.java       |  32 +
 .../apache/drill/exec/record/RecordBatch.java   |  67 +-
 .../drill/exec/record/RecordBatchLoader.java    |  84 +-
 .../apache/drill/exec/record/SchemaBuilder.java |  75 +-
 .../apache/drill/exec/record/WritableBatch.java |  43 +-
 .../exec/record/vector/NullableFixed8.java      |  36 +
 .../exec/record/vector/SelectionVector.java     |   8 +
 .../exec/record/vector/SelectionVector2.java    |  46 +
 .../exec/record/vector/SelectionVector4.java    |  41 +
 .../org/apache/drill/exec/schema/Field.java     |  31 +-
 .../apache/drill/exec/schema/ListSchema.java    |  17 +-
 .../apache/drill/exec/schema/NamedField.java    |  19 +-
 .../apache/drill/exec/schema/OrderedField.java  |   9 +-
 .../exec/schema/json/jackson/JacksonHelper.java |  26 +-
 .../drill/exec/store/JSONRecordReader.java      |  84 +-
 .../exec/work/batch/BitComHandlerImpl.java      |   3 +-
 .../work/foreman/RunningFragmentManager.java    |   3 +-
 .../work/fragment/RemoteFragmentHandler.java    |   3 +-
 .../java-exec/src/main/protobuf/SchemaDef.proto |  63 +-
 .../src/main/resources/drill-module.conf        |  13 +-
 .../java/org/apache/drill/exec/SortTest.java    |  61 ++
 .../apache/drill/exec/expr/ExpressionTest.java  | 108 +++
 .../exec/physical/impl/PerformanceTests.java    |  32 +
 .../impl/TestExecutionAbstractions.java         | 226 +++++
 .../physical/impl/TestSimpleFragmentRun.java    |  51 +-
 .../record/ExpressionTreeMaterializerTest.java  | 297 ++++---
 .../drill/exec/store/JSONRecordReaderTest.java  | 469 +++++-----
 .../org/apache/drill/exec/ref/RunOutcome.java   |   1 +
 .../exec/ref/eval/BasicEvaluatorFactory.java    |  11 +-
 .../apache/drill/exec/ref/eval/IfEvaluator.java |  10 +-
 .../exec/ref/eval/SimpleEvaluationVisitor.java  |  24 +-
 .../drill/exec/ref/eval/fn/MathEvaluators.java  |   5 +-
 .../exec/ref/rops/CollapsingAggregateROP.java   |   4 +-
 .../apache/drill/exec/ref/rops/ConstantROP.java |   3 -
 .../apache/drill/exec/ref/rops/FlattenROP.java  |   7 +-
 .../drill/exec/ref/rops/WindowFrameROP.java     |   5 +-
 .../drill/exec/ref/values/BaseArrayValue.java   |  21 +-
 .../drill/exec/ref/values/BaseMapValue.java     |   9 +-
 .../apache/drill/exec/ref/values/DataValue.java |   4 +-
 .../drill/exec/ref/values/NumericValue.java     |  17 +-
 .../drill/exec/ref/values/ScalarValues.java     |  66 +-
 .../drill/exec/ref/values/SimpleArrayValue.java |   4 +-
 .../drill/exec/ref/values/SimpleMapValue.java   |   5 +-
 .../drill/exec/ref/values/ValueReader.java      |  14 +-
 .../drill/exec/ref/values/ValueUtils.java       |  17 +-
 .../apache/drill/exec/ref/RunSimplePlan.java    |  14 +-
 .../org/apache/drill/exec/ref/TestUtils.java    |   3 +-
 .../exec/ref/rops/CollapsingAggregateTest.java  |   5 +-
 .../drill/exec/ref/rops/ConstantROPTest.java    |   5 +-
 .../drill/exec/ref/rops/OrderROPTest.java       |   5 +-
 .../drill/exec/ref/rops/WindowFrameROPTest.java |  12 +-
 sandbox/prototype/pom.xml                       | 381 ++++----
 136 files changed, 6212 insertions(+), 2103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/pom.xml b/sandbox/prototype/common/pom.xml
index 4a8c5d8..4891191 100644
--- a/sandbox/prototype/common/pom.xml
+++ b/sandbox/prototype/common/pom.xml
@@ -1,103 +1,119 @@
 <?xml version="1.0"?>
 <project
-        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-        xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>prototype-parent</artifactId>
-        <groupId>org.apache.drill</groupId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>common</artifactId>
-    <packaging>jar</packaging>
-    <name>common</name>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
-            <version>2.5.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.typesafe</groupId>
-            <artifactId>config</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.msgpack</groupId>
-            <artifactId>msgpack</artifactId>
-            <version>0.6.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.reflections</groupId>
-            <artifactId>reflections</artifactId>
-            <version>0.9.8</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.hibernate</groupId>
-            <artifactId>hibernate-validator</artifactId>
-            <version>4.3.1.Final</version>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>antlr-runtime</artifactId>
-            <version>3.4</version>
-        </dependency>
-
-
-    </dependencies>
-
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>test-jar</id>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.antlr</groupId>
-                <artifactId>antlr3-maven-plugin</artifactId>
-                <version>3.4</version>
-                <configuration>
-
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>antlr</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <artifactId>prototype-parent</artifactId>
+    <groupId>org.apache.drill</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>common</artifactId>
+  <packaging>jar</packaging>
+  <name>common</name>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>2.5.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.typesafe</groupId>
+      <artifactId>config</artifactId>
+      <version>1.0.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.msgpack</groupId>
+      <artifactId>msgpack</artifactId>
+      <version>0.6.6</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.reflections</groupId>
+      <artifactId>reflections</artifactId>
+      <version>0.9.8</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>2.1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-validator</artifactId>
+      <version>4.3.1.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr-runtime</artifactId>
+      <version>3.4</version>
+    </dependency>
+
+
+  </dependencies>
+
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>test-jar</id>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr3-maven-plugin</artifactId>
+        <version>3.4</version>
+        <configuration>
+
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>antlr</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+
+      <plugin>
+        <groupId>com.github.igor-petruk.protobuf</groupId>
+        <artifactId>protobuf-maven-plugin</artifactId>
+        <version>0.6.3</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
+  </build>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
index f8eb725..6cf041c 100644
--- a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
+++ b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
@@ -40,7 +40,8 @@ import org.apache.drill.common.expression.*;
 
 @members{
   private FunctionRegistry registry;
-  
+  private String fullExpression;
+  private int tokenPos;
   public void setRegistry(FunctionRegistry registry){
     this.registry = registry;
   }
@@ -48,14 +49,22 @@ import org.apache.drill.common.expression.*;
   public static void p(String s){
     System.out.println(s);
   }
+  
+  public ExpressionPosition pos(Token token){
+    return new ExpressionPosition(fullExpression, token.getTokenIndex());
+  }
 }
 
 parse returns [LogicalExpression e]
-  :  expression EOF {$e = $expression.e; }
+  :  expression EOF {
+    $e = $expression.e; 
+    if(fullExpression == null) fullExpression = $expression.text;
+    tokenPos = $expression.start.getTokenIndex();
+  }
   ;
  
 functionCall returns [LogicalExpression e]
-  :  Identifier OParen exprList? CParen {$e = registry.createExpression($Identifier.text, $exprList.listE);  }
+  :  Identifier OParen exprList? CParen {$e = registry.createExpression($Identifier.text, pos($Identifier), $exprList.listE);  }
   ;
 
 ifStatement returns [LogicalExpression e]
@@ -65,7 +74,7 @@ ifStatement returns [LogicalExpression e]
 	@after {
 	  $e = s.build();
 	}  
-  :  i1=ifStat {s.addCondition($i1.i); } (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression { s.setElse($expression.e); }End 
+  :  i1=ifStat {s.addCondition($i1.i); s.setPosition(pos($i1.start)); } (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression { s.setElse($expression.e); }End 
   ;
 
 ifStat returns [IfExpression.IfCondition i]
@@ -113,96 +122,103 @@ condExpr returns [LogicalExpression e]
 orExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
+	  ExpressionPosition p = null;
 	}
 	@after{
 	  if(exprs.size() == 1){
 	    $e = exprs.get(0);
 	  }else{
-	    $e = registry.createExpression("||", exprs);
+	    $e = registry.createExpression("||", p, exprs);
 	  }
 	}
-  :  a1=andExpr { exprs.add($a1.e); } (Or^ a2=andExpr { exprs.add($a2.e); })*
+  :  a1=andExpr { exprs.add($a1.e); p = pos( $a1.start );} (Or^ a2=andExpr { exprs.add($a2.e); })*
   ;
 
 andExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
+	  ExpressionPosition p = null;
 	}
 	@after{
 	  if(exprs.size() == 1){
 	    $e = exprs.get(0);
 	  }else{
-	    $e = registry.createExpression("&&", exprs);
+	    $e = registry.createExpression("&&", p, exprs);
 	  }
 	}
-  :  e1=equExpr { exprs.add($e1.e);  } (And^ e2=equExpr { exprs.add($e2.e);  })*
+  :  e1=equExpr { exprs.add($e1.e); p = pos( $e1.start );  } (And^ e2=equExpr { exprs.add($e2.e);  })*
   ;
 
 equExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
 	  List<String> cmps = new ArrayList();
+	  ExpressionPosition p = null;
 	}
 	@after{
-	  $e = registry.createByOp(exprs, cmps);
+	  $e = registry.createByOp(exprs, p, cmps);
 	}
-  :  r1=relExpr {exprs.add($r1.e);} ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
+  :  r1=relExpr { exprs.add($r1.e); p = pos( $r1.start );
+    } ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
   ;
 
 relExpr returns [LogicalExpression e]
-  :  left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT | LT) right=addExpr {$e = registry.createExpression($cmpr.text, $left.e, $right.e); } )? 
+  :  left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT | LT) right=addExpr {$e = registry.createExpression($cmpr.text, pos($left.start), $left.e, $right.e); } )? 
   ;
 
 addExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
 	  List<String> ops = new ArrayList();
+	  ExpressionPosition p = null;
 	}
 	@after{
-	  $e = registry.createByOp(exprs, ops);
+	  $e = registry.createByOp(exprs, p, ops);
 	}
-  :  m1=mulExpr  {exprs.add($m1.e);} ( op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })* 
+  :  m1=mulExpr  {exprs.add($m1.e); p = pos($m1.start); } ( op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })* 
   ;
 
 mulExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
 	  List<String> ops = new ArrayList();
+	  ExpressionPosition p = null;
 	}
 	@after{
-	  $e = registry.createByOp(exprs, ops);
+	  $e = registry.createByOp(exprs, p, ops);
 	}
-  :  p1=powExpr  {exprs.add($p1.e);} (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
+  :  p1=powExpr  {exprs.add($p1.e); p = pos($p1.start);} (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
   ;
 
 powExpr returns [LogicalExpression e]
 	@init{
 	  List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
 	  List<String> ops = new ArrayList();
+	  ExpressionPosition p = null;
 	}
 	@after{
-	  $e = registry.createByOp(exprs, ops);
+	  $e = registry.createByOp(exprs, p, ops);
 	}
-  :  u1=unaryExpr {exprs.add($u1.e);} (Caret u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
+  :  u1=unaryExpr {exprs.add($u1.e); p = pos($u1.start);} (Caret u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
   ;
   
 unaryExpr returns [LogicalExpression e]
-  :  Minus atom {$e = registry.createExpression("u-", $atom.e); }
-  |  Excl atom {$e= registry.createExpression("!", $atom.e); }
+  :  Minus atom {$e = registry.createExpression("u-", pos($atom.start), $atom.e); }
+  |  Excl atom {$e= registry.createExpression("!", pos($atom.start), $atom.e); }
   |  atom {$e = $atom.e; }
   ;
 
 atom returns [LogicalExpression e]
-  :  Number {$e = ValueExpressions.getNumericExpression($Number.text); }
-  |  Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text ); }
+  :  Number {$e = ValueExpressions.getNumericExpression($Number.text, pos($atom.start)); }
+  |  Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text, pos($atom.start)); }
   |  lookup {$e = $lookup.e; }
   ;
 
 
 lookup returns [LogicalExpression e]
   :  functionCall {$e = $functionCall.e ;}
-  | Identifier {$e = new SchemaPath($Identifier.text); }
-  | String {$e = new ValueExpressions.QuotedString($String.text); }
+  | Identifier {$e = new SchemaPath($Identifier.text, pos($Identifier) ); }
+  | String {$e = new ValueExpressions.QuotedString($String.text, pos($String) ); }
   | OParen expression CParen  {$e = $expression.e; }
-  | SingleQuote Identifier SingleQuote {$e = new SchemaPath($Identifier.text); }
+  | SingleQuote Identifier SingleQuote {$e = new SchemaPath($Identifier.text, pos($Identifier) ); }
   ;

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
index de9057b..64ec351 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
@@ -17,24 +17,41 @@
  ******************************************************************************/
 package org.apache.drill.common.expression;
 
-import org.apache.drill.common.expression.types.DataType;
+import java.util.List;
+
 import org.apache.drill.common.expression.visitors.ConstantChecker;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
+
+import com.google.common.collect.Lists;
 
 
 public class Arg {
   private final String name;
-  private final DataType[] allowedTypes;
+  private final MajorType[] allowedTypes;
   private final boolean constantsOnly;
   
-  public Arg(DataType... allowedTypes){
+  
+  /**
+   * Create an arg that supports any of the listed minor types using opt or req.  Does not allow repeated types.
+   * @param name
+   * @param constantsOnly
+   * @param types
+   */
+  public Arg(boolean constantsOnly, boolean allowNulls, String name, MinorType... types){
+    this(constantsOnly, name, getMajorTypes(allowNulls, types));
+  }
+  
+  public Arg(MajorType... allowedTypes){
     this(false, null, allowedTypes);
   }
   
-  public Arg(String name, DataType... allowedTypes) {
+  public Arg(String name, MajorType... allowedTypes) {
     this(false, name, allowedTypes);
   }
 
-  public Arg(boolean constantsOnly, String name, DataType... allowedTypes) {
+  public Arg(boolean constantsOnly, String name, MajorType... allowedTypes) {
     this.name = name;
     this.allowedTypes = allowedTypes;
     this.constantsOnly = constantsOnly;
@@ -44,15 +61,15 @@ public class Arg {
     return name;
   }
   
-  public void confirmDataType(String expr, int argIndex, LogicalExpression e, ErrorCollector errors){
+  public void confirmDataType(ExpressionPosition expr, int argIndex, LogicalExpression e, ErrorCollector errors){
     if(constantsOnly){
       if(ConstantChecker.onlyIncludesConstants(e)) errors.addExpectedConstantValue(expr, argIndex, name);
     }
-    DataType dt = e.getDataType();
-    if(dt.isLateBind()){
+    MajorType dt = e.getMajorType();
+    if(dt.getMinorType() == MinorType.LATE){
       
       // change among allowed types.
-      for(DataType a : allowedTypes){
+      for(MajorType a : allowedTypes){
         if(dt == a) return;
       }
       
@@ -63,4 +80,13 @@ public class Arg {
     
     
   }
+  
+  private static MajorType[] getMajorTypes(boolean allowNulls, MinorType... types){
+    List<MajorType> mts = Lists.newArrayList();
+    for(MinorType t : types){
+      if(allowNulls) mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.OPTIONAL).build());
+      mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.REQUIRED).build());
+    }
+    return mts.toArray(new MajorType[mts.size()]);
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
index dc22045..765dc3f 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
@@ -23,6 +23,6 @@ import java.util.List;
  * Validates whether the set of arguments are acceptable
  */
 public interface ArgumentValidator {
-  public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors);
+  public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors);
   public String[] getArgumentNamesByPosition();
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
index 25cb887..f30733d 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
@@ -20,8 +20,8 @@ package org.apache.drill.common.expression;
 import java.util.List;
 
 import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.types.DataType.Comparability;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.Types;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Range;
@@ -46,7 +46,7 @@ public class ArgumentValidators {
     }
 
     @Override
-    public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+    public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
       // only need to check argument count since any type is allowed.
       if (!argumentCount.contains(expressions.size()))
         errors.addUnexpectedArgumentCount(expr, expressions.size(), argumentCount);
@@ -61,17 +61,17 @@ public class ArgumentValidators {
 
   private static class PredicateValidator implements ArgumentValidator {
     private final Range<Integer> argumentCount;
-    private Predicate<DataType> predicate;
+    private Predicate<MajorType> predicate;
     private boolean allSame;
 
-    public PredicateValidator(int argCount, Predicate<DataType> predicate, boolean allSame) {
+    public PredicateValidator(int argCount, Predicate<MajorType> predicate, boolean allSame) {
       super();
       this.argumentCount = Ranges.singleton(argCount);
       this.predicate = predicate;
       this.allSame = allSame;
     }
 
-    public PredicateValidator(int minArguments, int maxArguments, Predicate<DataType> predicate, boolean allSame) {
+    public PredicateValidator(int minArguments, int maxArguments, Predicate<MajorType> predicate, boolean allSame) {
       super();
       this.argumentCount = Ranges.closedOpen(minArguments, maxArguments);
       this.predicate = predicate;
@@ -79,21 +79,21 @@ public class ArgumentValidators {
     }
 
     @Override
-    public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+    public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
       int i = -1;
-      DataType t = null;
+      MajorType t = null;
       for (LogicalExpression le : expressions) {
         i++;
-          DataType dataType = le.getDataType();
-          if (t == null) t = dataType;
+          MajorType majorType = le.getMajorType();
+          if (t == null) t = majorType;
 
-        if (!predicate.apply(dataType)) {
-          errors.addUnexpectedType(expr, i, dataType);
+        if (!predicate.apply(majorType)) {
+          errors.addUnexpectedType(expr, i, majorType);
           continue;
         }
 
-        if (allSame && t != DataType.LATEBIND && dataType != DataType.LATEBIND && t != dataType) {
-          errors.addUnexpectedType(expr, i, dataType);
+        if (allSame && !Types.isLateBind(t) && !Types.isLateBind(majorType) && !Types.softEquals(t, majorType, true)) {
+          errors.addUnexpectedType(expr, i, majorType);
         }
 
       }
@@ -109,50 +109,50 @@ public class ArgumentValidators {
 
   public static class ComparableArguments extends PredicateValidator {
 
-    public ComparableArguments(int argCount, DataType... allowedTypes) {
+    public ComparableArguments(int argCount, MajorType... allowedTypes) {
       super(argCount, new ComparableChecker(), true);
     }
 
-    public ComparableArguments(int minArguments, int maxArguments, DataType... allowedTypes) {
+    public ComparableArguments(int minArguments, int maxArguments, MajorType... allowedTypes) {
       super(minArguments, maxArguments, new ComparableChecker(), true);
     }
 
-    public static class ComparableChecker implements Predicate<DataType> {
+    public static class ComparableChecker implements Predicate<MajorType> {
 
-      public boolean apply(DataType dt) {
-          Comparability comparability = dt.getComparability();
-          return comparability.equals(Comparability.ORDERED) || comparability.equals(Comparability.UNKNOWN);
+      public boolean apply(MajorType dt) {
+          Types.Comparability comparability = Types.getComparability(dt);
+          return comparability.equals(Types.Comparability.ORDERED) || comparability.equals(Types.Comparability.UNKNOWN);
       }
     }
   }
 
   public static class AllowedTypeList extends PredicateValidator {
 
-    public AllowedTypeList(int argCount, DataType... allowedTypes) {
+    public AllowedTypeList(int argCount, MajorType... allowedTypes) {
       super(argCount, new AllowedTypeChecker(allowedTypes), false);
     }
 
-    public AllowedTypeList(int minArguments, int maxArguments, DataType... allowedTypes) {
+    public AllowedTypeList(int minArguments, int maxArguments, MajorType... allowedTypes) {
       super(minArguments, maxArguments, new AllowedTypeChecker(allowedTypes), false);
     }
 
-    public AllowedTypeList(int argCount, boolean allSame, DataType... allowedTypes) {
+    public AllowedTypeList(int argCount, boolean allSame, MajorType... allowedTypes) {
       super(argCount, new AllowedTypeChecker(allowedTypes), allSame);
     }
 
-    public AllowedTypeList(int minArguments, int maxArguments, boolean allSame, DataType... allowedTypes) {
+    public AllowedTypeList(int minArguments, int maxArguments, boolean allSame, MajorType... allowedTypes) {
       super(minArguments, maxArguments, new AllowedTypeChecker(allowedTypes), allSame);
     }
 
-    public static class AllowedTypeChecker implements Predicate<DataType> {
+    public static class AllowedTypeChecker implements Predicate<MajorType> {
 
-      private DataType[] allowedTypes;
+      private MajorType[] allowedTypes;
 
-      public AllowedTypeChecker(DataType... allowedTypes) {
+      public AllowedTypeChecker(MajorType... allowedTypes) {
         this.allowedTypes = allowedTypes;
       }
 
-      public boolean apply(DataType dt) {
+      public boolean apply(MajorType dt) {
         return ArrayUtils.contains(allowedTypes, dt);
       }
     }
@@ -170,10 +170,10 @@ public class ArgumentValidators {
       super(minArguments, maxArguments, new NumericTypeChecker(), allSame);
     }
 
-    public static class NumericTypeChecker implements Predicate<DataType> {
+    public static class NumericTypeChecker implements Predicate<MajorType> {
 
-      public boolean apply(DataType dt) {
-        return dt.isNumericType();
+      public boolean apply(MajorType dt) {
+        return Types.isNumericType(dt);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
index eed49d3..26b7cf6 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
@@ -19,13 +19,13 @@ package org.apache.drill.common.expression;
 
 import java.util.List;
 
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 public class BasicArgumentValidator implements ArgumentValidator {
 
   private final Arg[] args;
 
-  public BasicArgumentValidator(DataType... types) {
+  public BasicArgumentValidator(MajorType... types) {
     this.args = new Arg[] { new Arg("single", types) };
   }
 
@@ -34,7 +34,7 @@ public class BasicArgumentValidator implements ArgumentValidator {
   }
 
   @Override
-  public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+  public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
     if (expressions.size() != args.length) errors.addUnexpectedArgumentCount(expr, expressions.size(), args.length);
 
     int i = 0;
@@ -45,7 +45,7 @@ public class BasicArgumentValidator implements ArgumentValidator {
     }
   }
 
-  public Arg arg(String name, DataType... allowedTypes) {
+  public Arg arg(String name, MajorType... allowedTypes) {
     return new Arg(name, allowedTypes);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
index 21ecec4..b322345 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
@@ -17,27 +17,29 @@
  ******************************************************************************/
 package org.apache.drill.common.expression;
 
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 import com.google.common.collect.Range;
 
 public interface ErrorCollector {
 
-    public void addGeneralError(String expr, String s);
+    public void addGeneralError(ExpressionPosition expr, String s);
 
-    public void addUnexpectedArgumentType(String expr, String name, DataType actual, DataType[] expected, int argumentIndex);
+    public void addUnexpectedArgumentType(ExpressionPosition expr, String name, MajorType actual, MajorType[] expected, int argumentIndex);
 
-    public void addUnexpectedArgumentCount(String expr, int actual, Range<Integer> expected);
+    public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, Range<Integer> expected);
 
-    public void addUnexpectedArgumentCount(String expr, int actual, int expected);
+    public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, int expected);
 
-    public void addNonNumericType(String expr, DataType actual);
+    public void addNonNumericType(ExpressionPosition expr, MajorType actual);
 
-    public void addUnexpectedType(String expr, int index, DataType actual);
+    public void addUnexpectedType(ExpressionPosition expr, int index, MajorType actual);
 
-    public void addExpectedConstantValue(String expr, int actual, String s);
+    public void addExpectedConstantValue(ExpressionPosition expr, int actual, String s);
 
     boolean hasErrors();
+    
+    public int getErrorCount();
 
     String toErrorString();
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
index cc90b82..054e067 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
@@ -1,12 +1,13 @@
 package org.apache.drill.common.expression;
 
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.drill.common.types.TypeProtos.MajorType;
+
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Range;
-import org.apache.drill.common.expression.types.DataType;
-
-import java.util.Arrays;
-import java.util.List;
 
 public class ErrorCollectorImpl implements ErrorCollector {
     List<ExpressionValidationError> errors;
@@ -15,17 +16,17 @@ public class ErrorCollectorImpl implements ErrorCollector {
         errors = Lists.newArrayList();
     }
 
-    private String addExpr(String expr, String message) {
-        return "Expression: [" + expr + "]. Error: " + message;
+    private String addExpr(ExpressionPosition expr, String message) {
+        return String.format("Error in expression at index %d.  Error: %s.  Full expression: %s.", expr.getCharIndex(), message, expr.getExpression());
     }
 
     @Override
-    public void addGeneralError(String expr, String s) {
+    public void addGeneralError(ExpressionPosition expr, String s) {
         errors.add(new ExpressionValidationError(addExpr(expr, s)));
     }
 
     @Override
-    public void addUnexpectedArgumentType(String expr, String name, DataType actual, DataType[] expected, int argumentIndex) {
+    public void addUnexpectedArgumentType(ExpressionPosition expr, String name, MajorType actual, MajorType[] expected, int argumentIndex) {
         errors.add(
                 new ExpressionValidationError(
                         addExpr(expr, String.format(
@@ -37,35 +38,35 @@ public class ErrorCollectorImpl implements ErrorCollector {
     }
 
     @Override
-    public void addUnexpectedArgumentCount(String expr, int actual, Range<Integer> expected) {
+    public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, Range<Integer> expected) {
         errors.add(new ExpressionValidationError(
                 addExpr(expr, String.format("Unexpected argument count. Actual argument count: %d, Expected range: %s", actual, expected))
         ));
     }
 
     @Override
-    public void addUnexpectedArgumentCount(String expr, int actual, int expected) {
+    public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, int expected) {
         errors.add(new ExpressionValidationError(
                 addExpr(expr, String.format("Unexpected argument count. Actual argument count: %d, Expected count: %d", actual, expected))
         ));
     }
 
     @Override
-    public void addNonNumericType(String expr, DataType actual) {
+    public void addNonNumericType(ExpressionPosition expr, MajorType actual) {
         errors.add(new ExpressionValidationError(
                 addExpr(expr, String.format("Unexpected numeric type. Actual type: %s", actual))
         ));
     }
 
     @Override
-    public void addUnexpectedType(String expr, int index, DataType actual) {
+    public void addUnexpectedType(ExpressionPosition expr, int index, MajorType actual) {
         errors.add(new ExpressionValidationError(
                 addExpr(expr, String.format("Unexpected argument type. Actual type: %s, Index: %d", actual, index))
         ));
     }
 
     @Override
-    public void addExpectedConstantValue(String expr, int actual, String s) {
+    public void addExpectedConstantValue(ExpressionPosition expr, int actual, String s) {
         errors.add(new ExpressionValidationError(
                 addExpr(expr, String.format("Unexpected constant value. Name: %s, Actual: %s", s, actual))
         ));
@@ -76,8 +77,21 @@ public class ErrorCollectorImpl implements ErrorCollector {
         return !errors.isEmpty();
     }
 
+    
+    @Override
+    public int getErrorCount() {
+      return errors.size();
+    }
+
     @Override
     public String toErrorString() {
         return "\n" + Joiner.on("\n").join(errors);
     }
+
+    @Override
+    public String toString() {
+      return toErrorString();
+    }
+    
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
new file mode 100644
index 0000000..2e8b529
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
@@ -0,0 +1,27 @@
+package org.apache.drill.common.expression;
+
+public class ExpressionPosition {
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionPosition.class);
+  
+  public static final ExpressionPosition UNKNOWN = new ExpressionPosition("--UNKNOWN EXPRESSION--", -1);
+  
+  private final String expression;
+  private final int charIndex;
+  
+  public ExpressionPosition(String expression, int charIndex) {
+    super();
+    this.expression = expression;
+    this.charIndex = charIndex;
+  }
+
+  public String getExpression() {
+    return expression;
+  }
+
+  public int getCharIndex() {
+    return charIndex;
+  }
+  
+  
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
new file mode 100644
index 0000000..09a7d57
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
@@ -0,0 +1,102 @@
+package org.apache.drill.common.expression;
+
+import org.apache.drill.common.expression.IfExpression.IfCondition;
+import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
+import org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
+import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.QuotedString;
+import org.apache.drill.common.expression.visitors.AbstractExprVisitor;
+
+import com.google.common.collect.ImmutableList;
+
+public class ExpressionStringBuilder extends AbstractExprVisitor<Void, StringBuilder, RuntimeException>{
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionStringBuilder.class);
+
+  @Override
+  public Void visitFunctionCall(FunctionCall call, StringBuilder sb) throws RuntimeException {
+    FunctionDefinition func = call.getDefinition();
+    ImmutableList<LogicalExpression> args = call.args;
+    if (func.isOperator()) {
+      if (args.size() == 1) { // unary
+        func.addRegisteredName(sb);
+        sb.append("(");
+        args.get(0).accept(this, sb);
+        sb.append(")");
+      } else {
+        for (int i = 0; i < args.size(); i++) {
+          if (i != 0) {
+            sb.append(" ");
+            func.addRegisteredName(sb);
+          }
+          sb.append(" (");
+          args.get(i).accept(this, sb);
+          sb.append(") ");
+        }
+      }
+    } else { // normal function
+
+      func.addRegisteredName(sb);
+      sb.append("(");
+      for (int i = 0; i < args.size(); i++) {
+        if (i != 0) sb.append(", ");
+        args.get(i).accept(this, sb);
+      }
+      sb.append(") ");
+    }
+    return null;
+  }
+
+  @Override
+  public Void visitIfExpression(IfExpression ifExpr, StringBuilder sb) throws RuntimeException {
+    ImmutableList<IfCondition> conditions = ifExpr.conditions;
+    sb.append(" ( ");
+    for(int i =0; i < conditions.size(); i++){
+      IfCondition c = conditions.get(i);
+      if(i !=0) sb.append(" else ");
+      sb.append("if (");
+      c.condition.accept(this, sb);
+      sb.append(" ) then (");
+      c.expression.accept(this, sb);
+      sb.append(" ) ");
+    }
+    sb.append(" end ");
+    sb.append(" ) ");
+    return null;
+  }
+
+  @Override
+  public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws RuntimeException {
+    sb.append("'");
+    sb.append(path.getPath());
+    sb.append("'");
+    return null;
+  }
+
+  @Override
+  public Void visitLongConstant(LongExpression lExpr, StringBuilder sb) throws RuntimeException {
+    sb.append(lExpr.getLong());
+    return null;
+  }
+
+  @Override
+  public Void visitDoubleConstant(DoubleExpression dExpr, StringBuilder sb) throws RuntimeException {
+    sb.append(dExpr.getDouble());
+    return null;
+  }
+
+  @Override
+  public Void visitBooleanConstant(BooleanExpression e, StringBuilder sb) throws RuntimeException {
+    sb.append(e.getBoolean());
+    return null;
+  }
+
+  @Override
+  public Void visitQuotedStringConstant(QuotedString e, StringBuilder sb) throws RuntimeException {
+    sb.append("\"");
+    sb.append(e.value);
+    sb.append("\"");
+    return null;
+  }
+  
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
new file mode 100644
index 0000000..98a9075
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
@@ -0,0 +1,86 @@
+package org.apache.drill.common.expression;
+
+import org.apache.drill.common.expression.IfExpression.IfCondition;
+import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
+import org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
+import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.QuotedString;
+import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
+
+public class ExpressionValidator implements ExprVisitor<Void, ErrorCollector, RuntimeException> {
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionValidator.class);
+
+  @Override
+  public Void visitFunctionCall(FunctionCall call, ErrorCollector errors) throws RuntimeException {
+    call.getDefinition().getArgumentValidator()
+        .validateArguments(call.getPosition(), call.args, errors);
+    return null;
+  }
+
+  @Override
+  public Void visitIfExpression(IfExpression ifExpr, ErrorCollector errors) throws RuntimeException {
+    // confirm that all conditions are required boolean values.
+    int i = 0;
+    for (IfCondition c : ifExpr.conditions) {
+      MajorType mt = c.condition.getMajorType();
+      if (mt.getMode() != DataMode.REQUIRED || mt.getMinorType() != MinorType.BOOLEAN){
+        errors.addGeneralError(c.condition.getPosition(),String.format(
+                        "Failure composing If Expression.  All conditions must return a required value and be of type boolean.  Condition %d was DatMode %s and Type %s.",
+                        i, mt.getMode(), mt.getMinorType()));
+      }
+      i++;
+    }
+
+    // confirm that all outcomes are the same type.
+    final MajorType mt = ifExpr.elseExpression.getMajorType();
+    i = 0;
+    for (IfCondition c : ifExpr.conditions) {
+      MajorType innerT = c.expression.getMajorType();
+      if (
+          (innerT.getMode() == DataMode.REPEATED && mt.getMode() != DataMode.REPEATED) || //
+          (innerT.getMinorType() != mt.getMinorType())
+          ) {
+        errors.addGeneralError(c.condition.getPosition(),String.format(
+            "Failure composing If Expression.  All expressions must return the same MajorType as the else expression.  The %d if condition returned type type %s but the else expression was of type %s",
+            i, innerT, mt));
+      }
+      i++;
+    }
+    return null;
+  }
+
+  @Override
+  public Void visitSchemaPath(SchemaPath path, ErrorCollector errors) throws RuntimeException {
+    return null;
+  }
+
+  @Override
+  public Void visitLongConstant(LongExpression intExpr, ErrorCollector errors) throws RuntimeException {
+    return null;
+  }
+
+  @Override
+  public Void visitDoubleConstant(DoubleExpression dExpr, ErrorCollector errors) throws RuntimeException {
+    return null;
+  }
+
+  @Override
+  public Void visitBooleanConstant(BooleanExpression e, ErrorCollector errors) throws RuntimeException {
+    return null;
+  }
+
+  @Override
+  public Void visitQuotedStringConstant(QuotedString e, ErrorCollector errors) throws RuntimeException {
+    return null;
+  }
+
+  @Override
+  public Void visitUnknown(LogicalExpression e, ErrorCollector value) throws RuntimeException {
+    return null;
+  }
+
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
index 94800ba..f611614 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 
 import org.apache.drill.common.expression.FieldReference.De;
 import org.apache.drill.common.expression.FieldReference.Se;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.core.JsonGenerator;
@@ -32,26 +33,25 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import org.apache.drill.common.expression.types.DataType;
 
 @JsonSerialize(using = Se.class)
 @JsonDeserialize(using = De.class)
 public class FieldReference extends SchemaPath {
-  DataType overrideType;
+  MajorType overrideType;
 
-  public FieldReference(String value) {
-    super(value);
+  public FieldReference(String value, ExpressionPosition pos) {
+    super(value, pos);
   }
 
-  public FieldReference(String value, DataType dataType) {
-    super(value);
+  public FieldReference(String value, ExpressionPosition pos, MajorType dataType) {
+    super(value, pos);
     this.overrideType = dataType;
   }
 
     @Override
-    public DataType getDataType() {
+    public MajorType getMajorType() {
         if(overrideType == null) {
-            return super.getDataType();
+            return super.getMajorType();
         } else {
             return overrideType;
         }
@@ -66,7 +66,7 @@ public class FieldReference extends SchemaPath {
     @Override
     public FieldReference deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
         JsonProcessingException {
-      return new FieldReference(this._parseString(jp, ctxt));
+      return new FieldReference(this._parseString(jp, ctxt), ExpressionPosition.UNKNOWN);
     }
 
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
deleted file mode 100644
index fd8ae18..0000000
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package org.apache.drill.common.expression;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.visitors.ExprVisitor;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.google.common.collect.ImmutableList;
-
-
-public abstract class FunctionBase extends LogicalExpressionBase implements Iterable<LogicalExpression>{
-	public final ImmutableList<LogicalExpression> expressions;
-	
-	
-  protected void funcToString(StringBuilder sb, String functionName) {
-    sb.append(" ");
-    sb.append(functionName);
-    sb.append("( ");
-    for(int i= 0; i < expressions.size(); i++){
-      if(i != 0) sb.append(", ");
-      expressions.get(i).addToString(sb);
-    }
-    sb.append(" ) ");
-  }
-  
-  protected void opToString(StringBuilder sb, String operator) {
-    sb.append(" ( ");
-    expressions.get(0).addToString(sb);
-    for(int i =1; i < expressions.size(); i++){
-      sb.append(operator);
-      expressions.get(i).addToString(sb); 
-    }
-    sb.append(" ) ");
-  }
-	
-	public FunctionBase(List<LogicalExpression> expressions){
-		if( !(expressions instanceof ImmutableList)){
-			expressions = ImmutableList.copyOf(expressions);
-		}
-		this.expressions = (ImmutableList<LogicalExpression>) expressions;
-	}
-	
-//	public static DataType getJointType(String parentName, LogicalExpression expr1, LogicalExpression expr2) throws ExpressionValidationException{
-//		DataType dt = DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
-//		if(dt == null) throw new ExpressionValidationException();
-//		
-//		return dt;
-//	}
-//	
-//	public LogicalExpression wrapWithCastIfNecessary(DataType dt) throws ExpressionValidationException{
-//		if(this.getDataType() != dt) return new Cast(this, dt);
-//		return this;
-//	}	
-
-	
-
-
-	@Override
-	public Iterator<LogicalExpression> iterator() {
-		return expressions.iterator();
-	}
-
-	@Override
-	@JsonIgnore
-	public DataType getDataType() {
-		throw new UnsupportedOperationException();	
-	}
-
-	
-	
-	
-	
-	
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
index ee76a5c..e13e87e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
@@ -20,26 +20,34 @@ package org.apache.drill.common.expression;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.drill.common.expression.types.DataType;
 import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 import com.google.common.collect.ImmutableList;
 
 public class FunctionCall extends LogicalExpressionBase implements Iterable<LogicalExpression> {
   private final FunctionDefinition func;
   public final ImmutableList<LogicalExpression> args;
+  private final ExpressionPosition pos;
 
-  public FunctionCall(FunctionDefinition func, List<LogicalExpression> args) {
+  public FunctionCall(FunctionDefinition func, List<LogicalExpression> args, ExpressionPosition pos) {
+    super(pos);
     this.func = func;
     if (!(args instanceof ImmutableList)) {
       args = ImmutableList.copyOf(args);
     }
     this.args = (ImmutableList<LogicalExpression>) args;
+    this.pos = pos;
   }
 
   @Override
-  public <T> T accept(ExprVisitor<T> visitor) {
-    return visitor.visitFunctionCall(this);
+  public ExpressionPosition getPosition() {
+    return pos;
+  }
+
+  @Override
+  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E{
+    return visitor.visitFunctionCall(this, value);
   }
 
   @Override
@@ -52,43 +60,16 @@ public class FunctionCall extends LogicalExpressionBase implements Iterable<Logi
   }
   
   @Override
-  public DataType getDataType() {
+  public MajorType getMajorType() {
     return func.getDataType(this.args);
   }
 
   @Override
-  public void addToString(StringBuilder sb) {
-    if (func.isOperator()) {
-      if (args.size() == 1) { // unary
-        func.addRegisteredName(sb);
-        sb.append("(");
-        args.get(0).addToString(sb);
-        sb.append(")");
-      } else {
-        for (int i = 0; i < args.size(); i++) {
-          if (i != 0) {
-            sb.append(" ");
-            func.addRegisteredName(sb);
-          }
-          sb.append(" (");
-          args.get(i).addToString(sb);
-          sb.append(") ");
-        }
-      }
-    } else { // normal function
-
-      func.addRegisteredName(sb);
-      sb.append("(");
-      for (int i = 0; i < args.size(); i++) {
-        if (i != 0) sb.append(", ");
-        args.get(i).addToString(sb);
-      }
-      sb.append(") ");
-    }
+  public String toString() {
+    final int maxLen = 10;
+    return "FunctionCall [func=" + func + ", args="
+        + (args != null ? args.subList(0, Math.min(args.size(), maxLen)) : null) + ", pos=" + pos + "]";
   }
 
-    @Override
-    public void resolveAndValidate(String expr, ErrorCollector errors) {
-        func.getArgumentValidator().validateArguments(expr, args, errors);
-    }
+  
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
index 9d21763..4cbab6a 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
@@ -21,7 +21,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 public class FunctionDefinition {
 
@@ -42,7 +42,7 @@ public class FunctionDefinition {
     this.isOperator = isOperator;
   }
 
-  public DataType getDataType(List<LogicalExpression> args){
+  public MajorType getDataType(List<LogicalExpression> args){
     return outputType.getOutputType(args);
   }
   
@@ -82,8 +82,8 @@ public class FunctionDefinition {
     return this.name;
   }
   
-  public FunctionCall newCall(List<LogicalExpression> args){
-    return new FunctionCall(this, args);
+  public FunctionCall newCall(List<LogicalExpression> args, ExpressionPosition pos){
+    return new FunctionCall(this, args, pos);
   }
   
   public void addRegisteredName(StringBuilder sb){

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
index c22e448..ed2c63e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
@@ -57,17 +57,18 @@ public class FunctionRegistry {
     }
   }
   
-  public LogicalExpression createExpression(String functionName, List<LogicalExpression> args){
+  
+  public LogicalExpression createExpression(String functionName, ExpressionPosition ep, List<LogicalExpression> args){
     FunctionDefinition d = funcMap.get(functionName);
     if(d == null) throw new ExpressionParsingException(String.format("Unable to find function definition for function named '%s'", functionName));
-    return d.newCall(args);
+    return d.newCall(args, ep);
   }
   
-  public LogicalExpression createExpression(String unaryName, LogicalExpression... e){
-    return funcMap.get(unaryName).newCall(Lists.newArrayList(e));
+  public LogicalExpression createExpression(String unaryName, ExpressionPosition ep, LogicalExpression... e){
+    return funcMap.get(unaryName).newCall(Lists.newArrayList(e), ep);
   }
   
-  public LogicalExpression createByOp(List<LogicalExpression> args, List<String> opTypes) {
+  public LogicalExpression createByOp(List<LogicalExpression> args, ExpressionPosition ep, List<String> opTypes) {
     // logger.debug("Generating new comparison expressions.");
     if (args.size() == 1) {
       return args.get(0);
@@ -81,7 +82,7 @@ public class FunctionRegistry {
       List<LogicalExpression> l2 = new ArrayList<LogicalExpression>();
       l2.add(first);
       l2.add(args.get(i + 1));
-      first = createExpression(opTypes.get(i), args);
+      first = createExpression(opTypes.get(i), ep, args);
     }
     return first;
   }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
index a553f4c..6f2e4a8 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
@@ -21,11 +21,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.drill.common.expression.IfExpression.IfCondition;
-import org.apache.drill.common.expression.types.DataType;
 import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.UnmodifiableIterator;
 
@@ -35,7 +36,8 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
 	public final ImmutableList<IfCondition> conditions;
 	public final LogicalExpression elseExpression;
 	
-	private IfExpression(List<IfCondition> conditions, LogicalExpression elseExpression){
+	private IfExpression(ExpressionPosition pos, List<IfCondition> conditions, LogicalExpression elseExpression){
+	  super(pos);
 		this.conditions = ImmutableList.copyOf(conditions);
 		this.elseExpression = elseExpression;
 	}
@@ -53,28 +55,32 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
 
 	}
 	
-	
 	@Override
-  public <T> T accept(ExprVisitor<T> visitor) {
-    return visitor.visitIfExpression(this);
+  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E{
+    return visitor.visitIfExpression(this, value);
   }
 
-
   public static class Builder{
 		List<IfCondition> conditions = new ArrayList<IfCondition>();
 		private LogicalExpression elseExpression;
+		private ExpressionPosition pos = ExpressionPosition.UNKNOWN;
+		
+		public Builder setPosition(ExpressionPosition pos){
+		  this.pos = pos;
+		  return this;
+		}
 		
 		public Builder addCondition(IfCondition condition){
 			conditions.add(condition);
             return this;
 		}
 
-        public Builder addConditions(Iterable<IfCondition> conditions) {
-            for(IfCondition condition : conditions) {
-                addCondition(condition);
-            }
-            return this;
-        }
+    public Builder addConditions(Iterable<IfCondition> conditions) {
+      for (IfCondition condition : conditions) {
+        addCondition(condition);
+      }
+      return this;
+    }
 		
 		public Builder setElse(LogicalExpression elseExpression) {
 			this.elseExpression = elseExpression;
@@ -82,39 +88,20 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
 		}
 		
 		public IfExpression build(){
-			return new IfExpression(conditions, elseExpression);
+		  Preconditions.checkNotNull(pos);
+		  Preconditions.checkNotNull(conditions);
+		  Preconditions.checkNotNull(conditions);
+			return new IfExpression(pos, conditions, elseExpression);
 		}
 		
 	}
 
-
-    @Override
-    public DataType getDataType() {
-        return DataType.BOOLEAN;
-    }
-
-    @Override
-  public void addToString(StringBuilder sb) {
-	  sb.append(" ( ");
-	  for(int i =0; i < conditions.size(); i++){
-	    IfCondition c = conditions.get(i);
-	    if(i !=0) sb.append(" else ");
-	    sb.append("if (");
-	    c.condition.addToString(sb);
-	    sb.append(" ) then (");
-	    c.expression.addToString(sb);
-	    sb.append(" ) ");
-	  }
-	  sb.append(" end ");
-	  sb.append(" ) ");
+  @Override
+  public MajorType getMajorType() {
+    return this.elseExpression.getMajorType();
   }
 
-    @Override
-    public void resolveAndValidate(String expr, ErrorCollector errors) {
-    }
-
-
-    public static Builder newBuilder(){
+  public static Builder newBuilder(){
 		return new Builder();
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
index 3df33a0..165f409 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
@@ -26,8 +26,8 @@ import org.apache.drill.common.config.DrillConfig;
 import org.apache.drill.common.expression.parser.ExprLexer;
 import org.apache.drill.common.expression.parser.ExprParser;
 import org.apache.drill.common.expression.parser.ExprParser.parse_return;
-import org.apache.drill.common.expression.types.DataType;
 import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,65 +44,65 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 //@JsonDeserialize(using = LogicalExpression.De.class)  // Excluded as we need to register this with the DrillConfig.
 @JsonSerialize(using = LogicalExpression.Se.class)
 public interface LogicalExpression {
-    static final Logger logger = LoggerFactory.getLogger(LogicalExpression.class);
+  static final Logger logger = LoggerFactory.getLogger(LogicalExpression.class);
 
-    public abstract DataType getDataType();
+  public abstract MajorType getMajorType();
 
-    public void addToString(StringBuilder sb);
+  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E;
 
-    public void resolveAndValidate(String expr, ErrorCollector errors);
+  public ExpressionPosition getPosition();
 
-    public <T> T accept(ExprVisitor<T> visitor);
+  public static class De extends StdDeserializer<LogicalExpression> {
+    DrillConfig config;
 
-    public static class De extends StdDeserializer<LogicalExpression> {
-        DrillConfig config;
-        ErrorCollector errorCollector;
-
-        public De(DrillConfig config) {
-            super(LogicalExpression.class);
-            this.config = config;
-            this.errorCollector = config.getErrorCollector();
-        }
-
-        @Override
-        public LogicalExpression deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
-                JsonProcessingException {
-            String expr = jp.getText();
-
-            if (expr == null || expr.isEmpty())
-                return null;
-            try {
-                // logger.debug("Parsing expression string '{}'", expr);
-                ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
-
-                CommonTokenStream tokens = new CommonTokenStream(lexer);
-                ExprParser parser = new ExprParser(tokens);
-                parser.setRegistry(new FunctionRegistry(config));
-                parse_return ret = parser.parse();
-                // logger.debug("Found expression '{}'", ret.e);
-                ret.e.resolveAndValidate(expr, errorCollector);
-                return ret.e;
-            } catch (RecognitionException e) {
-                throw new RuntimeException(e);
-            }
-        }
+    public De(DrillConfig config) {
+      super(LogicalExpression.class);
+      this.config = config;
+    }
 
+    @Override
+    public LogicalExpression deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
+        JsonProcessingException {
+      String expr = jp.getText();
+
+      if (expr == null || expr.isEmpty())
+        return null;
+      try {
+        // logger.debug("Parsing expression string '{}'", expr);
+        ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        ExprParser parser = new ExprParser(tokens);
+
+        //TODO: move functionregistry and error collector to injectables.
+        //ctxt.findInjectableValue(valueId, forProperty, beanInstance)
+
+        parser.setRegistry(new FunctionRegistry(config));
+        parse_return ret = parser.parse();
+
+        // ret.e.resolveAndValidate(expr, errorCollector);
+        return ret.e;
+      } catch (RecognitionException e) {
+        throw new RuntimeException(e);
+      }
     }
 
-    public static class Se extends StdSerializer<LogicalExpression> {
+  }
 
-        protected Se() {
-            super(LogicalExpression.class);
-        }
+  public static class Se extends StdSerializer<LogicalExpression> {
 
-        @Override
-        public void serialize(LogicalExpression value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
-                JsonGenerationException {
-            StringBuilder sb = new StringBuilder();
-            value.addToString(sb);
-            jgen.writeString(sb.toString());
-        }
+    protected Se() {
+      super(LogicalExpression.class);
+    }
 
+    @Override
+    public void serialize(LogicalExpression value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
+        JsonGenerationException {
+      StringBuilder sb = new StringBuilder();
+      ExpressionStringBuilder esb = new ExpressionStringBuilder();
+      value.accept(esb, sb);
+      jgen.writeString(sb.toString());
     }
 
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
index e973df7..aa8885f 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,40 +17,44 @@
  ******************************************************************************/
 package org.apache.drill.common.expression;
 
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
 
-@JsonPropertyOrder({"type"})
-public abstract class LogicalExpressionBase implements LogicalExpression {
+@JsonPropertyOrder({ "type" })
+public abstract class LogicalExpressionBase implements LogicalExpression{
 
+  private final ExpressionPosition pos;
 
-//	public static DataType getJointType(String parentName, LogicalExpression expr1, LogicalExpression expr2) throws ExpressionValidationException{
-//		DataType dt = DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
-//		if(dt == null) throw new ExpressionValidationException();
-//		
-//		return dt;
-//	}
+	protected LogicalExpressionBase(ExpressionPosition pos) {
+    super();
+    this.pos = pos;
+  }
 
+  @Override
+  public ExpressionPosition getPosition() {
+    return pos;
+  }
 
-    protected void i(StringBuilder sb, int indent) {
-        for (int i = 0; i < indent; i++) {
-            sb.append("  ");
-        }
-    }
+  protected void i(StringBuilder sb, int indent){
+		for(int i = 0; i < indent; i++){
+			sb.append("  ");
+		}
+	}
+	
+	@Override
+	public MajorType getMajorType() {
+		throw new UnsupportedOperationException(String.format("The type of %s doesn't currently support LogicalExpression.getDataType().", this.getClass().getCanonicalName()));
+	}
 
-//	@Override
-//	public <T> T accept(ExprVisitor<T> visitor) {
-//		return visitor.visit(this);
-//	}
-
-    @JsonProperty("type")
-    public String getDescription() {
-        return this.getClass().getSimpleName();
-    }
+  @JsonProperty("type")
+	public String getDescription(){
+		return this.getClass().getSimpleName();
+	}
+	
 
+	
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
index 67402e2..0bec184 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
@@ -19,37 +19,51 @@ package org.apache.drill.common.expression;
 
 import java.util.List;
 
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
 
 public interface OutputTypeDeterminer {
 
-  public static OutputTypeDeterminer FIXED_BOOLEAN = new FixedType(DataType.BOOLEAN);
+  public static OutputTypeDeterminer FIXED_BOOLEAN = new FixedType(MajorType.newBuilder().setMinorType(MinorType.BOOLEAN).setMode(DataMode.REQUIRED).build());
   
-  public DataType getOutputType(List<LogicalExpression> expressions);
+  public MajorType getOutputType(List<LogicalExpression> expressions);
   
   
   public static class FixedType implements OutputTypeDeterminer{
-    public DataType outputType;
+    public MajorType outputType;
     
     
-    public FixedType(DataType outputType) {
+    public FixedType(MajorType outputType) {
       super();
       this.outputType = outputType;
     }
 
 
     @Override
-    public DataType getOutputType(List<LogicalExpression> expressions) {
-      return null;
+    public MajorType getOutputType(List<LogicalExpression> expressions) {
+      return outputType;
     }
     
   }
   
   public static class SameAsFirstInput implements OutputTypeDeterminer{
-
     @Override
-    public DataType getOutputType(List<LogicalExpression> expressions) {
-      return expressions.get(0).getDataType();
+    public MajorType getOutputType(List<LogicalExpression> expressions) {
+      return expressions.get(0).getMajorType();
+    }
+  }
+  
+  public static class SameAsAnySoft implements OutputTypeDeterminer{
+    @Override
+    public MajorType getOutputType(List<LogicalExpression> expressions) {
+      for(LogicalExpression e : expressions){
+        if(e.getMajorType().getMode() == DataMode.OPTIONAL){
+          return e.getMajorType();
+        }
+      }
+      return expressions.get(0).getMajorType();
     }
   }
+  
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
index c06426e..554c0ca 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
@@ -98,6 +98,32 @@ public abstract class PathSegment{
       return "NameSegment [path=" + path + ", getCollisionBehavior()=" + getCollisionBehavior() + ", getChild()="
           + getChild() + "]";
     }
+
+    @Override
+    public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((path == null) ? 0 : path.hashCode());
+      return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (this == obj)
+        return true;
+      if (obj == null)
+        return false;
+      if (getClass() != obj.getClass())
+        return false;
+      NameSegment other = (NameSegment) obj;
+      if (path == null) {
+        if (other.path != null)
+          return false;
+      } else if (!path.equals(other.path))
+        return false;
+      return true;
+    }
+    
     
     
   }


Re: [44/53] [abbrv] git commit: Types transition

Posted by Ted Dunning <te...@gmail.com>.
On Fri, Jul 19, 2013 at 6:58 PM, <ja...@apache.org> wrote:

> Types transition
>
>
> Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/ce0da88d
> Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/ce0da88d
> Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/ce0da88d
>
> Branch: refs/heads/master
> Commit: ce0da88d2df38d079a11d2b269fad9e964e1c14a
> Parents: e68bba2
> Author: Jacques Nadeau <ja...@apache.org>
> Authored: Mon Jun 24 08:06:43 2013 -0700
> Committer: Jacques Nadeau <ja...@apache.org>
> Committed: Fri Jul 19 14:53:11 2013 -0700
>
> ----------------------------------------------------------------------
>  sandbox/prototype/common/pom.xml                | 216 ++---
>  .../drill/common/expression/parser/ExprParser.g |  64 +-
>  .../org/apache/drill/common/expression/Arg.java |  44 +-
>  .../common/expression/ArgumentValidator.java    |   2 +-
>  .../common/expression/ArgumentValidators.java   |  62 +-
>  .../expression/BasicArgumentValidator.java      |   8 +-
>  .../drill/common/expression/ErrorCollector.java |  18 +-
>  .../common/expression/ErrorCollectorImpl.java   |  40 +-
>  .../common/expression/ExpressionPosition.java   |  27 +
>  .../expression/ExpressionStringBuilder.java     | 102 +++
>  .../common/expression/ExpressionValidator.java  |  86 ++
>  .../drill/common/expression/FieldReference.java |  18 +-
>  .../drill/common/expression/FunctionBase.java   |  94 --
>  .../drill/common/expression/FunctionCall.java   |  55 +-
>  .../common/expression/FunctionDefinition.java   |   8 +-
>  .../common/expression/FunctionRegistry.java     |  13 +-
>  .../drill/common/expression/IfExpression.java   |  65 +-
>  .../common/expression/LogicalExpression.java    |  98 +-
>  .../expression/LogicalExpressionBase.java       |  56 +-
>  .../common/expression/OutputTypeDeterminer.java |  34 +-
>  .../drill/common/expression/PathSegment.java    |  26 +
>  .../drill/common/expression/SchemaPath.java     | 176 ++--
>  .../common/expression/ValueExpressions.java     | 320 ++++---
>  .../common/expression/fn/BooleanFunctions.java  |   6 +-
>  .../common/expression/fn/MathFunctions.java     |  10 +-
>  .../common/expression/fn/StringFunctions.java   |   7 +-
>  .../common/expression/fn/UnaryFunctions.java    |   6 +-
>  .../drill/common/expression/types/AtomType.java |  67 ++
>  .../drill/common/expression/types/DataType.java |   2 +-
>  .../visitors/AbstractExprVisitor.java           |  56 ++
>  .../expression/visitors/AggregateChecker.java   |  25 +-
>  .../expression/visitors/ConstantChecker.java    |  21 +-
>  .../common/expression/visitors/ExprVisitor.java |  18 +-
>  .../expression/visitors/SimpleExprVisitor.java  |  56 ++
>  .../org/apache/drill/common/types/Types.java    | 134 +++
>  .../common/src/main/protobuf/Types.proto        |  64 ++
>  sandbox/prototype/exec/java-exec/pom.xml        | 360 ++++----
>  .../org/apache/drill/exec/ExecConstants.java    |   1 +
>  .../drill/exec/compile/ClassTransformer.java    |   1 +
>  .../drill/exec/compile/CodeModelTools.java      |  31 +
>  .../apache/drill/exec/expr/CodeGenerator.java   | 201 +++++
>  .../apache/drill/exec/expr/DrillAggrFunc.java   |   9 +
>  .../org/apache/drill/exec/expr/DrillFunc.java   |   9 +
>  .../drill/exec/expr/EvaluationVisitor.java      | 201 +++++
>  .../exec/expr/ExpressionTreeMaterializer.java   | 128 +++
>  .../exec/expr/SingleClassStringWriter.java      |  40 +
>  .../exec/expr/ValueVectorReadExpression.java    |  41 +
>  .../exec/expr/ValueVectorWriteExpression.java   |  45 +
>  .../exec/expr/annotations/FunctionTemplate.java |  25 +
>  .../drill/exec/expr/annotations/Output.java     |  18 +
>  .../drill/exec/expr/annotations/Param.java      |  18 +
>  .../drill/exec/expr/annotations/WorkSpace.java  |  14 +
>  .../drill/exec/expr/fn/FunctionConverter.java   | 186 ++++
>  .../drill/exec/expr/fn/FunctionHolder.java      | 158 ++++
>  .../expr/fn/FunctionImplementationRegistry.java |  43 +
>  .../exec/expr/fn/MethodGrabbingVisitor.java     |  52 ++
>  .../exec/expr/fn/ModifiedUnparseVisitor.java    | 891 +++++++++++++++++++
>  .../drill/exec/expr/fn/impl/MathFunctions.java  |  48 +
>  .../drill/exec/expr/holders/ValueHolder.java    |   4 +
>  .../holders/ValueHolderImplmenetations.java     |  44 +
>  .../exec/expr/holders/VarBinaryHolder.java      |  12 +
>  .../apache/drill/exec/ops/FragmentContext.java  |  26 +-
>  .../apache/drill/exec/opt/BasicOptimizer.java   |  28 +-
>  .../apache/drill/exec/physical/RecordField.java |   8 +-
>  .../exec/physical/config/MockRecordReader.java  |  19 +-
>  .../drill/exec/physical/config/MockScanPOP.java |   8 +-
>  .../exec/physical/impl/FilterRecordBatch.java   |  34 +
>  .../drill/exec/physical/impl/OutputMutator.java |   9 +
>  .../drill/exec/physical/impl/ScanBatch.java     |  72 +-
>  .../drill/exec/physical/impl/VectorHolder.java  |  39 +
>  .../exec/physical/impl/WireRecordBatch.java     |  32 +-
>  .../impl/filter/EvalSetupException.java         |   5 +
>  .../impl/filter/EvaluationPredicate.java        |  13 +
>  .../physical/impl/filter/ExampleFilter.java     | 113 +++
>  .../physical/impl/project/ProjectEvaluator.java |  12 +
>  .../impl/project/ProjectRecordBatch.java        | 218 +++++
>  .../exec/physical/impl/project/Projector.java   |  20 +
>  .../impl/project/ProjectorTemplate.java         | 101 +++
>  .../physical/impl/project/TransferPairing.java  |  35 +
>  .../drill/exec/planner/PhysicalPlanReader.java  |   2 +-
>  .../apache/drill/exec/record/BatchSchema.java   |  36 +-
>  .../exec/record/ExpressionTreeMaterializer.java | 138 ---
>  .../drill/exec/record/MajorTypeSerDe.java       |   6 +-
>  .../drill/exec/record/MaterializedField.java    |  58 +-
>  .../drill/exec/record/NullExpression.java       |  32 +
>  .../apache/drill/exec/record/RecordBatch.java   |  67 +-
>  .../drill/exec/record/RecordBatchLoader.java    |  84 +-
>  .../apache/drill/exec/record/SchemaBuilder.java |  75 +-
>  .../apache/drill/exec/record/WritableBatch.java |  43 +-
>  .../exec/record/vector/NullableFixed8.java      |  36 +
>  .../exec/record/vector/SelectionVector.java     |   8 +
>  .../exec/record/vector/SelectionVector2.java    |  46 +
>  .../exec/record/vector/SelectionVector4.java    |  41 +
>  .../org/apache/drill/exec/schema/Field.java     |  31 +-
>  .../apache/drill/exec/schema/ListSchema.java    |  17 +-
>  .../apache/drill/exec/schema/NamedField.java    |  19 +-
>  .../apache/drill/exec/schema/OrderedField.java  |   9 +-
>  .../exec/schema/json/jackson/JacksonHelper.java |  26 +-
>  .../drill/exec/store/JSONRecordReader.java      |  84 +-
>  .../exec/work/batch/BitComHandlerImpl.java      |   3 +-
>  .../work/foreman/RunningFragmentManager.java    |   3 +-
>  .../work/fragment/RemoteFragmentHandler.java    |   3 +-
>  .../java-exec/src/main/protobuf/SchemaDef.proto |  63 +-
>  .../src/main/resources/drill-module.conf        |  13 +-
>  .../java/org/apache/drill/exec/SortTest.java    |  61 ++
>  .../apache/drill/exec/expr/ExpressionTest.java  | 108 +++
>  .../exec/physical/impl/PerformanceTests.java    |  32 +
>  .../impl/TestExecutionAbstractions.java         | 226 +++++
>  .../physical/impl/TestSimpleFragmentRun.java    |  51 +-
>  .../record/ExpressionTreeMaterializerTest.java  | 297 ++++---
>  .../drill/exec/store/JSONRecordReaderTest.java  | 469 +++++-----
>  .../org/apache/drill/exec/ref/RunOutcome.java   |   1 +
>  .../exec/ref/eval/BasicEvaluatorFactory.java    |  11 +-
>  .../apache/drill/exec/ref/eval/IfEvaluator.java |  10 +-
>  .../exec/ref/eval/SimpleEvaluationVisitor.java  |  24 +-
>  .../drill/exec/ref/eval/fn/MathEvaluators.java  |   5 +-
>  .../exec/ref/rops/CollapsingAggregateROP.java   |   4 +-
>  .../apache/drill/exec/ref/rops/ConstantROP.java |   3 -
>  .../apache/drill/exec/ref/rops/FlattenROP.java  |   7 +-
>  .../drill/exec/ref/rops/WindowFrameROP.java     |   5 +-
>  .../drill/exec/ref/values/BaseArrayValue.java   |  21 +-
>  .../drill/exec/ref/values/BaseMapValue.java     |   9 +-
>  .../apache/drill/exec/ref/values/DataValue.java |   4 +-
>  .../drill/exec/ref/values/NumericValue.java     |  17 +-
>  .../drill/exec/ref/values/ScalarValues.java     |  66 +-
>  .../drill/exec/ref/values/SimpleArrayValue.java |   4 +-
>  .../drill/exec/ref/values/SimpleMapValue.java   |   5 +-
>  .../drill/exec/ref/values/ValueReader.java      |  14 +-
>  .../drill/exec/ref/values/ValueUtils.java       |  17 +-
>  .../apache/drill/exec/ref/RunSimplePlan.java    |  14 +-
>  .../org/apache/drill/exec/ref/TestUtils.java    |   3 +-
>  .../exec/ref/rops/CollapsingAggregateTest.java  |   5 +-
>  .../drill/exec/ref/rops/ConstantROPTest.java    |   5 +-
>  .../drill/exec/ref/rops/OrderROPTest.java       |   5 +-
>  .../drill/exec/ref/rops/WindowFrameROPTest.java |  12 +-
>  sandbox/prototype/pom.xml                       | 381 ++++----
>  136 files changed, 6212 insertions(+), 2103 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/pom.xml
> ----------------------------------------------------------------------
> diff --git a/sandbox/prototype/common/pom.xml
> b/sandbox/prototype/common/pom.xml
> index 4a8c5d8..4891191 100644
> --- a/sandbox/prototype/common/pom.xml
> +++ b/sandbox/prototype/common/pom.xml
> @@ -1,103 +1,119 @@
>  <?xml version="1.0"?>
>  <project
> -        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd"
> -        xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance">
> -    <modelVersion>4.0.0</modelVersion>
> -    <parent>
> -        <artifactId>prototype-parent</artifactId>
> -        <groupId>org.apache.drill</groupId>
> -        <version>1.0-SNAPSHOT</version>
> -    </parent>
> -
> -    <artifactId>common</artifactId>
> -    <packaging>jar</packaging>
> -    <name>common</name>
> -
> -    <dependencies>
> -
> -        <dependency>
> -            <groupId>com.google.protobuf</groupId>
> -            <artifactId>protobuf-java</artifactId>
> -            <version>2.5.0</version>
> -        </dependency>
> -
> -        <dependency>
> -            <groupId>com.typesafe</groupId>
> -            <artifactId>config</artifactId>
> -            <version>1.0.0</version>
> -        </dependency>
> -
> -        <dependency>
> -            <groupId>org.apache.commons</groupId>
> -            <artifactId>commons-lang3</artifactId>
> -            <version>3.1</version>
> -        </dependency>
> -
> -        <dependency>
> -            <groupId>org.msgpack</groupId>
> -            <artifactId>msgpack</artifactId>
> -            <version>0.6.6</version>
> -        </dependency>
> -
> -        <dependency>
> -            <groupId>org.reflections</groupId>
> -            <artifactId>reflections</artifactId>
> -            <version>0.9.8</version>
> -        </dependency>
> -
> -        <dependency>
> -            <groupId>com.fasterxml.jackson.core</groupId>
> -            <artifactId>jackson-annotations</artifactId>
> -            <version>2.1.1</version>
> -        </dependency>
> -        <dependency>
> -            <groupId>org.hibernate</groupId>
> -            <artifactId>hibernate-validator</artifactId>
> -            <version>4.3.1.Final</version>
> -        </dependency>
> -        <dependency>
> -            <groupId>com.fasterxml.jackson.core</groupId>
> -            <artifactId>jackson-databind</artifactId>
> -            <version>2.1.1</version>
> -        </dependency>
> -        <dependency>
> -            <groupId>org.antlr</groupId>
> -            <artifactId>antlr-runtime</artifactId>
> -            <version>3.4</version>
> -        </dependency>
> -
> -
> -    </dependencies>
> -
> -
> -    <build>
> -        <plugins>
> -            <plugin>
> -                <artifactId>maven-jar-plugin</artifactId>
> -                <executions>
> -                    <execution>
> -                        <id>test-jar</id>
> -                        <goals>
> -                            <goal>test-jar</goal>
> -                        </goals>
> -                    </execution>
> -                </executions>
> -            </plugin>
> -            <plugin>
> -                <groupId>org.antlr</groupId>
> -                <artifactId>antlr3-maven-plugin</artifactId>
> -                <version>3.4</version>
> -                <configuration>
> -
> -                </configuration>
> -                <executions>
> -                    <execution>
> -                        <goals>
> -                            <goal>antlr</goal>
> -                        </goals>
> -                    </execution>
> -                </executions>
> -            </plugin>
> -        </plugins>
> -    </build>
> +  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd"
> +  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance">
> +  <modelVersion>4.0.0</modelVersion>
> +
> +  <parent>
> +    <artifactId>prototype-parent</artifactId>
> +    <groupId>org.apache.drill</groupId>
> +    <version>1.0-SNAPSHOT</version>
> +  </parent>
> +
> +  <artifactId>common</artifactId>
> +  <packaging>jar</packaging>
> +  <name>common</name>
> +
> +  <dependencies>
> +
> +    <dependency>
> +      <groupId>com.google.protobuf</groupId>
> +      <artifactId>protobuf-java</artifactId>
> +      <version>2.5.0</version>
> +    </dependency>
> +
> +    <dependency>
> +      <groupId>com.typesafe</groupId>
> +      <artifactId>config</artifactId>
> +      <version>1.0.0</version>
> +    </dependency>
> +
> +    <dependency>
> +      <groupId>org.apache.commons</groupId>
> +      <artifactId>commons-lang3</artifactId>
> +      <version>3.1</version>
> +    </dependency>
> +
> +    <dependency>
> +      <groupId>org.msgpack</groupId>
> +      <artifactId>msgpack</artifactId>
> +      <version>0.6.6</version>
> +    </dependency>
> +
> +    <dependency>
> +      <groupId>org.reflections</groupId>
> +      <artifactId>reflections</artifactId>
> +      <version>0.9.8</version>
> +    </dependency>
> +
> +    <dependency>
> +      <groupId>com.fasterxml.jackson.core</groupId>
> +      <artifactId>jackson-annotations</artifactId>
> +      <version>2.1.1</version>
> +    </dependency>
> +    <dependency>
> +      <groupId>org.hibernate</groupId>
> +      <artifactId>hibernate-validator</artifactId>
> +      <version>4.3.1.Final</version>
> +    </dependency>
> +    <dependency>
> +      <groupId>com.fasterxml.jackson.core</groupId>
> +      <artifactId>jackson-databind</artifactId>
> +      <version>2.1.1</version>
> +    </dependency>
> +    <dependency>
> +      <groupId>org.antlr</groupId>
> +      <artifactId>antlr-runtime</artifactId>
> +      <version>3.4</version>
> +    </dependency>
> +
> +
> +  </dependencies>
> +
> +
> +  <build>
> +    <plugins>
> +      <plugin>
> +        <artifactId>maven-jar-plugin</artifactId>
> +        <executions>
> +          <execution>
> +            <id>test-jar</id>
> +            <goals>
> +              <goal>test-jar</goal>
> +            </goals>
> +          </execution>
> +        </executions>
> +      </plugin>
> +      <plugin>
> +        <groupId>org.antlr</groupId>
> +        <artifactId>antlr3-maven-plugin</artifactId>
> +        <version>3.4</version>
> +        <configuration>
> +
> +        </configuration>
> +        <executions>
> +          <execution>
> +            <goals>
> +              <goal>antlr</goal>
> +            </goals>
> +          </execution>
> +        </executions>
> +      </plugin>
> +
> +
> +      <plugin>
> +        <groupId>com.github.igor-petruk.protobuf</groupId>
> +        <artifactId>protobuf-maven-plugin</artifactId>
> +        <version>0.6.3</version>
> +        <executions>
> +          <execution>
> +            <goals>
> +              <goal>run</goal>
> +            </goals>
> +          </execution>
> +        </executions>
> +      </plugin>
> +    </plugins>
> +
> +  </build>
>  </project>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> index f8eb725..6cf041c 100644
> ---
> a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> +++
> b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> @@ -40,7 +40,8 @@ import org.apache.drill.common.expression.*;
>
>  @members{
>    private FunctionRegistry registry;
> -
> +  private String fullExpression;
> +  private int tokenPos;
>    public void setRegistry(FunctionRegistry registry){
>      this.registry = registry;
>    }
> @@ -48,14 +49,22 @@ import org.apache.drill.common.expression.*;
>    public static void p(String s){
>      System.out.println(s);
>    }
> +
> +  public ExpressionPosition pos(Token token){
> +    return new ExpressionPosition(fullExpression, token.getTokenIndex());
> +  }
>  }
>
>  parse returns [LogicalExpression e]
> -  :  expression EOF {$e = $expression.e; }
> +  :  expression EOF {
> +    $e = $expression.e;
> +    if(fullExpression == null) fullExpression = $expression.text;
> +    tokenPos = $expression.start.getTokenIndex();
> +  }
>    ;
>
>  functionCall returns [LogicalExpression e]
> -  :  Identifier OParen exprList? CParen {$e =
> registry.createExpression($Identifier.text, $exprList.listE);  }
> +  :  Identifier OParen exprList? CParen {$e =
> registry.createExpression($Identifier.text, pos($Identifier),
> $exprList.listE);  }
>    ;
>
>  ifStatement returns [LogicalExpression e]
> @@ -65,7 +74,7 @@ ifStatement returns [LogicalExpression e]
>         @after {
>           $e = s.build();
>         }
> -  :  i1=ifStat {s.addCondition($i1.i); } (elseIfStat {
> s.addCondition($elseIfStat.i); } )* Else expression {
> s.setElse($expression.e); }End
> +  :  i1=ifStat {s.addCondition($i1.i); s.setPosition(pos($i1.start)); }
> (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression {
> s.setElse($expression.e); }End
>    ;
>
>  ifStat returns [IfExpression.IfCondition i]
> @@ -113,96 +122,103 @@ condExpr returns [LogicalExpression e]
>  orExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> +         ExpressionPosition p = null;
>         }
>         @after{
>           if(exprs.size() == 1){
>             $e = exprs.get(0);
>           }else{
> -           $e = registry.createExpression("||", exprs);
> +           $e = registry.createExpression("||", p, exprs);
>           }
>         }
> -  :  a1=andExpr { exprs.add($a1.e); } (Or^ a2=andExpr { exprs.add($a2.e);
> })*
> +  :  a1=andExpr { exprs.add($a1.e); p = pos( $a1.start );} (Or^
> a2=andExpr { exprs.add($a2.e); })*
>    ;
>
>  andExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> +         ExpressionPosition p = null;
>         }
>         @after{
>           if(exprs.size() == 1){
>             $e = exprs.get(0);
>           }else{
> -           $e = registry.createExpression("&&", exprs);
> +           $e = registry.createExpression("&&", p, exprs);
>           }
>         }
> -  :  e1=equExpr { exprs.add($e1.e);  } (And^ e2=equExpr {
> exprs.add($e2.e);  })*
> +  :  e1=equExpr { exprs.add($e1.e); p = pos( $e1.start );  } (And^
> e2=equExpr { exprs.add($e2.e);  })*
>    ;
>
>  equExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
>           List<String> cmps = new ArrayList();
> +         ExpressionPosition p = null;
>         }
>         @after{
> -         $e = registry.createByOp(exprs, cmps);
> +         $e = registry.createByOp(exprs, p, cmps);
>         }
> -  :  r1=relExpr {exprs.add($r1.e);} ( cmpr= (Equals | NEquals )
> r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
> +  :  r1=relExpr { exprs.add($r1.e); p = pos( $r1.start );
> +    } ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e);
> cmps.add($cmpr.text); })*
>    ;
>
>  relExpr returns [LogicalExpression e]
> -  :  left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT |
> LT) right=addExpr {$e = registry.createExpression($cmpr.text, $left.e,
> $right.e); } )?
> +  :  left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT |
> LT) right=addExpr {$e = registry.createExpression($cmpr.text,
> pos($left.start), $left.e, $right.e); } )?
>    ;
>
>  addExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
>           List<String> ops = new ArrayList();
> +         ExpressionPosition p = null;
>         }
>         @after{
> -         $e = registry.createByOp(exprs, ops);
> +         $e = registry.createByOp(exprs, p, ops);
>         }
> -  :  m1=mulExpr  {exprs.add($m1.e);} ( op=(Plus|Minus) m2=mulExpr
> {exprs.add($m2.e); ops.add($op.text); })*
> +  :  m1=mulExpr  {exprs.add($m1.e); p = pos($m1.start); } (
> op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })*
>    ;
>
>  mulExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
>           List<String> ops = new ArrayList();
> +         ExpressionPosition p = null;
>         }
>         @after{
> -         $e = registry.createByOp(exprs, ops);
> +         $e = registry.createByOp(exprs, p, ops);
>         }
> -  :  p1=powExpr  {exprs.add($p1.e);} (op=(Asterisk|ForwardSlash|Percent)
> p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
> +  :  p1=powExpr  {exprs.add($p1.e); p = pos($p1.start);}
> (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e);
> ops.add($op.text); } )*
>    ;
>
>  powExpr returns [LogicalExpression e]
>         @init{
>           List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
>           List<String> ops = new ArrayList();
> +         ExpressionPosition p = null;
>         }
>         @after{
> -         $e = registry.createByOp(exprs, ops);
> +         $e = registry.createByOp(exprs, p, ops);
>         }
> -  :  u1=unaryExpr {exprs.add($u1.e);} (Caret u2=unaryExpr
> {exprs.add($u2.e); ops.add($Caret.text);} )*
> +  :  u1=unaryExpr {exprs.add($u1.e); p = pos($u1.start);} (Caret
> u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
>    ;
>
>  unaryExpr returns [LogicalExpression e]
> -  :  Minus atom {$e = registry.createExpression("u-", $atom.e); }
> -  |  Excl atom {$e= registry.createExpression("!", $atom.e); }
> +  :  Minus atom {$e = registry.createExpression("u-", pos($atom.start),
> $atom.e); }
> +  |  Excl atom {$e= registry.createExpression("!", pos($atom.start),
> $atom.e); }
>    |  atom {$e = $atom.e; }
>    ;
>
>  atom returns [LogicalExpression e]
> -  :  Number {$e = ValueExpressions.getNumericExpression($Number.text); }
> -  |  Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text ); }
> +  :  Number {$e = ValueExpressions.getNumericExpression($Number.text,
> pos($atom.start)); }
> +  |  Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text,
> pos($atom.start)); }
>    |  lookup {$e = $lookup.e; }
>    ;
>
>
>  lookup returns [LogicalExpression e]
>    :  functionCall {$e = $functionCall.e ;}
> -  | Identifier {$e = new SchemaPath($Identifier.text); }
> -  | String {$e = new ValueExpressions.QuotedString($String.text); }
> +  | Identifier {$e = new SchemaPath($Identifier.text, pos($Identifier) );
> }
> +  | String {$e = new ValueExpressions.QuotedString($String.text,
> pos($String) ); }
>    | OParen expression CParen  {$e = $expression.e; }
> -  | SingleQuote Identifier SingleQuote {$e = new
> SchemaPath($Identifier.text); }
> +  | SingleQuote Identifier SingleQuote {$e = new
> SchemaPath($Identifier.text, pos($Identifier) ); }
>    ;
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> index de9057b..64ec351 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> @@ -17,24 +17,41 @@
>
> ******************************************************************************/
>  package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import java.util.List;
> +
>  import org.apache.drill.common.expression.visitors.ConstantChecker;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
> +
> +import com.google.common.collect.Lists;
>
>
>  public class Arg {
>    private final String name;
> -  private final DataType[] allowedTypes;
> +  private final MajorType[] allowedTypes;
>    private final boolean constantsOnly;
>
> -  public Arg(DataType... allowedTypes){
> +
> +  /**
> +   * Create an arg that supports any of the listed minor types using opt
> or req.  Does not allow repeated types.
> +   * @param name
> +   * @param constantsOnly
> +   * @param types
> +   */
> +  public Arg(boolean constantsOnly, boolean allowNulls, String name,
> MinorType... types){
> +    this(constantsOnly, name, getMajorTypes(allowNulls, types));
> +  }
> +
> +  public Arg(MajorType... allowedTypes){
>      this(false, null, allowedTypes);
>    }
>
> -  public Arg(String name, DataType... allowedTypes) {
> +  public Arg(String name, MajorType... allowedTypes) {
>      this(false, name, allowedTypes);
>    }
>
> -  public Arg(boolean constantsOnly, String name, DataType...
> allowedTypes) {
> +  public Arg(boolean constantsOnly, String name, MajorType...
> allowedTypes) {
>      this.name = name;
>      this.allowedTypes = allowedTypes;
>      this.constantsOnly = constantsOnly;
> @@ -44,15 +61,15 @@ public class Arg {
>      return name;
>    }
>
> -  public void confirmDataType(String expr, int argIndex,
> LogicalExpression e, ErrorCollector errors){
> +  public void confirmDataType(ExpressionPosition expr, int argIndex,
> LogicalExpression e, ErrorCollector errors){
>      if(constantsOnly){
>        if(ConstantChecker.onlyIncludesConstants(e))
> errors.addExpectedConstantValue(expr, argIndex, name);
>      }
> -    DataType dt = e.getDataType();
> -    if(dt.isLateBind()){
> +    MajorType dt = e.getMajorType();
> +    if(dt.getMinorType() == MinorType.LATE){
>
>        // change among allowed types.
> -      for(DataType a : allowedTypes){
> +      for(MajorType a : allowedTypes){
>          if(dt == a) return;
>        }
>
> @@ -63,4 +80,13 @@ public class Arg {
>
>
>    }
> +
> +  private static MajorType[] getMajorTypes(boolean allowNulls,
> MinorType... types){
> +    List<MajorType> mts = Lists.newArrayList();
> +    for(MinorType t : types){
> +      if(allowNulls)
> mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.OPTIONAL).build());
> +
>  mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.REQUIRED).build());
> +    }
> +    return mts.toArray(new MajorType[mts.size()]);
> +  }
>  }
> \ No newline at end of file
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> index dc22045..765dc3f 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> @@ -23,6 +23,6 @@ import java.util.List;
>   * Validates whether the set of arguments are acceptable
>   */
>  public interface ArgumentValidator {
> -  public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors);
> +  public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors);
>    public String[] getArgumentNamesByPosition();
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> index 25cb887..f30733d 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> @@ -20,8 +20,8 @@ package org.apache.drill.common.expression;
>  import java.util.List;
>
>  import org.apache.commons.lang3.ArrayUtils;
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.types.DataType.Comparability;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.Types;
>
>  import com.google.common.base.Predicate;
>  import com.google.common.collect.Range;
> @@ -46,7 +46,7 @@ public class ArgumentValidators {
>      }
>
>      @Override
> -    public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> +    public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
>        // only need to check argument count since any type is allowed.
>        if (!argumentCount.contains(expressions.size()))
>          errors.addUnexpectedArgumentCount(expr, expressions.size(),
> argumentCount);
> @@ -61,17 +61,17 @@ public class ArgumentValidators {
>
>    private static class PredicateValidator implements ArgumentValidator {
>      private final Range<Integer> argumentCount;
> -    private Predicate<DataType> predicate;
> +    private Predicate<MajorType> predicate;
>      private boolean allSame;
>
> -    public PredicateValidator(int argCount, Predicate<DataType>
> predicate, boolean allSame) {
> +    public PredicateValidator(int argCount, Predicate<MajorType>
> predicate, boolean allSame) {
>        super();
>        this.argumentCount = Ranges.singleton(argCount);
>        this.predicate = predicate;
>        this.allSame = allSame;
>      }
>
> -    public PredicateValidator(int minArguments, int maxArguments,
> Predicate<DataType> predicate, boolean allSame) {
> +    public PredicateValidator(int minArguments, int maxArguments,
> Predicate<MajorType> predicate, boolean allSame) {
>        super();
>        this.argumentCount = Ranges.closedOpen(minArguments, maxArguments);
>        this.predicate = predicate;
> @@ -79,21 +79,21 @@ public class ArgumentValidators {
>      }
>
>      @Override
> -    public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> +    public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
>        int i = -1;
> -      DataType t = null;
> +      MajorType t = null;
>        for (LogicalExpression le : expressions) {
>          i++;
> -          DataType dataType = le.getDataType();
> -          if (t == null) t = dataType;
> +          MajorType majorType = le.getMajorType();
> +          if (t == null) t = majorType;
>
> -        if (!predicate.apply(dataType)) {
> -          errors.addUnexpectedType(expr, i, dataType);
> +        if (!predicate.apply(majorType)) {
> +          errors.addUnexpectedType(expr, i, majorType);
>            continue;
>          }
>
> -        if (allSame && t != DataType.LATEBIND && dataType !=
> DataType.LATEBIND && t != dataType) {
> -          errors.addUnexpectedType(expr, i, dataType);
> +        if (allSame && !Types.isLateBind(t) &&
> !Types.isLateBind(majorType) && !Types.softEquals(t, majorType, true)) {
> +          errors.addUnexpectedType(expr, i, majorType);
>          }
>
>        }
> @@ -109,50 +109,50 @@ public class ArgumentValidators {
>
>    public static class ComparableArguments extends PredicateValidator {
>
> -    public ComparableArguments(int argCount, DataType... allowedTypes) {
> +    public ComparableArguments(int argCount, MajorType... allowedTypes) {
>        super(argCount, new ComparableChecker(), true);
>      }
>
> -    public ComparableArguments(int minArguments, int maxArguments,
> DataType... allowedTypes) {
> +    public ComparableArguments(int minArguments, int maxArguments,
> MajorType... allowedTypes) {
>        super(minArguments, maxArguments, new ComparableChecker(), true);
>      }
>
> -    public static class ComparableChecker implements Predicate<DataType> {
> +    public static class ComparableChecker implements Predicate<MajorType>
> {
>
> -      public boolean apply(DataType dt) {
> -          Comparability comparability = dt.getComparability();
> -          return comparability.equals(Comparability.ORDERED) ||
> comparability.equals(Comparability.UNKNOWN);
> +      public boolean apply(MajorType dt) {
> +          Types.Comparability comparability = Types.getComparability(dt);
> +          return comparability.equals(Types.Comparability.ORDERED) ||
> comparability.equals(Types.Comparability.UNKNOWN);
>        }
>      }
>    }
>
>    public static class AllowedTypeList extends PredicateValidator {
>
> -    public AllowedTypeList(int argCount, DataType... allowedTypes) {
> +    public AllowedTypeList(int argCount, MajorType... allowedTypes) {
>        super(argCount, new AllowedTypeChecker(allowedTypes), false);
>      }
>
> -    public AllowedTypeList(int minArguments, int maxArguments,
> DataType... allowedTypes) {
> +    public AllowedTypeList(int minArguments, int maxArguments,
> MajorType... allowedTypes) {
>        super(minArguments, maxArguments, new
> AllowedTypeChecker(allowedTypes), false);
>      }
>
> -    public AllowedTypeList(int argCount, boolean allSame, DataType...
> allowedTypes) {
> +    public AllowedTypeList(int argCount, boolean allSame, MajorType...
> allowedTypes) {
>        super(argCount, new AllowedTypeChecker(allowedTypes), allSame);
>      }
>
> -    public AllowedTypeList(int minArguments, int maxArguments, boolean
> allSame, DataType... allowedTypes) {
> +    public AllowedTypeList(int minArguments, int maxArguments, boolean
> allSame, MajorType... allowedTypes) {
>        super(minArguments, maxArguments, new
> AllowedTypeChecker(allowedTypes), allSame);
>      }
>
> -    public static class AllowedTypeChecker implements Predicate<DataType>
> {
> +    public static class AllowedTypeChecker implements
> Predicate<MajorType> {
>
> -      private DataType[] allowedTypes;
> +      private MajorType[] allowedTypes;
>
> -      public AllowedTypeChecker(DataType... allowedTypes) {
> +      public AllowedTypeChecker(MajorType... allowedTypes) {
>          this.allowedTypes = allowedTypes;
>        }
>
> -      public boolean apply(DataType dt) {
> +      public boolean apply(MajorType dt) {
>          return ArrayUtils.contains(allowedTypes, dt);
>        }
>      }
> @@ -170,10 +170,10 @@ public class ArgumentValidators {
>        super(minArguments, maxArguments, new NumericTypeChecker(),
> allSame);
>      }
>
> -    public static class NumericTypeChecker implements Predicate<DataType>
> {
> +    public static class NumericTypeChecker implements
> Predicate<MajorType> {
>
> -      public boolean apply(DataType dt) {
> -        return dt.isNumericType();
> +      public boolean apply(MajorType dt) {
> +        return Types.isNumericType(dt);
>        }
>      }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> index eed49d3..26b7cf6 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> @@ -19,13 +19,13 @@ package org.apache.drill.common.expression;
>
>  import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  public class BasicArgumentValidator implements ArgumentValidator {
>
>    private final Arg[] args;
>
> -  public BasicArgumentValidator(DataType... types) {
> +  public BasicArgumentValidator(MajorType... types) {
>      this.args = new Arg[] { new Arg("single", types) };
>    }
>
> @@ -34,7 +34,7 @@ public class BasicArgumentValidator implements
> ArgumentValidator {
>    }
>
>    @Override
> -  public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> +  public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
>      if (expressions.size() != args.length)
> errors.addUnexpectedArgumentCount(expr, expressions.size(), args.length);
>
>      int i = 0;
> @@ -45,7 +45,7 @@ public class BasicArgumentValidator implements
> ArgumentValidator {
>      }
>    }
>
> -  public Arg arg(String name, DataType... allowedTypes) {
> +  public Arg arg(String name, MajorType... allowedTypes) {
>      return new Arg(name, allowedTypes);
>    }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> index 21ecec4..b322345 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> @@ -17,27 +17,29 @@
>
> ******************************************************************************/
>  package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  import com.google.common.collect.Range;
>
>  public interface ErrorCollector {
>
> -    public void addGeneralError(String expr, String s);
> +    public void addGeneralError(ExpressionPosition expr, String s);
>
> -    public void addUnexpectedArgumentType(String expr, String name,
> DataType actual, DataType[] expected, int argumentIndex);
> +    public void addUnexpectedArgumentType(ExpressionPosition expr, String
> name, MajorType actual, MajorType[] expected, int argumentIndex);
>
> -    public void addUnexpectedArgumentCount(String expr, int actual,
> Range<Integer> expected);
> +    public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, Range<Integer> expected);
>
> -    public void addUnexpectedArgumentCount(String expr, int actual, int
> expected);
> +    public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, int expected);
>
> -    public void addNonNumericType(String expr, DataType actual);
> +    public void addNonNumericType(ExpressionPosition expr, MajorType
> actual);
>
> -    public void addUnexpectedType(String expr, int index, DataType
> actual);
> +    public void addUnexpectedType(ExpressionPosition expr, int index,
> MajorType actual);
>
> -    public void addExpectedConstantValue(String expr, int actual, String
> s);
> +    public void addExpectedConstantValue(ExpressionPosition expr, int
> actual, String s);
>
>      boolean hasErrors();
> +
> +    public int getErrorCount();
>
>      String toErrorString();
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> index cc90b82..054e067 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> @@ -1,12 +1,13 @@
>  package org.apache.drill.common.expression;
>
> +import java.util.Arrays;
> +import java.util.List;
> +
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +
>  import com.google.common.base.Joiner;
>  import com.google.common.collect.Lists;
>  import com.google.common.collect.Range;
> -import org.apache.drill.common.expression.types.DataType;
> -
> -import java.util.Arrays;
> -import java.util.List;
>
>  public class ErrorCollectorImpl implements ErrorCollector {
>      List<ExpressionValidationError> errors;
> @@ -15,17 +16,17 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
>          errors = Lists.newArrayList();
>      }
>
> -    private String addExpr(String expr, String message) {
> -        return "Expression: [" + expr + "]. Error: " + message;
> +    private String addExpr(ExpressionPosition expr, String message) {
> +        return String.format("Error in expression at index %d.  Error:
> %s.  Full expression: %s.", expr.getCharIndex(), message,
> expr.getExpression());
>      }
>
>      @Override
> -    public void addGeneralError(String expr, String s) {
> +    public void addGeneralError(ExpressionPosition expr, String s) {
>          errors.add(new ExpressionValidationError(addExpr(expr, s)));
>      }
>
>      @Override
> -    public void addUnexpectedArgumentType(String expr, String name,
> DataType actual, DataType[] expected, int argumentIndex) {
> +    public void addUnexpectedArgumentType(ExpressionPosition expr, String
> name, MajorType actual, MajorType[] expected, int argumentIndex) {
>          errors.add(
>                  new ExpressionValidationError(
>                          addExpr(expr, String.format(
> @@ -37,35 +38,35 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
>      }
>
>      @Override
> -    public void addUnexpectedArgumentCount(String expr, int actual,
> Range<Integer> expected) {
> +    public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, Range<Integer> expected) {
>          errors.add(new ExpressionValidationError(
>                  addExpr(expr, String.format("Unexpected argument count.
> Actual argument count: %d, Expected range: %s", actual, expected))
>          ));
>      }
>
>      @Override
> -    public void addUnexpectedArgumentCount(String expr, int actual, int
> expected) {
> +    public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, int expected) {
>          errors.add(new ExpressionValidationError(
>                  addExpr(expr, String.format("Unexpected argument count.
> Actual argument count: %d, Expected count: %d", actual, expected))
>          ));
>      }
>
>      @Override
> -    public void addNonNumericType(String expr, DataType actual) {
> +    public void addNonNumericType(ExpressionPosition expr, MajorType
> actual) {
>          errors.add(new ExpressionValidationError(
>                  addExpr(expr, String.format("Unexpected numeric type.
> Actual type: %s", actual))
>          ));
>      }
>
>      @Override
> -    public void addUnexpectedType(String expr, int index, DataType
> actual) {
> +    public void addUnexpectedType(ExpressionPosition expr, int index,
> MajorType actual) {
>          errors.add(new ExpressionValidationError(
>                  addExpr(expr, String.format("Unexpected argument type.
> Actual type: %s, Index: %d", actual, index))
>          ));
>      }
>
>      @Override
> -    public void addExpectedConstantValue(String expr, int actual, String
> s) {
> +    public void addExpectedConstantValue(ExpressionPosition expr, int
> actual, String s) {
>          errors.add(new ExpressionValidationError(
>                  addExpr(expr, String.format("Unexpected constant value.
> Name: %s, Actual: %s", s, actual))
>          ));
> @@ -76,8 +77,21 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
>          return !errors.isEmpty();
>      }
>
> +
> +    @Override
> +    public int getErrorCount() {
> +      return errors.size();
> +    }
> +
>      @Override
>      public String toErrorString() {
>          return "\n" + Joiner.on("\n").join(errors);
>      }
> +
> +    @Override
> +    public String toString() {
> +      return toErrorString();
> +    }
> +
> +
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> new file mode 100644
> index 0000000..2e8b529
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> @@ -0,0 +1,27 @@
> +package org.apache.drill.common.expression;
> +
> +public class ExpressionPosition {
> +  static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionPosition.class);
> +
> +  public static final ExpressionPosition UNKNOWN = new
> ExpressionPosition("--UNKNOWN EXPRESSION--", -1);
> +
> +  private final String expression;
> +  private final int charIndex;
> +
> +  public ExpressionPosition(String expression, int charIndex) {
> +    super();
> +    this.expression = expression;
> +    this.charIndex = charIndex;
> +  }
> +
> +  public String getExpression() {
> +    return expression;
> +  }
> +
> +  public int getCharIndex() {
> +    return charIndex;
> +  }
> +
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> new file mode 100644
> index 0000000..09a7d57
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> @@ -0,0 +1,102 @@
> +package org.apache.drill.common.expression;
> +
> +import org.apache.drill.common.expression.IfExpression.IfCondition;
> +import
> org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
> +import
> org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
> +import org.apache.drill.common.expression.ValueExpressions.LongExpression;
> +import org.apache.drill.common.expression.ValueExpressions.QuotedString;
> +import org.apache.drill.common.expression.visitors.AbstractExprVisitor;
> +
> +import com.google.common.collect.ImmutableList;
> +
> +public class ExpressionStringBuilder extends AbstractExprVisitor<Void,
> StringBuilder, RuntimeException>{
> +  static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionStringBuilder.class);
> +
> +  @Override
> +  public Void visitFunctionCall(FunctionCall call, StringBuilder sb)
> throws RuntimeException {
> +    FunctionDefinition func = call.getDefinition();
> +    ImmutableList<LogicalExpression> args = call.args;
> +    if (func.isOperator()) {
> +      if (args.size() == 1) { // unary
> +        func.addRegisteredName(sb);
> +        sb.append("(");
> +        args.get(0).accept(this, sb);
> +        sb.append(")");
> +      } else {
> +        for (int i = 0; i < args.size(); i++) {
> +          if (i != 0) {
> +            sb.append(" ");
> +            func.addRegisteredName(sb);
> +          }
> +          sb.append(" (");
> +          args.get(i).accept(this, sb);
> +          sb.append(") ");
> +        }
> +      }
> +    } else { // normal function
> +
> +      func.addRegisteredName(sb);
> +      sb.append("(");
> +      for (int i = 0; i < args.size(); i++) {
> +        if (i != 0) sb.append(", ");
> +        args.get(i).accept(this, sb);
> +      }
> +      sb.append(") ");
> +    }
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitIfExpression(IfExpression ifExpr, StringBuilder sb)
> throws RuntimeException {
> +    ImmutableList<IfCondition> conditions = ifExpr.conditions;
> +    sb.append(" ( ");
> +    for(int i =0; i < conditions.size(); i++){
> +      IfCondition c = conditions.get(i);
> +      if(i !=0) sb.append(" else ");
> +      sb.append("if (");
> +      c.condition.accept(this, sb);
> +      sb.append(" ) then (");
> +      c.expression.accept(this, sb);
> +      sb.append(" ) ");
> +    }
> +    sb.append(" end ");
> +    sb.append(" ) ");
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws
> RuntimeException {
> +    sb.append("'");
> +    sb.append(path.getPath());
> +    sb.append("'");
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitLongConstant(LongExpression lExpr, StringBuilder sb)
> throws RuntimeException {
> +    sb.append(lExpr.getLong());
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitDoubleConstant(DoubleExpression dExpr, StringBuilder
> sb) throws RuntimeException {
> +    sb.append(dExpr.getDouble());
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitBooleanConstant(BooleanExpression e, StringBuilder sb)
> throws RuntimeException {
> +    sb.append(e.getBoolean());
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitQuotedStringConstant(QuotedString e, StringBuilder sb)
> throws RuntimeException {
> +    sb.append("\"");
> +    sb.append(e.value);
> +    sb.append("\"");
> +    return null;
> +  }
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> new file mode 100644
> index 0000000..98a9075
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> @@ -0,0 +1,86 @@
> +package org.apache.drill.common.expression;
> +
> +import org.apache.drill.common.expression.IfExpression.IfCondition;
> +import
> org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
> +import
> org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
> +import org.apache.drill.common.expression.ValueExpressions.LongExpression;
> +import org.apache.drill.common.expression.ValueExpressions.QuotedString;
> +import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
> +
> +public class ExpressionValidator implements ExprVisitor<Void,
> ErrorCollector, RuntimeException> {
> +  static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionValidator.class);
> +
> +  @Override
> +  public Void visitFunctionCall(FunctionCall call, ErrorCollector errors)
> throws RuntimeException {
> +    call.getDefinition().getArgumentValidator()
> +        .validateArguments(call.getPosition(), call.args, errors);
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitIfExpression(IfExpression ifExpr, ErrorCollector
> errors) throws RuntimeException {
> +    // confirm that all conditions are required boolean values.
> +    int i = 0;
> +    for (IfCondition c : ifExpr.conditions) {
> +      MajorType mt = c.condition.getMajorType();
> +      if (mt.getMode() != DataMode.REQUIRED || mt.getMinorType() !=
> MinorType.BOOLEAN){
> +        errors.addGeneralError(c.condition.getPosition(),String.format(
> +                        "Failure composing If Expression.  All conditions
> must return a required value and be of type boolean.  Condition %d was
> DatMode %s and Type %s.",
> +                        i, mt.getMode(), mt.getMinorType()));
> +      }
> +      i++;
> +    }
> +
> +    // confirm that all outcomes are the same type.
> +    final MajorType mt = ifExpr.elseExpression.getMajorType();
> +    i = 0;
> +    for (IfCondition c : ifExpr.conditions) {
> +      MajorType innerT = c.expression.getMajorType();
> +      if (
> +          (innerT.getMode() == DataMode.REPEATED && mt.getMode() !=
> DataMode.REPEATED) || //
> +          (innerT.getMinorType() != mt.getMinorType())
> +          ) {
> +        errors.addGeneralError(c.condition.getPosition(),String.format(
> +            "Failure composing If Expression.  All expressions must
> return the same MajorType as the else expression.  The %d if condition
> returned type type %s but the else expression was of type %s",
> +            i, innerT, mt));
> +      }
> +      i++;
> +    }
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitSchemaPath(SchemaPath path, ErrorCollector errors)
> throws RuntimeException {
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitLongConstant(LongExpression intExpr, ErrorCollector
> errors) throws RuntimeException {
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitDoubleConstant(DoubleExpression dExpr, ErrorCollector
> errors) throws RuntimeException {
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitBooleanConstant(BooleanExpression e, ErrorCollector
> errors) throws RuntimeException {
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitQuotedStringConstant(QuotedString e, ErrorCollector
> errors) throws RuntimeException {
> +    return null;
> +  }
> +
> +  @Override
> +  public Void visitUnknown(LogicalExpression e, ErrorCollector value)
> throws RuntimeException {
> +    return null;
> +  }
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> index 94800ba..f611614 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> @@ -21,6 +21,7 @@ import java.io.IOException;
>
>  import org.apache.drill.common.expression.FieldReference.De;
>  import org.apache.drill.common.expression.FieldReference.Se;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  import com.fasterxml.jackson.core.JsonGenerationException;
>  import com.fasterxml.jackson.core.JsonGenerator;
> @@ -32,26 +33,25 @@ import
> com.fasterxml.jackson.databind.annotation.JsonDeserialize;
>  import com.fasterxml.jackson.databind.annotation.JsonSerialize;
>  import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
>  import com.fasterxml.jackson.databind.ser.std.StdSerializer;
> -import org.apache.drill.common.expression.types.DataType;
>
>  @JsonSerialize(using = Se.class)
>  @JsonDeserialize(using = De.class)
>  public class FieldReference extends SchemaPath {
> -  DataType overrideType;
> +  MajorType overrideType;
>
> -  public FieldReference(String value) {
> -    super(value);
> +  public FieldReference(String value, ExpressionPosition pos) {
> +    super(value, pos);
>    }
>
> -  public FieldReference(String value, DataType dataType) {
> -    super(value);
> +  public FieldReference(String value, ExpressionPosition pos, MajorType
> dataType) {
> +    super(value, pos);
>      this.overrideType = dataType;
>    }
>
>      @Override
> -    public DataType getDataType() {
> +    public MajorType getMajorType() {
>          if(overrideType == null) {
> -            return super.getDataType();
> +            return super.getMajorType();
>          } else {
>              return overrideType;
>          }
> @@ -66,7 +66,7 @@ public class FieldReference extends SchemaPath {
>      @Override
>      public FieldReference deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
>          JsonProcessingException {
> -      return new FieldReference(this._parseString(jp, ctxt));
> +      return new FieldReference(this._parseString(jp, ctxt),
> ExpressionPosition.UNKNOWN);
>      }
>
>    }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> deleted file mode 100644
> index fd8ae18..0000000
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> +++ /dev/null
> @@ -1,94 +0,0 @@
>
> -/*******************************************************************************
> - * 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
> - * regarding copyright ownership.  The ASF licenses this file
> - * to you under the Apache License, Version 2.0 (the
> - * "License"); you may not use this file except in compliance
> - * with the License.  You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> -
> ******************************************************************************/
> -package org.apache.drill.common.expression;
> -
> -import java.util.Iterator;
> -import java.util.List;
> -
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.visitors.ExprVisitor;
> -
> -import com.fasterxml.jackson.annotation.JsonIgnore;
> -import com.google.common.collect.ImmutableList;
> -
> -
> -public abstract class FunctionBase extends LogicalExpressionBase
> implements Iterable<LogicalExpression>{
> -       public final ImmutableList<LogicalExpression> expressions;
> -
> -
> -  protected void funcToString(StringBuilder sb, String functionName) {
> -    sb.append(" ");
> -    sb.append(functionName);
> -    sb.append("( ");
> -    for(int i= 0; i < expressions.size(); i++){
> -      if(i != 0) sb.append(", ");
> -      expressions.get(i).addToString(sb);
> -    }
> -    sb.append(" ) ");
> -  }
> -
> -  protected void opToString(StringBuilder sb, String operator) {
> -    sb.append(" ( ");
> -    expressions.get(0).addToString(sb);
> -    for(int i =1; i < expressions.size(); i++){
> -      sb.append(operator);
> -      expressions.get(i).addToString(sb);
> -    }
> -    sb.append(" ) ");
> -  }
> -
> -       public FunctionBase(List<LogicalExpression> expressions){
> -               if( !(expressions instanceof ImmutableList)){
> -                       expressions = ImmutableList.copyOf(expressions);
> -               }
> -               this.expressions = (ImmutableList<LogicalExpression>)
> expressions;
> -       }
> -
> -//     public static DataType getJointType(String parentName,
> LogicalExpression expr1, LogicalExpression expr2) throws
> ExpressionValidationException{
> -//             DataType dt =
> DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
> -//             if(dt == null) throw new ExpressionValidationException();
> -//
> -//             return dt;
> -//     }
> -//
> -//     public LogicalExpression wrapWithCastIfNecessary(DataType dt)
> throws ExpressionValidationException{
> -//             if(this.getDataType() != dt) return new Cast(this, dt);
> -//             return this;
> -//     }
> -
> -
> -
> -
> -       @Override
> -       public Iterator<LogicalExpression> iterator() {
> -               return expressions.iterator();
> -       }
> -
> -       @Override
> -       @JsonIgnore
> -       public DataType getDataType() {
> -               throw new UnsupportedOperationException();
> -       }
> -
> -
> -
> -
> -
> -
> -
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> index ee76a5c..e13e87e 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> @@ -20,26 +20,34 @@ package org.apache.drill.common.expression;
>  import java.util.Iterator;
>  import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
>  import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  import com.google.common.collect.ImmutableList;
>
>  public class FunctionCall extends LogicalExpressionBase implements
> Iterable<LogicalExpression> {
>    private final FunctionDefinition func;
>    public final ImmutableList<LogicalExpression> args;
> +  private final ExpressionPosition pos;
>
> -  public FunctionCall(FunctionDefinition func, List<LogicalExpression>
> args) {
> +  public FunctionCall(FunctionDefinition func, List<LogicalExpression>
> args, ExpressionPosition pos) {
> +    super(pos);
>      this.func = func;
>      if (!(args instanceof ImmutableList)) {
>        args = ImmutableList.copyOf(args);
>      }
>      this.args = (ImmutableList<LogicalExpression>) args;
> +    this.pos = pos;
>    }
>
>    @Override
> -  public <T> T accept(ExprVisitor<T> visitor) {
> -    return visitor.visitFunctionCall(this);
> +  public ExpressionPosition getPosition() {
> +    return pos;
> +  }
> +
> +  @Override
> +  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E{
> +    return visitor.visitFunctionCall(this, value);
>    }
>
>    @Override
> @@ -52,43 +60,16 @@ public class FunctionCall extends
> LogicalExpressionBase implements Iterable<Logi
>    }
>
>    @Override
> -  public DataType getDataType() {
> +  public MajorType getMajorType() {
>      return func.getDataType(this.args);
>    }
>
>    @Override
> -  public void addToString(StringBuilder sb) {
> -    if (func.isOperator()) {
> -      if (args.size() == 1) { // unary
> -        func.addRegisteredName(sb);
> -        sb.append("(");
> -        args.get(0).addToString(sb);
> -        sb.append(")");
> -      } else {
> -        for (int i = 0; i < args.size(); i++) {
> -          if (i != 0) {
> -            sb.append(" ");
> -            func.addRegisteredName(sb);
> -          }
> -          sb.append(" (");
> -          args.get(i).addToString(sb);
> -          sb.append(") ");
> -        }
> -      }
> -    } else { // normal function
> -
> -      func.addRegisteredName(sb);
> -      sb.append("(");
> -      for (int i = 0; i < args.size(); i++) {
> -        if (i != 0) sb.append(", ");
> -        args.get(i).addToString(sb);
> -      }
> -      sb.append(") ");
> -    }
> +  public String toString() {
> +    final int maxLen = 10;
> +    return "FunctionCall [func=" + func + ", args="
> +        + (args != null ? args.subList(0, Math.min(args.size(), maxLen))
> : null) + ", pos=" + pos + "]";
>    }
>
> -    @Override
> -    public void resolveAndValidate(String expr, ErrorCollector errors) {
> -        func.getArgumentValidator().validateArguments(expr, args, errors);
> -    }
> +
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> index 9d21763..4cbab6a 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> @@ -21,7 +21,7 @@ import java.util.Arrays;
>  import java.util.List;
>
>  import org.apache.commons.lang3.ArrayUtils;
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  public class FunctionDefinition {
>
> @@ -42,7 +42,7 @@ public class FunctionDefinition {
>      this.isOperator = isOperator;
>    }
>
> -  public DataType getDataType(List<LogicalExpression> args){
> +  public MajorType getDataType(List<LogicalExpression> args){
>      return outputType.getOutputType(args);
>    }
>
> @@ -82,8 +82,8 @@ public class FunctionDefinition {
>      return this.name;
>    }
>
> -  public FunctionCall newCall(List<LogicalExpression> args){
> -    return new FunctionCall(this, args);
> +  public FunctionCall newCall(List<LogicalExpression> args,
> ExpressionPosition pos){
> +    return new FunctionCall(this, args, pos);
>    }
>
>    public void addRegisteredName(StringBuilder sb){
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> index c22e448..ed2c63e 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> @@ -57,17 +57,18 @@ public class FunctionRegistry {
>      }
>    }
>
> -  public LogicalExpression createExpression(String functionName,
> List<LogicalExpression> args){
> +
> +  public LogicalExpression createExpression(String functionName,
> ExpressionPosition ep, List<LogicalExpression> args){
>      FunctionDefinition d = funcMap.get(functionName);
>      if(d == null) throw new
> ExpressionParsingException(String.format("Unable to find function
> definition for function named '%s'", functionName));
> -    return d.newCall(args);
> +    return d.newCall(args, ep);
>    }
>
> -  public LogicalExpression createExpression(String unaryName,
> LogicalExpression... e){
> -    return funcMap.get(unaryName).newCall(Lists.newArrayList(e));
> +  public LogicalExpression createExpression(String unaryName,
> ExpressionPosition ep, LogicalExpression... e){
> +    return funcMap.get(unaryName).newCall(Lists.newArrayList(e), ep);
>    }
>
> -  public LogicalExpression createByOp(List<LogicalExpression> args,
> List<String> opTypes) {
> +  public LogicalExpression createByOp(List<LogicalExpression> args,
> ExpressionPosition ep, List<String> opTypes) {
>      // logger.debug("Generating new comparison expressions.");
>      if (args.size() == 1) {
>        return args.get(0);
> @@ -81,7 +82,7 @@ public class FunctionRegistry {
>        List<LogicalExpression> l2 = new ArrayList<LogicalExpression>();
>        l2.add(first);
>        l2.add(args.get(i + 1));
> -      first = createExpression(opTypes.get(i), args);
> +      first = createExpression(opTypes.get(i), ep, args);
>      }
>      return first;
>    }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> index a553f4c..6f2e4a8 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> @@ -21,11 +21,12 @@ import java.util.ArrayList;
>  import java.util.List;
>
>  import org.apache.drill.common.expression.IfExpression.IfCondition;
> -import org.apache.drill.common.expression.types.DataType;
>  import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
>
> +import com.google.common.base.Preconditions;
>  import com.google.common.collect.ImmutableList;
>  import com.google.common.collect.UnmodifiableIterator;
>
> @@ -35,7 +36,8 @@ public class IfExpression extends LogicalExpressionBase
> implements Iterable<IfCo
>         public final ImmutableList<IfCondition> conditions;
>         public final LogicalExpression elseExpression;
>
> -       private IfExpression(List<IfCondition> conditions,
> LogicalExpression elseExpression){
> +       private IfExpression(ExpressionPosition pos, List<IfCondition>
> conditions, LogicalExpression elseExpression){
> +         super(pos);
>                 this.conditions = ImmutableList.copyOf(conditions);
>                 this.elseExpression = elseExpression;
>         }
> @@ -53,28 +55,32 @@ public class IfExpression extends
> LogicalExpressionBase implements Iterable<IfCo
>
>         }
>
> -
>         @Override
> -  public <T> T accept(ExprVisitor<T> visitor) {
> -    return visitor.visitIfExpression(this);
> +  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E{
> +    return visitor.visitIfExpression(this, value);
>    }
>
> -
>    public static class Builder{
>                 List<IfCondition> conditions = new
> ArrayList<IfCondition>();
>                 private LogicalExpression elseExpression;
> +               private ExpressionPosition pos =
> ExpressionPosition.UNKNOWN;
> +
> +               public Builder setPosition(ExpressionPosition pos){
> +                 this.pos = pos;
> +                 return this;
> +               }
>
>                 public Builder addCondition(IfCondition condition){
>                         conditions.add(condition);
>              return this;
>                 }
>
> -        public Builder addConditions(Iterable<IfCondition> conditions) {
> -            for(IfCondition condition : conditions) {
> -                addCondition(condition);
> -            }
> -            return this;
> -        }
> +    public Builder addConditions(Iterable<IfCondition> conditions) {
> +      for (IfCondition condition : conditions) {
> +        addCondition(condition);
> +      }
> +      return this;
> +    }
>
>                 public Builder setElse(LogicalExpression elseExpression) {
>                         this.elseExpression = elseExpression;
> @@ -82,39 +88,20 @@ public class IfExpression extends
> LogicalExpressionBase implements Iterable<IfCo
>                 }
>
>                 public IfExpression build(){
> -                       return new IfExpression(conditions,
> elseExpression);
> +                 Preconditions.checkNotNull(pos);
> +                 Preconditions.checkNotNull(conditions);
> +                 Preconditions.checkNotNull(conditions);
> +                       return new IfExpression(pos, conditions,
> elseExpression);
>                 }
>
>         }
>
> -
> -    @Override
> -    public DataType getDataType() {
> -        return DataType.BOOLEAN;
> -    }
> -
> -    @Override
> -  public void addToString(StringBuilder sb) {
> -         sb.append(" ( ");
> -         for(int i =0; i < conditions.size(); i++){
> -           IfCondition c = conditions.get(i);
> -           if(i !=0) sb.append(" else ");
> -           sb.append("if (");
> -           c.condition.addToString(sb);
> -           sb.append(" ) then (");
> -           c.expression.addToString(sb);
> -           sb.append(" ) ");
> -         }
> -         sb.append(" end ");
> -         sb.append(" ) ");
> +  @Override
> +  public MajorType getMajorType() {
> +    return this.elseExpression.getMajorType();
>    }
>
> -    @Override
> -    public void resolveAndValidate(String expr, ErrorCollector errors) {
> -    }
> -
> -
> -    public static Builder newBuilder(){
> +  public static Builder newBuilder(){
>                 return new Builder();
>         }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> index 3df33a0..165f409 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> @@ -26,8 +26,8 @@ import org.apache.drill.common.config.DrillConfig;
>  import org.apache.drill.common.expression.parser.ExprLexer;
>  import org.apache.drill.common.expression.parser.ExprParser;
>  import org.apache.drill.common.expression.parser.ExprParser.parse_return;
> -import org.apache.drill.common.expression.types.DataType;
>  import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
>
> @@ -44,65 +44,65 @@ import
> com.fasterxml.jackson.databind.ser.std.StdSerializer;
>  //@JsonDeserialize(using = LogicalExpression.De.class)  // Excluded as we
> need to register this with the DrillConfig.
>  @JsonSerialize(using = LogicalExpression.Se.class)
>  public interface LogicalExpression {
> -    static final Logger logger =
> LoggerFactory.getLogger(LogicalExpression.class);
> +  static final Logger logger =
> LoggerFactory.getLogger(LogicalExpression.class);
>
> -    public abstract DataType getDataType();
> +  public abstract MajorType getMajorType();
>
> -    public void addToString(StringBuilder sb);
> +  public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E;
>
> -    public void resolveAndValidate(String expr, ErrorCollector errors);
> +  public ExpressionPosition getPosition();
>
> -    public <T> T accept(ExprVisitor<T> visitor);
> +  public static class De extends StdDeserializer<LogicalExpression> {
> +    DrillConfig config;
>
> -    public static class De extends StdDeserializer<LogicalExpression> {
> -        DrillConfig config;
> -        ErrorCollector errorCollector;
> -
> -        public De(DrillConfig config) {
> -            super(LogicalExpression.class);
> -            this.config = config;
> -            this.errorCollector = config.getErrorCollector();
> -        }
> -
> -        @Override
> -        public LogicalExpression deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
> -                JsonProcessingException {
> -            String expr = jp.getText();
> -
> -            if (expr == null || expr.isEmpty())
> -                return null;
> -            try {
> -                // logger.debug("Parsing expression string '{}'", expr);
> -                ExprLexer lexer = new ExprLexer(new
> ANTLRStringStream(expr));
> -
> -                CommonTokenStream tokens = new CommonTokenStream(lexer);
> -                ExprParser parser = new ExprParser(tokens);
> -                parser.setRegistry(new FunctionRegistry(config));
> -                parse_return ret = parser.parse();
> -                // logger.debug("Found expression '{}'", ret.e);
> -                ret.e.resolveAndValidate(expr, errorCollector);
> -                return ret.e;
> -            } catch (RecognitionException e) {
> -                throw new RuntimeException(e);
> -            }
> -        }
> +    public De(DrillConfig config) {
> +      super(LogicalExpression.class);
> +      this.config = config;
> +    }
>
> +    @Override
> +    public LogicalExpression deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
> +        JsonProcessingException {
> +      String expr = jp.getText();
> +
> +      if (expr == null || expr.isEmpty())
> +        return null;
> +      try {
> +        // logger.debug("Parsing expression string '{}'", expr);
> +        ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
> +        CommonTokenStream tokens = new CommonTokenStream(lexer);
> +        ExprParser parser = new ExprParser(tokens);
> +
> +        //TODO: move functionregistry and error collector to injectables.
> +        //ctxt.findInjectableValue(valueId, forProperty, beanInstance)
> +
> +        parser.setRegistry(new FunctionRegistry(config));
> +        parse_return ret = parser.parse();
> +
> +        // ret.e.resolveAndValidate(expr, errorCollector);
> +        return ret.e;
> +      } catch (RecognitionException e) {
> +        throw new RuntimeException(e);
> +      }
>      }
>
> -    public static class Se extends StdSerializer<LogicalExpression> {
> +  }
>
> -        protected Se() {
> -            super(LogicalExpression.class);
> -        }
> +  public static class Se extends StdSerializer<LogicalExpression> {
>
> -        @Override
> -        public void serialize(LogicalExpression value, JsonGenerator
> jgen, SerializerProvider provider) throws IOException,
> -                JsonGenerationException {
> -            StringBuilder sb = new StringBuilder();
> -            value.addToString(sb);
> -            jgen.writeString(sb.toString());
> -        }
> +    protected Se() {
> +      super(LogicalExpression.class);
> +    }
>
> +    @Override
> +    public void serialize(LogicalExpression value, JsonGenerator jgen,
> SerializerProvider provider) throws IOException,
> +        JsonGenerationException {
> +      StringBuilder sb = new StringBuilder();
> +      ExpressionStringBuilder esb = new ExpressionStringBuilder();
> +      value.accept(esb, sb);
> +      jgen.writeString(sb.toString());
>      }
>
> +  }
> +
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> index e973df7..aa8885f 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> @@ -6,9 +6,9 @@
>   * to you under the Apache License, Version 2.0 (the
>   * "License"); you may not use this file except in compliance
>   * with the License.  You may obtain a copy of the License at
> - *
> + *
>   * http://www.apache.org/licenses/LICENSE-2.0
> - *
> + *
>   * Unless required by applicable law or agreed to in writing, software
>   * distributed under the License is distributed on an "AS IS" BASIS,
>   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> @@ -17,40 +17,44 @@
>
> ******************************************************************************/
>  package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
>  import com.fasterxml.jackson.annotation.JsonProperty;
>  import com.fasterxml.jackson.annotation.JsonPropertyOrder;
>
>
> -@JsonPropertyOrder({"type"})
> -public abstract class LogicalExpressionBase implements LogicalExpression {
> +@JsonPropertyOrder({ "type" })
> +public abstract class LogicalExpressionBase implements LogicalExpression{
>
> +  private final ExpressionPosition pos;
>
> -//     public static DataType getJointType(String parentName,
> LogicalExpression expr1, LogicalExpression expr2) throws
> ExpressionValidationException{
> -//             DataType dt =
> DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
> -//             if(dt == null) throw new ExpressionValidationException();
> -//
> -//             return dt;
> -//     }
> +       protected LogicalExpressionBase(ExpressionPosition pos) {
> +    super();
> +    this.pos = pos;
> +  }
>
> +  @Override
> +  public ExpressionPosition getPosition() {
> +    return pos;
> +  }
>
> -    protected void i(StringBuilder sb, int indent) {
> -        for (int i = 0; i < indent; i++) {
> -            sb.append("  ");
> -        }
> -    }
> +  protected void i(StringBuilder sb, int indent){
> +               for(int i = 0; i < indent; i++){
> +                       sb.append("  ");
> +               }
> +       }
> +
> +       @Override
> +       public MajorType getMajorType() {
> +               throw new UnsupportedOperationException(String.format("The
> type of %s doesn't currently support LogicalExpression.getDataType().",
> this.getClass().getCanonicalName()));
> +       }
>
> -//     @Override
> -//     public <T> T accept(ExprVisitor<T> visitor) {
> -//             return visitor.visit(this);
> -//     }
> -
> -    @JsonProperty("type")
> -    public String getDescription() {
> -        return this.getClass().getSimpleName();
> -    }
> +  @JsonProperty("type")
> +       public String getDescription(){
> +               return this.getClass().getSimpleName();
> +       }
> +
>
> +
>
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> index 67402e2..0bec184 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> @@ -19,37 +19,51 @@ package org.apache.drill.common.expression;
>
>  import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
>
>  public interface OutputTypeDeterminer {
>
> -  public static OutputTypeDeterminer FIXED_BOOLEAN = new
> FixedType(DataType.BOOLEAN);
> +  public static OutputTypeDeterminer FIXED_BOOLEAN = new
> FixedType(MajorType.newBuilder().setMinorType(MinorType.BOOLEAN).setMode(DataMode.REQUIRED).build());
>
> -  public DataType getOutputType(List<LogicalExpression> expressions);
> +  public MajorType getOutputType(List<LogicalExpression> expressions);
>
>
>    public static class FixedType implements OutputTypeDeterminer{
> -    public DataType outputType;
> +    public MajorType outputType;
>
>
> -    public FixedType(DataType outputType) {
> +    public FixedType(MajorType outputType) {
>        super();
>        this.outputType = outputType;
>      }
>
>
>      @Override
> -    public DataType getOutputType(List<LogicalExpression> expressions) {
> -      return null;
> +    public MajorType getOutputType(List<LogicalExpression> expressions) {
> +      return outputType;
>      }
>
>    }
>
>    public static class SameAsFirstInput implements OutputTypeDeterminer{
> -
>      @Override
> -    public DataType getOutputType(List<LogicalExpression> expressions) {
> -      return expressions.get(0).getDataType();
> +    public MajorType getOutputType(List<LogicalExpression> expressions) {
> +      return expressions.get(0).getMajorType();
> +    }
> +  }
> +
> +  public static class SameAsAnySoft implements OutputTypeDeterminer{
> +    @Override
> +    public MajorType getOutputType(List<LogicalExpression> expressions) {
> +      for(LogicalExpression e : expressions){
> +        if(e.getMajorType().getMode() == DataMode.OPTIONAL){
> +          return e.getMajorType();
> +        }
> +      }
> +      return expressions.get(0).getMajorType();
>      }
>    }
> +
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> index c06426e..554c0ca 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> @@ -98,6 +98,32 @@ public abstract class PathSegment{
>        return "NameSegment [path=" + path + ", getCollisionBehavior()=" +
> getCollisionBehavior() + ", getChild()="
>            + getChild() + "]";
>      }
> +
> +    @Override
> +    public int hashCode() {
> +      final int prime = 31;
> +      int result = 1;
> +      result = prime * result + ((path == null) ? 0 : path.hashCode());
> +      return result;
> +    }
> +
> +    @Override
> +    public boolean equals(Object obj) {
> +      if (this == obj)
> +        return true;
> +      if (obj == null)
> +        return false;
> +      if (getClass() != obj.getClass())
> +        return false;
> +      NameSegment other = (NameSegment) obj;
> +      if (path == null) {
> +        if (other.path != null)
> +          return false;
> +      } else if (!path.equals(other.path))
> +        return false;
> +      return true;
> +    }
> +
>
>
>    }
>
>