Skip to content

Commit

Permalink
Add supprt for Complex DataTypes, mapping them to SQLVARCHAR
Browse files Browse the repository at this point in the history
  • Loading branch information
CandyZ93 committed Aug 20, 2020
1 parent d95cc6a commit 7a9ae6f
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions src/main/java/io/mycat/util/HetuUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -136,6 +137,18 @@ public static void serverTypeLength(String hetuType, FieldPacket pkg) {
case "decimal":
pkg.length = DECIMAL_DEFAULT;
break;
case "json":
pkg.length = VARCHAR_DEFAULT;
break;
case "map":
pkg.length = VARCHAR_DEFAULT;
break;
case "array":
pkg.length = VARCHAR_DEFAULT;
break;
case "row":
pkg.length = VARCHAR_DEFAULT;
break;
default:
pkg.length = 0;
break;
Expand Down Expand Up @@ -235,15 +248,25 @@ else if(Types.TIME == metaData.getColumnType(j)
//check that jdbc driver not implement with 4.2 Specification vesion(new type for TIMESTAMP_WITH_TIMEZONE)
//identify timestamp and timestamp with timezone by getColumnTypeName
else if(Types.TIMESTAMP == metaData.getColumnType(j)
& "timestamp with time zone".equalsIgnoreCase(metaData.getColumnTypeName(j)))
&& "timestamp with time zone".equalsIgnoreCase(metaData.getColumnTypeName(j)))
{
fieldPacket.type = (byte) (MysqlDefs.FIELD_TYPE_VAR_STRING & 0xff);
}
// data type: interval, array, map, row, JSON are not standard JDBC type, customize them
else if (Types.JAVA_OBJECT == jdbcColumnType) {
else if (Types.JAVA_OBJECT == jdbcColumnType)
{
// 0x1f for dynamic strings, double, float
fieldPacket.decimals = (byte) 0x1f;
fieldPacket.type = (byte) (MysqlDefs.FIELD_TYPE_VAR_STRING & 0xff);
if(!metaData.getColumnTypeName(j).toLowerCase(Locale.ENGLISH).startsWith("interval")) {
fieldPacket.length = VARCHAR_DEFAULT;
}
}
else if (Types.ARRAY == jdbcColumnType) {
// 0x1f for dynamic strings, double, float
fieldPacket.decimals = (byte) 0x1f;
fieldPacket.type = (byte) (MysqlDefs.FIELD_TYPE_VAR_STRING & 0xff);
fieldPacket.length = VARCHAR_DEFAULT;
} else {
if (Types.TINYINT == jdbcColumnType || Types.SMALLINT == jdbcColumnType
|| Types.INTEGER == jdbcColumnType || Types.BIGINT == jdbcColumnType
Expand Down

0 comments on commit 7a9ae6f

Please sign in to comment.