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
//
----------------------------------------------------------------------------------------------