diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index bd3e54d408..58c319e438 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -791,6 +791,10 @@ public class SQLUtils { if (MySqlUtils.isKeyword(normalizeName)) { return name; } + } else if (JdbcConstants.POSTGRESQL.equals(dbType)) { + if (PGUtils.isKeyword(normalizeName)) { + return name; + } } return normalizeName; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java index 2a51b52f68..f13093a5c0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -26,7 +27,7 @@ public class SQLCommentStatement extends SQLStatementImpl { TABLE, COLUMN } - private SQLExpr on; + private SQLName on; private Type type; private SQLExpr comment; @@ -46,11 +47,11 @@ public class SQLCommentStatement extends SQLStatementImpl { this.type = type; } - public SQLExpr getOn() { + public SQLName getOn() { return on; } - public void setOn(SQLExpr on) { + public void setOn(SQLName on) { this.on = on; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 6ffdb34913..327ab95926 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -33,16 +33,18 @@ import com.alibaba.druid.util.lang.Consumer; public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLStatement { - protected boolean ifNotExiists = false; - protected Type type; - protected SQLExprTableSource tableSource; + protected boolean ifNotExiists = false; + protected Type type; + protected SQLExprTableSource tableSource; protected List tableElementList = new ArrayList(); // for postgresql - private SQLExprTableSource inherits; + private SQLExprTableSource inherits; - protected SQLSelect select; + protected SQLSelect select; + + protected SQLExpr comment; public SQLCreateTableStatement(){ @@ -52,6 +54,17 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS super(dbType); } + public SQLExpr getComment() { + return comment; + } + + public void setComment(SQLExpr comment) { + if (comment != null) { + comment.setParent(this); + } + this.comment = comment; + } + public SQLName getName() { if (tableSource == null) { return null; @@ -586,6 +599,38 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return false; } + public boolean apply(SQLCommentStatement x) { + SQLName on = x.getOn(); + SQLExpr comment = x.getComment(); + if (comment == null) { + return false; + } + + SQLCommentStatement.Type type = x.getType(); + if (type == SQLCommentStatement.Type.TABLE) { + if (!SQLUtils.nameEquals(getName(), on)) { + return false; + } + + setComment(comment.clone()); + + return true; + } else if (type == SQLCommentStatement.Type.COLUMN) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) on; + if (!SQLUtils.nameEquals(getName(), (SQLName) propertyExpr.getOwner())) { + return false; + } + + SQLColumnDefinition column = this.findColumn(propertyExpr.getName()); + if (column != null) { + column.setComment(comment.clone()); + } + return true; + } + + return false; + } + public boolean apply(SQLAlterTableStatement alter) { if (!SQLUtils.nameEquals(alter.getName(), this.getName())) { return false; @@ -842,6 +887,9 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (select != null) { x.setSelect(select.clone()); } + if (comment != null) { + x.setComment(comment.clone()); + } } public SQLCreateTableStatement clone() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 1cf137db1f..fa56b25731 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -241,7 +241,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (lexer.token() == Token.EQ) { lexer.nextToken(); } - stmt.getTableOptions().put("COMMENT", this.exprParser.expr()); + stmt.setComment(this.exprParser.expr()); continue; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index f72e627da2..9b1b0728ed 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -536,6 +536,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV option.getValue().accept(this); } + SQLExpr comment = x.getComment(); + if (comment != null) { + print0(ucase ? " COMMENT " : " comment "); + comment.accept(this); + } + if (x.getPartitioning() != null) { println(); x.getPartitioning().accept(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java index 05acb5a611..20d55a4fac 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java @@ -31,8 +31,6 @@ public class OdpsCreateTableStatement extends SQLCreateTableStatement { private SQLExprTableSource like; - protected SQLExpr comment; - protected List partitionColumns = new ArrayList(2); protected final List clusteredBy = new ArrayList(); @@ -58,14 +56,6 @@ public class OdpsCreateTableStatement extends SQLCreateTableStatement { this.like = like; } - public SQLExpr getComment() { - return comment; - } - - public void setComment(SQLExpr comment) { - this.comment = comment; - } - public List getPartitionColumns() { return partitionColumns; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 004fb70f21..29dbbfa53d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -1764,11 +1764,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print0(ucase ? "COMPUTE STATISTICS" : "compute statistics"); } - if (x.getTablespace() != null) { - println(); - print0(ucase ? "TABLESPACE " : "tablespace "); - x.getTablespace().accept(this); - } + this.printOracleSegmentAttributes(x); if (x.isOnline()) { print0(ucase ? " ONLINE" : " online"); @@ -1790,8 +1786,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } } - this.printOracleSegmentAttributes(x); - if (x.getLocalPartitions().size() > 0) { println(); print0(ucase ? "LOCAL (" : "local ("); diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index b73a7558f0..85c3a4c902 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -849,7 +849,7 @@ public class SchemaRepository { } } - x.setSchema(null); + x1.setSchema(null); String name = x1.computeName(); SchemaObject table = schema.findTableOrView(name); diff --git a/src/main/java/com/alibaba/druid/util/PGUtils.java b/src/main/java/com/alibaba/druid/util/PGUtils.java index a940714408..4e760f2814 100644 --- a/src/main/java/com/alibaba/druid/util/PGUtils.java +++ b/src/main/java/com/alibaba/druid/util/PGUtils.java @@ -20,7 +20,9 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.sql.XAConnection; @@ -52,4 +54,23 @@ public class PGUtils { return tables; } + + private static Set keywords; + public static boolean isKeyword(String name) { + if (name == null) { + return false; + } + + String name_lower = name.toLowerCase(); + + Set words = keywords; + + if (words == null) { + words = new HashSet(); + Utils.loadFromFile("META-INF/druid/parser/postgresql/keywords", words); + keywords = words; + } + + return words.contains(name_lower); + } } diff --git a/src/main/resources/META-INF/druid/parser/postgresql/keywords b/src/main/resources/META-INF/druid/parser/postgresql/keywords new file mode 100644 index 0000000000..8aba3279f8 --- /dev/null +++ b/src/main/resources/META-INF/druid/parser/postgresql/keywords @@ -0,0 +1,251 @@ +abs +all +allocate +analyse +analyze +and +any +are +array +array_agg +array_max_cardinality +as +asensitive +asymmetric +atomic +authorization +avg +begin_frame +begin_partition +binary +bit_length +blob +both +call +cardinality +case +cast +ceil +ceiling +character_length +char_length +check +clob +collate +collect +column +concurrently +condition +connect +constraint +convert +corr +corresponding +count +covar_pop +covar_samp +create +cross +cume_dist +current_catalog +current_date +current_default_transform_group +current_path +current_role +current_row +current_schema +current_time +current_timestamp +current_transform_group_for_type +current_user +datalink +date +default +dense_rank +deref +describe +deterministic +disconnect +distinct +dlnewcopy +dlpreviouscopy +dlurlcomplete +dlurlcompleteonly +dlurlcompletewrite +dlurlpath +dlurlpathonly +dlurlpathwrite +dlurlscheme +dlurlserver +dlvalue +do +dynamic +element +else +end +end-exec +end_frame +end_partition +every +except +exception +exec +exp +false +fetch +first_value +floor +for +foreign +frame_row +free +freeze +from +full +fusion +get +grant +group +groups +having +ilike +in +indicator +inner +intersect +intersection +into +is +isnull +join +lag +last_value +lateral +lead +leading +left +like +like_regex +ln +localtime +localtimestamp +lower +max +max_cardinality +member +merge +min +mod +modifies +module +multiset +natural +nclob +normalize +not +notnull +nth_value +ntile +null +occurrences_regex +octet_length +offset +on +only +open +or +order +outer +overlaps +parameter +percent +percentile_cont +percentile_disc +percent_rank +period +portion +position_regex +power +precedes +primary +rank +reads +references +regr_avgx +regr_avgy +regr_count +regr_intercept +regr_r2 +regr_slope +regr_sxx +regr_sxy +regr_syy +result +return +right +row_number +scope +select +sensitive +session_user +similar +some +specific +specifictype +sqlcode +sqlerror +sqlexception +sqlstate +sqlwarning +sqrt +static +stddev_pop +stddev_samp +submultiset +substring_regex +succeeds +sum +symmetric +system_time +system_user +table +tablesample +then +timezone_hour +timezone_minute +to +trailing +translate +translate_regex +translation +trim_array +true +uescape +union +unique +unnest +upper +user +using +value_of +varbinary +variadic +var_pop +var_samp +verbose +versioning +when +whenever +where +width_bucket +window +with +xmlagg +xmlbinary +xmlcast +xmlcomment +xmldocument +xmliterate +xmlquery +xmltext +xmlvalidate \ No newline at end of file diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java index d0f3ec9c08..698f18f3b6 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest14.java @@ -53,7 +53,7 @@ public class MySqlCreateTableTest14 extends MysqlTest { + "\n\tPRIMARY KEY (`ID`)," + "\n\tKEY `quizId` USING BTREE (`QuizID`)," + "\n\tKEY `optionId` USING BTREE (`OptionID`)" - + "\n) ENGINE = InnoDB CHARSET = gbk COMMENT = ''", // + + "\n) ENGINE = InnoDB CHARSET = gbk COMMENT ''", // SQLUtils.toMySqlString(stmt)); Assert.assertEquals("create table `OptionList` (" + "\n\t`ID` int(11) not null auto_increment," @@ -64,7 +64,7 @@ public class MySqlCreateTableTest14 extends MysqlTest { + "\n\tprimary key (`ID`)," + "\n\tkey `quizId` using BTREE (`QuizID`)," + "\n\tkey `optionId` using BTREE (`OptionID`)" - + "\n) engine = InnoDB charset = gbk comment = ''", // + + "\n) engine = InnoDB charset = gbk comment ''", // SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); Assert.assertEquals(1, statementList.size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest50.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest50.java index 0d8cdfa1c5..8e31f0db8d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest50.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest50.java @@ -53,7 +53,7 @@ public class MySqlCreateTableTest50 extends MysqlTest { Assert.assertEquals("CREATE TABLE `test`.`a` (" // + "\n\t`ida` INT NOT NULL COMMENT 'aaa',"// + "\n\tPRIMARY KEY (`ida`)"// - + "\n) COMMENT = 'bb'",// + + "\n) COMMENT 'bb'",// output); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest52.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest52.java index f3be5240de..e9a68f77dd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest52.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest52.java @@ -64,6 +64,6 @@ public class MySqlCreateTableTest52 extends MysqlTest { +"\n\t`create_time` datetime NOT NULL COMMENT '授权时间',"// +"\n\t`invalid_time` datetime NOT NULL COMMENT '授权失效时间',"// +"\n\tPRIMARY KEY (`auth_id`)" - +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT = 'INS_EBAY_AUTH'", output); + +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT 'INS_EBAY_AUTH'", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest53.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest53.java index 456191aec1..18c4360511 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest53.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest53.java @@ -66,7 +66,7 @@ public class MySqlCreateTableTest53 extends MysqlTest { +"\n\t`create_time` datetime NOT NULL COMMENT '授权时间',"// +"\n\t`invalid_time` datetime NOT NULL COMMENT '授权失效时间',"// +"\n\tPRIMARY KEY USING BTREE (`auth_id`)" - +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT = 'INS_EBAY_AUTH'", output); + +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT 'INS_EBAY_AUTH'", output); } @Test @@ -109,7 +109,7 @@ public class MySqlCreateTableTest53 extends MysqlTest { +"\n\t`invalid_time` datetime NOT NULL COMMENT '授权失效时间',"// +"\n\tPRIMARY KEY USING BTREE (`auth_id`)," +"\n\tINDEX `ind_usr_id` USING BTREE(`usr_id`)" - +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT = 'INS_EBAY_AUTH'", output); + +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT 'INS_EBAY_AUTH'", output); } @Test @@ -152,6 +152,6 @@ public class MySqlCreateTableTest53 extends MysqlTest { +"\n\t`invalid_time` datetime NOT NULL COMMENT '授权失效时间',"// +"\n\tPRIMARY KEY USING BTREE (`auth_id`)," +"\n\tKEY `ind_usr_id` USING BTREE (`usr_id`)" - +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT = 'INS_EBAY_AUTH'", output); + +"\n) ENGINE = InnoDB CHARSET = utf8 COLLATE utf8_bin COMMENT 'INS_EBAY_AUTH'", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest71.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest71.java index 6197c7ffa2..f1185d7479 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest71.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest71.java @@ -51,7 +51,7 @@ public class MySqlCreateTableTest71 extends MysqlTest { + "\n\tgmt_create datetime NOT NULL COMMENT '创建时间'," + "\n\tgmt_modified datetime NOT NULL COMMENT '修改时间'," + "\n\tPRIMARY KEY (id)" - + "\n) COMMENT = 're'", output); + + "\n) COMMENT 're'", output); } { @@ -61,7 +61,7 @@ public class MySqlCreateTableTest71 extends MysqlTest { + "\n\tgmt_create datetime not null comment '创建时间'," + "\n\tgmt_modified datetime not null comment '修改时间'," + "\n\tprimary key (id)" - + "\n) comment = 're'", output); + + "\n) comment 're'", output); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest75.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest75.java index b0751f7952..1f31656efd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest75.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest75.java @@ -80,7 +80,7 @@ public class MySqlCreateTableTest75 extends MysqlTest { "\tKEY `k_rid_aid_tid` (`receiver_id`, `app_id`, `type_id`, `expiration_date`),\n" + "\tKEY `k_rid_stat_popup` (`receiver_id`, `status`, `popup`, `expiration_date`),\n" + "\tKEY `k_tid` (`tag_id`)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 167279613030 CHARSET = gbk COMMENT = '消息实体表'", output); + ") ENGINE = InnoDB AUTO_INCREMENT = 167279613030 CHARSET = gbk COMMENT '消息实体表'", output); } { @@ -104,7 +104,7 @@ public class MySqlCreateTableTest75 extends MysqlTest { "\tkey `k_rid_aid_tid` (`receiver_id`, `app_id`, `type_id`, `expiration_date`),\n" + "\tkey `k_rid_stat_popup` (`receiver_id`, `status`, `popup`, `expiration_date`),\n" + "\tkey `k_tid` (`tag_id`)\n" + - ") engine = InnoDB auto_increment = 167279613030 charset = gbk comment = '消息实体表'", output); + ") engine = InnoDB auto_increment = 167279613030 charset = gbk comment '消息实体表'", output); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest76.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest76.java index e3c4afd963..1be751f93d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest76.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest76.java @@ -80,7 +80,7 @@ public class MySqlCreateTableTest76 extends MysqlTest { "\tKEY `k_rid_aid_tid` (`receiver_id`, `app_id`, `type_id`, `expiration_date`),\n" + "\tKEY `k_rid_stat_popup` (`receiver_id`, `status`, `popup`, `expiration_date`),\n" + "\tKEY `k_tid` (`tag_id`)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 167279613030 CHARSET = gbk COMMENT = '消息实体表'", output); + ") ENGINE = InnoDB AUTO_INCREMENT = 167279613030 CHARSET = gbk COMMENT '消息实体表'", output); } { @@ -104,7 +104,7 @@ public class MySqlCreateTableTest76 extends MysqlTest { "\tkey `k_rid_aid_tid` (`receiver_id`, `app_id`, `type_id`, `expiration_date`),\n" + "\tkey `k_rid_stat_popup` (`receiver_id`, `status`, `popup`, `expiration_date`),\n" + "\tkey `k_tid` (`tag_id`)\n" + - ") engine = InnoDB auto_increment = 167279613030 charset = gbk comment = '消息实体表'", output); + ") engine = InnoDB auto_increment = 167279613030 charset = gbk comment '消息实体表'", output); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest79_collate.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest79_collate.java index 264356cc17..ffe9f729d3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest79_collate.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest79_collate.java @@ -43,7 +43,7 @@ public class MySqlCreateTableTest79_collate extends MysqlTest { "\tcustom_vip_show_message_seq INT(11) NOT NULL AUTO_INCREMENT,\n" + "\tshow_channel_type TINYINT(4) NOT NULL COMMENT '通道类型',\n" + "\tPRIMARY KEY (custom_vip_show_message_seq)\n" + - ") COMMENT = '自定VIP显示表' COLLATE utf8_general_ci ENGINE = InnoDB", output); + ") ENGINE = InnoDB COMMENT '自定VIP显示表' COLLATE utf8_general_ci", output); } { @@ -52,7 +52,7 @@ public class MySqlCreateTableTest79_collate extends MysqlTest { "\tcustom_vip_show_message_seq INT(11) not null auto_increment,\n" + "\tshow_channel_type TINYINT(4) not null comment '通道类型',\n" + "\tprimary key (custom_vip_show_message_seq)\n" + - ") comment = '自定VIP显示表' collate utf8_general_ci engine = InnoDB", output); + ") engine = InnoDB comment '自定VIP显示表' collate utf8_general_ci", output); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java index a84bc01537..013ba75ea3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java @@ -183,7 +183,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tUNIQUE `uk_a` (`c_varchar`, `c_mediumint`),\n" + "\tKEY `k_c` (`c_tinyint`, `c_int`),\n" + "\tKEY `k_d` (`c_char`, `c_bigint`)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'", repository.console("show create table test1")); + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'", repository.console("show create table test1")); assertEquals("+--------------+--------------+------+-----+---------------------+-----------------------------+\n" + @@ -231,7 +231,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\t`c_longblob` longblob COMMENT 'longblob',\n" + "\tUNIQUE `uk_a` (`c_varchar`, `c_mediumint`),\n" + "\tKEY `k_c` (`c_tinyint`, `c_int`)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'", repository.console("show create table test1")); + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'", repository.console("show create table test1")); assertEquals("+--------------+--------------+------+-----+---------------------+-----------------------------+\n" + "| Field | Type | Null | Key | Default | Extra |\n" + @@ -278,7 +278,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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")); + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'", repository.console("show create table test1")); assertEquals("+--------------+--------------+------+-----+---------------------+-----------------------------+\n" + "| Field | Type | Null | Key | Default | Extra |\n" + @@ -323,7 +323,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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 test2")); + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'", repository.console("show create table test2")); repository.console("CREATE TABLE test3 as select * from test2"); assertEquals("CREATE TABLE test3 (\n" + @@ -459,7 +459,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { ")", repository.console("show create table test5")); repository.console("CREATE TABLE sc01.test6 as select a.id, c_tinyint, 'a' f3, 3 f4 from test2 a"); - assertEquals("CREATE TABLE sc01.test6 (\n" + + assertEquals("CREATE TABLE test6 (\n" + "\tid bigint(20),\n" + "\tc_tinyint tinyint(4),\n" + "\tf3 varchar,\n" + @@ -503,7 +503,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -529,7 +529,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -553,7 +553,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -578,7 +578,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -627,7 +627,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -651,7 +651,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -726,7 +726,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tKEY `k_c` (`c_int`),\n" + "\tUNIQUE name4_idx (id),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -754,7 +754,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tUNIQUE name4_idx (id),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -779,7 +779,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tKEY `k_c` (`c_int`),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -805,7 +805,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint),\n" + "\tCONSTRAINT name5_pk PRIMARY KEY (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -830,7 +830,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tKEY `k_c` (`c_int`),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -858,7 +858,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint),\n" + "\tUNIQUE name_idx_23 (c_char(10))\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -906,7 +906,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tKEY `k_c` (`c_int`),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1")); @@ -939,7 +939,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\tKEY `k_c` (`c_int`),\n" + "\tFULLTEXT INDEX name4_idx_c_longblob(c_longblob),\n" + "\tKEY name5_idx (c_bigint)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'" + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT '10000000'" , repository.console("show create table test1_xx")); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java index 3e76374c7b..3ccd9a658f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java @@ -53,7 +53,6 @@ public class OracleCreateIndexTest12 extends OracleTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); assertEquals("CREATE BITMAP INDEX product_bm_ix ON hash_products(list_price)\n" + - "TABLESPACE tbs_1\n" + "TABLESPACE tbs_1\n" + "LOCAL (\n" + "\tPARTITION ix_p1\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest15.java new file mode 100644 index 0000000000..2641140a96 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest15.java @@ -0,0 +1,62 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateIndexTest15 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "create index idx_t12 on t1(id) tablespace users online;"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals("CREATE INDEX idx_t12 ON t1(id)\n" + + "TABLESPACE users ONLINE;" + , SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + assertEquals(1, visitor.getTables().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); + + assertEquals(1, visitor.getColumns().size()); + +// assertTrue(visitor.getColumns().contains(new TableStat.Column("xwarehouses", "sales_rep_id"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest6.java index d1614a05b6..807e56a3e3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest6.java @@ -51,8 +51,8 @@ public class OracleCreateIndexTest6 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - assertEquals("CREATE INDEX ord_customer_ix_demo ON orders(order_mode) NOSORT\n" + - "NOLOGGING;", SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + assertEquals("CREATE INDEX ord_customer_ix_demo ON orders(order_mode)\n" + + "NOLOGGING NOSORT;", SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); assertEquals(1, visitor.getTables().size());