001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.db2.*;
006
007/**
008 * DB2 SQL command resolver.
009 * Handles DB2-specific statement recognition.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsDb2 extends AbstractSqlCmds {
014
015    public TSqlCmdsDb2() {
016        super(EDbVendor.dbvdb2);
017    }
018
019    @Override
020    protected String getToken1Str(int token1) {
021        // Handle DB2-specific reserved words (token codes > TBaseType.rrw_abort)
022        switch (token1) {
023            case TBaseType.rrw_db2_label:
024                return "label";
025            case TBaseType.rrw_db2_runstats:
026                return "runstats";
027            default:
028                return null;
029        }
030    }
031
032    @Override
033    protected void initializeCommands() {
034        // DB2 commands must be sorted alphabetically by token1
035
036        addCmd(TBaseType.rrw_allocate, "cursor", ESqlStatementType.sstdb2allocatecursor);
037
038        // ALTER commands
039        addCmd(TBaseType.rrw_alter, "bufferpool", ESqlStatementType.sstdb2alterbufferpool);
040        addCmd(TBaseType.rrw_alter, "database", "partition", "group", ESqlStatementType.sstdb2alterdatabasepartitiongroup);
041        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstdb2alterfunction);
042        addCmd(TBaseType.rrw_alter, "method", ESqlStatementType.sstdb2altermethod);
043        addCmd(TBaseType.rrw_alter, "nickname", ESqlStatementType.sstdb2alternickname);
044        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstdb2alterprocedure);
045        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstdb2altersequence);
046        addCmd(TBaseType.rrw_alter, "server", ESqlStatementType.sstdb2alterserver);
047        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
048        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstdb2altertablespace);
049        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstdb2altertype);
050        addCmd(TBaseType.rrw_alter, "user", "mapping", ESqlStatementType.sstdb2alterusermapping);
051        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstdb2alterview);
052        addCmd(TBaseType.rrw_alter, "wrapper", ESqlStatementType.sstdb2alterwrapper);
053
054        addCmd(TBaseType.rrw_associate, "locators", ESqlStatementType.sstdb2associatelocators);
055        addCmd(TBaseType.rrw_begin, "declare", "section", ESqlStatementType.sstdb2begindeclaresection);
056        addCmd(TBaseType.rrw_call, ESqlStatementType.sstdb2call);
057        addCmd(TBaseType.rrw_case, ESqlStatementType.sstdb2case);
058        addCmd(TBaseType.rrw_close, ESqlStatementType.sstdb2close);
059        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstdb2comment);
060        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstdb2commit);
061        addCmd(TBaseType.rrw_connect, ESqlStatementType.sstdb2connect);
062
063        // CREATE commands - Note: longer patterns BEFORE shorter ones
064        addCmd(TBaseType.rrw_create, "or", "replace", "public", "alias", ESqlStatementType.sstdb2createalias);
065        addCmd(TBaseType.rrw_create, "or", "replace", "alias", ESqlStatementType.sstdb2createalias);
066        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction);
067        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
068        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstdb2createtrigger);
069        addCmd(TBaseType.rrw_create, "or", "replace", "variable", ESqlStatementType.sstdb2createvariable);
070        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
071        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
072        addCmd(TBaseType.rrw_create, "large", "tablespace", ESqlStatementType.sstcreateTablespace);
073        addCmd(TBaseType.rrw_create, "database", "partition", "group", ESqlStatementType.sstdb2createdatabasepartitiongroup);
074        addCmd(TBaseType.rrw_create, "distinct", "type", ESqlStatementType.sstdb2createdistincttype);
075        addCmd(TBaseType.rrw_create, "function", "mapping", ESqlStatementType.sstdb2createfunctionmapping);
076        addCmd(TBaseType.rrw_create, "index", "extension", ESqlStatementType.sstdb2createindexextension);
077        addCmd(TBaseType.rrw_create, "type", "mapping", ESqlStatementType.sstdb2createtypemapping);
078        addCmd(TBaseType.rrw_create, "user", "mapping", ESqlStatementType.sstdb2createusermapping);
079        addCmd(TBaseType.rrw_create, "audit", "policy", ESqlStatementType.sstcreateauditpolicy);
080        addCmd(TBaseType.rrw_create, "public", "alias", ESqlStatementType.sstdb2createalias);
081        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstcreatesynonym);
082        addCmd(TBaseType.rrw_create, "summary", "table", ESqlStatementType.sstcreatetable);
083        addCmd(TBaseType.rrw_create, "alias", ESqlStatementType.sstdb2createalias);
084        addCmd(TBaseType.rrw_create, "bufferpool", ESqlStatementType.sstdb2createbufferpool);
085        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
086        addCmd(TBaseType.rrw_create, "eventmonitor", ESqlStatementType.sstdb2createeventmonitor);
087        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction);
088        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstcreateindex);
089        addCmd(TBaseType.rrw_create, "method", ESqlStatementType.sstdb2createmethod);
090        addCmd(TBaseType.rrw_create, "nickname", ESqlStatementType.sstdb2createnickname);
091        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
092        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstcreaterole);
093        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstdb2createschema);
094        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstdb2createsequence);
095        addCmd(TBaseType.rrw_create, "server", ESqlStatementType.sstdb2createserver);
096        addCmd(TBaseType.rrw_create, "stogroup", ESqlStatementType.sstdb2createstogroup);
097        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstcreatesynonym);
098        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
099        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstcreateTablespace);
100        addCmd(TBaseType.rrw_create, "transform", ESqlStatementType.sstdb2createtransform);
101        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstdb2createtrigger);
102        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstdb2createtype);
103        addCmd(TBaseType.rrw_create, "variable", ESqlStatementType.sstdb2createvariable);
104        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
105        addCmd(TBaseType.rrw_create, "wrapper", ESqlStatementType.sstdb2createwrapper);
106        addCmd(TBaseType.rrw_create, "*", "index", ESqlStatementType.sstcreateindex);
107
108        // DECLARE commands
109        addCmd(TBaseType.rrw_declare, "global", "temporary", "table", ESqlStatementType.sstdb2declareglobaltemporarytable);
110        addCmd(TBaseType.rrw_declare, "*", "cursor", ESqlStatementType.sstdb2declarecursor);
111
112        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
113        addCmd(TBaseType.rrw_describe, ESqlStatementType.sstdb2describe);
114        addCmd(TBaseType.rrw_disconnect, ESqlStatementType.sstdb2disconnect);
115
116        // DROP commands - longer patterns first
117        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
118        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
119        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
120        addCmd(TBaseType.rrw_drop, ESqlStatementType.sstdb2drop);
121
122        addCmd(TBaseType.rrw_end, "declare", "section", ESqlStatementType.sstdb2enddeclaresection);
123
124        // EXECUTE commands
125        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstdb2executeimmediate);
126        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstdb2execute);
127
128        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstdb2explain);
129        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstdb2fetch);
130
131        // FLUSH commands
132        addCmd(TBaseType.rrw_flush, "event", "monitor", ESqlStatementType.sstdb2flusheventmonitor);
133        addCmd(TBaseType.rrw_flush, "package", "cache", ESqlStatementType.sstdb2flushpackagecache);
134
135        addCmd(TBaseType.rrw_for, ESqlStatementType.sstdb2for);
136        addCmd(TBaseType.rrw_free, "locator", ESqlStatementType.sstdb2freelocator);
137        addCmd(TBaseType.rrw_get, "diagnostics", ESqlStatementType.sstgetdiagnostics);
138        addCmd(TBaseType.rrw_goto, ESqlStatementType.sstdb2goto);
139        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstdb2grant);
140        addCmd(TBaseType.rrw_if, ESqlStatementType.sstdb2if);
141        addCmd(TBaseType.rrw_include, ESqlStatementType.sstdb2include);
142        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
143        addCmd(TBaseType.rrw_iterate, ESqlStatementType.sstdb2iterate);
144        addCmd(TBaseType.rrw_db2_label, "on", ESqlStatementType.sstdb2labelOn);
145        addCmd(TBaseType.rrw_leave, ESqlStatementType.sstdb2leave);
146        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstdb2locktable);
147        addCmd(TBaseType.rrw_loop, ESqlStatementType.sstdb2loop);
148        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
149        addCmd(TBaseType.rrw_open, ESqlStatementType.sstdb2open);
150        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstdb2prepare);
151        addCmd(TBaseType.rrw_refresh, "table", ESqlStatementType.sstdb2refreshtable);
152
153        // RELEASE commands
154        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstdb2releasesavepoint);
155        addCmd(TBaseType.rrw_release, ESqlStatementType.sstdb2release);
156
157        // RENAME commands
158        addCmd(TBaseType.rrw_rename, "tablespace", ESqlStatementType.sstdb2renametablespace);
159        addCmd(TBaseType.rrw_rename, ESqlStatementType.sstdb2rename);
160
161        addCmd(TBaseType.rrw_repeat, ESqlStatementType.sstdb2repeat);
162        addCmd(TBaseType.rrw_resignal, ESqlStatementType.sstdb2resignal);
163        addCmd(TBaseType.rrw_return, ESqlStatementType.sstdb2return);
164        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstdb2revoke);
165        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstdb2rollback);
166        addCmd(TBaseType.rrw_db2_runstats, ESqlStatementType.sstRunStats);
167        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstdb2savepoint);
168        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
169
170        // SET commands - longer patterns first
171        addCmd(TBaseType.rrw_set, "current", "default", "transform", "group", ESqlStatementType.sstdb2setcurrentdefaulttransformgroup);
172        addCmd(TBaseType.rrw_set, "current", "maintained", "table", "types", ESqlStatementType.sstdb2setcurrentmaintainedtabletypesforoptimization);
173        addCmd(TBaseType.rrw_set, "current", "explain", "snapshot", ESqlStatementType.sstdb2setcurrentexplainsnapshot);
174        addCmd(TBaseType.rrw_set, "current", "explain", "mode", ESqlStatementType.sstdb2setcurrentexplainmode);
175        addCmd(TBaseType.rrw_set, "current", "lock", "timeout", ESqlStatementType.sstdb2setcurrentlocktimeout);
176        addCmd(TBaseType.rrw_set, "current", "package", "path", ESqlStatementType.sstdb2setcurrentpackagepath);
177        addCmd(TBaseType.rrw_set, "current", "query", "optimization", ESqlStatementType.sstdb2setcurrentqueryoptimization);
178        addCmd(TBaseType.rrw_set, "current", "refresh", "age", ESqlStatementType.sstdb2setcurrentrefreshage);
179        addCmd(TBaseType.rrw_set, "encryption", "password", ESqlStatementType.sstdb2setencryptionpassword);
180        addCmd(TBaseType.rrw_set, "event", "monitor", "state", ESqlStatementType.sstdb2seteventmonitorstate);
181        addCmd(TBaseType.rrw_set, "server", "option", ESqlStatementType.sstdb2setserveroption);
182        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstdb2setsessionauthorization);
183        addCmd(TBaseType.rrw_set, "current", "degree", ESqlStatementType.sstdb2setcurrentdegree);
184        addCmd(TBaseType.rrw_set, "current", "isolation", ESqlStatementType.sstdb2setcurrentisolation);
185        addCmd(TBaseType.rrw_set, "current", "packageset", ESqlStatementType.sstdb2setcurrentpackageset);
186        addCmd(TBaseType.rrw_set, "current", "schema", ESqlStatementType.sstdb2setschema);
187        addCmd(TBaseType.rrw_set, "connection", ESqlStatementType.sstdb2setconnection);
188        addCmd(TBaseType.rrw_set, "integrity", ESqlStatementType.sstdb2setintegrity);
189        addCmd(TBaseType.rrw_set, "passthru", ESqlStatementType.sstdb2setpassthru);
190        addCmd(TBaseType.rrw_set, "path", ESqlStatementType.sstdb2setpath);
191        addCmd(TBaseType.rrw_set, "schema", ESqlStatementType.sstdb2setschema);
192        addCmd(TBaseType.rrw_set, ESqlStatementType.sstdb2set);
193
194        addCmd(TBaseType.rrw_signal, ESqlStatementType.sstdb2signal);
195        addCmd(TBaseType.rrw_terminate, ESqlStatementType.sstdb2terminate);
196        addCmd(TBaseType.rrw_truncate, ESqlStatementType.ssttruncatetable);
197
198        // UPDATE commands
199        addCmd(TBaseType.rrw_update, "command", ESqlStatementType.sstdb2updateCommand);
200        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
201
202        addCmd(TBaseType.rrw_while, ESqlStatementType.sstdb2while);
203    }
204
205    @Override
206    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
207        TCustomSqlStatement ret = null;
208        int k;
209        boolean lcisnewsql;
210        TSourceToken lcpprevsolidtoken, lcnextsolidtoken;
211
212        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
213
214        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
215                || (pcst.tokencode == TBaseType.cmtslashstar)
216                || (pcst.tokencode == TBaseType.lexspace)
217                || (pcst.tokencode == TBaseType.lexnewline)
218                || (pcst.tokentype == ETokenType.ttsemicolon)) {
219            return ret;
220        }
221
222        int lcpos = pcst.posinlist;
223        TSourceTokenList lcsourcetokenlist = pcst.container;
224        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
225
226        // subquery after semicolon || at first line
227        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) { // (
228            k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
229            if (k > 0) {
230                ret = new TSelectSqlStatement(this.vendor);
231            }
232
233            return ret;
234        }
235
236        // cte
237        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
238            ret = findcte(pcst);
239            if (TBaseType.assigned(ret)) return ret;
240        }
241
242        // values
243        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_values)) {
244            ret = new TSelectSqlStatement(this.vendor);
245            return ret;
246        }
247
248        // db2 scriptoptions
249        if (pcst.tokencode == TBaseType.scriptoptions) {
250            ret = new TDb2ScriptOptionStmt(this.vendor);
251            return ret;
252        }
253
254        gnewsqlstatementtype = getStatementTypeForToken(pcst);
255
256        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
257        switch (gnewsqlstatementtype) {
258            case sstinvalid: {
259                ret = null;
260                if (pcst.tokencode == TBaseType.rrw_begin) {
261                    ret = new TCommonBlock(this.vendor);
262                    gnewsqlstatementtype = ret.sqlstatementtype;
263                }
264                break;
265            }
266            case sstselect: {
267                lcisnewsql = true;
268
269                if (pstate != EFindSqlStateType.stnormal) {
270                    if (TBaseType.assigned(lcprevsolidtoken)) {
271                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
272                            lcisnewsql = false; // subquery
273                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
274                            lcisnewsql = false;
275                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
276                            lcisnewsql = false;
277                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
278                            lcisnewsql = false;
279                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
280                            lcisnewsql = false;
281                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
282                            lcisnewsql = false;
283                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
284                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
285                                lcisnewsql = false;
286                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
287                                lcisnewsql = false;
288                        }
289
290                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
291                            lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
292                            if (TBaseType.assigned(lcpprevsolidtoken)) {
293                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
294                                    lcisnewsql = false;
295                            }
296                        }
297                    }
298
299                    if (TBaseType.assigned(lccurrentsqlstatement)) {
300                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert) {
301                            lcisnewsql = false;
302                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstselect) {
303                            if (lccurrentsqlstatement.isctequery)
304                                lcisnewsql = false;
305                        }
306                    }
307                }
308
309                if (lcisnewsql)
310                    ret = new TSelectSqlStatement(this.vendor);
311                break;
312            }
313            case sstinsert: {
314                lcisnewsql = true;
315                if (pstate != EFindSqlStateType.stnormal) {
316                    if (TBaseType.assigned(lccurrentsqlstatement)) {
317                    }
318                }
319
320                if (lcisnewsql)
321                    ret = new TInsertSqlStatement(this.vendor);
322                break;
323            }
324            case sstupdate: {
325                lcisnewsql = true;
326                if (pstate != EFindSqlStateType.stnormal) {
327                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
328                    if (TBaseType.assigned(lcprevsolidtoken)) {
329                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
330                            lcisnewsql = false;
331                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
332                            lcisnewsql = false;
333                    }
334
335                    lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
336                    if (TBaseType.assigned(lcnextsolidtoken)) {
337                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
338                            k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
339                            if (k == 0) lcisnewsql = false;
340                        }
341                    }
342
343                    if (TBaseType.assigned(lccurrentsqlstatement)) {
344                    }
345                }
346
347                if (lcisnewsql) {
348                    ret = new TUpdateSqlStatement(this.vendor);
349                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
350                }
351                break;
352            }
353            case sstdelete: {
354                lcisnewsql = true;
355
356                if (pstate != EFindSqlStateType.stnormal) {
357                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
358                    if (TBaseType.assigned(lcprevsolidtoken)) {
359                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
360                            lcisnewsql = false;
361                    }
362
363                    if (TBaseType.assigned(lccurrentsqlstatement)) {
364                    }
365                }
366
367                if (lcisnewsql)
368                    ret = new TDeleteSqlStatement(this.vendor);
369                break;
370            }
371            case sstmerge: {
372                ret = new TMergeSqlStatement(this.vendor);
373                ret.sqlstatementtype = gnewsqlstatementtype;
374                break;
375            }
376            case sstcommit: {
377                ret = new TUnknownSqlStatement(this.vendor);
378                ret.sqlstatementtype = gnewsqlstatementtype;
379                break;
380            }
381            case sstrollback: {
382                ret = new TUnknownSqlStatement(this.vendor);
383                ret.sqlstatementtype = gnewsqlstatementtype;
384                break;
385            }
386            case sstsavepoint: {
387                ret = new TUnknownSqlStatement(this.vendor);
388                ret.sqlstatementtype = gnewsqlstatementtype;
389                break;
390            }
391            case sstRevoke: {
392                ret = new TUnknownSqlStatement(this.vendor);
393                ret.sqlstatementtype = gnewsqlstatementtype;
394                break;
395            }
396            case sstcreatetable: {
397                ret = new TCreateTableSqlStatement(this.vendor);
398                break;
399            }
400            case sstcreateview: {
401                ret = new TCreateViewSqlStatement(this.vendor);
402                break;
403            }
404            case sstcreateindex: {
405                ret = new TCreateIndexSqlStatement(this.vendor);
406                break;
407            }
408            case sstcreatedatabase: {
409                ret = new TCreateDatabaseSqlStatement(this.vendor);
410                break;
411            }
412            case sstdroptable: {
413                ret = new TDropTableSqlStatement(this.vendor);
414                break;
415            }
416            case sstdropview: {
417                ret = new TDropViewSqlStatement(this.vendor);
418                break;
419            }
420            case sstdropindex: {
421                ret = new TDropIndexSqlStatement(this.vendor);
422                break;
423            }
424            case sstaltertable: {
425                ret = new TAlterTableStatement(this.vendor);
426                break;
427            }
428            case sstaltersession: {
429                ret = new TAlterSessionStatement(this.vendor);
430                break;
431            }
432            case sstdb2set: {
433                ret = new TDb2SetVariableStmt(this.vendor);
434                break;
435            }
436            case sstdb2setschema: {
437                ret = new TSetDatabaseObjectStmt(this.vendor);
438                break;
439            }
440            case sstdb2call: {
441                ret = new TDb2CallStmt(this.vendor);
442                break;
443            }
444            case sstdb2declarecursor: {
445                ret = new TDb2DeclareCursorStatement(this.vendor);
446                break;
447            }
448            case sstcreateprocedure: {
449                ret = new TCreateProcedureStmt(this.vendor);
450                break;
451            }
452            case sstcreatefunction: {
453                ret = new TCreateFunctionStmt(this.vendor);
454                break;
455            }
456            case sstdb2createtrigger: {
457                ret = new TCreateTriggerStmt(this.vendor);
458                break;
459            }
460            case sstdb2return: {
461                ret = new TDb2ReturnStmt(this.vendor);
462                break;
463            }
464            case sstdb2refreshtable:
465            case sstdb2connect:
466            case sstdb2terminate:
467            case sstdb2execute: {
468                ret = new TDb2DummyStmt(this.vendor);
469                break;
470            }
471            case sstdb2createalias: {
472                ret = new TCreateAliasStmt(this.vendor);
473                break;
474            }
475            case sstcreateauditpolicy:
476                ret = new TCreateAuditPolicyStmt(this.vendor);
477                break;
478            case sstdb2comment:
479                ret = new TCommentOnSqlStmt(this.vendor);
480                break;
481            case sstdb2createvariable:
482                ret = new TCreateVariableStmt(this.vendor);
483                break;
484            case sstcreaterole:
485                ret = new TCreateRoleStmt(this.vendor);
486                break;
487            case sstcreateTablespace:
488                ret = new TCreateTablespaceStmt(this.vendor);
489                break;
490            case sstRunStats:
491                ret = new TRunStats(this.vendor);
492                break;
493            case ssttruncatetable: {
494                ret = new TTruncateStatement(this.vendor);
495                break;
496            }
497            case sstcreatesynonym:
498                ret = new TCreateSynonymStmt(this.vendor);
499                break;
500            default: {
501                ret = new TUnknownSqlStatement(this.vendor);
502                ret.sqlstatementtype = gnewsqlstatementtype;
503                break;
504            }
505        }
506
507        return ret;
508    }
509}