support sql ast object toString

This commit is contained in:
wenshao
2014-10-26 18:22:07 +08:00
parent 5df5c89405
commit 520da83034
60 changed files with 436 additions and 79 deletions
@@ -20,12 +20,26 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public abstract class SQLStatementImpl extends SQLObjectImpl implements SQLStatement {
private String dbType;
public SQLStatementImpl(){
}
public SQLStatementImpl(String dbType){
this.dbType = dbType;
}
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
public String toString() {
return SQLUtils.toSQLString(this);
return SQLUtils.toSQLString(this, dbType);
}
@Override
@@ -26,6 +26,14 @@ public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLSt
private SQLExprTableSource tableSource;
private List<SQLAlterTableItem> items = new ArrayList<SQLAlterTableItem>();
public SQLAlterTableStatement() {
}
public SQLAlterTableStatement(String dbType) {
super (dbType);
}
public List<SQLAlterTableItem> getItems() {
return items;
@@ -33,6 +33,14 @@ public class SQLCallStatement extends SQLStatementImpl {
private SQLName procedureName;
private final List<SQLExpr> parameters = new ArrayList<SQLExpr>();
public SQLCallStatement() {
}
public SQLCallStatement(String dbType) {
super (dbType);
}
public SQLVariantRefExpr getOutParameter() {
return outParameter;
@@ -33,6 +33,10 @@ public class SQLCreateDatabaseStatement extends SQLStatementImpl {
public SQLCreateDatabaseStatement(){
}
public SQLCreateDatabaseStatement(String dbType){
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -35,6 +35,10 @@ public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLDDLS
public SQLCreateIndexStatement(){
}
public SQLCreateIndexStatement(String dbType){
super (dbType);
}
public SQLTableSource getTable() {
return table;
@@ -33,6 +33,10 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS
public SQLCreateTableStatement(){
}
public SQLCreateTableStatement(String dbType){
super (dbType);
}
public SQLName getName() {
if (tableSource == null) {
@@ -37,6 +37,14 @@ public class SQLCreateTriggerStatement extends SQLStatementImpl {
private boolean forEachRow = false;
private SQLStatement body;
public SQLCreateTriggerStatement() {
}
public SQLCreateTriggerStatement(String dbType) {
super (dbType);
}
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
@@ -36,6 +36,10 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt
public SQLCreateViewStatement(){
}
public SQLCreateViewStatement(String dbType){
super (dbType);
}
public boolean isOrReplace() {
return orReplace;
@@ -29,6 +29,10 @@ public class SQLDeleteStatement extends SQLStatementImpl {
public SQLDeleteStatement(){
}
public SQLDeleteStatement(String dbType){
super (dbType);
}
public SQLTableSource getTableSource() {
return tableSource;
@@ -23,6 +23,14 @@ public class SQLDropDatabaseStatement extends SQLStatementImpl implements SQLDDL
private SQLExpr database;
private boolean ifExists;
public SQLDropDatabaseStatement() {
}
public SQLDropDatabaseStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -23,6 +23,14 @@ public class SQLDropFunctionStatement extends SQLStatementImpl implements SQLDDL
private SQLName name;
private boolean ifExists;
public SQLDropFunctionStatement() {
}
public SQLDropFunctionStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -23,6 +23,14 @@ public class SQLDropIndexStatement extends SQLStatementImpl implements SQLDDLSta
private SQLExpr indexName;
private SQLExprTableSource tableName;
public SQLDropIndexStatement() {
}
public SQLDropIndexStatement(String dbType) {
super (dbType);
}
public SQLExpr getIndexName() {
return indexName;
@@ -23,6 +23,14 @@ public class SQLDropProcedureStatement extends SQLStatementImpl implements SQLDD
private SQLName name;
private boolean ifExists;
public SQLDropProcedureStatement() {
}
public SQLDropProcedureStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -22,6 +22,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDDLStatement {
private SQLName name;
public SQLDropSequenceStatement() {
}
public SQLDropSequenceStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -23,6 +23,14 @@ public class SQLDropTableSpaceStatement extends SQLStatementImpl implements SQLD
private SQLName name;
private boolean ifExists;
public SQLDropTableSpaceStatement() {
}
public SQLDropTableSpaceStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -36,12 +36,25 @@ public class SQLDropTableStatement extends SQLStatementImpl implements SQLDDLSta
public SQLDropTableStatement(){
}
public SQLDropTableStatement(SQLName name){
this(new SQLExprTableSource(name));
public SQLDropTableStatement(String dbType){
super (dbType);
}
public SQLDropTableStatement(SQLName name, String dbType){
this(new SQLExprTableSource(name), dbType);
}
public SQLDropTableStatement(SQLName name){
this (name, null);
}
public SQLDropTableStatement(SQLExprTableSource tableSource){
this (tableSource, null);
}
public SQLDropTableStatement(SQLExprTableSource tableSource, String dbType){
this (dbType);
this.tableSources.add(tableSource);
}
@@ -22,6 +22,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDDLStatement {
private SQLName name;
public SQLDropTriggerStatement() {
}
public SQLDropTriggerStatement(String dbType) {
super (dbType);
}
public SQLName getName() {
return name;
@@ -25,6 +25,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLDropUserStatement extends SQLStatementImpl implements SQLDDLStatement {
private List<SQLExpr> users = new ArrayList<SQLExpr>(2);
public SQLDropUserStatement() {
}
public SQLDropUserStatement(String dbType) {
super (dbType);
}
public List<SQLExpr> getUsers() {
return users;
@@ -33,6 +33,10 @@ public class SQLDropViewStatement extends SQLStatementImpl implements SQLDDLStat
public SQLDropViewStatement(){
}
public SQLDropViewStatement(String dbType){
super (dbType);
}
public SQLDropViewStatement(SQLName name){
this(new SQLExprTableSource(name));
@@ -27,6 +27,14 @@ public class SQLExplainStatement extends SQLStatementImpl {
protected SQLStatement statement;
private List<SQLCommentHint> hints;
public SQLExplainStatement() {
}
public SQLExplainStatement(String dbType) {
super (dbType);
}
public SQLStatement getStatement() {
return statement;
@@ -28,6 +28,14 @@ public class SQLGrantStatement extends SQLStatementImpl {
private SQLExpr on;
private SQLExpr to;
public SQLGrantStatement() {
}
public SQLGrantStatement(String dbType) {
super (dbType);
}
// mysql
private ObjectType objectType;
@@ -22,6 +22,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLReleaseSavePointStatement extends SQLStatementImpl {
private SQLExpr name;
public SQLReleaseSavePointStatement() {
}
public SQLReleaseSavePointStatement(String dbType) {
super (dbType);
}
public SQLExpr getName() {
return name;
@@ -22,6 +22,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLRollbackStatement extends SQLStatementImpl {
private SQLName to;
public SQLRollbackStatement() {
}
public SQLRollbackStatement(String dbType) {
super (dbType);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -22,6 +22,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLSavePointStatement extends SQLStatementImpl {
private SQLExpr name;
public SQLSavePointStatement() {
}
public SQLSavePointStatement(String dbType) {
super (dbType);
}
public SQLExpr getName() {
return name;
@@ -26,10 +26,19 @@ public class SQLSelectStatement extends SQLStatementImpl {
}
public SQLSelectStatement(String dbType){
super (dbType);
}
public SQLSelectStatement(SQLSelect select){
this.setSelect(select);
}
public SQLSelectStatement(SQLSelect select, String dbType){
this(dbType);
this.setSelect(select);
}
public SQLSelect getSelect() {
return this.select;
}
@@ -31,8 +31,17 @@ public class SQLSetStatement extends SQLStatementImpl {
public SQLSetStatement(){
}
public SQLSetStatement(String dbType){
super (dbType);
}
public SQLSetStatement(SQLExpr target, SQLExpr value){
this(target, value, null);
}
public SQLSetStatement(SQLExpr target, SQLExpr value, String dbType){
super (dbType);
this.items.add(new SQLAssignItem(target, value));
}
@@ -31,6 +31,14 @@ public class SQLTruncateStatement extends SQLStatementImpl {
private boolean only;
private Boolean restartIdentity;
private Boolean cascade;
public SQLTruncateStatement() {
}
public SQLTruncateStatement(String dbType) {
super (dbType);
}
public List<SQLExprTableSource> getTableSources() {
return tableSources;
@@ -33,6 +33,10 @@ public class SQLUpdateStatement extends SQLStatementImpl {
public SQLUpdateStatement(){
}
public SQLUpdateStatement(String dbType){
super (dbType);
}
public SQLTableSource getTableSource() {
return tableSource;
@@ -23,6 +23,14 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLUseStatement extends SQLStatementImpl implements SQLStatement {
private SQLName database;
public SQLUseStatement() {
}
public SQLUseStatement(String dbType) {
super (dbType);
}
public SQLName getDatabase() {
return database;
@@ -18,8 +18,14 @@ package com.alibaba.druid.sql.dialect.db2.ast;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public abstract class DB2StatementImpl extends SQLStatementImpl implements DB2Object {
public DB2StatementImpl() {
super(JdbcConstants.DB2);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof DB2ASTVisitor) {
@@ -18,10 +18,15 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlAlterTableStatement extends SQLAlterTableStatement {
private boolean ignore = false;
public MySqlAlterTableStatement() {
super (JdbcConstants.MYSQL);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -18,10 +18,15 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlCreateIndexStatement extends SQLCreateIndexStatement implements MySqlStatement {
private String using;
public MySqlCreateIndexStatement() {
super (JdbcConstants.MYSQL);
}
public String getUsing() {
return using;
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlCreateTableStatement extends SQLCreateTableStatement implements MySqlStatement {
@@ -47,7 +48,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
private SQLExprTableSource like;
public MySqlCreateTableStatement(){
super (JdbcConstants.MYSQL);
}
public SQLExprTableSource getLike() {
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.L
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlDeleteStatement extends SQLDeleteStatement {
@@ -33,6 +34,10 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
private SQLTableSource using;
private SQLOrderBy orderBy;
private Limit limit;
public MySqlDeleteStatement() {
super (JdbcConstants.MYSQL);
}
public boolean isLowPriority() {
return lowPriority;
@@ -19,6 +19,7 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlRollbackStatement extends SQLRollbackStatement implements MySqlStatement {
@@ -28,7 +29,7 @@ public class MySqlRollbackStatement extends SQLRollbackStatement implements MySq
private SQLExpr force;
public MySqlRollbackStatement(){
super (JdbcConstants.MYSQL);
}
public Boolean getChain() {
@@ -18,9 +18,14 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public abstract class MySqlStatementImpl extends SQLStatementImpl implements MySqlStatement {
public MySqlStatementImpl() {
super(JdbcConstants.MYSQL);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof MySqlASTVisitor) {
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlStatement {
@@ -28,6 +29,10 @@ public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlSta
private boolean lowPriority = false;
private boolean ignore = false;
public MySqlUpdateStatement() {
super (JdbcConstants.MYSQL);
}
public Limit getLimit() {
return limit;
@@ -147,6 +147,7 @@ import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlStatementParser extends SQLStatementParser {
@@ -191,7 +192,7 @@ public class MySqlStatementParser extends SQLStatementParser {
public SQLSelectStatement parseSelect() {
MySqlSelectParser selectParser = new MySqlSelectParser(this.exprParser);
return new SQLSelectStatement(selectParser.select());
return new SQLSelectStatement(selectParser.select(), JdbcConstants.MYSQL);
}
public SQLUpdateStatement parseUpdateStatement() {
@@ -2131,7 +2132,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
return stmt;
} else {
SQLSetStatement stmt = new SQLSetStatement();
SQLSetStatement stmt = new SQLSetStatement(getDbType());
parseAssignItems(stmt.getItems(), stmt);
@@ -2536,7 +2537,7 @@ public class MySqlStatementParser extends SQLStatementParser {
accept(Token.DATABASE);
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement();
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(JdbcConstants.MYSQL);
stmt.setName(this.exprParser.name());
if (lexer.token() == Token.DEFAULT) {
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsCreateTableStatement extends SQLCreateTableStatement {
@@ -35,6 +36,10 @@ public class OdpsCreateTableStatement extends SQLCreateTableStatement {
protected List<SQLColumnDefinition> partitionColumns = new ArrayList<SQLColumnDefinition>(2);
protected SQLExpr lifecycle;
public OdpsCreateTableStatement() {
super (JdbcConstants.ODPS);
}
public SQLExprTableSource getLike() {
return like;
@@ -23,12 +23,17 @@ import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsInsertStatement extends SQLStatementImpl implements SQLStatement {
private SQLSubqueryTableSource from;
private List<OdpsInsert> items = new ArrayList<OdpsInsert>();
public OdpsInsertStatement() {
super (JdbcConstants.ODPS);
}
public void setFrom(SQLSubqueryTableSource from) {
this.from = from;
@@ -5,10 +5,15 @@ import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsShowPartitionsStmt extends SQLStatementImpl implements SQLStatement {
private SQLExprTableSource tableSource;
public OdpsShowPartitionsStmt() {
super (JdbcConstants.ODPS);
}
public SQLExprTableSource getTableSource() {
return tableSource;
@@ -5,10 +5,15 @@ import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsShowStatisticStmt extends SQLStatementImpl implements SQLStatement {
private SQLExprTableSource tableSource;
public OdpsShowStatisticStmt() {
super (JdbcConstants.ODPS);
}
public SQLExprTableSource getTableSource() {
return tableSource;
@@ -18,11 +18,16 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleAlterTableStatement extends SQLAlterTableStatement implements OracleDDLStatement {
private boolean updateGlobalIndexes = false;
private boolean invalidateGlobalIndexes = false;
public OracleAlterTableStatement() {
super (JdbcConstants.ORACLE);
}
protected void accept0(SQLASTVisitor visitor) {
accept0((OracleASTVisitor) visitor);
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleCreateIndexStatement extends SQLCreateIndexStatement implements OracleDDLStatement {
@@ -41,6 +42,10 @@ public class OracleCreateIndexStatement extends SQLCreateIndexStatement implemen
private Boolean enable = null;
private boolean computeStatistics = false;
public OracleCreateIndexStatement() {
super (JdbcConstants.ORACLE);
}
public SQLName getTablespace() {
return tablespace;
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleCreateTableStatement extends SQLCreateTableStatement implements OracleDDLStatement {
@@ -58,6 +59,10 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen
private SQLPartitioningClause partitioning;
private DeferredSegmentCreation deferredSegmentCreation;
public OracleCreateTableStatement() {
super (JdbcConstants.ORACLE);
}
public OracleLobStorageClause getLobStorage() {
return lobStorage;
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleDeleteStatement extends SQLDeleteStatement {
@@ -32,7 +33,7 @@ public class OracleDeleteStatement extends SQLDeleteStatement {
private OracleReturningClause returning = null;
public OracleDeleteStatement(){
super (JdbcConstants.ORACLE);
}
public OracleReturningClause getReturning() {
@@ -21,11 +21,16 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleExplainStatement extends SQLExplainStatement implements OracleStatement {
private SQLCharExpr statementId;
private SQLExpr into;
public OracleExplainStatement() {
super (JdbcConstants.ORACLE);
}
@Override
public void accept0(OracleASTVisitor visitor) {
@@ -19,8 +19,13 @@ import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public abstract class OracleStatementImpl extends SQLStatementImpl implements OracleStatement {
public OracleStatementImpl() {
super(JdbcConstants.ORACLE);
}
protected void accept0(SQLASTVisitor visitor) {
accept0((OracleASTVisitor) visitor);
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OracleUpdateStatement extends SQLUpdateStatement implements OracleStatement {
@@ -35,7 +36,7 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS
private List<SQLExpr> returningInto = new ArrayList<SQLExpr>();
public OracleUpdateStatement(){
super (JdbcConstants.ORACLE);
}
public List<SQLExpr> getReturning() {
@@ -105,6 +105,7 @@ import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.util.JdbcConstants;
public class OracleStatementParser extends SQLStatementParser {
@@ -163,7 +164,8 @@ public class OracleStatementParser extends SQLStatementParser {
}
if (lexer.token() == (Token.SELECT)) {
statementList.add(new SQLSelectStatement(new OracleSelectParser(this.exprParser).select()));
SQLSelectStatement stmt = new SQLSelectStatement(new OracleSelectParser(this.exprParser).select(), JdbcConstants.ORACLE);
statementList.add(stmt);
continue;
}
@@ -238,7 +240,7 @@ public class OracleStatementParser extends SQLStatementParser {
if (variant instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) variant;
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) {
SQLSetStatement stmt = new SQLSetStatement(binaryOpExpr.getLeft(), binaryOpExpr.getRight());
SQLSetStatement stmt = new SQLSetStatement(binaryOpExpr.getLeft(), binaryOpExpr.getRight(), getDbType());
statementList.add(stmt);
continue;
}
@@ -246,7 +248,7 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.COLONEQ);
SQLExpr value = this.exprParser.expr();
SQLSetStatement stmt = new SQLSetStatement(variant, value);
SQLSetStatement stmt = new SQLSetStatement(variant, value, getDbType());
statementList.add(stmt);
continue;
}
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement {
@@ -31,6 +32,10 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem
private List<SQLName> using = new ArrayList<SQLName>(2);
private boolean returning;
private String alias;
public PGDeleteStatement() {
super (JdbcConstants.POSTGRESQL);
}
public boolean isReturning() {
return returning;
@@ -20,16 +20,18 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class PGSelectStatement extends SQLSelectStatement implements PGSQLStatement {
private PGWithClause with;
public PGSelectStatement(){
super(JdbcConstants.POSTGRESQL);
}
public PGSelectStatement(SQLSelect select){
super(select);
super(select, JdbcConstants.POSTGRESQL);
}
public PGWithClause getWith() {
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class PGUpdateStatement extends SQLUpdateStatement implements PGSQLStatement {
@@ -34,6 +35,10 @@ public class PGUpdateStatement extends SQLUpdateStatement implements PGSQLStatem
private List<SQLExpr> returning = new ArrayList<SQLExpr>(2);
private SQLTableSource from;
public PGUpdateStatement(){
super (JdbcConstants.POSTGRESQL);
}
public SQLTableSource getFrom() {
return from;
@@ -22,12 +22,17 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerStatement;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class SQLServerUpdateStatement extends SQLUpdateStatement implements SQLServerStatement {
private SQLServerTop top;
private SQLTableSource from;
private SQLServerOutput output;
public SQLServerUpdateStatement(){
super (JdbcConstants.SQL_SERVER);
}
public SQLServerTop getTop() {
return top;
@@ -355,7 +355,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
}
if (lexer.token() == Token.VARIANT) {
SQLSetStatement stmt = new SQLSetStatement();
SQLSetStatement stmt = new SQLSetStatement(getDbType());
parseAssignItems(stmt.getItems(), stmt);
return stmt;
} else {
@@ -115,6 +115,6 @@ public class SQLCreateTableParser extends SQLDDLParser {
}
protected SQLCreateTableStatement newCreateStatement() {
return new SQLCreateTableStatement();
return new SQLCreateTableStatement(getDbType());
}
}
@@ -87,10 +87,18 @@ public class SQLExprParser extends SQLParser {
public SQLExprParser(String sql){
super(sql);
}
public SQLExprParser(String sql, String dbType){
super(sql, dbType);
}
public SQLExprParser(Lexer lexer){
super(lexer);
}
public SQLExprParser(Lexer lexer, String dbType){
super(lexer, dbType);
}
public SQLExpr expr() {
if (lexer.token() == Token.STAR) {
@@ -19,19 +19,34 @@ public class SQLParser {
protected final Lexer lexer;
public SQLParser(String sql){
this(new Lexer(sql));
protected String dbType;
public SQLParser(String sql, String dbType){
this(new Lexer(sql), dbType);
this.lexer.nextToken();
}
public SQLParser(String sql){
this(sql, null);
}
public SQLParser(Lexer lexer){
this(lexer, null);
}
public SQLParser(Lexer lexer, String dbType){
this.lexer = lexer;
this.dbType = dbType;
}
public final Lexer getLexer() {
return lexer;
}
public String getDbType() {
return dbType;
}
protected boolean identifierEquals(String text) {
return lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase(text);
}
@@ -143,7 +158,7 @@ public class SQLParser {
alias += ('.' + lexer.token().name());
lexer.nextToken();
}
return alias;
}
@@ -169,7 +184,7 @@ public class SQLParser {
} else if (lexer.token() == Token.USER) {
alias = lexer.stringVal();
lexer.nextToken();
}
}
switch (lexer.token()) {
case KEY:
@@ -184,7 +199,7 @@ public class SQLParser {
return alias;
}
protected void printError(Token token){
protected void printError(Token token) {
String arround;
if (lexer.mark >= 0 && (lexer.text.length() > lexer.mark + 30)) {
if (lexer.mark - 5 > 0) {
@@ -202,7 +217,7 @@ public class SQLParser {
} else {
arround = lexer.text;
}
// throw new
// ParserException("syntax error, error arround:'"+arround+"',expect "
// + token + ", actual " + lexer.token() + " "
@@ -210,7 +225,7 @@ public class SQLParser {
throw new ParserException("syntax error, error in :'" + arround + "',expect " + token + ", actual "
+ lexer.token() + " " + lexer.stringVal());
}
public void accept(Token token) {
if (lexer.token() == token) {
lexer.nextToken();
@@ -223,7 +238,7 @@ public class SQLParser {
public void match(Token token) {
if (lexer.token() != token) {
throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " "
+ lexer.stringVal());
+ lexer.stringVal());
}
}
@@ -90,11 +90,15 @@ public class SQLStatementParser extends SQLParser {
protected int parseValuesSize = 3;
public SQLStatementParser(String sql){
this(new SQLExprParser(sql));
this(sql, null);
}
public SQLStatementParser(String sql, String dbType){
this(new SQLExprParser(sql, dbType));
}
public SQLStatementParser(SQLExprParser exprParser){
super(exprParser.getLexer());
super(exprParser.getLexer(), exprParser.getDbType());
this.exprParser = exprParser;
}
@@ -315,7 +319,7 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
}
SQLRollbackStatement stmt = new SQLRollbackStatement();
SQLRollbackStatement stmt = new SQLRollbackStatement(getDbType());
if (lexer.token() == Token.TO) {
lexer.nextToken();
@@ -339,14 +343,14 @@ public class SQLStatementParser extends SQLParser {
public SQLUseStatement parseUse() {
accept(Token.USE);
SQLUseStatement stmt = new SQLUseStatement();
SQLUseStatement stmt = new SQLUseStatement(getDbType());
stmt.setDatabase(this.exprParser.name());
return stmt;
}
public SQLGrantStatement parseGrant() {
accept(Token.GRANT);
SQLGrantStatement stmt = new SQLGrantStatement();
SQLGrantStatement stmt = new SQLGrantStatement(getDbType());
for (;;) {
String privilege = null;
@@ -619,7 +623,7 @@ public class SQLStatementParser extends SQLParser {
acceptIdentifier("OPTION");
stmt.setAdminOption(true);
}
if (lexer.token() == Token.IDENTIFIED) {
lexer.nextToken();
accept(Token.BY);
@@ -631,7 +635,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseSavePoint() {
acceptIdentifier("SAVEPOINT");
SQLSavePointStatement stmt = new SQLSavePointStatement();
SQLSavePointStatement stmt = new SQLSavePointStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -639,7 +643,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseReleaseSavePoint() {
acceptIdentifier("RELEASE");
acceptIdentifier("SAVEPOINT");
SQLReleaseSavePointStatement stmt = new SQLReleaseSavePointStatement();
SQLReleaseSavePointStatement stmt = new SQLReleaseSavePointStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -752,7 +756,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropTableStatement stmt = new SQLDropTableStatement();
SQLDropTableStatement stmt = new SQLDropTableStatement(getDbType());
if (identifierEquals("TEMPORARY")) {
lexer.nextToken();
@@ -816,7 +820,7 @@ public class SQLStatementParser extends SQLParser {
SQLName name = this.exprParser.name();
SQLDropSequenceStatement stmt = new SQLDropSequenceStatement();
SQLDropSequenceStatement stmt = new SQLDropSequenceStatement(getDbType());
stmt.setName(name);
return stmt;
}
@@ -830,7 +834,7 @@ public class SQLStatementParser extends SQLParser {
SQLName name = this.exprParser.name();
SQLDropTriggerStatement stmt = new SQLDropTriggerStatement();
SQLDropTriggerStatement stmt = new SQLDropTriggerStatement(getDbType());
stmt.setName(name);
return stmt;
}
@@ -840,7 +844,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropViewStatement stmt = new SQLDropViewStatement();
SQLDropViewStatement stmt = new SQLDropViewStatement(getDbType());
accept(Token.VIEW);
@@ -881,7 +885,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropDatabaseStatement stmt = new SQLDropDatabaseStatement();
SQLDropDatabaseStatement stmt = new SQLDropDatabaseStatement(getDbType());
accept(Token.DATABASE);
@@ -896,67 +900,67 @@ public class SQLStatementParser extends SQLParser {
return stmt;
}
protected SQLDropFunctionStatement parseDropFunction(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropFunctionStatement stmt = new SQLDropFunctionStatement();
SQLDropFunctionStatement stmt = new SQLDropFunctionStatement(getDbType());
accept(Token.FUNCTION);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
protected SQLDropTableSpaceStatement parseDropTablespace(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropTableSpaceStatement stmt = new SQLDropTableSpaceStatement();
SQLDropTableSpaceStatement stmt = new SQLDropTableSpaceStatement(getDbType());
accept(Token.TABLESPACE);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
protected SQLDropProcedureStatement parseDropProcedure(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropProcedureStatement stmt = new SQLDropProcedureStatement();
SQLDropProcedureStatement stmt = new SQLDropProcedureStatement(getDbType());
accept(Token.PROCEDURE);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
@@ -965,7 +969,7 @@ public class SQLStatementParser extends SQLParser {
if (lexer.token() == Token.TABLE) {
lexer.nextToken();
}
SQLTruncateStatement stmt = new SQLTruncateStatement();
SQLTruncateStatement stmt = new SQLTruncateStatement(getDbType());
if (lexer.token() == Token.ONLY) {
lexer.nextToken();
@@ -1090,7 +1094,7 @@ public class SQLStatementParser extends SQLParser {
public SQLDropUserStatement parseDropUser() {
accept(Token.USER);
SQLDropUserStatement stmt = new SQLDropUserStatement();
SQLDropUserStatement stmt = new SQLDropUserStatement(getDbType());
for (;;) {
SQLExpr expr = this.exprParser.expr();
stmt.getUsers().add(expr);
@@ -1106,7 +1110,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseDropIndex() {
accept(Token.INDEX);
SQLDropIndexStatement stmt = new SQLDropIndexStatement();
SQLDropIndexStatement stmt = new SQLDropIndexStatement(getDbType());
stmt.setIndexName(this.exprParser.name());
if (lexer.token() == Token.ON) {
@@ -1123,9 +1127,9 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
brace = true;
}
SQLCallStatement stmt = new SQLCallStatement();
SQLCallStatement stmt = new SQLCallStatement(getDbType());
if (lexer.token() == Token.QUES) {
lexer.nextToken();
accept(Token.EQ);
@@ -1134,7 +1138,6 @@ public class SQLStatementParser extends SQLParser {
acceptIdentifier("CALL");
stmt.setProcedureName(exprParser.name());
if (lexer.token() == Token.LPAREN) {
@@ -1153,7 +1156,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseSet() {
accept(Token.SET);
SQLSetStatement stmt = new SQLSetStatement();
SQLSetStatement stmt = new SQLSetStatement(getDbType());
parseAssignItems(stmt.getItems(), stmt);
@@ -1231,7 +1234,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseCreateTrigger() {
accept(Token.TRIGGER);
SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement();
SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement(getDbType());
stmt.setName(this.exprParser.name());
if (identifierEquals("BEFORE")) {
@@ -1293,7 +1296,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DATABASE);
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement();
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -1311,7 +1314,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.CREATE);
}
SQLCreateIndexStatement stmt = new SQLCreateIndexStatement();
SQLCreateIndexStatement stmt = new SQLCreateIndexStatement(getDbType());
if (lexer.token() == Token.UNIQUE) {
lexer.nextToken();
if (identifierEquals("CLUSTERED")) {
@@ -1415,11 +1418,11 @@ public class SQLStatementParser extends SQLParser {
}
protected SQLUpdateStatement createUpdateStatement() {
return new SQLUpdateStatement();
return new SQLUpdateStatement(getDbType());
}
public SQLDeleteStatement parseDeleteStatement() {
SQLDeleteStatement deleteStatement = new SQLDeleteStatement();
SQLDeleteStatement deleteStatement = new SQLDeleteStatement(getDbType());
if (lexer.token() == Token.DELETE) {
lexer.nextToken();
@@ -1452,7 +1455,7 @@ public class SQLStatementParser extends SQLParser {
}
public SQLCreateViewStatement parseCreateView() {
SQLCreateViewStatement createView = new SQLCreateViewStatement();
SQLCreateViewStatement createView = new SQLCreateViewStatement(getDbType());
if (lexer.token() == Token.CREATE) {
lexer.nextToken();
@@ -1534,10 +1537,10 @@ public class SQLStatementParser extends SQLParser {
if (lexer.token() == Token.FOR) {
lexer.nextToken();
}
SQLExplainStatement explain = new SQLExplainStatement();
if(lexer.token == Token.HINT) {
SQLExplainStatement explain = new SQLExplainStatement(getDbType());
if (lexer.token == Token.HINT) {
explain.setHints(this.exprParser.parseHints());
}
@@ -1579,7 +1582,6 @@ public class SQLStatementParser extends SQLParser {
return item;
}
public boolean isParseCompleteValues() {
return parseCompleteValues;
}
@@ -0,0 +1,15 @@
package com.alibaba.druid.bvt.bug;
import junit.framework.TestCase;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
public class Issue_685 extends TestCase {
public void test_for_issue() throws Exception {
OracleStatementParser parser = new OracleStatementParser("select upper(*) from aa order by now()");
SQLStatement st = parser.parseStatement();
st.toString();
}
}