You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by rd...@apache.org on 2011/05/05 19:01:22 UTC
svn commit: r1099871 - in /pig/trunk: CHANGES.txt
src/org/apache/pig/parser/AliasMasker.g
test/org/apache/pig/test/TestMacroExpansion.java
Author: rding
Date: Thu May 5 17:01:21 2011
New Revision: 1099871
URL: http://svn.apache.org/viewvc?rev=1099871&view=rev
Log:
PIG-1999: Macro alias masker should consider schema context
Modified:
pig/trunk/CHANGES.txt
pig/trunk/src/org/apache/pig/parser/AliasMasker.g
pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java
Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1099871&r1=1099870&r2=1099871&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Thu May 5 17:01:21 2011
@@ -198,6 +198,8 @@ PIG-1696: Performance: Use System.arrayc
BUG FIXES
+PIG-1999: Macro alias masker should consider schema context (rding)
+
PIG-1821: UDFContext.getUDFProperties does not handle collisions
in hashcode of udf classname (+ arg hashcodes) (thejas)
Modified: pig/trunk/src/org/apache/pig/parser/AliasMasker.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AliasMasker.g?rev=1099871&r1=1099870&r2=1099871&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AliasMasker.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AliasMasker.g Thu May 5 17:01:21 2011
@@ -41,6 +41,14 @@ import java.util.Set;
@members {
+@Override
+public String getErrorMessage(RecognitionException e, String[] tokenNames) {
+ if (e instanceof ParserValidationException) {
+ return e.toString();
+ }
+ return super.getErrorMessage(e, tokenNames);
+}
+
public void setParams(Set ps, String macro, long idx) {
params = ps;
macroName = macro;
@@ -61,6 +69,8 @@ private String macroName = "";
private long index = 0;
+private boolean inAsOrGenClause = false;
+
} // End of @members
@rulecatch {
@@ -163,11 +173,24 @@ filename
;
as_clause
+@init {
+ inAsOrGenClause = true;
+}
+@after {
+ inAsOrGenClause = false;
+}
: ^( AS field_def_list )
;
field_def
- : ^( FIELD_DEF IDENTIFIER type? )
+ : ^( FIELD_DEF IDENTIFIER type? ) {
+ if (inAsOrGenClause) {
+ if (aliasSeen.contains($IDENTIFIER.text)) {
+ throw new ParserValidationException(input, new SourceLocation((PigParserNode)$field_def.start),
+ "Macro doesn't support user defined schema that contains name that conflicts with alias name: " + $IDENTIFIER.text);
+ }
+ }
+}
;
field_def_list
@@ -220,7 +243,13 @@ rel
: alias | ( op_clause parallel_clause? )
;
-flatten_generated_item
+flatten_generated_item
+@init {
+ inAsOrGenClause = true;
+}
+@after {
+ inAsOrGenClause = false;
+}
: ( flatten_clause | col_range | expr | STAR ) field_def_list?
;
Modified: pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java?rev=1099871&r1=1099870&r2=1099871&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java Thu May 5 17:01:21 2011
@@ -973,6 +973,8 @@ public class TestMacroExpansion {
validateFailure(macro + script, expectedErr);
}
+
+
// macro doesn't contain return alias
@Test
public void negativeTest5() throws Throwable {
@@ -1047,6 +1049,46 @@ public class TestMacroExpansion {
validateFailure(macro + script, expectedErr);
}
+ // PIG-1999: macro contains schema name that conflicts with alias
+ @Test
+ public void negativeTest7() throws Throwable {
+ String macro = "define toBytearray(in, intermediate) returns e {\n"
+ + "b = load '$in' as (name:chararray, age:long, gpa: float);\n"
+ + "d = load '$intermediate' using BinStorage() as (b:bag{t:tuple(x,y,z)}, t2:tuple(a,b,c));\n"
+ + "$e = foreach d generate COUNT(b), t2.a, t2.b, t2.c;};\n";
+
+ String script = "f = toBytearray ('data', 'output1');\n";
+
+ String expectedErr = "pig script failed to validate: Macro doesn't support user defined schema "
+ + "that contains name that conflicts with alias name: b\n"
+ + "macro content: \n"
+ + "b = load 'data' as (name:chararray, age:long, gpa: float);\n"
+ + "d = load 'output1' using BinStorage() as (b:bag{t:tuple(x,y,z)}, t2:tuple(a,b,c));\n"
+ + "f = foreach d generate COUNT(b), t2.a, t2.b, t2.c;\n";
+
+ validateFailure(macro + script, expectedErr, "pig script failed to validate:");
+ }
+
+ // PIG-1999: macro contains schema name that conflicts with alias
+ @Test
+ public void negativeTest8() throws Throwable {
+ String macro = "define toBytearray(in, intermediate) returns e {\n"
+ + "b = load '$in' as (name:chararray, age:long, gpa: float);\n"
+ + "d = foreach b generate $0 as b:bag{t:tuple(x,y,z)};\n"
+ + "$e = foreach d generate COUNT(b), t2.a, t2.b, t2.c;};\n";
+
+ String script = "f = toBytearray ('data', 'output1');\n";
+
+ String expectedErr = "pig script failed to validate: Macro doesn't support user defined schema "
+ + "that contains name that conflicts with alias name: b\n"
+ + "macro content: \n"
+ + "b = load 'data' as (name:chararray, age:long, gpa: float);\n"
+ + "d = foreach b generate $0 as b:bag{t:tuple(x,y,z)};\n"
+ + "f = foreach d generate COUNT(b), t2.a, t2.b, t2.c;\n";
+
+ validateFailure(macro + script, expectedErr, "pig script failed to validate:");
+ }
+
@Test
public void recursiveMacrosTest() throws Exception {
String macro1 = "define group_and_partition (A, group_key, reducers) returns B {\n" +
@@ -1972,7 +2014,7 @@ public class TestMacroExpansion {
}
}
- private void validateFailure(String piglatin, String expectedErr) throws Throwable {
+ private void validateFailure(String piglatin, String expectedErr, String keyword) throws Throwable {
String scriptFile = "mymacrotest.pig";
try {
@@ -1988,10 +2030,14 @@ public class TestMacroExpansion {
Assert.fail("Expected exception isn't thrown");
} catch (FrontendException e) {
String msg = e.getMessage();
- int pos = msg.indexOf("Reason:");
+ int pos = msg.indexOf(keyword);
Assert.assertEquals(expectedErr, msg.substring(pos));
} finally {
new File(scriptFile).delete();
}
}
+
+ private void validateFailure(String piglatin, String expectedErr) throws Throwable {
+ validateFailure(piglatin, expectedErr, "Reason:");
+ }
}