diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java index a5de896750..c0fa6ef9c7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java @@ -20,6 +20,9 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTableItem { @@ -95,4 +98,28 @@ public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTabl public void setKey(boolean key) { this.key = key; } + + public void cloneTo(MySqlTableIndex x) { + if (name != null) { + x.setName(name.clone()); + } + for (SQLSelectOrderByItem item : items) { + SQLSelectOrderByItem item2 = item.clone(); + item2.setParent(x); + x.getColumns().add(item); + } + x.setIndexType(type); + } + + public void cloneTo(MySqlKey x) { + if (name != null) { + x.setName(name.clone()); + } + for (SQLSelectOrderByItem item : items) { + SQLSelectOrderByItem item2 = item.clone(); + item2.setParent(x); + x.getColumns().add(item); + } + x.setIndexType(type); + } } 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 9c9188899f..3825dcacf5 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 @@ -108,6 +108,10 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen this.name = name; } + public void setName(String name) { + this.setName(new SQLIdentifierExpr(name)); + } + public SQLDataType getDataType() { return dataType; } 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 856e1b1563..dc4349439c 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 @@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -210,7 +211,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (element instanceof MySqlUnique) { MySqlUnique unique = (MySqlUnique) element; - SQLExpr column = unique.getColumns().get(0); + SQLExpr column = unique.getColumns().get(0).getExpr(); if (column instanceof SQLIdentifierExpr && SQLUtils.nameEquals(columnName, ((SQLIdentifierExpr) column).getName())) { return unique.columns.size() > 1; @@ -218,7 +219,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS } else if (element instanceof MySqlKey) { MySqlKey unique = (MySqlKey) element; - SQLExpr column = unique.getColumns().get(0); + SQLExpr column = unique.getColumns().get(0).getExpr(); if (column instanceof SQLIdentifierExpr && SQLUtils.nameEquals(columnName, ((SQLIdentifierExpr) column).getName())) { return true; @@ -236,7 +237,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (element instanceof MySqlUnique) { MySqlUnique unique = (MySqlUnique) element; - SQLExpr column = unique.getColumns().get(0); + SQLExpr column = unique.getColumns().get(0).getExpr(); if (column instanceof SQLIdentifierExpr && SQLUtils.nameEquals(columnName, ((SQLIdentifierExpr) column).getName())) { return unique.columns.size() == 1; @@ -264,7 +265,8 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS for (SQLTableElement element : tableElementList) { if (element instanceof SQLUniqueConstraint) { SQLUniqueConstraint unique = (SQLUniqueConstraint) element; - for (SQLExpr columnExpr : unique.getColumns()) { + for (SQLSelectOrderByItem item : unique.getColumns()) { + SQLExpr columnExpr = item.getExpr(); if (columnExpr instanceof SQLIdentifierExpr) { String keyColumName = ((SQLIdentifierExpr) columnExpr).getName(); keyColumName = SQLUtils.normalize(keyColumName); @@ -571,6 +573,9 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS } else if (item instanceof SQLAlterTableRenameColumn) { return apply((SQLAlterTableRenameColumn) item); + + } else if (item instanceof SQLAlterTableAddIndex) { + return apply((SQLAlterTableAddIndex) item); } return false; @@ -695,6 +700,29 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return true; } + private boolean apply(SQLAlterTableAddIndex item) { + if (item.isKey()) { + MySqlPrimaryKey x = new MySqlPrimaryKey(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); + return true; + } + if (item.isUnique()) { + MySqlUnique x = new MySqlUnique(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); + return true; + } + + MySqlTableIndex x = new MySqlTableIndex(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); + return true; + } + private boolean apply(SQLAlterTableAddColumn item) { int startIndex = tableElementList.size(); if (item.isFirst()) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index bac2e6afaf..615818697f 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLReplaceable; @@ -80,6 +81,26 @@ public class SQLSelectItem extends SQLObjectImpl implements SQLReplaceable { return SQLUtils.normalize(alias); } + public SQLDataType computeDataType() { + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; + if (identExpr.getResolvedColumn() != null) { + return identExpr.getResolvedColumn().getDataType(); + } + return null; + } + + if (expr instanceof SQLPropertyExpr) { + SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; + if (propertyExpr.getResolvedColumn() != null) { + return propertyExpr.getResolvedColumn().getDataType(); + } + return null; + } + + return null; + } + public String getAlias() { return this.alias; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java index 1bb0a11044..017410a60c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java @@ -26,13 +26,13 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, SQLTableElement { - protected final List columns = new ArrayList(); + protected final List columns = new ArrayList(); public SQLUnique(){ } - public List getColumns() { + public List getColumns() { return columns; } @@ -40,7 +40,7 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, if (column != null) { column.setParent(this); } - this.columns.add(column); + this.columns.add(new SQLSelectOrderByItem(column)); } @Override @@ -53,7 +53,8 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, } public boolean containsColumn(String column) { - for (SQLExpr expr : columns) { + for (SQLSelectOrderByItem item : columns) { + SQLExpr expr = item.getExpr(); if (expr instanceof SQLIdentifierExpr) { if (SQLUtils.nameEquals(((SQLIdentifierExpr) expr).getName(), column)) { return true; @@ -66,9 +67,10 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, public void cloneTo(SQLUnique x) { super.cloneTo(x); - for (SQLExpr column : columns) { - SQLExpr columnClone = column.clone(); - x.addColumn(columnClone); + for (SQLSelectOrderByItem column : columns) { + SQLSelectOrderByItem column2 = column.clone(); + column2.setParent(x); + x.columns.add(column2); } } @@ -81,7 +83,8 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, public void simplify() { super.simplify(); - for (SQLExpr column : columns) { + for (SQLSelectOrderByItem item : columns) { + SQLExpr column = item.getExpr(); if (column instanceof SQLIdentifierExpr) { SQLIdentifierExpr identExpr = (SQLIdentifierExpr) column; String columnName = identExpr.getName(); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUniqueConstraint.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUniqueConstraint.java index de7691fa90..f95fa60fd1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUniqueConstraint.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUniqueConstraint.java @@ -21,7 +21,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; public interface SQLUniqueConstraint extends SQLConstraint { - List getColumns(); + List getColumns(); boolean containsColumn(String column); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlShowColumnOutpuVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlShowColumnOutpuVisitor.java index 19f242418a..db5da616b7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlShowColumnOutpuVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlShowColumnOutpuVisitor.java @@ -40,7 +40,7 @@ public class MySqlShowColumnOutpuVisitor extends MySqlOutputVisitor { List dataTypes = new ArrayList(); List defaultValues = new ArrayList(); - int name_len = -1, dataType_len = -1, defaultVal_len = -1, extra_len = 5; + int name_len = -1, dataType_len = -1, defaultVal_len = 7, extra_len = 5; for (SQLTableElement element : x.getTableElementList()) { if (element instanceof SQLColumnDefinition) { SQLColumnDefinition column = (SQLColumnDefinition) element; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java index 1db958d398..8eec8dbf0c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java @@ -60,10 +60,6 @@ public class OraclePrimaryKey extends SQLPrimaryKeyImpl implements OracleConstra this.deferrable = deferrable; } - public List getColumns() { - return columns; - } - public OracleUsingIndexClause getUsing() { return using; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 8a09d9d206..490d449df3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -1019,7 +1019,7 @@ public class OracleExprParser extends SQLExprParser { OraclePrimaryKey primaryKey = new OraclePrimaryKey(); accept(Token.LPAREN); - exprList(primaryKey.getColumns(), primaryKey); + orderBy(primaryKey.getColumns(), primaryKey); accept(Token.RPAREN); @@ -1349,7 +1349,7 @@ public class OracleExprParser extends SQLExprParser { OracleUnique unique = new OracleUnique(); accept(Token.LPAREN); - exprList(unique.getColumns(), unique); + orderBy(unique.getColumns(), unique); accept(Token.RPAREN); if (lexer.token() == Token.USING) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 46ab4e0339..bb6fe3ce21 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1273,12 +1273,7 @@ public class SQLExprParser extends SQLParser { accept(Token.BY); - orderBy.addItem(parseSelectOrderByItem()); - - while (lexer.token() == Token.COMMA) { - lexer.nextToken(); - orderBy.addItem(parseSelectOrderByItem()); - } + orderBy(orderBy.getItems(), orderBy); return orderBy; } @@ -1286,6 +1281,18 @@ public class SQLExprParser extends SQLParser { return null; } + public void orderBy(List items, SQLObject parent) { + SQLSelectOrderByItem item = parseSelectOrderByItem(); + item.setParent(parent); + items.add(item); + while (lexer.token() == Token.COMMA) { + lexer.nextToken(); + item = parseSelectOrderByItem(); + item.setParent(parent); + items.add(item); + } + } + public SQLSelectOrderByItem parseSelectOrderByItem() { SQLSelectOrderByItem item = new SQLSelectOrderByItem(); @@ -2135,7 +2142,7 @@ public class SQLExprParser extends SQLParser { SQLPrimaryKeyImpl pk = new SQLPrimaryKeyImpl(); accept(Token.LPAREN); - exprList(pk.getColumns(), pk); + orderBy(pk.getColumns(), pk); accept(Token.RPAREN); return pk; @@ -2146,7 +2153,7 @@ public class SQLExprParser extends SQLParser { SQLUnique unique = new SQLUnique(); accept(Token.LPAREN); - exprList(unique.getColumns(), unique); + orderBy(unique.getColumns(), unique); accept(Token.RPAREN); if (lexer.token() == Token.DISABLE) { diff --git a/src/main/java/com/alibaba/druid/sql/repository/Schema.java b/src/main/java/com/alibaba/druid/sql/repository/Schema.java index 91e6078a8e..bd18125ed6 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/Schema.java +++ b/src/main/java/com/alibaba/druid/sql/repository/Schema.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.repository; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; @@ -140,15 +141,7 @@ public class Schema { } public boolean visit(SQLCreateTableStatement x) { - String name = x.computeName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Table, x); - - String name_lower = name.toLowerCase(); - if (objects.containsKey(name_lower)) { - return false; - } - objects.put(name_lower, object); - + acceptCreateTable(x); return false; } @@ -197,6 +190,39 @@ public class Schema { } } + boolean acceptCreateTable(SQLCreateTableStatement x) { + SQLSelect select = x.getSelect(); + if (select != null) { + select.accept( + repository.createResolveVisitor()); + + SQLSelectQueryBlock queryBlock = select.getQueryBlock(); + if (queryBlock != null) { + List selectList = queryBlock.getSelectList(); + for (SQLSelectItem selectItem : selectList) { + String name = selectItem.computeAlias(); + SQLDataType dataType = selectItem.computeDataType(); + SQLColumnDefinition column = new SQLColumnDefinition(); + column.setName(name); + column.setDataType(dataType); + column.setDbType(repository.dbType); + x.getTableElementList().add(column); + } + x.setSelect(null); + } + } + + String name = x.computeName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Table, x); + + String name_lower = name.toLowerCase(); + if (objects.containsKey(name_lower)) { + return false; + } + objects.put(name_lower, object); + return true; + } + private class MySqlSchemaVisitor extends MySqlASTVisitorAdapter { public boolean visit(SQLDropSequenceStatement x) { @@ -221,23 +247,16 @@ public class Schema { MySqlCreateTableStatement stmt = (MySqlCreateTableStatement) table.getStatement(); MySqlCreateTableStatement stmtCloned = stmt.clone(); stmtCloned.setName(x.getName().clone()); - return visit((SQLCreateTableStatement) stmtCloned); + acceptCreateTable(stmtCloned); + return false; } } - visit((SQLCreateTableStatement) x); + acceptCreateTable(x); return false; } public boolean visit(SQLCreateTableStatement x) { - String name = x.computeName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Table, x); - - String name_lower = name.toLowerCase(); - if (objects.containsKey(name_lower)) { - return false; - } - objects.put(name_lower, object); - + acceptCreateTable(x); return false; } 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 998463cb2f..a11d36151e 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -26,17 +26,19 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.JdbcUtils; import java.io.IOException; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentSkipListMap; /** @@ -253,4 +255,66 @@ public class SchemaRepository { return null; } + + public SQLASTVisitor createResolveVisitor() { + if (JdbcConstants.MYSQL.equals(dbType)) { + return new MySqlResolveVisitor(); + } + + throw new DruidRuntimeException("dbType not support : " + dbType); + } + + public class MySqlResolveVisitor extends MySqlASTVisitorAdapter { + + public boolean visit(MySqlSelectQueryBlock x) { + List selectList = x.getSelectList(); + for (int i = selectList.size() - 1; i >= 0; i--) { + SQLSelectItem selectItem = selectList.get(i); + SQLExpr expr = selectItem.getExpr(); + if (expr instanceof SQLAllColumnExpr) { + SQLTableSource from = x.getFrom(); + List columns = new ArrayList(); + if (from instanceof SQLExprTableSource) { + SchemaObject table = findTable((SQLExprTableSource) from); + if (table != null) { + SQLCreateTableStatement createTableStmt = (SQLCreateTableStatement) table.getStatement(); + for (SQLTableElement e : createTableStmt.getTableElementList()) { + if (e instanceof SQLColumnDefinition) { + SQLColumnDefinition column = (SQLColumnDefinition) e; + SQLIdentifierExpr name = (SQLIdentifierExpr) column.getName().clone(); + name.setResolvedColumn(column); + columns.add(new SQLSelectItem(name)); + } + } + } + } + + for (SQLSelectItem column : columns) { + column.setParent(x); + } + selectList.remove(i); + selectList.addAll(i, columns); + } + } + + return super.visit(x); + } + } + + public SchemaObject findTable(SQLExprTableSource x) { + if (x == null) { + return null; + } + + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLName) { + return findTable((SQLName) expr); + } + + return null; + } + + public class OracleResolveVisitor extends OracleASTVisitorAdapter { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 08ddd224ba..04e6a2b9d1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -804,7 +804,7 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public boolean visit(SQLUnique x) { - for (SQLExpr column : x.getColumns()) { + for (SQLSelectOrderByItem column : x.getColumns()) { column.accept(this); } return false; 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 75d929fb2a..7058f86600 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 @@ -322,5 +322,96 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\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")); + + repository.console("CREATE TABLE test3 as select * from test2"); + assertEquals("CREATE TABLE test3 (\n" + + "\tc_decimal_1 INT(11),\n" + + "\tid bigint(20),\n" + + "\tc_tinyint tinyint(4),\n" + + "\tc_smallint smallint(6),\n" + + "\tc_mediumint mediumint(9),\n" + + "\tc_int int(11),\n" + + "\tc_bigint bigint(20),\n" + + "\tc_date date,\n" + + "\tc_datetime datetime,\n" + + "\tc_timestamp timestamp,\n" + + "\tc_time time,\n" + + "\tc_char char(10),\n" + + "\tc_varchar varchar(10),\n" + + "\tc_blob blob,\n" + + "\tc_text text,\n" + + "\tc_mediumtext mediumtext,\n" + + "\tc_longblob longblob\n" + + ")", repository.console("show create table test3")); + + assertEquals("+--------------+--------------+------+-----+---------+-------+\n" + + "| Field | Type | Null | Key | Default | Extra |\n" + + "+--------------+--------------+------+-----+---------+-------+\n" + + "| c_decimal_1 | INT(11) | NO | | NULL | |\n" + + "| id | bigint(20) | NO | | NULL | |\n" + + "| c_tinyint | tinyint(4) | NO | | NULL | |\n" + + "| c_smallint | smallint(6) | NO | | NULL | |\n" + + "| c_mediumint | mediumint(9) | NO | | NULL | |\n" + + "| c_int | int(11) | NO | | NULL | |\n" + + "| c_bigint | bigint(20) | NO | | NULL | |\n" + + "| c_date | date | NO | | NULL | |\n" + + "| c_datetime | datetime | NO | | NULL | |\n" + + "| c_timestamp | timestamp | NO | | NULL | |\n" + + "| c_time | time | NO | | NULL | |\n" + + "| c_char | char(10) | NO | | NULL | |\n" + + "| c_varchar | varchar(10) | NO | | NULL | |\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 test3")); + + repository.console("alter TABLE test3 add UNIQUE(c_tinyint)"); + + assertEquals("+--------------+--------------+------+-----+---------+-------+\n" + + "| Field | Type | Null | Key | Default | Extra |\n" + + "+--------------+--------------+------+-----+---------+-------+\n" + + "| c_decimal_1 | INT(11) | NO | | NULL | |\n" + + "| id | bigint(20) | NO | | NULL | |\n" + + "| c_tinyint | tinyint(4) | NO | UNI | NULL | |\n" + + "| c_smallint | smallint(6) | NO | | NULL | |\n" + + "| c_mediumint | mediumint(9) | NO | | NULL | |\n" + + "| c_int | int(11) | NO | | NULL | |\n" + + "| c_bigint | bigint(20) | NO | | NULL | |\n" + + "| c_date | date | NO | | NULL | |\n" + + "| c_datetime | datetime | NO | | NULL | |\n" + + "| c_timestamp | timestamp | NO | | NULL | |\n" + + "| c_time | time | NO | | NULL | |\n" + + "| c_char | char(10) | NO | | NULL | |\n" + + "| c_varchar | varchar(10) | NO | | NULL | |\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 test3")); + + repository.console("alter TABLE test3 add PRIMARY KEY(id)"); + + assertEquals("+--------------+--------------+------+-----+---------+-------+\n" + + "| Field | Type | Null | Key | Default | Extra |\n" + + "+--------------+--------------+------+-----+---------+-------+\n" + + "| c_decimal_1 | INT(11) | NO | | NULL | |\n" + + "| id | bigint(20) | NO | PRI | NULL | |\n" + + "| c_tinyint | tinyint(4) | NO | UNI | NULL | |\n" + + "| c_smallint | smallint(6) | NO | | NULL | |\n" + + "| c_mediumint | mediumint(9) | NO | | NULL | |\n" + + "| c_int | int(11) | NO | | NULL | |\n" + + "| c_bigint | bigint(20) | NO | | NULL | |\n" + + "| c_date | date | NO | | NULL | |\n" + + "| c_datetime | datetime | NO | | NULL | |\n" + + "| c_timestamp | timestamp | NO | | NULL | |\n" + + "| c_time | time | NO | | NULL | |\n" + + "| c_char | char(10) | NO | | NULL | |\n" + + "| c_varchar | varchar(10) | NO | | NULL | |\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 test3")); } }