This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new f3a97521b62 Fix sql federation unknown type exception caused by
calcite wrong result type with bigint (#32730)
f3a97521b62 is described below
commit f3a97521b62a36367b7e67e118ef822610ca10c4
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Aug 30 15:06:23 2024 +0800
Fix sql federation unknown type exception caused by calcite wrong result
type with bigint (#32730)
---
.../resultset/SQLFederationResultSetMetaData.java | 10 +++++++++-
.../sqlfederation/executor/utils/EnumeratorUtils.java | 3 ++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
index 0330f32d4dd..2a3a7af94be 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
@@ -17,9 +17,11 @@
package org.apache.shardingsphere.sqlfederation.resultset;
+import org.apache.calcite.avatica.SqlType;
import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeFactoryImpl.JavaType;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.Table;
import org.apache.calcite.sql.type.SqlTypeName;
@@ -29,6 +31,7 @@ import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
import
org.apache.shardingsphere.sqlfederation.resultset.converter.SQLFederationColumnTypeConverter;
+import java.math.BigInteger;
import java.sql.ResultSetMetaData;
import java.util.List;
import java.util.Map;
@@ -148,7 +151,12 @@ public final class SQLFederationResultSetMetaData extends
WrapperAdapter impleme
@Override
public int getColumnType(final int column) {
- int jdbcType = resultColumnType.getFieldList().get(column -
1).getType().getSqlTypeName().getJdbcOrdinal();
+ RelDataType relDataType = resultColumnType.getFieldList().get(column -
1).getType();
+ // TODO remove this logic when calcite supports BigInteger type
+ if (relDataType instanceof JavaType &&
BigInteger.class.isAssignableFrom(((JavaType) relDataType).getJavaClass())) {
+ return SqlType.BIGINT.id;
+ }
+ int jdbcType = relDataType.getSqlTypeName().getJdbcOrdinal();
return columnTypeConverter.convertColumnType(jdbcType);
}
diff --git
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/EnumeratorUtils.java
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/EnumeratorUtils.java
index 09741eff436..dd60ff2c7cf 100644
---
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/EnumeratorUtils.java
+++
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/EnumeratorUtils.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.sqlfederation.executor.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.exception.kernel.data.UnsupportedDataTypeConversionException;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.util.ResultSetUtils;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.sqlfederation.optimizer.metadata.util.SQLFederationDataTypeUtils;
@@ -80,7 +81,7 @@ public final class EnumeratorUtils {
private static Object convertValue(final Object[] rows, final Map<Integer,
Class<?>> columnTypes, final int index) {
try {
return ResultSetUtils.convertValue(rows[index],
columnTypes.get(index));
- } catch (final SQLFeatureNotSupportedException ex) {
+ } catch (final SQLFeatureNotSupportedException |
UnsupportedDataTypeConversionException ex) {
return rows[index];
}
}