You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by xu...@apache.org on 2011/04/04 20:31:29 UTC

svn commit: r1088700 [2/2] - in /pig/trunk: ./ src/org/apache/pig/ src/org/apache/pig/impl/logicalLayer/validators/ src/org/apache/pig/impl/plan/ src/org/apache/pig/newplan/ src/org/apache/pig/newplan/logical/expression/ src/org/apache/pig/newplan/logi...

Modified: pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java Mon Apr  4 18:31:28 2011
@@ -103,7 +103,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1057;
             String msg = "Filter's cond plan can only have one output" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+            throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, null) ;
         }
 
         // visit the filter expression
@@ -114,12 +114,12 @@ public class TypeCheckingRelVisitor exte
         byte innerCondType = ((LogicalExpression)comparisonPlan.getSources().get(0)).getType();
         if (innerCondType != DataType.BOOLEAN) {
             int errCode = 1058;
-            String msg = "Filter's condition must evaluate to boolean. Found: " + DataType.findTypeName(innerCondType);
+            String msg = "Filter's condition must evaluate to boolean. Found: " + 
+                         DataType.findTypeName(innerCondType);
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+            throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, null) ;
         }       
 
-
         try {
             // re-compute the schema
             filter.resetSchema();
@@ -129,11 +129,20 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1059;
             String msg = "Problem while reconciling output schema of Filter" ;
             msgCollector.collect(msg, MessageType.Error);
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, fe) ;
         }
     }
     
-    @Override
+    private void throwTypeCheckerException(Operator op, String msg,
+			int errCode, byte input, FrontendException fe) throws TypeCheckerException {
+    	if( fe == null ) {
+		    throw new TypeCheckerException(op, msg, errCode, PigException.INPUT);
+    	}
+		throw new TypeCheckerException(op, msg, errCode, PigException.INPUT, fe);
+		
+	}
+
+	@Override
     public void visit(LOGenerate gen) throws FrontendException {
         for(int i=0; i < gen.getOutputPlans().size(); i++) {
             LogicalExpressionPlan expPlan = gen.getOutputPlans().get(i);
@@ -142,7 +151,7 @@ public class TypeCheckingRelVisitor exte
                 int errCode = 1057;
                 String msg = "LOGenerate expression plan can only have one output" ;
                 msgCollector.collect(msg, MessageType.Error) ;
-                throw new TypeCheckerException( msg, errCode, PigException.BUG ) ;
+                throwTypeCheckerException( gen, msg, errCode, PigException.BUG, null) ;
             }
             // visit the filter expression
             visitExpressionPlan( expPlan, gen );
@@ -170,7 +179,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1059;
             String msg = "Problem while reconciling output schema of ForEach" ;
             msgCollector.collect(msg, MessageType.Error);
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(forEach, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -212,7 +221,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1055;
             String msg = "Problem while reading schemas from inputs of Union" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+            throwTypeCheckerException(u, msg, errCode, PigException.INPUT, fee) ;
         }
 
         // Do cast insertion only if we are typed 
@@ -237,7 +246,7 @@ public class TypeCheckingRelVisitor exte
                         int errCode = 1056;
                         String msg = "Problem while casting inputs of Union" ;
                         msgCollector.collect(msg, MessageType.Error) ;
-                        throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+                        throwTypeCheckerException(u, msg, errCode, PigException.INPUT, fee) ;
                     }
                 }
             }
@@ -276,7 +285,7 @@ public class TypeCheckingRelVisitor exte
         if (!found) {
             int errCode = 1077;
             String msg = "Two operators that require a cast in between are not adjacent.";
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+            throwTypeCheckerException(fromOp, msg, errCode, PigException.INPUT, null);
         }
 
         // retrieve input schema to be casted
@@ -291,7 +300,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1055;
             String msg = "Problem while reading schema from input of " 
                 + fromOp.getClass().getSimpleName();
-            throw new TypeCheckerException(msg, errCode, PigException.BUG, fe);
+            throwTypeCheckerException(fromOp, msg, errCode, PigException.BUG, fe);
         }
 
         // make sure the supplied targetSchema has the same number of members
@@ -300,7 +309,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1078;
             String msg = "Schema size mismatch for casting. Input schema size: " 
                 + fromSchema.size() + ". Target schema size: " + toSchema.size();
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+            throwTypeCheckerException(toOp, msg, errCode, PigException.INPUT, null);
         }
 
         // Plans inside Generate. Fields that do not need casting will only
@@ -379,7 +388,7 @@ public class TypeCheckingRelVisitor exte
         if (list.size() != 1) {
             int errCode = 2008;
             String msg = "LOSplitOutput cannot have more than one input. Found: " + list.size() + " input(s).";
-            throw new TypeCheckerException(msg, errCode, PigException.BUG) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.BUG, null) ;
         }
 
         LogicalExpressionPlan condPlan = op.getFilterPlan() ;
@@ -389,7 +398,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1057;
             String msg = "Split's inner plan can only have one output (leaf)" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.INPUT, null) ;
         }
 
         visitExpressionPlan(condPlan, op);
@@ -399,7 +408,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1058;
             String msg = "Split's condition must evaluate to boolean. Found: " + DataType.findTypeName(innerCondType) ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.INPUT, null) ;
         }
 
         try {
@@ -411,7 +420,7 @@ public class TypeCheckingRelVisitor exte
             String msg = "Problem while reading"
                 + " schemas from inputs of SplitOutput" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -434,7 +443,7 @@ public class TypeCheckingRelVisitor exte
             String msg = "Problem while reading"
                 + " schemas from inputs of Distinct" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -450,7 +459,7 @@ public class TypeCheckingRelVisitor exte
             String msg = "Problem while reading"
                 + " schemas from inputs of Limit" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -473,7 +482,7 @@ public class TypeCheckingRelVisitor exte
             String msg = "Problem while reading"
                 + " schemas from inputs of Cross" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(cs, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -494,7 +503,7 @@ public class TypeCheckingRelVisitor exte
                 int errCode = 1057;
                 String msg = "Sort's inner plan can only have one output (leaf)" ;
                 msgCollector.collect(msg, MessageType.Error) ;
-                throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+                throwTypeCheckerException(sort, msg, errCode, PigException.INPUT, null) ;
             }
 
             visitExpressionPlan(sortColPlan, sort);
@@ -508,7 +517,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1059;
             String msg = "Problem while reconciling output schema of Sort" ;
             msgCollector.collect(msg, MessageType.Error);
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+            throwTypeCheckerException(sort, msg, errCode, PigException.INPUT, fee) ;
         }
     }
 
@@ -523,7 +532,7 @@ public class TypeCheckingRelVisitor exte
         if (inputList.size() != 1) {            
             int errCode = 2008;
             String msg = "LOSplit cannot have more than one input. Found: " + inputList.size() + " input(s).";
-            throw new TypeCheckerException(msg, errCode, PigException.BUG) ;
+            throwTypeCheckerException(split, msg, errCode, PigException.BUG, null) ;
         }
 
         split.resetSchema();
@@ -535,7 +544,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1059;
             String msg = "Problem while reconciling output schema of Split" ;
             msgCollector.collect(msg, MessageType.Error);
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(split, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -551,7 +560,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve Join output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
         }
 
         MultiMap<Integer, LogicalExpressionPlan> joinColPlans
@@ -573,7 +582,7 @@ public class TypeCheckingRelVisitor exte
                     String msg = "Join's inner plans can only"
                         + " have one output (leaf)" ;
                     msgCollector.collect(msg, MessageType.Error) ;
