001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.oracle.*;
006
007/**
008 * Oracle SQL command resolver.
009 * Contains all Oracle-specific SQL command recognition logic.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsOracle extends AbstractSqlCmds {
014
015    // Temporary field for statement type during issql processing
016    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
017
018    public TSqlCmdsOracle() {
019        super(EDbVendor.dbvoracle);
020    }
021
022    @Override
023    protected String getToken1Str(int token1) {
024        // Oracle currently has no vendor-specific reserved words requiring token1Str
025        // Override this method when Oracle-specific tokens > TBaseType.rrw_abort are added
026        return null;
027    }
028
029    @Override
030    protected void initializeCommands() {
031        // Oracle commands must be sorted alphabetically by token1
032        addCmd(TBaseType.rrw_alter, "cluster", ESqlStatementType.sstoraclealtercluster);
033        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstoraclealterdatabase);
034        addCmd(TBaseType.rrw_alter, "dimension", ESqlStatementType.sstoraclealterdimension);
035        addCmd(TBaseType.rrw_alter, "diskgroup", ESqlStatementType.sstoraclealterdiskgroup);
036        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstoraclealterfunction);
037        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstoraclealterindex);
038        addCmd(TBaseType.rrw_alter, "indextype", ESqlStatementType.sstoraclealterindextype);
039        addCmd(TBaseType.rrw_alter, "java", ESqlStatementType.sstoraclealterjava);
040        addCmd(TBaseType.rrw_alter, "materialized", "view", "log", ESqlStatementType.sstoraclealtermaterializedviewlog);
041        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstAlterMaterializedView);
042        addCmd(TBaseType.rrw_alter, "operator", ESqlStatementType.sstoraclealteroperator);
043        addCmd(TBaseType.rrw_alter, "outline", ESqlStatementType.sstoraclealteroutline);
044        addCmd(TBaseType.rrw_alter, "package", ESqlStatementType.sstoraclealterpackage);
045        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstoraclealterprocedure);
046        addCmd(TBaseType.rrw_alter, "profile", ESqlStatementType.sstoraclealterprofile);
047        addCmd(TBaseType.rrw_alter, "resource", "cost", ESqlStatementType.sstoraclealterresourcecost);
048        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstoraclealterrole);
049        addCmd(TBaseType.rrw_alter, "rollback", "segment", ESqlStatementType.sstoraclealterrollbacksegment);
050        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstoraclealtersequence);
051        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstoraclealtersession);
052        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstoraclealtersystem);
053        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
054        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstoraclealtertablespace);
055        addCmd(TBaseType.rrw_alter, "trigger", ESqlStatementType.sstaltertrigger);
056        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstoraclealtertype);
057        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstoraclealteruser);
058        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstoraclealterview);
059        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstoracleanalyze);
060        addCmd(TBaseType.rrw_associate, "statistics", ESqlStatementType.sstoracleassociatestatistics);
061        addCmd(TBaseType.rrw_audit, ESqlStatementType.sstoracleaudit);
062        addCmd(TBaseType.rrw_call, ESqlStatementType.sstoraclecall);
063        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstCommentOn);
064        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstoraclecommit);
065        addCmd(TBaseType.rrw_create, "bigfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
066        addCmd(TBaseType.rrw_create, "bitmap", "index", ESqlStatementType.sstoraclecreateindex);
067        addCmd(TBaseType.rrw_create, "cluster", ESqlStatementType.sstoraclecreatecluster);
068        addCmd(TBaseType.rrw_create, "context", ESqlStatementType.sstoraclecreatecontext);
069        addCmd(TBaseType.rrw_create, "controlfile", ESqlStatementType.sstoraclecreatecontrolfile);
070        addCmd(TBaseType.rrw_create, "editionable", "function", ESqlStatementType.sstplsql_createfunction);
071        addCmd(TBaseType.rrw_create, "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
072        addCmd(TBaseType.rrw_create, "editionable", "package", ESqlStatementType.sstplsql_createpackage);
073        addCmd(TBaseType.rrw_create, "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
074        addCmd(TBaseType.rrw_create, "editioning", "view", ESqlStatementType.sstoraclecreateview);
075        addCmd(TBaseType.rrw_create, "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
076        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstoraclecreatedatabase);
077        addCmd(TBaseType.rrw_create, "dimension", ESqlStatementType.sstoraclecreatedimension);
078        addCmd(TBaseType.rrw_create, "directory", ESqlStatementType.sstoraclecreatedirectory);
079        addCmd(TBaseType.rrw_create, "diskgroup", ESqlStatementType.sstoraclecreatediskgroup);
080        addCmd(TBaseType.rrw_create, "force", "view", ESqlStatementType.sstoraclecreateview);
081        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstplsql_createfunction);
082        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
083        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
084        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstoraclecreateindex);
085        addCmd(TBaseType.rrw_create, "indextype", ESqlStatementType.sstoraclecreateindextype);
086        addCmd(TBaseType.rrw_create, "java", ESqlStatementType.sstoraclecreatejava);
087        addCmd(TBaseType.rrw_create, "library", ESqlStatementType.sstoraclecreatelibrary);
088        addCmd(TBaseType.rrw_create, "materialized", "view", "log", ESqlStatementType.sstoraclecreatematerializedviewlog);
089        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
090        addCmd(TBaseType.rrw_create, "noforce", "view", ESqlStatementType.sstoraclecreateview);
091        addCmd(TBaseType.rrw_create, "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
092        addCmd(TBaseType.rrw_create, "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
093        addCmd(TBaseType.rrw_create, "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
094        addCmd(TBaseType.rrw_create, "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
095        addCmd(TBaseType.rrw_create, "operator", ESqlStatementType.sstoraclecreateoperator);
096        addCmd(TBaseType.rrw_create, "or", "replace", "context", ESqlStatementType.sstoraclecreatecontext);
097        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
098        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "function", ESqlStatementType.sstplsql_createfunction);
099        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
100        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", ESqlStatementType.sstplsql_createpackage);
101        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
102        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
103        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "view", ESqlStatementType.sstoraclecreateview);
104        addCmd(TBaseType.rrw_create, "or", "replace", "editioning", "view", ESqlStatementType.sstoraclecreateview);
105        addCmd(TBaseType.rrw_create, "or", "replace", "directory", ESqlStatementType.sstoraclecreatedirectory);
106        addCmd(TBaseType.rrw_create, "or", "replace", "force", "view", ESqlStatementType.sstoraclecreateview);
107        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
108        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
109        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
110        addCmd(TBaseType.rrw_create, "or", "replace", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
111        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstplsql_createfunction);
112        addCmd(TBaseType.rrw_create, "or", "replace", "library", ESqlStatementType.sstoraclecreatelibrary);
113        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "view", ESqlStatementType.sstoraclecreateview);
114        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
115        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
116        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
117        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
118        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
119        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
120        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
121        addCmd(TBaseType.rrw_create, "or", "replace", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
122        addCmd(TBaseType.rrw_create, "or", "replace", "package", ESqlStatementType.sstplsql_createpackage);
123        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstplsql_createprocedure);
124        addCmd(TBaseType.rrw_create, "or", "replace", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
125        addCmd(TBaseType.rrw_create, "or", "replace", "synonym", ESqlStatementType.sstoraclecreatesynonym);
126        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstplsql_createtrigger);
127        addCmd(TBaseType.rrw_create, "or", "replace", "type", "body", ESqlStatementType.sstplsql_createtypebody);
128        addCmd(TBaseType.rrw_create, "or", "replace", "type", ESqlStatementType.sstplsql_createtype_placeholder);
129        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstoraclecreateview);
130        addCmd(TBaseType.rrw_create, "outline", ESqlStatementType.sstoraclecreateoutline);
131        addCmd(TBaseType.rrw_create, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
132        addCmd(TBaseType.rrw_create, "package", ESqlStatementType.sstplsql_createpackage);
133        addCmd(TBaseType.rrw_create, "pfile", ESqlStatementType.sstoraclecreatepfile);
134        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstplsql_createprocedure);
135        addCmd(TBaseType.rrw_create, "profile", ESqlStatementType.sstoraclecreateprofile);
136        addCmd(TBaseType.rrw_create, "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
137        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
138        addCmd(TBaseType.rrw_create, "resotre", "point", ESqlStatementType.sstoraclecreaterestorepoint);
139        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstoraclecreaterole);
140        addCmd(TBaseType.rrw_create, "rollback", "segment", ESqlStatementType.sstoraclecreaterollbacksegment);
141        addCmd(TBaseType.rrw_create, "shared", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
142        addCmd(TBaseType.rrw_create, "shared", "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
143        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstoraclecreateschema);
144        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstoraclecreatesequence);
145        addCmd(TBaseType.rrw_create, "smallfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
146        addCmd(TBaseType.rrw_create, "spfile", ESqlStatementType.sstoraclecreatespfile);
147        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstoraclecreatesynonym);
148        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
149        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstoraclecreatetablespace);
150        addCmd(TBaseType.rrw_create, "temporary", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
151        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstplsql_createtrigger);
152        addCmd(TBaseType.rrw_create, "type", "body", ESqlStatementType.sstplsql_createtypebody);
153        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstplsql_createtype_placeholder);
154        addCmd(TBaseType.rrw_create, "undo", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
155        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstoraclecreateindex);
156        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstoraclecreateuser);
157        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstoraclecreateview);
158        addCmd(TBaseType.rrw_custom, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
159        addCmd(TBaseType.rrw_custom, "package", ESqlStatementType.sstplsql_createpackage);
160        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
161        addCmd(TBaseType.rrw_disassociate, "statistics", ESqlStatementType.sstoracledisassociatestatistics);
162        addCmd(TBaseType.rrw_drop, "cluster", ESqlStatementType.sstoracledropcluster);
163        addCmd(TBaseType.rrw_drop, "context", ESqlStatementType.sstoracledropcontext);
164        addCmd(TBaseType.rrw_drop, "database", "link", ESqlStatementType.sstoracledropdatabaselink);
165        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstoracledropdatabase);
166        addCmd(TBaseType.rrw_drop, "dimension", ESqlStatementType.sstoracledropdimension);
167        addCmd(TBaseType.rrw_drop, "directory", ESqlStatementType.sstoracledropdirectory);
168        addCmd(TBaseType.rrw_drop, "diskgroup", ESqlStatementType.sstoracledropdiskgroup);
169        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstoracledropfunction);
170        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstoracledropindex);
171        addCmd(TBaseType.rrw_drop, "indextype", ESqlStatementType.sstoracledropindextype);
172        addCmd(TBaseType.rrw_drop, "java", ESqlStatementType.sstoracledropjava);
173        addCmd(TBaseType.rrw_drop, "library", ESqlStatementType.sstoracledroplibrary);
174        addCmd(TBaseType.rrw_drop, "materialized", "view", "log", ESqlStatementType.sstoracledropmaterializedviewlog);
175        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstoracledropmaterializedview);
176        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstoracledropoperator);
177        addCmd(TBaseType.rrw_drop, "outline", ESqlStatementType.sstoracledropoutline);
178        addCmd(TBaseType.rrw_drop, "package", ESqlStatementType.sstoracledroppackage);
179        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstoracledropprocedure);
180        addCmd(TBaseType.rrw_drop, "profile", ESqlStatementType.sstoracledropprofile);
181        addCmd(TBaseType.rrw_drop, "public", "database", "link", ESqlStatementType.sstoracledropdatabaselink);
182        addCmd(TBaseType.rrw_drop, "public", "synonym", ESqlStatementType.sstoracledropsynonym);
183        addCmd(TBaseType.rrw_drop, "restore", "point", ESqlStatementType.sstoracledroprestorepoint);
184        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstoracledroprole);
185        addCmd(TBaseType.rrw_drop, "rollback", "segment", ESqlStatementType.sstoracledroprollbacksegment);
186        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstoracledropsequence);
187        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstoracledropsynonym);
188        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstoracledroptable);
189        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstoracledroptablespace);
190        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstoracledroptrigger);
191        addCmd(TBaseType.rrw_drop, "type", "body", ESqlStatementType.sstoracledroptypebody);
192        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstoracledroptype);
193        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstoracledropuser);
194        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstoracledropview);
195        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstplsql_execimmestmt);
196        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstoracleexecuteprocedure);
197        addCmd(TBaseType.rrw_explain, "plan", ESqlStatementType.sstExplain);
198        addCmd(TBaseType.rrw_flashback, "database", ESqlStatementType.sstoracleflashbackdatabase);
199        addCmd(TBaseType.rrw_flashback, "table", ESqlStatementType.sstoracleflashbacktable);
200        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstoraclegrant);
201        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
202        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstoraclelocktable);
203        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
204        addCmd(TBaseType.rrw_noaudit, ESqlStatementType.sstoraclenoaudit);
205        addCmd(TBaseType.rrw_purge, ESqlStatementType.sstoraclepurge);
206        addCmd(TBaseType.rrw_rename, ESqlStatementType.sstoraclerename);
207        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstoraclerevoke);
208        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstoraclerollback);
209        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstoraclesavepoint);
210        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
211        addCmd(TBaseType.rrw_set, "constraint", ESqlStatementType.sstoraclesetconstraint);
212        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstoraclesetconstraint);
213        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstoraclesetrole);
214        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstoraclesettransaction);
215        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
216        addCmd(TBaseType.rrw_type2, ESqlStatementType.sstplsql_createtype_placeholder);
217        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
218    }
219
220    @Override
221    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
222        TCustomSqlStatement ret = null;
223
224        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
225
226        if ( (token.tokencode  == TBaseType.cmtdoublehyphen)
227           || (token.tokencode  == TBaseType.cmtslashstar)
228           || (token.tokencode  == TBaseType.lexspace)
229           || (token.tokencode  == TBaseType.lexnewline)
230            || (token.tokentype == ETokenType.ttsemicolon) )
231        {
232          return null;
233        }
234
235        int lcpos = token.posinlist;
236        TSourceTokenList lcsourcetokenlist = token.container;
237        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
238
239        //subquery after semicolon or at first line
240        if ( (state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis) ) // (
241          {
242            int k = lcsourcetokenlist.solidtokenafterpos(lcpos,TBaseType.rrw_select,1,"(");
243            if ( k >0 )
244              {
245                ret = new TSelectSqlStatement(this.vendor);
246              }
247
248            return ret;
249          }
250
251        //cte
252        if ( (state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with) )
253          {
254            ret = findcte(token,this.vendor);
255            if ( (ret != null) )  return ret;
256          }
257
258        gnewsqlstatementtype = getStatementTypeForToken(token);
259
260        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
261        switch (gnewsqlstatementtype) {    //
262            case sstinvalid:
263              {
264                ret = null;
265
266                if ( state == EFindSqlStateType.stnormal )
267                  {
268                    if ( token.tokencode == TBaseType.label_begin )
269                      {
270                        ret = new TCommonBlock(this.vendor);
271                        gnewsqlstatementtype = ret.sqlstatementtype;
272                      }
273                    else if ( token.tokencode == TBaseType.rrw_declare )
274                      {
275                        ret = new TCommonBlock(this.vendor);
276                        gnewsqlstatementtype = ret.sqlstatementtype;
277                      }
278                    else if ( token.tokencode == TBaseType.rrw_begin )
279                      {
280                        ret = new TCommonBlock(this.vendor);
281                        gnewsqlstatementtype = ret.sqlstatementtype;
282                      }
283                    else if ( token.tokencode == TBaseType.rrw_procedure )
284                      {
285                        ret = new TPlsqlCreateProcedure(this.vendor);
286                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createprocedure;
287                        gnewsqlstatementtype = ret.sqlstatementtype;
288                      }
289                    else if ( token.tokencode == TBaseType.rrw_function )
290                      {
291                        ret = new TPlsqlCreateFunction(this.vendor);
292                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createfunction;
293                        gnewsqlstatementtype = ret.sqlstatementtype;
294                      }
295                    else if ( token.tokencode == TBaseType.rrw_package )
296                      {
297                        ret = new TPlsqlCreatePackage(this.vendor);
298                       // ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
299                        gnewsqlstatementtype = ret.sqlstatementtype;
300                      }
301                  }
302                  break;
303              }
304            case sstselect:
305              {
306                boolean lcisnewsql = true;
307
308                if ( state != EFindSqlStateType.stnormal )
309                  {
310                    // lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
311                    if ( (lcprevsolidtoken != null) )
312                      {
313                        if ( lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
314                          lcisnewsql = false; //subquery
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                          {
327                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable )
328                              lcisnewsql = false;
329                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview )
330                              lcisnewsql = false;
331                          }
332
333                        if ( lcisnewsql && ( lcprevsolidtoken.tokencode == TBaseType.rrw_all) )
334                          {
335                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
336                            if ( (lcpprevsolidtoken != null) )
337                              {
338                                if ( lcpprevsolidtoken.tokencode == TBaseType.rrw_union )
339                                  lcisnewsql = false;
340                              }
341                          }
342
343                      }
344
345
346                    if ( (lccurrentsqlstatement != null) )
347                      {
348                          switch (lccurrentsqlstatement.sqlstatementtype){
349                              case sstinsert:
350                                  lcisnewsql = false;
351                                  break;
352                              case sstcreatetable:
353                              case sstcreateview:
354                                  lcisnewsql = false;
355                                  break;
356                          }
357                      }
358
359                  }
360
361                if ( lcisnewsql )
362                  ret = new TSelectSqlStatement(this.vendor);
363
364                break;
365              }
366            case sstinsert:
367              {
368                boolean lcisnewsql = true;
369                if ( state != EFindSqlStateType.stnormal )
370                  {
371                    if ( (lccurrentsqlstatement != null) )
372                      {
373
374                      }
375                  }
376
377                if ( lcisnewsql )
378                  ret = new TInsertSqlStatement(this.vendor);
379
380                break;
381              }
382            case sstupdate:
383              {
384                boolean lcisnewsql = true;
385                if ( state != EFindSqlStateType.stnormal )
386                  {
387                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
388                    if ( (lcprevsolidtoken != null) )
389                      { //
390                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
391                          lcisnewsql = false;
392                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_for )
393                          lcisnewsql = false;
394                      }
395
396                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
397                    if ( (lcnextsolidtoken != null) )
398                      {
399                        if ( lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis)
400                          {
401                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist,TBaseType.rrw_select,1,"(");
402                            if ( k  == 0 ) lcisnewsql = false;
403                          }
404                      }
405
406
407                    if ( (lccurrentsqlstatement != null) )
408                      {
409                      }
410                  }
411
412                if ( lcisnewsql )
413                  {
414                    ret = new TUpdateSqlStatement(this.vendor);
415                    ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
416                  }
417                break;
418              }
419            case sstdelete:
420              {
421                boolean lcisnewsql = true;
422
423                if ( state != EFindSqlStateType.stnormal )
424                  {
425                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
426                    if ( (lcprevsolidtoken != null) )
427                      {
428                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
429                          lcisnewsql = false;
430                      }
431
432                    if ( (lccurrentsqlstatement != null) )
433                      {
434                          TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
435                          if ( (lcnextsolidtoken != null) ){
436                              if (lcnextsolidtoken.tokencode == TBaseType.rrw_oracle_rows){
437                                  lcisnewsql = false;
438                              }
439                          }
440                      }
441                  }
442
443                if ( lcisnewsql )
444                  ret = new TDeleteSqlStatement(this.vendor);
445
446                break;
447              }
448            case sstmerge:
449              {
450                ret = new TMergeSqlStatement(this.vendor);
451                ret.sqlstatementtype = gnewsqlstatementtype;
452                break;
453              }
454            case sstoraclecommit:
455              {
456
457                  boolean lcisnewsql = true;
458                  if ( state != EFindSqlStateType.stnormal )
459                  {
460                      lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
461                      if ( (lcprevsolidtoken != null) )
462                      { //
463                          if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
464                              lcisnewsql = false;
465                      }
466                  }
467
468                  if (lcisnewsql){
469                      ret = new TCommitStmt(this.vendor);
470                      ret.sqlstatementtype = gnewsqlstatementtype;
471                  }
472
473                break;
474              }
475            case sstoraclerollback:
476              {
477                ret = new TUnknownSqlStatement(this.vendor);
478                ret.sqlstatementtype = gnewsqlstatementtype;
479                break;
480              }
481            case sstoraclesavepoint:
482              {
483                ret = new TUnknownSqlStatement(this.vendor);
484                ret.sqlstatementtype = gnewsqlstatementtype;
485                  break;
486              }
487            case sstoraclerevoke:
488              {
489                ret = new TUnknownSqlStatement(this.vendor);
490                ret.sqlstatementtype = gnewsqlstatementtype;
491                  break;
492              }
493            case sstoraclegrant:
494              {
495                ret = new TUnknownSqlStatement(this.vendor);
496                ret.sqlstatementtype = gnewsqlstatementtype;
497                  break;
498              }
499            case sstoracleanalyze:
500              {
501                ret = new TUnknownSqlStatement(this.vendor);
502                ret.sqlstatementtype = gnewsqlstatementtype;
503                  break;
504              }
505            case sstTruncate:
506              {
507                  ret = new TTruncateStatement(this.vendor);
508                  ret.sqlstatementtype = gnewsqlstatementtype;
509                  break;
510              }
511            case sstcreatetable:
512              {
513                ret = new TCreateTableSqlStatement(this.vendor);
514                  break;
515              }
516            case sstoraclecreateview:
517              {
518                ret = new TCreateViewSqlStatement(this.vendor);
519                  break;
520              }
521            case sstcreatematerializedview:{
522                ret = new TCreateMaterializedSqlStatement(this.vendor);
523                break;
524            }
525            case sstoraclecreatematerializedviewlog:{
526                ret = new TCreateMaterializedViewLogSqlStatement(this.vendor);
527                break;
528            }
529            case sstoraclecreateindex:
530              {
531                ret = new TCreateIndexSqlStatement(this.vendor);
532                  break;
533              }
534            case sstoraclecreatedatabase:
535              {
536                ret = new TCreateDatabaseSqlStatement(this.vendor);
537                  break;
538              }
539            case sstoracledroptable:
540              {
541                ret = new TDropTableSqlStatement(this.vendor);
542                  break;
543              }
544            case sstoracledropview:
545              {
546               ret = new TDropViewSqlStatement(this.vendor);
547                  break;
548              }
549            case sstoracledropindex:
550              {
551                ret = new TDropIndexSqlStatement(this.vendor);
552                  break;
553              }
554            case sstaltertable:
555              {
556                ret = new TAlterTableStatement(this.vendor);
557                  break;
558              }
559            case sstoraclealtersession:
560              {
561                ret = new TAlterSessionStatement(this.vendor);
562                  break;
563              }
564            case sstplsql_createprocedure:
565            {
566              ret = new TPlsqlCreateProcedure(this.vendor);
567              ret.sqlstatementtype = gnewsqlstatementtype;
568              // System.out.println(gnewsqlstatementtype);
569                break;
570            }
571            case sstplsql_createfunction:
572            {
573              ret = new TPlsqlCreateFunction(this.vendor);
574              ret.sqlstatementtype = gnewsqlstatementtype;
575              // System.out.println(gnewsqlstatementtype);
576                break;
577            }
578            case sstplsql_createpackage:
579            {
580              ret = new TPlsqlCreatePackage(this.vendor);
581              ret.sqlstatementtype = gnewsqlstatementtype;
582              // System.out.println(gnewsqlstatementtype);
583                break;
584            }
585            case sstplsql_createtrigger:
586            {
587              ret = new TPlsqlCreateTrigger(this.vendor);
588              ret.sqlstatementtype = gnewsqlstatementtype;
589              // System.out.println(gnewsqlstatementtype);
590                break;
591            }
592            case sstplsql_execimmestmt:
593              {
594                ret = new TExecImmeStmt(this.vendor);
595               // ret.sqlstatementtype = gnewsqlstatementtype;
596                // System.out.println(gnewsqlstatementtype);
597                  break;
598              }
599            case sstoraclecreatepackagebody:
600             {
601                ret = new TPlsqlCreatePackage(this.vendor);
602                ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
603                 break;
604             }
605            case sstplsql_createtype_placeholder:
606            {
607              ret = new TPlsqlCreateType_Placeholder(this.vendor);
608              ret.sqlstatementtype = gnewsqlstatementtype;
609              // System.out.println(gnewsqlstatementtype);
610                break;
611            }
612            case sstplsql_createtypebody:
613              {
614                ret = new TPlsqlCreateTypeBody(this.vendor);
615                ret.sqlstatementtype = gnewsqlstatementtype;
616                  break;
617              }
618            case sstCommentOn:
619              {
620                ret = new TCommentOnSqlStmt(this.vendor);
621                  break;
622              }
623            case sstoraclecreatesequence:
624              {
625                ret = new TCreateSequenceStmt(this.vendor);
626                  break;
627              }
628            case sstoraclecreatesynonym:
629              {
630                ret = new TCreateSynonymStmt(this.vendor);
631                  break;
632              }
633            case sstoraclecreatedirectory:
634              {
635                ret = new TOracleCreateDirectoryStmt(this.vendor);
636                  break;
637              }
638            case sstoracleexecuteprocedure:
639            {
640                ret = new TOracleExecuteProcedure(this.vendor);
641                break;
642            }
643            case sstExplain:
644            {
645                ret = new TExplainPlan(this.vendor);
646                break;
647            }
648            case sstoraclecreatelibrary:
649                ret = new TOracleCreateLibraryStmt(this.vendor);
650                break;
651            case sstaltertrigger:
652                ret  = new TAlterTriggerStmt(this.vendor);
653                break;
654            case sstoracledropsequence:
655                ret = new TDropSequenceStmt(this.vendor);
656                break;
657            case sstoraclecall:
658                ret = new TCallStatement(this.vendor);
659                break;
660            case sstoraclealterview:
661                ret = new TAlterViewStatement(this.vendor);
662                break;
663            case sstoracledropsynonym:
664                ret = new TDropSynonymStmt(this.vendor);
665                break;
666            case sstoracledropdatabaselink:
667                ret = new TDropDatabaseLinkStmt(this.vendor);
668                break;
669            case sstoraclecreatedatabaselink:
670                ret = new TCreateDatabaseLinkStmt(this.vendor);
671                break;
672            case sstoracledropmaterializedview:
673                ret = new TDropMaterializedViewStmt(this.vendor);
674                break;
675            case sstoracledropmaterializedviewlog:
676                ret = new TDropMaterializedViewLogStmt(this.vendor);
677                break;
678            case sstoraclerename:
679                ret = new TRenameStmt(this.vendor);
680                break;
681            case sstoracledropprocedure:
682                ret = new TDropProcedureStmt(this.vendor);
683                break;
684            case sstAlterMaterializedView:
685                ret = new TAlterMaterializedViewStmt(this.vendor);
686                break;
687            case sstoracledroptrigger:
688                ret = new TDropTriggerSqlStatement(this.vendor);
689                break;
690            case sstoracledropfunction:
691                ret = new TDropFunctionStmt(this.vendor);
692                break;
693            case sstoraclealterindex:
694                ret = new TAlterIndexStmt(this.vendor);
695                break;
696            case sstoraclealtersequence:
697                ret = new TAlterSequenceStatement(this.vendor);
698                break;
699            case sstoraclealtertype:
700                ret = new TAlterTypeStatement(this.vendor);
701                break;
702            default:
703              {
704                ret = new TUnknownSqlStatement(this.vendor);
705                ret.sqlstatementtype = gnewsqlstatementtype;
706                break;
707              }
708        }    // case
709
710        return ret;
711    }
712
713    private TCustomSqlStatement findcte(TSourceToken ptoken, EDbVendor pdbvendor){
714        TCustomSqlStatement ret = null;
715        TSourceToken lctoken = null;
716        int lcnested = 0,k,j;
717        boolean inXmlNamespaces = false;
718        boolean isXmlNamespaces = false;
719
720        int lcpos = ptoken.posinlist;
721        TSourceTokenList lcsourcetokenlist = ptoken.container;
722
723        for (int i = lcpos + 1; i <  lcsourcetokenlist.size();i++)    // iterate
724          {
725            lctoken = lcsourcetokenlist.get(i);
726//        if (lctoken.tokencode == TBaseType.rrw_postgresql_recursive){
727//            continue;
728//        }
729              if (lctoken.tokencode == TBaseType.rrw_xmlnamespaces){
730                  inXmlNamespaces = true;
731                  lcnested = 0;
732                  continue;
733              }
734              if (inXmlNamespaces) {
735                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
736                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) {
737                      lcnested--;
738                      if (lcnested == 0) {
739                        inXmlNamespaces = false;
740                        isXmlNamespaces = true;
741                      }
742                  }
743                  continue;
744              }
745            if (( lctoken.tokencode == TBaseType.rrw_as ) || isXmlNamespaces)
746              {
747                lcnested = 0;
748                int startPos = i+1;
749                if (isXmlNamespaces) startPos = i;
750                for ( j = startPos; j < lcsourcetokenlist.size();j++)
751                {
752                  lctoken = lcsourcetokenlist.get(j);
753                  if (lctoken.isnonsolidtoken() ) continue;
754                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
755                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) lcnested--;
756
757
758                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_delete) )
759                    {
760                      ret = new TDeleteSqlStatement(pdbvendor);
761                      ret.isctequery = true;
762                      gnewsqlstatementtype = ESqlStatementType.sstdelete;
763                      break;
764                    }
765
766                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_merge) )
767                      {
768                        ret = new TMergeSqlStatement(pdbvendor);
769                        ret.isctequery = true;
770                        gnewsqlstatementtype = ESqlStatementType.sstmerge;
771                        break;
772                      }
773
774                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_insert) )
775                    {
776                      ret = new TInsertSqlStatement(pdbvendor);
777                      ret.isctequery = true;
778                      gnewsqlstatementtype = ESqlStatementType.sstinsert;
779                      ret.dummytag = 1; //  select stmt in insert is permitted
780
781                      for ( k = lctoken.posinlist + 1; k < lcsourcetokenlist.size();k++)    // iterate
782                      {
783                        if ( lcsourcetokenlist.get(k).isnonsolidtoken()  ) continue;
784                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_values ) break;
785                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_go ) break;
786                        if ( lcsourcetokenlist.get(k).tokentype == ETokenType.ttsemicolon ) break;
787                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_select ) break;
788                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_execute ) break;
789                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_exec ) break;
790                      }    // for
791                      if ( k > lcsourcetokenlist.size() - 1 )
792                        k = lcsourcetokenlist.size() - 1;
793
794                      for (int m = lctoken.posinlist + 1; m <=  k; m++)    // iterate
795                      {
796                        lcsourcetokenlist.get(m).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
797                      }    // for
798
799                      break;
800                    }
801
802                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_values) &&(pdbvendor == EDbVendor.dbvpostgresql) )
803                    {
804                            ret = new TSelectSqlStatement(pdbvendor);
805                            ret.isctequery = true;
806                            gnewsqlstatementtype = ESqlStatementType.sstselect;
807                            break;
808                    }
809
810                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_select) )
811                    {
812                      ret = new TSelectSqlStatement(pdbvendor);
813                      ret.isctequery = true;
814                      gnewsqlstatementtype = ESqlStatementType.sstselect;
815                      break;
816                    }
817
818                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_update) )
819                    {
820                      ret = new TUpdateSqlStatement(pdbvendor);
821                      ret.isctequery = true;
822                      ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
823                      gnewsqlstatementtype = ESqlStatementType.sstupdate;
824                      break;
825                    }
826
827                    if ( (pdbvendor == EDbVendor.dbvhive) && (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_from) )
828                    {
829                        TSourceToken cmdToken = lctoken.searchToken(TBaseType.rrw_insert,3);
830                        if (cmdToken != null){
831                            ret = new TInsertSqlStatement(pdbvendor);
832                            ret.isctequery = true;
833                            gnewsqlstatementtype = ESqlStatementType.sstinsert;
834
835                        }else{
836                            ret = new TSelectSqlStatement(pdbvendor);
837                            ret.isctequery = true;
838                            gnewsqlstatementtype = ESqlStatementType.ssthiveFromQuery;
839                        }
840                        break;
841                    }
842
843
844                }    // for
845
846                if ( (ret != null) )
847                  {
848                    for (k = lcpos + 1; k <= j;k++)    // iterate
849                    {
850                      lcsourcetokenlist.get(k).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
851                    }    // for
852                    break;
853                  }
854
855              }
856          }
857
858        return ret;
859    }
860}