This is an automated email from the ASF dual-hosted git repository.

twalthr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 913b041  [FLINK-7205] [table] Add UUID() for Table API & SQL
913b041 is described below

commit 913b0413882939c30da4ad4df0cabc84dfe69ea0
Author: wind <[email protected]>
AuthorDate: Wed Aug 1 12:52:34 2018 +0800

    [FLINK-7205] [table] Add UUID() for Table API & SQL
    
    This closes #6381.
---
 docs/dev/table/functions.md                        | 33 ++++++++++++++++++++++
 .../flink/table/api/scala/expressionDsl.scala      | 19 +++++++++++++
 .../flink/table/codegen/calls/BuiltInMethods.scala |  2 ++
 .../table/codegen/calls/FunctionGenerator.scala    |  6 ++++
 .../flink/table/expressions/mathExpressions.scala  | 11 ++++++++
 .../table/functions/sql/ScalarSqlFunctions.scala   | 11 ++++++++
 .../table/runtime/functions/ScalarFunctions.scala  |  5 ++++
 .../flink/table/validate/FunctionCatalog.scala     |  3 ++
 .../table/expressions/NonDeterministicTests.scala  |  9 ++++++
 .../table/expressions/ScalarFunctionsTest.scala    | 33 ++++++++++++++++++++++
 10 files changed, 132 insertions(+)

diff --git a/docs/dev/table/functions.md b/docs/dev/table/functions.md
index cf42bfa..eac6d16 100644
--- a/docs/dev/table/functions.md
+++ b/docs/dev/table/functions.md
@@ -1382,6 +1382,17 @@ RAND_INTEGER(integer1, integer2)
       <p>Returns a pseudorandom integer value between 0 (inclusive) and the 
specified value (exclusive) with an initial seed. Two RAND_INTEGER functions 
will return identical sequences of numbers if they have the same initial seed 
and bound.</p>
     </td>
    </tr>
+
+    <tr>
+     <td>
+       {% highlight text %}
+UUID()
+{% endhighlight %}
+     </td>
+    <td>
+      <p>Returns an UUID (Universally Unique Identifier) string (e.g., 
"3d3c68f7-f608-473f-b60c-b0c44ad4cc4e") according to RFC 4122 type 4 (pseudo 
randomly generated) UUID. The UUID is generated using a cryptographically 
strong pseudo random number generator.</p>
+    </td>
+   </tr>
     
     <tr>
       <td>
@@ -1811,6 +1822,17 @@ randInteger(INTEGER1, INTEGER2)
     <tr>
      <td>
        {% highlight java %}
+uuid()
+{% endhighlight %}
+     </td>
+    <td>
+      <p>Returns an UUID (Universally Unique Identifier) string (e.g., 
"3d3c68f7-f608-473f-b60c-b0c44ad4cc4e") according to RFC 4122 type 4 (pseudo 
randomly generated) UUID. The UUID is generated using a cryptographically 
strong pseudo random number generator.</p>
+    </td>
+   </tr>
+
+    <tr>
+     <td>
+       {% highlight java %}
 INTEGER.bin()
 {% endhighlight %}
      </td>
@@ -2236,6 +2258,17 @@ randInteger(INTEGER1, INTEGER2)
     <tr>
      <td>
        {% highlight scala %}
+uuid()
+{% endhighlight %}
+     </td>
+    <td>
+      <p>Returns an UUID (Universally Unique Identifier) string (e.g., 
"3d3c68f7-f608-473f-b60c-b0c44ad4cc4e") according to RFC 4122 type 4 (pseudo 
randomly generated) UUID. The UUID is generated using a cryptographically 
strong pseudo random number generator.</p>
+    </td>
+   </tr>
+
+    <tr>
+     <td>
+       {% highlight scala %}
 INTEGER.bin()
 {% endhighlight %}
      </td>
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
index 66e7544..dfe69cb 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/scala/expressionDsl.scala
@@ -1256,4 +1256,23 @@ object concat_ws {
   }
 }
 
+/**
+  * Returns an UUID (Universally Unique Identifier) string (e.g.,
+  * "3d3c68f7-f608-473f-b60c-b0c44ad4cc4e") according to RFC 4122 type 4 
(pseudo randomly
+  * generated) UUID. The UUID is generated using a cryptographically strong 
pseudo random number
+  * generator.
+  */
+object uuid {
+
+  /**
+    * Returns an UUID (Universally Unique Identifier) string (e.g.,
+    * "3d3c68f7-f608-473f-b60c-b0c44ad4cc4e") according to RFC 4122 type 4 
(pseudo randomly
+    * generated) UUID. The UUID is generated using a cryptographically strong 
pseudo random number
+    * generator.
+    */
+  def apply(): Expression = {
+    UUID()
+  }
+}
+
 // scalastyle:on object.name
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/BuiltInMethods.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/BuiltInMethods.scala
index 942666a..7eb91d3 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/BuiltInMethods.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/BuiltInMethods.scala
@@ -139,4 +139,6 @@ object BuiltInMethods {
 
   val HEX_LONG: Method = Types.lookupMethod(classOf[ScalarFunctions], "hex", 
classOf[Long])
   val HEX_STRING: Method = Types.lookupMethod(classOf[ScalarFunctions], "hex", 
classOf[String])
+
+  val UUID: Method = Types.lookupMethod(classOf[ScalarFunctions], "uuid")
 }
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
index fd71126..a29259b 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/FunctionGenerator.scala
@@ -158,6 +158,12 @@ object FunctionGenerator {
     STRING_TYPE_INFO,
     BuiltInMethods.TOBASE64)
 
