001package gudusoft.gsqlparser.stmt; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.nodes.*; 005import gudusoft.gsqlparser.stmt.*; 006 007public class TExplainPlan extends TCustomSqlStatement { 008 009 private TCustomSqlStatement statement; 010 011 public TCustomSqlStatement getStatement() { 012 return statement; 013 } 014 015 public TExplainPlan(EDbVendor dbvendor) { 016 super(dbvendor); 017 sqlstatementtype = ESqlStatementType.sstExplain; 018 } 019 020 public int doParseStatement(TCustomSqlStatement psql) { 021 if (rootNode == null) { 022 // EXPLAIN FOR CONNECTION has no inner statement to parse 023 if (isForConnection()) return 0; 024 return -1; 025 } 026 super.doParseStatement(psql); 027 TStatementSqlNode sqlNode = new TStatementSqlNode(); 028 if (dbvendor == EDbVendor.dbvhana){ 029 if (((TDummy)rootNode).node1 != null){ 030 sqlNode.init(((TDummy)rootNode).node1); 031 sqlNode.doParse(this, ESqlClause.unknown); 032 statement = sqlNode.getStmt(); 033 } 034 }else{ 035 sqlNode.init(rootNode); 036 sqlNode.doParse(this, ESqlClause.unknown); 037 statement = sqlNode.getStmt(); 038 } 039 040// switch (rootNode.getNodeType()){ 041// case TStatementSqlNode.select: 042// statement = new TSelectSqlStatement(dbvendor); 043// break; 044// case TStatementSqlNode.delete: 045// statement = new TDeleteSqlStatement(dbvendor); 046// break; 047// case TStatementSqlNode.insert: 048// statement = new TInsertSqlStatement(dbvendor); 049// break; 050// case TStatementSqlNode.update: 051// statement = new TUpdateSqlStatement(dbvendor); 052// break; 053// case TStatementSqlNode.createtable: 054// statement = new TCreateTableSqlStatement(dbvendor); 055// break; 056// case TStatementSqlNode.CreateIndexSqlNode: 057// statement = new TCreateIndexSqlStatement(dbvendor); 058// break; 059// default: 060// break; 061// } 062// statement.rootNode = rootNode; 063// statement.doParseStatement(this); 064 065 return 0; 066 } 067 068 public void accept(TParseTreeVisitor v){ 069 v.preVisit(this); 070 v.postVisit(this); 071 } 072 073 public void acceptChildren(TParseTreeVisitor v){ 074 v.preVisit(this); 075 if (statement != null){ 076 statement.accept(v); 077 }else{ 078 TBaseType.log("Stmt inside explain is null",TLog.WARNING); 079 } 080 081 v.postVisit(this); 082 } 083 084 public void setStatement(TCustomSqlStatement statement) { 085 this.statement = statement; 086 } 087 088 private boolean isForConnection() { 089 if (sourcetokenlist == null) return false; 090 for (int i = 0; i < sourcetokenlist.size() - 1; i++) { 091 TSourceToken st = sourcetokenlist.get(i); 092 if (st.tokencode == TBaseType.rrw_for) { 093 TSourceToken next = sourcetokenlist.nextsolidtoken(i, 1, false); 094 if (next != null && next.toString().equalsIgnoreCase("connection")) { 095 return true; 096 } 097 } 098 } 099 return false; 100 } 101}