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}