+  addSqlFunctionMethod(
+    UUID,
+    Seq(),
+    STRING_TYPE_INFO,
+    BuiltInMethods.UUID)
+
   // 
----------------------------------------------------------------------------------------------
   // Arithmetic functions
   // 
----------------------------------------------------------------------------------------------
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/mathExpressions.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/mathExpressions.scala
index 13e005e..2f54ec2 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/mathExpressions.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/mathExpressions.scala
@@ -434,9 +434,20 @@ case class Hex(child: Expression) extends UnaryExpression {
       ValidationFailure(s"hex() requires an integer or string input but was 
'${child.resultType}'.")
     }
   }
+
   override def toString: String = s"hex($child)"
 
   override private[flink] def toRexNode(implicit relBuilder: RelBuilder): 
RexNode = {
     relBuilder.call(ScalarSqlFunctions.HEX, child.toRexNode)
   }
 }
+
+case class UUID() extends LeafExpression {
+  override private[flink] def resultType = BasicTypeInfo.STRING_TYPE_INFO
+
+  override def toString: String = s"uuid()"
+
+  override private[flink] def toRexNode(implicit relBuilder: RelBuilder): 
RexNode = {
+    relBuilder.call(ScalarSqlFunctions.UUID)
+  }
+}
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
index a0b6c9c..0df4468 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala
@@ -167,6 +167,17 @@ object ScalarSqlFunctions {
     SqlFunctionCategory.STRING
   )
 
+  val UUID: SqlFunction = new SqlFunction(
+    "UUID",
+    SqlKind.OTHER_FUNCTION,
+    ReturnTypes.VARCHAR_2000,
+    null,
+    OperandTypes.NILADIC,
+    SqlFunctionCategory.STRING
+  ) {
+    override def isDeterministic: Boolean = false
+  }
+
   val DATE_FORMAT = new SqlFunction(
     "DATE_FORMAT",
     SqlKind.OTHER_FUNCTION,
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/runtime/functions/ScalarFunctions.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/runtime/functions/ScalarFunctions.scala
index 1881874..d92af7a 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/runtime/functions/ScalarFunctions.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/runtime/functions/ScalarFunctions.scala
@@ -222,4 +222,9 @@ object ScalarFunctions {
     * Returns the hex string of a string argument.
     */
   def hex(x: String): String = Hex.encodeHexString(x.getBytes).toUpperCase()
+
+  /**
+    * Returns an UUID string using Java utilities.
+    */
+  def uuid(): String = java.util.UUID.randomUUID().toString
 }
diff --git 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
index a446401..f5d1330 100644
--- 
a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
+++ 
b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/validate/FunctionCatalog.scala
@@ -204,6 +204,7 @@ object FunctionCatalog {
     "rpad" -> classOf[Rpad],
     "fromBase64" -> classOf[FromBase64],
     "toBase64" -> classOf[ToBase64],
+    "uuid" -> classOf[UUID],
 
     // math functions
     "plus" -> classOf[Plus],
@@ -453,6 +454,8 @@ class BasicOperatorTable extends ReflectiveSqlOperatorTable 
{
     ScalarSqlFunctions.SHA2,
     ScalarSqlFunctions.FROM_BASE64,
     ScalarSqlFunctions.TO_BASE64,
+    ScalarSqlFunctions.UUID,
+
     // EXTENSIONS
     BasicOperatorTable.TUMBLE,
     BasicOperatorTable.HOP,
diff --git 
a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/NonDeterministicTests.scala
 
b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/NonDeterministicTests.scala
index d3b606b..83f4a65 100644
--- 
a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/NonDeterministicTests.scala
+++ 
b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/NonDeterministicTests.scala
@@ -80,6 +80,15 @@ class NonDeterministicTests extends ExpressionTestBase {
       "PLEASE CHECK MANUALLY")
   }
 
+  @Ignore
+  @Test
+  def testUUID(): Unit = {
+    testAllApis(
+      uuid(),
+      "uuid()",
+      "UUID()",
+      "PLEASE CHECK MANUALLY")
+  }
   // 
----------------------------------------------------------------------------------------------
 
   override def testData: Row = new Row(0)
diff --git 
a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
 
b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
index 8e85b34..145f3c5 100644
--- 
a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
+++ 
b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala
@@ -593,6 +593,39 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
       "null")
   }
 
+  @Test
+  def testUUID(): Unit = {
+    testAllApis(
+      uuid().charLength(),
+      "uuid().charLength",
+      "CHARACTER_LENGTH(UUID())",
+      "36")
+
+    testAllApis(
+      uuid().substring(9, 1),
+      "uuid().substring(9, 1)",
+      "SUBSTRING(UUID(), 9, 1)",
+      "-")
+
+    testAllApis(
+      uuid().substring(14, 1),
+      "uuid().substring(14, 1)",
+      "SUBSTRING(UUID(), 14, 1)",
+      "-")
+
+    testAllApis(
+      uuid().substring(19, 1),
+      "uuid().substring(19, 1)",
+      "SUBSTRING(UUID(), 19, 1)",
+      "-")
+
+    testAllApis(
+      uuid().substring(24, 1),
+      "uuid().substring(24, 1)",
+      "SUBSTRING(UUID(), 24, 1)",
+      "-")
+  }
+
   // 
----------------------------------------------------------------------------------------------
   // Math functions
   // 
----------------------------------------------------------------------------------------------

Reply via email to