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