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

yuqi4733 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 1a20686d93 [#7338] feat(trino-connector): Support external type with 
MySQL (#7578)
1a20686d93 is described below

commit 1a20686d931c914f46c8ac9d942ee211c803c209
Author: qbhan <[email protected]>
AuthorDate: Wed Jul 9 21:19:36 2025 +0800

    [#7338] feat(trino-connector): Support external type with MySQL (#7578)
    
    ### What changes were proposed in this pull request?
    Support MySQL external type with Trino.
    
    ### Why are the changes needed?
    
    Fix: #7338
    Fix: #7339
    
    ### Does this PR introduce _any_ user-facing change?
    no
    
    ### How was this patch tested?
    local integration-test
---
 .../MysqlColumnDefaultValueConverter.java          |   1 +
 .../mysql/converter/MysqlTypeConverter.java        |   2 +
 .../mysql/converter/TestMysqlTypeConverter.java    |   2 +
 .../docker-script/init/mysql/init.sql              | 101 +++++++++++++++++++++
 .../testsets/jdbc-mysql/00009_datatype_mapping.sql |   4 +
 .../testsets/jdbc-mysql/00009_datatype_mapping.txt |  47 ++++++++++
 .../jdbc/mysql/MySQLDataTypeTransformer.java       |   7 +-
 .../catalog/jdbc/mysql/MySQLExternalDataType.java  |  94 +++++++++++++++++++
 .../jdbc/mysql/TestMySQLDataTypeTransformer.java   |  69 +++++++++++++-
 9 files changed, 321 insertions(+), 6 deletions(-)

diff --git 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlColumnDefaultValueConverter.java
 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlColumnDefaultValueConverter.java
index 26f6fdef8b..52aa9c86c2 100644
--- 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlColumnDefaultValueConverter.java
+++ 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlColumnDefaultValueConverter.java
@@ -78,6 +78,7 @@ public class MysqlColumnDefaultValueConverter extends 
JdbcColumnDefaultValueConv
         return Literals.floatLiteral(Float.valueOf(columnDefaultValue));
       case MysqlTypeConverter.DOUBLE:
         return Literals.doubleLiteral(Double.valueOf(columnDefaultValue));
+      case MysqlTypeConverter.DECIMAL_UNSIGNED:
       case MysqlTypeConverter.DECIMAL:
         return Literals.decimalLiteral(
             Decimal.of(columnDefaultValue, type.getColumnSize(), 
type.getScale()));
diff --git 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlTypeConverter.java
 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlTypeConverter.java
index 300e22fe43..1a0f8a67b8 100644
--- 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlTypeConverter.java
+++ 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlTypeConverter.java
@@ -37,6 +37,7 @@ public class MysqlTypeConverter extends JdbcTypeConverter {
   static final String FLOAT = "float";
   static final String DOUBLE = "double";
   static final String DECIMAL = "decimal";
+  static final String DECIMAL_UNSIGNED = "decimal unsigned";
   static final String CHAR = "char";
   static final String BINARY = "binary";
   static final String DATETIME = "datetime";
@@ -81,6 +82,7 @@ public class MysqlTypeConverter extends JdbcTypeConverter {
         return Types.TimestampType.withTimeZone();
       case DATETIME:
         return Types.TimestampType.withoutTimeZone();
+      case DECIMAL_UNSIGNED:
       case DECIMAL:
         return Types.DecimalType.of(typeBean.getColumnSize(), 
typeBean.getScale());
       case VARCHAR:
diff --git 
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/converter/TestMysqlTypeConverter.java
 
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/converter/TestMysqlTypeConverter.java
index 9478d133ac..e34c6dc5ea 100644
--- 
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/converter/TestMysqlTypeConverter.java
+++ 
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/converter/TestMysqlTypeConverter.java
@@ -28,6 +28,7 @@ import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.BI
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.CHAR;
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.DATETIME;
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.DECIMAL;
+import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.DECIMAL_UNSIGNED;
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.DOUBLE;
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.FLOAT;
 import static 
org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter.INT;
@@ -57,6 +58,7 @@ public class TestMysqlTypeConverter {
     checkJdbcTypeToGravitinoType(Types.TimestampType.withoutTimeZone(), 
DATETIME, null, null);
     checkJdbcTypeToGravitinoType(Types.TimestampType.withTimeZone(), 
TIMESTAMP, null, null);
     checkJdbcTypeToGravitinoType(Types.DecimalType.of(10, 2), DECIMAL, 10, 2);
+    checkJdbcTypeToGravitinoType(Types.DecimalType.of(10, 2), 
DECIMAL_UNSIGNED, 10, 2);
     checkJdbcTypeToGravitinoType(Types.VarCharType.of(20), VARCHAR, 20, null);
     checkJdbcTypeToGravitinoType(Types.FixedCharType.of(20), CHAR, 20, null);
     checkJdbcTypeToGravitinoType(Types.StringType.get(), TEXT, null, null);
diff --git a/integration-test-common/docker-script/init/mysql/init.sql 
b/integration-test-common/docker-script/init/mysql/init.sql
index f2b730b90f..23c6906695 100644
--- a/integration-test-common/docker-script/init/mysql/init.sql
+++ b/integration-test-common/docker-script/init/mysql/init.sql
@@ -18,3 +18,104 @@
  */
 GRANT ALL PRIVILEGES on *.* to 'trino'@'%';
 FLUSH PRIVILEGES;
+CREATE DATABASE gt_mysql_test_all_type;
+CREATE TABLE gt_mysql_test_all_type.demo
+(
+    -- 数值类型
+    id BIGINT PRIMARY KEY,
+    tiny_col TINYINT,
+    tiny_unsigned_col TINYINT UNSIGNED,
+    small_col SMALLINT,
+    small_unsigned_col SMALLINT UNSIGNED,
+    medium_col MEDIUMINT,
+    medium_unsigned_col MEDIUMINT UNSIGNED,
+    int_col INT,
+    int_unsigned_col INT UNSIGNED,
+    bigint_col BIGINT,
+    bigint_unsigned_col BIGINT UNSIGNED,
+    float_col FLOAT,
+    float_unsigned_col FLOAT UNSIGNED,
+    double_col DOUBLE,
+    double_unsigned_col DOUBLE UNSIGNED,
+    decimal_col DECIMAL(12,6),
+    decimal_unsigned_col DECIMAL(12,6) UNSIGNED,
+    -- 字符串类型
+    char_col CHAR(10),
+    varchar_col VARCHAR(255),
+    tinytext_col TINYTEXT,
+    text_col TEXT,
+    mediumtext_col MEDIUMTEXT,
+    longtext_col LONGTEXT,
+    -- 日期时间类型
+    date_col DATE,
+    time_col TIME,
+    datetime_col DATETIME,
+    timestamp_col TIMESTAMP,
+    year_col YEAR,
+    -- json
+    json_col JSON,
+    -- 枚举与集合
+    enum_col ENUM('red','green','blue'),
+    set_col SET('read','write','execute'),
+    -- 二进制类型
+    binary_col BINARY(16),
+    varbinary_col VARBINARY(100),
+    tinyblob_col TINYBLOB,
+    blob_col BLOB,
+    mediumblob_col MEDIUMBLOB,
+    longblob_col LONGBLOB,
+    -- 空间类型
+    point_col POINT,
+    geometry_col GEOMETRY
+);
+INSERT INTO gt_mysql_test_all_type.demo (
+    id, tiny_col, tiny_unsigned_col, small_col, small_unsigned_col,medium_col,
+    medium_unsigned_col, int_col, int_unsigned_col, bigint_col, 
bigint_unsigned_col,
+    float_col, float_unsigned_col, double_col, double_unsigned_col, 
decimal_col, decimal_unsigned_col,
+    char_col, varchar_col, tinytext_col, text_col, mediumtext_col, 
longtext_col,
+    date_col, time_col, datetime_col, timestamp_col, year_col, json_col,
+    enum_col, set_col,
+    binary_col, varbinary_col, tinyblob_col, blob_col, mediumblob_col, 
longblob_col,
+    point_col, geometry_col
+) VALUES (
+    1,                                      -- id
+    100,                                    -- tiny_col
+    100,                                    -- tiny_unsigned_col
+    500,                                    -- small_col
+    500,                                    -- small_unsigned_col
+    10000,                                  -- medium_col
+    10000,                                  -- medium_unsigned_col
+    200000,                                 -- int_col
+    200000,                                 -- int_unsigned_col
+    200000,                                 -- bigint_col
+    200000,                                 -- bigint_unsigned_col
+    123.45,                                 -- float_col
+    123.45,                                 -- float_unsigned_col
+    9876.5432,                              -- double_col
+    9876.5432,                              -- double_unsigned_col
+    123456.789000,                          -- decimal_col
+    123456.789000,                          -- decimal_unsigned_col
+    'abc',                                  -- char_col
+    'abc',                                  -- varchar_col
+    'abc',                                  -- tinytext_col
+    'abc',                                  -- text_col
+    'abc',                                  -- mediumtext_col
+    'abc',                                  -- longtext_col
+    '2025-07-04',                           -- date_col
+    '14:30:00',                             -- time_col
+    '2025-07-04 14:30:00',                  -- datetime_col
+    '2025-07-04 14:30:00',                  -- timestamp_col
+    '2025',                                 -- year_col
+    '{"x": 1, "y": 2}',                     -- json_col
+    'green',                                -- enum_col
+    'read,write',                           -- set_col
+    X'A1B2C3D4',                            -- binary_col
+    X'A1B2',                                -- varbinary_col
+    X'123456',                              -- tinyblob_col
+    X'ABCDEF',                              -- blob_col
+    X'1234567890',                          -- mediumblob_col
+    X'A1B2C3D4E5',                          -- longblob_col
+    ST_GeomFromText('POINT(10 20)'),        -- point_col
+    ST_GeomFromText('LINESTRING(0 0, 10 10)') -- geometry_col
+);
+
diff --git 
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.sql
 
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.sql
new file mode 100644
index 0000000000..bb9d4b9472
--- /dev/null
+++ 
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.sql
@@ -0,0 +1,4 @@
+-- Table create by integration-test-common/docker-script/init/mysql/init.sql
+show create table gt_mysql.gt_mysql_test_all_type.demo;
+
+select * from gt_mysql.gt_mysql_test_all_type.demo;
diff --git 
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.txt
 
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.txt
new file mode 100644
index 0000000000..b592dca267
--- /dev/null
+++ 
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00009_datatype_mapping.txt
@@ -0,0 +1,47 @@
+"CREATE TABLE gt_mysql.gt_mysql_test_all_type.demo (
+   id bigint NOT NULL,
+   tiny_col tinyint,
+   tiny_unsigned_col smallint,
+   small_col smallint,
+   small_unsigned_col integer,
+   medium_col integer,
+   medium_unsigned_col integer,
+   int_col integer,
+   int_unsigned_col bigint,
+   bigint_col bigint,
+   bigint_unsigned_col decimal(20, 0),
+   float_col real,
+   float_unsigned_col real,
+   double_col double,
+   double_unsigned_col double,
+   decimal_col decimal(12, 6),
+   decimal_unsigned_col decimal(12, 6),
+   char_col char(10),
+   varchar_col varchar(255),
+   tinytext_col varchar,
+   text_col varchar,
+   mediumtext_col varchar,
+   longtext_col varchar,
+   date_col date,
+   time_col time(0),
+   datetime_col timestamp(0),
+   timestamp_col timestamp(0) with time zone,
+   year_col date,
+   json_col json,
+   enum_col varchar,
+   set_col varchar,
+   binary_col varbinary,
+   varbinary_col varbinary,
+   tinyblob_col varbinary,
+   blob_col varbinary,
+   mediumblob_col varbinary,
+   longblob_col varbinary,
+   point_col varbinary,
+   geometry_col varbinary
+)
+COMMENT ''
+WITH (
+   engine = 'InnoDB'
+)"
+
+"1","100","100","500","500","10000","10000","200000","200000","200000","200000","123.45","123.45","9876.5432","9876.5432","123456.789000","123456.789000","abc
       ","abc","abc","abc","abc","abc","2025-07-04","14:30:00","2025-07-04 
14:30:00","2025-07-04 14:30:00 
UTC","2025-01-01","{""x"":1,""y"":2}","green","read,write","a1 b2 c3 d4 00 00 
00 00 00 00 00 00 00 00 00 00","a1 b2","12 34 56","ab cd ef","12 34 56 78 
90","a1 b2 c3 d4 e5","00 00 00 00 01 01 00 00 00 00 00 00 00 00 00 24 40 00  
[...]
diff --git 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLDataTypeTransformer.java
 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLDataTypeTransformer.java
index 089311e6a4..920793d2e9 100644
--- 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLDataTypeTransformer.java
+++ 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLDataTypeTransformer.java
@@ -21,7 +21,6 @@ package 
org.apache.gravitino.trino.connector.catalog.jdbc.mysql;
 
 import io.trino.spi.TrinoException;
 import io.trino.spi.type.CharType;
-import io.trino.spi.type.StandardTypes;
 import io.trino.spi.type.TimeType;
 import io.trino.spi.type.TimestampType;
 import io.trino.spi.type.TimestampWithTimeZoneType;
@@ -59,9 +58,7 @@ public class MySQLDataTypeTransformer extends 
GeneralDataTypeTransformer {
       return TimeType.TIME_SECONDS;
     } else if (Name.EXTERNAL == type.name()) {
       String catalogString = ((Types.ExternalType) type).catalogString();
-      if (StandardTypes.JSON.equalsIgnoreCase(catalogString)) {
-        return JSON_TYPE;
-      }
+      return MySQLExternalDataType.safeValueOf(catalogString).getTrinoType();
     }
 
     return super.getTrinoType(type);
@@ -105,7 +102,7 @@ public class MySQLDataTypeTransformer extends 
GeneralDataTypeTransformer {
       }
       return Types.VarCharType.of(length);
     } else if (typeClass == JSON_TYPE.getClass()) {
-      return Types.ExternalType.of(StandardTypes.JSON);
+      return 
Types.ExternalType.of(MySQLExternalDataType.JSON.getMysqlTypeName());
     }
 
     return super.getGravitinoType(type);
diff --git 
a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLExternalDataType.java
 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLExternalDataType.java
new file mode 100644
index 0000000000..03f4661689
--- /dev/null
+++ 
b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLExternalDataType.java
@@ -0,0 +1,94 @@
+/*
+ * 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.gravitino.trino.connector.catalog.jdbc.mysql;
+
+import static 
org.apache.gravitino.trino.connector.catalog.jdbc.mysql.MySQLDataTypeTransformer.JSON_TYPE;
+
+import io.trino.spi.type.DateType;
+import io.trino.spi.type.DoubleType;
+import io.trino.spi.type.IntegerType;
+import io.trino.spi.type.RealType;
+import io.trino.spi.type.Type;
+import io.trino.spi.type.VarbinaryType;
+import io.trino.spi.type.VarcharType;
+
+/**
+ * External type mapping between MySQL and Trino
+ *
+ * <p>TODO: type mapping base on jdbcType rather than typeName
+ *
+ * <p>see 
https://trino.io/docs/current/connector/mysql.html#mysql-to-trino-type-mapping
+ */
+public enum MySQLExternalDataType {
+  MEDIUMINT("mediumint", IntegerType.INTEGER),
+  MEDIUMINT_UNSIGNED("mediumint unsigned", IntegerType.INTEGER),
+  FLOAT_UNSIGNED("float unsigned", RealType.REAL),
+  DOUBLE_UNSIGNED("double unsigned", DoubleType.DOUBLE),
+  TINYTEXT("tinytext", VarcharType.VARCHAR),
+  MEDIUMTEXT("mediumtext", VarcharType.VARCHAR),
+  LONGTEXT("longtext", VarcharType.VARCHAR),
+  YEAR("year", DateType.DATE),
+  ENUM("enum", VarcharType.VARCHAR),
+  SET("set", VarcharType.VARCHAR),
+  JSON("json", JSON_TYPE),
+  VARBINARY("varbinary", VarbinaryType.VARBINARY),
+  TINYBLOB("tinyblob", VarbinaryType.VARBINARY),
+  BLOB("blob", VarbinaryType.VARBINARY),
+  MEDIUMBLOB("mediumblob", VarbinaryType.VARBINARY),
+  LONGBLOB("longblob", VarbinaryType.VARBINARY),
+  GEOMETRY("geometry", VarbinaryType.VARBINARY),
+  /**
+   * In Trino, session property unsupported_type_handling default value is
+   * UnsupportedTypeHandling.IGNORE. For unsupported data types, standardize 
mapping to varchar for
+   * enhanced usability. Equivalent to default configuration of the 
unsupported_type_handling is
+   * UnsupportedTypeHandling.CONVERT_TO_VARCHAR
+   *
+   * <p>TODO: type mapping support unsupported_type_handling and 
jdbc-types-mapped-to-varchar
+   */
+  UNKNOWN("unknown", VarcharType.VARCHAR);
+
+  private final String mysqlTypeName;
+
+  // suppress ImmutableEnumChecker because Type is outside the project.
+  @SuppressWarnings("ImmutableEnumChecker")
+  private final Type trinoType;
+
+  private MySQLExternalDataType(String mysqlTypeName, Type trinoType) {
+    this.mysqlTypeName = mysqlTypeName;
+    this.trinoType = trinoType;
+  }
+
+  public String getMysqlTypeName() {
+    return mysqlTypeName;
+  }
+
+  public Type getTrinoType() {
+    return trinoType;
+  }
+
+  public static MySQLExternalDataType safeValueOf(String mysqlTypeName) {
+    for (MySQLExternalDataType mySQLExternalDataType : 
MySQLExternalDataType.values()) {
+      if (mySQLExternalDataType.mysqlTypeName.equalsIgnoreCase(mysqlTypeName)) 
{
+        return mySQLExternalDataType;
+      }
+    }
+    return UNKNOWN;
+  }
+}
diff --git 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/TestMySQLDataTypeTransformer.java
 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/TestMySQLDataTypeTransformer.java
index 7e2048a028..3629edd883 100644
--- 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/TestMySQLDataTypeTransformer.java
+++ 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/TestMySQLDataTypeTransformer.java
@@ -22,6 +22,12 @@ package 
org.apache.gravitino.trino.connector.catalog.jdbc.mysql;
 import static 
org.apache.gravitino.trino.connector.catalog.jdbc.mysql.MySQLDataTypeTransformer.JSON_TYPE;
 
 import io.trino.spi.TrinoException;
+import io.trino.spi.type.DateType;
+import io.trino.spi.type.DoubleType;
+import io.trino.spi.type.IntegerType;
+import io.trino.spi.type.RealType;
+import io.trino.spi.type.VarbinaryType;
+import io.trino.spi.type.VarcharType;
 import org.apache.gravitino.rel.types.Type;
 import org.apache.gravitino.rel.types.Types;
 import org.apache.gravitino.trino.connector.util.GeneralDataTypeTransformer;
@@ -104,10 +110,71 @@ public class TestMySQLDataTypeTransformer {
   }
 
   @Test
-  public void testGravitinoExternalJsonTypeToTrinoType() {
+  public void testGravitinoExternalTypeToTrinoType() {
     GeneralDataTypeTransformer generalDataTypeTransformer = new 
MySQLDataTypeTransformer();
 
+    Type mediumintType = Types.ExternalType.of("mediumint");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(mediumintType), 
IntegerType.INTEGER);
+
+    Type mediumintUnsignedType = Types.ExternalType.of("mediumint unsigned");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(mediumintUnsignedType), 
IntegerType.INTEGER);
+
+    Type floatUnsignedType = Types.ExternalType.of("float unsigned");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(floatUnsignedType), 
RealType.REAL);
+
+    Type doubleUnsignedType = Types.ExternalType.of("double unsigned");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(doubleUnsignedType), 
DoubleType.DOUBLE);
+
+    Type tinytextType = Types.ExternalType.of("tinytext");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(tinytextType), 
VarcharType.VARCHAR);
+
+    Type mediumtextType = Types.ExternalType.of("mediumtext");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(mediumtextType), 
VarcharType.VARCHAR);
+
+    Type longtextType = Types.ExternalType.of("longtext");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(longtextType), 
VarcharType.VARCHAR);
+
+    Type yearType = Types.ExternalType.of("year");
+    Assertions.assertEquals(generalDataTypeTransformer.getTrinoType(yearType), 
DateType.DATE);
+
+    Type enumType = Types.ExternalType.of("enum");
+    Assertions.assertEquals(generalDataTypeTransformer.getTrinoType(enumType), 
VarcharType.VARCHAR);
+
+    Type setType = Types.ExternalType.of("set");
+    Assertions.assertEquals(generalDataTypeTransformer.getTrinoType(setType), 
VarcharType.VARCHAR);
+
     Type jsonType = Types.ExternalType.of("json");
     Assertions.assertEquals(generalDataTypeTransformer.getTrinoType(jsonType), 
JSON_TYPE);
+
+    Type varbinaryType = Types.ExternalType.of("varbinary");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(varbinaryType), 
VarbinaryType.VARBINARY);
+
+    Type tinyblobType = Types.ExternalType.of("tinyblob");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(tinyblobType), 
VarbinaryType.VARBINARY);
+
+    Type mediumblobType = Types.ExternalType.of("mediumblob");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(mediumblobType), 
VarbinaryType.VARBINARY);
+
+    Type longblobType = Types.ExternalType.of("longblob");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(longblobType), 
VarbinaryType.VARBINARY);
+
+    Type geometryType = Types.ExternalType.of("geometry");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(geometryType), 
VarbinaryType.VARBINARY);
+
+    Type unknownType = Types.ExternalType.of("unknown");
+    Assertions.assertEquals(
+        generalDataTypeTransformer.getTrinoType(unknownType), 
VarcharType.VARCHAR);
   }
 }

Reply via email to