This commit is contained in:
温少
2012-05-16 14:56:56 +08:00
parent 30457a8c06
commit 2b2b4a5873
9 changed files with 228 additions and 35 deletions
@@ -0,0 +1,7 @@
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.ast.SQLObject;
public interface SQLAlterTableItem extends SQLObject {
}
@@ -0,0 +1,31 @@
package com.alibaba.druid.sql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
public class SQLAlterTableStatement extends SQLStatementImpl {
private static final long serialVersionUID = 1L;
private SQLExprTableSource tableSource;
private List<SQLAlterTableItem> items = new ArrayList<SQLAlterTableItem>();
public List<SQLAlterTableItem> getItems() {
return items;
}
public void setItems(List<SQLAlterTableItem> items) {
this.items = items;
}
public SQLExprTableSource getTableSource() {
return tableSource;
}
public void setTableSource(SQLExprTableSource tableSource) {
this.tableSource = tableSource;
}
}
@@ -0,0 +1,8 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
public class MySqlAlterTableStatement extends MySqlStatementImpl {
private static final long serialVersionUID = 1L;
}
@@ -1785,4 +1785,9 @@ public class MySqlStatementParser extends SQLStatementParser {
return null;
}
public SQLSetStatement parseAlter() {
accept(Token.ALTER);
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
}
@@ -1,8 +1,9 @@
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
public abstract class OracleAlterTableItem extends OracleSQLObjectImpl {
public abstract class OracleAlterTableItem extends OracleSQLObjectImpl implements SQLAlterTableItem {
private static final long serialVersionUID = 1L;
@@ -1,26 +1,27 @@
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleAlterTableStatement extends OracleStatementImpl {
public class OracleAlterTableStatement extends SQLAlterTableStatement implements OracleStatement {
private static final long serialVersionUID = 1L;
private SQLExprTableSource tableSource;
private List<OracleAlterTableItem> items = new ArrayList<OracleAlterTableItem>();
private static final long serialVersionUID = 1L;
private boolean updateGlobalIndexes = false;
private boolean invalidateGlobalIndexes = false;
private boolean updateGlobalIndexes = false;
private boolean invalidateGlobalIndexes = false;
protected void accept0(SQLASTVisitor visitor) {
accept0((OracleASTVisitor) visitor);
}
@Override
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, tableSource);
acceptChild(visitor, items);
acceptChild(visitor, getTableSource());
acceptChild(visitor, getItems());
}
visitor.endVisit(this);
}
@@ -42,30 +43,13 @@ public class OracleAlterTableStatement extends OracleStatementImpl {
}
public SQLName getName() {
if (tableSource == null) {
if (getTableSource() == null) {
return null;
}
return (SQLName) tableSource.getExpr();
return (SQLName) getTableSource().getExpr();
}
public void setName(SQLName name) {
this.setTableSource(new SQLExprTableSource(name));
}
public SQLExprTableSource getTableSource() {
return tableSource;
}
public void setTableSource(SQLExprTableSource tableSource) {
this.tableSource = tableSource;
}
public List<OracleAlterTableItem> getItems() {
return items;
}
public void setItems(List<OracleAlterTableItem> items) {
this.items = items;
}
}
@@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
@@ -90,7 +91,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
@@ -2045,7 +2045,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print("ALTER TABLE ");
x.getName().accept(this);
incrementIndent();
for (OracleAlterTableItem item : x.getItems()) {
for (SQLAlterTableItem item : x.getItems()) {
println();
item.accept(this);
}
@@ -109,7 +109,8 @@ public class SQLStatementParser extends SQLParser {
}
if (lexer.token() == Token.ALTER) {
throw new ParserException("TODO");
statementList.add(parseAlter());
continue;
}
if (lexer.token() == Token.DROP) {
@@ -162,6 +163,11 @@ public class SQLStatementParser extends SQLParser {
stmt.setDatabase(this.exprParser.name());
return stmt;
}
public SQLSetStatement parseAlter() {
accept(Token.ALTER);
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
}
protected SQLDropTableStatement parseDropTable(boolean acceptDrop) {
if (acceptDrop) {
@@ -185,7 +191,9 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseTruncate() {
accept(Token.TRUNCATE);
accept(Token.TABLE);
if (lexer.token() == Token.TABLE) {
lexer.nextToken();
}
SQLTruncateStatement stmt = new SQLTruncateStatement();
for (;;) {
@@ -0,0 +1,149 @@
/**
* (created at 2011-7-18)
*/
package com.alibaba.druid.bvt.sql.cobar;
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.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.parser.Token;
/**
* @author <a href="mailto:danping.yudp@alibaba-inc.com">YU Danping</a>
*/
public class DDLParserTest extends TestCase {
public void testTruncate() throws Exception {
String sql = "Truncate table tb1";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("TRUNCATE TABLE tb1", output);
}
public void testTruncate_1() throws Exception {
String sql = "Truncate tb1";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("TRUNCATE TABLE tb1", output);
}
public void testAlterTable0() throws Exception {
String sql = "alTer ignore table tb_name";
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("ALTER ignore table tb_name", output);
}
// public void testDDLStmt() throws Exception {
// String sql = "alTer ignore table tb_name";
// SQLLexer lexer = new SQLLexer(sql);
// DDLParser parser = new DDLParser(lexer, new SQLExprParser(lexer));
// DDLStatement dst = parser.ddlStmt();
//
// sql = "alTeR table tb_name";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate temporary tabLe if not exists tb_name";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate tabLe if not exists tb_name";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate temporary tabLe tb_name";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate unique index index_name on tb(col(id)) desc";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate fulltext index index_name on tb(col(id))";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate spatial index index_name on tb(col(id))";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "crEate index index_name using hash on tb(col(id))";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
//
// sql = "drop index index_name on tb1";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// String output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP INDEX index_name ON tb1", output);
//
// sql = "drop temporary tabLe if exists tb1,tb2,tb3 restrict";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP TEMPORARY TABLE IF EXISTS tb1, tb2, tb3 RESTRICT", output);
//
// sql = "drop temporary tabLe if exists tb1,tb2,tb3 cascade";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP TEMPORARY TABLE IF EXISTS tb1, tb2, tb3 CASCADE", output);
//
// sql = "drop temporary tabLe if exists tb1 cascade";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP TEMPORARY TABLE IF EXISTS tb1 CASCADE", output);
//
// sql = "drop tabLe if exists tb1 cascade";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP TABLE IF EXISTS tb1 CASCADE", output);
//
// sql = "drop temporary tabLe tb1 cascade";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("DROP TEMPORARY TABLE tb1 CASCADE", output);
//
// sql = "rename table tb1 to ntb1,tb2 to ntb2";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("RENAME TABLE tb1 TO ntb1, tb2 TO ntb2", output);
//
// sql = "rename table tb1 to ntb1";
// lexer = new SQLLexer(sql);
// parser = new DDLParser(lexer, new SQLExprParser(lexer));
// dst = parser.ddlStmt();
// output = output2MySQL(dst, sql);
// Assert.assertEquals("RENAME TABLE tb1 TO ntb1", output);
// }
}