001package gudusoft.gsqlparser.stmt.mssql; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.nodes.*; 005import gudusoft.gsqlparser.nodes.mssql.TMssqlCreateTriggerUpdateColumn; 006import gudusoft.gsqlparser.nodes.mssql.TMssqlCreateTriggerUpdateColumnList; 007 008import java.util.Locale; 009 010/** 011 * This class represents if and while SQL statement of SQL Server. 012 */ 013public class TMssqlIfElse extends TCustomSqlStatement { 014 public TMssqlIfElse (EDbVendor dbvendor){ 015 super(dbvendor); 016 sqlstatementtype = ESqlStatementType.sstmssqlif ; 017 } 018 019 void buildsql() { 020 } 021 022 void clear() { 023 } 024 025 String getasprettytext() { 026 return ""; 027 } 028 029 void iterate(TVisitorAbs pvisitor) { 030 } 031 032 private int stmtType = TBaseType.condition_statement_if; 033 private TExpression condition = null; 034 private TMssqlCreateTriggerUpdateColumnList updateColumnList = null; 035 private TCustomSqlStatement stmt = null; 036 037 public TCustomSqlStatement getElseStmt() { 038 return elseStmt; 039 } 040 041 public TCustomSqlStatement getStmt() { 042 return stmt; 043 } 044 045 private TCustomSqlStatement elseStmt = null; 046 047 048 public TExpression getCondition() { 049 return condition; 050 } 051 052 public TMssqlCreateTriggerUpdateColumnList getUpdateColumnList() { 053 return updateColumnList; 054 } 055 056 /** 057 * if or while SQL statement this class represents for. 058 * @return 059 */ 060 public int getStmtType() { 061 return stmtType; 062 } 063 064 public int doParseStatement(TCustomSqlStatement psql) { 065 if (rootNode == null) return -1; 066 TIfSqlNode ifSqlNode = (TIfSqlNode)rootNode; 067 super.doParseStatement(psql); 068 this.stmtType = ifSqlNode.getStmtType(); 069 this.condition = ifSqlNode.getCondition(); 070 if (this.condition != null){ 071 this.condition.doParse(this,ESqlClause.unknown); 072 } 073 this.updateColumnList = ifSqlNode.getUpdateColumnList(); 074 if (updateColumnList != null){ 075 for(int i = 0 ;i<updateColumnList.size();i++){ 076 if (psql.getAncestorStmt().sqlstatementtype == ESqlStatementType.sstcreatetrigger){ 077 TMssqlCreateTriggerUpdateColumn updateColumn = updateColumnList.getCreateTriggerUpdateColumn(i); 078 if (updateColumn.getColumnName() != null){ 079 psql.getAncestorStmt().tables.getTable(0).getLinkedColumns().addObjectName(updateColumn.getColumnName()); 080 updateColumn.getColumnName().setSourceTable(psql.getAncestorStmt().tables.getTable(0)); 081 }else if (updateColumn.getCondition() != null){ 082 // UPDATE([ProductID2]) OR UPDATE([OrderQty2]) 083 TExpression condition = updateColumn.getCondition(); 084 if( (condition.toString().toUpperCase().startsWith("UPDATE")) && (condition.getExpressionType() == EExpressionType.function_t)){ 085 TFunctionCall f = condition.getFunctionCall(); 086 TObjectName name = f.getArgs().getExpression(0).getObjectOperand(); 087 088 psql.getAncestorStmt().tables.getTable(0).getLinkedColumns().addObjectName(name); 089 name.setSourceTable(psql.getAncestorStmt().tables.getTable(0)); 090 } 091 } 092 } 093 //psql.tables.getTable(0) 094 } 095 } 096 097 ifSqlNode.getStmtSqlNode().doParse(this,ESqlClause.unknown); 098 stmt = ifSqlNode.getStmtSqlNode().getStmt(); 099 if (this.getEndToken() == null){ 100 this.setEndToken(stmt.getEndToken()); 101 } 102 103 if (ifSqlNode.getElseStmtSqlNode() != null){ 104 ifSqlNode.getElseStmtSqlNode().doParse(this,ESqlClause.unknown); 105 elseStmt = ifSqlNode.getElseStmtSqlNode().getStmt(); 106 if (this.getEndToken() == null){ 107 this.setEndToken(elseStmt.getEndToken()); 108 } 109 } 110 111 return 0; 112 } 113 114 public void accept(TParseTreeVisitor v){ 115 v.preVisit(this); 116 v.postVisit(this); 117 } 118 119 public void acceptChildren(TParseTreeVisitor v){ 120 v.preVisit(this); 121 if (this.condition != null) condition.acceptChildren(v); 122 // Visit UPDATE() function arguments in trigger IF statements 123 // These contain column references that need to be resolved 124 if (this.updateColumnList != null) { 125 updateColumnList.acceptChildren(v); 126 } 127 stmt.acceptChildren(v); 128 if (elseStmt != null) elseStmt.acceptChildren(v); 129 v.postVisit(this); 130 } 131 132 public void setStmtType(int stmtType) { 133 this.stmtType = stmtType; 134 } 135 136 public void setCondition(TExpression condition) { 137 this.condition = condition; 138 } 139 140 public void setUpdateColumnList(TMssqlCreateTriggerUpdateColumnList updateColumnList) { 141 this.updateColumnList = updateColumnList; 142 } 143 144 public void setStmt(TCustomSqlStatement stmt) { 145 this.stmt = stmt; 146 } 147 148 public void setElseStmt(TCustomSqlStatement elseStmt) { 149 this.elseStmt = elseStmt; 150 } 151}