001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.compiler.TSymbolTableManager;
005import gudusoft.gsqlparser.compiler.TVariable;
006import gudusoft.gsqlparser.nodes.TExpression;
007import gudusoft.gsqlparser.nodes.TObjectName;
008import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
009import gudusoft.gsqlparser.nodes.TSelectSqlNode;
010
011/**
012 * The assignment statement sets the current value of a variable, field, parameter,
013 * or element that has been declared in the current scope.
014 */
015
016public class TAssignStmt extends TCustomSqlStatement {
017
018    public enum AssignType  {normal, variableAssignment, cursorAssignment,resultsetAssignment};
019
020    private AssignType assignType = AssignType.normal;
021
022    private TSelectSqlNode queryNode;
023    private TSelectSqlStatement query;
024
025    public TSelectSqlStatement getQuery() {
026        return query;
027    }
028
029    public AssignType getAssignType() {
030        return assignType;
031    }
032
033    private TObjectName resultsetName;
034
035    public TObjectName getResultsetName() {
036        return resultsetName;
037    }
038
039    private TObjectName variableName;
040
041    public TObjectName getVariableName() {
042        return variableName;
043    }
044
045    public TAssignStmt(){
046       this(EDbVendor.dbvoracle);
047    }
048
049    public TAssignStmt(TExpression pLeft, TExpression pExpr){
050        this(EDbVendor.dbvoracle);
051        this.left = pLeft;
052        this.expression = pExpr;
053    }
054
055
056     public TAssignStmt(EDbVendor dbvendor){
057        super(dbvendor);
058        sqlstatementtype = ESqlStatementType.sst_assignstmt;
059    }
060
061    void buildsql() {
062    }
063
064    void clear() {
065    }
066
067    String getasprettytext() {
068        return "";
069    }
070
071    void iterate(TVisitorAbs pvisitor) {
072    }
073
074
075
076    private TExpression left = null;
077
078    /**
079     * @return The expression whose value is to be assigned to the target (the item to the left of the
080     * assignment operator) when the assignment statement executes.
081     */
082    public TExpression getExpression() {
083        return expression;
084    }
085
086    /**
087     * Lefe side of this assignment, can be
088     * <ul>
089     * <li>attribute_name</li>
090     * <li>collection_name</li>
091     * <li>cursor_variable_name</li>
092     * <li>field_name</li>
093     * <li>host_cursor_variable_name</li>
094     * <li>host_variable_name</li>
095     * <li>object_name</li>
096     * <li>parameter_name</li>
097     * <li>record_name</li>
098     * <li>variable_name</li>
099     * </ul>
100     * @return  A TExpression object.
101     */
102    public TExpression getLeft() {
103        return left;
104    }
105
106    private TExpression expression = null;
107
108    public void setLeft(TExpression left) {
109        this.left = left;
110    }
111
112    public void setExpression(TExpression expression) {
113        this.expression = expression;
114    }
115
116    public void init(Object arg1,Object arg2)
117    {
118        if (arg1 instanceof TObjectName){
119            variableName = (TObjectName)arg1;
120        }else if (arg1 instanceof  TExpression){
121            left = (TExpression)arg1;
122        }
123
124        expression = (TExpression)arg2;
125    }
126
127    public void init(Object arg1, Object arg2,Object arg3){
128        this.assignType = (AssignType) arg1;
129        switch (this.assignType){
130            case variableAssignment:
131                this.variableName = (TObjectName) arg2;
132                this.expression = (TExpression) arg3;
133                break;
134            case cursorAssignment:
135                this.variableName = (TObjectName) arg2;
136                this.queryNode = (TSelectSqlNode)arg3;
137                break;
138            case resultsetAssignment:
139                this.variableName = (TObjectName) arg2;
140                this.resultsetName = (TObjectName) arg3;
141                break;
142        }
143
144    }
145
146    public int doParseStatement(TCustomSqlStatement psql) {
147        super.doParseStatement(psql);
148
149        switch (getAssignType()){
150            case normal:
151                if (left != null){
152                    left.doParse(this,ESqlClause.spAssignValue);
153                    if (left.getExpressionType() == EExpressionType.simple_object_name_t){
154                        TVariable symbolVariable =  TSymbolTableManager.searchSymbolVariable(this.getFrameStack(), left.getObjectOperand().toString());
155                        if (symbolVariable != null){
156                            expression.evaluate(this.getFrameStack(),this);
157                            symbolVariable.setVariableStr(this.expression.getPlainText());
158                            if (expression.getStartToken() != null){
159                                symbolVariable.setLineNo(expression.getStartToken().lineNo);
160                                symbolVariable.setColumnNo(expression.getStartToken().columnNo);
161                            }
162                        }
163                    }
164                }
165
166                expression.doParse(this,ESqlClause.spAssignValue);
167                break;
168            case variableAssignment:
169                expression.doParse(this,ESqlClause.spAssignValue);
170                break;
171            case cursorAssignment:
172                query = new TSelectSqlStatement(this.dbvendor);
173                query.rootNode = queryNode;
174                query.doParseStatement(this);
175                break;
176        }
177
178        return 0;
179    }
180
181    public void accept(TParseTreeVisitor v){
182        v.preVisit(this);
183        v.postVisit(this);
184    }
185
186    public void acceptChildren(TParseTreeVisitor v){
187        v.preVisit(this);
188        if (left != null){
189            left.acceptChildren(v);
190        }
191        if (expression != null){
192            expression.acceptChildren(v);
193        }else{
194            TBaseType.log("Value expression in assign statement is not specified",TLog.WARNING);
195        }
196
197        v.postVisit(this);
198    }
199}