Author: knoguchi Date: Tue May 15 04:20:52 2018 New Revision: 1831606 URL: http://svn.apache.org/viewvc?rev=1831606&view=rev Log: PIG-5335: Error message from range projection completely misleading (knoguchi)
Modified: pig/trunk/CHANGES.txt pig/trunk/src/org/apache/pig/newplan/logical/expression/ProjectExpression.java pig/trunk/test/org/apache/pig/test/TestProjectRange.java Modified: pig/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1831606&r1=1831605&r2=1831606&view=diff ============================================================================== --- pig/trunk/CHANGES.txt (original) +++ pig/trunk/CHANGES.txt Tue May 15 04:20:52 2018 @@ -65,6 +65,9 @@ PIG-5251: Bump joda-time to 2.9.9 (dbist OPTIMIZATIONS BUG FIXES + +PIG-5335: Error message from range projection completely misleading (knoguchi) + PIG-5333: LoadCaster sometimes not set for complex type (knoguchi) PIG-5328: expressionOperator Divide.equalsZero(DataType.BIGDECIMAL) is invalid (michaelthoward via knoguchi) Modified: pig/trunk/src/org/apache/pig/newplan/logical/expression/ProjectExpression.java URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/expression/ProjectExpression.java?rev=1831606&r1=1831605&r2=1831606&view=diff ============================================================================== --- pig/trunk/src/org/apache/pig/newplan/logical/expression/ProjectExpression.java (original) +++ pig/trunk/src/org/apache/pig/newplan/logical/expression/ProjectExpression.java Tue May 15 04:20:52 2018 @@ -372,9 +372,20 @@ public class ProjectExpression extends C } } } - if (index==-1) { - if (alias!=null) { - index = schema.getFieldPosition(alias); + if (index==-1 && alias != null) { + index = schema.getFieldPosition(alias); + if( index == -1 ) { + // Return a place holder for this invalid field reference. + // If this relation is used, error will be caught in the + // LogicalPlan.validate phase. + // New uid is assigned to this fake field so that invalid script + // like the one on + // TestColumnAliasConversion.testInvalidNestedProjection + // would not fail at LogicalPlanBuilder phase + // but fail at LogicalPlan.validate phase. + // (PIG-5335 for more details) + return new LogicalSchema.LogicalFieldSchema(alias, null, DataType.BYTEARRAY, + LogicalExpression.getNextUid()); } } if (index==-1) Modified: pig/trunk/test/org/apache/pig/test/TestProjectRange.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestProjectRange.java?rev=1831606&r1=1831605&r2=1831606&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/TestProjectRange.java (original) +++ pig/trunk/test/org/apache/pig/test/TestProjectRange.java Tue May 15 04:20:52 2018 @@ -19,6 +19,7 @@ package org.apache.pig.test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; @@ -33,6 +34,7 @@ import org.apache.pig.data.Tuple; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.logicalLayer.schema.Schema; import org.apache.pig.impl.logicalLayer.schema.Schema.FieldSchema; +import org.apache.pig.impl.plan.PlanValidationException; import org.apache.pig.impl.util.Utils; import org.apache.pig.newplan.logical.expression.LogicalExpressionPlan; import org.apache.pig.newplan.logical.relational.LOCogroup; @@ -373,6 +375,37 @@ public class TestProjectRange { } /** + * -ve test cases + * @throws IOException + * @throws ParserException + */ + @Test + public void testNegativeForeachFollowedByRange() throws IOException, ParserException { + String query = + "A = load '" + INP_FILE_5FIELDS + "' as (a0,a1,a2,a3,a4);" + + "B = FOREACH A GENERATE a0, b1, a2, a3, a4;" + + "C = FOREACH B GENERATE a0..a2;"; + + // In PIG-5335, above query was failing at parsing time + // and error message didn't even mention "b1". + // (below generateLogicalPlan was throwing ParserException) + LogicalPlan lp = generateLogicalPlan(query); + + // After PIG-5335, we moved the error to be caught + // at validation phase AND have proper error message + // pointing to an invalid fieldname, b1. + boolean exceptionCaught = false; + try { + lp.validate(pigServer.getPigContext(), "test", false); + } catch (PlanValidationException ex) { + Util.checkMessageInException(ex, + "Projected field [b1] does not exist in schema: a0:bytearray,a1:bytearray,a2:bytearray,a3:bytearray,a4:bytearray"); + exceptionCaught = true; + } + assertTrue("No exception was thrown from an invalid script", exceptionCaught); + } + + /** * Test foreach without schema * @throws IOException * @throws ParserException