mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
mysql parser refactor.
This commit is contained in:
+8
-6
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.mysql.ast.clause;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
@@ -25,23 +27,23 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
public class MySqlCursorDeclareStatement extends MySqlStatementImpl{
|
||||
|
||||
//cursor name
|
||||
private String cursorName;
|
||||
private SQLName cursorName;
|
||||
//select statement
|
||||
private SQLSelectStatement select;
|
||||
private SQLSelect select;
|
||||
|
||||
public String getCursorName() {
|
||||
public SQLName getCursorName() {
|
||||
return cursorName;
|
||||
}
|
||||
|
||||
public void setCursorName(String cursorName) {
|
||||
public void setCursorName(SQLName cursorName) {
|
||||
this.cursorName = cursorName;
|
||||
}
|
||||
|
||||
public SQLSelectStatement getSelect() {
|
||||
public SQLSelect getSelect() {
|
||||
return select;
|
||||
}
|
||||
|
||||
public void setSelect(SQLSelectStatement select) {
|
||||
public void setSelect(SQLSelect select) {
|
||||
if (select != null) {
|
||||
select.setParent(this);
|
||||
}
|
||||
|
||||
-2
@@ -43,12 +43,10 @@ public class MySqlDeclareStatement extends MySqlStatementImpl {
|
||||
|
||||
@Override
|
||||
public void accept0(MySqlASTVisitor visitor) {
|
||||
// TODO Auto-generated method stub
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, varList);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -26,12 +26,17 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
|
||||
|
||||
protected transient long userName_hash;
|
||||
|
||||
protected long hashCode64;
|
||||
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
|
||||
hashCode64 = 0;
|
||||
userName_hash = 0;
|
||||
}
|
||||
|
||||
public String getHost() {
|
||||
@@ -40,6 +45,9 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
|
||||
|
||||
public void setHost(String host) {
|
||||
this.host = host;
|
||||
|
||||
hashCode64 = 0;
|
||||
userName_hash = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -87,4 +95,16 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable {
|
||||
}
|
||||
return userName_hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long hashCode64() {
|
||||
if (hashCode64 == 0) {
|
||||
if (host != null) {
|
||||
hashCode64 = FNVUtils.fnv_64_lower(host, userName);
|
||||
} else {
|
||||
hashCode64 = name_hash_lower();
|
||||
}
|
||||
}
|
||||
return hashCode64;
|
||||
}
|
||||
}
|
||||
|
||||
+21
-14
@@ -48,7 +48,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
|
||||
|
||||
private List<SQLCommentHint> optionHints = new ArrayList<SQLCommentHint>();
|
||||
|
||||
private SQLExprTableSource like;
|
||||
|
||||
|
||||
private SQLName tableGroup;
|
||||
|
||||
@@ -56,20 +56,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
|
||||
super (JdbcConstants.MYSQL);
|
||||
}
|
||||
|
||||
public SQLExprTableSource getLike() {
|
||||
return like;
|
||||
}
|
||||
|
||||
public void setLike(SQLName like) {
|
||||
this.setLike(new SQLExprTableSource(like));
|
||||
}
|
||||
|
||||
public void setLike(SQLExprTableSource like) {
|
||||
if (like != null) {
|
||||
like.setParent(this);
|
||||
}
|
||||
this.like = like;
|
||||
}
|
||||
|
||||
public List<SQLCommentHint> getHints() {
|
||||
return hints;
|
||||
@@ -135,6 +122,9 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
}
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@@ -143,6 +133,9 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
|
||||
}
|
||||
|
||||
public void setStorage(SQLExpr storage) {
|
||||
if (storage != null) {
|
||||
storage.setParent(this);
|
||||
}
|
||||
this.storage = storage;
|
||||
}
|
||||
|
||||
@@ -155,6 +148,20 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public TableSpaceOption clone() {
|
||||
TableSpaceOption x = new TableSpaceOption();
|
||||
|
||||
if (name != null) {
|
||||
x.setName(name.clone());
|
||||
}
|
||||
|
||||
if (storage != null) {
|
||||
x.setStorage(storage.clone());
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public List<SQLCommentHint> getOptionHints() {
|
||||
|
||||
-9
@@ -34,7 +34,6 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
|
||||
private boolean quick = false;
|
||||
private boolean ignore = false;
|
||||
|
||||
private SQLTableSource using;
|
||||
private SQLOrderBy orderBy;
|
||||
private SQLLimit limit;
|
||||
|
||||
@@ -104,14 +103,6 @@ public class MySqlDeleteStatement extends SQLDeleteStatement {
|
||||
this.ignore = ignore;
|
||||
}
|
||||
|
||||
public SQLTableSource getUsing() {
|
||||
return using;
|
||||
}
|
||||
|
||||
public void setUsing(SQLTableSource using) {
|
||||
this.using = using;
|
||||
}
|
||||
|
||||
public SQLOrderBy getOrderBy() {
|
||||
return orderBy;
|
||||
}
|
||||
|
||||
+5
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
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 MySqlInsertStatement extends SQLInsertStatement {
|
||||
|
||||
@@ -34,6 +35,10 @@ public class MySqlInsertStatement extends SQLInsertStatement {
|
||||
|
||||
private final List<SQLExpr> duplicateKeyUpdate = new ArrayList<SQLExpr>();
|
||||
|
||||
public MySqlInsertStatement() {
|
||||
dbType = JdbcConstants.MYSQL;
|
||||
}
|
||||
|
||||
public void cloneTo(MySqlInsertStatement x) {
|
||||
super.cloneTo(x);
|
||||
x.lowPriority = lowPriority;
|
||||
|
||||
+5
@@ -18,12 +18,14 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.*;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
import oracle.sql.SQLUtil;
|
||||
|
||||
public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlObject {
|
||||
|
||||
@@ -256,4 +258,7 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return SQLUtils.toMySqlString(this);
|
||||
}
|
||||
}
|
||||
|
||||
-9
@@ -24,8 +24,6 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlStatement {
|
||||
|
||||
private SQLOrderBy orderBy;
|
||||
private SQLLimit limit;
|
||||
|
||||
private boolean lowPriority = false;
|
||||
@@ -121,12 +119,5 @@ public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlSta
|
||||
this.targetAffectRow = targetAffectRow;
|
||||
}
|
||||
|
||||
public SQLOrderBy getOrderBy() {
|
||||
return orderBy;
|
||||
}
|
||||
|
||||
public void setOrderBy(SQLOrderBy orderBy) {
|
||||
this.orderBy = orderBy;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -692,7 +692,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
statementList.add(this.parseWhile(label));
|
||||
} else if (lexer.token() == Token.BEGIN) {
|
||||
// parse begin-end statement with label
|
||||
statementList.add(this.parseBlock(label));
|
||||
SQLBlockStatement block = this.parseBlock(label);
|
||||
statementList.add(block);
|
||||
} else if (lexer.token() == Token.REPEAT) {
|
||||
// parse repeat statement with label
|
||||
statementList.add(this.parseRepeat(label));
|
||||
@@ -808,6 +809,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
public SQLBlockStatement parseBlock() {
|
||||
SQLBlockStatement block = new SQLBlockStatement();
|
||||
block.setDbType(dbType);
|
||||
|
||||
accept(Token.BEGIN);
|
||||
this.parseStatementList(block.getStatementList(), -1, block);
|
||||
@@ -1821,7 +1823,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
if (lexer.token() == Token.VALUES || lexer.identifierEquals("VALUE")) {
|
||||
lexer.nextToken();
|
||||
|
||||
parseValueClause(stmt.getValuesList(), 0);
|
||||
parseValueClause(stmt.getValuesList(), 0, stmt);
|
||||
} else if (lexer.token() == Token.SELECT) {
|
||||
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
|
||||
stmt.setQuery(queryExpr);
|
||||
@@ -2176,7 +2178,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.VALUES || lexer.identifierEquals("VALUE")) {
|
||||
lexer.nextTokenLParen();
|
||||
parseValueClause(insertStatement.getValuesList(), columnSize);
|
||||
parseValueClause(insertStatement.getValuesList(), columnSize, insertStatement);
|
||||
} else if (lexer.token() == Token.SET) {
|
||||
lexer.nextToken();
|
||||
|
||||
@@ -2225,7 +2227,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
return insertStatement;
|
||||
}
|
||||
|
||||
private void parseValueClause(List<ValuesClause> valueClauseList, int columnSize) {
|
||||
private void parseValueClause(List<ValuesClause> valueClauseList, int columnSize, SQLObject parent) {
|
||||
for (int i = 0; ; ++i) {
|
||||
int startPos = lexer.pos() - 1;
|
||||
|
||||
@@ -2281,6 +2283,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(valueExprList);
|
||||
values.setParent(parent);
|
||||
|
||||
if (lexer.isEnabled(SQLParserFeature.KeepInsertValueClauseOriginalString)) {
|
||||
int endPos = lexer.pos();
|
||||
@@ -4022,14 +4025,15 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
MySqlCursorDeclareStatement stmt = new MySqlCursorDeclareStatement();
|
||||
accept(Token.DECLARE);
|
||||
|
||||
stmt.setCursorName(exprParser.name().getSimpleName());
|
||||
stmt.setCursorName(exprParser.name());
|
||||
|
||||
accept(Token.CURSOR);
|
||||
|
||||
accept(Token.FOR);
|
||||
|
||||
SQLSelectStatement selelctStmt = (SQLSelectStatement) parseSelect();
|
||||
stmt.setSelect(selelctStmt);
|
||||
//SQLSelectStatement selelctStmt = (SQLSelectStatement) parseSelect();
|
||||
SQLSelect select = this.createSQLSelectParser().select();
|
||||
stmt.setSelect(select);
|
||||
|
||||
accept(Token.SEMI);
|
||||
|
||||
|
||||
@@ -3275,7 +3275,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
@Override
|
||||
public boolean visit(MySqlCursorDeclareStatement x) {
|
||||
print0(ucase ? "DECLARE " : "declare ");
|
||||
print0(x.getCursorName());
|
||||
printExpr(x.getCursorName());
|
||||
print0(ucase ? " CURSOR FOR" : " cursor for");
|
||||
this.indentCount++;
|
||||
println();
|
||||
|
||||
+21
-3
@@ -65,7 +65,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
}
|
||||
|
||||
public boolean visit(SQLSelectStatement x) {
|
||||
if (repository != null) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
@@ -82,7 +83,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
// DUAL
|
||||
public boolean visit(MySqlDeleteStatement x) {
|
||||
if (repository != null) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
@@ -122,6 +124,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlInsertStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
setAliasMap();
|
||||
@@ -289,6 +296,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlReplaceStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
setMode(x, Mode.Replace);
|
||||
|
||||
setAliasMap();
|
||||
@@ -466,6 +478,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlExplainStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
SQLName tableName = x.getTableName();
|
||||
if (tableName != null) {
|
||||
String table = tableName.toString();
|
||||
@@ -1033,7 +1050,8 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlCreateTableStatement x) {
|
||||
if (repository != null) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableSourceImpl;
|
||||
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
import com.alibaba.druid.util.FNVUtils;
|
||||
|
||||
public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
|
||||
|
||||
@@ -52,6 +53,9 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
|
||||
}
|
||||
|
||||
public void setTableSource(SQLTableSource tableSource) {
|
||||
if (tableSource != null) {
|
||||
tableSource.setParent(this);
|
||||
}
|
||||
this.tableSource = tableSource;
|
||||
}
|
||||
|
||||
@@ -60,6 +64,9 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
|
||||
}
|
||||
|
||||
public void setMethod(SQLMethodInvokeExpr method) {
|
||||
if (method != null) {
|
||||
method.setParent(this);
|
||||
}
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
@@ -71,4 +78,35 @@ public class OdpsLateralViewTableSource extends SQLTableSourceImpl {
|
||||
this.columns = columns;
|
||||
}
|
||||
|
||||
public SQLTableSource findTableSource(long alias_hash) {
|
||||
long hash = this.alias_hash();
|
||||
if (hash != 0 && hash == alias_hash) {
|
||||
return this;
|
||||
}
|
||||
|
||||
for (SQLName column : columns) {
|
||||
if (column.name_hash_lower() == alias_hash) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
if (tableSource != null) {
|
||||
return tableSource.findTableSource(alias_hash);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public SQLTableSource findTableSourceWithColumn(long columnNameHash) {
|
||||
for (SQLName column : columns) {
|
||||
if (column.name_hash_lower() == columnNameHash) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
if (tableSource != null) {
|
||||
return tableSource.findTableSourceWithColumn(columnNameHash);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,10 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
|
||||
|
||||
@Override
|
||||
public boolean visit(OdpsInsertStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,4 +145,10 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr
|
||||
}
|
||||
return dbLink_hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long hashCode64() {
|
||||
// TODO hashCode64
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class OracleInsertStatement extends SQLInsertStatement implements OracleStatement {
|
||||
|
||||
@@ -32,6 +33,10 @@ public class OracleInsertStatement extends SQLInsertStatement implements OracleS
|
||||
private SQLErrorLoggingClause errorLogging;
|
||||
private List<SQLHint> hints = new ArrayList<SQLHint>();
|
||||
|
||||
public OracleInsertStatement() {
|
||||
dbType = JdbcConstants.ORACLE;
|
||||
}
|
||||
|
||||
public void cloneTo(OracleInsertStatement x) {
|
||||
super.cloneTo(x);
|
||||
if (returning != null) {
|
||||
|
||||
+1
-16
@@ -37,7 +37,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
|
||||
|
||||
private ModelClause modelClause;
|
||||
|
||||
private List<SQLExpr> forUpdateOf;
|
||||
|
||||
private boolean skipLocked = false;
|
||||
|
||||
public OracleSelectQueryBlock clone() {
|
||||
@@ -97,21 +97,6 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
|
||||
return hints.size();
|
||||
}
|
||||
|
||||
public List<SQLExpr> getForUpdateOf() {
|
||||
if (forUpdateOf == null) {
|
||||
forUpdateOf = new ArrayList<SQLExpr>(1);
|
||||
}
|
||||
return forUpdateOf;
|
||||
}
|
||||
|
||||
public int getForUpdateOfSize() {
|
||||
if (forUpdateOf == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return forUpdateOf.size();
|
||||
}
|
||||
|
||||
public boolean isSkipLocked() {
|
||||
return skipLocked;
|
||||
}
|
||||
|
||||
@@ -110,6 +110,8 @@ public class OracleLexer extends Lexer {
|
||||
map.put("FETCH", Token.FETCH);
|
||||
map.put("TABLESPACE", Token.TABLESPACE);
|
||||
map.put("PARTITION", Token.PARTITION);
|
||||
map.put("TRUE", Token.TRUE);
|
||||
map.put("FALSE", Token.FALSE);
|
||||
|
||||
map.put(",", Token.COMMA);
|
||||
map.put("(", Token.LPAREN);
|
||||
|
||||
@@ -74,14 +74,22 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
select.setQuery(query);
|
||||
|
||||
SQLOrderBy orderBy = this.parseOrderBy();
|
||||
select.setOrderBy(orderBy);
|
||||
|
||||
OracleSelectQueryBlock queryBlock = null;
|
||||
if (query instanceof SQLSelectQueryBlock) {
|
||||
queryBlock = (OracleSelectQueryBlock) query;
|
||||
|
||||
if (queryBlock.getOrderBy() == null) {
|
||||
queryBlock.setOrderBy(orderBy);
|
||||
} else {
|
||||
select.setOrderBy(orderBy);
|
||||
}
|
||||
|
||||
if (orderBy != null) {
|
||||
parseFetchClause(queryBlock);
|
||||
}
|
||||
} else {
|
||||
select.setOrderBy(orderBy);
|
||||
}
|
||||
|
||||
if (lexer.token() == (Token.FOR)) {
|
||||
@@ -114,8 +122,15 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
}
|
||||
}
|
||||
|
||||
if (select.getOrderBy() == null) {
|
||||
select.setOrderBy(this.exprParser.parseOrderBy());
|
||||
if (lexer.token() == Token.ORDER) {
|
||||
orderBy = this.exprParser.parseOrderBy();
|
||||
if (queryBlock != null && queryBlock.getOrderBy() == null) {
|
||||
queryBlock.setOrderBy(orderBy);
|
||||
} else if (select.getOrderBy() == null){
|
||||
select.setOrderBy(orderBy);
|
||||
} else {
|
||||
throw new ParserException("illegal state.");
|
||||
}
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.WITH) {
|
||||
|
||||
@@ -416,6 +416,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
x.getModelClause().accept(this);
|
||||
}
|
||||
|
||||
SQLOrderBy orderBy = x.getOrderBy();
|
||||
if (orderBy != null) {
|
||||
println();
|
||||
orderBy.accept(this);
|
||||
}
|
||||
|
||||
printFetchFirst(x);
|
||||
|
||||
if (x.isForUpdate()) {
|
||||
|
||||
+21
-7
@@ -63,6 +63,7 @@ import com.alibaba.druid.stat.TableStat;
|
||||
import com.alibaba.druid.stat.TableStat.Column;
|
||||
import com.alibaba.druid.stat.TableStat.Mode;
|
||||
import com.alibaba.druid.stat.TableStat.Relationship;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
|
||||
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
|
||||
@@ -72,18 +73,13 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public OracleSchemaStatVisitor(List<Object> parameters){
|
||||
super(parameters);
|
||||
super(JdbcConstants.ORACLE, parameters);
|
||||
this.variants.put("DUAL", null);
|
||||
this.variants.put("NOTFOUND", null);
|
||||
this.variants.put("TRUE", null);
|
||||
this.variants.put("FALSE", null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDbType() {
|
||||
return JdbcUtils.ORACLE;
|
||||
}
|
||||
|
||||
protected Column getColumn(SQLExpr expr) {
|
||||
if (expr instanceof OracleOuterExpr) {
|
||||
expr = ((OracleOuterExpr) expr).getExpr();
|
||||
@@ -172,6 +168,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public boolean visit(OracleUpdateStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
setAliasMap();
|
||||
setMode(x, Mode.Update);
|
||||
|
||||
@@ -729,6 +730,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleMultiInsertStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
x.putAttribute("_original_use_mode", getMode());
|
||||
setMode(x, Mode.Insert);
|
||||
|
||||
@@ -1355,7 +1361,15 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreatePackageStatement x) {
|
||||
return true;
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
for (SQLStatement stmt : x.getStatements()) {
|
||||
stmt.accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
-26
@@ -27,8 +27,6 @@ import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement {
|
||||
|
||||
private SQLWithSubqueryClause with;
|
||||
private List<SQLName> using = new ArrayList<SQLName>(2);
|
||||
private boolean returning;
|
||||
private String alias;
|
||||
|
||||
@@ -52,23 +50,7 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
public List<SQLName> getUsing() {
|
||||
return using;
|
||||
}
|
||||
|
||||
public void setUsing(List<SQLName> using) {
|
||||
this.using = using;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public SQLWithSubqueryClause getWith() {
|
||||
return with;
|
||||
}
|
||||
|
||||
public void setWith(SQLWithSubqueryClause with) {
|
||||
this.with = with;
|
||||
}
|
||||
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
accept0((PGASTVisitor) visitor);
|
||||
@@ -90,14 +72,6 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem
|
||||
PGDeleteStatement x = new PGDeleteStatement();
|
||||
cloneTo(x);
|
||||
|
||||
if (with != null) {
|
||||
x.setWith(with.clone());
|
||||
}
|
||||
for (SQLName item : using) {
|
||||
SQLName item2 = item.clone();
|
||||
item2.setParent(x);
|
||||
x.using.add(item2);
|
||||
}
|
||||
x.returning = returning;
|
||||
x.alias = alias;
|
||||
|
||||
|
||||
+6
-11
@@ -23,19 +23,21 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatement {
|
||||
|
||||
private SQLWithSubqueryClause with;
|
||||
|
||||
private List<ValuesClause> valuesList = new ArrayList<ValuesClause>();
|
||||
private SQLExpr returning;
|
||||
private boolean defaultValues = false;
|
||||
|
||||
public PGInsertStatement() {
|
||||
dbType = JdbcConstants.POSTGRESQL;
|
||||
}
|
||||
|
||||
public void cloneTo(PGInsertStatement x) {
|
||||
super.cloneTo(x);
|
||||
if (with != null) {
|
||||
x.setWith(with.clone());
|
||||
}
|
||||
for (ValuesClause v : valuesList) {
|
||||
ValuesClause v2 = v.clone();
|
||||
v2.setParent(x);
|
||||
@@ -55,13 +57,6 @@ public class PGInsertStatement extends SQLInsertStatement implements PGSQLStatem
|
||||
this.returning = returning;
|
||||
}
|
||||
|
||||
public SQLWithSubqueryClause getWith() {
|
||||
return with;
|
||||
}
|
||||
|
||||
public void setWith(SQLWithSubqueryClause with) {
|
||||
this.with = with;
|
||||
}
|
||||
|
||||
public ValuesClause getValues() {
|
||||
if (valuesList.size() == 0) {
|
||||
|
||||
+3
-9
@@ -185,15 +185,9 @@ public class PGSQLStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.USING) {
|
||||
lexer.nextToken();
|
||||
for (;;) {
|
||||
SQLName name = this.exprParser.name();
|
||||
deleteStatement.getUsing().add(name);
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
SQLTableSource tableSource = createSQLSelectParser().parseTableSource();
|
||||
deleteStatement.setUsing(tableSource);
|
||||
}
|
||||
|
||||
if (lexer.token() == (Token.WHERE)) {
|
||||
|
||||
@@ -246,10 +246,11 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
|
||||
print0(x.getAlias());
|
||||
}
|
||||
|
||||
if (x.getUsing().size() > 0) {
|
||||
SQLTableSource using = x.getUsing();
|
||||
if (using != null) {
|
||||
println();
|
||||
print0(ucase ? "USING " : "using ");
|
||||
printAndAccept(x.getUsing(), ", ");
|
||||
using.accept(this);
|
||||
}
|
||||
|
||||
if (x.getWhere() != null) {
|
||||
|
||||
+24
-13
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr;
|
||||
@@ -41,6 +42,7 @@ import com.alibaba.druid.stat.TableStat;
|
||||
import com.alibaba.druid.stat.TableStat.Mode;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
import com.alibaba.druid.util.PGUtils;
|
||||
|
||||
public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisitor {
|
||||
public PGSchemaStatVisitor() {
|
||||
@@ -90,7 +92,8 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
@Override
|
||||
public boolean visit(PGDeleteStatement x) {
|
||||
if (repository != null) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
@@ -100,16 +103,9 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
setAliasMap();
|
||||
|
||||
for (SQLName name : x.getUsing()) {
|
||||
String ident = name.toString();
|
||||
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementSelectCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
if (aliasMap != null) {
|
||||
aliasMap.put(ident, ident);
|
||||
}
|
||||
SQLTableSource using = x.getUsing();
|
||||
if (using != null) {
|
||||
using.accept(this);
|
||||
}
|
||||
|
||||
x.putAttribute("_original_use_mode", getMode());
|
||||
@@ -133,6 +129,11 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
@Override
|
||||
public boolean visit(PGInsertStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
setAliasMap();
|
||||
|
||||
if (x.getWith() != null) {
|
||||
@@ -144,8 +145,9 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
if (x.getTableName() instanceof SQLName) {
|
||||
String ident = ((SQLName) x.getTableName()).toString();
|
||||
SQLName tableName = x.getTableName();
|
||||
{
|
||||
String ident = tableName.toString();
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
@@ -182,8 +184,17 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
}
|
||||
|
||||
public boolean isPseudoColumn(long hash) {
|
||||
return PGUtils.isPseudoColumn(hash);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(PGUpdateStatement x) {
|
||||
if (repository != null
|
||||
&& x.getParent() == null) {
|
||||
repository.resolve(x);
|
||||
}
|
||||
|
||||
Map<String, String> oldAliasMap = getAliasMap();
|
||||
|
||||
setAliasMap();
|
||||
|
||||
+6
@@ -147,4 +147,10 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements
|
||||
}
|
||||
return schema_hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long hashCode64() {
|
||||
// TODO hashCode64
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
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 SQLServerInsertStatement extends SQLInsertStatement implements SQLServerObject {
|
||||
|
||||
@@ -33,6 +34,10 @@ public class SQLServerInsertStatement extends SQLInsertStatement implements SQLS
|
||||
|
||||
private SQLServerOutput output;
|
||||
|
||||
public SQLServerInsertStatement() {
|
||||
dbType = JdbcConstants.SQL_SERVER;
|
||||
}
|
||||
|
||||
public void cloneTo(SQLServerInsertStatement x) {
|
||||
super.cloneTo(x);
|
||||
x.defaultValues = defaultValues;
|
||||
|
||||
Reference in New Issue
Block a user