This commit is contained in:
温少
2012-03-17 15:10:52 +08:00
parent 2254bcfeb5
commit 204d94d6f4
24 changed files with 243 additions and 277 deletions
@@ -22,7 +22,6 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -30,43 +29,29 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@SuppressWarnings("serial")
public class MySqlSelectQueryBlock extends SQLSelectQueryBlock {
private boolean hignPriority;
private boolean straightJoin;
private boolean hignPriority;
private boolean straightJoin;
private boolean smallResult;
private boolean bigResult;
private boolean bufferResult;
private Boolean cache;
private boolean calcFoundRows;
private boolean smallResult;
private boolean bigResult;
private boolean bufferResult;
private Boolean cache;
private boolean calcFoundRows;
private SQLOrderBy orderBy;
private SQLOrderBy orderBy;
private Limit limit;
private Limit limit;
private SQLName procedureName;
private List<SQLExpr> procedureArgumentList = new ArrayList<SQLExpr>();
private SQLName procedureName;
private List<SQLExpr> procedureArgumentList = new ArrayList<SQLExpr>();
private SQLExprTableSource into;
private boolean forUpdate = false;
private boolean lockInShareMode = false;
private boolean forUpdate = false;
private boolean lockInShareMode = false;
public MySqlSelectQueryBlock(){
}
public SQLExprTableSource getInto() {
return into;
}
public void setInto(SQLExpr into) {
this.into = new SQLExprTableSource(into);
}
public void setInto(SQLExprTableSource into) {
this.into = into;
}
public boolean isForUpdate() {
return forUpdate;
}
@@ -111,53 +111,58 @@ public class MySqlSelectParser extends SQLSelectParser {
if (lexer.token() == (Token.INTO)) {
lexer.nextToken();
acceptIdentifier("OUTFILE");
MySqlOutFileExpr outFile = new MySqlOutFileExpr();
outFile.setFile(expr());
queryBlock.setInto(outFile);
if (identifierEquals("FIELDS") || identifierEquals("COLUMNS")) {
if (identifierEquals("OUTFILE")) {
lexer.nextToken();
if (identifierEquals("TERMINATED")) {
lexer.nextToken();
accept(Token.BY);
}
outFile.setColumnsTerminatedBy((SQLLiteralExpr) expr());
MySqlOutFileExpr outFile = new MySqlOutFileExpr();
outFile.setFile(expr());
if (identifierEquals("OPTIONALLY")) {
queryBlock.setInto(outFile);
if (identifierEquals("FIELDS") || identifierEquals("COLUMNS")) {
lexer.nextToken();
outFile.setColumnsEnclosedOptionally(true);
if (identifierEquals("TERMINATED")) {
lexer.nextToken();
accept(Token.BY);
}
outFile.setColumnsTerminatedBy((SQLLiteralExpr) expr());
if (identifierEquals("OPTIONALLY")) {
lexer.nextToken();
outFile.setColumnsEnclosedOptionally(true);
}
if (identifierEquals("ENCLOSED")) {
lexer.nextToken();
accept(Token.BY);
outFile.setColumnsEnclosedBy((SQLLiteralExpr) expr());
}
if (identifierEquals("ESCAPED")) {
lexer.nextToken();
accept(Token.BY);
outFile.setColumnsEscaped((SQLLiteralExpr) expr());
}
}
if (identifierEquals("ENCLOSED")) {
if (identifierEquals("LINES")) {
lexer.nextToken();
accept(Token.BY);
outFile.setColumnsEnclosedBy((SQLLiteralExpr) expr());
}
if (identifierEquals("ESCAPED")) {
lexer.nextToken();
accept(Token.BY);
outFile.setColumnsEscaped((SQLLiteralExpr) expr());
}
}
if (identifierEquals("LINES")) {
lexer.nextToken();
if (identifierEquals("STARTING")) {
lexer.nextToken();
accept(Token.BY);
outFile.setLinesStartingBy((SQLLiteralExpr) expr());
} else {
identifierEquals("TERMINATED");
lexer.nextToken();
accept(Token.BY);
outFile.setLinesTerminatedBy((SQLLiteralExpr) expr());
if (identifierEquals("STARTING")) {
lexer.nextToken();
accept(Token.BY);
outFile.setLinesStartingBy((SQLLiteralExpr) expr());
} else {
identifierEquals("TERMINATED");
lexer.nextToken();
accept(Token.BY);
outFile.setLinesTerminatedBy((SQLLiteralExpr) expr());
}
}
} else {
queryBlock.setInto(this.createExprParser().name());
}
}
}
@@ -198,7 +203,8 @@ public class MySqlSelectParser extends SQLSelectParser {
if (lexer.token() == Token.INTO) {
lexer.nextToken();
throw new ParserException("TODO");
SQLExpr expr = this.createExprParser().name();
queryBlock.setInto(expr);
}
if (lexer.token() == Token.FOR) {
@@ -18,9 +18,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
@@ -36,24 +34,11 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
private OracleSelectHierachicalQueryClause hierachicalQueryClause;
private ModelClause modelClause;
private SQLExprTableSource into;
public OracleSelectQueryBlock(){
}
public SQLExprTableSource getInto() {
return into;
}
public void setInto(SQLExpr into) {
this.into = new SQLExprTableSource(into);
}
public void setInto(SQLExprTableSource into) {
this.into = into;
}
public ModelClause getModelClause() {
return modelClause;
}
@@ -5,7 +5,6 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSQLObjectImpl;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
@@ -25,14 +24,18 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
private SQLOrderBy orderBy;
private FetchClause fetch;
private ForClause forClause;
private IntoClause into;
private IntoOption intoOption;
public IntoClause getInto() {
return into;
public static enum IntoOption {
TEMPORARY, TEMP, UNLOGGED
}
public void setInto(IntoClause into) {
this.into = into;
public IntoOption getIntoOption() {
return intoOption;
}
public void setIntoOption(IntoOption intoOption) {
this.intoOption = intoOption;
}
@Override
@@ -237,44 +240,4 @@ public class PGSelectQueryBlock extends SQLSelectQueryBlock {
}
}
public static class IntoClause extends PGSQLObjectImpl {
public static enum Option {
TEMPORARY, TEMP, UNLOGGED
}
private static final long serialVersionUID = 1L;
private SQLExprTableSource table;
private Option option;
public Option getOption() {
return option;
}
public void setOption(Option option) {
this.option = option;
}
public SQLExprTableSource getTable() {
return table;
}
public void setTable(SQLExpr table) {
this.table = new SQLExprTableSource(table);
}
public void setTable(SQLExprTableSource table) {
this.table = table;
}
@Override
public void accept0(PGASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, table);
}
visitor.endVisit(this);
}
}
}
@@ -3,9 +3,10 @@ package com.alibaba.druid.sql.dialect.postgresql.parser;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoOption;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
@@ -55,18 +56,17 @@ public class PGSelectParser extends SQLSelectParser {
parseSelectList(queryBlock);
if (lexer.token() == Token.INTO) {
IntoClause into = new IntoClause();
lexer.nextToken();
if (lexer.token() == Token.TEMPORARY) {
lexer.nextToken();
into.setOption(IntoClause.Option.TEMPORARY);
queryBlock.setIntoOption(IntoOption.TEMPORARY);
} else if (lexer.token() == Token.TEMP) {
lexer.nextToken();
into.setOption(IntoClause.Option.TEMP);
queryBlock.setIntoOption(IntoOption.TEMP);
} else if (lexer.token() == Token.UNLOGGED) {
lexer.nextToken();
into.setOption(IntoClause.Option.UNLOGGED);
queryBlock.setIntoOption(IntoOption.UNLOGGED);
}
if (lexer.token() == Token.TABLE) {
@@ -74,9 +74,8 @@ public class PGSelectParser extends SQLSelectParser {
}
SQLExpr name = this.createExprParser().name();
into.setTable(name);
queryBlock.setInto(into);
queryBlock.setInto(new SQLExprTableSource(name));
}
}
@@ -12,8 +12,12 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface PGASTVisitor extends SQLASTVisitor {
void endVisit(PGSelectQueryBlock.WindowClause x);
void endVisit(PGSelectQueryBlock x);
boolean visit(PGSelectQueryBlock x);
void endVisit(PGSelectQueryBlock.WindowClause x);
boolean visit(PGSelectQueryBlock.WindowClause x);
void endVisit(PGSelectQueryBlock.FetchClause x);
@@ -32,27 +36,23 @@ public interface PGASTVisitor extends SQLASTVisitor {
boolean visit(PGWithClause x);
void endVisit(PGSelectQueryBlock.IntoClause x);
boolean visit(PGSelectQueryBlock.IntoClause x);
void endVisit(PGTruncateStatement x);
boolean visit(PGTruncateStatement x);
void endVisit(PGDeleteStatement x);
boolean visit(PGDeleteStatement x);
void endVisit(PGInsertStatement x);
boolean visit(PGInsertStatement x);
void endVisit(PGSelectStatement x);
boolean visit(PGSelectStatement x);
void endVisit(PGUpdateStatement x);
boolean visit(PGUpdateStatement x);
}
@@ -4,9 +4,9 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGTruncateStatement;
@@ -70,17 +70,6 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi
return true;
}
@Override
public void endVisit(IntoClause x) {
}
@Override
public boolean visit(IntoClause x) {
return true;
}
@Override
public void endVisit(PGTruncateStatement x) {
@@ -91,46 +80,56 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi
return true;
}
@Override
public void endVisit(PGDeleteStatement x) {
}
@Override
public boolean visit(PGDeleteStatement x) {
return true;
}
@Override
public void endVisit(PGInsertStatement x) {
}
@Override
public boolean visit(PGInsertStatement x) {
return true;
}
@Override
public void endVisit(PGSelectStatement x) {
}
@Override
public boolean visit(PGSelectStatement x) {
return true;
}
@Override
public void endVisit(PGUpdateStatement x) {
}
@Override
public boolean visit(PGUpdateStatement x) {
return true;
}
@Override
public void endVisit(PGSelectQueryBlock x) {
}
@Override
public boolean visit(PGSelectQueryBlock x) {
return true;
}
}
@@ -1,7 +1,6 @@
package com.alibaba.druid.sql.dialect.postgresql.visitor;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
@@ -10,7 +9,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGTruncateStatement;
@@ -135,14 +133,6 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
return false;
}
public boolean visit(SQLSelectQueryBlock x) {
if (x instanceof PGSelectQueryBlock) {
return visit((PGSelectQueryBlock) x);
}
return super.visit(x);
}
public boolean visit(PGSelectQueryBlock x) {
if (x.getWith() != null) {
x.getWith().accept(this);
@@ -166,6 +156,11 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
if (x.getInto() != null) {
println();
if (x.getIntoOption() != null) {
print(x.getIntoOption().name());
print(" ");
}
x.getInto().accept(this);
}
@@ -223,21 +218,6 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
return false;
}
@Override
public void endVisit(IntoClause x) {
}
@Override
public boolean visit(IntoClause x) {
print("INTO ");
if (x.getOption() != null) {
print(x.getOption().name());
print(" ");
}
x.getTable().accept(this);
return false;
}
@Override
public void endVisit(PGTruncateStatement x) {
@@ -435,4 +415,9 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
return false;
}
@Override
public void endVisit(PGSelectQueryBlock x) {
}
}
@@ -4,15 +4,16 @@ import java.util.Map;
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.SQLTruncateStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGInsertStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGTruncateStatement;
@@ -87,20 +88,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
return true;
}
@Override
public void endVisit(IntoClause x) {
}
@Override
public boolean visit(IntoClause x) {
String ident = x.getTable().toString();
TableStat stat = getTableStat(ident);
stat.incrementInsertCount();
return false;
}
@Override
public void endVisit(PGTruncateStatement x) {
@@ -196,7 +183,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
public void endVisit(PGSelectStatement x) {
}
@Override
public boolean visit(PGSelectStatement x) {
if (x.getWith() != null) {
@@ -237,4 +224,15 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
return false;
}
@Override
public void endVisit(PGSelectQueryBlock x) {
}
@Override
public boolean visit(PGSelectQueryBlock x) {
this.visit((SQLSelectQueryBlock) x);
return false;
}
}