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/11 02:26:27 UTC
svn commit: r1101691 - in /pig/trunk: CHANGES.txt
src/org/apache/pig/parser/PigMacro.java
test/org/apache/pig/test/TestMacroExpansion.java
Author: rding
Date: Wed May 11 00:26:26 2011
New Revision: 1101691
URL: http://svn.apache.org/viewvc?rev=1101691&view=rev
Log:
PIG-2035: Macro expansion doesn't handle multiple expansions of same macro inside another macro
Modified:
pig/trunk/CHANGES.txt
pig/trunk/src/org/apache/pig/parser/PigMacro.java
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=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Wed May 11 00:26:26 2011
@@ -214,6 +214,8 @@ PIG-1696: Performance: Use System.arrayc
BUG FIXES
+PIG-2035: Macro expansion doesn't handle multiple expansions of same macro inside another macro (rding)
+
PIG-2030: Merged join/cogroup does not automatically ship loader (daijy)
PIG-2052: Ship guava.jar to backend (daijy)
Modified: pig/trunk/src/org/apache/pig/parser/PigMacro.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/PigMacro.java?rev=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/PigMacro.java (original)
+++ pig/trunk/src/org/apache/pig/parser/PigMacro.java Wed May 11 00:26:26 2011
@@ -425,14 +425,17 @@ class PigMacro {
throw new ParserException(msg);
}
- if (!macroStack.add(macro.name)) {
+ if (macroStack.contains(macro.name)) {
String msg = getErrorMessage(file, t.getLine(),
"Cannot expand macro '" + mn + "'",
"Macro can't be defined circularly.");
throw new ParserException(msg);
}
- macro.setStack(macroStack);
+ // set nested macro call stack
+ Set<String> newStack = new HashSet<String>(macroStack);
+ newStack.add(macro.name);
+ macro.setStack(newStack);
// get return values
int n = t.getChild(1).getChildCount();
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=1101691&r1=1101690&r2=1101691&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java Wed May 11 00:26:26 2011
@@ -1239,6 +1239,40 @@ public class TestMacroExpansion {
verify(script, expected);
}
+ @Test // PIG-2035
+ public void nestedMacrosTest() throws Exception {
+ String macro1 = "define test ( in, out, x ) returns void {\n" +
+ "a = load '$in' as (name, age, gpa);\n" +
+ "b = group a by gpa;\n" +
+ "c = foreach b generate group, COUNT(a.$x);\n" +
+ "store c into '$out';\n" +
+ "};\n";
+
+ String macro2 = "define test2( in, out ) returns void {\n" +
+ "test( '$in', '$out', 'name' );\n" +
+ "test( '$in', '$out.1', 'age' );\n" +
+ "test( '$in', '$out.2', 'gpa' );\n" +
+ "};\n";
+
+ String script = "test2('studenttab10k', 'myoutput');";
+
+ String expected =
+ "macro_test2_macro_test_a_0_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+ "macro_test2_macro_test_b_0_0 = group macro_test2_macro_test_a_0_0 by (gpa);\n" +
+ "macro_test2_macro_test_c_0_0 = foreach macro_test2_macro_test_b_0_0 generate group, COUNT(macro_test2_macro_test_a_0_0.(name));\n" +
+ "store macro_test2_macro_test_c_0_0 INTO 'myoutput';\n" +
+ "macro_test2_macro_test_a_1_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+ "macro_test2_macro_test_b_1_0 = group macro_test2_macro_test_a_1_0 by (gpa);\n" +
+ "macro_test2_macro_test_c_1_0 = foreach macro_test2_macro_test_b_1_0 generate group, COUNT(macro_test2_macro_test_a_1_0.(age));\n" +
+ "store macro_test2_macro_test_c_1_0 INTO 'myoutput.1';\n" +
+ "macro_test2_macro_test_a_2_0 = load 'studenttab10k' as (name, age, gpa);\n" +
+ "macro_test2_macro_test_b_2_0 = group macro_test2_macro_test_a_2_0 by (gpa);\n" +
+ "macro_test2_macro_test_c_2_0 = foreach macro_test2_macro_test_b_2_0 generate group, COUNT(macro_test2_macro_test_a_2_0.(gpa));\n" +
+ "store macro_test2_macro_test_c_2_0 INTO 'myoutput.2';\n";
+
+ verify(macro1 + macro2 + script, expected);
+ }
+
@Test
public void sequenceMacrosTest() throws Exception {
String macro1 = "define foreach_count(A, C) returns B {\n" +
@@ -2115,4 +2149,5 @@ public class TestMacroExpansion {
private void validateFailure(String piglatin, String expectedErr) throws Throwable {
validateFailure(piglatin, expectedErr, "Reason:");
}
+
}