improve sql parser for informix skip/first clause.

This commit is contained in:
wenshao
2016-10-17 19:22:47 +08:00
parent 4f612ec2e0
commit 82cdd301c4
15 changed files with 359 additions and 31 deletions
@@ -54,6 +54,7 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVisitor {
@@ -77,7 +78,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
}
public OdpsOutputVisitor(Appendable appender){
super(appender);
super(appender, JdbcConstants.ODPS);
}
public boolean visit(OdpsCreateTableStatement x) {
@@ -18,18 +18,14 @@ package com.alibaba.druid.sql.dialect.oracle.parser;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLListExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnionOperator;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
@@ -82,8 +78,15 @@ public class OracleSelectParser extends SQLSelectParser {
withSubquery(select);
select.setQuery(query());
select.setOrderBy(this.parseOrderBy());
SQLSelectQuery query = query();
select.setQuery(query);
SQLOrderBy orderBy = this.parseOrderBy();
select.setOrderBy(orderBy);
if (orderBy != null && query instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query;
parseFetchClause(queryBlock);
}
if (lexer.token() == (Token.FOR)) {
lexer.nextToken();
@@ -344,7 +344,8 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
println();
}
x.getQuery().accept(this);
SQLSelectQuery query = x.getQuery();
query.accept(this);
if (x.getRestriction() != null) {
print(' ');
@@ -356,9 +357,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
x.getForUpdate().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
SQLOrderBy orderBy = x.getOrderBy();
if (orderBy != null) {
boolean hasFirst = false;
if (query instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query;
hasFirst = queryBlock.getFirst() != null;
}
if (!hasFirst) {
println();
orderBy.accept(this);
}
}
return false;
@@ -164,6 +164,8 @@ public class SQLServerSelectParser extends SQLSelectParser {
parseGroupBy(queryBlock);
parseFetchClause(queryBlock);
return queryRest(queryBlock);
}
@@ -93,6 +93,8 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe
x.getGroupBy().accept(this);
}
printFetchFirst(x);
return false;
}