You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kyuubi.apache.org by ch...@apache.org on 2022/06/16 07:42:42 UTC

[incubator-kyuubi] branch master updated: [KYUUBI #2782] Decouple Kyuubi Hive JDBC from Hive Serde

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

chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-kyuubi.git


The following commit(s) were added to refs/heads/master by this push:
     new e3bf6044e [KYUUBI #2782] Decouple Kyuubi Hive JDBC from Hive Serde
e3bf6044e is described below

commit e3bf6044ec6d381cc5e56aaff1cf0a46592a87e1
Author: jiaoqingbo <11...@qq.com>
AuthorDate: Thu Jun 16 15:42:34 2022 +0800

    [KYUUBI #2782] Decouple Kyuubi Hive JDBC from Hive Serde
    
    ### _Why are the changes needed?_
    
    fix #2782
    
    ### _How was this patch tested?_
    - [ ] Add some test cases that check the changes thoroughly including negative and positive cases if possible
    
    - [ ] Add screenshots for manual tests if appropriate
    
    - [ ] [Run test](https://kyuubi.apache.org/docs/latest/develop_tools/testing.html#running-tests) locally before make a pull request
    
    Closes #2878 from jiaoqingbo/kyuubi-2782.
    
    Closes #2782
    
    23b19897 [jiaoqingbo] code review
    6cb40195 [jiaoqingbo] code review
    90839742 [jiaoqingbo] [KYUUBI #2782] Decouple Kyuubi Hive JDBC from Hive Serde
    
    Authored-by: jiaoqingbo <11...@qq.com>
    Signed-off-by: Cheng Pan <ch...@apache.org>
---
 kyuubi-hive-jdbc/pom.xml                           |  12 -
 .../org/apache/kyuubi/jdbc/hive/JdbcColumn.java    | 383 ++++++++++-----------
 .../kyuubi/jdbc/hive/KyuubiBaseResultSet.java      |  26 +-
 .../kyuubi/jdbc/hive/KyuubiDatabaseMetaData.java   | 122 ++++---
 .../kyuubi/jdbc/hive/KyuubiMetaDataResultSet.java  |   3 +-
 .../kyuubi/jdbc/hive/KyuubiQueryResultSet.java     |  45 +--
 .../kyuubi/jdbc/hive/KyuubiResultSetMetaData.java  |  28 +-
 7 files changed, 290 insertions(+), 329 deletions(-)

diff --git a/kyuubi-hive-jdbc/pom.xml b/kyuubi-hive-jdbc/pom.xml
index 280f9022a..42a1b03df 100644
--- a/kyuubi-hive-jdbc/pom.xml
+++ b/kyuubi-hive-jdbc/pom.xml
@@ -136,18 +136,6 @@
             </exclusions>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.hive</groupId>
-            <artifactId>hive-serde</artifactId>
-            <version>${hive.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>*</groupId>
-                    <artifactId>*</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
         <dependency>
             <groupId>org.apache.hive</groupId>
             <artifactId>hive-service</artifactId>
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/JdbcColumn.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/JdbcColumn.java
index be641142f..12199ec25 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/JdbcColumn.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/JdbcColumn.java
@@ -17,16 +17,16 @@
 
 package org.apache.kyuubi.jdbc.hive;
 
+import static java.sql.Types.*;
+
 import java.math.BigInteger;
 import java.sql.Date;
 import java.sql.SQLException;
 import java.sql.Timestamp;
-import java.sql.Types;
 import org.apache.hadoop.hive.common.type.HiveIntervalDayTime;
 import org.apache.hadoop.hive.common.type.HiveIntervalYearMonth;
 import org.apache.hadoop.hive.common.type.TimestampTZ;
-import org.apache.hadoop.hive.serde.serdeConstants;
-import org.apache.hadoop.hive.serde2.thrift.Type;
+import org.apache.hive.service.rpc.thrift.TTypeId;
 
 /** Column metadata. */
 public class JdbcColumn {
@@ -68,43 +68,43 @@ public class JdbcColumn {
     return type;
   }
 
-  static String columnClassName(Type hiveType, JdbcColumnAttributes columnAttributes)
+  static String columnClassName(TTypeId tType, JdbcColumnAttributes columnAttributes)
       throws SQLException {
-    int columnType = hiveTypeToSqlType(hiveType);
+    int columnType = convertTTypeIdToSqlType(tType);
     switch (columnType) {
-      case Types.NULL:
+      case NULL:
         return "null";
-      case Types.BOOLEAN:
+      case BOOLEAN:
         return Boolean.class.getName();
-      case Types.CHAR:
-      case Types.VARCHAR:
+      case CHAR:
+      case VARCHAR:
         return String.class.getName();
-      case Types.TINYINT:
+      case TINYINT:
         return Byte.class.getName();
-      case Types.SMALLINT:
+      case SMALLINT:
         return Short.class.getName();
-      case Types.INTEGER:
+      case INTEGER:
         return Integer.class.getName();
-      case Types.BIGINT:
+      case BIGINT:
         return Long.class.getName();
-      case Types.DATE:
+      case DATE:
         return Date.class.getName();
-      case Types.FLOAT:
+      case FLOAT:
         return Float.class.getName();
-      case Types.DOUBLE:
+      case DOUBLE:
         return Double.class.getName();
-      case Types.TIMESTAMP:
+      case TIMESTAMP:
         return Timestamp.class.getName();
-      case Types.TIMESTAMP_WITH_TIMEZONE:
+      case TIMESTAMP_WITH_TIMEZONE:
         return TimestampTZ.class.getName();
-      case Types.DECIMAL:
+      case DECIMAL:
         return BigInteger.class.getName();
-      case Types.BINARY:
+      case BINARY:
         return byte[].class.getName();
-      case Types.OTHER:
-      case Types.JAVA_OBJECT:
+      case OTHER:
+      case JAVA_OBJECT:
         {
-          switch (hiveType) {
+          switch (tType) {
             case INTERVAL_YEAR_MONTH_TYPE:
               return HiveIntervalYearMonth.class.getName();
             case INTERVAL_DAY_TIME_TYPE:
@@ -113,208 +113,196 @@ public class JdbcColumn {
               return String.class.getName();
           }
         }
-      case Types.ARRAY:
-      case Types.STRUCT:
+      case ARRAY:
+      case STRUCT:
         return String.class.getName();
       default:
         throw new SQLException("Invalid column type: " + columnType);
     }
   }
 
-  static Type typeStringToHiveType(String type) throws SQLException {
-    if ("string".equalsIgnoreCase(type)) {
-      return Type.STRING_TYPE;
-    } else if ("varchar".equalsIgnoreCase(type)) {
-      return Type.VARCHAR_TYPE;
-    } else if ("char".equalsIgnoreCase(type)) {
-      return Type.CHAR_TYPE;
-    } else if ("float".equalsIgnoreCase(type)) {
-      return Type.FLOAT_TYPE;
-    } else if ("double".equalsIgnoreCase(type)) {
-      return Type.DOUBLE_TYPE;
-    } else if ("boolean".equalsIgnoreCase(type)) {
-      return Type.BOOLEAN_TYPE;
-    } else if ("tinyint".equalsIgnoreCase(type)) {
-      return Type.TINYINT_TYPE;
-    } else if ("smallint".equalsIgnoreCase(type)) {
-      return Type.SMALLINT_TYPE;
-    } else if ("int".equalsIgnoreCase(type)) {
-      return Type.INT_TYPE;
-    } else if ("bigint".equalsIgnoreCase(type)) {
-      return Type.BIGINT_TYPE;
-    } else if ("date".equalsIgnoreCase(type)) {
-      return Type.DATE_TYPE;
-    } else if ("timestamp".equalsIgnoreCase(type)) {
-      return Type.TIMESTAMP_TYPE;
-    } else if (serdeConstants.TIMESTAMPLOCALTZ_TYPE_NAME.equalsIgnoreCase(type)) {
-      return Type.TIMESTAMPLOCALTZ_TYPE;
-    } else if ("interval_year_month".equalsIgnoreCase(type)) {
-      return Type.INTERVAL_YEAR_MONTH_TYPE;
-    } else if ("interval_day_time".equalsIgnoreCase(type)) {
-      return Type.INTERVAL_DAY_TIME_TYPE;
-    } else if ("decimal".equalsIgnoreCase(type)) {
-      return Type.DECIMAL_TYPE;
-    } else if ("binary".equalsIgnoreCase(type)) {
-      return Type.BINARY_TYPE;
-    } else if ("map".equalsIgnoreCase(type)) {
-      return Type.MAP_TYPE;
-    } else if ("array".equalsIgnoreCase(type)) {
-      return Type.ARRAY_TYPE;
-    } else if ("struct".equalsIgnoreCase(type)) {
-      return Type.STRUCT_TYPE;
-    } else if ("uniontype".equalsIgnoreCase(type)) {
-      return Type.UNION_TYPE;
-    } else if ("void".equalsIgnoreCase(type) || "null".equalsIgnoreCase(type)) {
-      return Type.NULL_TYPE;
+  public static int convertTTypeIdToSqlType(TTypeId type) throws SQLException {
+    switch (type) {
+      case STRING_TYPE:
+      case VARCHAR_TYPE:
+        return VARCHAR;
+      case CHAR_TYPE:
+        return CHAR;
+      case FLOAT_TYPE:
+        return FLOAT;
+      case DOUBLE_TYPE:
+        return DOUBLE;
+      case BOOLEAN_TYPE:
+        return BOOLEAN;
+      case TINYINT_TYPE:
+        return TINYINT;
+      case SMALLINT_TYPE:
+        return SMALLINT;
+      case INT_TYPE:
+        return INTEGER;
+      case BIGINT_TYPE:
+        return BIGINT;
+      case DATE_TYPE:
+        return DATE;
+      case TIMESTAMP_TYPE:
+        return TIMESTAMP;
+      case TIMESTAMPLOCALTZ_TYPE:
+      case INTERVAL_YEAR_MONTH_TYPE:
+      case INTERVAL_DAY_TIME_TYPE:
+      case UNION_TYPE:
+        return OTHER;
+      case DECIMAL_TYPE:
+        return DECIMAL;
+      case BINARY_TYPE:
+        return BINARY;
+      case MAP_TYPE:
+        return JAVA_OBJECT;
+      case ARRAY_TYPE:
+        return ARRAY;
+      case STRUCT_TYPE:
+        return STRUCT;
+      case NULL_TYPE:
+        return NULL;
+      default:
+        throw new SQLException("Invalid column type: " + type);
     }
-    throw new SQLException("Unrecognized column type: " + type);
-  }
-
-  public static int hiveTypeToSqlType(Type hiveType) throws SQLException {
-    return hiveType.toJavaSQLType();
-  }
-
-  public static int hiveTypeToSqlType(String type) throws SQLException {
-    return hiveTypeToSqlType(typeStringToHiveType(type));
   }
 
-  static String getColumnTypeName(String type) throws SQLException {
-    // we need to convert the Hive type to the SQL type name
-    // TODO: this would be better handled in an enum
-    if ("string".equalsIgnoreCase(type)) {
-      return serdeConstants.STRING_TYPE_NAME;
-    } else if ("varchar".equalsIgnoreCase(type)) {
-      return serdeConstants.VARCHAR_TYPE_NAME;
-    } else if ("char".equalsIgnoreCase(type)) {
-      return serdeConstants.CHAR_TYPE_NAME;
-    } else if ("float".equalsIgnoreCase(type)) {
-      return serdeConstants.FLOAT_TYPE_NAME;
-    } else if ("double".equalsIgnoreCase(type)) {
-      return serdeConstants.DOUBLE_TYPE_NAME;
-    } else if ("boolean".equalsIgnoreCase(type)) {
-      return serdeConstants.BOOLEAN_TYPE_NAME;
-    } else if ("tinyint".equalsIgnoreCase(type)) {
-      return serdeConstants.TINYINT_TYPE_NAME;
-    } else if ("smallint".equalsIgnoreCase(type)) {
-      return serdeConstants.SMALLINT_TYPE_NAME;
-    } else if ("int".equalsIgnoreCase(type)) {
-      return serdeConstants.INT_TYPE_NAME;
-    } else if ("bigint".equalsIgnoreCase(type)) {
-      return serdeConstants.BIGINT_TYPE_NAME;
-    } else if ("timestamp".equalsIgnoreCase(type)) {
-      return serdeConstants.TIMESTAMP_TYPE_NAME;
-    } else if (serdeConstants.TIMESTAMPLOCALTZ_TYPE_NAME.equalsIgnoreCase(type)) {
-      return serdeConstants.TIMESTAMPLOCALTZ_TYPE_NAME;
-    } else if ("date".equalsIgnoreCase(type)) {
-      return serdeConstants.DATE_TYPE_NAME;
-    } else if ("interval_year_month".equalsIgnoreCase(type)) {
-      return serdeConstants.INTERVAL_YEAR_MONTH_TYPE_NAME;
-    } else if ("interval_day_time".equalsIgnoreCase(type)) {
-      return serdeConstants.INTERVAL_DAY_TIME_TYPE_NAME;
-    } else if ("decimal".equalsIgnoreCase(type)) {
-      return serdeConstants.DECIMAL_TYPE_NAME;
-    } else if ("binary".equalsIgnoreCase(type)) {
-      return serdeConstants.BINARY_TYPE_NAME;
-    } else if ("void".equalsIgnoreCase(type) || "null".equalsIgnoreCase(type)) {
-      return serdeConstants.VOID_TYPE_NAME;
-    } else if (type.equalsIgnoreCase("map")) {
-      return serdeConstants.MAP_TYPE_NAME;
-    } else if (type.equalsIgnoreCase("array")) {
-      return serdeConstants.LIST_TYPE_NAME;
-    } else if (type.equalsIgnoreCase("struct")) {
-      return serdeConstants.STRUCT_TYPE_NAME;
+  static String getColumnTypeName(TTypeId type) throws SQLException {
+    switch (type) {
+      case STRING_TYPE:
+        return "string";
+      case VARCHAR_TYPE:
+        return "varchar";
+      case CHAR_TYPE:
+        return "char";
+      case FLOAT_TYPE:
+        return "float";
+      case DOUBLE_TYPE:
+        return "double";
+      case BOOLEAN_TYPE:
+        return "boolean";
+      case TINYINT_TYPE:
+        return "tinyint";
+      case SMALLINT_TYPE:
+        return "smallint";
+      case INT_TYPE:
+        return "int";
+      case BIGINT_TYPE:
+        return "bigint";
+      case DATE_TYPE:
+        return "date";
+      case TIMESTAMP_TYPE:
+        return "timestamp";
+      case TIMESTAMPLOCALTZ_TYPE:
+        return "timestamp with local time zone";
+      case INTERVAL_YEAR_MONTH_TYPE:
+        return "interval_year_month";
+      case INTERVAL_DAY_TIME_TYPE:
+        return "interval_day_time";
+      case DECIMAL_TYPE:
+        return "decimal";
+      case BINARY_TYPE:
+        return "binary";
+      case MAP_TYPE:
+        return "map";
+      case ARRAY_TYPE:
+        return "array";
+      case STRUCT_TYPE:
+        return "struct";
+      case NULL_TYPE:
+        return "void";
+      default:
+        throw new SQLException("Invalid column type: " + type);
     }
-
-    throw new SQLException("Unrecognized column type: " + type);
   }
 
-  static int columnDisplaySize(Type hiveType, JdbcColumnAttributes columnAttributes)
+  static int columnDisplaySize(TTypeId tType, JdbcColumnAttributes columnAttributes)
       throws SQLException {
-    // according to hiveTypeToSqlType possible options are:
-    int columnType = hiveTypeToSqlType(hiveType);
+    int columnType = convertTTypeIdToSqlType(tType);
     switch (columnType) {
-      case Types.NULL:
+      case NULL:
         return 4; // "NULL"
-      case Types.BOOLEAN:
-        return columnPrecision(hiveType, columnAttributes);
-      case Types.CHAR:
-      case Types.VARCHAR:
-        return columnPrecision(hiveType, columnAttributes);
-      case Types.BINARY:
+      case BOOLEAN:
+        return columnPrecision(tType, columnAttributes);
+      case CHAR:
+      case VARCHAR:
+        return columnPrecision(tType, columnAttributes);
+      case BINARY:
         return Integer.MAX_VALUE; // hive has no max limit for binary
-      case Types.TINYINT:
-      case Types.SMALLINT:
-      case Types.INTEGER:
-      case Types.BIGINT:
-        return columnPrecision(hiveType, columnAttributes) + 1; // allow +/-
-      case Types.DATE:
+      case TINYINT:
+      case SMALLINT:
+      case INTEGER:
+      case BIGINT:
+        return columnPrecision(tType, columnAttributes) + 1; // allow +/-
+      case DATE:
         return 10;
-      case Types.TIMESTAMP:
-      case Types.TIMESTAMP_WITH_TIMEZONE:
-        return columnPrecision(hiveType, columnAttributes);
+      case TIMESTAMP:
+      case TIMESTAMP_WITH_TIMEZONE:
+        return columnPrecision(tType, columnAttributes);
 
         // see
         // http://download.oracle.com/javase/6/docs/api/constant-values.html#java.lang.Float.MAX_EXPONENT
-      case Types.FLOAT:
+      case FLOAT:
         return 24; // e.g. -(17#).e-###
         // see
         // http://download.oracle.com/javase/6/docs/api/constant-values.html#java.lang.Double.MAX_EXPONENT
-      case Types.DOUBLE:
+      case DOUBLE:
         return 25; // e.g. -(17#).e-####
-      case Types.DECIMAL:
-        return columnPrecision(hiveType, columnAttributes) + 2; // '-' sign and '.'
-      case Types.OTHER:
-      case Types.JAVA_OBJECT:
-        return columnPrecision(hiveType, columnAttributes);
-      case Types.ARRAY:
-      case Types.STRUCT:
+      case DECIMAL:
+        return columnPrecision(tType, columnAttributes) + 2; // '-' sign and '.'
+      case OTHER:
+      case JAVA_OBJECT:
+        return columnPrecision(tType, columnAttributes);
+      case ARRAY:
+      case STRUCT:
         return Integer.MAX_VALUE;
       default:
         throw new SQLException("Invalid column type: " + columnType);
     }
   }
 
-  static int columnPrecision(Type hiveType, JdbcColumnAttributes columnAttributes)
+  static int columnPrecision(TTypeId tType, JdbcColumnAttributes columnAttributes)
       throws SQLException {
-    int columnType = hiveTypeToSqlType(hiveType);
+    int columnType = convertTTypeIdToSqlType(tType);
     // according to hiveTypeToSqlType possible options are:
     switch (columnType) {
-      case Types.NULL:
+      case NULL:
         return 0;
-      case Types.BOOLEAN:
+      case BOOLEAN:
         return 1;
-      case Types.CHAR:
-      case Types.VARCHAR:
+      case CHAR:
+      case VARCHAR:
         if (columnAttributes != null) {
           return columnAttributes.precision;
         }
         return Integer.MAX_VALUE; // hive has no max limit for strings
-      case Types.BINARY:
+      case BINARY:
         return Integer.MAX_VALUE; // hive has no max limit for binary
-      case Types.TINYINT:
+      case TINYINT:
         return 3;
-      case Types.SMALLINT:
+      case SMALLINT:
         return 5;
-      case Types.INTEGER:
+      case INTEGER:
         return 10;
-      case Types.BIGINT:
+      case BIGINT:
         return 19;
-      case Types.FLOAT:
+      case FLOAT:
         return 7;
-      case Types.DOUBLE:
+      case DOUBLE:
         return 15;
-      case Types.DATE:
+      case DATE:
         return 10;
-      case Types.TIMESTAMP:
+      case TIMESTAMP:
         return 29;
-      case Types.TIMESTAMP_WITH_TIMEZONE:
+      case TIMESTAMP_WITH_TIMEZONE:
         return 31;
-      case Types.DECIMAL:
+      case DECIMAL:
         return columnAttributes.precision;
-      case Types.OTHER:
-      case Types.JAVA_OBJECT:
+      case OTHER:
+      case JAVA_OBJECT:
         {
-          switch (hiveType) {
+          switch (tType) {
             case INTERVAL_YEAR_MONTH_TYPE:
               // -yyyyyyy-mm  : should be more than enough
               return 11;
@@ -325,42 +313,41 @@ public class JdbcColumn {
               return Integer.MAX_VALUE;
           }
         }
-      case Types.ARRAY:
-      case Types.STRUCT:
+      case ARRAY:
+      case STRUCT:
         return Integer.MAX_VALUE;
       default:
         throw new SQLException("Invalid column type: " + columnType);
     }
   }
 
-  static int columnScale(Type hiveType, JdbcColumnAttributes columnAttributes) throws SQLException {
-    int columnType = hiveTypeToSqlType(hiveType);
-    // according to hiveTypeToSqlType possible options are:
+  static int columnScale(int columnType, JdbcColumnAttributes columnAttributes)
+      throws SQLException {
     switch (columnType) {
-      case Types.NULL:
-      case Types.BOOLEAN:
-      case Types.CHAR:
-      case Types.VARCHAR:
-      case Types.TINYINT:
-      case Types.SMALLINT:
-      case Types.INTEGER:
-      case Types.BIGINT:
-      case Types.DATE:
-      case Types.BINARY:
+      case NULL:
+      case BOOLEAN:
+      case CHAR:
+      case VARCHAR:
+      case TINYINT:
+      case SMALLINT:
+      case INTEGER:
+      case BIGINT:
+      case DATE:
+      case BINARY:
         return 0;
-      case Types.FLOAT:
+      case FLOAT:
         return 7;
-      case Types.DOUBLE:
+      case DOUBLE:
         return 15;
-      case Types.TIMESTAMP:
-      case Types.TIMESTAMP_WITH_TIMEZONE:
+      case TIMESTAMP:
+      case TIMESTAMP_WITH_TIMEZONE:
         return 9;
-      case Types.DECIMAL:
+      case DECIMAL:
         return columnAttributes.scale;
-      case Types.OTHER:
-      case Types.JAVA_OBJECT:
-      case Types.ARRAY:
-      case Types.STRUCT:
+      case OTHER:
+      case JAVA_OBJECT:
+      case ARRAY:
+      case STRUCT:
         return 0;
       default:
         throw new SQLException("Invalid column type: " + columnType);
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiBaseResultSet.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiBaseResultSet.java
index d02216d15..27d9efa5c 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiBaseResultSet.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiBaseResultSet.java
@@ -22,19 +22,13 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.nio.charset.StandardCharsets;
-import java.sql.Date;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.SQLWarning;
-import java.sql.Statement;
-import java.sql.Timestamp;
+import java.sql.*;
 import java.util.List;
 import org.apache.hadoop.hive.common.type.HiveIntervalDayTime;
 import org.apache.hadoop.hive.common.type.HiveIntervalYearMonth;
 import org.apache.hadoop.hive.common.type.TimestampTZUtil;
-import org.apache.hadoop.hive.serde2.thrift.Type;
-import org.apache.hive.service.cli.TableSchema;
+import org.apache.hive.service.rpc.thrift.TTableSchema;
+import org.apache.hive.service.rpc.thrift.TTypeId;
 import org.apache.kyuubi.jdbc.hive.adapter.SQLResultSet;
 
 /** Data independent base class which implements the common part of all Kyuubi result sets. */
@@ -46,10 +40,10 @@ public abstract class KyuubiBaseResultSet implements SQLResultSet {
   protected Object[] row;
   protected List<String> columnNames;
   protected List<String> normalizedColumnNames;
-  protected List<String> columnTypes;
+  protected List<TTypeId> columnTypes;
   protected List<JdbcColumnAttributes> columnAttributes;
 
-  private TableSchema schema;
+  private TTableSchema schema;
 
   @Override
   public int findColumn(String columnName) throws SQLException {
@@ -294,7 +288,7 @@ public abstract class KyuubiBaseResultSet implements SQLResultSet {
     if (columnIndex > row.length) {
       throw new SQLException("Invalid columnIndex: " + columnIndex);
     }
-    Type columnType = getSchema().getColumnDescriptorAt(columnIndex - 1).getType();
+    TTypeId columnType = columnTypes.get(columnIndex - 1);
 
     try {
       Object evaluated = evaluate(columnType, row[columnIndex - 1]);
@@ -306,11 +300,11 @@ public abstract class KyuubiBaseResultSet implements SQLResultSet {
     }
   }
 
-  private Object evaluate(Type type, Object value) {
+  private Object evaluate(TTypeId columnType, Object value) {
     if (value == null) {
       return null;
     }
-    switch (type) {
+    switch (columnType) {
       case BINARY_TYPE:
         if (value instanceof String) {
           return ((String) value).getBytes();
@@ -451,11 +445,11 @@ public abstract class KyuubiBaseResultSet implements SQLResultSet {
     return wasNull;
   }
 
-  protected void setSchema(TableSchema schema) {
+  protected void setSchema(TTableSchema schema) {
     this.schema = schema;
   }
 
-  protected TableSchema getSchema() {
+  protected TTableSchema getSchema() {
     return schema;
   }
 }
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiDatabaseMetaData.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiDatabaseMetaData.java
index bd92e127c..aa4dd41b5 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiDatabaseMetaData.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiDatabaseMetaData.java
@@ -17,6 +17,8 @@
 
 package org.apache.kyuubi.jdbc.hive;
 
+import static org.apache.hive.service.rpc.thrift.TTypeId.*;
+
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -27,10 +29,8 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.jar.Attributes;
 import org.apache.hadoop.hive.metastore.TableType;
-import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hive.service.cli.GetInfoType;
 import org.apache.hive.service.cli.HiveSQLException;
-import org.apache.hive.service.cli.TableSchema;
 import org.apache.hive.service.rpc.thrift.*;
 import org.apache.kyuubi.jdbc.KyuubiHiveDriver;
 import org.apache.kyuubi.jdbc.hive.adapter.SQLDatabaseMetaData;
@@ -94,7 +94,7 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
 
   private static final class ClientInfoPropertiesResultSet extends KyuubiMetaDataResultSet<Object> {
     private static final String[] COLUMNS = {"NAME", "MAX_LEN", "DEFAULT_VALUE", "DESCRIPTION"};
-    private static final String[] COLUMN_TYPES = {"STRING", "INT", "STRING", "STRING"};
+    private static final TTypeId[] COLUMN_TYPES = {STRING_TYPE, INT_TYPE, STRING_TYPE, STRING_TYPE};
 
     private static final Object[][] DATA = {
       {"ApplicationName", 1000, null, null},
@@ -105,11 +105,17 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
 
     public ClientInfoPropertiesResultSet() throws SQLException {
       super(Arrays.asList(COLUMNS), Arrays.asList(COLUMN_TYPES), null);
-      List<FieldSchema> fieldSchemas = new ArrayList<>(COLUMNS.length);
+      List<TColumnDesc> fieldSchemas = new ArrayList<>(COLUMNS.length);
       for (int i = 0; i < COLUMNS.length; ++i) {
-        fieldSchemas.add(new FieldSchema(COLUMNS[i], COLUMN_TYPES[i], null));
+        TColumnDesc tColumnDesc = new TColumnDesc();
+        tColumnDesc.setColumnName(COLUMNS[i]);
+        TTypeDesc tTypeDesc = new TTypeDesc();
+        tTypeDesc.addToTypes(TTypeEntry.primitiveEntry(new TPrimitiveTypeEntry(COLUMN_TYPES[i])));
+        tColumnDesc.setTypeDesc(tTypeDesc);
+        tColumnDesc.setPosition(i);
+        fieldSchemas.add(tColumnDesc);
       }
-      setSchema(new TableSchema(fieldSchemas));
+      setSchema(new TTableSchema(fieldSchemas));
     }
 
     @Override
@@ -373,20 +379,20 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
                 "PK_NAME",
                 "DEFERRABILITY"),
             Arrays.asList(
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "SMALLINT",
-                "SMALLINT",
-                "SMALLINT",
-                "STRING",
-                "STRING",
-                "STRING"))
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                SMALLINT_TYPE,
+                SMALLINT_TYPE,
+                SMALLINT_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE))
         .build();
   }
 
@@ -413,8 +419,19 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
                 "PAGES",
                 "FILTER_CONDITION"),
             Arrays.asList(
-                "STRING", "STRING", "STRING", "BOOLEAN", "STRING", "STRING", "SHORT", "SHORT",
-                "STRING", "STRING", "INT", "INT", "STRING"))
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                BOOLEAN_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                SMALLINT_TYPE,
+                SMALLINT_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                INT_TYPE,
+                INT_TYPE,
+                STRING_TYPE))
         .build();
   }
 
@@ -492,26 +509,26 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
                 "IS_NULLABLE",
                 "SPECIFIC_NAME"),
             Arrays.asList(
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "SMALLINT",
-                "INT",
-                "STRING",
-                "INT",
-                "INT",
-                "SMALLINT",
-                "SMALLINT",
-                "SMALLINT",
-                "STRING",
-                "STRING",
-                "INT",
-                "INT",
-                "INT",
-                "INT",
-                "STRING",
-                "STRING"))
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                SMALLINT_TYPE,
+                INT_TYPE,
+                STRING_TYPE,
+                INT_TYPE,
+                INT_TYPE,
+                SMALLINT_TYPE,
+                SMALLINT_TYPE,
+                SMALLINT_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                INT_TYPE,
+                INT_TYPE,
+                INT_TYPE,
+                INT_TYPE,
+                STRING_TYPE,
+                STRING_TYPE))
         .build();
   }
 
@@ -540,15 +557,15 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
                 "PROCEDURE_TYPE",
                 "SPECIFIC_NAME"),
             Arrays.asList(
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "STRING",
-                "SMALLINT",
-                "STRING"))
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE,
+                STRING_TYPE))
         .build();
   }
 
@@ -741,7 +758,8 @@ public class KyuubiDatabaseMetaData implements SQLDatabaseMetaData {
             "DATA_TYPE",
             "REMARKS",
             "BASE_TYPE"),
-        Arrays.asList("STRING", "STRING", "STRING", "STRING", "INT", "STRING", "INT"),
+        Arrays.asList(
+            STRING_TYPE, STRING_TYPE, STRING_TYPE, STRING_TYPE, INT_TYPE, STRING_TYPE, INT_TYPE),
         null) {
 
       @Override
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiMetaDataResultSet.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiMetaDataResultSet.java
index a5b614a42..48fdaaa1a 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiMetaDataResultSet.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiMetaDataResultSet.java
@@ -21,12 +21,13 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import org.apache.hive.service.rpc.thrift.TTypeId;
 
 public abstract class KyuubiMetaDataResultSet<M> extends KyuubiBaseResultSet {
   protected List<M> data = Collections.emptyList();
 
   public KyuubiMetaDataResultSet(
-      final List<String> columnNames, final List<String> columnTypes, final List<M> data)
+      final List<String> columnNames, final List<TTypeId> columnTypes, final List<M> data)
       throws SQLException {
     if (data != null) {
       this.data = new ArrayList<>(data);
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiQueryResultSet.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiQueryResultSet.java
index 526ea332c..fc2d0370c 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiQueryResultSet.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiQueryResultSet.java
@@ -17,13 +17,7 @@
 
 package org.apache.kyuubi.jdbc.hive;
 
-import static org.apache.hive.service.rpc.thrift.TCLIServiceConstants.TYPE_NAMES;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
+import java.sql.*;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -31,25 +25,7 @@ import java.util.concurrent.locks.ReentrantLock;
 import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hive.service.cli.RowSet;
 import org.apache.hive.service.cli.RowSetFactory;
-import org.apache.hive.service.cli.TableSchema;
-import org.apache.hive.service.rpc.thrift.TCLIService;
-import org.apache.hive.service.rpc.thrift.TCLIServiceConstants;
-import org.apache.hive.service.rpc.thrift.TCloseOperationReq;
-import org.apache.hive.service.rpc.thrift.TCloseOperationResp;
-import org.apache.hive.service.rpc.thrift.TColumnDesc;
-import org.apache.hive.service.rpc.thrift.TFetchOrientation;
-import org.apache.hive.service.rpc.thrift.TFetchResultsReq;
-import org.apache.hive.service.rpc.thrift.TFetchResultsResp;
-import org.apache.hive.service.rpc.thrift.TGetResultSetMetadataReq;
-import org.apache.hive.service.rpc.thrift.TGetResultSetMetadataResp;
-import org.apache.hive.service.rpc.thrift.TOperationHandle;
-import org.apache.hive.service.rpc.thrift.TPrimitiveTypeEntry;
-import org.apache.hive.service.rpc.thrift.TProtocolVersion;
-import org.apache.hive.service.rpc.thrift.TRowSet;
-import org.apache.hive.service.rpc.thrift.TSessionHandle;
-import org.apache.hive.service.rpc.thrift.TTableSchema;
-import org.apache.hive.service.rpc.thrift.TTypeQualifierValue;
-import org.apache.hive.service.rpc.thrift.TTypeQualifiers;
+import org.apache.hive.service.rpc.thrift.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -91,7 +67,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
 
     private boolean retrieveSchema = true;
     private List<String> colNames;
-    private List<String> colTypes;
+    private List<TTypeId> colTypes;
     private List<JdbcColumnAttributes> colAttributes;
     private int fetchSize = 50;
     private boolean emptyResultSet = false;
@@ -128,7 +104,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
       return this;
     }
 
-    public Builder setSchema(List<String> colNames, List<String> colTypes) {
+    public Builder setSchema(List<String> colNames, List<TTypeId> colTypes) {
       // no column attributes provided - create list of null attributes.
       List<JdbcColumnAttributes> colAttributes = new ArrayList<>();
       for (int idx = 0; idx < colTypes.size(); ++idx) {
@@ -138,7 +114,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
     }
 
     public Builder setSchema(
-        List<String> colNames, List<String> colTypes, List<JdbcColumnAttributes> colAttributes) {
+        List<String> colNames, List<TTypeId> colTypes, List<JdbcColumnAttributes> colAttributes) {
       this.colNames = new ArrayList<>();
       this.colNames.addAll(colNames);
       this.colTypes = new ArrayList<>();
@@ -255,7 +231,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
         // TODO: should probably throw an exception here.
         return;
       }
-      setSchema(new TableSchema(schema));
+      setSchema(schema);
 
       List<TColumnDesc> columns = schema.getColumns();
       for (int pos = 0; pos < schema.getColumnsSize(); pos++) {
@@ -268,8 +244,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
         normalizedColumnNames.add(columnName.toLowerCase());
         TPrimitiveTypeEntry primitiveTypeEntry =
             columns.get(pos).getTypeDesc().getTypes().get(0).getPrimitiveEntry();
-        String columnTypeName = TYPE_NAMES.get(primitiveTypeEntry.getType());
-        columnTypes.add(columnTypeName);
+        columnTypes.add(primitiveTypeEntry.getType());
         columnAttributes.add(getColumnAttributes(primitiveTypeEntry));
       }
     } catch (SQLException eS) {
@@ -287,7 +262,7 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
    * @param colTypes
    */
   private void setSchema(
-      List<String> colNames, List<String> colTypes, List<JdbcColumnAttributes> colAttributes) {
+      List<String> colNames, List<TTypeId> colTypes, List<JdbcColumnAttributes> colAttributes) {
     columnNames.addAll(colNames);
     columnTypes.addAll(colTypes);
     columnAttributes.addAll(colAttributes);
@@ -331,8 +306,8 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
   /**
    * Moves the cursor down one row from its current position.
    *
-   * @see java.sql.ResultSet#next()
    * @throws SQLException if a database access error occurs.
+   * @see java.sql.ResultSet#next()
    */
   @Override
   public boolean next() throws SQLException {
@@ -428,8 +403,8 @@ public class KyuubiQueryResultSet extends KyuubiBaseResultSet {
   /**
    * Moves the cursor before the first row of the resultset.
    *
-   * @see java.sql.ResultSet#next()
    * @throws SQLException if a database access error occurs.
+   * @see java.sql.ResultSet#next()
    */
   @Override
   public void beforeFirst() throws SQLException {
diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiResultSetMetaData.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiResultSetMetaData.java
index 26750b901..f738c125e 100644
--- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiResultSetMetaData.java
+++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiResultSetMetaData.java
@@ -20,32 +20,32 @@ package org.apache.kyuubi.jdbc.hive;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.List;
-import org.apache.hadoop.hive.serde2.thrift.Type;
+import org.apache.hive.service.rpc.thrift.TTypeId;
 import org.apache.kyuubi.jdbc.hive.adapter.SQLResultSetMetaData;
 
 /** KyuubiResultSetMetaData. */
 public class KyuubiResultSetMetaData implements SQLResultSetMetaData {
   private final List<String> columnNames;
-  private final List<String> columnTypes;
+  private final List<TTypeId> columnTypes;
   private final List<JdbcColumnAttributes> columnAttributes;
 
   public KyuubiResultSetMetaData(
       List<String> columnNames,
-      List<String> columnTypes,
+      List<TTypeId> columnTypes,
       List<JdbcColumnAttributes> columnAttributes) {
     this.columnNames = columnNames;
     this.columnTypes = columnTypes;
     this.columnAttributes = columnAttributes;
   }
 
-  private Type getHiveType(int column) throws SQLException {
-    return JdbcColumn.typeStringToHiveType(columnTypes.get(toZeroIndex(column)));
+  private int getSqlType(int column) throws SQLException {
+    return JdbcColumn.convertTTypeIdToSqlType(columnTypes.get(toZeroIndex(column)));
   }
 
   @Override
   public String getColumnClassName(int column) throws SQLException {
     return JdbcColumn.columnClassName(
-        getHiveType(column), columnAttributes.get(toZeroIndex(column)));
+        columnTypes.get(toZeroIndex(column)), columnAttributes.get(toZeroIndex(column)));
   }
 
   @Override
@@ -56,7 +56,7 @@ public class KyuubiResultSetMetaData implements SQLResultSetMetaData {
   @Override
   public int getColumnDisplaySize(int column) throws SQLException {
     return JdbcColumn.columnDisplaySize(
-        getHiveType(column), columnAttributes.get(toZeroIndex(column)));
+        columnTypes.get(toZeroIndex(column)), columnAttributes.get(toZeroIndex(column)));
   }
 
   @Override
@@ -72,10 +72,10 @@ public class KyuubiResultSetMetaData implements SQLResultSetMetaData {
   @Override
   public int getColumnType(int column) throws SQLException {
     // we need to convert the thrift type to the SQL type
-    String type = columnTypes.get(toZeroIndex(column));
+    TTypeId type = columnTypes.get(toZeroIndex(column));
 
     // we need to convert the thrift type to the SQL type
-    return JdbcColumn.hiveTypeToSqlType(type);
+    return JdbcColumn.convertTTypeIdToSqlType(type);
   }
 
   @Override
@@ -86,12 +86,12 @@ public class KyuubiResultSetMetaData implements SQLResultSetMetaData {
   @Override
   public int getPrecision(int column) throws SQLException {
     return JdbcColumn.columnPrecision(
-        getHiveType(column), columnAttributes.get(toZeroIndex(column)));
+        columnTypes.get(toZeroIndex(column)), columnAttributes.get(toZeroIndex(column)));
   }
 
   @Override
   public int getScale(int column) throws SQLException {
-    return JdbcColumn.columnScale(getHiveType(column), columnAttributes.get(toZeroIndex(column)));
+    return JdbcColumn.columnScale(getSqlType(column), columnAttributes.get(toZeroIndex(column)));
   }
 
   @Override
@@ -102,10 +102,8 @@ public class KyuubiResultSetMetaData implements SQLResultSetMetaData {
 
   @Override
   public boolean isCaseSensitive(int column) throws SQLException {
-    // we need to convert the Hive type to the SQL type name
-    // TODO: this would be better handled in an enum
-    String type = columnTypes.get(toZeroIndex(column));
-    return "string".equalsIgnoreCase(type);
+    TTypeId type = columnTypes.get(toZeroIndex(column));
+    return type == TTypeId.STRING_TYPE;
   }
 
   @Override