From 524a1fa0fecbcbd14d3cb6b9e99d20f424d58004 Mon Sep 17 00:00:00 2001 From: sunjincheng121 Date: Wed, 21 Jun 2017 16:29:15 +0800 Subject: [PATCH] [FLINK-6960] [table] Support E() on SQL. This closes #4152 --- docs/dev/table/sql.md | 10 ++++++ .../codegen/calls/FunctionGenerator.scala | 8 +++-- .../functions/sql/ScalarSqlFunctions.scala | 34 +++++++++++++++++++ .../table/validate/FunctionCatalog.scala | 3 ++ .../expressions/ScalarFunctionsTest.scala | 11 ++++++ 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala diff --git a/docs/dev/table/sql.md b/docs/dev/table/sql.md index 931a7ca89a03c..a736477fccc4b 100644 --- a/docs/dev/table/sql.md +++ b/docs/dev/table/sql.md @@ -1385,6 +1385,16 @@ PI()

Returns a value that is closer than any other value to pi.

+ + + {% highlight text %} +E() +{% endhighlight %} + + +

Returns a value that is closer than any other value to e.

+ + 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 ed188115b63d1..4da5514f0d851 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 @@ -28,9 +28,8 @@ import org.apache.calcite.util.BuiltInMethod import org.apache.flink.api.common.typeinfo.BasicTypeInfo._ import org.apache.flink.api.common.typeinfo.{BasicTypeInfo, SqlTimeTypeInfo, TypeInformation} import org.apache.flink.api.java.typeutils.GenericTypeInfo -import org.apache.flink.table.codegen.{CodeGenerator, GeneratedExpression} import org.apache.flink.table.functions.utils.{ScalarSqlFunction, TableSqlFunction} - +import org.apache.flink.table.functions.sql.ScalarSqlFunctions._ import scala.collection.mutable /** @@ -395,6 +394,11 @@ object FunctionGenerator { Seq(INT_TYPE_INFO, INT_TYPE_INFO), new RandCallGen(isRandInteger = true, hasSeed = true)) + addSqlFunction( + E, + Seq(), + new ConstantCallGen(DOUBLE_TYPE_INFO, Math.E.toString)) + // ---------------------------------------------------------------------------------------------- // Temporal functions // ---------------------------------------------------------------------------------------------- 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 new file mode 100644 index 0000000000000..84f2d2190537c --- /dev/null +++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/functions/sql/ScalarSqlFunctions.scala @@ -0,0 +1,34 @@ +/* + * 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.flink.table.functions.sql + +import org.apache.calcite.sql.{SqlFunction, SqlFunctionCategory, SqlKind} +import org.apache.calcite.sql.`type`._ + +/** + * All build-in scalar sql functions. + */ +object ScalarSqlFunctions { + val E = new SqlFunction( + "E", + SqlKind.OTHER_FUNCTION, + ReturnTypes.DOUBLE, + null, + OperandTypes.NILADIC, + SqlFunctionCategory.NUMERIC) +} 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 a280bc8682a6a..4bc636490869c 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 @@ -23,6 +23,7 @@ import org.apache.calcite.sql.util.{ChainedSqlOperatorTable, ListSqlOperatorTabl import org.apache.calcite.sql.{SqlFunction, SqlOperator, SqlOperatorTable} import org.apache.flink.table.api._ import org.apache.flink.table.expressions._ +import org.apache.flink.table.functions.sql.ScalarSqlFunctions import org.apache.flink.table.functions.utils.{AggSqlFunction, ScalarSqlFunction, TableSqlFunction} import org.apache.flink.table.functions.{AggregateFunction, ScalarFunction, TableFunction} @@ -391,6 +392,8 @@ class BasicOperatorTable extends ReflectiveSqlOperatorTable { SqlStdOperatorTable.PI, SqlStdOperatorTable.RAND, SqlStdOperatorTable.RAND_INTEGER, + ScalarSqlFunctions.E, + // EXTENSIONS SqlStdOperatorTable.TUMBLE, SqlStdOperatorTable.TUMBLE_START, 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 5f3baa33f752a..b684108a37af9 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 @@ -1147,6 +1147,17 @@ class ScalarFunctionsTest extends ExpressionTestBase { random4.nextInt(44).toString) } + @Test + def testE(): Unit = { + testSqlApi( + "E()", + math.E.toString) + + testSqlApi( + "e()", + math.E.toString) + } + // ---------------------------------------------------------------------------------------------- // Temporal functions // ----------------------------------------------------------------------------------------------