001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.oracle.*;
006
007/**
008 * Dameng SQL command resolver.
009 * Contains all Dameng-specific SQL command recognition logic.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsDameng extends AbstractSqlCmds {
014
015    // Temporary field for statement type during issql processing
016    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
017
018    public TSqlCmdsDameng() {
019        super(EDbVendor.dbvdameng);
020    }
021
022    @Override
023    protected String getToken1Str(int token1) {
024        // Dameng currently has no vendor-specific reserved words requiring token1Str
025        // Override this method when Dameng-specific tokens > TBaseType.rrw_abort are added
026        return null;
027    }
028
029    @Override
030    protected void initializeCommands() {
031        // Dameng commands must be sorted alphabetically by token1
032        addCmd(TBaseType.rrw_alter, "class", ESqlStatementType.sstoraclealtertype);
033        addCmd(TBaseType.rrw_alter, "cluster", ESqlStatementType.sstoraclealtercluster);
034        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstoraclealterdatabase);
035        addCmd(TBaseType.rrw_alter, "dimension", ESqlStatementType.sstoraclealterdimension);
036        addCmd(TBaseType.rrw_alter, "diskgroup", ESqlStatementType.sstoraclealterdiskgroup);
037        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstoraclealterfunction);
038        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstoraclealterindex);
039        addCmd(TBaseType.rrw_alter, "library", ESqlStatementType.sstAlterLibrary);
040        addCmd(TBaseType.rrw_alter, "indextype", ESqlStatementType.sstoraclealterindextype);
041        addCmd(TBaseType.rrw_alter, "java", ESqlStatementType.sstoraclealterjava);
042        addCmd(TBaseType.rrw_alter, "materialized", "view", "log", ESqlStatementType.sstoraclealtermaterializedviewlog);
043        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstAlterMaterializedView);
044        addCmd(TBaseType.rrw_alter, "operator", ESqlStatementType.sstoraclealteroperator);
045        addCmd(TBaseType.rrw_alter, "outline", ESqlStatementType.sstoraclealteroutline);
046        addCmd(TBaseType.rrw_alter, "package", ESqlStatementType.sstoraclealterpackage);
047        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstoraclealterprocedure);
048        addCmd(TBaseType.rrw_alter, "profile", ESqlStatementType.sstoraclealterprofile);
049        addCmd(TBaseType.rrw_alter, "resource", "cost", ESqlStatementType.sstoraclealterresourcecost);
050        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstoraclealterrole);
051        addCmd(TBaseType.rrw_alter, "rollback", "segment", ESqlStatementType.sstoraclealterrollbacksegment);
052        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstoraclealtersequence);
053        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstoraclealtersession);
054        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstoraclealtersystem);
055        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
056        addCmd(TBaseType.rrw_alter, "tablespace", ESqlStatementType.sstoraclealtertablespace);
057        addCmd(TBaseType.rrw_alter, "trigger", ESqlStatementType.sstaltertrigger);
058        addCmd(TBaseType.rrw_alter, "type", ESqlStatementType.sstoraclealtertype);
059        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstoraclealteruser);
060        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstoraclealterview);
061        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstoracleanalyze);
062        addCmd(TBaseType.rrw_associate, "statistics", ESqlStatementType.sstoracleassociatestatistics);
063        addCmd(TBaseType.rrw_audit, ESqlStatementType.sstoracleaudit);
064        addCmd(TBaseType.rrw_call, ESqlStatementType.sstoraclecall);
065        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstCommentOn);
066        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstoraclecommit);
067        addCmd(TBaseType.rrw_create, "assertion", ESqlStatementType.sstcreateassertion);
068        addCmd(TBaseType.rrw_create, "bigfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
069        addCmd(TBaseType.rrw_create, "bitmap", "index", ESqlStatementType.sstoraclecreateindex);
070        addCmd(TBaseType.rrw_create, "blockchain", "table", ESqlStatementType.sstcreatetable);
071        addCmd(TBaseType.rrw_create, "cluster", ESqlStatementType.sstoraclecreatecluster);
072        addCmd(TBaseType.rrw_create, "context", ESqlStatementType.sstoraclecreatecontext);
073        addCmd(TBaseType.rrw_create, "controlfile", ESqlStatementType.sstoraclecreatecontrolfile);
074        addCmd(TBaseType.rrw_create, "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
075        addCmd(TBaseType.rrw_create, "editionable", "function", ESqlStatementType.sstplsql_createfunction);
076        addCmd(TBaseType.rrw_create, "editionable", "library", ESqlStatementType.sstoraclecreatelibrary);
077        addCmd(TBaseType.rrw_create, "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
078        addCmd(TBaseType.rrw_create, "editionable", "package", ESqlStatementType.sstplsql_createpackage);
079        addCmd(TBaseType.rrw_create, "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
080        addCmd(TBaseType.rrw_create, "editionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
081        addCmd(TBaseType.rrw_create, "editionable", "view", ESqlStatementType.sstoraclecreateview);
082        addCmd(TBaseType.rrw_create, "editioning", "view", ESqlStatementType.sstoraclecreateview);
083        addCmd(TBaseType.rrw_create, "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
084        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstoraclecreatedatabase);
085        addCmd(TBaseType.rrw_create, "dimension", ESqlStatementType.sstoraclecreatedimension);
086        addCmd(TBaseType.rrw_create, "directory", ESqlStatementType.sstoraclecreatedirectory);
087        addCmd(TBaseType.rrw_create, "diskgroup", ESqlStatementType.sstoraclecreatediskgroup);
088        addCmd(TBaseType.rrw_create, "domain", ESqlStatementType.sstoraclecreatedomain);
089        addCmd(TBaseType.rrw_create, "duplicated", "table", ESqlStatementType.sstcreatetable);
090        addCmd(TBaseType.rrw_create, "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
091        addCmd(TBaseType.rrw_create, "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
092        addCmd(TBaseType.rrw_create, "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
093        addCmd(TBaseType.rrw_create, "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
094        addCmd(TBaseType.rrw_create, "force", "view", ESqlStatementType.sstoraclecreateview);
095        addCmd(TBaseType.rrw_create, "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
096        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstplsql_createfunction);
097        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
098        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
099        addCmd(TBaseType.rrw_create, "huge", "table", ESqlStatementType.sstcreatetable);
100        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
101        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
102        addCmd(TBaseType.rrw_create, "immutable", "table", ESqlStatementType.sstcreatetable);
103        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstoraclecreateindex);
104        addCmd(TBaseType.rrw_create, "indextype", ESqlStatementType.sstoraclecreateindextype);
105        addCmd(TBaseType.rrw_create, "java", ESqlStatementType.sstoraclecreatejava);
106        addCmd(TBaseType.rrw_create, "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
107        addCmd(TBaseType.rrw_create, "library", ESqlStatementType.sstoraclecreatelibrary);
108        addCmd(TBaseType.rrw_create, "mle", "module", ESqlStatementType.sstoraclecreatemlemodule);
109        addCmd(TBaseType.rrw_create, "materialized", "view", "log", ESqlStatementType.sstoraclecreatematerializedviewlog);
110        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
111        addCmd(TBaseType.rrw_create, "multivalue", "index", ESqlStatementType.sstoraclecreateindex);
112        addCmd(TBaseType.rrw_create, "no", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
113        addCmd(TBaseType.rrw_create, "no", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
114        addCmd(TBaseType.rrw_create, "no", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
115        addCmd(TBaseType.rrw_create, "no", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
116        addCmd(TBaseType.rrw_create, "no", "force", "view", ESqlStatementType.sstoraclecreateview);
117        addCmd(TBaseType.rrw_create, "no", "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
118        addCmd(TBaseType.rrw_create, "noforce", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
119        addCmd(TBaseType.rrw_create, "noforce", "editionable", "view", ESqlStatementType.sstoraclecreateview);
120        addCmd(TBaseType.rrw_create, "noforce", "editioning", "view", ESqlStatementType.sstoraclecreateview);
121        addCmd(TBaseType.rrw_create, "noforce", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
122        addCmd(TBaseType.rrw_create, "noforce", "view", ESqlStatementType.sstoraclecreateview);
123        addCmd(TBaseType.rrw_create, "noforce", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
124        addCmd(TBaseType.rrw_create, "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
125        addCmd(TBaseType.rrw_create, "noneditionable", "library", ESqlStatementType.sstoraclecreatelibrary);
126        addCmd(TBaseType.rrw_create, "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
127        addCmd(TBaseType.rrw_create, "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
128        addCmd(TBaseType.rrw_create, "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
129        addCmd(TBaseType.rrw_create, "noneditionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
130        addCmd(TBaseType.rrw_create, "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
131        addCmd(TBaseType.rrw_create, "operator", ESqlStatementType.sstoraclecreateoperator);
132        addCmd(TBaseType.rrw_create, "or", "replace", "context", ESqlStatementType.sstoraclecreatecontext);
133        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
134        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "function", ESqlStatementType.sstplsql_createfunction);
135        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
136        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "package", ESqlStatementType.sstplsql_createpackage);
137        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
138        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
139        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "view", ESqlStatementType.sstoraclecreateview);
140        addCmd(TBaseType.rrw_create, "or", "replace", "editioning", "view", ESqlStatementType.sstoraclecreateview);
141        addCmd(TBaseType.rrw_create, "or", "replace", "directory", ESqlStatementType.sstoraclecreatedirectory);
142        addCmd(TBaseType.rrw_create, "or", "replace", "domain", ESqlStatementType.sstoraclecreatedomain);
143        addCmd(TBaseType.rrw_create, "or", "replace", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
144        addCmd(TBaseType.rrw_create, "or", "replace", "force", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
145        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "json", "relational", "duality", "view", ESqlStatementType.sstoraclecreatejsonrelationaldualityview);
146        addCmd(TBaseType.rrw_create, "or", "replace", "force", "view", ESqlStatementType.sstoraclecreateview);
147        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
148        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
149        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
150        addCmd(TBaseType.rrw_create, "or", "replace", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
151        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstplsql_createfunction);
152        addCmd(TBaseType.rrw_create, "or", "replace", "editionable", "library", ESqlStatementType.sstoraclecreatelibrary);
153        addCmd(TBaseType.rrw_create, "or", "replace", "library", ESqlStatementType.sstoraclecreatelibrary);
154        addCmd(TBaseType.rrw_create, "or", "replace", "mle", "module", ESqlStatementType.sstoraclecreatemlemodule);
155        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
156        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editionable", "view", ESqlStatementType.sstoraclecreateview);
157        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "editioning", "view", ESqlStatementType.sstoraclecreateview);
158        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
159        addCmd(TBaseType.rrw_create, "or", "replace", "no", "force", "view", ESqlStatementType.sstoraclecreateview);
160        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editionable", "editioning", "view", ESqlStatementType.sstoraclecreateview);
161        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editionable", "view", ESqlStatementType.sstoraclecreateview);
162        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "editioning", "view", ESqlStatementType.sstoraclecreateview);
163        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
164        addCmd(TBaseType.rrw_create, "or", "replace", "noforce", "view", ESqlStatementType.sstoraclecreateview);
165        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "library", ESqlStatementType.sstoraclecreatelibrary);
166        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "function", ESqlStatementType.sstplsql_createfunction);
167        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
168        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "package", ESqlStatementType.sstplsql_createpackage);
169        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "procedure", ESqlStatementType.sstplsql_createprocedure);
170        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
171        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "trigger", ESqlStatementType.sstplsql_createtrigger);
172        addCmd(TBaseType.rrw_create, "or", "replace", "noneditionable", "view", ESqlStatementType.sstoraclecreateview);
173        addCmd(TBaseType.rrw_create, "or", "replace", "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
174        addCmd(TBaseType.rrw_create, "or", "replace", "package", ESqlStatementType.sstplsql_createpackage);
175        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstplsql_createprocedure);
176        addCmd(TBaseType.rrw_create, "or", "replace", "property", "graph", ESqlStatementType.sstoraclecreatepropertygraph);
177        addCmd(TBaseType.rrw_create, "or", "replace", "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
178        addCmd(TBaseType.rrw_create, "or", "replace", "synonym", ESqlStatementType.sstoraclecreatesynonym);
179        addCmd(TBaseType.rrw_create, "or", "replace", "trigger", ESqlStatementType.sstplsql_createtrigger);
180        addCmd(TBaseType.rrw_create, "or", "replace", "class", ESqlStatementType.sstplsql_createtypebody);
181        addCmd(TBaseType.rrw_create, "or", "replace", "type", "body", ESqlStatementType.sstplsql_createtypebody);
182        addCmd(TBaseType.rrw_create, "or", "replace", "type", ESqlStatementType.sstplsql_createtype_placeholder);
183        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstoraclecreateview);
184        addCmd(TBaseType.rrw_create, "outline", ESqlStatementType.sstoraclecreateoutline);
185        addCmd(TBaseType.rrw_create, "private", "temporary", "table", ESqlStatementType.sstcreatetable);
186        addCmd(TBaseType.rrw_create, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
187        addCmd(TBaseType.rrw_create, "package", ESqlStatementType.sstplsql_createpackage);
188        addCmd(TBaseType.rrw_create, "pfile", ESqlStatementType.sstoraclecreatepfile);
189        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstplsql_createprocedure);
190        addCmd(TBaseType.rrw_create, "profile", ESqlStatementType.sstoraclecreateprofile);
191        addCmd(TBaseType.rrw_create, "property", "graph", ESqlStatementType.sstoraclecreatepropertygraph);
192        addCmd(TBaseType.rrw_create, "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
193        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstoraclecreatesynonym);
194        addCmd(TBaseType.rrw_create, "resotre", "point", ESqlStatementType.sstoraclecreaterestorepoint);
195        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstoraclecreaterole);
196        addCmd(TBaseType.rrw_create, "rollback", "segment", ESqlStatementType.sstoraclecreaterollbacksegment);
197        addCmd(TBaseType.rrw_create, "shared", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
198        addCmd(TBaseType.rrw_create, "shared", "public", "database", "link", ESqlStatementType.sstoraclecreatedatabaselink);
199        addCmd(TBaseType.rrw_create, "sharded", "table", ESqlStatementType.sstcreatetable);
200        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstoraclecreateschema);
201        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstoraclecreatesequence);
202        addCmd(TBaseType.rrw_create, "smallfile", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
203        addCmd(TBaseType.rrw_create, "spfile", ESqlStatementType.sstoraclecreatespfile);
204        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstoraclecreatesynonym);
205        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
206        addCmd(TBaseType.rrw_create, "tablespace", ESqlStatementType.sstoraclecreatetablespace);
207        addCmd(TBaseType.rrw_create, "temporary", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
208        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstplsql_createtrigger);
209        addCmd(TBaseType.rrw_create, "class", ESqlStatementType.sstplsql_createtypebody);
210        addCmd(TBaseType.rrw_create, "type", "body", ESqlStatementType.sstplsql_createtypebody);
211        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstplsql_createtype_placeholder);
212        addCmd(TBaseType.rrw_create, "undo", "tablespace", ESqlStatementType.sstoraclecreatetablespace);
213        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstoraclecreateindex);
214        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstoraclecreateuser);
215        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstoraclecreateview);
216        addCmd(TBaseType.rrw_custom, "package", "body", ESqlStatementType.sstoraclecreatepackagebody);
217        addCmd(TBaseType.rrw_custom, "package", ESqlStatementType.sstplsql_createpackage);
218        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
219        addCmd(TBaseType.rrw_disassociate, "statistics", ESqlStatementType.sstoracledisassociatestatistics);
220        addCmd(TBaseType.rrw_drop, "cluster", ESqlStatementType.sstoracledropcluster);
221        addCmd(TBaseType.rrw_drop, "context", ESqlStatementType.sstoracledropcontext);
222        addCmd(TBaseType.rrw_drop, "database", "link", ESqlStatementType.sstoracledropdatabaselink);
223        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstoracledropdatabase);
224        addCmd(TBaseType.rrw_drop, "dimension", ESqlStatementType.sstoracledropdimension);
225        addCmd(TBaseType.rrw_drop, "directory", ESqlStatementType.sstoracledropdirectory);
226        addCmd(TBaseType.rrw_drop, "diskgroup", ESqlStatementType.sstoracledropdiskgroup);
227        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstoracledropfunction);
228        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstoracledropindex);
229        addCmd(TBaseType.rrw_drop, "indextype", ESqlStatementType.sstoracledropindextype);
230        addCmd(TBaseType.rrw_drop, "java", ESqlStatementType.sstoracledropjava);
231        addCmd(TBaseType.rrw_drop, "library", ESqlStatementType.sstoracledroplibrary);
232        addCmd(TBaseType.rrw_drop, "materialized", "view", "log", ESqlStatementType.sstoracledropmaterializedviewlog);
233        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstoracledropmaterializedview);
234        addCmd(TBaseType.rrw_drop, "operator", ESqlStatementType.sstoracledropoperator);
235        addCmd(TBaseType.rrw_drop, "outline", ESqlStatementType.sstoracledropoutline);
236        addCmd(TBaseType.rrw_drop, "package", ESqlStatementType.sstoracledroppackage);
237        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstoracledropprocedure);
238        addCmd(TBaseType.rrw_drop, "profile", ESqlStatementType.sstoracledropprofile);
239        addCmd(TBaseType.rrw_drop, "public", "database", "link", ESqlStatementType.sstoracledropdatabaselink);
240        addCmd(TBaseType.rrw_drop, "public", "synonym", ESqlStatementType.sstoracledropsynonym);
241        addCmd(TBaseType.rrw_drop, "restore", "point", ESqlStatementType.sstoracledroprestorepoint);
242        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstoracledroprole);
243        addCmd(TBaseType.rrw_drop, "rollback", "segment", ESqlStatementType.sstoracledroprollbacksegment);
244        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstdropschema);
245        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstoracledropsequence);
246        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstoracledropsynonym);
247        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstoracledroptable);
248        addCmd(TBaseType.rrw_drop, "tablespace", ESqlStatementType.sstoracledroptablespace);
249        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstoracledroptrigger);
250        addCmd(TBaseType.rrw_drop, "class", "body", ESqlStatementType.sstoracledroptypebody);
251        addCmd(TBaseType.rrw_drop, "class", ESqlStatementType.sstoracledroptype);
252        addCmd(TBaseType.rrw_drop, "type", "body", ESqlStatementType.sstoracledroptypebody);
253        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstoracledroptype);
254        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstoracledropuser);
255        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstoracledropview);
256        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstplsql_execimmestmt);
257        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstoracleexecuteprocedure);
258        addCmd(TBaseType.rrw_explain, "plan", ESqlStatementType.sstExplain);
259        addCmd(TBaseType.rrw_flashback, "database", ESqlStatementType.sstoracleflashbackdatabase);
260        addCmd(TBaseType.rrw_flashback, "table", ESqlStatementType.sstoracleflashbacktable);
261        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstoraclegrant);
262        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
263        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstoraclelocktable);
264        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
265        addCmd(TBaseType.rrw_noaudit, ESqlStatementType.sstoraclenoaudit);
266        addCmd(TBaseType.rrw_purge, ESqlStatementType.sstoraclepurge);
267        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstdamengrefreshmaterializedview);
268        addCmd(TBaseType.rrw_rename, ESqlStatementType.sstoraclerename);
269        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstoraclerevoke);
270        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstoraclerollback);
271        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstoraclesavepoint);
272        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
273        addCmd(TBaseType.rrw_set, "constraint", ESqlStatementType.sstoraclesetconstraint);
274        addCmd(TBaseType.rrw_set, "constraints", ESqlStatementType.sstoraclesetconstraint);
275        addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstoraclesetrole);
276        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstoraclesettransaction);
277        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
278        addCmd(TBaseType.rrw_type2, ESqlStatementType.sstplsql_createtype_placeholder);
279        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
280    }
281
282    @Override
283    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
284        TCustomSqlStatement ret = null;
285
286        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
287
288        if ( (token.tokencode  == TBaseType.cmtdoublehyphen)
289           || (token.tokencode  == TBaseType.cmtslashstar)
290           || (token.tokencode  == TBaseType.lexspace)
291           || (token.tokencode  == TBaseType.lexnewline)
292            || (token.tokentype == ETokenType.ttsemicolon) )
293        {
294          return null;
295        }
296
297        int lcpos = token.posinlist;
298        TSourceTokenList lcsourcetokenlist = token.container;
299        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
300
301        //subquery after semicolon or at first line
302        if ( (state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis) ) // (
303          {
304            int k = lcsourcetokenlist.solidtokenafterpos(lcpos,TBaseType.rrw_select,1,"(");
305            if ( k >0 )
306              {
307                ret = new TSelectSqlStatement(this.vendor);
308              }
309
310            return ret;
311          }
312
313        //cte
314        if ( (state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with) )
315          {
316            ret = findcte(token,this.vendor);
317            if ( (ret != null) )  return ret;
318          }
319
320        gnewsqlstatementtype = getStatementTypeForToken(token);
321
322        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
323        switch (gnewsqlstatementtype) {    //
324            case sstinvalid:
325              {
326                ret = null;
327
328                if ( state == EFindSqlStateType.stnormal )
329                  {
330                    if ( token.tokencode == TBaseType.label_begin )
331                      {
332                        ret = new TCommonBlock(this.vendor);
333                        gnewsqlstatementtype = ret.sqlstatementtype;
334                      }
335                    else if ( token.tokencode == TBaseType.rrw_declare )
336                      {
337                        ret = new TCommonBlock(this.vendor);
338                        gnewsqlstatementtype = ret.sqlstatementtype;
339                      }
340                    else if ( token.tokencode == TBaseType.rrw_begin )
341                      {
342                        ret = new TCommonBlock(this.vendor);
343                        gnewsqlstatementtype = ret.sqlstatementtype;
344                      }
345                    else if ( token.tokencode == TBaseType.rrw_procedure )
346                      {
347                        ret = new TPlsqlCreateProcedure(this.vendor);
348                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createprocedure;
349                        gnewsqlstatementtype = ret.sqlstatementtype;
350                      }
351                    else if ( token.tokencode == TBaseType.rrw_function )
352                      {
353                        ret = new TPlsqlCreateFunction(this.vendor);
354                        // ret.sqlstatementtype = ESqlStatementType.sstplsql_createfunction;
355                        gnewsqlstatementtype = ret.sqlstatementtype;
356                      }
357                    else if ( token.tokencode == TBaseType.rrw_package )
358                      {
359                        ret = new TPlsqlCreatePackage(this.vendor);
360                       // ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
361                        gnewsqlstatementtype = ret.sqlstatementtype;
362                      }
363                    else if ( token.tokentype == ETokenType.ttidentifier )
364                      {
365                        // Dameng: bare top-level function-call statement
366                        // Patterns:
367                        //   qualified_name '(' ... ')' ';'   e.g. SF_SET_SESSION_PARA_VALUE('X', 1);
368                        //   qualified_name '(' ... ')' ';'   e.g. DBMS_OUTPUT.PUT_LINE('hello');
369                        //   qualified_name ';'               e.g. DBMS_FLASHBACK.DISABLE;
370                        // Walk past optional '.IDENT' chain. After the dot the name part may be a plain
371                        // identifier or any column-context keyword (ttkeyword / ttnonreservedkeyword), since
372                        // Dameng allows reserved-ish names like DISABLE as the final component of a package call.
373                        // The bare-call statement starter is recognized when the following solid token is '('
374                        // (with-args form) or a statement terminator (no-args, no-parens form).
375                        // Per feedback_dameng_independent.md: this is an independent case block, not shared with Oracle.
376                        TSourceToken lcscantoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
377                        boolean lcsawDot = false;
378                        while ( (lcscantoken != null) && (lcscantoken.toString().equals(".")) )
379                          {
380                            TSourceToken lcafterdot = lcsourcetokenlist.nextsolidtoken(lcscantoken.posinlist,1,false);
381                            if ( (lcafterdot == null)
382                                 || ( (lcafterdot.tokentype != ETokenType.ttidentifier)
383                                      && (lcafterdot.tokentype != ETokenType.ttkeyword)
384                                      && (lcafterdot.tokentype != ETokenType.ttnonreservedkeyword) ) )
385                              {
386                                lcscantoken = null;
387                                break;
388                              }
389                            lcsawDot = true;
390                            lcscantoken = lcsourcetokenlist.nextsolidtoken(lcafterdot.posinlist,1,false);
391                          }
392                        if ( (lcscantoken != null) && (lcscantoken.tokentype == ETokenType.ttleftparenthesis) )
393                          {
394                            ret = new TCallStatement(this.vendor);
395                            gnewsqlstatementtype = ESqlStatementType.sstcall;
396                          }
397                        else if ( lcsawDot
398                                  && ( (lcscantoken == null)
399                                       || (lcscantoken.tokentype == ETokenType.ttsemicolon) ) )
400                          {
401                            // Dameng parameterless package call: PKG.PROC; or trailing PKG.PROC at end of input.
402                            // Require at least one '.' so that bare identifiers (e.g. labels, hints, comments)
403                            // are not misclassified as statements.
404                            ret = new TCallStatement(this.vendor);
405                            gnewsqlstatementtype = ESqlStatementType.sstcall;
406                          }
407                      }
408                  }
409                  break;
410              }
411            case sstselect:
412              {
413                boolean lcisnewsql = true;
414
415                if ( state != EFindSqlStateType.stnormal )
416                  {
417                    // lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
418                    if ( (lcprevsolidtoken != null) )
419                      {
420                        if ( lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
421                          lcisnewsql = false; //subquery
422                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_union )
423                          lcisnewsql = false;
424                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_intersect )
425                          lcisnewsql = false;
426                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_minus )
427                          lcisnewsql = false;
428                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_except )
429                          lcisnewsql = false;
430                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_return )
431                          lcisnewsql = false;
432                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_as )
433                          {
434                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable )
435                              lcisnewsql = false;
436                            if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview )
437                              lcisnewsql = false;
438                          }
439
440                        if ( lcisnewsql && ( lcprevsolidtoken.tokencode == TBaseType.rrw_all) )
441                          {
442                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
443                            if ( (lcpprevsolidtoken != null) )
444                              {
445                                if ( lcpprevsolidtoken.tokencode == TBaseType.rrw_union )
446                                  lcisnewsql = false;
447                              }
448                          }
449
450                      }
451
452
453                    if ( (lccurrentsqlstatement != null) )
454                      {
455                          switch (lccurrentsqlstatement.sqlstatementtype){
456                              case sstinsert:
457                                  lcisnewsql = false;
458                                  break;
459                              case sstcreatetable:
460                              case sstcreateview:
461                                  lcisnewsql = false;
462                                  break;
463                          }
464                      }
465
466                  }
467
468                if ( lcisnewsql )
469                  ret = new TSelectSqlStatement(this.vendor);
470
471                break;
472              }
473            case sstinsert:
474              {
475                boolean lcisnewsql = true;
476                if ( state != EFindSqlStateType.stnormal )
477                  {
478                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
479                    if ( (lcprevsolidtoken != null) )
480                      {
481                        if ( lcprevsolidtoken.toString().equalsIgnoreCase("AFTER") )
482                          lcisnewsql = false;
483                      }
484                    if ( (lccurrentsqlstatement != null) )
485                      {
486
487                      }
488                  }
489
490                if ( lcisnewsql )
491                  ret = new TInsertSqlStatement(this.vendor);
492
493                break;
494              }
495            case sstupdate:
496              {
497                boolean lcisnewsql = true;
498                if ( state != EFindSqlStateType.stnormal )
499                  {
500                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
501                    if ( (lcprevsolidtoken != null) )
502                      { //
503                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
504                          lcisnewsql = false;
505                        else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_for )
506                          lcisnewsql = false;
507                      }
508
509                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
510                    if ( (lcnextsolidtoken != null) )
511                      {
512                        if ( lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis)
513                          {
514                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist,TBaseType.rrw_select,1,"(");
515                            if ( k  == 0 ) lcisnewsql = false;
516                          }
517                        else if ( lcnextsolidtoken.toString().equalsIgnoreCase("BLOCK") )
518                          lcisnewsql = false;
519                      }
520
521
522                    if ( (lccurrentsqlstatement != null) )
523                      {
524                      }
525                  }
526
527                if ( lcisnewsql )
528                  {
529                    ret = new TUpdateSqlStatement(this.vendor);
530                    ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
531                  }
532                break;
533              }
534            case sstdelete:
535              {
536                boolean lcisnewsql = true;
537
538                if ( state != EFindSqlStateType.stnormal )
539                  {
540                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
541                    if ( (lcprevsolidtoken != null) )
542                      {
543                        if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
544                          lcisnewsql = false;
545                        else if ( lcprevsolidtoken.toString().equalsIgnoreCase("NO") )
546                          lcisnewsql = false;
547                      }
548
549                    if ( (lccurrentsqlstatement != null) )
550                      {
551                          TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos,1,false);
552                          if ( (lcnextsolidtoken != null) ){
553                              if (lcnextsolidtoken.tokencode == TBaseType.rrw_oracle_rows){
554                                  lcisnewsql = false;
555                              }
556                          }
557                      }
558                  }
559
560                if ( lcisnewsql )
561                  ret = new TDeleteSqlStatement(this.vendor);
562
563                break;
564              }
565            case sstmerge:
566              {
567                ret = new TMergeSqlStatement(this.vendor);
568                ret.sqlstatementtype = gnewsqlstatementtype;
569                break;
570              }
571            case sstoraclecommit:
572              {
573
574                  boolean lcisnewsql = true;
575                  if ( state != EFindSqlStateType.stnormal )
576                  {
577                      lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
578                      if ( (lcprevsolidtoken != null) )
579                      { //
580                          if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on )
581                              lcisnewsql = false;
582                      }
583                  }
584
585                  if (lcisnewsql){
586                      ret = new TCommitStmt(this.vendor);
587                      ret.sqlstatementtype = gnewsqlstatementtype;
588                  }
589
590                break;
591              }
592            case sstoraclerollback:
593              {
594                ret = new TUnknownSqlStatement(this.vendor);
595                ret.sqlstatementtype = gnewsqlstatementtype;
596                break;
597              }
598            case sstoraclesavepoint:
599              {
600                ret = new TUnknownSqlStatement(this.vendor);
601                ret.sqlstatementtype = gnewsqlstatementtype;
602                  break;
603              }
604            case sstoraclerevoke:
605              {
606                ret = new TUnknownSqlStatement(this.vendor);
607                ret.sqlstatementtype = gnewsqlstatementtype;
608                  break;
609              }
610            case sstoraclegrant:
611              {
612                ret = new TUnknownSqlStatement(this.vendor);
613                ret.sqlstatementtype = gnewsqlstatementtype;
614                  break;
615              }
616            case sstoracleanalyze:
617              {
618                ret = new TUnknownSqlStatement(this.vendor);
619                ret.sqlstatementtype = gnewsqlstatementtype;
620                  break;
621              }
622            case sstTruncate:
623              {
624                  ret = new TTruncateStatement(this.vendor);
625                  ret.sqlstatementtype = gnewsqlstatementtype;
626                  break;
627              }
628            case sstcreatetable:
629              {
630                ret = new TCreateTableSqlStatement(this.vendor);
631                  break;
632              }
633            case sstoraclecreateview:
634              {
635                ret = new TCreateViewSqlStatement(this.vendor);
636                  break;
637              }
638            case sstcreatematerializedview:{
639                ret = new TCreateMaterializedSqlStatement(this.vendor);
640                break;
641            }
642            case sstoraclecreatematerializedviewlog:{
643                ret = new TCreateMaterializedViewLogSqlStatement(this.vendor);
644                break;
645            }
646            case sstoraclecreateindex:
647              {
648                ret = new TCreateIndexSqlStatement(this.vendor);
649                  break;
650              }
651            case sstoraclecreatedatabase:
652              {
653                ret = new TCreateDatabaseSqlStatement(this.vendor);
654                  break;
655              }
656            case sstoracledroptable:
657              {
658                ret = new TDropTableSqlStatement(this.vendor);
659                  break;
660              }
661            case sstoracledropview:
662              {
663               ret = new TDropViewSqlStatement(this.vendor);
664                  break;
665              }
666            case sstoracledropindex:
667              {
668                ret = new TDropIndexSqlStatement(this.vendor);
669                  break;
670              }
671            case sstdropschema:
672              {
673                ret = new TDropSchemaSqlStatement(this.vendor);
674                  break;
675              }
676            case sstaltertable:
677              {
678                ret = new TAlterTableStatement(this.vendor);
679                  break;
680              }
681            case sstoraclealtersession:
682              {
683                ret = new TAlterSessionStatement(this.vendor);
684                  break;
685              }
686            case sstplsql_createprocedure:
687            {
688              ret = new TPlsqlCreateProcedure(this.vendor);
689              ret.sqlstatementtype = gnewsqlstatementtype;
690              // System.out.println(gnewsqlstatementtype);
691                break;
692            }
693            case sstplsql_createfunction:
694            {
695              ret = new TPlsqlCreateFunction(this.vendor);
696              ret.sqlstatementtype = gnewsqlstatementtype;
697              // System.out.println(gnewsqlstatementtype);
698                break;
699            }
700            case sstplsql_createpackage:
701            {
702              ret = new TPlsqlCreatePackage(this.vendor);
703              ret.sqlstatementtype = gnewsqlstatementtype;
704              // System.out.println(gnewsqlstatementtype);
705                break;
706            }
707            case sstplsql_createtrigger:
708            {
709              ret = new TPlsqlCreateTrigger(this.vendor);
710              ret.sqlstatementtype = gnewsqlstatementtype;
711              // System.out.println(gnewsqlstatementtype);
712                break;
713            }
714            case sstplsql_execimmestmt:
715              {
716                ret = new TExecImmeStmt(this.vendor);
717               // ret.sqlstatementtype = gnewsqlstatementtype;
718                // System.out.println(gnewsqlstatementtype);
719                  break;
720              }
721            case sstoraclecreatepackagebody:
722             {
723                ret = new TPlsqlCreatePackage(this.vendor);
724                ret.sqlstatementtype = ESqlStatementType.sstplsql_createpackage;
725                 break;
726             }
727            case sstplsql_createtype_placeholder:
728            {
729              ret = new TPlsqlCreateType_Placeholder(this.vendor);
730              ret.sqlstatementtype = gnewsqlstatementtype;
731              // System.out.println(gnewsqlstatementtype);
732                break;
733            }
734            case sstplsql_createtypebody:
735              {
736                ret = new TPlsqlCreateTypeBody(this.vendor);
737                ret.sqlstatementtype = gnewsqlstatementtype;
738                  break;
739              }
740            case sstCommentOn:
741              {
742                ret = new TCommentOnSqlStmt(this.vendor);
743                  break;
744              }
745            case sstoraclecreatesequence:
746              {
747                ret = new TCreateSequenceStmt(this.vendor);
748                  break;
749              }
750            case sstoraclecreatecluster:
751              {
752                ret = new gudusoft.gsqlparser.stmt.oracle.TOracleCreateClusterStmt(this.vendor);
753                  break;
754              }
755            case sstoraclecreatesynonym:
756              {
757                ret = new TCreateSynonymStmt(this.vendor);
758                  break;
759              }
760            case sstoraclecreatedirectory:
761              {
762                ret = new TOracleCreateDirectoryStmt(this.vendor);
763                  break;
764              }
765            case sstoracleexecuteprocedure:
766            {
767                ret = new TOracleExecuteProcedure(this.vendor);
768                break;
769            }
770            case sstExplain:
771            {
772                ret = new TExplainPlan(this.vendor);
773                break;
774            }
775            case sstoraclecreatelibrary:
776                ret = new TOracleCreateLibraryStmt(this.vendor);
777                break;
778            case sstaltertrigger:
779                ret  = new TAlterTriggerStmt(this.vendor);
780                break;
781            case sstoracledropsequence:
782                ret = new TDropSequenceStmt(this.vendor);
783                break;
784            case sstoraclecall:
785                ret = new TCallStatement(this.vendor);
786                break;
787            case sstoraclealterview:
788                ret = new TAlterViewStatement(this.vendor);
789                break;
790            case sstoracledropsynonym:
791                ret = new TDropSynonymStmt(this.vendor);
792                break;
793            case sstoracledropdatabaselink:
794                ret = new TDropDatabaseLinkStmt(this.vendor);
795                break;
796            case sstoraclecreatedatabaselink:
797                ret = new TCreateDatabaseLinkStmt(this.vendor);
798                break;
799            case sstoracledropmaterializedview:
800                ret = new TDropMaterializedViewStmt(this.vendor);
801                break;
802            case sstoracledropmaterializedviewlog:
803                ret = new TDropMaterializedViewLogStmt(this.vendor);
804                break;
805            case sstoraclerename:
806                ret = new TRenameStmt(this.vendor);
807                break;
808            case sstoracledropprocedure:
809                ret = new TDropProcedureStmt(this.vendor);
810                break;
811            case sstAlterMaterializedView:
812                ret = new TAlterMaterializedViewStmt(this.vendor);
813                break;
814            case sstdamengrefreshmaterializedview:
815                ret = new gudusoft.gsqlparser.stmt.dameng.TDamengRefreshMaterializedViewStmt(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        for (int i = lcpos + 1; i <  lcsourcetokenlist.size();i++)    // iterate
945          {
946            lctoken = lcsourcetokenlist.get(i);
947//        if (lctoken.tokencode == TBaseType.rrw_postgresql_recursive){
948//            continue;
949//        }
950              if (lctoken.tokencode == TBaseType.rrw_xmlnamespaces){
951                  inXmlNamespaces = true;
952                  lcnested = 0;
953                  continue;
954              }
955              if (inXmlNamespaces) {
956                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
957                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) {
958                      lcnested--;
959                      if (lcnested == 0) {
960                        inXmlNamespaces = false;
961                        isXmlNamespaces = true;
962                      }
963                  }
964                  continue;
965              }
966            if (( lctoken.tokencode == TBaseType.rrw_as ) || isXmlNamespaces)
967              {
968                lcnested = 0;
969                int startPos = i+1;
970                if (isXmlNamespaces) startPos = i;
971                for ( j = startPos; j < lcsourcetokenlist.size();j++)
972                {
973                  lctoken = lcsourcetokenlist.get(j);
974                  if (lctoken.isnonsolidtoken() ) continue;
975                  if ( lctoken.tokentype == ETokenType.ttleftparenthesis)  lcnested++;
976                  if ( lctoken.tokentype == ETokenType.ttrightparenthesis) lcnested--;
977
978
979                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_delete) )
980                    {
981                      ret = new TDeleteSqlStatement(pdbvendor);
982                      ret.isctequery = true;
983                      gnewsqlstatementtype = ESqlStatementType.sstdelete;
984                      break;
985                    }
986
987                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_merge) )
988                      {
989                        ret = new TMergeSqlStatement(pdbvendor);
990                        ret.isctequery = true;
991                        gnewsqlstatementtype = ESqlStatementType.sstmerge;
992                        break;
993                      }
994
995                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_insert) )
996                    {
997                      ret = new TInsertSqlStatement(pdbvendor);
998                      ret.isctequery = true;
999                      gnewsqlstatementtype = ESqlStatementType.sstinsert;
1000                      ret.dummytag = 1; //  select stmt in insert is permitted
1001
1002                      for ( k = lctoken.posinlist + 1; k < lcsourcetokenlist.size();k++)    // iterate
1003                      {
1004                        if ( lcsourcetokenlist.get(k).isnonsolidtoken()  ) continue;
1005                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_values ) break;
1006                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_go ) break;
1007                        if ( lcsourcetokenlist.get(k).tokentype == ETokenType.ttsemicolon ) break;
1008                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_select ) break;
1009                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_execute ) break;
1010                        if ( lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_exec ) break;
1011                      }    // for
1012                      if ( k > lcsourcetokenlist.size() - 1 )
1013                        k = lcsourcetokenlist.size() - 1;
1014
1015                      for (int m = lctoken.posinlist + 1; m <=  k; m++)    // iterate
1016                      {
1017                        lcsourcetokenlist.get(m).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
1018                      }    // for
1019
1020                      break;
1021                    }
1022
1023                    if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_values) &&(pdbvendor == EDbVendor.dbvpostgresql) )
1024                    {
1025                            ret = new TSelectSqlStatement(pdbvendor);
1026                            ret.isctequery = true;
1027                            gnewsqlstatementtype = ESqlStatementType.sstselect;
1028                            break;
1029                    }
1030
1031                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_select) )
1032                    {
1033                      ret = new TSelectSqlStatement(pdbvendor);
1034                      ret.isctequery = true;
1035                      gnewsqlstatementtype = ESqlStatementType.sstselect;
1036                      break;
1037                    }
1038
1039                  if ( (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_update) )
1040                    {
1041                      ret = new TUpdateSqlStatement(pdbvendor);
1042                      ret.isctequery = true;
1043                      ret.dummytag = 1; // means set clause in update is not found yet, used to seperate set clause from set statement
1044                      gnewsqlstatementtype = ESqlStatementType.sstupdate;
1045                      break;
1046                    }
1047
1048                    if ( (pdbvendor == EDbVendor.dbvhive) && (lcnested == 0) && (lctoken.tokencode == TBaseType.rrw_from) )
1049                    {
1050                        TSourceToken cmdToken = lctoken.searchToken(TBaseType.rrw_insert,3);
1051                        if (cmdToken != null){
1052                            ret = new TInsertSqlStatement(pdbvendor);
1053                            ret.isctequery = true;
1054                            gnewsqlstatementtype = ESqlStatementType.sstinsert;
1055
1056                        }else{
1057                            ret = new TSelectSqlStatement(pdbvendor);
1058                            ret.isctequery = true;
1059                            gnewsqlstatementtype = ESqlStatementType.ssthiveFromQuery;
1060                        }
1061                        break;
1062                    }
1063
1064
1065                }    // for
1066
1067                if ( (ret != null) )
1068                  {
1069                    for (k = lcpos + 1; k <= j;k++)    // iterate
1070                    {
1071                      lcsourcetokenlist.get(k).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
1072                    }    // for
1073                    break;
1074                  }
1075
1076              }
1077          }
1078
1079        return ret;
1080    }
1081}