bug fixed for OracleSchemaStatVisitor

This commit is contained in:
温少
2012-02-26 00:49:33 +08:00
21 changed files with 623 additions and 5 deletions
@@ -0,0 +1,7 @@
package com.alibaba.druid.sql.dialect.hive.ast;
public abstract class HiveStatementImpl extends HiveSQLObjectImpl implements HiveStatement {
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,29 @@
package com.alibaba.druid.sql.dialect.hive.ast.stmt;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.dialect.hive.ast.HiveStatementImpl;
import com.alibaba.druid.sql.dialect.hive.visitor.HiveASTVisitor;
public class HiveShowTablesStatement extends HiveStatementImpl {
private static final long serialVersionUID = 1L;
private SQLCharExpr pattern;
public SQLCharExpr getPattern() {
return pattern;
}
public void setPattern(SQLCharExpr pattern) {
this.pattern = pattern;
}
@Override
public void accept0(HiveASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, pattern);
}
visitor.endVisit(this);
}
}
@@ -84,6 +84,8 @@ public class HiveLexer extends Lexer {
map.put("WITH", Token.WITH);
map.put("PARTITIONED", Token.PARTITIONED);
map.put("SHOW", Token.SHOW);
map.put("TABLES", Token.TABLES);
DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map);
}
@@ -1,8 +1,14 @@
package com.alibaba.druid.sql.dialect.hive.parser;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement;
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;
public class HiveStatementParser extends SQLStatementParser {
@@ -19,4 +25,25 @@ public class HiveStatementParser extends SQLStatementParser {
return new HiveCreateTableParser(lexer);
}
public boolean parseStatementListDialect(List<SQLStatement> statementList) {
if (lexer.token() == Token.SHOW) {
lexer.nextToken();
if (lexer.token() == Token.TABLES) {
lexer.nextToken();
HiveShowTablesStatement stmt = new HiveShowTablesStatement();
if (lexer.token() == Token.LITERAL_CHARS) {
stmt.setPattern((SQLCharExpr) exprParser.primary());
}
statementList.add(stmt);
return true;
}
throw new ParserException("TODO " + lexer.token());
}
return false;
}
}
@@ -1,12 +1,17 @@
package com.alibaba.druid.sql.dialect.hive.visitor;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface HiveASTVisitor extends SQLASTVisitor {
void endVisit(HiveCreateTableStatement x);
void endVisit(HiveShowTablesStatement x);
boolean visit(HiveShowTablesStatement x);
void endVisit(HiveCreateTableStatement x);
boolean visit(HiveCreateTableStatement x);
void endVisit(HiveCreateTableStatement.PartitionedBy x);
@@ -1,6 +1,7 @@
package com.alibaba.druid.sql.dialect.hive.visitor;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement;
import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;
public class HiveASTVisitorAdapter extends SQLASTVisitorAdapter implements HiveASTVisitor {
@@ -25,4 +26,14 @@ public class HiveASTVisitorAdapter extends SQLASTVisitorAdapter implements HiveA
return true;
}
@Override
public void endVisit(HiveShowTablesStatement x) {
}
@Override
public boolean visit(HiveShowTablesStatement x) {
return true;
}
}
@@ -3,6 +3,7 @@ package com.alibaba.druid.sql.dialect.hive.visitor;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement.PartitionedBy;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVisitor {
@@ -43,4 +44,19 @@ public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVis
return false;
}
@Override
public void endVisit(HiveShowTablesStatement x) {
}
@Override
public boolean visit(HiveShowTablesStatement x) {
print("SHOW TABLES");
if (x.getPattern() != null) {
print(" ");
x.getPattern().accept(this);
}
return false;
}
}
@@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.hive.visitor;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveCreateTableStatement;
import com.alibaba.druid.sql.dialect.hive.ast.stmt.HiveShowTablesStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
public class HiveSchemaStatVisitor extends SchemaStatVisitor implements HiveASTVisitor {
@@ -25,4 +26,14 @@ public class HiveSchemaStatVisitor extends SchemaStatVisitor implements HiveASTV
public boolean visit(HiveCreateTableStatement.PartitionedBy x) {
return false;
}
@Override
public void endVisit(HiveShowTablesStatement x) {
}
@Override
public boolean visit(HiveShowTablesStatement x) {
return false;
}
}
@@ -32,6 +32,7 @@ public class OracleUpdateSetListSingleColumnItem extends OracleUpdateSetListItem
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.column);
acceptChild(visitor, this.value);
}
visitor.endVisit(this);
@@ -9,6 +9,7 @@ import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
@@ -82,16 +83,50 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetValueClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
import com.alibaba.druid.stat.TableStat.Mode;
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
protected Column getColumn(SQLExpr expr) {
if (expr instanceof OracleOuterExpr) {
expr = ((OracleOuterExpr) expr).getExpr();
}
return super.getColumn(expr);
}
public boolean visit(OracleSelectTableReference x) {
SQLExpr expr = x.getExpr();
if (expr instanceof SQLMethodInvokeExpr) {
SQLMethodInvokeExpr methodInvoke = (SQLMethodInvokeExpr) expr;
if ("TABLE".equalsIgnoreCase(methodInvoke.getMethodName()) && methodInvoke.getParameters().size() == 1) {
expr = methodInvoke.getParameters().get(0);
}
}
Map<String, String> aliasMap = aliasLocal.get();
if (expr instanceof SQLName) {
String ident = ((SQLName) expr).toString();
String ident;
if (expr instanceof SQLPropertyExpr) {
String owner = ((SQLPropertyExpr) expr).getOwner().toString();
String name = ((SQLPropertyExpr) expr).getName();
if (aliasMap.containsKey(owner)) {
owner = aliasMap.get(owner);
}
ident = owner + "." + name;
} else {
ident = expr.toString();
}
if ("DUAL".equalsIgnoreCase(ident)) {
return false;
}
Map<String, String> aliasMap = aliasLocal.get();
if (aliasMap.containsKey(ident) && aliasMap.get(ident) == null) {
return false;
@@ -228,6 +263,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
return super.visit(x);
}
public boolean visit(SQLMethodInvokeExpr x) {
accept(x.getParameters());
return false;
}
public boolean visit(SQLIdentifierExpr x) {
if ("ROWNUM".equalsIgnoreCase(x.getName())) {
@@ -241,6 +281,10 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
if ("+".equalsIgnoreCase(x.getName())) {
return false;
}
if ("LEVEL".equals(x.getName())) {
return false;
}
return super.visit(x);
}
@@ -157,6 +157,8 @@ public enum Token {
// hive
PARTITIONED("PARTITIONED"),
SHOW("SHOW"),
TABLES("TABLES"),
EOF,
ERROR,