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 sstoraclecreatesynonym:
693              {
694                ret = new TCreateSynonymStmt(this.vendor);
695                  break;
696              }
697            case sstoraclecreatedirectory:
698              {
699                ret = new TOracleCreateDirectoryStmt(this.vendor);
700                  break;
701              }
702            case sstoracleexecuteprocedure:
703            {
704                ret = new TOracleExecuteProcedure(this.vendor);
705                break;
706            }
707            case sstExplain:
708            {
709                ret = new TExplainPlan(this.vendor);
710                break;
711            }
712            case sstoraclecreatelibrary:
713                ret = new TOracleCreateLibraryStmt(this.vendor);
714                break;
715            case sstaltertrigger:
716                ret  = new TAlterTriggerStmt(this.vendor);
717                break;
718            case sstoracledropsequence:
719                ret = new TDropSequenceStmt(this.vendor);
720                break;
721            case sstoraclecall:
722                ret = new TCallStatement(this.vendor);
723                break;
724            case sstoraclealterview:
725                ret = new TAlterViewStatement(this.vendor);
726                break;
727            case sstoracledropsynonym:
728                ret = new TDropSynonymStmt(this.vendor);
729                break;
730            case sstoracledropdatabaselink:
731                ret = new TDropDatabaseLinkStmt(this.vendor);
732                break;
733            case sstoraclecreatedatabaselink:
734                ret = new TCreateDatabaseLinkStmt(this.vendor);
735                break;
736            case sstoracledropmaterializedview:
737                ret = new TDropMaterializedViewStmt(this.vendor);
738                break;
739            case sstoracledropmaterializedviewlog:
740                ret = new TDropMaterializedViewLogStmt(this.vendor);
741                break;
742            case sstoraclerename:
743                ret = new TRenameStmt(this.vendor);
744                break;
745            case sstoracledropprocedure:
746                ret = new TDropProcedureStmt(this.vendor);
747                break;
748            case sstAlterMaterializedView:
749                ret = new TAlterMaterializedViewStmt(this.vendor);
750                break;
751            case sstoracledroptrigger:
752                ret = new TDropTriggerSqlStatement(this.vendor);
753                break;
754            case sstoracledropfunction:
755                ret = new TDropFunctionStmt(this.vendor);
756                break;
757            case sstoraclealterindex:
758                ret = new TAlterIndexStmt(this.vendor);
759                break;
760            case sstoraclealtersequence:
761                ret = new TAlterSequenceStatement(this.vendor);
762                break;
763            case sstoraclealtertype:
764                ret = new TAlterTypeStatement(this.vendor);
765                break;
766            case sstAlterLibrary:
767                ret = new TAlterLibraryStmt(this.vendor);
768                break;
769            default:
770              {
771                ret = new TUnknownSqlStatement(this.vendor);
772                ret.sqlstatementtype = gnewsqlstatementtype;
773                break;
774              }
775        }    // case
776
777        return ret;
778    }
779
780    private TCustomSqlStatement findcte(TSourceToken ptoken, EDbVendor pdbvendor){
781        TCustomSqlStatement ret = null;
782        TSourceToken lctoken = null;
783        int lcnested = 0,k,j;
784        boolean inXmlNamespaces = false;
785        boolean isXmlNamespaces = false;
786
787        int lcpos = ptoken.posinlist;
788        TSourceTokenList lcsourcetokenlist = ptoken.container;
789
790        // Oracle 12c WITH FUNCTION/PROCEDURE support - handle inline PL/SQL definitions
791        // Pattern: WITH FUNCTION ... END; [FUNCTION ... END;]* SELECT ...
792        // or: WITH FUNCTION ... END; [FUNCTION ... END;]* cte_name AS (...) SELECT ...
793        boolean hasWithPlsql = false;
794        for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
795            lctoken = lcsourcetokenlist.get(i);
796            if (lctoken.isnonsolidtoken()) continue;
797            // Check if first solid token after WITH is FUNCTION or PROCEDURE
798            if (lctoken.tokencode == TBaseType.rrw_function || lctoken.tokencode == TBaseType.rrw_procedure) {
799                hasWithPlsql = true;
800            }
801            break;
802        }
803
804        if (hasWithPlsql) {
805            // Skip past all PL/SQL function/procedure definitions
806            // Each definition ends with END; and may be followed by more FUNCTION/PROCEDURE or SELECT
807            int beginEndNesting = 0;
808            boolean inPlsqlDef = false;
809            boolean debugWithPlsql = false; // Set to true for debugging
810            if (debugWithPlsql) System.out.println("DEBUG: hasWithPlsql=true, starting loop at " + (lcpos+1));
811            for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
812                lctoken = lcsourcetokenlist.get(i);
813                if (lctoken.isnonsolidtoken()) continue;
814                if (debugWithPlsql) System.out.println("DEBUG: i=" + i + " token=" + lctoken.toString() + " code=" + lctoken.tokencode + " inPlsqlDef=" + inPlsqlDef + " nesting=" + beginEndNesting);
815
816                if (lctoken.tokencode == TBaseType.rrw_function || lctoken.tokencode == TBaseType.rrw_procedure) {
817                    inPlsqlDef = true;
818                    if (debugWithPlsql) System.out.println("DEBUG: Found FUNCTION/PROCEDURE, inPlsqlDef=true");
819                    continue;
820                }
821
822                if (inPlsqlDef) {
823                    if (lctoken.tokencode == TBaseType.rrw_begin) {
824                        beginEndNesting++;
825                        if (debugWithPlsql) System.out.println("DEBUG: Found BEGIN, nesting=" + beginEndNesting);
826                    } else if (lctoken.tokencode == TBaseType.rrw_end) {
827                        beginEndNesting--;
828                        if (debugWithPlsql) System.out.println("DEBUG: Found END, nesting=" + beginEndNesting);
829                        if (beginEndNesting <= 0) {
830                            // Look for semicolon after END
831                            for (int m = i + 1; m < lcsourcetokenlist.size(); m++) {
832                                TSourceToken nextToken = lcsourcetokenlist.get(m);
833                                if (nextToken.isnonsolidtoken()) continue;
834                                if (nextToken.tokentype == ETokenType.ttsemicolon) {
835                                    if (debugWithPlsql) System.out.println("DEBUG: Found ; after END at " + m + ", setting inPlsqlDef=false");
836                                    i = m;  // Continue from after the semicolon
837                                    inPlsqlDef = false;
838                                    beginEndNesting = 0;
839                                }
840                                break;
841                            }
842                        }
843                    }
844                    continue;
845                }
846
847                // Not in PL/SQL definition - check for SELECT or CTE
848                if (lctoken.tokencode == TBaseType.rrw_select) {
849                    if (debugWithPlsql) System.out.println("DEBUG: Found SELECT at " + i + ", returning TSelectSqlStatement");
850                    ret = new TSelectSqlStatement(pdbvendor);
851                    ret.isctequery = true;
852                    gnewsqlstatementtype = ESqlStatementType.sstselect;
853                    // DON'T mark tokens as ignored - let YACC parser handle the full statement
854                    // The WITH FUNCTION ... part is part of the statement, not a separate block
855                    return ret;
856                }
857
858                // Could be CTE identifier followed by AS
859                if (lctoken.tokentype == ETokenType.ttidentifier) {
860                    if (debugWithPlsql) System.out.println("DEBUG: Found identifier, checking for CTE");
861                    // Look for AS keyword after identifier - this is a CTE definition
862                    for (int m = i + 1; m < lcsourcetokenlist.size(); m++) {
863                        TSourceToken nextToken = lcsourcetokenlist.get(m);
864                        if (nextToken.isnonsolidtoken()) continue;
865                        if (nextToken.tokencode == TBaseType.rrw_as) {
866                            // Found CTE - continue with normal CTE processing from this point
867                            if (debugWithPlsql) System.out.println("DEBUG: Found CTE pattern, resetting lcpos");
868                            lcpos = i - 1;  // Reset to process from CTE identifier
869                        }
870                        break;
871                    }
872                    break;  // Exit the WITH PLSQL handling and continue normal processing
873                }
874            }
875            if (debugWithPlsql) System.out.println("DEBUG: Exiting hasWithPlsql block, ret=" + ret);
876        }
877
878        for (int i = lcpos + 1; i <  lcsourcetokenlist.size();i++)    // iterate
879          {
880            lctoken = lcsourcetokenlist.get(i);
881//        if (lctoken.tokencode == TBaseType.rrw_postgresql_recursive){
882//            continue;
883//        }
884              if (lctoken.tokencode == TBaseType.rrw_xmlnamespaces){
885                  inXmlNamespaces = true;
886                  lcnested = 0;
887                  continue;
888              }
889              if (inXmlNamespaces) {
890                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
891                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) {
892                      lcnested--;
893                      if (lcnested == 0) {
894                        inXmlNamespaces = false;
895                        isXmlNamespaces = true;
896                      }
897                  }
898                  continue;
899              }
900            if (( lctoken.tokencode == TBaseType.rrw_as ) || isXmlNamespaces)
901              {
902                lcnested = 0;
903                int startPos = i+1;
904                if (isXmlNamespaces) startPos = i;
905                for ( j = startPos; j < lcsourcetokenlist.size();j++)
906                {
907                  lctoken = lcsourcetokenlist.get(j);
908                  if (lctoken.isnonsolidtoken() ) continue;
909                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
910                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) lcnested--;
911
912
913                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_delete) )
914                    {
915                      ret = new TDeleteSqlStatement(pdbvendor);
916                      ret.isctequery = true;
917                      gnewsqlstatementtype = ESqlStatementType.sstdelete;
918                      break;
919                    }
920
921                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_merge) )
922                      {
923                        ret = new TMergeSqlStatement(pdbvendor);
924                        ret.isctequery = true;
925                        gnewsqlstatementtype = ESqlStatementType.sstmerge;
926                        break;
927                      }
928
929                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_insert) )
930                    {
931                      ret = new TInsertSqlStatement(pdbvendor);
932                      ret.isctequery = true;
933                      gnewsqlstatementtype = ESqlStatementType.sstinsert;
934                      ret.dummytag = 1; //  select stmt in insert is permitted
935
936                      for ( k = lctoken.posinlist + 1; k < lcsourcetokenlist.size();k++)    // iterate
937                      {
938                        if ( lcsourcetokenlist.get(k).isnonsolidtoken()  ) continue;
939                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_values ) break;
940                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_go ) break;
941                        if ( lcsourcetokenlist.get(k).tokentype == ETokenType.ttsemicolon ) break;
942                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_select ) break;
943                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_execute ) break;
944                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_exec ) break;
945                      }    // for
946                      if ( k > lcsourcetokenlist.size() - 1 )
947                        k = lcsourcetokenlist.size() - 1;
948
949                      for (int m = lctoken.posinlist + 1; m <=  k; m++)    // iterate
950                      {
951                        lcsourcetokenlist.get(m).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
952                      }    // for
953
954                      break;
955                    }
956
957                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_values) &&(pdbvendor == EDbVendor.dbvpostgresql) )
958                    {
959                            ret = new TSelectSqlStatement(pdbvendor);
960                            ret.isctequery = true;
961                            gnewsqlstatementtype = ESqlStatementType.sstselect;
962                            break;
963                    }
964
965                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_select) )
966                    {
967                      ret = new TSelectSqlStatement(pdbvendor);
968                      ret.isctequery = true;
969                      gnewsqlstatementtype = ESqlStatementType.sstselect;
970                      break;
971                    }
972
973                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_update) )
974                    {
975                      ret = new TUpdateSqlStatement(pdbvendor);
976                      ret.isctequery = true;
977                      ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
978                      gnewsqlstatementtype = ESqlStatementType.sstupdate;
979                      break;
980                    }
981
982                    if ( (pdbvendor == EDbVendor.dbvhive) && (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_from) )
983                    {
984                        TSourceToken cmdToken = lctoken.searchToken(TBaseType.rrw_insert,3);
985                        if (cmdToken != null){
986                            ret = new TInsertSqlStatement(pdbvendor);
987                            ret.isctequery = true;
988                            gnewsqlstatementtype = ESqlStatementType.sstinsert;
989
990                        }else{
991                            ret = new TSelectSqlStatement(pdbvendor);
992                            ret.isctequery = true;
993                            gnewsqlstatementtype = ESqlStatementType.ssthiveFromQuery;
994                        }
995                        break;
996                    }
997
998
999                }    // for
1000
1001                if ( (ret != null) )
1002                  {
1003                    for (k = lcpos + 1; k <= j;k++)    // iterate
1004                    {
1005                      lcsourcetokenlist.get(k).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
1006                    }    // for
1007                    break;
1008                  }
1009
1010              }
1011          }
1012
1013        return ret;
1014    }
1015}