diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java index 470e5aad9c..2c76853129 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerInsertStatement.java @@ -27,6 +27,8 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS private List valuesList = new ArrayList(); + private boolean defaultValues; + public ValuesClause getValues() { if (valuesList.size() == 0) { return null; @@ -62,4 +64,13 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS visitor.endVisit(this); } + + public boolean isDefaultValues() { + return defaultValues; + } + + public void setDefaultValues(boolean defaultValues) { + this.defaultValues = defaultValues; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index 3861838e9d..794768fc2a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.parser; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; @@ -132,7 +133,7 @@ public class SQLServerExprParser extends SQLExprParser { return null; } - + protected SQLColumnDefinition createColumnDefinition() { SQLColumnDefinition column = new SQLServerColumnDefinition(); return column; @@ -151,12 +152,18 @@ public class SQLServerExprParser extends SQLExprParser { SQLServerColumnDefinition.Identity identity = new SQLServerColumnDefinition.Identity(); identity.setSeed((Integer) seed.getNumber()); identity.setIncrement((Integer) increment.getNumber()); - + if (lexer.token() == Token.NOT) { lexer.nextToken(); - accept(Token.FOR); - identifierEquals("REPLICATION "); - identity.setNotForReplication(true); + + if (lexer.token() == Token.NULL) { + lexer.nextToken(); + column.setDefaultExpr(new SQLNullExpr()); + } else { + accept(Token.FOR); + identifierEquals("REPLICATION "); + identity.setNotForReplication(true); + } } SQLServerColumnDefinition sqlSreverColumn = (SQLServerColumnDefinition) column; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index ad1d1c143c..cfef12a6c1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -133,6 +133,10 @@ public class SQLServerStatementParser extends SQLStatementParser { } else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) { SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); insertStatement.setQuery(queryExpr.getSubQuery()); + } else if (lexer.token() == Token.DEFAULT) { + lexer.nextToken(); + accept(Token.VALUES); + insertStatement.setDefaultValues(true); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index aa1c7e31e9..70a477331f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -167,6 +167,10 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe println(); x.getQuery().accept(this); } + + if (x.isDefaultValues()) { + print(" DEFAULT VALUES"); + } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index a5ae3a15aa..ff7029cc4d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -16,9 +16,9 @@ package com.alibaba.druid.sql.parser; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLConstaint; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; -import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; +import com.alibaba.druid.sql.ast.statement.SQLTableElement; public class SQLCreateTableParser extends SQLDDLParser { @@ -68,24 +68,30 @@ public class SQLCreateTableParser extends SQLDDLParser { lexer.nextToken(); for (;;) { - if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) { + if (lexer.token() == Token.IDENTIFIER // + || lexer.token() == Token.LITERAL_ALIAS) { SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(column); } else if (lexer.token == Token.PRIMARY // || lexer.token == Token.UNIQUE // || lexer.token == Token.CHECK // || lexer.token == Token.CONSTRAINT) { - OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint(); + SQLConstaint constraint = this.exprParser.parseConstaint(); constraint.setParent(createTable); - createTable.getTableElementList().add(constraint); + createTable.getTableElementList().add((SQLTableElement) constraint); } else if (lexer.token() == Token.TABLESPACE) { throw new ParserException("TODO " + lexer.token()); } else { - throw new ParserException("TODO " + lexer.token()); + SQLColumnDefinition column = this.exprParser.parseColumn(); + createTable.getTableElementList().add(column); } if (lexer.token() == Token.COMMA) { lexer.nextToken(); + + if (lexer.token() == Token.RPAREN) { // compatible for sql server + break; + } continue; } 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 f08d3f1620..29a1cbf4ef 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -96,7 +96,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); SQLExpr expr = new SQLAllColumnExpr(); - + if (lexer.token() == Token.DOT) { lexer.nextToken(); accept(Token.STAR); @@ -706,7 +706,52 @@ public class SQLExprParser extends SQLParser { identName = lexer.stringVal(); lexer.nextToken(); } else { - throw new ParserException("error " + lexer.token()); + switch (lexer.token()) { + case MODEL: + case PCTFREE: + case INITRANS: + case MAXTRANS: + case SEGMENT: + case CREATION: + case IMMEDIATE: + case DEFERRED: + case STORAGE: + case NEXT: + case MINEXTENTS: + case MAXEXTENTS: + case MAXSIZE: + case PCTINCREASE: + case FLASH_CACHE: + case CELL_FLASH_CACHE: + case KEEP: + case NONE: + case LOB: + case STORE: + case ROW: + case CHUNK: + case CACHE: + case NOCACHE: + case LOGGING: + case NOCOMPRESS: + case KEEP_DUPLICATES: + case EXCEPTIONS: + case PURGE: + case INITIALLY: + case END: + case COMMENT: + case ENABLE: + case DISABLE: + case SEQUENCE: + case USER: + case ANALYZE: + case OPTIMIZE: + case GRANT: + identName = lexer.stringVal(); + lexer.nextToken(); + break; + default: + throw new ParserException("error " + lexer.token()); + } } SQLName name = new SQLIdentifierExpr(identName); @@ -1382,6 +1427,13 @@ public class SQLExprParser extends SQLParser { column.getConstaints().add(check); return parseColumnRest(column); } + + if (lexer.token == Token.DEFAULT) { + lexer.nextToken(); + SQLExpr expr = this.expr(); + column.setDefaultExpr(expr); + return parseColumnRest(column); + } throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/PSCacheTest5.java b/src/test/java/com/alibaba/druid/bvt/pool/PSCacheTest5.java new file mode 100644 index 0000000000..91c5d1219a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/PSCacheTest5.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.Assert; + +import junit.framework.TestCase; + +import com.alibaba.druid.mock.MockPreparedStatement; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcUtils; + +public class PSCacheTest5 extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:x1"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(10); + } + + protected void tearDown() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_0() throws Exception { + MockPreparedStatement mockStmt = null; + { + Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement("select 1"); + mockStmt = ps.unwrap(MockPreparedStatement.class); + ps.execute(); + conn.close(); + } + for (int i = 0; i < 1000; ++i) { + Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement("select 1"); + + Assert.assertSame(mockStmt, ps.unwrap(MockPreparedStatement.class)); + + ps.execute(); + ps.close(); + conn.close(); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_3.java new file mode 100644 index 0000000000..9bce87945c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_3.java @@ -0,0 +1,84 @@ +/* + * Copyright 1999-2011 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.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateTableTest_3 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE dbo.cwd_directory (" // + + "ID NUMERIC NOT NULL, directory_name NVARCHAR(255), "// + + "lower_directory_name NVARCHAR(255), created_date DATETIME, " // + + "updated_date DATETIME, active int, description NVARCHAR(255), " // + + "impl_class NVARCHAR(255), lower_impl_class NVARCHAR(255), " // + + "directory_type NVARCHAR(60), directory_position NUMERIC, "// + + "CONSTRAINT PK_cwd_directory PRIMARY KEY (ID))"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("CREATE TABLE dbo.cwd_directory (" // + + "\n\tID NUMERIC NOT NULL,"// + + "\n\tdirectory_name NVARCHAR(255),"// + + "\n\tlower_directory_name NVARCHAR(255),"// + + "\n\tcreated_date DATETIME,"// + + "\n\tupdated_date DATETIME,"// + + "\n\tactive int,"// + + "\n\tdescription NVARCHAR(255),"// + + "\n\timpl_class NVARCHAR(255),"// + + "\n\tlower_impl_class NVARCHAR(255),"// + + "\n\tdirectory_type NVARCHAR(60),"// + + "\n\tdirectory_position NUMERIC,"// + + "\n\tCONSTRAINT PK_cwd_directory PRIMARY KEY (ID)"// + + "\n)", output); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(12, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dbo.cwd_directory"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.cwd_directory", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.cwd_directory", "directory_name"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.cwd_directory", "lower_directory_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_4.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_4.java new file mode 100644 index 0000000000..c1c7f4148f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_4.java @@ -0,0 +1,79 @@ +/* + * Copyright 1999-2011 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.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateTableTest_4 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE dbo.customfieldoption (" // + + "ID NUMERIC NOT NULL, CUSTOMFIELD NUMERIC, CUSTOMFIELDCONFIG NUMERIC, "// + + "PARENTOPTIONID NUMERIC, SEQUENCE NUMERIC, customvalue NVARCHAR(255), "// + + "optiontype NVARCHAR(60), disabled NVARCHAR(60), "// + + "CONSTRAINT PK_customfieldoption PRIMARY KEY (ID))"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("CREATE TABLE dbo.customfieldoption (" // + + "\n\tID NUMERIC NOT NULL,"// + + "\n\tCUSTOMFIELD NUMERIC,"// + + "\n\tCUSTOMFIELDCONFIG NUMERIC,"// + + "\n\tPARENTOPTIONID NUMERIC,"// + + "\n\tSEQUENCE NUMERIC,"// + + "\n\tcustomvalue NVARCHAR(255),"// + + "\n\toptiontype NVARCHAR(60),"// + + "\n\tdisabled NVARCHAR(60),"// + + "\n\tCONSTRAINT PK_customfieldoption PRIMARY KEY (ID)"// + + "\n)", output); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dbo.customfieldoption"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.customfieldoption", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.customfieldoption", "CUSTOMFIELD"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.customfieldoption", "CUSTOMFIELDCONFIG"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_5.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_5.java new file mode 100644 index 0000000000..d8f17db649 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_5.java @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2011 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.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateTableTest_5 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE dbo.AO_563AEE_ACTOR_ENTITY (" // + + " FULL_NAME VARCHAR(255),"// + + " ID INTEGER IDENTITY(1,1) NOT NULL,"// + + " PROFILE_PAGE_URI VARCHAR(767),"// + + " PROFILE_PICTURE_URI VARCHAR(767),"// + + " USERNAME VARCHAR(255),"// + + ")"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("CREATE TABLE dbo.AO_563AEE_ACTOR_ENTITY (" // + + "\n\tFULL_NAME VARCHAR(255),"// + + "\n\tID INTEGER DEFAULT NULL IDENTITY (1, 1),"// + + "\n\tPROFILE_PAGE_URI VARCHAR(767),"// + + "\n\tPROFILE_PICTURE_URI VARCHAR(767),"// + + "\n\tUSERNAME VARCHAR(255)"// + + "\n)", output); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dbo.AO_563AEE_ACTOR_ENTITY"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_563AEE_ACTOR_ENTITY", "FULL_NAME"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_563AEE_ACTOR_ENTITY", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_563AEE_ACTOR_ENTITY", "USERNAME"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_6.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_6.java new file mode 100644 index 0000000000..bd2e919a36 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_6.java @@ -0,0 +1,95 @@ +/* + * Copyright 1999-2011 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.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateTableTest_6 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE dbo.AO_E8B6CC_ISSUE_MAPPING_V2 (" // + + " AUTHOR VARCHAR(255),"// + + " BRANCH VARCHAR(255),"// + + " \"DATE\" DATETIME,"// + + " FILES_DATA NTEXT,"// + + " ID INTEGER IDENTITY(1,1) NOT NULL,"// + + " ISSUE_ID VARCHAR(255),"// + + " MESSAGE NTEXT,"// + + " NODE VARCHAR(255),"// + + " PARENTS_DATA VARCHAR(255),"// + + " RAW_AUTHOR VARCHAR(255),"// + + " RAW_NODE VARCHAR(255),"// + + " REPOSITORY_ID INTEGER CONSTRAINT df_AO_E8B6CC_ISSUE_MAPPING_V2_REPOSITORY_ID DEFAULT 0,"// + + " VERSION INTEGER,"// + + "CONSTRAINT pk_AO_E8B6CC_ISSUE_MAPPING_V2_ID PRIMARY KEY(ID)"// + + ")"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("CREATE TABLE dbo.AO_E8B6CC_ISSUE_MAPPING_V2 (" // + + "\n\tAUTHOR VARCHAR(255),"// + + "\n\tBRANCH VARCHAR(255),"// + + "\n\t\"DATE\" DATETIME,"// + + "\n\tFILES_DATA NTEXT,"// + + "\n\tID INTEGER DEFAULT NULL IDENTITY (1, 1),"// + + "\n\tISSUE_ID VARCHAR(255),"// + + "\n\tMESSAGE NTEXT,"// + + "\n\tNODE VARCHAR(255),"// + + "\n\tPARENTS_DATA VARCHAR(255),"// + + "\n\tRAW_AUTHOR VARCHAR(255),"// + + "\n\tRAW_NODE VARCHAR(255),"// + + "\n\tREPOSITORY_ID INTEGER DEFAULT 0,"// + + "\n\tVERSION INTEGER,"// + + "\n\tCONSTRAINT pk_AO_E8B6CC_ISSUE_MAPPING_V2_ID PRIMARY KEY (ID)"// + + "\n)", output); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(14, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dbo.AO_E8B6CC_ISSUE_MAPPING_V2"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_E8B6CC_ISSUE_MAPPING_V2", "AUTHOR"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_E8B6CC_ISSUE_MAPPING_V2", "BRANCH"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("dbo.AO_E8B6CC_ISSUE_MAPPING_V2", "VERSION"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest4.java new file mode 100644 index 0000000000..7cd85d6f2b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest4.java @@ -0,0 +1,41 @@ +/* + * Copyright 1999-2011 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.sqlserver; + +import org.junit.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.test.TestUtils; + +public class SQLServerInsertTest4 extends TestCase { + + public void test_isEmpty() throws Exception { + String sql = "INSERT INTO dbo.AO_B9A0F0_APPLIED_TEMPLATE DEFAULT VALUES"; + + String expect = "INSERT INTO dbo.AO_B9A0F0_APPLIED_TEMPLATE DEFAULT VALUES"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + + String text = TestUtils.outputSqlServer(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } +}