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}