-                    throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+                    throwTypeCheckerException(join, msg, errCode, PigException.INPUT, null) ;
                 }
                 visitExpressionPlan(innerPlan, join);
             }
@@ -623,7 +632,7 @@ public class TypeCheckingRelVisitor exte
                             String msg = "Join's inner plans can only"
                                 + "have one output (leaf)" ;
                             msgCollector.collect(msg, MessageType.Error) ;
-                            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+                            throwTypeCheckerException(join, msg, errCode, PigException.INPUT, null) ;
                         }
                         if (innerType != expectedType) {
                             insertAtomicCastForInnerPlan(
@@ -638,7 +647,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve Join output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
         }
 
         try {
@@ -649,7 +658,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve Join output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 
@@ -768,14 +777,14 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1051;
             String msg = "Cannot cast to "
                 + DataType.findTypeName(toType);
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+            throwTypeCheckerException(relOp, msg, errCode, PigException.INPUT, null);
         }
 
         List<Operator> outputs = innerPlan.getSources();
         if (outputs.size() > 1) {
             int errCode = 2060;
             String msg = "Expected one output. Found " + outputs.size() + "  outputs.";
-            throw new TypeCheckerException(msg, errCode, PigException.BUG);
+            throwTypeCheckerException(relOp, msg, errCode, PigException.BUG, null);
         }
         LogicalExpression currentOutput = (LogicalExpression) outputs.get(0);
         TypeCheckingExpVisitor.collectCastWarning(
@@ -866,7 +875,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve COGroup output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
         }
 
         MultiMap<Integer, LogicalExpressionPlan> groupByPlans = 
@@ -889,7 +898,7 @@ public class TypeCheckingRelVisitor exte
                     String msg = "COGroup's inner plans can only"
                         + "have one output (leaf)" ;
                     msgCollector.collect(msg, MessageType.Error) ;
-                    throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+                    throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, null) ;
                 }
                 visitExpressionPlan(innerPlan, cg);
             }
@@ -935,7 +944,7 @@ public class TypeCheckingRelVisitor exte
                             String msg = "Sorry, group by complex types"
                                 + " will be supported soon" ;
                             msgCollector.collect(msg, MessageType.Error) ;
-                            throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+                            throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, null) ;
                         }
 
                         expectedType = groupBySchema.getField(j).type ;
@@ -953,7 +962,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve COGroup output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
         }
 
         try {
@@ -964,7 +973,7 @@ public class TypeCheckingRelVisitor exte
             int errCode = 1060;
             String msg = "Cannot resolve COGroup output schema" ;
             msgCollector.collect(msg, MessageType.Error) ;
-            throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+            throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
         }
     }
 

Modified: pig/trunk/src/org/apache/pig/parser/AstValidator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AstValidator.g?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AstValidator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AstValidator.g Mon Apr  4 18:31:28 2011
@@ -76,21 +76,20 @@ public String getErrorHeader(Recognition
 	return QueryParserUtils.generateErrorHeader( ex );
 }
 
-private void validateSchemaAliasName(Set<String> fieldNames, Token t)
+private void validateSchemaAliasName(Set<String> fieldNames, CommonTree node, String name)
 throws DuplicatedSchemaAliasException {
-    String name = t.getText();
     if( fieldNames.contains( name ) ) {
-        throw new DuplicatedSchemaAliasException( input, t, name );
+        throw new DuplicatedSchemaAliasException( input, 
+            new SourceLocation( (PigParserNode)node ), name );
     } else {
         fieldNames.add( name );
     }
 }
 
-private void validateAliasRef(Set<String> aliases, Token t)
+private void validateAliasRef(Set<String> aliases, CommonTree node, String alias)
 throws UndefinedAliasException {
-    String alias = t.getText();
     if( !aliases.contains( alias ) ) {
-        throw new UndefinedAliasException( input, t, alias );
+        throw new UndefinedAliasException( input, new SourceLocation( (PigParserNode)node ), alias );
     }
 }
 
@@ -120,11 +119,11 @@ general_statement : ^( STATEMENT ( alias
 parallel_clause : ^( PARALLEL INTEGER )
 ;
 
-alias returns[String name, Token token]
+alias returns[String name, CommonTree node]
  : IDENTIFIER
    { 
        $name = $IDENTIFIER.text;
-       $token = $IDENTIFIER.token;
+       $node = $IDENTIFIER;
    }
 ;
 
@@ -185,7 +184,7 @@ as_clause: ^( AS field_def_list )
 ;
 
 field_def[Set<String> fieldNames] throws Exception
- : ^( FIELD_DEF IDENTIFIER { validateSchemaAliasName( fieldNames, $IDENTIFIER.token ); } type? )
+ : ^( FIELD_DEF IDENTIFIER { validateSchemaAliasName( fieldNames, $IDENTIFIER, $IDENTIFIER.text ); } type? )
 ;
 
 field_def_list
@@ -243,13 +242,13 @@ group_item
            // For the first input
            $group_clause::arity = $join_group_by_clause.exprCount;
        } else if( $join_group_by_clause.exprCount != $group_clause::arity ) {
-           throw new ParserValidationException( input, new SourceLocation( (CommonTree)$group_item.start ),
+           throw new ParserValidationException( input, new SourceLocation( (PigParserNode)$group_item.start ),
                "The arity of the group by columns do not match." );
        }
    }
 ;
 
-rel : alias {  validateAliasRef( aliases, $alias.token ); }
+rel : alias {  validateAliasRef( aliases, $alias.node, $alias.name ); }
     | op_clause
 ;
 
@@ -386,7 +385,7 @@ join_item
            // For the first input
            $join_clause::arity = $join_group_by_clause.exprCount;
        } else if( $join_group_by_clause.exprCount != $join_clause::arity ) {
-           throw new ParserValidationException( input, new SourceLocation( (CommonTree)$join_item.start ),
+           throw new ParserValidationException( input, new SourceLocation( (PigParserNode)$join_item.start ),
                "The arity of the join columns do not match." );
        }
    }

Modified: pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java Mon Apr  4 18:31:28 2011
@@ -19,15 +19,14 @@
 package org.apache.pig.parser;
 
 import org.antlr.runtime.IntStream;
