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, "library", ESqlStatementType.sstAlterLibrary);
039        addCmd(TBaseType.rrw_alter, "indextype", ESqlStatementType.sstoraclealterindextype);
040        addCmd(TBaseType.rrw_alter, "java", ESqlStatementType.sstoraclealterjava);
041        addCmd(TBaseType.rrw_alter, "materialized", "view", "log", ESqlStatementType.sstoraclealtermaterializedviewlog);
042        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstAlterMaterializedView);
043        addCmd(TBaseType.rrw_alter, "operator", ESqlStatementType.sstoraclealteroperator);
044        addCmd(TBaseType.rrw_alter, "outline", ESqlStatementType.sstoraclealteroutline);
045        addCmd(TBaseType.rrw_alter, "package", ESqlStatementType.sstoraclealterpackage);
046        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstoraclealterprocedure);
047        addCmd(TBaseType.rrw_alter, "profile", ESqlStatementType.sstoraclealterprofile);
048        addCmd(TBaseType.rrw_alter, "resource", "cost", ESqlStatementType.sstoraclealterresourcecost);
049        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstoraclealterrole);
050        addCmd(TBaseType.rrw_alter, "rollback", "segment", ESqlStatementType.sstoraclealterrollbacksegment);
051        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstoraclealtersequence);
052        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstoraclealtersession);
053        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstoraclealtersystem);
054        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
055        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstoraclealtertablespace);
056        addCmd(TBaseType.rrw_alter, "trigger", ESqlStatementType.sstaltertrigger);
057        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstoraclealtertype);
058        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstoraclealteruser);
059        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstoraclealterview);
060        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstoracleanalyze);
061        addCmd(TBaseType.rrw_associate, "statistics", ESqlStatementType.sstoracleassociatestatistics);
062        addCmd(TBaseType.rrw_audit, ESqlStatementType.sstoracleaudit);
063        addCmd(TBaseType.rrw_call, ESqlStatementType.sstoraclecall);
064        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstCommentOn);
065        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstoraclecommit);
066        addCmd(TBaseType.rrw_create, "assertion", ESqlStatementType.sstcreateassertion);
067        addCmd(TBaseType.rrw_create, "bigfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
068        addCmd(TBaseType.rrw_create, "bitmap", "index", ESqlStatementType.sstoraclecreateindex);
069        addCmd(TBaseType.rrw_create, "blockchain", "table", ESqlStatementType.sstcreatetable);
070        addCmd(TBaseType.rrw_create, "cluster", ESqlStatementType.sstoraclecreatecluster);
071        addCmd(TBaseType.rrw_create, "context", ESqlStatementType.sstoraclecreatecontext);
072        addCmd(TBaseType.rrw_create, "controlfile", ESqlStatementType.sstoraclecreatecontrolfile);
073        addCmd(TBaseType.rrw_create, "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
074        addCmd(TBaseType.rrw_create, "editionable", "function", ESqlStatementType.sstplsql_createfunction);
075        addCmd(TBaseType.rrw_create, "editionable", "library", ESqlStatementType.sstoraclecreatelibrary);
076        addCmd(TBaseType.rrw_create, "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
077        addCmd(TBaseType.rrw_create, "editionable", "package", ESqlStatementType.sstplsql_createpackage);
078        addCmd(TBaseType.rrw_create, "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
079        addCmd(TBaseType.rrw_create, "editionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
080        addCmd(TBaseType.rrw_create, "editionable", "view", ESqlStatementType.sstoraclecreateview);
081        addCmd(TBaseType.rrw_create, "editioning", "view", ESqlStatementType.sstoraclecreateview);
082        addCmd(TBaseType.rrw_create, "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
083        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstoraclecreatedatabase);
084        addCmd(TBaseType.rrw_create, "dimension", ESqlStatementType.sstoraclecreatedimension);
085        addCmd(TBaseType.rrw_create, "directory", ESqlStatementType.sstoraclecreatedirectory);
086        addCmd(TBaseType.rrw_create, "diskgroup", ESqlStatementType.sstoraclecreatediskgroup);
087        addCmd(TBaseType.rrw_create, "domain", ESqlStatementType.sstoraclecreatedomain);
088        addCmd(TBaseType.rrw_create, "duplicated", "table", ESqlStatementType.sstcreatetable);
089        addCmd(TBaseType.rrw_create, "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
090        addCmd(TBaseType.rrw_create, "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
091        addCmd(TBaseType.rrw_create, "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
092        addCmd(TBaseType.rrw_create, "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
093        addCmd(TBaseType.rrw_create, "force", "view", ESqlStatementType.sstoraclecreateview);
094        addCmd(TBaseType.rrw_create, "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
095        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstplsql_createfunction);
096        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
097        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
098        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
099        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
100        addCmd(TBaseType.rrw_create, "immutable", "table", ESqlStatementType.sstcreatetable);
101        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstoraclecreateindex);
102        addCmd(TBaseType.rrw_create, "indextype", ESqlStatementType.sstoraclecreateindextype);
103        addCmd(TBaseType.rrw_create, "java", ESqlStatementType.sstoraclecreatejava);
104        addCmd(TBaseType.rrw_create, "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
105        addCmd(TBaseType.rrw_create, "library", ESqlStatementType.sstoraclecreatelibrary);
106        addCmd(TBaseType.rrw_create, "mle", "module", ESqlStatementType.sstoraclecreatemlemodule);
107        addCmd(TBaseType.rrw_create, "materialized", "view", "log", ESqlStatementType.sstoraclecreatematerializedviewlog);
108        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
109        addCmd(TBaseType.rrw_create, "multivalue", "index", ESqlStatementType.sstoraclecreateindex);
110        addCmd(TBaseType.rrw_create, "no", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
111        addCmd(TBaseType.rrw_create, "no", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
112        addCmd(TBaseType.rrw_create, "no", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
113        addCmd(TBaseType.rrw_create, "no", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
114        addCmd(TBaseType.rrw_create, "no", "force", "view", ESqlStatementType.sstoraclecreateview);
115        addCmd(TBaseType.rrw_create, "no", "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
116        addCmd(TBaseType.rrw_create, "noforce", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
117        addCmd(TBaseType.rrw_create, "noforce", "editionable", "view", ESqlStatementType.sstoraclecreateview);
118        addCmd(TBaseType.rrw_create, "noforce", "editioning", "view", ESqlStatementType.sstoraclecreateview);
119        addCmd(TBaseType.rrw_create, "noforce", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
120        addCmd(TBaseType.rrw_create, "noforce", "view", ESqlStatementType.sstoraclecreateview);
121        addCmd(TBaseType.rrw_create, "noforce", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
122        addCmd(TBaseType.rrw_create, "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
123        addCmd(TBaseType.rrw_create, "noneditionable", "library", ESqlStatementType.sstoraclecreatelibrary);
124        addCmd(TBaseType.rrw_create, "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
125        addCmd(TBaseType.rrw_create, "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
126        addCmd(TBaseType.rrw_create, "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
127        addCmd(TBaseType.rrw_create, "noneditionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
128        addCmd(TBaseType.rrw_create, "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
129        addCmd(TBaseType.rrw_create, "operator", ESqlStatementType.sstoraclecreateoperator);
130        addCmd(TBaseType.rrw_create, "or", "replace", "context", ESqlStatementType.sstoraclecreatecontext);
131        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
132        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "function", ESqlStatementType.sstplsql_createfunction);
133        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
134        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", ESqlStatementType.sstplsql_createpackage);
135        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
136        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
137        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "view", ESqlStatementType.sstoraclecreateview);
138        addCmd(TBaseType.rrw_create, "or", "replace", "editioning", "view", ESqlStatementType.sstoraclecreateview);
139        addCmd(TBaseType.rrw_create, "or", "replace", "directory", ESqlStatementType.sstoraclecreatedirectory);
140        addCmd(TBaseType.rrw_create, "or", "replace", "domain", ESqlStatementType.sstoraclecreatedomain);
141        addCmd(TBaseType.rrw_create, "or", "replace", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
142        addCmd(TBaseType.rrw_create, "or", "replace", "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
143        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
144        addCmd(TBaseType.rrw_create, "or", "replace", "force", "view", ESqlStatementType.sstoraclecreateview);
145        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
146        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
147        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
148        addCmd(TBaseType.rrw_create, "or", "replace", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
149        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstplsql_createfunction);
150        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "library", ESqlStatementType.sstoraclecreatelibrary);
151        addCmd(TBaseType.rrw_create, "or", "replace", "library", ESqlStatementType.sstoraclecreatelibrary);
152        addCmd(TBaseType.rrw_create, "or", "replace", "mle", "module", ESqlStatementType.sstoraclecreatemlemodule);
153        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
154        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
155        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
156        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
157        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "view", ESqlStatementType.sstoraclecreateview);
158        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
159        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editionable", "view", ESqlStatementType.sstoraclecreateview);
160        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editioning", "view", ESqlStatementType.sstoraclecreateview);
161        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
162        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "view", ESqlStatementType.sstoraclecreateview);
163        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "library", ESqlStatementType.sstoraclecreatelibrary);
164        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
165        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
166        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
167        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
168        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
169        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
170        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
171        addCmd(TBaseType.rrw_create, "or", "replace", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
172        addCmd(TBaseType.rrw_create, "or", "replace", "package", ESqlStatementType.sstplsql_createpackage);
173        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstplsql_createprocedure);
174        addCmd(TBaseType.rrw_create, "or", "replace", "property", "graph", ESqlStatementType.sstoraclecreatepropertygraph);
175        addCmd(TBaseType.rrw_create, "or", "replace", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
176        addCmd(TBaseType.rrw_create, "or", "replace", "synonym", ESqlStatementType.sstoraclecreatesynonym);
177        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstplsql_createtrigger);
178        addCmd(TBaseType.rrw_create, "or", "replace", "type", "body", ESqlStatementType.sstplsql_createtypebody);
179        addCmd(TBaseType.rrw_create, "or", "replace", "type", ESqlStatementType.sstplsql_createtype_placeholder);
180        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstoraclecreateview);
181        addCmd(TBaseType.rrw_create, "outline", ESqlStatementType.sstoraclecreateoutline);
182        addCmd(TBaseType.rrw_create, "private", "temporary", "table", ESqlStatementType.sstcreatetable);
183        addCmd(TBaseType.rrw_create, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
184        addCmd(TBaseType.rrw_create, "package", ESqlStatementType.sstplsql_createpackage);
185        addCmd(TBaseType.rrw_create, "pfile", ESqlStatementType.sstoraclecreatepfile);
186        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstplsql_createprocedure);
187        addCmd(TBaseType.rrw_create, "profile", ESqlStatementType.sstoraclecreateprofile);
188        addCmd(TBaseType.rrw_create, "property", "graph", ESqlStatementType.sstoraclecreatepropertygraph);
189        addCmd(TBaseType.rrw_create, "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
190        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
191        addCmd(TBaseType.rrw_create, "resotre", "point", ESqlStatementType.sstoraclecreaterestorepoint);
192        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstoraclecreaterole);
193        addCmd(TBaseType.rrw_create, "rollback", "segment", ESqlStatementType.sstoraclecreaterollbacksegment);
194        addCmd(TBaseType.rrw_create, "shared", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
195        addCmd(TBaseType.rrw_create, "shared", "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
196        addCmd(TBaseType.rrw_create, "sharded", "table", ESqlStatementType.sstcreatetable);
197        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstoraclecreateschema);
198        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstoraclecreatesequence);
199        addCmd(TBaseType.rrw_create, "smallfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
200        addCmd(TBaseType.rrw_create, "spfile", ESqlStatementType.sstoraclecreatespfile);
201        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstoraclecreatesynonym);
202        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
203        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstoraclecreatetablespace);
204        addCmd(TBaseType.rrw_create, "temporary", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
205        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstplsql_createtrigger);
206        addCmd(TBaseType.rrw_create, "type", "body", ESqlStatementType.sstplsql_createtypebody);
207        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstplsql_createtype_placeholder);
208        addCmd(TBaseType.rrw_create, "undo", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
209        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstoraclecreateindex);
210        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstoraclecreateuser);
211        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstoraclecreateview);
212        addCmd(TBaseType.rrw_custom, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
213        addCmd(TBaseType.rrw_custom, "package", ESqlStatementType.sstplsql_createpackage);
214        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
215        addCmd(TBaseType.rrw_disassociate, "statistics", ESqlStatementType.sstoracledisassociatestatistics);
216        addCmd(TBaseType.rrw_drop, "cluster", ESqlStatementType.sstoracledropcluster);
217        addCmd(TBaseType.rrw_drop, "context", ESqlStatementType.sstoracledropcontext);
218        addCmd(TBaseType.rrw_drop, "database", "link", ESqlStatementType.sstoracledropdatabaselink);
219        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstoracledropdatabase);
220        addCmd(TBaseType.rrw_drop, "dimension", ESqlStatementType.sstoracledropdimension);
221        addCmd(TBaseType.rrw_drop, "directory", ESqlStatementType.sstoracledropdirectory);
222        addCmd(TBaseType.rrw_drop, "diskgroup", ESqlStatementType.sstoracledropdiskgroup);
223        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstoracledropfunction);
224        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstoracledropindex);
225        addCmd(TBaseType.rrw_drop, "indextype", ESqlStatementType.sstoracledropindextype);
226        addCmd(TBaseType.rrw_drop, "java", ESqlStatementType.sstoracledropjava);
227        addCmd(TBaseType.rrw_drop, "library", ESqlStatementType.sstoracledroplibrary);
228        addCmd(TBaseType.rrw_drop, "materialized", "view", "log", ESqlStatementType.sstoracledropmaterializedviewlog);
229        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstoracledropmaterializedview);
230        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstoracledropoperator);
231        addCmd(TBaseType.rrw_drop, "outline", ESqlStatementType.sstoracledropoutline);
232        addCmd(TBaseType.rrw_drop, "package", ESqlStatementType.sstoracledroppackage);
233        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstoracledropprocedure);
234        addCmd(TBaseType.rrw_drop, "profile", ESqlStatementType.sstoracledropprofile);
235        addCmd(TBaseType.rrw_drop, "public", "database", "link", ESqlStatementType.sstoracledropdatabaselink);
236        addCmd(TBaseType.rrw_drop, "public", "synonym", ESqlStatementType.sstoracledropsynonym);
237        addCmd(TBaseType.rrw_drop, "restore", "point", ESqlStatementType.sstoracledroprestorepoint);
238        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstoracledroprole);
239        addCmd(TBaseType.rrw_drop, "rollback", "segment", ESqlStatementType.sstoracledroprollbacksegment);
240        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstoracledropsequence);
241        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstoracledropsynonym);
242        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstoracledroptable);
243        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstoracledroptablespace);
244        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstoracledroptrigger);
245        addCmd(TBaseType.rrw_drop, "type", "body", ESqlStatementType.sstoracledroptypebody);
246        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstoracledroptype);
247        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstoracledropuser);
248        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstoracledropview);
249        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstplsql_execimmestmt);
250        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstoracleexecuteprocedure);
251        addCmd(TBaseType.rrw_explain, "plan", ESqlStatementType.sstExplain);
252        addCmd(TBaseType.rrw_flashback, "database", ESqlStatementType.sstoracleflashbackdatabase);
253        addCmd(TBaseType.rrw_flashback, "table", ESqlStatementType.sstoracleflashbacktable);
254        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstoraclegrant);
255        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
256        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstoraclelocktable);
257        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
258        addCmd(TBaseType.rrw_noaudit, ESqlStatementType.sstoraclenoaudit);
259        addCmd(TBaseType.rrw_purge, ESqlStatementType.sstoraclepurge);
260        addCmd(TBaseType.rrw_rename, ESqlStatementType.sstoraclerename);
261        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstoraclerevoke);
262        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstoraclerollback);
263        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstoraclesavepoint);
264        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
265        addCmd(TBaseType.rrw_set, "constraint", ESqlStatementType.sstoraclesetconstraint);
266        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstoraclesetconstraint);
267        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstoraclesetrole);
268        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstoraclesettransaction);
269        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
270        addCmd(TBaseType.rrw_type2, ESqlStatementType.sstplsql_createtype_placeholder);
271        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
272    }
273
274    @Override
275    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
276        TCustomSqlStatement ret = null;
277
278        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
279
280        if ( (token.tokencode  == TBaseType.cmtdoublehyphen)
281           || (token.tokencode  == TBaseType.cmtslashstar)
282           || (token.tokencode  == TBaseType.lexspace)
283           || (token.tokencode  == TBaseType.lexnewline)
284            || (token.tokentype == ETokenType.ttsemicolon) )
285        {
286          return null;
287        }
288
289        int lcpos = token.posinlist;
290        TSourceTokenList lcsourcetokenlist = token.container;
291        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
292
293        //subquery after semicolon or at first line
294        if ( (state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis) ) // (
295          {
296            int k = lcsourcetokenlist.solidtokenafterpos(lcpos,TBaseType.rrw_select,1,"(");
297            if ( k >0 )
298              {
299                ret = new TSelectSqlStatement(this.vendor);
300              }
301
302            return ret;
303          }
304
305        //cte
306        if ( (state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with) )
307          {
308            ret = findcte(token,this.vendor);
309            if ( (ret != null) )  return ret;
310          }
311
312        gnewsqlstatementtype = getStatementTypeForToken(token);
313
314        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
315        switch (gnewsqlstatementtype) {    //
316            case sstinvalid:
317              {
318                ret = null;
319
320                if ( state == EFindSqlStateType.stnormal )
321                  {
322                    if ( token.tokencode == TBaseType.label_begin )
323                      {
324                        ret = new TCommonBlock(this.vendor);
325                        gnewsqlstatementtype = ret.sqlstatementtype;
326                      }
327                    else if ( token.tokencode == TBaseType.rrw_declare )
328                      {
329                        ret = new TCommonBlock(this.vendor);
330                        gnewsqlstatementtype = ret.sqlstatementtype;
331                      }
332                    else if ( token.tokencode == TBaseType.rrw_begin )
333                      {
334                        ret = new TCommonBlock(this.vendor);
335                        gnewsqlstatementtype = ret.sqlstatementtype;
336                      }
337                    else if ( token.tokencode == TBaseType.rrw_procedure )
338                      {
339                        ret = new TPlsqlCreateProcedure(this.vendor);
340                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createprocedure;
341                        gnewsqlstatementtype = ret.sqlstatementtype;
342                      }
343                    else if ( token.tokencode == TBaseType.rrw_function )
344                      {
345                        ret = new TPlsqlCreateFunction(this.vendor);
346                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createfunction;
347                        gnewsqlstatementtype = ret.sqlstatementtype;
348                      }
349                    else if ( token.tokencode == TBaseType.rrw_package )
350                      {
351                        ret = new TPlsqlCreatePackage(this.vendor);
352                       // ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
353                        gnewsqlstatementtype = ret.sqlstatementtype;
354                      }
355                  }
356                  break;
357              }
358            case sstselect:
359              {
360                boolean lcisnewsql = true;
361
362                if ( state != EFindSqlStateType.stnormal )
363                  {
364                    // lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
365                    if ( (lcprevsolidtoken != null) )
366                      {
367                        if ( lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
368                          lcisnewsql = false; //subquery
369                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_union )
370                          lcisnewsql = false;
371                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_intersect )
372                          lcisnewsql = false;
373                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_minus )
374                          lcisnewsql = false;
375                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_except )
376                          lcisnewsql = false;
377                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_return )
378                          lcisnewsql = false;
379                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_as )
380                          {
381                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable )
382                              lcisnewsql = false;
383                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview )
384                              lcisnewsql = false;
385                          }
386
387                        if ( lcisnewsql && ( lcprevsolidtoken.tokencode == TBaseType.rrw_all) )
388                          {
389                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
390                            if ( (lcpprevsolidtoken != null) )
391                              {
392                                if ( lcpprevsolidtoken.tokencode == TBaseType.rrw_union )
393                                  lcisnewsql = false;
394                              }
395                          }
396
397                      }
398
399
400                    if ( (lccurrentsqlstatement != null) )
401                      {
402                          switch (lccurrentsqlstatement.sqlstatementtype){
403                              case sstinsert:
404                                  lcisnewsql = false;
405                                  break;
406                              case sstcreatetable:
407                              case sstcreateview:
408                                  lcisnewsql = false;
409                                  break;
410                          }
411                      }
412
413                  }
414
415                if ( lcisnewsql )
416                  ret = new TSelectSqlStatement(this.vendor);
417
418                break;
419              }
420            case sstinsert:
421              {
422                boolean lcisnewsql = true;
423                if ( state != EFindSqlStateType.stnormal )
424                  {
425                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
426                    if ( (lcprevsolidtoken != null) )
427                      {
428                        if ( lcprevsolidtoken.toString().equalsIgnoreCase("AFTER") )
429                          lcisnewsql = false;
430                      }
431                    if ( (lccurrentsqlstatement != null) )
432                      {
433
434                      }
435                  }
436
437                if ( lcisnewsql )
438                  ret = new TInsertSqlStatement(this.vendor);
439
440                break;
441              }
442            case sstupdate:
443              {
444                boolean lcisnewsql = true;
445                if ( state != EFindSqlStateType.stnormal )
446                  {
447                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
448                    if ( (lcprevsolidtoken != null) )
449                      { //
450                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
451                          lcisnewsql = false;
452                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_for )
453                          lcisnewsql = false;
454                      }
455
456                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
457                    if ( (lcnextsolidtoken != null) )
458                      {
459                        if ( lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis)
460                          {
461                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist,TBaseType.rrw_select,1,"(");
462                            if ( k  == 0 ) lcisnewsql = false;
463                          }
464                        else if ( lcnextsolidtoken.toString().equalsIgnoreCase("BLOCK") )
465                          lcisnewsql = false;
466                      }
467
468
469                    if ( (lccurrentsqlstatement != null) )
470                      {
471                      }
472                  }
473
474                if ( lcisnewsql )
475                  {
476                    ret = new TUpdateSqlStatement(this.vendor);
477                    ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
478                  }
479                break;
480              }
481            case sstdelete:
482              {
483                boolean lcisnewsql = true;
484
485                if ( state != EFindSqlStateType.stnormal )
486                  {
487                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
488                    if ( (lcprevsolidtoken != null) )
489                      {
490                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
491                          lcisnewsql = false;
492                        else if ( lcprevsolidtoken.toString().equalsIgnoreCase("NO") )
493                          lcisnewsql = false;
494                      }
495
496                    if ( (lccurrentsqlstatement != null) )
497                      {
498                          TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
499                          if ( (lcnextsolidtoken != null) ){
500                              if (lcnextsolidtoken.tokencode == TBaseType.rrw_oracle_rows){
501                                  lcisnewsql = false;
502                              }
503                          }
504                      }
505                  }
506
507                if ( lcisnewsql )
508                  ret = new TDeleteSqlStatement(this.vendor);
509
510                break;
511              }
512            case sstmerge:
513              {
514                ret = new TMergeSqlStatement(this.vendor);
515                ret.sqlstatementtype = gnewsqlstatementtype;
516                break;
517              }
518            case sstoraclecommit:
519              {
520
521                  boolean lcisnewsql = true;
522                  if ( state != EFindSqlStateType.stnormal )
523                  {
524                      lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
525                      if ( (lcprevsolidtoken != null) )
526                      { //
527                          if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
528                              lcisnewsql = false;
529                      }
530                  }
531
532                  if (lcisnewsql){
533                      ret = new TCommitStmt(this.vendor);
534                      ret.sqlstatementtype = gnewsqlstatementtype;
535                  }
536
537                break;
538              }
539            case sstoraclerollback:
540              {
541                ret = new TUnknownSqlStatement(this.vendor);
542                ret.sqlstatementtype = gnewsqlstatementtype;
543                break;
544              }
545            case sstoraclesavepoint:
546              {
547                ret = new TUnknownSqlStatement(this.vendor);
548                ret.sqlstatementtype = gnewsqlstatementtype;
549                  break;
550              }
551            case sstoraclerevoke:
552              {
553                ret = new TUnknownSqlStatement(this.vendor);
554                ret.sqlstatementtype = gnewsqlstatementtype;
555                  break;
556              }
557            case sstoraclegrant:
558              {
559                ret = new TUnknownSqlStatement(this.vendor);
560                ret.sqlstatementtype = gnewsqlstatementtype;
561                  break;
562              }
563            case sstoracleanalyze:
564              {
565                ret = new TUnknownSqlStatement(this.vendor);
566                ret.sqlstatementtype = gnewsqlstatementtype;
567                  break;
568              }
569            case sstTruncate:
570              {
571                  ret = new TTruncateStatement(this.vendor);
572                  ret.sqlstatementtype = gnewsqlstatementtype;
573                  break;
574              }
575            case sstcreatetable:
576              {
577                ret = new TCreateTableSqlStatement(this.vendor);
578                  break;
579              }
580            case sstoraclecreateview:
581              {
582                ret = new TCreateViewSqlStatement(this.vendor);
583                  break;
584              }
585            case sstcreatematerializedview:{
586                ret = new TCreateMaterializedSqlStatement(this.vendor);
587                break;
588            }
589            case sstoraclecreatematerializedviewlog:{
590                ret = new TCreateMaterializedViewLogSqlStatement(this.vendor);
591                break;
592            }
593            case sstoraclecreateindex:
594              {
595                ret = new TCreateIndexSqlStatement(this.vendor);
596                  break;
597              }
598            case sstoraclecreatedatabase:
599              {
600                ret = new TCreateDatabaseSqlStatement(this.vendor);
601                  break;
602              }
603            case sstoracledroptable:
604              {
605                ret = new TDropTableSqlStatement(this.vendor);
606                  break;
607              }
608            case sstoracledropview:
609              {
610               ret = new TDropViewSqlStatement(this.vendor);
611                  break;
612              }
613            case sstoracledropindex:
614              {
615                ret = new TDropIndexSqlStatement(this.vendor);
616                  break;
617              }
618            case sstaltertable:
619              {
620                ret = new TAlterTableStatement(this.vendor);
621                  break;
622              }
623            case sstoraclealtersession:
624              {
625                ret = new TAlterSessionStatement(this.vendor);
626                  break;
627              }
628            case sstplsql_createprocedure:
629            {
630              ret = new TPlsqlCreateProcedure(this.vendor);
631              ret.sqlstatementtype = gnewsqlstatementtype;
632              // System.out.println(gnewsqlstatementtype);
633                break;
634            }
635            case sstplsql_createfunction:
636            {
637              ret = new TPlsqlCreateFunction(this.vendor);
638              ret.sqlstatementtype = gnewsqlstatementtype;
639              // System.out.println(gnewsqlstatementtype);
640                break;
641            }
642            case sstplsql_createpackage:
643            {
644              ret = new TPlsqlCreatePackage(this.vendor);
645              ret.sqlstatementtype = gnewsqlstatementtype;
646              // System.out.println(gnewsqlstatementtype);
647                break;
648            }
649            case sstplsql_createtrigger:
650            {
651              ret = new TPlsqlCreateTrigger(this.vendor);
652              ret.sqlstatementtype = gnewsqlstatementtype;
653              // System.out.println(gnewsqlstatementtype);
654                break;
655            }
656            case sstplsql_execimmestmt:
657              {
658                ret = new TExecImmeStmt(this.vendor);
659               // ret.sqlstatementtype = gnewsqlstatementtype;
660                // System.out.println(gnewsqlstatementtype);
661                  break;
662              }
663            case sstoraclecreatepackagebody:
664             {
665                ret = new TPlsqlCreatePackage(this.vendor);
666                ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
667                 break;
668             }
669            case sstplsql_createtype_placeholder:
670            {
671              ret = new TPlsqlCreateType_Placeholder(this.vendor);
672              ret.sqlstatementtype = gnewsqlstatementtype;
673              // System.out.println(gnewsqlstatementtype);
674                break;
675            }
676            case sstplsql_createtypebody:
677              {
678                ret = new TPlsqlCreateTypeBody(this.vendor);
679                ret.sqlstatementtype = gnewsqlstatementtype;
680                  break;
681              }
682            case sstCommentOn:
683              {
684                ret = new TCommentOnSqlStmt(this.vendor);
685                  break;
686              }
687            case sstoraclecreatesequence:
688              {
689                ret = new TCreateSequenceStmt(this.vendor);
690                  break;
691              }
692            case sstoraclecreatecluster:
693              {
694                ret = new gudusoft.gsqlparser.stmt.oracle.TOracleCreateClusterStmt(this.vendor);
695                  break;
696              }
697            case sstoraclecreatesynonym:
698              {
699                ret = new TCreateSynonymStmt(this.vendor);
700                  break;
701              }
702            case sstoraclecreatedirectory:
703              {
704                ret = new TOracleCreateDirectoryStmt(this.vendor);
705                  break;
706              }
707            case sstoracleexecuteprocedure:
708            {
709                ret = new TOracleExecuteProcedure(this.vendor);
710                break;
711            }
712            case sstExplain:
713            {
714                ret = new TExplainPlan(this.vendor);
715                break;
716            }
717            case sstoraclecreatelibrary:
718                ret = new TOracleCreateLibraryStmt(this.vendor);
719                break;
720            case sstaltertrigger:
721                ret  = new TAlterTriggerStmt(this.vendor);
722                break;
723            case sstoracledropsequence:
724                ret = new TDropSequenceStmt(this.vendor);
725                break;
726            case sstoraclecall:
727                ret = new TCallStatement(this.vendor);
728                break;
729            case sstoraclealterview:
730                ret = new TAlterViewStatement(this.vendor);
731                break;
732            case sstoracledropsynonym:
733                ret = new TDropSynonymStmt(this.vendor);
734                break;
735            case sstoracledropdatabaselink:
736                ret = new TDropDatabaseLinkStmt(this.vendor);
737                break;
738            case sstoraclecreatedatabaselink:
739                ret = new TCreateDatabaseLinkStmt(this.vendor);
740                break;
741            case sstoracledropmaterializedview:
742                ret = new TDropMaterializedViewStmt(this.vendor);
743                break;
744            case sstoracledropmaterializedviewlog:
745                ret = new TDropMaterializedViewLogStmt(this.vendor);
746                break;
747            case sstoraclerename:
748                ret = new TRenameStmt(this.vendor);
749                break;
750            case sstoracledropprocedure:
751                ret = new TDropProcedureStmt(this.vendor);
752                break;
753            case sstAlterMaterializedView:
754                ret = new TAlterMaterializedViewStmt(this.vendor);
755                break;
756            case sstoracledroptrigger:
757                ret = new TDropTriggerSqlStatement(this.vendor);
758                break;
759            case sstoracledropfunction:
760                ret = new TDropFunctionStmt(this.vendor);
761                break;
762            case sstoraclealterindex:
763                ret = new TAlterIndexStmt(this.vendor);
764                break;
765            case sstoraclealtersequence:
766                ret = new TAlterSequenceStatement(this.vendor);
767                break;
768            case sstoraclealtertype:
769                ret = new TAlterTypeStatement(this.vendor);
770                break;
771            case sstAlterLibrary:
772                ret = new TAlterLibraryStmt(this.vendor);
773                break;
774            default:
775              {
776                ret = new TUnknownSqlStatement(this.vendor);
777                ret.sqlstatementtype = gnewsqlstatementtype;
778                break;
779              }
780        }    // case
781
782        return ret;
783    }
784
785    private TCustomSqlStatement findcte(TSourceToken ptoken, EDbVendor pdbvendor){
786        TCustomSqlStatement ret = null;
787        TSourceToken lctoken = null;
788        int lcnested = 0,k,j;
789        boolean inXmlNamespaces = false;
790        boolean isXmlNamespaces = false;
791
792        int lcpos = ptoken.posinlist;
793        TSourceTokenList lcsourcetokenlist = ptoken.container;
794
795        // Oracle 12c WITH FUNCTION/PROCEDURE support - handle inline PL/SQL definitions
796        // Pattern: WITH FUNCTION ... END; [FUNCTION ... END;]* SELECT ...
797        // or: WITH FUNCTION ... END; [FUNCTION ... END;]* cte_name AS (...) SELECT ...
798        boolean hasWithPlsql = false;
799        for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
800            lctoken = lcsourcetokenlist.get(i);
801            if (lctoken.isnonsolidtoken()) continue;
802            // Check if first solid token after WITH is FUNCTION or PROCEDURE
803            if (lctoken.tokencode == TBaseType.rrw_function || lctoken.tokencode == TBaseType.rrw_procedure) {
804                hasWithPlsql = true;
805            }
806            break;
807        }
808
809        if (hasWithPlsql) {
810            // Skip past all PL/SQL function/procedure definitions
811            // Each definition ends with END; and may be followed by more FUNCTION/PROCEDURE or SELECT
812            int beginEndNesting = 0;
813            boolean inPlsqlDef = false;
814            boolean debugWithPlsql = false; // Set to true for debugging
815            if (debugWithPlsql) System.out.println("DEBUG: hasWithPlsql=true, starting loop at " + (lcpos+1));
816            for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
817                lctoken = lcsourcetokenlist.get(i);
818                if (lctoken.isnonsolidtoken()) continue;
819                if (debugWithPlsql) System.out.println("DEBUG: i=" + i + " token=" + lctoken.toString() + " code=" + lctoken.tokencode + " inPlsqlDef=" + inPlsqlDef + " nesting=" + beginEndNesting);
820
821                if (lctoken.tokencode == TBaseType.rrw_function || lctoken.tokencode == TBaseType.rrw_procedure) {
822                    inPlsqlDef = true;
823                    if (debugWithPlsql) System.out.println("DEBUG: Found FUNCTION/PROCEDURE, inPlsqlDef=true");
824                    continue;
825                }
826
827                if (inPlsqlDef) {
828                    if (lctoken.tokencode == TBaseType.rrw_begin) {
829                        beginEndNesting++;
830                        if (debugWithPlsql) System.out.println("DEBUG: Found BEGIN, nesting=" + beginEndNesting);
831                    } else if (lctoken.tokencode == TBaseType.rrw_end) {
832                        beginEndNesting--;
833                        if (debugWithPlsql) System.out.println("DEBUG: Found END, nesting=" + beginEndNesting);
834                        if (beginEndNesting <= 0) {
835                            // Look for semicolon after END
836                            for (int m = i + 1; m < lcsourcetokenlist.size(); m++) {
837                                TSourceToken nextToken = lcsourcetokenlist.get(m);
838                                if (nextToken.isnonsolidtoken()) continue;
839                                if (nextToken.tokentype == ETokenType.ttsemicolon) {
840                                    if (debugWithPlsql) System.out.println("DEBUG: Found ; after END at " + m + ", setting inPlsqlDef=false");
841                                    i = m;  // Continue from after the semicolon
842                                    inPlsqlDef = false;
843                                    beginEndNesting = 0;
844                                }
845                                break;
846                            }
847                        }
848                    }
849                    continue;
850                }
851
852                // Not in PL/SQL definition - check for SELECT or CTE
853                if (lctoken.tokencode == TBaseType.rrw_select) {
854                    if (debugWithPlsql) System.out.println("DEBUG: Found SELECT at " + i + ", returning TSelectSqlStatement");
855                    ret = new TSelectSqlStatement(pdbvendor);
856                    ret.isctequery = true;
857                    gnewsqlstatementtype = ESqlStatementType.sstselect;
858                    // DON'T mark tokens as ignored - let YACC parser handle the full statement
859                    // The WITH FUNCTION ... part is part of the statement, not a separate block
860                    return ret;
861                }
862
863                // Could be CTE identifier followed by AS
864                if (lctoken.tokentype == ETokenType.ttidentifier) {
865                    if (debugWithPlsql) System.out.println("DEBUG: Found identifier, checking for CTE");
866                    // Look for AS keyword after identifier - this is a CTE definition
867                    for (int m = i + 1; m < lcsourcetokenlist.size(); m++) {
868                        TSourceToken nextToken = lcsourcetokenlist.get(m);
869                        if (nextToken.isnonsolidtoken()) continue;
870                        if (nextToken.tokencode == TBaseType.rrw_as) {
871                            // Found CTE - continue with normal CTE processing from this point
872                            if (debugWithPlsql) System.out.println("DEBUG: Found CTE pattern, resetting lcpos");
873                            lcpos = i - 1;  // Reset to process from CTE identifier
874                        }
875                        break;
876                    }
877                    break;  // Exit the WITH PLSQL handling and continue normal processing
878                }
879            }
880            if (debugWithPlsql) System.out.println("DEBUG: Exiting hasWithPlsql block, ret=" + ret);
881        }
882
883        for (int i = lcpos + 1; i <  lcsourcetokenlist.size();i++)    // iterate
884          {
885            lctoken = lcsourcetokenlist.get(i);
886//        if (lctoken.tokencode == TBaseType.rrw_postgresql_recursive){
887//            continue;
888//        }
889              if (lctoken.tokencode == TBaseType.rrw_xmlnamespaces){
890                  inXmlNamespaces = true;
891                  lcnested = 0;
892                  continue;
893              }
894              if (inXmlNamespaces) {
895                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
896                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) {
897                      lcnested--;
898                      if (lcnested == 0) {
899                        inXmlNamespaces = false;
900                        isXmlNamespaces = true;
901                      }
902                  }
903                  continue;
904              }
905            if (( lctoken.tokencode == TBaseType.rrw_as ) || isXmlNamespaces)
906              {
907                lcnested = 0;
908                int startPos = i+1;
909                if (isXmlNamespaces) startPos = i;
910                for ( j = startPos; j < lcsourcetokenlist.size();j++)
911                {
912                  lctoken = lcsourcetokenlist.get(j);
913                  if (lctoken.isnonsolidtoken() ) continue;
914                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
915                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) lcnested--;
916
917
918                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_delete) )
919                    {
920                      ret = new TDeleteSqlStatement(pdbvendor);
921                      ret.isctequery = true;
922                      gnewsqlstatementtype = ESqlStatementType.sstdelete;
923                      break;
924                    }
925
926                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_merge) )
927                      {
928                        ret = new TMergeSqlStatement(pdbvendor);
929                        ret.isctequery = true;
930                        gnewsqlstatementtype = ESqlStatementType.sstmerge;
931                        break;
932                      }
933
934                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_insert) )
935                    {
936                      ret = new TInsertSqlStatement(pdbvendor);
937                      ret.isctequery = true;
938                      gnewsqlstatementtype = ESqlStatementType.sstinsert;
939                      ret.dummytag = 1; //  select stmt in insert is permitted
940
941                      for ( k = lctoken.posinlist + 1; k < lcsourcetokenlist.size();k++)    // iterate
942                      {
943                        if ( lcsourcetokenlist.get(k).isnonsolidtoken()  ) continue;
944                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_values ) break;
945                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_go ) break;
946                        if ( lcsourcetokenlist.get(k).tokentype == ETokenType.ttsemicolon ) break;
947                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_select ) break;
948                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_execute ) break;
949                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_exec ) break;
950                      }    // for
951                      if ( k > lcsourcetokenlist.size() - 1 )
952                        k = lcsourcetokenlist.size() - 1;
953
954                      for (int m = lctoken.posinlist + 1; m <=  k; m++)    // iterate
955                      {
956                        lcsourcetokenlist.get(m).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
957                      }    // for
958
959                      break;
960                    }
961
962                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_values) &&(pdbvendor == EDbVendor.dbvpostgresql) )
963                    {
964                            ret = new TSelectSqlStatement(pdbvendor);
965                            ret.isctequery = true;
966                            gnewsqlstatementtype = ESqlStatementType.sstselect;
967                            break;
968                    }
969
970                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_select) )
971                    {
972                      ret = new TSelectSqlStatement(pdbvendor);
973                      ret.isctequery = true;
974                      gnewsqlstatementtype = ESqlStatementType.sstselect;
975                      break;
976                    }
977
978                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_update) )
979                    {
980                      ret = new TUpdateSqlStatement(pdbvendor);
981                      ret.isctequery = true;
982                      ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
983                      gnewsqlstatementtype = ESqlStatementType.sstupdate;
984                      break;
985                    }
986
987                    if ( (pdbvendor == EDbVendor.dbvhive) && (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_from) )
988                    {
989                        TSourceToken cmdToken = lctoken.searchToken(TBaseType.rrw_insert,3);
990                        if (cmdToken != null){
991                            ret = new TInsertSqlStatement(pdbvendor);
992                            ret.isctequery = true;
993                            gnewsqlstatementtype = ESqlStatementType.sstinsert;
994
995                        }else{
996                            ret = new TSelectSqlStatement(pdbvendor);
997                            ret.isctequery = true;
998                            gnewsqlstatementtype = ESqlStatementType.ssthiveFromQuery;
999                        }
1000                        break;
1001                    }
1002
1003
1004                }    // for
1005
1006                if ( (ret != null) )
1007                  {
1008                    for (k = lcpos + 1; k <= j;k++)    // iterate
1009                    {
1010                      lcsourcetokenlist.get(k).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
1011                    }    // for
1012                    break;
1013                  }
1014
1015              }
1016          }
1017
1018        return ret;
1019    }
1020}