mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql datatype transform.
This commit is contained in:
@@ -432,7 +432,9 @@ public class SQLTransformUtils {
|
||||
|
||||
} else if (nameHash == FnvHash.Constants.BINARY_DOUBLE
|
||||
|| nameHash == FnvHash.Constants.FLOAT
|
||||
|| nameHash == FnvHash.Constants.REAL) {
|
||||
|| nameHash == FnvHash.Constants.DOUBLE
|
||||
|| nameHash == FnvHash.Constants.REAL
|
||||
|| nameHash == FnvHash.Constants.DOUBLE_PRECISION) {
|
||||
dataType = new SQLDataTypeImpl("double precision");
|
||||
|
||||
} else if (nameHash == FnvHash.Constants.NUMBER) {
|
||||
@@ -497,8 +499,23 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
|
||||
} else if (nameHash == FnvHash.Constants.CHAR
|
||||
|| nameHash == FnvHash.Constants.CHARACTER) {
|
||||
} else if (nameHash == FnvHash.Constants.CHARACTER) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
int len;
|
||||
if (arg0 instanceof SQLNumericLiteralExpr) {
|
||||
len = ((SQLNumericLiteralExpr) arg0).getNumber().intValue();
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
dataType = new SQLCharacterDataType("char", len);
|
||||
} else if (argumentns.size() == 0) {
|
||||
dataType = new SQLCharacterDataType("char");
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
} else if (nameHash == FnvHash.Constants.CHAR) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
@@ -509,40 +526,21 @@ public class SQLTransformUtils {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
if (len <= 255) {
|
||||
dataType = new SQLCharacterDataType("char", len);
|
||||
if (len <= 2000) {
|
||||
dataType = x;
|
||||
} else {
|
||||
dataType = new SQLCharacterDataType("varchar", len);
|
||||
dataType = new SQLCharacterDataType("text");
|
||||
}
|
||||
} else if (argumentns.size() == 0) {
|
||||
dataType = new SQLCharacterDataType("char");
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if (nameHash == FnvHash.Constants.NCHAR) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
int len;
|
||||
if (arg0 instanceof SQLNumericLiteralExpr) {
|
||||
len = ((SQLNumericLiteralExpr) arg0).getNumber().intValue();
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
if (len <= 255) {
|
||||
dataType = new SQLCharacterDataType("char", len);
|
||||
} else {
|
||||
dataType = new SQLCharacterDataType("varchar", len);
|
||||
}
|
||||
} else if (argumentns.size() == 0) {
|
||||
dataType = new SQLCharacterDataType("char");
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if (nameHash == FnvHash.Constants.VARCHAR2) {
|
||||
// no changed
|
||||
dataType = x;
|
||||
} else if (nameHash == FnvHash.Constants.VARCHAR
|
||||
|| nameHash == FnvHash.Constants.VARCHAR2) {
|
||||
if (argumentns.size() > 0) {
|
||||
int len;
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -551,7 +549,12 @@ public class SQLTransformUtils {
|
||||
} else {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
dataType = new SQLCharacterDataType("varchar", len);
|
||||
|
||||
if (len <= 4000) {
|
||||
dataType = new SQLCharacterDataType("varchar", len);
|
||||
} else {
|
||||
dataType = new SQLCharacterDataType("text");
|
||||
}
|
||||
} else {
|
||||
dataType = new SQLCharacterDataType("varchar");
|
||||
}
|
||||
|
||||
@@ -28,10 +28,22 @@ import com.alibaba.druid.sql.parser.*;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
public class ParameterizedOutputVisitorUtils {
|
||||
private final static SQLParserFeature[] features = {
|
||||
SQLParserFeature.EnableSQLBinaryOpExprGroup,
|
||||
SQLParserFeature.OptimizedForParameterized
|
||||
};
|
||||
|
||||
public static String parameterize(String sql, String dbType) {
|
||||
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
|
||||
parser.config(SQLParserFeature.EnableSQLBinaryOpExprGroup, true);
|
||||
parser.config(SQLParserFeature.OptimizedForParameterized, true);
|
||||
return parameterize(sql, dbType, null);
|
||||
}
|
||||
|
||||
public static String parameterize(String sql, String dbType, SQLSelectListCache selectListCache) {
|
||||
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, features);
|
||||
|
||||
if (selectListCache != null) {
|
||||
parser.setSelectListCache(selectListCache);
|
||||
}
|
||||
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
if (statementList.size() == 0) {
|
||||
return sql;
|
||||
|
||||
Reference in New Issue
Block a user