[ https://issues.apache.org/jira/browse/FLINK-10059?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16586215#comment-16586215 ]
ASF GitHub Bot commented on FLINK-10059: ---------------------------------------- asfgit closed pull request #6494: [FLINK-10059] [table] Add LTRIM supported in Table API and SQL URL: https://github.com/apache/flink/pull/6494 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/docs/dev/table/functions.md b/docs/dev/table/functions.md index eac6d16eaf8..59585a6547f 100644 --- a/docs/dev/table/functions.md +++ b/docs/dev/table/functions.md @@ -2482,6 +2482,18 @@ TO_BASE64(string) <p>E.g., <code>TO_BASE64('hello world')</code> returns "aGVsbG8gd29ybGQ=".</p> </td> </tr> + + <tr> + <td> + {% highlight text %} +LTRIM(string) +{% endhighlight %} + </td> + <td> + <p>Returns the result string which trimmed the left spaces from the base string; returns NULL if <i>string</i> is NULL.</p> + <p>E.g., <code>LTRIM(' This is a test String.')</code> returns "This is a test String.".</p> + </td> + </tr> </tbody> </table> </div> @@ -2674,6 +2686,18 @@ STRING.toBase64() <p>E.g., <code>'hello world'.toBase64()</code> returns "aGVsbG8gd29ybGQ=".</p> </td> </tr> + + <tr> + <td> + {% highlight java %} +STRING.ltrim() +{% endhighlight %} + </td> + <td> + <p>Returns the result string which trimmed the left spaces from the base string; returns NULL if <i>string</i> is NULL.</p> + <p>E.g., <code>' This is a test String.'.ltrim()</code> returns "This is a test String.".</p> + </td> + </tr> </tbody> </table> @@ -2866,6 +2890,18 @@ STRING.toBase64() <p>E.g., <code>"hello world".toBase64()</code> returns "aGVsbG8gd29ybGQ=".</p> </td> </tr> + + <tr> + <td> + {% highlight scala %} +STRING.ltrim() +{% endhighlight %} + </td> + <td> + <p>Returns the result string which trimmed the left spaces from the base string; returns NULL if <i>string</i> is NULL.</p> + <p>E.g., <code>' This is a test String.'.ltrim()</code> returns "This is a test String.".</p> + </td> + </tr> </tbody> </table> </div> 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 dfe69cb0411..189512de1cc 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 @@ -563,6 +563,11 @@ trait ImplicitExpressionOperations { */ def toBase64() = ToBase64(expr) + /** + * Returns the result string which trimmed the left spaces from the base string. + */ + def ltrim() = LTrim(expr) + // Temporal operations /** 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 a29259b8ad8..b715d5f450f 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 @@ -164,6 +164,12 @@ object FunctionGenerator { STRING_TYPE_INFO, BuiltInMethods.UUID) + addSqlFunctionMethod( + LTRIM, + Seq(STRING_TYPE_INFO), + STRING_TYPE_INFO, + BuiltInMethod.LTRIM.method) + // ---------------------------------------------------------------------------------------------- // Arithmetic functions // ---------------------------------------------------------------------------------------------- diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala index f844308172c..be3c321d5f6 100644 --- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala +++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/expressions/stringExpressions.scala @@ -410,3 +410,27 @@ case class ToBase64(child: Expression) extends UnaryExpression with InputTypeSpe override def toString: String = s"($child).toBase64" } + +/** + * Returns the result string which trimmed the left spaces from the base string. + */ +case class LTrim(child: Expression) extends UnaryExpression with InputTypeSpec { + override private[flink] def expectedTypes: Seq[TypeInformation[_]] = Seq(STRING_TYPE_INFO) + + override private[flink] def resultType: TypeInformation[_] = STRING_TYPE_INFO + + override private[flink] def validateInput(): ValidationResult = { + if (child.resultType == STRING_TYPE_INFO) { + ValidationSuccess + } else { + ValidationFailure(s"Ltrim operator requires a String input, " + + s"but $child is of type ${child.resultType}") + } + } + + override private[flink] def toRexNode(implicit relBuilder: RelBuilder): RexNode = { + relBuilder.call(ScalarSqlFunctions.LTRIM, child.toRexNode) + } + + override def toString = s"($child).ltrim" +} 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 0df4468599c..f3753ec8cb0 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 @@ -206,4 +206,12 @@ object ScalarSqlFunctions { SqlFunctionCategory.STRING ) + val LTRIM = new SqlFunction( + "LTRIM", + SqlKind.OTHER_FUNCTION, + ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE), + InferTypes.RETURN_TYPE, + OperandTypes.STRING, + SqlFunctionCategory.STRING) + } 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 f5d13305349..49f73f4ee47 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 @@ -205,6 +205,7 @@ object FunctionCatalog { "fromBase64" -> classOf[FromBase64], "toBase64" -> classOf[ToBase64], "uuid" -> classOf[UUID], + "ltrim" -> classOf[LTrim], // math functions "plus" -> classOf[Plus], @@ -455,6 +456,7 @@ class BasicOperatorTable extends ReflectiveSqlOperatorTable { ScalarSqlFunctions.FROM_BASE64, ScalarSqlFunctions.TO_BASE64, ScalarSqlFunctions.UUID, + ScalarSqlFunctions.LTRIM, // EXTENSIONS BasicOperatorTable.TUMBLE, 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 145f3c5fba3..5ab0c679df1 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 @@ -626,6 +626,33 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "-") } + @Test + def testLTrim(): Unit = { + testAllApis( + 'f8.ltrim(), + "f8.ltrim", + "LTRIM(f8)", + "This is a test String. ") + + testAllApis( + 'f0.ltrim(), + "f0.ltrim", + "LTRIM(f0)", + "This is a test String.") + + testAllApis( + "".ltrim(), + "''.ltrim()", + "LTRIM('')", + "") + + testAllApis( + 'f33.ltrim(), + "f33.ltrim", + "LTRIM(f33)", + "null") + } + // ---------------------------------------------------------------------------------------------- // Math functions // ---------------------------------------------------------------------------------------------- diff --git a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala index 5846fc0af0d..f1e7ab36dcb 100644 --- a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala +++ b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/SqlExpressionTest.scala @@ -149,6 +149,7 @@ class SqlExpressionTest extends ExpressionTestBase { testSqlApi("RPAD('hi',4,'??')", "hi??") testSqlApi("FROM_BASE64('aGVsbG8gd29ybGQ=')", "hello world") testSqlApi("TO_BASE64('hello world')", "aGVsbG8gd29ybGQ=") + testSqlApi("LTRIM(' This is a test String.')", "This is a test String.") } @Test ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Add LTRIM supported in Table API and SQL > ---------------------------------------- > > Key: FLINK-10059 > URL: https://issues.apache.org/jira/browse/FLINK-10059 > Project: Flink > Issue Type: Sub-task > Components: Table API & SQL > Reporter: vinoyang > Assignee: vinoyang > Priority: Minor > Labels: pull-request-available > Fix For: 1.7.0 > > > refer to MYSQL ltrim function : > https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_ltrim -- This message was sent by Atlassian JIRA (v7.6.3#76005)