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/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_insert2.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_concat_insert2.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_concat_insert2.q.out (revision 0) @@ -0,0 +1,112 @@ +PREHOOK: query: CREATE TABLE dest1(key STRING, value STRING) STORED AS TEXTFILE +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE dest1(key STRING, value STRING) STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@dest1 +PREHOOK: query: FROM src +INSERT OVERWRITE TABLE dest1 SELECT concat('1234', 'abc', 'extra argument'), src.value WHERE src.key < 100 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@dest1 +POSTHOOK: query: FROM src +INSERT OVERWRITE TABLE dest1 SELECT concat('1234', 'abc', 'extra argument'), src.value WHERE src.key < 100 +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/2058952662/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/2058952662/10000 +1234abcextra argument val_86 +1234abcextra argument val_27 +1234abcextra argument val_98 +1234abcextra argument val_66 +1234abcextra argument val_37 +1234abcextra argument val_15 +1234abcextra argument val_82 +1234abcextra argument val_17 +1234abcextra argument val_0 +1234abcextra argument val_57 +1234abcextra argument val_20 +1234abcextra argument val_92 +1234abcextra argument val_47 +1234abcextra argument val_72 +1234abcextra argument val_4 +1234abcextra argument val_35 +1234abcextra argument val_54 +1234abcextra argument val_51 +1234abcextra argument val_65 +1234abcextra argument val_83 +1234abcextra argument val_12 +1234abcextra argument val_67 +1234abcextra argument val_84 +1234abcextra argument val_58 +1234abcextra argument val_8 +1234abcextra argument val_24 +1234abcextra argument val_42 +1234abcextra argument val_0 +1234abcextra argument val_96 +1234abcextra argument val_26 +1234abcextra argument val_51 +1234abcextra argument val_43 +1234abcextra argument val_95 +1234abcextra argument val_98 +1234abcextra argument val_85 +1234abcextra argument val_77 +1234abcextra argument val_0 +1234abcextra argument val_87 +1234abcextra argument val_15 +1234abcextra argument val_72 +1234abcextra argument val_90 +1234abcextra argument val_19 +1234abcextra argument val_10 +1234abcextra argument val_5 +1234abcextra argument val_58 +1234abcextra argument val_35 +1234abcextra argument val_95 +1234abcextra argument val_11 +1234abcextra argument val_34 +1234abcextra argument val_42 +1234abcextra argument val_78 +1234abcextra argument val_76 +1234abcextra argument val_41 +1234abcextra argument val_30 +1234abcextra argument val_64 +1234abcextra argument val_76 +1234abcextra argument val_74 +1234abcextra argument val_69 +1234abcextra argument val_33 +1234abcextra argument val_70 +1234abcextra argument val_5 +1234abcextra argument val_2 +1234abcextra argument val_35 +1234abcextra argument val_80 +1234abcextra argument val_44 +1234abcextra argument val_53 +1234abcextra argument val_90 +1234abcextra argument val_12 +1234abcextra argument val_5 +1234abcextra argument val_70 +1234abcextra argument val_24 +1234abcextra argument val_70 +1234abcextra argument val_83 +1234abcextra argument val_26 +1234abcextra argument val_67 +1234abcextra argument val_18 +1234abcextra argument val_9 +1234abcextra argument val_18 +1234abcextra argument val_97 +1234abcextra argument val_84 +1234abcextra argument val_28 +1234abcextra argument val_37 +1234abcextra argument val_90 +1234abcextra argument val_97 +PREHOOK: query: DROP TABLE dest1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE dest1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Output: default@dest1 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 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/queries/clientpositive/udf_concat_insert1.q =================================================================== --- ql/src/test/queries/clientpositive/udf_concat_insert1.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_concat_insert1.q (revision 0) @@ -0,0 +1,8 @@ +CREATE TABLE dest1(key INT, value STRING) STORED AS TEXTFILE; + +FROM src +INSERT OVERWRITE TABLE dest1 SELECT '1234', concat(src.key) WHERE src.key < 100 group by src.key; + +SELECT dest1.* FROM dest1; + +DROP TABLE dest1; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_concat_insert2.q =================================================================== --- ql/src/test/queries/clientpositive/udf_concat_insert2.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_concat_insert2.q (revision 0) @@ -0,0 +1,8 @@ +CREATE TABLE dest1(key STRING, value STRING) STORED AS TEXTFILE; + +FROM src +INSERT OVERWRITE TABLE dest1 SELECT concat('1234', 'abc', 'extra argument'), src.value WHERE src.key < 100; + +SELECT dest1.* FROM dest1; + +DROP TABLE dest1; Index: ql/src/test/queries/clientpositive/udf_concat.q =================================================================== --- ql/src/test/queries/clientpositive/udf_concat.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_concat.q (revision 0) @@ -0,0 +1,16 @@ +DESCRIBE FUNCTION concat; + +DESCRIBE FUNCTION EXTENDED concat; + +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; 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/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