diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index 5353062..8cdec3d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -101,6 +101,7 @@ import org.apache.hadoop.hive.ql.udf.UDFToShort; import org.apache.hadoop.hive.ql.udf.UDFToString; import org.apache.hadoop.hive.ql.udf.UDFType; +import org.apache.hadoop.hive.ql.udf.UDFUUID; import org.apache.hadoop.hive.ql.udf.UDFUnbase64; import org.apache.hadoop.hive.ql.udf.UDFUnhex; import org.apache.hadoop.hive.ql.udf.UDFWeekOfYear; @@ -235,6 +236,7 @@ system.registerUDF("sha", UDFSha1.class, false); system.registerGenericUDF("aes_encrypt", GenericUDFAesEncrypt.class); system.registerGenericUDF("aes_decrypt", GenericUDFAesDecrypt.class); + system.registerUDF("uuid", UDFUUID.class, false); system.registerGenericUDF("encode", GenericUDFEncode.class); system.registerGenericUDF("decode", GenericUDFDecode.class); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFUUID.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFUUID.java new file mode 100644 index 0000000..1340ded --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFUUID.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.udf; + +import java.util.UUID; + +import org.apache.hadoop.hive.ql.exec.Description; +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.io.Text; + +/** + * UDFUUID. + * + */ +@Description(name = "uuid", +value = "_FUNC_() - Returns a universally unique identifier (UUID) string.", +extended = "The value is returned as a canonical UUID 36-character string.\n" ++ "Example:\n" ++ " > SELECT _FUNC_();\n" ++ " '0baf1f52-53df-487f-8292-99a03716b688'\n" ++ " > SELECT _FUNC_();\n" ++ " '36718a53-84f5-45d6-8796-4f79983ad49d'") +public class UDFUUID extends UDF { + private final Text result = new Text(); + /** + * Returns a universally unique identifier (UUID) string (36 characters). + * + * @return Text + */ + public Text evaluate() { + result.set(UUID.randomUUID().toString()); + return result; + } +} diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFUUID.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFUUID.java new file mode 100644 index 0000000..5f04547 --- /dev/null +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFUUID.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.udf; + +import junit.framework.TestCase; + +import org.junit.Test; + +public class TestUDFUUID extends TestCase { + @Test + public void testUUID() throws Exception { + UDFUUID udf = new UDFUUID(); + + String id1 = udf.evaluate().toString(); + String id2 = udf.evaluate().toString(); + + assertFalse(id1.equals(id2)); + + assertEquals(id1.length(), 36); + assertEquals(id2.length(), 36); + } +} diff --git a/ql/src/test/queries/clientpositive/udf_uuid.q b/ql/src/test/queries/clientpositive/udf_uuid.q new file mode 100644 index 0000000..2bd4867 --- /dev/null +++ b/ql/src/test/queries/clientpositive/udf_uuid.q @@ -0,0 +1,47 @@ +DESCRIBE FUNCTION uuid; +DESC FUNCTION EXTENDED uuid; + +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); +SELECT uuid(); + +SELECT + uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() +; diff --git a/ql/src/test/results/clientpositive/udf_uuid.q.out b/ql/src/test/results/clientpositive/udf_uuid.q.out new file mode 100644 index 0000000..758560b --- /dev/null +++ b/ql/src/test/results/clientpositive/udf_uuid.q.out @@ -0,0 +1,254 @@ +PREHOOK: query: DESCRIBE FUNCTION uuid +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION uuid +POSTHOOK: type: DESCFUNCTION +uuid() - Returns a universally unique identifier (UUID) string. +PREHOOK: query: DESC FUNCTION EXTENDED uuid +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESC FUNCTION EXTENDED uuid +POSTHOOK: type: DESCFUNCTION +uuid() - Returns a universally unique identifier (UUID) string. +The value is returned as a canonical UUID 36-character string. +Example: + > SELECT uuid(); + '0baf1f52-53df-487f-8292-99a03716b688' + > SELECT uuid(); + '36718a53-84f5-45d6-8796-4f79983ad49d' +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +8254c199-e5df-4ea0-bc36-cf0bbee28620 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +3a7607ef-4ad7-43e7-9a6b-63ed09cdac54 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +4b509f4a-eaf9-4c71-8006-60c2e2ae64e0 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +99fc48d8-67ad-4159-84fc-c2a99e6a206b +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +d2542e31-8236-43fd-bcb3-577bf23ed353 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +e3f65d2e-8ea0-4c54-b03c-7eaf15c31368 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +2310ee82-3452-49ab-8782-66c4ffd86ffe +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +1619a184-b14d-4f6c-8c75-70d5c6700647 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +cdb951f4-443a-44b2-b6b8-e655ed099dde +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +0e49c6e6-f040-4d55-8859-2b167416c4a7 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +955f8a59-c818-486e-8887-eccd8ec914c9 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +0a9856f2-f7f6-4907-9352-887c737fd728 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +b6753676-cf98-4ddb-9274-1db2f96c4431 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +517b3ec8-7f63-4b0d-9608-c447bc3a7cf9 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +fe9588a3-dc53-4a47-bd17-764cf9ad44a3 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +c2dde23d-c5bd-47de-ac55-585a751b01f3 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +08f46d35-6971-43cf-93f9-148a396cae3a +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +22a61cc1-c499-46a0-81cf-6d8e248f98c5 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +56dd21a7-86a6-4a38-86ee-5ef9f58b8ea4 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +bd361d37-7a33-44d2-af47-ab3238c44ad2 +PREHOOK: query: SELECT uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +6c7989ea-650d-4fdd-8a94-8b18d8968f40 +PREHOOK: query: SELECT + uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: SELECT + uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() + , uuid() +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +5eb402a8-39e9-4997-96e9-bf7b5af99ee1 c8ac91f0-88ff-4d29-bde5-de94654d97c1 27cd7e7f-6282-4333-95a6-da8b65931958 d7dea949-028b-449d-8683-e64ecf224788 5e2d451a-b465-4e71-aa91-95386e36f2dd 4c2abd3c-8124-471c-9625-049e6f5f38cc c3fcfccb-ef33-4a96-9770-0ed6a33895fe b3cd1368-35a3-4472-bb93-cd8eb857c4f6 9dc07dfb-1ce3-4ab8-801f-5a38077c9842 c3224f4d-4349-4241-91bf-b88db8d0837a 980c5899-c127-49ea-9dde-14bf72478c21 8c2d6a65-f25f-4968-b66a-a314c74745cb a7230626-4274-43e3-b726-750ebe8bd044 5e970cc0-a980-46e4-9753-3b6b28736744 f6bbc9a7-c980-4564-9c79-e72af9b2de84 a433c626-c42e-4c5a-92f6-0f81eca52712 73e9db62-ce29-4553-8c78-377b45433fe3 bbb4e3ac-56ad-4c14-8a12-106beb02d674 ed007599-4f6d-44c5-aed4-622628373409 30c1e6b0-d257-4f5a-a76c-69071936a980