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 TCustomSqlStatement ancestor = psql == null ? null : psql.getAncestorStmt(); 076 for(int i = 0 ;i<updateColumnList.size();i++){ 077 if ((ancestor != null) 078 && (ancestor.sqlstatementtype == ESqlStatementType.sstcreatetrigger) 079 && (ancestor.tables.size() > 0)){ 080 TMssqlCreateTriggerUpdateColumn updateColumn = updateColumnList.getCreateTriggerUpdateColumn(i); 081 if (updateColumn.getColumnName() != null){ 082 ancestor.tables.getTable(0).getLinkedColumns().addObjectName(updateColumn.getColumnName()); 083 updateColumn.getColumnName().setSourceTable(ancestor.tables.getTable(0)); 084 }else if (updateColumn.getCondition() != null){ 085 // UPDATE([ProductID2]) OR UPDATE([OrderQty2]) 086 TExpression condition = updateColumn.getCondition(); 087 if( (condition.toString().toUpperCase().startsWith("UPDATE")) && (condition.getExpressionType() == EExpressionType.function_t)){ 088 TFunctionCall f = condition.getFunctionCall(); 089 TObjectName name = f.getArgs().getExpression(0).getObjectOperand(); 090 091 ancestor.tables.getTable(0).getLinkedColumns().addObjectName(name); 092 name.setSourceTable(ancestor.tables.getTable(0)); 093 } 094 } 095 } 096 //psql.tables.getTable(0) 097 } 098 } 099 100 TStatementSqlNode stmtSqlNode = ifSqlNode.getStmtSqlNode(); 101 if (stmtSqlNode == null) return reportMissingStatementBody(ifSqlNode); 102 stmtSqlNode.doParse(this,ESqlClause.unknown); 103 stmt = stmtSqlNode.getStmt(); 104 if ((stmt == null) || (stmt.getStartToken() == null) || (stmt.getEndToken() == null)) { 105 return reportMissingStatementBody(ifSqlNode); 106 } 107 if (this.getEndToken() == null){ 108 this.setEndToken(stmt.getEndToken()); 109 } 110 111 if (ifSqlNode.getElseStmtSqlNode() != null){ 112 ifSqlNode.getElseStmtSqlNode().doParse(this,ESqlClause.unknown); 113 elseStmt = ifSqlNode.getElseStmtSqlNode().getStmt(); 114 if ((elseStmt == null) || (elseStmt.getStartToken() == null) 115 || (elseStmt.getEndToken() == null)) { 116 return reportMissingStatementBody(ifSqlNode); 117 } 118 if (this.getEndToken() == null){ 119 this.setEndToken(elseStmt.getEndToken()); 120 } 121 } 122 123 return 0; 124 } 125 126 private int reportMissingStatementBody(TIfSqlNode ifSqlNode) { 127 TSourceToken errorToken = ifSqlNode.getEndToken(); 128 if (errorToken != null) { 129 parseerrormessagehandle(new TSyntaxError(errorToken, 130 "missing IF/WHILE statement body", EErrorType.sperror, 131 TBaseType.MSG_ERROR_SYNTAX_ERROR, this)); 132 } else { 133 parseerrormessagehandle(new TSyntaxError("end of input", 0, 0, 134 "missing IF/WHILE statement body", EErrorType.sperror, 135 TBaseType.MSG_ERROR_SYNTAX_ERROR, this, -1)); 136 } 137 return TBaseType.MSG_ERROR_SYNTAX_ERROR; 138 } 139 140 public void accept(TParseTreeVisitor v){ 141 v.preVisit(this); 142 v.postVisit(this); 143 } 144 145 public void acceptChildren(TParseTreeVisitor v){ 146 v.preVisit(this); 147 if (this.condition != null) condition.acceptChildren(v); 148 // Visit UPDATE() function arguments in trigger IF statements 149 // These contain column references that need to be resolved 150 if (this.updateColumnList != null) { 151 updateColumnList.acceptChildren(v); 152 } 153 if (stmt != null) stmt.acceptChildren(v); 154 if (elseStmt != null) elseStmt.acceptChildren(v); 155 v.postVisit(this); 156 } 157 158 public void setStmtType(int stmtType) { 159 this.stmtType = stmtType; 160 } 161 162 public void setCondition(TExpression condition) { 163 this.condition = condition; 164 } 165 166 public void setUpdateColumnList(TMssqlCreateTriggerUpdateColumnList updateColumnList) { 167 this.updateColumnList = updateColumnList; 168 } 169 170 public void setStmt(TCustomSqlStatement stmt) { 171 this.stmt = stmt; 172 } 173 174 public void setElseStmt(TCustomSqlStatement elseStmt) { 175 this.elseStmt = elseStmt; 176 } 177}