You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2013/04/04 00:43:03 UTC

svn commit: r1464226 - in /pig/trunk: CHANGES.txt src/org/apache/pig/parser/PigMacro.java test/org/apache/pig/test/TestMacroExpansion.java

Author: daijy
Date: Wed Apr  3 22:43:02 2013
New Revision: 1464226

URL: http://svn.apache.org/r1464226
Log:
PIG-2247: Pig parser does not detect multiple arguments with the same name passed to 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=1464226&r1=1464225&r2=1464226&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Wed Apr  3 22:43:02 2013
@@ -151,6 +151,8 @@ PIG-3013: BinInterSedes improve chararra
 
 BUG FIXES
 
+PIG-2247: Pig parser does not detect multiple arguments with the same name passed to macro (dreambird via daijy)
+
 PIG-3264: mvn signanddeploy target broken for pigunit, pigsmoke and piggybank (billgraham)
 
 PIG-3262: Pig contrib 0.11 doesn't compile on certain rpm systems (mgrover via cheolsoo)

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=1464226&r1=1464225&r2=1464226&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/PigMacro.java (original)
+++ pig/trunk/src/org/apache/pig/parser/PigMacro.java Wed Apr  3 22:43:02 2013
@@ -39,6 +39,8 @@ import org.apache.commons.logging.LogFac
 import org.apache.pig.parser.PigParserNode.InvocationPoint;
 import org.apache.pig.tools.parameters.ParameterSubstitutionPreprocessor;
 
+import com.google.common.collect.ImmutableSet;
+
 class PigMacro {
 
     private static final Log LOG = LogFactory.getLog(PigMacro.class);
@@ -135,7 +137,18 @@ class PigMacro {
                             + ((outputs == null) ? 0 : outputs.length));
             throw new ParserException(msg);
         }
-        
+
+        int distinct = ImmutableSet.copyOf(inputs).asList().size();
+        if (distinct != inputs.length) {
+            String msg = getErrorMessage(file, line, "Cannot expand macro '"
+                    + name + "'",
+                    " Duplicated arguments names are passed in macro:"
+                              + " number of arguments: " + inputs.length
+                              + " number of distinct arguments: "
+                              + distinct);
+            throw new ParserException(msg);
+        }
+
         String[] args = new String[params.size()];
         for (int i=0; i<params.size(); i++) {
         	 if (inputs[i].startsWith("$"))

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=1464226&r1=1464225&r2=1464226&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestMacroExpansion.java Wed Apr  3 22:43:02 2013
@@ -969,6 +969,25 @@ public class TestMacroExpansion {
         validateFailure(macro + script, expectedErr);
     }
     
+    //duplicate arguments passed in macro
+    @Test
+    public void negativeTest10() throws Throwable {
+        String macro = "define simple_macro(in_relation, min_gpa, min_gpa) returns c {\n" +
+            "b = filter $in_relation by age >= $min_gpa;\n" +
+            "$c = foreach b generate user, zip;\n" +
+            "};\n";
+
+        String script =
+            "alpha = load 'users' as (user, age, zip);\n" +
+            "gamma = simple_macro (alpha, age, age);\n" +
+            "store gamma into 'byuser';\n";
+
+        String expectedErr = "Reason:  Duplicated arguments names are passed in macro:" +
+            " number of arguments: 3 number of distinct arguments: 2";
+
+        validateFailure(macro + script, expectedErr);
+    }
+
     @Test // macro doesn't contain return alias
     public void checkReturnAliasTest1() throws Throwable {
         String macro = "define group_and_count_1 (A,C) returns B {\n" +