Index: ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java (revision 1835) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java (working copy) @@ -307,17 +307,10 @@ assert(parameters.length == givenParameterOIs.length); - if (!conversionNeeded) { - if (!isVariableLengthArgument) { - // no conversion needed, and not variable-length argument: - // just return what is passed in. - return parameters; - } else if (methodParameterTypes.length == 1) { - // no conversion needed, and variable-length argument with exact one argument - // just put the parameters in the array and return. - convertedParameters[0] = parameters; - return convertedParameters; - } + if (!conversionNeeded && !isVariableLengthArgument) { + // no conversion needed, and not variable-length argument: + // just return what is passed in. + return parameters; } if (isVariableLengthArgument) { Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFConcat.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFConcat.java (revision 1835) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFConcat.java (working copy) @@ -24,7 +24,7 @@ @description( name = "concat", - value = "_FUNC_(str1, str2) - returns the concatenation of str1 and str2", + value = "_FUNC_(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN", extended = "Returns NULL if any argument is NULL.\n" + "Example:\n" + " > SELECT _FUNC_('abc', 'def') FROM src LIMIT 1;\n" + @@ -36,14 +36,17 @@ } Text text = new Text(); - public Text evaluate(Text a, Text b) { - if (a == null || b == null) { - return null; + + + public Text evaluate(Text... args) { + text.clear(); + for(int i=0; i SELECT concat('abc', 'def') FROM src LIMIT 1; Index: ql/src/test/results/clientpositive/udf_concat.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_concat.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_concat.q.out (revision 0) @@ -0,0 +1,45 @@ +PREHOOK: query: DESCRIBE FUNCTION concat +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION concat +POSTHOOK: type: DESCFUNCTION +concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN +PREHOOK: query: DESCRIBE FUNCTION EXTENDED concat +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED concat +POSTHOOK: type: DESCFUNCTION +concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN +Returns NULL if any argument is NULL. +Example: + > SELECT concat('abc', 'def') FROM src LIMIT 1; + 'abcdef' +PREHOOK: query: SELECT + concat('a', 'b'), + concat('a', 'b', 'c'), + concat('a', null, 'c'), + concat(null), + concat('a'), + concat(null, 1, 2), + concat(1, 2, 3, 'a'), + concat(1, 2), + concat(1), + concat('1234', 'abc', 'extra argument') +FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/data/users/pyang/trunk/VENDOR.hive/trunk/build/ql/tmp/1314227124/10000 +POSTHOOK: query: SELECT + concat('a', 'b'), + concat('a', 'b', 'c'), + concat('a', null, 'c'), + concat(null), + concat('a'), + concat(null, 1, 2), + concat(1, 2, 3, 'a'), + concat(1, 2), + concat(1), + concat('1234', 'abc', 'extra argument') +FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/data/users/pyang/trunk/VENDOR.hive/trunk/build/ql/tmp/1314227124/10000 +ab abc NULL NULL a NULL 123a 12 1 1234abcextra argument Index: ql/src/test/results/clientpositive/udf_concat_insert1.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_concat_insert1.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_concat_insert1.q.out (revision 0) @@ -0,0 +1,85 @@ +PREHOOK: query: CREATE TABLE dest1(key INT, value STRING) STORED AS TEXTFILE +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE dest1(key INT, value STRING) STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@dest1 +PREHOOK: query: FROM src +INSERT OVERWRITE TABLE dest1 SELECT '1234', concat(src.key) WHERE src.key < 100 group by src.key +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@dest1 +POSTHOOK: query: FROM src +INSERT OVERWRITE TABLE dest1 SELECT '1234', concat(src.key) WHERE src.key < 100 group by src.key +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@dest1 +PREHOOK: query: SELECT dest1.* FROM dest1 +PREHOOK: type: QUERY +PREHOOK: Input: default@dest1 +PREHOOK: Output: file:/data/users/pyang/trunk/VENDOR.hive/trunk/build/ql/tmp/65445395/10000 +POSTHOOK: query: SELECT dest1.* FROM dest1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@dest1 +POSTHOOK: Output: file:/data/users/pyang/trunk/VENDOR.hive/trunk/build/ql/tmp/65445395/10000 +1234 0 +1234 10 +1234 11 +1234 12 +1234 15 +1234 17 +1234 18 +1234 19 +1234 2 +1234 20 +1234 24 +1234 26 +1234 27 +1234 28 +1234 30 +1234 33 +1234 34 +1234 35 +1234 37 +1234 4 +1234 41 +1234 42 +1234 43 +1234 44 +1234 47 +1234 5 +1234 51 +1234 53 +1234 54 +1234 57 +1234 58 +1234 64 +1234 65 +1234 66 +1234 67 +1234 69 +1234 70 +1234 72 +1234 74 +1234 76 +1234 77 +1234 78 +1234 8 +1234 80 +1234 82 +1234 83 +1234 84 +1234 85 +1234 86 +1234 87 +1234 9 +1234 90 +1234 92 +1234 95 +1234 96 +1234 97 +1234 98 +PREHOOK: query: DROP TABLE dest1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE dest1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Output: default@dest1 Index: ql/src/test/queries/negative/unknown_function5.q =================================================================== --- ql/src/test/queries/negative/unknown_function5.q (revision 1835) +++ ql/src/test/queries/negative/unknown_function5.q (working copy) @@ -1,2 +0,0 @@ -FROM src -INSERT OVERWRITE TABLE dest1 SELECT '1234', concat(src.key) WHERE src.key < 100 group by src.key Index: ql/src/test/queries/negative/invalid_function_param1.q =================================================================== --- ql/src/test/queries/negative/invalid_function_param1.q (revision 1835) +++ ql/src/test/queries/negative/invalid_function_param1.q (working copy) @@ -1,2 +0,0 @@ -FROM src -INSERT OVERWRITE TABLE dest1 SELECT concat('1234', 'abc', 'extra argument'), src.value WHERE src.key < 100 Index: ql/src/test/results/compiler/errors/invalid_function_param1.q.out =================================================================== --- ql/src/test/results/compiler/errors/invalid_function_param1.q.out (revision 1835) +++ ql/src/test/results/compiler/errors/invalid_function_param1.q.out (working copy) @@ -1,2 +0,0 @@ -Semantic Exception: -line 2:36 Function Argument Type Mismatch concat: Looking for UDF "concat" with parameters [class org.apache.hadoop.io.Text, class org.apache.hadoop.io.Text, class org.apache.hadoop.io.Text] \ No newline at end of file Index: ql/src/test/results/compiler/errors/unknown_function5.q.out =================================================================== --- ql/src/test/results/compiler/errors/unknown_function5.q.out (revision 1835) +++ ql/src/test/results/compiler/errors/unknown_function5.q.out (working copy) @@ -1,2 +0,0 @@ -Semantic Exception: -line 2:44 Function Argument Type Mismatch concat: Looking for UDF "concat" with parameters [class org.apache.hadoop.io.Text] \ No newline at end of file