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