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, "explicit", "cast", ESqlStatementType.sstinformixCreateCast);
071        addCmd(TBaseType.rrw_create, "implicit", "cast", ESqlStatementType.sstinformixCreateCast);
072        addCmd(TBaseType.rrw_create, "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
073        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstinformixCreateDatabase);
074        addCmd(TBaseType.rrw_create, "dba", "function", ESqlStatementType.sstinformixCreateFunction);
075        addCmd(TBaseType.rrw_create, "dba", "procedure", ESqlStatementType.sstinformixCreateProcedure);
076        addCmd(TBaseType.rrw_create, "default", "user", ESqlStatementType.sstinformixCreateDefaultUser);
077        addCmd(TBaseType.rrw_create, "distinct", "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
078        addCmd(TBaseType.rrw_create, "distinct", "index", ESqlStatementType.sstinformixCreateIndex);
079        addCmd(TBaseType.rrw_create, "distinct", "type", ESqlStatementType.sstinformixCreateDistinctType);
080        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstinformixCreateExternalTable);
081        addCmd(TBaseType.rrw_create, "function", "from", ESqlStatementType.sstinformixCreateFunctionFrom);
082        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstinformixCreateFunction);
083        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstinformixCreateIndex);
084        addCmd(TBaseType.rrw_create, "opaque", "type", ESqlStatementType.sstinformixCreateOpaqueType);
085        addCmd(TBaseType.rrw_create, "opclass", ESqlStatementType.sstinformixCreateOpclass);
086        addCmd(TBaseType.rrw_create, "private", "synonym", ESqlStatementType.sstinformixCreateSynonym);
087        addCmd(TBaseType.rrw_create, "procedure", "from", ESqlStatementType.sstinformixCreateProcedureFrom);
088        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstinformixCreateProcedure);
089        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstinformixCreateSynonym);
090        addCmd(TBaseType.rrw_create, "raw", "table", ESqlStatementType.sstcreatetable);
091        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstinformixCreateRole);
092        addCmd(TBaseType.rrw_create, "routine", "from", ESqlStatementType.sstinformixCreateRoutineFrom);
093        addCmd(TBaseType.rrw_create, "row", "type", ESqlStatementType.sstinformixCreateRowType);
094        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstinformixCreateSchema);
095        addCmd(TBaseType.rrw_create, "security", "label", "component", ESqlStatementType.sstinformixCreateSecurityLabelComponent);
096        addCmd(TBaseType.rrw_create, "security", "label", ESqlStatementType.sstinformixCreateSecurityLabel);
097        addCmd(TBaseType.rrw_create, "security", "policy", ESqlStatementType.sstinformixCreateSecurityPolicy);
098        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstinformixCreateSequence);
099        addCmd(TBaseType.rrw_create, "standard", "table", ESqlStatementType.sstcreatetable);
100        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstinformixCreateSynonym);
101        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
102        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstinformixCreateTempTable);
103        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
104        addCmd(TBaseType.rrw_create, "trusted", "context", ESqlStatementType.sstinformixCreateTrustedContext);
105        addCmd(TBaseType.rrw_create, "unique", "cluster", "index", ESqlStatementType.sstinformixCreateIndex);
106        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstinformixCreateIndex);
107        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstinformixCreateUser);
108        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstinformixCreateView);
109        addCmd(TBaseType.rrw_create, "xadatasource", "type", ESqlStatementType.sstinformixCreateXaDatasourceType);
110        addCmd(TBaseType.rrw_create, "xadatasource", ESqlStatementType.sstinformixCreateXaDatasource);
111        //addCmd(TBaseType.rrw_database, ESqlStatementType.sstinformixDatabase);
112        addCmd(TBaseType.rrw_deallocate, "collection", ESqlStatementType.sstinformixDeallocateCollection);
113        addCmd(TBaseType.rrw_deallocate, "descriptor", ESqlStatementType.sstinformixDeallocateDescriptor);
114        addCmd(TBaseType.rrw_deallocate, "row", ESqlStatementType.sstinformixDeallocateRow);
115        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstinformixDeclare);
116        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
117        addCmd(TBaseType.rrw_describe, "input", ESqlStatementType.sstinformixDescribeInput);
118        addCmd(TBaseType.rrw_describe, ESqlStatementType.sstinformixDescribe);
119        addCmd(TBaseType.rrw_disconnect, ESqlStatementType.sstinformixDisconnect);
120        addCmd(TBaseType.rrw_drop, "access_method", ESqlStatementType.sstinformixDropAccess_Method);
121        addCmd(TBaseType.rrw_drop, "aggregate", ESqlStatementType.sstinformixDropAggregate);
122        addCmd(TBaseType.rrw_drop, "cast", ESqlStatementType.sstinformixDropCast);
123        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
124        addCmd(TBaseType.rrw_drop, "specific", "function", ESqlStatementType.sstinformixDropFunction);
125        addCmd(TBaseType.rrw_drop, "specific", "procedure", ESqlStatementType.sstinformixDropProcedure);
126        addCmd(TBaseType.rrw_drop, "specific", "routine", ESqlStatementType.sstinformixDropRoutine);
127        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstinformixDropFunction);
128        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstinformixDropIndex);
129        addCmd(TBaseType.rrw_drop, "opclass", ESqlStatementType.sstinformixDropOpclass);
130        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstinformixDropProcedure);
131        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstinformixDropRole);
132        addCmd(TBaseType.rrw_drop, "routine", ESqlStatementType.sstinformixDropRoutine);
133        addCmd(TBaseType.rrw_drop, "row", "type", ESqlStatementType.sstinformixDropRowType);
134        addCmd(TBaseType.rrw_drop, "security", ESqlStatementType.sstinformixDropSecurity);
135        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstinformixDropSequence);
136        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstinformixDropSynonym);
137        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstinformixDropTable);
138        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstinformixDropTrigger);
139        addCmd(TBaseType.rrw_drop, "trusted", "context", ESqlStatementType.sstinformixDropTrustedContext);
140        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstinformixDropType);
141        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstinformixDropUser);
142        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstinformixDropView);
143        addCmd(TBaseType.rrw_drop, "xadatasource", "type", ESqlStatementType.sstinformixDropXaDatasourceType);
144        addCmd(TBaseType.rrw_drop, "xadatasource", ESqlStatementType.sstinformixDropXaDatasource);
145        addCmd(TBaseType.rrw_exec, ESqlStatementType.sstinformixExecute);
146        addCmd(TBaseType.rrw_execute, "function", ESqlStatementType.sstinformixExecuteFunction);
147        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstinformixExecuteImmediate);
148        addCmd(TBaseType.rrw_execute, "procedure", ESqlStatementType.sstinformixExecuteProcedure);
149        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstinformixExecute);
150        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstinformixFetch);
151        addCmd(TBaseType.rrw_flush, ESqlStatementType.sstinformixFlush);
152        addCmd(TBaseType.rrw_free, ESqlStatementType.sstinformixFree);
153        addCmd(TBaseType.rrw_get, "descriptor", ESqlStatementType.sstinformixGetDescriptor);
154        addCmd(TBaseType.rrw_get, "diagnostics", ESqlStatementType.sstinformixGetDiagnostics);
155        addCmd(TBaseType.rrw_grant, "fragment", ESqlStatementType.sstinformixGrantFragment);
156        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstinformixGrant);
157        addCmd(TBaseType.rrw_informix_info, ESqlStatementType.sstinformixInfo);
158        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
159        addCmd(TBaseType.rrw_load, ESqlStatementType.sstinformixLoad);
160        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstinformixLockTable);
161        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
162        addCmd(TBaseType.rrw_open, ESqlStatementType.sstinformixOpen);
163        addCmd(TBaseType.rrw_informix_output, ESqlStatementType.sstinformixOutput);
164        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstinformixPrepare);
165        addCmd(TBaseType.rrw_informix_put, ESqlStatementType.sstinformixPut);
166        addCmd(TBaseType.rrw_release, "savepoint", ESqlStatementType.sstinformixReleaseSavepoint);
167        addCmd(TBaseType.rrw_rename, "column", ESqlStatementType.sstinformixRenameColumn);
168        addCmd(TBaseType.rrw_rename, "database", ESqlStatementType.sstinformixRenameDatabase);
169        addCmd(TBaseType.rrw_rename, "index", ESqlStatementType.sstinformixRenameIndex);
170        addCmd(TBaseType.rrw_rename, "security", ESqlStatementType.sstinformixRenameSecurity);
171        addCmd(TBaseType.rrw_rename, "sequence", ESqlStatementType.sstinformixRenameSequence);
172        addCmd(TBaseType.rrw_rename, "table", ESqlStatementType.sstinformixRenameTable);
173        addCmd(TBaseType.rrw_rename, "trusted", "context", ESqlStatementType.sstinformixRenameTrustedContext);
174        addCmd(TBaseType.rrw_rename, "user", ESqlStatementType.sstinformixRenameUser);
175        addCmd(TBaseType.rrw_revoke, "fragment", ESqlStatementType.sstinformixRevokeFragment);
176        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstinformixRevoke);
177        addCmd(TBaseType.rrw_rollback, "work", ESqlStatementType.sstinformixRollbackWork);
178        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstinformixRollbackWork);
179        addCmd(TBaseType.rrw_save, "external", "directives", ESqlStatementType.sstinformixSaveExternalDirectives);
180        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstinformixSavepoint);
181        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
182        addCmd(TBaseType.rrw_set, "autofree", ESqlStatementType.sstinformixSetAutofree);
183        addCmd(TBaseType.rrw_set, "collation", ESqlStatementType.sstinformixSetCollation);
184        addCmd(TBaseType.rrw_set, "connection", ESqlStatementType.sstinformixSetConnection);
185        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstinformixSetConstraints);
186        addCmd(TBaseType.rrw_set, "database", "object", ESqlStatementType.sstinformixSetDatabaseObject);
187        addCmd(TBaseType.rrw_set, "dataskip", ESqlStatementType.sstinformixSetDataskip);
188        addCmd(TBaseType.rrw_set, "debug", "file", ESqlStatementType.sstinformixSetDebugFile);
189        addCmd(TBaseType.rrw_set, "defferred_prepare", ESqlStatementType.sstinformixSetDeferred_Prepare);
190        // the registration above misspells the option; the real Informix
191        // keyword is DEFERRED_PREPARE
192        addCmd(TBaseType.rrw_set, "deferred_prepare", ESqlStatementType.sstinformixSetDeferred_Prepare);
193        addCmd(TBaseType.rrw_set, "descriptor", ESqlStatementType.sstinformixSetDescriptor);
194        addCmd(TBaseType.rrw_set, "encryption", "password", ESqlStatementType.sstinformixSetEncryptionPassword);
195        addCmd(TBaseType.rrw_set, "environment", ESqlStatementType.sstinformixSetEnvironment);
196        addCmd(TBaseType.rrw_set, "explain", ESqlStatementType.sstinformixSetExplain);
197        addCmd(TBaseType.rrw_set, "indexes", ESqlStatementType.sstinformixSetIndexes);
198        addCmd(TBaseType.rrw_set, "isolation", ESqlStatementType.sstinformixSetIsolation);
199        addCmd(TBaseType.rrw_set, "lock", "mode", ESqlStatementType.sstinformixSetLockMode);
200        addCmd(TBaseType.rrw_set, "log", ESqlStatementType.sstinformixSetLog);
201        addCmd(TBaseType.rrw_set, "optimization", ESqlStatementType.sstinformixSetOptimization);
202        addCmd(TBaseType.rrw_set, "pdqpriority", ESqlStatementType.sstinformixSetPDQPriority);
203        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstinformixSetRole);
204        addCmd(TBaseType.rrw_set, "session", "authorization", ESqlStatementType.sstinformixSetSessionAuthorization);
205        addCmd(TBaseType.rrw_set, "statement", "cache", ESqlStatementType.sstinformixSetStatementCache);
206        addCmd(TBaseType.rrw_set, "transaction", "mode", ESqlStatementType.sstinformixSetTransactionMode);
207        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstinformixSetTransaction);
208        addCmd(TBaseType.rrw_set, "triggers", ESqlStatementType.sstinformixSetTriggers);
209        addCmd(TBaseType.rrw_set, "user", "password", ESqlStatementType.sstinformixSetUserPassword);
210        addCmd(TBaseType.rrw_start, "violations", "table", ESqlStatementType.sstinformixStartViolationsTable);
211        addCmd(TBaseType.rrw_stop, "violations", "table", ESqlStatementType.sstinformixStopViolationsTable);
212        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
213        addCmd(TBaseType.rrw_informix_unload, ESqlStatementType.sstinformixUnload);
214        addCmd(TBaseType.rrw_unlock, "table", ESqlStatementType.sstinformixUnlockTable);
215        addCmd(TBaseType.rrw_update, "statistics", ESqlStatementType.sstinformixUpdateStatistics);
216        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
217        addCmd(TBaseType.rrw_informix_whenever, ESqlStatementType.sstinformixWhenever);
218    }
219
220    @Override
221    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
222        TCustomSqlStatement ret = null;
223
224        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
225
226        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
227                || (pcst.tokencode == TBaseType.cmtslashstar)
228                || (pcst.tokencode == TBaseType.lexspace)
229                || (pcst.tokencode == TBaseType.lexnewline)
230                || (pcst.tokentype == ETokenType.ttsemicolon)) {
231            return null;
232        }
233
234        int lcpos = pcst.posinlist;
235        TSourceTokenList lcsourcetokenlist = pcst.container;
236        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
237
238        //subquery after semicolon or at first line
239        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) { // (
240            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
241            if (k > 0) {
242                ret = new TSelectSqlStatement(this.vendor);
243            }
244
245            return ret;
246        }
247
248        //cte
249        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
250            ret = findcte(pcst);
251            if ((ret != null)) return ret;
252        }
253
254        // REVOKE and LOCK lead words carry no matching raw token constant on
255        // the Informix lexer path, so match them by text (statement start only).
256        if ((pstate == EFindSqlStateType.stnormal) && pcst.issolidtoken()) {
257            String lcLeadWord = pcst.toString();
258            // non-identifier-compare: raw keyword text, not a DB object name
259            if (lcLeadWord.equalsIgnoreCase("REVOKE")) {
260                TSourceToken lcNext = pcst.nextSolidToken();
261                TCustomSqlStatement lcRet = new TUnknownSqlStatement(this.vendor);
262                if ((lcNext != null) && lcNext.toString().equalsIgnoreCase("FRAGMENT")) { // non-identifier-compare: keyword text
263                    lcRet.sqlstatementtype = ESqlStatementType.sstinformixRevokeFragment;
264                } else {
265                    lcRet.sqlstatementtype = ESqlStatementType.sstinformixRevoke;
266                }
267                return lcRet;
268            } else if (lcLeadWord.equalsIgnoreCase("LOCK")) { // non-identifier-compare: keyword text
269                TSourceToken lcNext = pcst.nextSolidToken();
270                if ((lcNext != null) && lcNext.toString().equalsIgnoreCase("TABLE")) { // non-identifier-compare: keyword text
271                    TCustomSqlStatement lcRet = new TUnknownSqlStatement(this.vendor);
272                    lcRet.sqlstatementtype = ESqlStatementType.sstinformixLockTable;
273                    return lcRet;
274                }
275            }
276        }
277
278        gnewsqlstatementtype = getStatementTypeForToken(pcst);
279
280        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
281        switch (gnewsqlstatementtype) {    //
282            case sstinvalid: {
283                ret = null;
284
285                if (pstate == EFindSqlStateType.stnormal) {
286                    if (pcst.tokencode == TBaseType.label_begin) {
287                        ret = new TCommonBlock(this.vendor);
288                        gnewsqlstatementtype = ret.sqlstatementtype;
289                    } else if (pcst.tokencode == TBaseType.rrw_declare) {
290                        ret = new TCommonBlock(this.vendor);
291                        gnewsqlstatementtype = ret.sqlstatementtype;
292                    } else if (pcst.tokencode == TBaseType.rrw_begin) {
293                        ret = new TCommonBlock(this.vendor);
294                        gnewsqlstatementtype = ret.sqlstatementtype;
295                    } else if (pcst.tokencode == TBaseType.rrw_procedure) {
296                        ret = new TPlsqlCreateProcedure(this.vendor);
297                        gnewsqlstatementtype = ret.sqlstatementtype;
298                    } else if (pcst.tokencode == TBaseType.rrw_function) {
299                        ret = new TPlsqlCreateFunction(this.vendor);
300                        gnewsqlstatementtype = ret.sqlstatementtype;
301                    } else if (pcst.tokencode == TBaseType.rrw_package) {
302                        ret = new TPlsqlCreatePackage(this.vendor);
303                        gnewsqlstatementtype = ret.sqlstatementtype;
304                    }
305                }
306                break;
307            }
308            case sstselect: {
309                boolean lcisnewsql = true;
310
311                if (pstate != EFindSqlStateType.stnormal) {
312                    if ((lcprevsolidtoken != null)) {
313                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
314                            lcisnewsql = false; //subqery
315                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
316                            lcisnewsql = false;
317                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
318                            lcisnewsql = false;
319                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
320                            lcisnewsql = false;
321                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
322                            lcisnewsql = false;
323                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
324                            lcisnewsql = false;
325                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
326                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
327                                lcisnewsql = false;
328                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
329                                lcisnewsql = false;
330                        }
331
332                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
333                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
334                            if ((lcpprevsolidtoken != null)) {
335                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
336                                    lcisnewsql = false;
337                            }
338                        }
339
340                    }
341
342
343                    if ((lccurrentsqlstatement != null)) {
344                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
345                            lcisnewsql = false;
346                    }
347
348                }
349
350                if (lcisnewsql)
351                    ret = new TSelectSqlStatement(this.vendor);
352
353                break;
354            }
355            case sstinsert: {
356                boolean lcisnewsql = true;
357                if (pstate != EFindSqlStateType.stnormal) {
358                    if ((lccurrentsqlstatement != null)) {
359                        // merge
360                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
361                            if (lcprevsolidtoken != null) {
362                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
363                                    lcisnewsql = false;
364                                }
365                            }
366                        }
367
368                    }
369                }
370
371                if (lcisnewsql)
372                    ret = new TInsertSqlStatement(this.vendor);
373
374                break;
375            }
376            case sstupdate: {
377                boolean lcisnewsql = true;
378                if (pstate != EFindSqlStateType.stnormal) {
379                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
380                    if ((lcprevsolidtoken != null)) { //
381                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
382                            lcisnewsql = false;
383                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
384                            lcisnewsql = false;
385                    }
386
387                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
388                    if ((lcnextsolidtoken != null)) {
389                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
390                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
391                            if (k == 0) lcisnewsql = false;
392                        }
393                    }
394
395
396                    if ((lccurrentsqlstatement != null)) {
397                        // merge
398                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
399                            if (lcprevsolidtoken != null) {
400                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
401                                    lcisnewsql = false;
402                                }
403                            }
404                        }
405                    }
406                }
407
408                if (lcisnewsql) {
409                    ret = new TUpdateSqlStatement(this.vendor);
410                    ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
411                }
412                break;
413            }
414            case sstdelete: {
415                boolean lcisnewsql = true;
416
417                if (pstate != EFindSqlStateType.stnormal) {
418                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
419                    if ((lcprevsolidtoken != null)) {
420                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
421                            lcisnewsql = false;
422                    }
423
424                    if ((lccurrentsqlstatement != null)) {
425                        // merge
426                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
427                            if (lcprevsolidtoken != null) {
428                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
429                                    lcisnewsql = false;
430                                }
431                            }
432                        }
433                    }
434                }
435
436                if (lcisnewsql)
437                    ret = new TDeleteSqlStatement(this.vendor);
438
439                break;
440            }
441            case sstmerge: {
442                ret = new TMergeSqlStatement(this.vendor);
443                ret.sqlstatementtype = gnewsqlstatementtype;
444                break;
445            }
446            case sstinformixCommit: {
447                ret = new TUnknownSqlStatement(this.vendor);
448                ret.sqlstatementtype = gnewsqlstatementtype;
449                break;
450            }
451            case sstinformixSavepoint: {
452                ret = new TUnknownSqlStatement(this.vendor);
453                ret.sqlstatementtype = gnewsqlstatementtype;
454                break;
455            }
456            case sstinformixRevoke: {
457                ret = new TUnknownSqlStatement(this.vendor);
458                ret.sqlstatementtype = gnewsqlstatementtype;
459                break;
460            }
461            case sstinformixGrant: {
462                ret = new TUnknownSqlStatement(this.vendor);
463                ret.sqlstatementtype = gnewsqlstatementtype;
464                break;
465            }
466            case sstTruncate: {
467                ret = new TTruncateStatement(this.vendor);
468                ret.sqlstatementtype = gnewsqlstatementtype;
469                break;
470            }
471            case sstcreatetable:
472            case sstinformixCreateTempTable: {
473                ret = new TCreateTableSqlStatement(this.vendor);
474                break;
475            }
476            case sstinformixCreateView: {
477                ret = new TCreateViewSqlStatement(this.vendor);
478                break;
479            }
480            case sstinformixCreateIndex: {
481                ret = new TCreateIndexSqlStatement(this.vendor);
482                break;
483            }
484            case sstinformixCreateDatabase: {
485                ret = new TCreateDatabaseSqlStatement(this.vendor);
486                break;
487            }
488            case sstinformixDropTable: {
489                ret = new TDropTableSqlStatement(this.vendor);
490                break;
491            }
492            case sstinformixDropView: {
493                ret = new TDropViewSqlStatement(this.vendor);
494                break;
495            }
496            case sstinformixDropIndex: {
497                ret = new TDropIndexSqlStatement(this.vendor);
498                break;
499            }
500            case sstinformixDropRowType: {
501                ret = new TInformixDropRowTypeStmt(this.vendor);
502                break;
503            }
504            case sstinformixDropSequence: {
505                ret = new TDropSequenceStmt(this.vendor);
506                break;
507            }
508            case sstinformixDropSynonym: {
509                ret = new TDropSynonymStmt(this.vendor);
510                break;
511            }
512            case sstinformixAlterTable: {
513                ret = new TAlterTableStatement(this.vendor);
514                break;
515            }
516            case sstinformixCreateProcedure: {
517                ret = new TInformixCreateProcedure(this.vendor);
518                ret.sqlstatementtype = gnewsqlstatementtype;
519                break;
520            }
521            case sstinformixCreateFunction: {
522                ret = new TInformixCreateFunction(this.vendor);
523                ret.sqlstatementtype = gnewsqlstatementtype;
524                break;
525            }
526            case sstcreatetrigger: {
527                ret = new TCreateTriggerStmt(this.vendor);
528                break;
529            }
530            case sstinformixExecuteImmediate: {
531                ret = new TInformixExecuteImmediate(this.vendor);
532                break;
533            }
534            case sstinformixCreateSequence:
535            case sstinformixAlterSequence: {
536                ret = new TCreateSequenceStmt(this.vendor);
537                break;
538            }
539            case sstinformixCreateSynonym: {
540                ret = new TCreateSynonymStmt(this.vendor);
541                break;
542            }
543            case sstinformixExecuteFunction: {
544                ret = new TInformixExecuteFunction(this.vendor);
545                break;
546            }
547            case sstinformixExecuteProcedure: {
548                ret = new TInformixExecuteProcedure(this.vendor);
549                break;
550            }
551            case sstinformixCreateRowType: {
552                ret = new TInformixCreateRowTypeStmt(this.vendor);
553                break;
554            }
555            case sstinformixPut:
556            case sstinformixInfo: {
557                ret = null;
558
559                if (pstate == EFindSqlStateType.stnormal) {
560                    ret = new TUnknownSqlStatement(this.vendor);
561                    ret.sqlstatementtype = gnewsqlstatementtype;
562                }
563                break;
564            }
565            case sstinformixAlterIndex: {
566                ret = new TAlterIndexStmt(this.vendor);
567                break;
568            }
569            case sstinformixRenameColumn:
570            case sstinformixRenameTable:
571            case sstinformixRenameSequence:
572            case sstinformixRenameIndex: {
573                ret = new TRenameStmt(this.vendor);
574                break;
575            }
576            case sstdropdatabase:
577                ret = new TDropDatabaseStmt(this.vendor);
578                break;
579            case sstinformixRollbackWork: {
580                ret = new TMssqlRollback(this.vendor);
581                break;
582            }
583            default: {
584                ret = new TUnknownSqlStatement(this.vendor);
585                ret.sqlstatementtype = gnewsqlstatementtype;
586                break;
587            }
588        }    // case
589
590        return ret;
591    }
592}