From 41be4b5b5118ea075fb7357d51a9b6a760915823 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 12 Sep 2017 11:15:41 +0800 Subject: [PATCH] improved sql parser. --- .../alibaba/druid/sql/SQLTransformUtils.java | 126 +++++++------ .../druid/sql/ast/expr/SQLPropertyExpr.java | 8 + .../ast/statement/SQLColumnDefinition.java | 4 + .../sql/visitor/SQLASTOutputVisitor.java | 8 +- .../support/profile/ProfileEntryStat.java | 5 +- .../java/com/alibaba/druid/util/FnvHash.java | 24 +++ ...lParameterizedOutputVisitorTest_53_or.java | 51 ++++++ ...lParameterizedOutputVisitorTest_54_or.java | 56 ++++++ .../Oracle2MySql_DataTypeTest_number_int.java | 170 ++++++++++++++++++ .../Oracle2PG_DataTypeTest_datetime.java | 37 ++++ .../Oracle2PG_DataTypeTest_number_int.java | 170 ++++++++++++++++++ 11 files changed, 594 insertions(+), 65 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_53_or.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_54_or.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2MySql_DataTypeTest_number_int.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_datetime.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_number_int.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java b/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java index 9e77c8a61c..a264ea0a10 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java @@ -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 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 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; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index 97e54d09c5..4020b462d5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index f6df1871ee..09c26eb759 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -403,4 +403,8 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen return false; } + + public String toString() { + return SQLUtils.toSQLString(this, dbType); + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 9df690b869..01703ffef5 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -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(); diff --git a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java index b6f951edcd..d277bd2816 100644 --- a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java +++ b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java @@ -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 executeCountUpdater; private static final AtomicLongFieldUpdater executeTimeNanosUpdater; diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 77f47906db..fa40e3a216 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -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("*"); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_53_or.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_53_or.java new file mode 100644 index 0000000000..1c12f24d0d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_53_or.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.filter.stat.MergeStatFilter; +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_53_or extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT p.id as \"id\", p.rule_id as \"ruleId\", p.name as \"name\", p.param_type as \"type\", p.default_value as \"defaultValue\", p.description as \"description\" FROM rules_parameters p WHERE (( p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=? or p.rule_id=?))"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("SELECT p.id AS \"id\", p.rule_id AS \"ruleId\", p.name AS \"name\", p.param_type AS \"type\", p.default_value AS \"defaultValue\"\n" + + "\t, p.description AS \"description\"\n" + + "FROM rules_parameters p\n" + + "WHERE p.rule_id = ?", psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_54_or.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_54_or.java new file mode 100644 index 0000000000..7df7ac748c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_54_or.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_54_or extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT r.id, r.plugin_rule_key as \"ruleKey\", r.plugin_name as \"repositoryKey\", r.description, r.description_format as \"descriptionFormat\", r.status, r.name, r.plugin_config_key as \"configKey\", r.priority as \"severity\", r.is_template as \"isTemplate\", r.language as \"language\", r.template_id as \"templateId\", r.note_data as \"noteData\", r.note_user_login as \"noteUserLogin\", r.note_created_at as \"noteCreatedAt\", r.note_updated_at as \"noteUpdatedAt\", r.remediation_function as \"remediationFunction\", r.def_remediation_function as \"defRemediationFunction\", r.remediation_gap_mult as \"remediationGapMultiplier\", r.def_remediation_gap_mult as \"defRemediationGapMultiplier\", r.remediation_base_effort as \"remediationBaseEffort\", r.def_remediation_base_effort as \"defRemediationBaseEffort\", r.gap_description as \"gapDescription\", r.tags as \"tagsField\", r.system_tags as \"systemTagsField\", r.rule_type as \"type\", r.created_at as \"createdAt\", r.updated_at as \"updatedAt\" FROM rules r WHERE (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?) or (r.plugin_name=? and r.plugin_rule_key=?)"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("SELECT r.id, r.plugin_rule_key AS \"ruleKey\", r.plugin_name AS \"repositoryKey\", r.description, r.description_format AS \"descriptionFormat\"\n" + + "\t, r.status, r.name, r.plugin_config_key AS \"configKey\", r.priority AS \"severity\", r.is_template AS \"isTemplate\"\n" + + "\t, r.language AS \"language\", r.template_id AS \"templateId\", r.note_data AS \"noteData\", r.note_user_login AS \"noteUserLogin\", r.note_created_at AS \"noteCreatedAt\"\n" + + "\t, r.note_updated_at AS \"noteUpdatedAt\", r.remediation_function AS \"remediationFunction\", r.def_remediation_function AS \"defRemediationFunction\", r.remediation_gap_mult AS \"remediationGapMultiplier\", r.def_remediation_gap_mult AS \"defRemediationGapMultiplier\"\n" + + "\t, r.remediation_base_effort AS \"remediationBaseEffort\", r.def_remediation_base_effort AS \"defRemediationBaseEffort\", r.gap_description AS \"gapDescription\", r.tags AS \"tagsField\", r.system_tags AS \"systemTagsField\"\n" + + "\t, r.rule_type AS \"type\", r.created_at AS \"createdAt\", r.updated_at AS \"updatedAt\"\n" + + "FROM rules r\n" + + "WHERE (r.plugin_name = ?\n" + + "\t\tAND r.plugin_rule_key = ?)\n" + + "\tOR (r.plugin_name = ?\n" + + "\t\tAND r.plugin_rule_key = ?)", psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2MySql_DataTypeTest_number_int.java b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2MySql_DataTypeTest_number_int.java new file mode 100644 index 0000000000..410e1305a7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2MySql_DataTypeTest_number_int.java @@ -0,0 +1,170 @@ +package com.alibaba.druid.bvt.sql.transform; + +import com.alibaba.druid.sql.SQLTransformUtils; +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +public class Oracle2MySql_DataTypeTest_number_int extends TestCase { + public void test_oracle2pg_int_1() throws Exception { + String sql = "number(1, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("tinyint", pgDataType.toString()); + } + + public void test_oracle2pg_int_2() throws Exception { + String sql = "number(2, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("tinyint", pgDataType.toString()); + } + + public void test_oracle2pg_int_3() throws Exception { + String sql = "number(3, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_4() throws Exception { + String sql = "number(4, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_5() throws Exception { + String sql = "number(5, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_6() throws Exception { + String sql = "number(6, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_7() throws Exception { + String sql = "number(7, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_8() throws Exception { + String sql = "number(8, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_9() throws Exception { + String sql = "number(9, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_10() throws Exception { + String sql = "number(10, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_11() throws Exception { + String sql = "number(11, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_12() throws Exception { + String sql = "number(12, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_13() throws Exception { + String sql = "number(13, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_14() throws Exception { + String sql = "number(14, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_15() throws Exception { + String sql = "number(15, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_16() throws Exception { + String sql = "number(16, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_17() throws Exception { + String sql = "number(17, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_18() throws Exception { + String sql = "number(18, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_19() throws Exception { + String sql = "number(19, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_20() throws Exception { + String sql = "number(20, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_20_x() throws Exception { + String sql = "number(20)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_star() throws Exception { + String sql = "number(*)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_21() throws Exception { + String sql = "number(21, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToMySql(dataType); + assertEquals("decimal(21)", pgDataType.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_datetime.java b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_datetime.java new file mode 100644 index 0000000000..fb2a6e9958 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_datetime.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql.transform; + +import com.alibaba.druid.sql.SQLTransformUtils; +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +public class Oracle2PG_DataTypeTest_datetime extends TestCase { + public void test_oracle2pg_timestamp() throws Exception { + String sql = "timestamp"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("timestamp", pgDataType.toString()); + } + + public void test_oracle2pg_timestamp_arg() throws Exception { + String sql = "timestamp(2)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("timestamp(2)", pgDataType.toString()); + } + + public void test_oracle2pg_date() throws Exception { + String sql = "date"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("timestamp", pgDataType.toString()); + } + + public void test_oracle2pg_datetime() throws Exception { + String sql = "datetime"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("timestamp", pgDataType.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_number_int.java b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_number_int.java new file mode 100644 index 0000000000..9e3002dff3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/transform/Oracle2PG_DataTypeTest_number_int.java @@ -0,0 +1,170 @@ +package com.alibaba.druid.bvt.sql.transform; + +import com.alibaba.druid.sql.SQLTransformUtils; +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +public class Oracle2PG_DataTypeTest_number_int extends TestCase { + public void test_oracle2pg_int_1() throws Exception { + String sql = "number(1, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_2() throws Exception { + String sql = "number(2, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_3() throws Exception { + String sql = "number(3, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_4() throws Exception { + String sql = "number(4, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("smallint", pgDataType.toString()); + } + + public void test_oracle2pg_int_5() throws Exception { + String sql = "number(5, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_6() throws Exception { + String sql = "number(6, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_7() throws Exception { + String sql = "number(7, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_8() throws Exception { + String sql = "number(8, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("int", pgDataType.toString()); + } + + public void test_oracle2pg_int_9() throws Exception { + String sql = "number(9, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_10() throws Exception { + String sql = "number(10, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_11() throws Exception { + String sql = "number(11, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_12() throws Exception { + String sql = "number(12, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_13() throws Exception { + String sql = "number(13, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_14() throws Exception { + String sql = "number(14, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_15() throws Exception { + String sql = "number(15, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_16() throws Exception { + String sql = "number(16, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_17() throws Exception { + String sql = "number(17, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_18() throws Exception { + String sql = "number(18, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_19() throws Exception { + String sql = "number(19, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_20() throws Exception { + String sql = "number(20, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_20_x() throws Exception { + String sql = "number(20)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_star() throws Exception { + String sql = "number(*)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("bigint", pgDataType.toString()); + } + + public void test_oracle2pg_int_21() throws Exception { + String sql = "number(21, 0)"; + SQLDataType dataType = SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).parseDataType(); + SQLDataType pgDataType = SQLTransformUtils.transformOracleToPostgresql(dataType); + assertEquals("decimal(21)", pgDataType.toString()); + } +}