001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.informix.*;
006import gudusoft.gsqlparser.stmt.mssql.TMssqlRollback;
007import gudusoft.gsqlparser.stmt.oracle.*;
008
009/**
010 * Informix SQL command resolver.
011 * Contains all Informix-specific SQL command recognition logic.
012 *
013 * @since 3.1.0.9
014 */
015public class TSqlCmdsInformix extends AbstractSqlCmds {
016
017    // Temporary field for statement type during issql processing
018    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
019
020    public TSqlCmdsInformix() {
021        super(EDbVendor.dbvinformix);
022    }
023
024    @Override
025    protected String getToken1Str(int token1) {
026        // Informix vendor-specific reserved words (tokens > TBaseType.rrw_abort)
027        switch (token1) {
028            case TBaseType.rrw_informix_unload:
029                return "unload";
030            case TBaseType.rrw_informix_whenever:
031                return "whenever";
032            case TBaseType.rrw_informix_put:
033                return "put";
034            case TBaseType.rrw_informix_output:
035                return "output";
036            case TBaseType.rrw_informix_info:
037                return "info";
038            case TBaseType.rrw_informix_connect_to:
039                return "connect";
040            default:
041                return null;
042        }
043    }
044
045    @Override
046    protected void initializeCommands() {
047        // Informix commands must be sorted alphabetically by token1
048        // cmd must be sort alphabetically
049        addCmd(TBaseType.rrw_allocate, "collection", ESqlStatementType.sstinformixAllocateCollection);
050        addCmd(TBaseType.rrw_allocate, "descriptor", ESqlStatementType.sstinformixAllocateDescriptor);
051        addCmd(TBaseType.rrw_alter, "access_method", ESqlStatementType.sstinformixAlterAccess_Method);
052        addCmd(TBaseType.rrw_alter, "fragment", ESqlStatementType.sstinformixAlterFragment);
053        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstinformixAlterFunction);
054        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstinformixAlterIndex);
055        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstinformixAlterProcedure);
056        addCmd(TBaseType.rrw_alter, "routine", ESqlStatementType.sstinformixAlterRoutine);
057        addCmd(TBaseType.rrw_alter, "security", "label", "component", ESqlStatementType.sstinformixAlterSecurityLabelComponent);
058        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstinformixAlterSequence);
059        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstinformixAlterTable);
060        addCmd(TBaseType.rrw_alter, "trusted", "context", ESqlStatementType.sstinformixAlterTrustedContext);
061        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstinformixAlterUser);
062        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstinformixBegin);
063        addCmd(TBaseType.rrw_close, "database", ESqlStatementType.sstinformixCloseDatabase);
064        addCmd(TBaseType.rrw_close, ESqlStatementType.sstinformixClose);
065        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstinformixCommit);
066        addCmd(TBaseType.rrw_informix_connect_to, ESqlStatementType.sstinformixConnect);
067        addCmd(TBaseType.rrw_create, "access_method", ESqlStatementType.sstinformixCreateAccess_Method);
068        addCmd(TBaseType.rrw_create, "aggregate", ESqlStatementType.sstinformixCreateAggregate);
069        addCmd(TBaseType.rrw_create, "cast", ESqlStatementType.sstinformixCreateCast);
070        addCmd(TBaseType.rrw_create, "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
071        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstinformixCreateDatabase);
072        addCmd(TBaseType.rrw_create, "dba", "function", ESqlStatementType.sstinformixCreateFunction);
073        addCmd(TBaseType.rrw_create, "dba", "procedure", ESqlStatementType.sstinformixCreateProcedure);
074        addCmd(TBaseType.rrw_create, "default", "user", ESqlStatementType.sstinformixCreateDefaultUser);
075        addCmd(TBaseType.rrw_create, "distinct", "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
076        addCmd(TBaseType.rrw_create, "distinct", "index", ESqlStatementType.sstinformixCreateIndex);
077        addCmd(TBaseType.rrw_create, "distinct", "type", ESqlStatementType.sstinformixCreateDistinctType);
078        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstinformixCreateExternalTable);
079        addCmd(TBaseType.rrw_create, "function", "from", ESqlStatementType.sstinformixCreateFunctionFrom);
080        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstinformixCreateFunction);
081        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstinformixCreateIndex);
082        addCmd(TBaseType.rrw_create, "opaque", "type", ESqlStatementType.sstinformixCreateOpaqueType);
083        addCmd(TBaseType.rrw_create, "opclass", ESqlStatementType.sstinformixCreateOpclass);
084        addCmd(TBaseType.rrw_create, "private", "synonym", ESqlStatementType.sstinformixCreateSynonym);
085        addCmd(TBaseType.rrw_create, "procedure", "from", ESqlStatementType.sstinformixCreateProcedureFrom);
086        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstinformixCreateProcedure);
087        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstinformixCreateSynonym);
088        addCmd(TBaseType.rrw_create, "raw", "table", ESqlStatementType.sstcreatetable);
089        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstinformixCreateRole);
090        addCmd(TBaseType.rrw_create, "routine", "from", ESqlStatementType.sstinformixCreateRoutineFrom);
091        addCmd(TBaseType.rrw_create, "row", "type", ESqlStatementType.sstinformixCreateRowType);
092        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstinformixCreateSchema);
093        addCmd(TBaseType.rrw_create, "security", "label", "component", ESqlStatementType.sstinformixCreateSecurityLabelComponent);
094        addCmd(TBaseType.rrw_create, "security", "label", ESqlStatementType.sstinformixCreateSecurityLabel);
095        addCmd(TBaseType.rrw_create, "security", "policy", ESqlStatementType.sstinformixCreateSecurityPolicy);
096        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstinformixCreateSequence);
097        addCmd(TBaseType.rrw_create, "standard", "table", ESqlStatementType.sstcreatetable);
098        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstinformixCreateSynonym);
099        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
100        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstinformixCreateTempTable);
101        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
102        addCmd(TBaseType.rrw_create, "trusted", "context", ESqlStatementType.sstinformixCreateTrustedContext);
103        addCmd(TBaseType.rrw_create, "unique", "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
104        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstinformixCreateIndex);
105        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstinformixCreateUser);
106        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstinformixCreateView);
107        addCmd(TBaseType.rrw_create, "xadatasource", "type", ESqlStatementType.sstinformixCreateXaDatasourceType);
108        addCmd(TBaseType.rrw_create, "xadatasource", ESqlStatementType.sstinformixCreateXaDatasource);
109        //addCmd(TBaseType.rrw_database, ESqlStatementType.sstinformixDatabase);
110        addCmd(TBaseType.rrw_deallocate, "collection", ESqlStatementType.sstinformixDeallocateCollection);
111        addCmd(TBaseType.rrw_deallocate, "descriptor", ESqlStatementType.sstinformixDeallocateDescriptor);
112        addCmd(TBaseType.rrw_deallocate, "row", ESqlStatementType.sstinformixDeallocateRow);
113        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstinformixDeclare);
114        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
115        addCmd(TBaseType.rrw_describe, "input", ESqlStatementType.sstinformixDescribeInput);
116        addCmd(TBaseType.rrw_describe, ESqlStatementType.sstinformixDescribe);
117        addCmd(TBaseType.rrw_disconnect, ESqlStatementType.sstinformixDisconnect);
118        addCmd(TBaseType.rrw_drop, "access_method", ESqlStatementType.sstinformixDropAccess_Method);
119        addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstinformixDropAggregate);
120        addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstinformixDropCast);
121        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
122        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstinformixDropFunction);
123        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstinformixDropIndex);
124        addCmd(TBaseType.rrw_drop, "opclass", ESqlStatementType.sstinformixDropOpclass);
125        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstinformixDropProcedure);
126        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstinformixDropRole);
127        addCmd(TBaseType.rrw_drop, "routine", ESqlStatementType.sstinformixDropRoutine);
128        addCmd(TBaseType.rrw_drop, "row", "type", ESqlStatementType.sstinformixDropRowType);
129        addCmd(TBaseType.rrw_drop, "security", ESqlStatementType.sstinformixDropSecurity);
130        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstinformixDropSequence);
131        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstinformixDropSynonym);
132        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstinformixDropTable);
133        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstinformixDropTrigger);
134        addCmd(TBaseType.rrw_drop, "trusted", "context", ESqlStatementType.sstinformixDropTrustedContext);
135        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstinformixDropType);
136        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstinformixDropUser);
137        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstinformixDropView);
138        addCmd(TBaseType.rrw_drop, "xadatasource", "type", ESqlStatementType.sstinformixDropXaDatasourceType);
139        addCmd(TBaseType.rrw_drop, "xadatasource", ESqlStatementType.sstinformixDropXaDatasource);
140        addCmd(TBaseType.rrw_exec, ESqlStatementType.sstinformixExecute);
141        addCmd(TBaseType.rrw_execute, "function", ESqlStatementType.sstinformixExecuteFunction);
142        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstinformixExecuteImmediate);
143        addCmd(TBaseType.rrw_execute, "procedure", ESqlStatementType.sstinformixExecuteProcedure);
144        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstinformixExecute);
145        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstinformixFetch);
146        addCmd(TBaseType.rrw_flush, ESqlStatementType.sstinformixFlush);
147        addCmd(TBaseType.rrw_free, ESqlStatementType.sstinformixFree);
148        addCmd(TBaseType.rrw_get, "descriptor", ESqlStatementType.sstinformixGetDescriptor);
149        addCmd(TBaseType.rrw_get, "diagnostics", ESqlStatementType.sstinformixGetDiagnostics);
150        addCmd(TBaseType.rrw_grant, "fragment", ESqlStatementType.sstinformixGrantFragment);
151        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstinformixGrant);
152        addCmd(TBaseType.rrw_informix_info, ESqlStatementType.sstinformixInfo);
153        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
154        addCmd(TBaseType.rrw_load, ESqlStatementType.sstinformixLoad);
155        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstinformixLockTable);
156        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
157        addCmd(TBaseType.rrw_open, ESqlStatementType.sstinformixOpen);
158        addCmd(TBaseType.rrw_informix_output, ESqlStatementType.sstinformixOutput);
159        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstinformixPrepare);
160        addCmd(TBaseType.rrw_informix_put, ESqlStatementType.sstinformixPut);
161        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstinformixReleaseSavepoint);
162        addCmd(TBaseType.rrw_rename, "column", ESqlStatementType.sstinformixRenameColumn);
163        addCmd(TBaseType.rrw_rename, "database", ESqlStatementType.sstinformixRenameDatabase);
164        addCmd(TBaseType.rrw_rename, "index", ESqlStatementType.sstinformixRenameIndex);
165        addCmd(TBaseType.rrw_rename, "security", ESqlStatementType.sstinformixRenameSecurity);
166        addCmd(TBaseType.rrw_rename, "sequence", ESqlStatementType.sstinformixRenameSequence);
167        addCmd(TBaseType.rrw_rename, "table", ESqlStatementType.sstinformixRenameTable);
168        addCmd(TBaseType.rrw_rename, "trusted", "context", ESqlStatementType.sstinformixRenameTrustedContext);
169        addCmd(TBaseType.rrw_rename, "user", ESqlStatementType.sstinformixRenameUser);
170        addCmd(TBaseType.rrw_revoke, "fragment", ESqlStatementType.sstinformixRevokeFragment);
171        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstinformixRevoke);
172        addCmd(TBaseType.rrw_rollback, "work", ESqlStatementType.sstinformixRollbackWork);
173        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstinformixRollbackWork);
174        addCmd(TBaseType.rrw_save, "external", "directives", ESqlStatementType.sstinformixSaveExternalDirectives);
175        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstinformixSavepoint);
176        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
177        addCmd(TBaseType.rrw_set, "autofree", ESqlStatementType.sstinformixSetAutofree);
178        addCmd(TBaseType.rrw_set, "collation", ESqlStatementType.sstinformixSetCollation);
179        addCmd(TBaseType.rrw_set, "connection", ESqlStatementType.sstinformixSetConnection);
180        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstinformixSetConstraints);
181        addCmd(TBaseType.rrw_set, "database", "object", ESqlStatementType.sstinformixSetDatabaseObject);
182        addCmd(TBaseType.rrw_set, "dataskip", ESqlStatementType.sstinformixSetDataskip);
183        addCmd(TBaseType.rrw_set, "debug", "file", ESqlStatementType.sstinformixSetDebugFile);
184        addCmd(TBaseType.rrw_set, "defferred_prepare", ESqlStatementType.sstinformixSetDeferred_Prepare);
185        addCmd(TBaseType.rrw_set, "descriptor", ESqlStatementType.sstinformixSetDescriptor);
186        addCmd(TBaseType.rrw_set, "encryption", "password", ESqlStatementType.sstinformixSetEncryptionPassword);
187        addCmd(TBaseType.rrw_set, "environment", ESqlStatementType.sstinformixSetEnvironment);
188        addCmd(TBaseType.rrw_set, "explain", ESqlStatementType.sstinformixSetExplain);
189        addCmd(TBaseType.rrw_set, "indexes", ESqlStatementType.sstinformixSetIndexes);
190        addCmd(TBaseType.rrw_set, "isolation", ESqlStatementType.sstinformixSetIsolation);
191        addCmd(TBaseType.rrw_set, "lock", "mode", ESqlStatementType.sstinformixSetLockMode);
192        addCmd(TBaseType.rrw_set, "log", ESqlStatementType.sstinformixSetLog);
193        addCmd(TBaseType.rrw_set, "optimization", ESqlStatementType.sstinformixSetOptimization);
194        addCmd(TBaseType.rrw_set, "pdqpriority", ESqlStatementType.sstinformixSetPDQPriority);
195        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstinformixSetRole);
196        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstinformixSetSessionAuthorization);
197        addCmd(TBaseType.rrw_set, "statement", "cache", ESqlStatementType.sstinformixSetStatementCache);
198        addCmd(TBaseType.rrw_set, "transaction", "mode", ESqlStatementType.sstinformixSetTransactionMode);
199        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstinformixSetTransaction);
200        addCmd(TBaseType.rrw_set, "triggers", ESqlStatementType.sstinformixSetTriggers);
201        addCmd(TBaseType.rrw_set, "user", "password", ESqlStatementType.sstinformixSetUserPassword);
202        addCmd(TBaseType.rrw_start, "violations", "table", ESqlStatementType.sstinformixStartViolationsTable);
203        addCmd(TBaseType.rrw_stop, "violations", "table", ESqlStatementType.sstinformixStopViolationsTable);
204        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
205        addCmd(TBaseType.rrw_informix_unload, ESqlStatementType.sstinformixUnload);
206        addCmd(TBaseType.rrw_unlock, "table", ESqlStatementType.sstinformixUnlockTable);
207        addCmd(TBaseType.rrw_update, "statistics", ESqlStatementType.sstinformixUpdateStatistics);
208        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
209        addCmd(TBaseType.rrw_informix_whenever, ESqlStatementType.sstinformixWhenever);
210    }
211
212    @Override
213    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
214        TCustomSqlStatement ret = null;
215
216        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
217
218        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
219                || (pcst.tokencode == TBaseType.cmtslashstar)
220                || (pcst.tokencode == TBaseType.lexspace)
221                || (pcst.tokencode == TBaseType.lexnewline)
222                || (pcst.tokentype == ETokenType.ttsemicolon)) {
223            return null;
224        }
225
226        int lcpos = pcst.posinlist;
227        TSourceTokenList lcsourcetokenlist = pcst.container;
228        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
229
230        //subquery after semicolon or at first line
231        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) { // (
232            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
233            if (k > 0) {
234                ret = new TSelectSqlStatement(this.vendor);
235            }
236
237            return ret;
238        }
239
240        //cte
241        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
242            ret = findcte(pcst);
243            if ((ret != null)) return ret;
244        }
245
246        gnewsqlstatementtype = getStatementTypeForToken(pcst);
247
248        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
249        switch (gnewsqlstatementtype) {    //
250            case sstinvalid: {
251                ret = null;
252
253                if (pstate == EFindSqlStateType.stnormal) {
254                    if (pcst.tokencode == TBaseType.label_begin) {
255                        ret = new TCommonBlock(this.vendor);
256                        gnewsqlstatementtype = ret.sqlstatementtype;
257                    } else if (pcst.tokencode == TBaseType.rrw_declare) {
258                        ret = new TCommonBlock(this.vendor);
259                        gnewsqlstatementtype = ret.sqlstatementtype;
260                    } else if (pcst.tokencode == TBaseType.rrw_begin) {
261                        ret = new TCommonBlock(this.vendor);
262                        gnewsqlstatementtype = ret.sqlstatementtype;
263                    } else if (pcst.tokencode == TBaseType.rrw_procedure) {
264                        ret = new TPlsqlCreateProcedure(this.vendor);
265                        gnewsqlstatementtype = ret.sqlstatementtype;
266                    } else if (pcst.tokencode == TBaseType.rrw_function) {
267                        ret = new TPlsqlCreateFunction(this.vendor);
268                        gnewsqlstatementtype = ret.sqlstatementtype;
269                    } else if (pcst.tokencode == TBaseType.rrw_package) {
270                        ret = new TPlsqlCreatePackage(this.vendor);
271                        gnewsqlstatementtype = ret.sqlstatementtype;
272                    }
273                }
274                break;
275            }
276            case sstselect: {
277                boolean lcisnewsql = true;
278
279                if (pstate != EFindSqlStateType.stnormal) {
280                    if ((lcprevsolidtoken != null)) {
281                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
282                            lcisnewsql = false; //subqery
283                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
284                            lcisnewsql = false;
285                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
286                            lcisnewsql = false;
287                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
288                            lcisnewsql = false;
289                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
290                            lcisnewsql = false;
291                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
292                            lcisnewsql = false;
293                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
294                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
295                                lcisnewsql = false;
296                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
297                                lcisnewsql = false;
298                        }
299
300                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
301                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
302                            if ((lcpprevsolidtoken != null)) {
303                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
304                                    lcisnewsql = false;
305                            }
306                        }
307
308                    }
309
310
311                    if ((lccurrentsqlstatement != null)) {
312                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
313                            lcisnewsql = false;
314                    }
315
316                }
317
318                if (lcisnewsql)
319                    ret = new TSelectSqlStatement(this.vendor);
320
321                break;
322            }
323            case sstinsert: {
324                boolean lcisnewsql = true;
325                if (pstate != EFindSqlStateType.stnormal) {
326                    if ((lccurrentsqlstatement != null)) {
327                        // merge
328                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
329                            if (lcprevsolidtoken != null) {
330                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
331                                    lcisnewsql = false;
332                                }
333                            }
334                        }
335
336                    }
337                }
338
339                if (lcisnewsql)
340                    ret = new TInsertSqlStatement(this.vendor);
341
342                break;
343            }
344            case sstupdate: {
345                boolean lcisnewsql = true;
346                if (pstate != EFindSqlStateType.stnormal) {
347                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
348                    if ((lcprevsolidtoken != null)) { //
349                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
350                            lcisnewsql = false;
351                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
352                            lcisnewsql = false;
353                    }
354
355                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
356                    if ((lcnextsolidtoken != null)) {
357                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
358                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
359                            if (k == 0) lcisnewsql = false;
360                        }
361                    }
362
363
364                    if ((lccurrentsqlstatement != null)) {
365                        // merge
366                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
367                            if (lcprevsolidtoken != null) {
368                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
369                                    lcisnewsql = false;
370                                }
371                            }
372                        }
373                    }
374                }
375
376                if (lcisnewsql) {
377                    ret = new TUpdateSqlStatement(this.vendor);
378                    ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
379                }
380                break;
381            }
382            case sstdelete: {
383                boolean lcisnewsql = true;
384
385                if (pstate != EFindSqlStateType.stnormal) {
386                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
387                    if ((lcprevsolidtoken != null)) {
388                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
389                            lcisnewsql = false;
390                    }
391
392                    if ((lccurrentsqlstatement != null)) {
393                        // merge
394                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
395                            if (lcprevsolidtoken != null) {
396                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
397                                    lcisnewsql = false;
398                                }
399                            }
400                        }
401                    }
402                }
403
404                if (lcisnewsql)
405                    ret = new TDeleteSqlStatement(this.vendor);
406
407                break;
408            }
409            case sstmerge: {
410                ret = new TMergeSqlStatement(this.vendor);
411                ret.sqlstatementtype = gnewsqlstatementtype;
412                break;
413            }
414            case sstinformixCommit: {
415                ret = new TUnknownSqlStatement(this.vendor);
416                ret.sqlstatementtype = gnewsqlstatementtype;
417                break;
418            }
419            case sstinformixSavepoint: {
420                ret = new TUnknownSqlStatement(this.vendor);
421                ret.sqlstatementtype = gnewsqlstatementtype;
422                break;
423            }
424            case sstinformixRevoke: {
425                ret = new TUnknownSqlStatement(this.vendor);
426                ret.sqlstatementtype = gnewsqlstatementtype;
427                break;
428            }
429            case sstinformixGrant: {
430                ret = new TUnknownSqlStatement(this.vendor);
431                ret.sqlstatementtype = gnewsqlstatementtype;
432                break;
433            }
434            case sstTruncate: {
435                ret = new TTruncateStatement(this.vendor);
436                ret.sqlstatementtype = gnewsqlstatementtype;
437                break;
438            }
439            case sstcreatetable:
440            case sstinformixCreateTempTable: {
441                ret = new TCreateTableSqlStatement(this.vendor);
442                break;
443            }
444            case sstinformixCreateView: {
445                ret = new TCreateViewSqlStatement(this.vendor);
446                break;
447            }
448            case sstinformixCreateIndex: {
449                ret = new TCreateIndexSqlStatement(this.vendor);
450                break;
451            }
452            case sstinformixCreateDatabase: {
453                ret = new TCreateDatabaseSqlStatement(this.vendor);
454                break;
455            }
456            case sstinformixDropTable: {
457                ret = new TDropTableSqlStatement(this.vendor);
458                break;
459            }
460            case sstinformixDropView: {
461                ret = new TDropViewSqlStatement(this.vendor);
462                break;
463            }
464            case sstinformixDropIndex: {
465                ret = new TDropIndexSqlStatement(this.vendor);
466                break;
467            }
468            case sstinformixDropRowType: {
469                ret = new TInformixDropRowTypeStmt(this.vendor);
470                break;
471            }
472            case sstinformixDropSequence: {
473                ret = new TDropSequenceStmt(this.vendor);
474                break;
475            }
476            case sstinformixDropSynonym: {
477                ret = new TDropSynonymStmt(this.vendor);
478                break;
479            }
480            case sstinformixAlterTable: {
481                ret = new TAlterTableStatement(this.vendor);
482                break;
483            }
484            case sstinformixCreateProcedure: {
485                ret = new TInformixCreateProcedure(this.vendor);
486                ret.sqlstatementtype = gnewsqlstatementtype;
487                break;
488            }
489            case sstinformixCreateFunction: {
490                ret = new TInformixCreateFunction(this.vendor);
491                ret.sqlstatementtype = gnewsqlstatementtype;
492                break;
493            }
494            case sstcreatetrigger: {
495                ret = new TCreateTriggerStmt(this.vendor);
496                break;
497            }
498            case sstinformixExecuteImmediate: {
499                ret = new TInformixExecuteImmediate(this.vendor);
500                break;
501            }
502            case sstinformixCreateSequence:
503            case sstinformixAlterSequence: {
504                ret = new TCreateSequenceStmt(this.vendor);
505                break;
506            }
507            case sstinformixCreateSynonym: {
508                ret = new TCreateSynonymStmt(this.vendor);
509                break;
510            }
511            case sstinformixExecuteFunction: {
512                ret = new TInformixExecuteFunction(this.vendor);
513                break;
514            }
515            case sstinformixExecuteProcedure: {
516                ret = new TInformixExecuteProcedure(this.vendor);
517                break;
518            }
519            case sstinformixCreateRowType: {
520                ret = new TInformixCreateRowTypeStmt(this.vendor);
521                break;
522            }
523            case sstinformixPut:
524            case sstinformixInfo: {
525                ret = null;
526
527                if (pstate == EFindSqlStateType.stnormal) {
528                    ret = new TUnknownSqlStatement(this.vendor);
529                    ret.sqlstatementtype = gnewsqlstatementtype;
530                }
531                break;
532            }
533            case sstinformixAlterIndex: {
534                ret = new TAlterIndexStmt(this.vendor);
535                break;
536            }
537            case sstinformixRenameColumn:
538            case sstinformixRenameTable:
539            case sstinformixRenameSequence:
540            case sstinformixRenameIndex: {
541                ret = new TRenameStmt(this.vendor);
542                break;
543            }
544            case sstdropdatabase:
545                ret = new TDropDatabaseStmt(this.vendor);
546                break;
547            case sstinformixRollbackWork: {
548                ret = new TMssqlRollback(this.vendor);
549                break;
550            }
551            default: {
552                ret = new TUnknownSqlStatement(this.vendor);
553                ret.sqlstatementtype = gnewsqlstatementtype;
554                break;
555            }
556        }    // case
557
558        return ret;
559    }
560}