001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.EDbObjectType;
004import gudusoft.gsqlparser.EExecType;
005import gudusoft.gsqlparser.EExpressionType;
006import gudusoft.gsqlparser.TBaseType;
007import gudusoft.gsqlparser.nodes.mssql.TExecuteOption;
008
009
010public class TExecuteSqlNode extends TParseTreeNode {
011
012    public void setLinkServerName(TObjectName linkServerName) {
013        this.linkServerName = linkServerName;
014    }
015
016    public TObjectName getLinkServerName() {
017        return linkServerName;
018    }
019
020    private TObjectName linkServerName;
021    private TObjectName moduleName = null;
022    private TObjectName returnStatus = null;
023    private TExecParameterList parameters = null;
024    private TExpressionList stringValues = null;
025    private int execType = TBaseType.metExecSp;
026
027    // postgresql
028    private TExpression stmtString;
029
030
031    public void setIntoVariable(TObjectName intoVariable) {
032        this.intoVariable = intoVariable;
033    }
034
035    public void setUsingVariables(TExpressionList usingVariables) {
036        this.usingVariables = usingVariables;
037    }
038
039    public void setStmtString(TExpression stmtString) {
040        this.stmtString = stmtString;
041    }
042
043    public TExpression getStmtString() {
044        return stmtString;
045    }
046
047    private TObjectName intoVariable;
048    private TExpressionList usingVariables;
049
050    public TObjectName getIntoVariable() {
051        return intoVariable;
052    }
053
054    public TExpressionList getUsingVariables() {
055        return usingVariables;
056    }
057
058
059
060    private TExecuteOption executeOption;
061
062    public void setExecuteOption(TExecuteOption executeOption) {
063        this.executeOption = executeOption;
064    }
065
066    public TExecuteOption getExecuteOption() {
067
068        return executeOption;
069    }
070
071    public void setExecType(int execType) {
072        this.execType = execType;
073    }
074
075    public int getExecType() {
076
077        return execType;
078    }
079
080    public TExpressionList getStringValues() {
081        return stringValues;
082    }
083
084    public TObjectName getModuleName() {
085        return moduleName;
086    }
087
088    public TExecParameterList getParameters() {
089        return parameters;
090    }
091
092    public TObjectName getReturnStatus() {
093        return returnStatus;
094    }
095
096//    public void init(Object arg1,Object arg2,Object arg3){
097//      if (arg1 instanceof TObjectName){
098//          this.moduleName = (TObjectName)arg1;
099//          this.moduleName.setObjectType(TObjectName.ttobjProcedureName);
100//          if (arg2 != null){
101//              if (arg2 instanceof TExpressionList){
102//              // oracle execute
103//                stringValues = (TExpressionList)arg2;
104//              }else{
105//                this.parameters = (TExecParameterList)arg2;
106//              }
107//          }
108//
109//          if (arg3 != null){
110//              this.returnStatus = (TObjectName)arg3;
111//          }
112//      }else if(arg1 instanceof TExpressionList){
113//          this.stringValues = (TExpressionList)arg1;
114//      }
115//    }
116
117    public EExecType getExecuteType() {
118        return executeType;
119    }
120
121    private EExecType executeType = EExecType.stmt;
122
123    public void init(Object arg1){
124        executeType = (EExecType)arg1;
125    }
126
127    public void init(Object arg1,Object arg2){
128        init(arg1);
129        switch (executeType){
130            case stmt:
131                break;
132            case module:
133                moduleName = (TObjectName)arg2;
134                //this.moduleName.setObjectType(TObjectName.ttobjProcedureName);
135                this.moduleName.setDbObjectType(EDbObjectType.procedure);
136                break;
137            case expr:
138                preparedValue = (TExpression)arg2;
139                stmtString = (TExpression)arg2;
140                if (preparedValue.getExpressionType() == EExpressionType.function_t){
141                    //
142                    TFunctionCall functionCall = preparedValue.getFunctionCall();
143                    this.moduleName = functionCall.getFunctionName();
144                    this.moduleName.setDbObjectTypeDirectly(EDbObjectType.procedure);
145                    this.executeType = EExecType.module;
146
147                    // EXECUTE module_abc(1,2,4);
148                    if (parameters == null){
149                        parameters = new TExecParameterList();
150                    }
151                    TExpressionList args = functionCall.getArgs();
152                    if (args != null){
153                        for(int i=0;i<args.size();i++){
154                            TExecParameter parameter = new TExecParameter();
155                            parameter.setParameterValue(args.getExpression(i));
156                            parameter.setStartToken(args.getExpression(i).getStartToken());
157                            parameter.setEndToken(args.getExpression(i).getEndToken());
158                            parameters.addExecParameter(parameter);
159                        }
160                    }
161                }
162
163
164
165                break;
166            case module_with_params:
167                moduleName = (TObjectName)arg2;
168                //this.moduleName.setObjectType(TObjectName.ttobjProcedureName);
169                this.moduleName.setDbObjectType(EDbObjectType.procedure);
170                break;
171            case exec_string_cmd:
172                stringValues = (TExpressionList)arg2;
173                break;
174            case task:
175                moduleName = (TObjectName)arg2;
176                this.moduleName.setDbObjectType(EDbObjectType.task);
177                break;
178            case from_stage:
179                fromSource = (TParseTreeNode)arg2;
180                break;
181            case direct:
182                // EXECUTE DIRECT ON ALL Sconst
183                preparedValue = (TExpression)arg2;
184                stmtString = (TExpression)arg2;
185                break;
186            default:
187                break;
188        }
189    }
190
191
192    public void init(Object arg1,Object arg2,Object arg3){
193        if (arg1 == EExecType.direct) {
194            // EXECUTE DIRECT ON (name_list) Sconst
195            init(arg1);
196            directOnNodes = (TObjectNameList)arg2;
197            preparedValue = (TExpression)arg3;
198            stmtString = (TExpression)arg3;
199        } else {
200            init(arg1,arg2);
201            switch (executeType){
202                case stmt:
203                    break;
204                case module:
205                    stringValues = (TExpressionList)arg3;
206                    break;
207                case expr:
208                    usingVariables = (TExpressionList)arg3;
209                    break;
210                case module_with_params:
211                    this.parameters = (TExecParameterList)arg3;
212                    break;
213                case exec_string_cmd:
214                    stringValues = (TExpressionList)arg3;
215                    break;
216                case from_stage:
217                    usingVariables = (TExpressionList)arg3;
218                    break;
219                default:
220                    break;
221            }
222        }
223    }
224
225    public void init(Object arg1,Object arg2,Object arg3,Object arg4){
226        init(arg1,arg2,arg3);
227        switch (executeType){
228            case module_with_params:
229                this.returnStatus = (TObjectName) arg4;
230                break;
231            default:
232                break;
233        }
234    }
235
236//    public void init(Object arg1){
237//        if (arg1 instanceof  TObjectName){
238//            this.moduleName = (TObjectName)arg1;
239//            this.moduleName.setObjectType(TObjectName.ttobjProcedureName);
240//        }else if (arg1 instanceof TExpression){
241//            preparedValue = (TExpression)arg1;
242//            stmtString = (TExpression)arg1;
243//        }
244//    }
245//
246//
247//
248//    public void init(Object arg1,Object arg2){
249//        init(arg1);
250//        if (arg2 instanceof TExecParameterList){
251//            parameters = (TExecParameterList)arg2;
252//        }else if (arg2 instanceof TExpressionList){
253//            stringValues = (TExpressionList)arg2;
254//        }
255//    }
256
257    public TExpression getPreparedValue() {
258        return preparedValue;
259    }
260
261    private TExpression preparedValue;//couchbase
262
263    // Snowflake: EXECUTE IMMEDIATE FROM @stage/path or FROM 'path'
264    private TParseTreeNode fromSource;
265
266    public TParseTreeNode getFromSource() {
267        return fromSource;
268    }
269
270    public void setFromSource(TParseTreeNode fromSource) {
271        this.fromSource = fromSource;
272    }
273
274    // GaussDB: EXECUTE DIRECT ON (nodename, ...) 'sql'
275    private TObjectNameList directOnNodes;
276
277    public TObjectNameList getDirectOnNodes() {
278        return directOnNodes;
279    }
280
281    public void setDirectOnNodes(TObjectNameList directOnNodes) {
282        this.directOnNodes = directOnNodes;
283    }
284
285    // MSSQL: EXEC ('sql') AS USER = 'name' or AS LOGIN = 'name'
286    private TObjectName executeAsUser;
287    private TObjectName executeAsLogin;
288
289    public TObjectName getExecuteAsUser() {
290        return executeAsUser;
291    }
292
293    public void setExecuteAsUser(TObjectName executeAsUser) {
294        this.executeAsUser = executeAsUser;
295    }
296
297    public TObjectName getExecuteAsLogin() {
298        return executeAsLogin;
299    }
300
301    public void setExecuteAsLogin(TObjectName executeAsLogin) {
302        this.executeAsLogin = executeAsLogin;
303    }
304}