-import org.antlr.runtime.Token;
 
 public class DuplicatedSchemaAliasException extends PigRecognitionException {
     private static final long serialVersionUID = 1L;
     
     private String alias;
     
-    public DuplicatedSchemaAliasException(IntStream input, Token t, String alias) {
-        super( input, new SourceLocation( t ) );
+    public DuplicatedSchemaAliasException(IntStream input, SourceLocation loc, String alias) {
+        super( input, loc );
         this.alias = alias;
     }
     

Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java Mon Apr  4 18:31:28 2011
@@ -28,10 +28,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
-import org.antlr.grammar.v3.ANTLRv3Parser.range_return;
 import org.antlr.runtime.IntStream;
 import org.antlr.runtime.RecognitionException;
-import org.apache.jute.InputArchive;
 import org.apache.pig.ExecType;
 import org.apache.pig.FuncSpec;
 import org.apache.pig.LoadFunc;
@@ -151,53 +149,56 @@ public class LogicalPlanBuilder {
         return new LOFilter( plan );
     }
 
-    String buildFilterOp(LOFilter op, String alias, String inputAlias, LogicalExpressionPlan expr) {
+    String buildFilterOp(SourceLocation loc, LOFilter op, String alias, String inputAlias, LogicalExpressionPlan expr) {
         op.setFilterPlan( expr );
-        return buildOp( op, alias, inputAlias, null );
+        return buildOp( loc, op, alias, inputAlias, null );
     }
     
-    String buildDistinctOp(String alias, String inputAlias, String partitioner) {
+    String buildDistinctOp(SourceLocation loc, String alias, String inputAlias, String partitioner) {
         LODistinct op = new LODistinct( plan );
-        return buildOp( op, alias, inputAlias, partitioner );
+        return buildOp( loc, op, alias, inputAlias, partitioner );
     }
 
-    String buildLimitOp(String alias, String inputAlias, long limit) {
+    String buildLimitOp(SourceLocation loc, String alias, String inputAlias, long limit) {
         LOLimit op = new LOLimit( plan, limit );
-        return buildOp( op, alias, inputAlias, null );
+        return buildOp( loc, op, alias, inputAlias, null );
     }
     
-    String buildSampleOp(String alias, String inputAlias, double value) {
+    String buildSampleOp(SourceLocation loc, String alias, String inputAlias, double value,
+            SourceLocation valLoc) {
         LogicalExpressionPlan filterPlan = new LogicalExpressionPlan();
         //  Generate a filter condition.
         LogicalExpression konst = new ConstantExpression( filterPlan, value);
+        konst.setLocation( valLoc );
         UserFuncExpression udf = new UserFuncExpression( filterPlan, new FuncSpec( RANDOM.class.getName() ) );
         new LessThanEqualExpression( filterPlan, udf, konst );
-        return buildFilterOp( new LOFilter( plan ), alias, inputAlias, filterPlan );
+        LOFilter filter = new LOFilter( plan );
+        return buildFilterOp( loc, filter, alias, inputAlias, filterPlan );
     }
     
-    String buildUnionOp(String alias, List<String> inputAliases, boolean onSchema) {
+    String buildUnionOp(SourceLocation loc, String alias, List<String> inputAliases, boolean onSchema) {
         LOUnion op = new LOUnion( plan, onSchema );
-        return buildOp( op, alias, inputAliases, null );
+        return buildOp( loc, op, alias, inputAliases, null );
     }
 
-    String buildSplitOp(String inputAlias) {
+    String buildSplitOp(SourceLocation loc, String inputAlias) {
         LOSplit op = new LOSplit( plan );
-        return buildOp( op, null, inputAlias, null );
+        return buildOp( loc, op, null, inputAlias, null );
     }
     
     LOSplitOutput createSplitOutputOp() {
         return  new LOSplitOutput( plan );
     }
     
-    String buildSplitOutputOp(LOSplitOutput op, String alias, String inputAlias,
+    String buildSplitOutputOp(SourceLocation loc, LOSplitOutput op, String alias, String inputAlias,
             LogicalExpressionPlan filterPlan) {
         op.setFilterPlan( filterPlan );
-        return buildOp ( op, alias, inputAlias, null );
+        return buildOp ( loc, op, alias, inputAlias, null );
     }
     
-    String buildCrossOp(String alias, List<String> inputAliases, String partitioner) {
+    String buildCrossOp(SourceLocation loc, String alias, List<String> inputAliases, String partitioner) {
         LOCross op = new LOCross( plan );
-        return buildOp ( op, alias, inputAliases, partitioner );
+        return buildOp ( loc, op, alias, inputAliases, partitioner );
     }
     
     LOSort createSortOp() {
@@ -213,7 +214,7 @@ public class LogicalPlanBuilder {
                 ascFlags.add(true);
         }
         sort.setAscendingCols( ascFlags );
-        alias = buildOp( sort, alias, inputAlias, null );
+        alias = buildOp( loc, sort, alias, inputAlias, null );
         try {
             (new ProjectStarExpander(sort.getPlan())).visit(sort);
         } catch (FrontendException e) {
@@ -272,7 +273,7 @@ public class LogicalPlanBuilder {
         op.setJoinType( jt );
         op.setInnerFlags( flags );
         op.setJoinPlans( joinPlans );
-        alias = buildOp( op, alias, inputAliases, partitioner );
+        alias = buildOp( loc, op, alias, inputAliases, partitioner );
         try {
             (new ProjectStarExpander(op.getPlan())).visit(op);
         } catch (FrontendException e) {
@@ -313,7 +314,7 @@ public class LogicalPlanBuilder {
         op.setExpressionPlans( expressionPlans );
         op.setGroupType( gt );
         op.setInnerFlags( flags );
-        alias = buildOp( op, alias, inputAliases, partitioner );
+        alias = buildOp( loc, op, alias, inputAliases, partitioner );
         try {
             (new ProjectStarExpander(op.getPlan())).visit(op);
         } catch (FrontendException e) {
@@ -354,19 +355,22 @@ public class LogicalPlanBuilder {
         
         FileSpec loader = new FileSpec( absolutePath, funcSpec );
         LOLoad op = new LOLoad( loader, schema, plan, ConfigurationUtil.toConfiguration( pigContext.getProperties() ) );
-        return buildOp( op, alias, new ArrayList<String>(), null );
+        return buildOp( loc, op, alias, new ArrayList<String>(), null );
     }
     
-    private String buildOp(LogicalRelationalOperator op, String alias, String inputAlias, String partitioner) {
+    private String buildOp(SourceLocation loc, LogicalRelationalOperator op, String alias, 
+    		String inputAlias, String partitioner) {
         List<String> inputAliases = new ArrayList<String>();
         if( inputAlias != null )
             inputAliases.add( inputAlias );
-        return buildOp( op, alias, inputAliases, partitioner );
+        return buildOp( loc, op, alias, inputAliases, partitioner );
     }
     
-    private String buildOp(LogicalRelationalOperator op, String alias, List<String> inputAliases, String partitioner) {
+    private String buildOp(SourceLocation loc, LogicalRelationalOperator op, String alias, 
+    		List<String> inputAliases, String partitioner) {
         setAlias( op, alias );
         setPartitioner( op, partitioner );
+        op.setLocation( loc );
         plan.add( op );
         for( String a : inputAliases ) {
             Operator pred = operators.get( a );
@@ -410,7 +414,7 @@ public class LogicalPlanBuilder {
         
         FileSpec fileSpec = new FileSpec( absPath, funcSpec );
         LOStore op = new LOStore( plan, fileSpec );
-        return buildOp( op, alias, inputAlias, null );
+        return buildOp( loc, op, alias, inputAlias, null );
     }
     
     LOForEach createForeachOp() {
@@ -420,7 +424,7 @@ public class LogicalPlanBuilder {
     String buildForeachOp(SourceLocation loc, LOForEach op, String alias, String inputAlias, LogicalPlan innerPlan)
     throws ParserValidationException {
         op.setInnerPlan( innerPlan );
-        alias = buildOp( op, alias, inputAlias, null );
+        alias = buildOp( loc, op, alias, inputAlias, null );
         try {
             (new ProjectStarExpander(op.getPlan())).visit(op);
         } catch (FrontendException e) {
@@ -456,6 +460,7 @@ public class LogicalPlanBuilder {
         gen.setFlattenFlags( flags );
         gen.setUserDefinedSchema( schemas );
         innerPlan.add( gen );
+        gen.setLocation( loc );
         for( Operator input : inputs ) {
             innerPlan.connect( input, gen );
         }
@@ -526,7 +531,7 @@ public class LogicalPlanBuilder {
     private static void setupInnerLoadAndProj(LOInnerLoad innerLoad,
             ProjectExpression projExpr, LogicalPlan lp,
             ArrayList<Operator> inputs) {
-        
+        innerLoad.setLocation( projExpr.getLocation() );
         projExpr.setInputNum( inputs.size() );
         projExpr.setColNum( -1 ); // Projection Expression on InnerLoad is always (*).
         lp.add( innerLoad );
@@ -549,10 +554,12 @@ public class LogicalPlanBuilder {
             op = operators.get( colAlias );
             if( op == null ) {
                 op = createInnerLoad(loc, innerPlan, foreach, colAlias );
+                op.setLocation( projExpr.getLocation() );
                 innerPlan.add( op );
             }
         } else {
             op = new LOInnerLoad( innerPlan, foreach, projExpr.getColNum() );
+            op.setLocation( projExpr.getLocation() );
             innerPlan.add( op );
         }
         return op;
@@ -631,7 +638,7 @@ public class LogicalPlanBuilder {
     throws RecognitionException {
         try {
             LOStream op = new LOStream( plan, pigContext.createExecutableManager(), command, schema );
-            return buildOp( op, alias, inputAlias, null );
+            return buildOp( loc, op, alias, inputAlias, null );
         } catch (ExecException ex) {
             throw new PlanGenerationFailureException( input, loc, ex );
         }
@@ -646,7 +653,7 @@ public class LogicalPlanBuilder {
             pigContext.addJar( inputJar );
             for( String path : paths )
                 pigContext.addJar( path );
-            buildOp( op, null, new ArrayList<String>(), null );
+            buildOp( loc, op, null, new ArrayList<String>(), null );
             ((LOStore)operators.get( storeAlias )).setTmpStore(true);
             plan.connect( operators.get( storeAlias ), op );
             LOLoad load = (LOLoad)operators.get( loadAlias );
@@ -734,6 +741,8 @@ public class LogicalPlanBuilder {
     LogicalExpression buildProjectExpr(SourceLocation loc, LogicalExpressionPlan plan, LogicalRelationalOperator op,
             Map<String, LogicalExpressionPlan> exprPlans, String colAlias, int col)
     throws RecognitionException {
+        ProjectExpression result = null;
+        
         if( colAlias != null ) {
             LogicalExpressionPlan exprPlan = exprPlans.get( colAlias );
             if( exprPlan != null ) {
@@ -759,14 +768,14 @@ public class LogicalPlanBuilder {
                 }
                 return (LogicalExpression)planCopy.getSources().get( 0 );// get the root of the plan
             } else {
-                try {
-                    return new ProjectExpression( plan, 0, colAlias, op );
-                } catch (FrontendException e) {
-                    throw new ParserValidationException(intStream, loc, e);
-                }
+                result = new ProjectExpression( plan, 0, colAlias, op );
+                result.setLocation( loc );
+                return result;
             }
         }
-        return new ProjectExpression( plan, 0, col, op );
+        result = new ProjectExpression( plan, 0, col, op );
+        result.setLocation( loc );
+        return result;
     }
 
     /**
@@ -777,14 +786,12 @@ public class LogicalPlanBuilder {
             LogicalExpressionPlan plan, LogicalRelationalOperator relOp,
             int input, String colAlias, int col)
     throws ParserValidationException {
-    
-        if( colAlias != null )
-            try {
-                return new ProjectExpression( plan, input, colAlias, relOp );
-            } catch (FrontendException e) {
-                throw new ParserValidationException(intStream, loc, e);
-            }
-        return new ProjectExpression( plan, input, col, relOp );
+        ProjectExpression result = null;
+        result = colAlias != null ?
+            new ProjectExpression( plan, input, colAlias, relOp ) :
+            new ProjectExpression( plan, input, col, relOp );
+        result.setLocation( loc );
+        return result;
     }
 
     /**
@@ -888,7 +895,9 @@ public class LogicalPlanBuilder {
             funcSpec = new FuncSpec( funcName );
         }
         
-        return new UserFuncExpression( plan, funcSpec, args );
+        LogicalExpression le = new UserFuncExpression( plan, funcSpec, args );
+        le.setLocation( loc );
+        return le;
     }
     
     private long getNextId() {
@@ -900,27 +909,28 @@ public class LogicalPlanBuilder {
     }
     
     // Build operator for foreach inner plan.
-    Operator buildNestedFilterOp(LOFilter op, LogicalPlan plan, String alias, 
+    Operator buildNestedFilterOp(SourceLocation loc, LOFilter op, LogicalPlan plan, String alias, 
             Operator inputOp, LogicalExpressionPlan expr) {
         op.setFilterPlan( expr );
-        buildNestedOp( plan, op, alias, inputOp );
+        buildNestedOp( loc, plan, op, alias, inputOp );
         return op;
     }
 
-    Operator buildNestedDistinctOp(LogicalPlan plan, String alias, Operator inputOp) {
+    Operator buildNestedDistinctOp(SourceLocation loc, LogicalPlan plan, String alias, Operator inputOp) {
         LODistinct op = new LODistinct( plan );
-        buildNestedOp( plan, op, alias, inputOp );
+        buildNestedOp( loc, plan, op, alias, inputOp );
         return op;
     }
 
-    Operator buildNestedLimitOp(LogicalPlan plan, String alias, Operator inputOp, long limit) {
+    Operator buildNestedLimitOp(SourceLocation loc, LogicalPlan plan, String alias, Operator inputOp, long limit) {
         LOLimit op = new LOLimit( plan, limit );
-        buildNestedOp( plan, op, alias, inputOp );
+        buildNestedOp( loc, plan, op, alias, inputOp );
         return op;
     }
     
-    private void buildNestedOp(LogicalPlan plan, LogicalRelationalOperator op,
+    private void buildNestedOp(SourceLocation loc, LogicalPlan plan, LogicalRelationalOperator op,
             String alias, Operator inputOp) {
+        op.setLocation( loc );
         setAlias( op, alias );
         plan.add( op );
         plan.connect( inputOp, op );
@@ -945,7 +955,7 @@ public class LogicalPlanBuilder {
         }
     }
     
-    Operator buildNestedSortOp(LOSort op, LogicalPlan plan, String alias, Operator inputOp,
+    Operator buildNestedSortOp(SourceLocation loc, LOSort op, LogicalPlan plan, String alias, Operator inputOp,
             List<LogicalExpressionPlan> plans, 
             List<Boolean> ascFlags, FuncSpec fs) {
         op.setSortColPlans( plans );
@@ -955,14 +965,11 @@ public class LogicalPlanBuilder {
         }
         op.setAscendingCols( ascFlags );
         op.setUserFunc( fs );
-        buildNestedOp( plan, op, alias, inputOp );
+        buildNestedOp( loc, plan, op, alias, inputOp );
         return op;
     }
     
-    Operator buildNestedProjectOp(
-            SourceLocation loc,
-            LogicalPlan innerPlan,
-            LOForEach foreach, 
+    Operator buildNestedProjectOp(SourceLocation loc, LogicalPlan innerPlan, LOForEach foreach, 
             Map<String, Operator> operators,
             String alias,
             ProjectExpression projExpr,
@@ -979,15 +986,18 @@ public class LogicalPlanBuilder {
             } else {
                 // Assuming that ProjExpr refers to a column by name. Create an LOInnerLoad
                 input = createInnerLoad( loc, innerPlan, foreach, colAlias );
+                input.setLocation( projExpr.getLocation() );
             }
         } else {
             // ProjExpr refers to a column by number.
             input = new LOInnerLoad( innerPlan, foreach, projExpr.getColNum() );
+            input.setLocation( projExpr.getLocation() );
         }
         
         LogicalPlan lp = new LogicalPlan(); // f's inner plan
         LOForEach f = new LOForEach( innerPlan );
         f.setInnerPlan( lp );
+        f.setLocation( loc );
         LOGenerate gen = new LOGenerate( lp );
         boolean[] flatten = new boolean[exprPlans.size()];
         
@@ -997,6 +1007,7 @@ public class LogicalPlanBuilder {
             String al = pe.getColAlias();
             LOInnerLoad iload = ( al == null ) ?  
                     new LOInnerLoad( lp, f, pe.getColNum() ) : createInnerLoad(loc, lp, f, al );
+            iload.setLocation( pe.getLocation() );
             pe.setColNum( -1 );
             pe.setInputNum( innerLoads.size() );
             pe.setAttachedRelationalOp( gen );

Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g Mon Apr  4 18:31:28 2011
@@ -233,7 +233,7 @@ cmd[String alias] returns[StreamingComma
 @init {
     List<String> shipPaths = new ArrayList<String>();
     List<String> cachePaths = new ArrayList<String>();
-    SourceLocation loc = new SourceLocation( (CommonTree)$cmd.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$cmd.start );
 }
  : ^( EXECCOMMAND ( ship_clause[shipPaths] | cache_caluse[cachePaths] | input_clause | output_clause | error_clause )* )
    {
@@ -310,7 +310,7 @@ error_clause returns[String dir, Integer
 load_clause returns[String alias]
  : ^( LOAD filename func_clause[FunctionType.LOADFUNC]? as_clause? )
   {
-      SourceLocation loc = new SourceLocation( (CommonTree)$load_clause.start );
+      SourceLocation loc = new SourceLocation( (PigParserNode)$load_clause.start );
       $alias = builder.buildLoadOp( loc, $statement::alias,
           $filename.filename, $func_clause.funcSpec, $as_clause.logicalSchema  );
   }
@@ -419,7 +419,7 @@ map_type returns[LogicalSchema logicalSc
 
 func_clause[byte ft] returns[FuncSpec funcSpec]
 @init {
-    SourceLocation loc = new SourceLocation( (CommonTree)$func_clause.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$func_clause.start );
 }
  : ^( FUNC_REF func_name )
    {
@@ -468,7 +468,7 @@ scope GScope;
     $group_clause::inputAliases = new ArrayList<String>();
     $group_clause::innerFlags = new ArrayList<Boolean>();
     GROUPTYPE groupType = GROUPTYPE.REGULAR;
-    SourceLocation loc = new SourceLocation( (CommonTree)$group_clause.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$group_clause.start );
 }
  : ^( GROUP group_item+ ( group_type { groupType = $group_type.type; ((LOCogroup)$GScope::currentOp).pinOption(LOCogroup.OPTION_GROUPTYPE); } )? partition_clause? )
    {
@@ -487,7 +487,7 @@ scope GScope;
 group_type returns[GROUPTYPE type]
  : QUOTEDSTRING
    {
-       $type =builder.parseGroupType( $QUOTEDSTRING.text, new SourceLocation( $QUOTEDSTRING.token ) );
+       $type =builder.parseGroupType( $QUOTEDSTRING.text, new SourceLocation( (PigParserNode)$QUOTEDSTRING ) );
    } 
 ;
 
@@ -500,7 +500,8 @@ group_item
          | ALL 
          {
              LogicalExpressionPlan plan = new LogicalExpressionPlan();
-             new ConstantExpression( plan, "all");
+             ConstantExpression ce = new ConstantExpression( plan, "all");
+             ce.setLocation( new SourceLocation( (PigParserNode)$ALL ) );
              List<LogicalExpressionPlan> plans = new ArrayList<LogicalExpressionPlan>( 1 );
              plans.add( plan );
              $group_clause::groupPlans.put( $group_clause::inputIndex, plans );
@@ -508,7 +509,8 @@ group_item
          | ANY
          {
              LogicalExpressionPlan plan = new LogicalExpressionPlan();
-             new UserFuncExpression( plan, new FuncSpec( GFAny.class.getName() ) );
+             UserFuncExpression udf = new UserFuncExpression( plan, new FuncSpec( GFAny.class.getName() ) );
+             udf.setLocation( new SourceLocation( (PigParserNode)$ANY ) );
              List<LogicalExpressionPlan> plans = new ArrayList<LogicalExpressionPlan>( 1 );
              plans.add( plan );
              $group_clause::groupPlans.put( $group_clause::inputIndex, plans );
@@ -553,8 +555,8 @@ flatten_generated_item returns[LogicalEx
    | expr[$plan]
    | STAR
      {
-         SourceLocation loc = new SourceLocation( $STAR.token );
-         builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+         builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp,
+             $statement::inputIndex, null, -1 );
      }
    )
    ( field_def_list { $schema = $field_def_list.schema; } )?
@@ -567,7 +569,7 @@ flatten_clause[LogicalExpressionPlan pla
 store_clause returns[String alias]
  : ^( STORE rel filename func_clause[FunctionType.STOREFUNC]? )
    {
-       SourceLocation loc = new SourceLocation( $STORE.token );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$STORE );
        $alias= builder.buildStoreOp( loc, $statement::alias,
           $statement::inputAlias, $filename.filename, $func_clause.funcSpec );
    }
@@ -581,8 +583,9 @@ scope GScope;
 }
  : ^( FILTER rel cond[exprPlan] )
    {
-       $alias = builder.buildFilterOp( (LOFilter)$GScope::currentOp, $statement::alias,
-          $statement::inputAlias, exprPlan );
+       $alias = builder.buildFilterOp( new SourceLocation( (PigParserNode)$FILTER ),
+           (LOFilter)$GScope::currentOp, $statement::alias,
+           $statement::inputAlias, exprPlan );
    }
 ;
 
@@ -590,48 +593,61 @@ cond[LogicalExpressionPlan exprPlan] ret
  : ^( OR left = cond[exprPlan] right = cond[exprPlan] )
    {
        $expr = new OrExpression( $exprPlan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$OR ) );
    }
  | ^( AND left = cond[exprPlan] right = cond[exprPlan] )
    {
        $expr = new AndExpression( $exprPlan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$AND ) );
    }
  | ^( NOT c = cond[exprPlan] )
    {
        $expr = new NotExpression( $exprPlan, $c.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$NOT ) );
    }
  | ^( NULL expr[$exprPlan] NOT? )
    {
        $expr = new IsNullExpression( $exprPlan, $expr.expr );
-       if( $NOT != null )
+       $expr.setLocation( new SourceLocation( (PigParserNode)$NULL ) );
+       if( $NOT != null ) {
            $expr = new NotExpression( $exprPlan, $expr );
+           $expr.setLocation( new SourceLocation( (PigParserNode)$NOT ) );
+       }
    }
  | ^( rel_op_eq e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new EqualExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_eq.start ) );
    } 
  | ^( rel_op_ne e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new NotEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_ne.start ) );
    } 
  | ^( rel_op_lt e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new LessThanExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_lt.start ) );
    } 
  | ^( rel_op_lte e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new LessThanEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_lte.start ) );
    }
  | ^( rel_op_gt e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new GreaterThanExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_gt.start ) );
    } 
  | ^( rel_op_gte e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new GreaterThanEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_gte.start ) );
    }
  | ^( STR_OP_MATCHES e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
    {
        $expr = new RegexExpression( $exprPlan, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$STR_OP_MATCHES ) );
    }
  | func_eval[$exprPlan]
    {
@@ -645,7 +661,7 @@ func_eval[LogicalExpressionPlan plan] re
 }
  : ^( FUNC_EVAL func_name ( real_arg[$plan] { args.add( $real_arg.expr ); } )* )
    {
-       SourceLocation loc = new SourceLocation( (CommonTree)$func_eval.start );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$func_name.start );
        $expr = builder.buildUDF( loc, $plan, $func_name.funcName, args );
    }
 ;
@@ -654,8 +670,8 @@ real_arg [LogicalExpressionPlan plan] re
  : e = expr[$plan] { $expr = $e.expr; }
  | STAR
    {
-       SourceLocation loc = new SourceLocation( $STAR.token );
-       $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+       $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp, 
+           $statement::inputIndex, null, -1 );
    }
 ;
 
@@ -663,22 +679,27 @@ expr[LogicalExpressionPlan plan] returns
  : ^( PLUS left = expr[$plan] right = expr[$plan] )
    {
        $expr = new AddExpression( $plan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$PLUS ) );
    }
  | ^( MINUS left = expr[$plan] right = expr[$plan] )
    {
        $expr = new SubtractExpression( $plan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$MINUS ) );
    }
  | ^( STAR left = expr[$plan] right = expr[$plan] )
    {
        $expr = new MultiplyExpression( $plan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$STAR ) );
    }
  | ^( DIV left = expr[$plan] right = expr[$plan] )
    {
        $expr = new DivideExpression( $plan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$DIV ) );
    }
  | ^( PERCENT left = expr[$plan] right = expr[$plan] )
    {
        $expr = new ModExpression( $plan, $left.expr, $right.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$PERCENT ) );
    }
  | const_expr[$plan]
    {
@@ -691,10 +712,12 @@ expr[LogicalExpressionPlan plan] returns
  | ^( NEG e = expr[$plan] )
    {
        $expr = new NegativeExpression( $plan, $e.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$e.start ) );
    }
  | ^( CAST_EXPR type_cast e = expr[$plan] ) // cast expr
    {
        $expr = new CastExpression( $plan, $e.expr, $type_cast.fieldSchema );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$type_cast.start ) );
    }
  | ^( EXPR_IN_PAREN e = expr[$plan] ) // unary expr
    {
@@ -741,7 +764,7 @@ bag_type_cast returns[LogicalSchema logi
 var_expr[LogicalExpressionPlan plan] returns[LogicalExpression expr]
 @init {
     List<Object> columns = null;
-    SourceLocation loc = new SourceLocation( (CommonTree)$var_expr.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$var_expr.start );
 }
  : projectable_expr[$plan] { $expr = $projectable_expr.expr; }
    ( dot_proj 
@@ -782,6 +805,7 @@ var_expr[LogicalExpressionPlan plan] ret
          } else {
              DereferenceExpression e = new DereferenceExpression( $plan );
              e.setRawColumns( $dot_proj.cols );
+             e.setLocation( new SourceLocation( (PigParserNode)$dot_proj.start ) );
              $plan.connect( e, $expr );
              $expr = e;
          }
@@ -789,6 +813,7 @@ var_expr[LogicalExpressionPlan plan] ret
    | pound_proj
      {
          MapLookupExpression e = new MapLookupExpression( $plan, $pound_proj.key );
+         e.setLocation( new SourceLocation( (PigParserNode)$pound_proj.start ) );
          $plan.connect( e, $expr );
          $expr = e;
      }
@@ -852,7 +877,7 @@ col_index returns[Integer col]
 col_range[LogicalExpressionPlan plan] returns[LogicalExpression expr]
  :  ^(COL_RANGE (startExpr = col_ref[$plan])? DOUBLE_PERIOD (endExpr = col_ref[$plan])? )
     {
-        SourceLocation loc = new SourceLocation(  (CommonTree)$col_range.start );
+        SourceLocation loc = new SourceLocation( (PigParserNode)$col_range.start );
         $expr = builder.buildRangeProjectExpr(
                     loc, plan, $GScope::currentOp,
                     $statement::inputIndex, 
@@ -870,18 +895,19 @@ bin_expr[LogicalExpressionPlan plan] ret
  : ^( BIN_EXPR cond[$plan] e1 = expr[$plan] e2 = expr[$plan] )
    {
        $expr = new BinCondExpression( $plan, $cond.expr, $e1.expr, $e2.expr );
+       $expr.setLocation( new SourceLocation( (PigParserNode)$bin_expr.start ) );
    }
 ;
 
 limit_clause returns[String alias]
  : ^( LIMIT rel INTEGER  )
    {
-       $alias = builder.buildLimitOp( $statement::alias,
+       $alias = builder.buildLimitOp( new SourceLocation( (PigParserNode)$LIMIT ), $statement::alias,
            $statement::inputAlias, Long.valueOf( $INTEGER.text ) );
    }
  | ^( LIMIT rel LONGINTEGER )
    {
-       $alias = builder.buildLimitOp( $statement::alias,
+       $alias = builder.buildLimitOp( new SourceLocation( (PigParserNode)$LIMIT ), $statement::alias,
            $statement::inputAlias, builder.parseLong( $LONGINTEGER.text ) );
    }
 ;
@@ -889,8 +915,9 @@ limit_clause returns[String alias]
 sample_clause returns[String alias]
  : ^( SAMPLE rel DOUBLENUMBER )
    {
-       $alias = builder.buildSampleOp( $statement::alias,
-           $statement::inputAlias, Double.valueOf( $DOUBLENUMBER.text ) );
+       $alias = builder.buildSampleOp( new SourceLocation( (PigParserNode)$SAMPLE ), $statement::alias,
+           $statement::inputAlias, Double.valueOf( $DOUBLENUMBER.text ),
+           new SourceLocation( (PigParserNode)$DOUBLENUMBER ) );
    }
 ;
 
@@ -901,7 +928,7 @@ scope GScope;
 }
  : ^( ORDER rel order_by_clause func_clause[FunctionType.COMPARISONFUNC]? )
    {
-       SourceLocation loc = new SourceLocation( $ORDER.token );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$ORDER );
        $alias = builder.buildSortOp( loc, (LOSort)$GScope::currentOp, $statement::alias,
            $statement::inputAlias, $order_by_clause.plans, 
            $order_by_clause.ascFlags, $func_clause.funcSpec );
@@ -915,8 +942,8 @@ order_by_clause returns[List<LogicalExpr
 }
  : STAR {
        LogicalExpressionPlan plan = new LogicalExpressionPlan();
-       SourceLocation loc = new SourceLocation( $STAR.token );
-       builder.buildProjectExpr(loc, plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+       builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), plan, $GScope::currentOp,
+           $statement::inputIndex, null, -1 );
        $plans.add( plan );
    }
    ( ASC { $ascFlags.add( true ); } | DESC { $ascFlags.add( false ); } )?
@@ -939,7 +966,7 @@ order_col returns[LogicalExpressionPlan 
 distinct_clause returns[String alias]
  : ^( DISTINCT rel partition_clause? )
    {
-       $alias = builder.buildDistinctOp( $statement::alias,
+       $alias = builder.buildDistinctOp( new SourceLocation( (PigParserNode)$DISTINCT ), $statement::alias,
           $statement::inputAlias, $partition_clause.partitioner );
    }
 ;
@@ -954,7 +981,7 @@ partition_clause returns[String partitio
 cross_clause returns[String alias]
  : ^( CROSS rel_list partition_clause? )
    {
-       $alias = builder.buildCrossOp( $statement::alias,
+       $alias = builder.buildCrossOp( new SourceLocation( (PigParserNode)$CROSS ), $statement::alias,
           $rel_list.aliasList, $partition_clause.partitioner );
    }
 ;
@@ -980,7 +1007,7 @@ scope GScope;
 }
  : ^( JOIN join_sub_clause join_type? partition_clause? )
    {
-       SourceLocation loc = new SourceLocation( $JOIN.token );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$JOIN );
        $alias = builder.buildJoinOp( loc, (LOJoin)$GScope::currentOp, $statement::alias,
           $join_clause::inputAliases, $join_clause::joinPlans,
           $join_type.type, $join_clause::innerFlags, $partition_clause.partitioner );
@@ -990,7 +1017,7 @@ scope GScope;
 join_type returns[JOINTYPE type]
  : QUOTEDSTRING
    {
-       $type = builder.parseJoinType( $QUOTEDSTRING.text, new SourceLocation( $QUOTEDSTRING.token ) );
+       $type = builder.parseJoinType( $QUOTEDSTRING.text, new SourceLocation( (PigParserNode)$QUOTEDSTRING ) );
    }
 ;
 
@@ -1031,8 +1058,8 @@ join_group_by_expr returns[LogicalExpres
  | expr[$plan]
  | STAR 
    {
-       SourceLocation loc = new SourceLocation( $STAR.token );
-       builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+       builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp, 
+           $statement::inputIndex, null, -1 );
    }
 ;
 
@@ -1042,7 +1069,8 @@ union_clause returns[String alias]
 }
  : ^( UNION ( ONSCHEMA { onSchema = true; } )? rel_list )
    {
-      $alias = builder.buildUnionOp( $statement::alias, $rel_list.aliasList, onSchema );
+      $alias = builder.buildUnionOp( new SourceLocation( (PigParserNode)$UNION ), $statement::alias, 
+          $rel_list.aliasList, onSchema );
    }
 ;
 
@@ -1057,7 +1085,7 @@ scope GScope;
 }
  : ^( FOREACH rel foreach_plan )
    {
-       SourceLocation loc = new SourceLocation( $FOREACH.token );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$FOREACH );
        $alias = builder.buildForeachOp( loc, $foreach_clause::foreachOp, $statement::alias,
           $statement::inputAlias, $foreach_plan.plan );
    }
@@ -1102,9 +1130,9 @@ scope GScope;
                  }
                )+
     )
-   {   SourceLocation loc = new SourceLocation( $GENERATE.token );
-       builder.buildGenerateOp(loc, $foreach_clause::foreachOp, (LOGenerate)$GScope::currentOp,
-           $foreach_plan::operators,
+   {   
+       builder.buildGenerateOp( new SourceLocation( (PigParserNode)$GENERATE ), $foreach_clause::foreachOp, 
+           (LOGenerate)$GScope::currentOp, $foreach_plan::operators,
            plans, flattenFlags, schemas );
    }
 ;
@@ -1145,8 +1173,8 @@ nested_proj[String alias] returns[Operat
         }
       )+ )
    {
-       SourceLocation loc = new SourceLocation(  (CommonTree)$nested_proj.start);
-       $op = builder.buildNestedProjectOp(loc, $foreach_plan::innerPlan, $foreach_clause::foreachOp, 
+       SourceLocation loc = new SourceLocation( (PigParserNode)$cr0.start );
+       $op = builder.buildNestedProjectOp( loc, $foreach_plan::innerPlan, $foreach_clause::foreachOp, 
            $foreach_plan::operators, $alias, (ProjectExpression)$cr0.expr, plans );
    }
 ;
@@ -1160,7 +1188,8 @@ scope GScope;
 }
  : ^( FILTER nested_op_input cond[plan] )
    {
-       $op = builder.buildNestedFilterOp( (LOFilter)$GScope::currentOp, $foreach_plan::innerPlan, $alias, 
+       SourceLocation loc = new SourceLocation( (PigParserNode)$FILTER );
+       $op = builder.buildNestedFilterOp( loc, (LOFilter)$GScope::currentOp, $foreach_plan::innerPlan, $alias, 
            $nested_op_input.op, plan );
    }
 ;
@@ -1173,7 +1202,8 @@ scope GScope;
 }
  : ^( ORDER nested_op_input order_by_clause func_clause[FunctionType.COMPARISONFUNC]? )
    {
-       $op = builder.buildNestedSortOp( (LOSort)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
+       SourceLocation loc = new SourceLocation( (PigParserNode)$ORDER );
+       $op = builder.buildNestedSortOp( loc, (LOSort)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
            $nested_op_input.op, 
            $order_by_clause.plans, $order_by_clause.ascFlags, $func_clause.funcSpec );
    }
@@ -1185,7 +1215,8 @@ nested_distinct[String alias] returns[Op
 }
  : ^( DISTINCT nested_op_input )
    {
-       $op = builder.buildNestedDistinctOp( $foreach_plan::innerPlan, $alias, $nested_op_input.op );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$DISTINCT );
+       $op = builder.buildNestedDistinctOp( loc, $foreach_plan::innerPlan, $alias, $nested_op_input.op );
    }
 ;
 
@@ -1195,7 +1226,8 @@ nested_limit[String alias] returns[Opera
 }
  : ^( LIMIT nested_op_input INTEGER )
    {
-       $op = builder.buildNestedLimitOp( $foreach_plan::innerPlan, $alias, $nested_op_input.op, 
+       SourceLocation loc = new SourceLocation( (PigParserNode)$LIMIT );
+       $op = builder.buildNestedLimitOp( loc, $foreach_plan::innerPlan, $alias, $nested_op_input.op, 
            Integer.valueOf( $INTEGER.text ) );
    }
 ;
@@ -1206,7 +1238,7 @@ nested_op_input returns[Operator op]
 }
  : col_ref[plan]
    {
-       SourceLocation loc = new SourceLocation( (CommonTree)$col_ref.start );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$col_ref.start );
        $op = builder.buildNestedOperatorInput( loc, $foreach_plan::innerPlan,
            $foreach_clause::foreachOp, $foreach_plan::operators, $col_ref.expr );
    }
@@ -1219,7 +1251,7 @@ nested_op_input returns[Operator op]
 stream_clause returns[String alias]
 @init {
     StreamingCommand cmd = null;
-    SourceLocation loc = new SourceLocation( (CommonTree)$stream_clause.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$stream_clause.start );
 }
  : ^( STREAM rel ( EXECCOMMAND { cmd = builder.buildCommand( loc, builder.unquote( $EXECCOMMAND.text ) ); } 
                  | IDENTIFIER 
@@ -1228,7 +1260,7 @@ stream_clause returns[String alias]
                        if( cmd == null ) {
                            String msg = "Undefined command-alias [" + $IDENTIFIER.text + "]";
                            throw new ParserValidationException( input, 
-                               new SourceLocation( $IDENTIFIER.token ), msg );
+                               new SourceLocation( (PigParserNode)$IDENTIFIER ), msg );
                        }
                    }
                  ) as_clause? )
@@ -1242,7 +1274,7 @@ mr_clause returns[String alias]
 @init {
     List<String> paths = new ArrayList<String>();
     String alias = $statement::alias;
-    SourceLocation loc = new SourceLocation( (CommonTree)$mr_clause.start );
+    SourceLocation loc = new SourceLocation( (PigParserNode)$mr_clause.start );
 }
  : ^( MAPREDUCE QUOTEDSTRING path_list[paths]? 
      { $statement::alias = null; } store_clause 
@@ -1256,8 +1288,14 @@ mr_clause returns[String alias]
 ;
 
 split_clause
- : ^( SPLIT rel { $statement::inputAlias = builder.buildSplitOp( $statement::inputAlias ); } 
-      split_branch+ )
+ : ^( SPLIT
+      rel 
+      { 
+          SourceLocation loc = new SourceLocation( (PigParserNode)$SPLIT );
+          $statement::inputAlias = builder.buildSplitOp( loc, $statement::inputAlias );
+      } 
+      split_branch+
+    )
 ;
 
 split_branch
@@ -1268,7 +1306,8 @@ scope GScope;
 }
  : ^( SPLIT_BRANCH alias cond[splitPlan] )
    {
-       builder.buildSplitOutputOp( (LOSplitOutput)$GScope::currentOp, $alias.name,
+       SourceLocation loc = new SourceLocation( (PigParserNode)$alias.start );
+       builder.buildSplitOutputOp( loc, (LOSplitOutput)$GScope::currentOp, $alias.name,
            $statement::inputAlias, splitPlan );
    }
 ;
@@ -1281,13 +1320,12 @@ col_ref[LogicalExpressionPlan plan] retu
 alias_col_ref[LogicalExpressionPlan plan] returns[LogicalExpression expr]
  : GROUP 
    {
-       SourceLocation loc = new SourceLocation( $GROUP.token );
-       $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp, 
+       $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$GROUP ), $plan, $GScope::currentOp, 
            $statement::inputIndex, $GROUP.text, 0 );
    }
  | scoped_alias_col_ref
    {
-       SourceLocation loc = new SourceLocation( (CommonTree)$scoped_alias_col_ref.start );
+       SourceLocation loc = new SourceLocation( (PigParserNode)$scoped_alias_col_ref.start );
        String alias = $scoped_alias_col_ref.alias;
        Operator inOp = builder.lookupOperator( $statement::inputAlias );
        LogicalSchema schema;
@@ -1301,6 +1339,7 @@ alias_col_ref[LogicalExpressionPlan plan
        if( op != null && ( schema == null || schema.getFieldPosition( alias ) == -1 ) ) {
            $expr = new ScalarExpression( plan, op,
                inForeachPlan ? $foreach_clause::foreachOp : $GScope::currentOp );
+           $expr.setLocation( loc );
        } else {
            if( inForeachPlan ) {
                $expr = builder.buildProjectExpr( loc, $plan, $GScope::currentOp, 
@@ -1330,8 +1369,7 @@ dollar_col_ref[LogicalExpressionPlan pla
  : DOLLARVAR
    {
        int col = builder.undollar( $DOLLARVAR.text );
-       SourceLocation loc = new SourceLocation( $DOLLARVAR.token );
-       $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp, 
+       $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$DOLLARVAR ), $plan, $GScope::currentOp, 
            $statement::inputIndex, null, col );
    }
 ;
@@ -1340,6 +1378,7 @@ const_expr[LogicalExpressionPlan plan] r
  : literal
    {
        $expr = new ConstantExpression( $plan, $literal.value);
+       $expr.setLocation( new SourceLocation( (PigParserNode)$const_expr.start ) );
    }
 ;
 

Modified: pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java Mon Apr  4 18:31:28 2011
@@ -31,19 +31,17 @@ import org.antlr.runtime.RecognitionExce
 public abstract class PigRecognitionException extends RecognitionException {
     private static final long serialVersionUID = 1L;
     
+    private SourceLocation location;
+    
     public PigRecognitionException(IntStream input, SourceLocation loc) {
         super( input );
         this.line = loc.line();
         this.charPositionInLine = loc.offset();
+        this.location = loc;
     }
     
     protected String msgHeader() {
-        StringBuilder sb = new StringBuilder();
-        sb.append( "<line " + line );
-        if( charPositionInLine >= 0 )
-            sb.append( ", column " + charPositionInLine );
-        sb.append( "> " );
-        return sb.toString();
+        return location.toString();
     }
 
 }

Modified: pig/trunk/src/org/apache/pig/parser/SourceLocation.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/SourceLocation.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/SourceLocation.java (original)
+++ pig/trunk/src/org/apache/pig/parser/SourceLocation.java Mon Apr  4 18:31:28 2011
@@ -18,32 +18,30 @@
 
 package org.apache.pig.parser;
 
-import org.antlr.runtime.Token;
-import org.antlr.runtime.tree.CommonTree;
-
 public class SourceLocation {
+    private String file = null; // Name of the source, null if unknown.
     private int line = -1; // line number, -1 if unknown.
     private int offset = -1; // offset, -f if unknown.
     
-    public SourceLocation(int line, int offset) {
-        this.line = line;
-        this.offset = offset;
+    public SourceLocation() {
     }
     
-    public SourceLocation(int line) {
-        this.line = line;
+    public SourceLocation(PigParserNode tree) {
+        this.file = tree.getFileName();
+        this.line = tree.getLine();
+        this.offset = tree.getCharPositionInLine();
     }
     
-    public SourceLocation(Token token) {
-        this.line = token.getLine();
-        this.offset = token.getCharPositionInLine();
+    public SourceLocation(SourceLocation location) {
+        this.file = location.file;
+        this.line = location.line;
+        this.offset = location.offset;
     }
     
-    public SourceLocation(CommonTree tree) {
-        this.line = tree.getLine();
-        this.offset = tree.getCharPositionInLine();
+    public String file() {
+        return file;
     }
-    
+
     public int line() {
         return line;
     }
@@ -52,4 +50,17 @@ public class SourceLocation {
         return offset;
     }
     
+    @Override
+    public String toString() {
+        if( line == -1 )
+            return "";
+        
+        StringBuilder sb = new StringBuilder( "<" );
+        if( file != null )
+            sb.append( "file " + file + ", " );
+        sb.append( "line " + line +", column " + offset + "> " );
+        
+        return sb.toString();
+    }
+    
 }

Modified: pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java Mon Apr  4 18:31:28 2011
@@ -19,15 +19,14 @@
 package org.apache.pig.parser;
 
 import org.antlr.runtime.IntStream;
-import org.antlr.runtime.Token;
 
 public class UndefinedAliasException extends PigRecognitionException {
     private static final long serialVersionUID = 1L;
     
     private String alias;
     
-    public UndefinedAliasException(IntStream input, Token t, String alias) {
-        super( input, new SourceLocation( t ) );
+    public UndefinedAliasException(IntStream input, SourceLocation loc, String alias) {
+        super( input, loc );
         this.alias = alias;
     }
     

Modified: pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java (original)
+++ pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java Mon Apr  4 18:31:28 2011
@@ -24,7 +24,6 @@ import java.io.IOException;
 
 import junit.framework.Assert;
 
-import org.antlr.runtime.RecognitionException;
 import org.apache.pig.test.Util;
 import org.junit.BeforeClass;
 import org.junit.Test;