mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.*;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType;
|
||||
import com.alibaba.druid.util.FnvHash;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -96,17 +97,16 @@ public class SQLTransformUtils {
|
||||
|
||||
public static SQLDataType transformOracleToMySql(SQLDataType x) {
|
||||
final String name = x.getName();
|
||||
final long nameHash = x.nameHashCode64();
|
||||
|
||||
if (name == null) {
|
||||
return x;
|
||||
}
|
||||
List<SQLExpr> argumentns = x.getArguments();
|
||||
|
||||
String name_lower = name.toLowerCase();
|
||||
|
||||
SQLDataType dataType;
|
||||
|
||||
if ("urowid".equalsIgnoreCase(name_lower)) {
|
||||
if (nameHash == FnvHash.Constants.UROWID) {
|
||||
int len = 4000;
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -115,24 +115,25 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
dataType = new SQLDataTypeImpl("varchar", len);
|
||||
} else if ("rowid".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.ROWID) {
|
||||
dataType = new SQLDataTypeImpl("char", 10);
|
||||
|
||||
} else if ("boolean".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BOOLEAN) {
|
||||
dataType = new SQLDataTypeImpl("tinyint");
|
||||
|
||||
} else if ("integer".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.INTEGER) {
|
||||
dataType = new SQLDataTypeImpl("int");
|
||||
|
||||
} else if ("float".equals(name_lower) || "binary_float".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.FLOAT
|
||||
|| nameHash == FnvHash.Constants.BINARY_FLOAT) {
|
||||
dataType = new SQLDataTypeImpl("float");
|
||||
|
||||
} else if ("real".equals(name_lower)
|
||||
|| "double precision".equals(name_lower)
|
||||
|| "binary_double".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.REAL
|
||||
|| nameHash == FnvHash.Constants.BINARY_DOUBLE
|
||||
|| nameHash == FnvHash.Constants.DOUBLE_PRECISION) {
|
||||
dataType = new SQLDataTypeImpl("double");
|
||||
|
||||
} else if ("number".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NUMBER) {
|
||||
if (argumentns.size() == 0) {
|
||||
dataType = new SQLDataTypeImpl("decimal", 38);
|
||||
} else {
|
||||
@@ -141,7 +142,6 @@ public class SQLTransformUtils {
|
||||
int precision, scale = 0;
|
||||
if (arg0 instanceof SQLAllColumnExpr) {
|
||||
precision = 9;
|
||||
scale = 1;
|
||||
} else {
|
||||
precision = ((SQLIntegerExpr) arg0).getNumber().intValue();
|
||||
}
|
||||
@@ -178,7 +178,9 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
|
||||
} else if ("dec".equals(name_lower) || "decimal".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.DEC
|
||||
|| nameHash == FnvHash.Constants.DECIMAL) {
|
||||
|
||||
dataType = x.clone();
|
||||
dataType.setName("decimal");
|
||||
|
||||
@@ -201,7 +203,7 @@ public class SQLTransformUtils {
|
||||
// }
|
||||
/////////////////////////////////
|
||||
|
||||
} else if ("raw".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.RAW) {
|
||||
int len;
|
||||
|
||||
if (argumentns.size() == 0) {
|
||||
@@ -224,8 +226,8 @@ public class SQLTransformUtils {
|
||||
} else {
|
||||
dataType = new SQLDataTypeImpl("varbinary", len);
|
||||
}
|
||||
} else if ("char".equals(name_lower)
|
||||
|| "character".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.CHAR
|
||||
|| nameHash == FnvHash.Constants.CHARACTER) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
@@ -247,7 +249,7 @@ public class SQLTransformUtils {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if ("nchar".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NCHAR) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
@@ -269,7 +271,7 @@ public class SQLTransformUtils {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if ("varchar2".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.VARCHAR2) {
|
||||
if (argumentns.size() > 0) {
|
||||
int len;
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -283,7 +285,7 @@ public class SQLTransformUtils {
|
||||
dataType = new SQLCharacterDataType("varchar");
|
||||
}
|
||||
|
||||
} else if ("nvarchar2".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NVARCHAR2) {
|
||||
if (argumentns.size() > 0) {
|
||||
int len;
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -297,11 +299,11 @@ public class SQLTransformUtils {
|
||||
dataType = new SQLCharacterDataType("nvarchar");
|
||||
}
|
||||
|
||||
} else if ("bfile".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BFILE) {
|
||||
dataType = new SQLCharacterDataType("varchar", 255);
|
||||
|
||||
} else if ("date".equals(name_lower)
|
||||
|| "timestamp".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.DATE
|
||||
|| nameHash == FnvHash.Constants.TIMESTAMP) {
|
||||
int len = -1;
|
||||
if (argumentns.size() > 0) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -320,14 +322,15 @@ public class SQLTransformUtils {
|
||||
} else {
|
||||
dataType = new SQLDataTypeImpl("datetime");
|
||||
}
|
||||
} else if ("blob".equals(name_lower) || "long raw".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BLOB
|
||||
|| nameHash == FnvHash.Constants.LONG_RAW) {
|
||||
argumentns.clear();
|
||||
dataType = new SQLDataTypeImpl("LONGBLOB");
|
||||
|
||||
} else if ("clob".equals(name_lower)
|
||||
|| "nclob".equals(name_lower)
|
||||
|| "long".equals(name_lower)
|
||||
|| "xmltype".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.CLOB
|
||||
|| nameHash == FnvHash.Constants.NCLOB
|
||||
|| nameHash == FnvHash.Constants.LONG
|
||||
|| nameHash == FnvHash.Constants.XMLTYPE) {
|
||||
argumentns.clear();
|
||||
dataType = new SQLCharacterDataType("LONGTEXT");
|
||||
|
||||
@@ -396,17 +399,16 @@ public class SQLTransformUtils {
|
||||
|
||||
public static SQLDataType transformOracleToPostgresql(SQLDataType x) {
|
||||
final String name = x.getName();
|
||||
final long nameHash = x.nameHashCode64();
|
||||
|
||||
if (name == null) {
|
||||
return x;
|
||||
}
|
||||
List<SQLExpr> argumentns = x.getArguments();
|
||||
|
||||
String name_lower = name.toLowerCase();
|
||||
|
||||
SQLDataType dataType;
|
||||
|
||||
if ("urowid".equalsIgnoreCase(name_lower)) {
|
||||
if (nameHash == FnvHash.Constants.UROWID) {
|
||||
int len = 4000;
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -415,24 +417,25 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
dataType = new SQLDataTypeImpl("varchar", len);
|
||||
} else if ("rowid".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.ROWID) {
|
||||
dataType = new SQLDataTypeImpl("char", 10);
|
||||
|
||||
} else if ("boolean".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BOOLEAN) {
|
||||
dataType = new SQLDataTypeImpl("tinyint");
|
||||
|
||||
} else if ("integer".equals(name_lower) || "int".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.INTEGER
|
||||
|| nameHash == FnvHash.Constants.INT) {
|
||||
dataType = new SQLDataTypeImpl("decimal", 38);
|
||||
|
||||
} else if ("binary_float".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BINARY_FLOAT) {
|
||||
dataType = new SQLDataTypeImpl("real");
|
||||
|
||||
} else if ("binary_double".equals(name_lower)
|
||||
|| "float".equals(name_lower)
|
||||
|| "real".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BINARY_DOUBLE
|
||||
|| nameHash == FnvHash.Constants.FLOAT
|
||||
|| nameHash == FnvHash.Constants.REAL) {
|
||||
dataType = new SQLDataTypeImpl("double precision");
|
||||
|
||||
} else if ("number".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NUMBER) {
|
||||
if (argumentns.size() == 0) {
|
||||
dataType = new SQLDataTypeImpl("decimal", 38);
|
||||
} else {
|
||||
@@ -440,8 +443,8 @@ public class SQLTransformUtils {
|
||||
|
||||
int precision, scale = 0;
|
||||
if (arg0 instanceof SQLAllColumnExpr) {
|
||||
precision = 9;
|
||||
scale = 1;
|
||||
precision = 19;
|
||||
scale = 0;
|
||||
} else {
|
||||
precision = ((SQLIntegerExpr) arg0).getNumber().intValue();
|
||||
}
|
||||
@@ -462,9 +465,7 @@ public class SQLTransformUtils {
|
||||
}
|
||||
|
||||
if (scale == 0) {
|
||||
if (precision < 3) {
|
||||
dataType = new SQLDataTypeImpl("tinyint");
|
||||
} else if (precision < 5) {
|
||||
if (precision < 5) {
|
||||
dataType = new SQLDataTypeImpl("smallint");
|
||||
} else if (precision < 9) {
|
||||
dataType = new SQLDataTypeImpl("int");
|
||||
@@ -478,7 +479,8 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
|
||||
} else if ("dec".equals(name_lower) || "decimal".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.DEC
|
||||
|| nameHash == FnvHash.Constants.DECIMAL) {
|
||||
dataType = x.clone();
|
||||
dataType.setName("decimal");
|
||||
|
||||
@@ -495,8 +497,8 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
|
||||
} else if ("char".equals(name_lower)
|
||||
|| "character".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.CHAR
|
||||
|| nameHash == FnvHash.Constants.CHARACTER) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
@@ -518,7 +520,7 @@ public class SQLTransformUtils {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if ("nchar".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NCHAR) {
|
||||
if (argumentns.size() == 1) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
|
||||
@@ -540,7 +542,7 @@ public class SQLTransformUtils {
|
||||
throw new UnsupportedOperationException(SQLUtils.toOracleString(x));
|
||||
}
|
||||
|
||||
} else if ("varchar2".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.VARCHAR2) {
|
||||
if (argumentns.size() > 0) {
|
||||
int len;
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -554,7 +556,8 @@ public class SQLTransformUtils {
|
||||
dataType = new SQLCharacterDataType("varchar");
|
||||
}
|
||||
|
||||
} else if ("nvarchar2".equals(name_lower) || "nchar varying".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.NVARCHAR2
|
||||
|| nameHash == FnvHash.Constants.NCHAR_VARYING) {
|
||||
if (argumentns.size() > 0) {
|
||||
int len;
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -568,11 +571,12 @@ public class SQLTransformUtils {
|
||||
dataType = new SQLCharacterDataType("varchar");
|
||||
}
|
||||
|
||||
} else if ("bfile".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.BFILE) {
|
||||
dataType = new SQLCharacterDataType("varchar", 255);
|
||||
|
||||
} else if ("date".equals(name_lower)
|
||||
|| "timestamp".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.DATE
|
||||
|| nameHash == FnvHash.Constants.DATETIME
|
||||
|| nameHash == FnvHash.Constants.TIMESTAMP) {
|
||||
int len = -1;
|
||||
if (argumentns.size() > 0) {
|
||||
SQLExpr arg0 = argumentns.get(0);
|
||||
@@ -583,18 +587,24 @@ public class SQLTransformUtils {
|
||||
}
|
||||
}
|
||||
|
||||
dataType = new SQLDataTypeImpl("timestamp", len);
|
||||
} else if ("blob".equals(name_lower) || "long raw".equals(name_lower) || "raw".equals(name_lower)) {
|
||||
if (len > 0) {
|
||||
dataType = new SQLDataTypeImpl("timestamp", len);
|
||||
} else {
|
||||
dataType = new SQLDataTypeImpl("timestamp");
|
||||
}
|
||||
} else if (nameHash == FnvHash.Constants.BLOB
|
||||
|| nameHash == FnvHash.Constants.LONG_RAW
|
||||
|| nameHash == FnvHash.Constants.RAW) {
|
||||
argumentns.clear();
|
||||
dataType = new SQLDataTypeImpl("bytea");
|
||||
|
||||
} else if ("clob".equals(name_lower)
|
||||
|| "nclob".equals(name_lower)
|
||||
|| "long".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.CLOB
|
||||
|| nameHash == FnvHash.Constants.NCLOB
|
||||
|| nameHash == FnvHash.Constants.LONG) {
|
||||
argumentns.clear();
|
||||
dataType = new SQLCharacterDataType("TEXT");
|
||||
|
||||
} else if ("xmltype".equals(name_lower)) {
|
||||
} else if (nameHash == FnvHash.Constants.XMLTYPE) {
|
||||
dataType = new SQLDataTypeImpl("xml");
|
||||
} else {
|
||||
dataType = x;
|
||||
|
||||
@@ -298,4 +298,12 @@ public final class SQLPropertyExpr extends SQLExprImpl implements SQLName {
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
if (owner == null) {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
return owner.toString() + '.' + name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -403,4 +403,8 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return SQLUtils.toSQLString(this, dbType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1541,9 +1541,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
}
|
||||
}
|
||||
print('.');
|
||||
|
||||
String name = x.getName();
|
||||
printName(x, name);
|
||||
print0(x.getName());
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -1899,11 +1897,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
|
||||
protected void printTableSourceExpr(SQLExpr expr) {
|
||||
if (exportTables) {
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
|
||||
}
|
||||
addTable(expr.toString());
|
||||
}
|
||||
|
||||
if (isEnabled(VisitorFeature.OutputDesensitize)) {
|
||||
SQLExpr owner = null;
|
||||
String ident = null;
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
ident = ((SQLIdentifierExpr) expr).getName();
|
||||
|
||||
@@ -21,9 +21,8 @@ import java.util.concurrent.atomic.AtomicLongFieldUpdater;
|
||||
|
||||
public class ProfileEntryStat {
|
||||
|
||||
private volatile long executeCount = 0;
|
||||
private volatile long executeTimeNanos = 0;
|
||||
|
||||
private volatile long executeCount = 0;
|
||||
private volatile long executeTimeNanos = 0;
|
||||
private static final AtomicLongFieldUpdater<ProfileEntryStat> executeCountUpdater;
|
||||
private static final AtomicLongFieldUpdater<ProfileEntryStat> executeTimeNanosUpdater;
|
||||
|
||||
|
||||
@@ -308,8 +308,27 @@ public final class FnvHash {
|
||||
long PRIOR = fnv1a_64_lower("PRIOR");
|
||||
long NOCYCLE = fnv1a_64_lower("NOCYCLE");
|
||||
long CONNECT_BY_ROOT = fnv1a_64_lower("CONNECT_BY_ROOT");
|
||||
|
||||
long DATE = fnv1a_64_lower("DATE");
|
||||
long DATETIME = fnv1a_64_lower("DATETIME");
|
||||
long TIMESTAMP = fnv1a_64_lower("TIMESTAMP");
|
||||
long CLOB = fnv1a_64_lower("CLOB");
|
||||
long NCLOB = fnv1a_64_lower("NCLOB");
|
||||
long BLOB = fnv1a_64_lower("BLOB");
|
||||
long XMLTYPE = fnv1a_64_lower("XMLTYPE");
|
||||
long BFILE = fnv1a_64_lower("BFILE");
|
||||
long UROWID = fnv1a_64_lower("UROWID");
|
||||
long ROWID = fnv1a_64_lower("ROWID");
|
||||
long INTEGER = fnv1a_64_lower("INTEGER");
|
||||
long INT = fnv1a_64_lower("INT");
|
||||
long BINARY_FLOAT = fnv1a_64_lower("BINARY_FLOAT");
|
||||
long BINARY_DOUBLE = fnv1a_64_lower("BINARY_DOUBLE");
|
||||
long FLOAT = fnv1a_64_lower("FLOAT");
|
||||
long REAL = fnv1a_64_lower("REAL");
|
||||
long NUMBER = fnv1a_64_lower("NUMBER");
|
||||
long DEC = fnv1a_64_lower("DEC");
|
||||
long DECIMAL = fnv1a_64_lower("DECIMAL");
|
||||
|
||||
long CURRENT = fnv1a_64_lower("CURRENT");
|
||||
long COUNT = fnv1a_64_lower("COUNT");
|
||||
long ROW_NUMBER = fnv1a_64_lower("ROW_NUMBER");
|
||||
@@ -328,6 +347,7 @@ public final class FnvHash {
|
||||
long NCHAR = fnv1a_64_lower("NCHAR");
|
||||
long NVARCHAR = fnv1a_64_lower("NVARCHAR");
|
||||
long NVARCHAR2 = fnv1a_64_lower("NVARCHAR2");
|
||||
long NCHAR_VARYING = fnv1a_64_lower("nchar varying");
|
||||
long TINYTEXT = fnv1a_64_lower("TINYTEXT");
|
||||
long TEXT = fnv1a_64_lower("TEXT");
|
||||
long MEDIUMTEXT = fnv1a_64_lower("MEDIUMTEXT");
|
||||
@@ -351,10 +371,12 @@ public final class FnvHash {
|
||||
long MAXVALUE = fnv1a_64_lower("MAXVALUE");
|
||||
long OFFSET = fnv1a_64_lower("OFFSET");
|
||||
long RAW = fnv1a_64_lower("RAW");
|
||||
long LONG_RAW = fnv1a_64_lower("LONG RAW");
|
||||
long LONG = fnv1a_64_lower("LONG");
|
||||
long ROWNUM = fnv1a_64_lower("ROWNUM");
|
||||
long PRECISION = fnv1a_64_lower("PRECISION");
|
||||
long DOUBLE = fnv1a_64_lower("DOUBLE");
|
||||
long DOUBLE_PRECISION = fnv1a_64_lower("DOUBLE PRECISION");
|
||||
long WITHOUT = fnv1a_64_lower("WITHOUT");
|
||||
|
||||
long DEFINER = fnv1a_64_lower("DEFINER");
|
||||
@@ -423,6 +445,8 @@ public final class FnvHash {
|
||||
long EXEC = fnv1a_64_lower("EXEC");
|
||||
long EXECUTE = fnv1a_64_lower("EXECUTE");
|
||||
|
||||
long SOURCE = fnv1a_64_lower("SOURCE");
|
||||
|
||||
long STAR = fnv1a_64_lower("*");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user