improved sql parser schema repository.

This commit is contained in:
wenshao
2017-08-07 16:18:13 +08:00
parent b0c38aef68
commit ea8017382f
25 changed files with 722 additions and 66 deletions
@@ -0,0 +1,26 @@
package com.alibaba.druid.bvt.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
/**
* Created by wenshao on 03/08/2017.
*/
public class SQLJoinTest extends TestCase {
public void test_0() throws Exception {
SQLSelectStatement stmt = (SQLSelectStatement)
SQLUtils.parseStatements("select a.* from t_user a inner join t_group b on a.gid = b.id", JdbcConstants.ORACLE)
.get(0);
SQLSelectQueryBlock queryBlock = stmt.getSelect().getQueryBlock();
assertNotNull(queryBlock);
SQLJoinTableSource join = (SQLJoinTableSource) queryBlock.getFrom();
assertTrue(join.match("a", "b"));
}
}
@@ -27,6 +27,8 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest {
public void test_0() throws Exception {
repository.console("use sc00;");
String sql = "CREATE TABLE `test1` (\n" +
" `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
" `c_tinyint` tinyint(4) DEFAULT '1' COMMENT 'tinyint',\n" +
@@ -481,5 +483,176 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest {
repository.console("DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `sc01`.`test6`;");
assertEquals("\n", repository.console("show tables from sc01"));
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\t`c_tinyint` tinyint(4) DEFAULT '1' COMMENT 'tinyint',\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (`c_tinyint`, `c_int`)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
repository.console(" alter table test1 change c_tinyint c_tinyint_x tinyint(4) DEFAULT '1' COMMENT 'tinyint x' first;");
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_tinyint_x tinyint(4) DEFAULT '1' COMMENT 'tinyint x',\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (c_tinyint_x, `c_int`)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
repository.console(" alter table test1 drop c_tinyint_x");
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (`c_int`)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
repository.console(" alter table test1 add index name_idx(c_char,c_date);");
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (`c_int`),\n" +
"\tINDEX name_idx(c_char, c_date)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
assertEquals("+--------------+--------------+------+-----+---------------------+-----------------------------+\n" +
"| Field | Type | Null | Key | Default | Extra |\n" +
"+--------------+--------------+------+-----+---------------------+-----------------------------+\n" +
"| c_decimal_1 | INT(11) | YES | | NULL | |\n" +
"| id | bigint(20) | YES | | NULL | auto_increment |\n" +
"| c_smallint | smallint(6) | NO | | 0 | |\n" +
"| c_mediumint | mediumint(9) | NO | | NULL | |\n" +
"| c_int | int(11) | NO | MUL | NULL | |\n" +
"| c_bigint | bigint(20) | NO | | NULL | |\n" +
"| c_date | date | NO | | 0000-00-00 | |\n" +
"| c_datetime | datetime | NO | | 0000-00-00 00:00:00 | |\n" +
"| c_timestamp | timestamp | NO | | NULL | on update CURRENT_TIMESTAMP |\n" +
"| c_time | time | NO | | NULL | |\n" +
"| c_char | char(10) | NO | | NULL | |\n" +
"| c_varchar | varchar(10) | NO | | hello | |\n" +
"| c_blob | blob | NO | | NULL | |\n" +
"| c_text | text | NO | | NULL | |\n" +
"| c_mediumtext | mediumtext | NO | | NULL | |\n" +
"| c_longblob | longblob | NO | | NULL | |\n" +
"+--------------+--------------+------+-----+---------------------+-----------------------------+\n"
, repository.console("show columns from test1"));
repository.console(" drop index name_idx on test1");
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (`c_int`)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
repository.console("alter table test1 modify c_char char(32) after id");
assertEquals("CREATE TABLE `test1` (\n" +
"\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" +
"\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" +
"\tc_char char(32),\n" +
"\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" +
"\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" +
"\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" +
"\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" +
"\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" +
"\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" +
"\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" +
"\t`c_time` time DEFAULT NULL COMMENT 'time',\n" +
"\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" +
"\t`c_blob` blob COMMENT 'blob',\n" +
"\t`c_text` text COMMENT 'text',\n" +
"\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" +
"\t`c_longblob` longblob COMMENT 'longblob',\n" +
"\tKEY `k_c` (`c_int`)\n" +
") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'"
, repository.console("show create table test1"));
}
}