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

zhouyao2023 pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new 96fdade760 [Feature][Transforms] Support is_date function of sql 
(#6966)
96fdade760 is described below

commit 96fdade76078dc3ff4855708d7af786ad822d789
Author: hailin0 <[email protected]>
AuthorDate: Wed Jun 12 09:43:28 2024 +0800

    [Feature][Transforms] Support is_date function of sql (#6966)
---
 docs/en/transform-v2/sql-functions.md                        |  9 +++++++++
 .../src/test/resources/sql_transform/func_datetime.conf      | 12 ++++++++++--
 .../apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java |  3 +++
 .../org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java |  1 +
 .../transform/sql/zeta/functions/DateTimeFunction.java       |  9 +++++++++
 5 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/docs/en/transform-v2/sql-functions.md 
b/docs/en/transform-v2/sql-functions.md
index ab98c2d2bf..e1c541ef1c 100644
--- a/docs/en/transform-v2/sql-functions.md
+++ b/docs/en/transform-v2/sql-functions.md
@@ -795,6 +795,15 @@ Example:
 
 MONTHNAME(CREATED)
 
+### IS_DATE
+
+```IS_DATE(string, formatString)```
+Parses a string and returns a boolean value. The most important format 
characters are: y year, M month, d day, H hour, m minute, s second. For details 
of the format, see java.time.format.DateTimeFormatter.
+
+Example:
+
+CALL IS_DATE('2021-04-08 13:34:45','yyyy-MM-dd HH:mm:ss')
+
 ### PARSEDATETIME / TO_DATE
 
 ```PARSEDATETIME | TO_DATE(string, formatString)```
diff --git 
a/seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform/func_datetime.conf
 
b/seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform/func_datetime.conf
index 042b66ad25..05f8f7935f 100644
--- 
a/seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform/func_datetime.conf
+++ 
b/seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform/func_datetime.conf
@@ -37,10 +37,11 @@ source {
         c4 = "timestamp"
         c5 = "string"
         c6 = "string"
+        c7 = "string"
       }
     }
     rows = [
-      {fields = [1, "Joy Ding", "2021-04-15T13:34:45", "2022-01-23T12:34:56", 
"2021-04-15T13:34:45.235", "2021-04-08T13:34:45.235", "2021-04-08 
13:34:45.235", "2021-04-08"], kind = INSERT}
+      {fields = [1, "Joy Ding", "2021-04-15T13:34:45", "2022-01-23T12:34:56", 
"2021-04-15T13:34:45.235", "2021-04-08T13:34:45.235", "2021-04-08 
13:34:45.235", "2021-04-08", "2021-04-08 13:34:45.235"], kind = INSERT}
     ]
   }
 }
@@ -49,7 +50,7 @@ transform {
   Sql {
     source_table_name = "fake"
     result_table_name = "fake1"
-    query = "select current_date as cd, current_timestamp as ct2, dateadd(c1, 
1) as c1_1, dateadd(c1, 40, 'DAY') as c1_2, dateadd(c1, 2, 'YEAR') as c1_3, 
dateadd(c1, 10, 'MONTH') as c1_4, dateadd(c1, 13, 'HOUR') as c1_5, dateadd(c1, 
40, 'MINUTE') as c1_6, dateadd(c1, 30, 'SECOND') as c1_7, datediff(c1, c2) as 
test, datediff(c1, c2, 'DAY') as c2_1, datediff(c1, c2, 'YEAR') as c2_2, 
datediff(c1, c2, 'MONTH') as c2_3, datediff(c1, c2, 'HOUR') as c2_4, 
datediff(c1, c2, 'MINUTE') as c2_5, dat [...]
+    query = "select current_date as cd, current_timestamp as ct2, dateadd(c1, 
1) as c1_1, dateadd(c1, 40, 'DAY') as c1_2, dateadd(c1, 2, 'YEAR') as c1_3, 
dateadd(c1, 10, 'MONTH') as c1_4, dateadd(c1, 13, 'HOUR') as c1_5, dateadd(c1, 
40, 'MINUTE') as c1_6, dateadd(c1, 30, 'SECOND') as c1_7, datediff(c1, c2) as 
test, datediff(c1, c2, 'DAY') as c2_1, datediff(c1, c2, 'YEAR') as c2_2, 
datediff(c1, c2, 'MONTH') as c2_3, datediff(c1, c2, 'HOUR') as c2_4, 
datediff(c1, c2, 'MINUTE') as c2_5, dat [...]
   }
 }
 
@@ -387,6 +388,13 @@ sink {
           field_value = [
             {equals_to = 2021}
           ]
+        },
+        {
+          field_name = "c7_1"
+          field_type = "timestamp"
+          field_value = [
+            {equals_to = "2021-04-08T13:34:45.235"}
+          ]
         }
       ]
     }
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
index 7a8b83d4db..44b9ca20b7 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
@@ -159,6 +159,7 @@ public class ZetaSQLFunction {
     public static final String MONTHNAME = "MONTHNAME";
     public static final String PARSEDATETIME = "PARSEDATETIME";
     public static final String TO_DATE = "TO_DATE";
+    public static final String IS_DATE = "IS_DATE";
     public static final String QUARTER = "QUARTER";
     public static final String SECOND = "SECOND";
     public static final String WEEK = "WEEK";
@@ -476,6 +477,8 @@ public class ZetaSQLFunction {
             case PARSEDATETIME:
             case TO_DATE:
                 return DateTimeFunction.parsedatetime(args);
+            case IS_DATE:
+                return DateTimeFunction.isDate(args);
             case QUARTER:
                 return DateTimeFunction.quarter(args);
             case SECOND:
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
index 64ad04ee3e..934cd88308 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
@@ -391,6 +391,7 @@ public class ZetaSQLType {
             case ZetaSQLFunction.DATEDIFF:
                 return BasicType.LONG_TYPE;
             case ZetaSQLFunction.REGEXP_LIKE:
+            case ZetaSQLFunction.IS_DATE:
                 return BasicType.BOOLEAN_TYPE;
             case ZetaSQLFunction.ACOS:
             case ZetaSQLFunction.ASIN:
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/DateTimeFunction.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/DateTimeFunction.java
index 2bd8fa2814..1fa459e4bf 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/DateTimeFunction.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/DateTimeFunction.java
@@ -472,6 +472,15 @@ public class DateTimeFunction {
         return getMonthsAndWeeks(0)[dow - 1];
     }
 
+    public static boolean isDate(List<Object> args) {
+        try {
+            parsedatetime(args);
+            return true;
+        } catch (Throwable e) {
+            return false;
+        }
+    }
+
     public static Temporal parsedatetime(List<Object> args) {
         String str = (String) args.get(0);
         if (str == null) {

Reply via email to