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}