001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.hana.*;
006
007/**
008 * SAP HANA SQL command resolver.
009 * Contains all HANA-specific SQL command recognition logic.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsHana extends AbstractSqlCmds {
014
015    // Temporary field for statement type during issql processing
016    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
017
018    public TSqlCmdsHana() {
019        super(EDbVendor.dbvhana);
020    }
021
022    @Override
023    protected String getToken1Str(int token1) {
024        // HANA vendor-specific reserved words requiring token1Str mapping
025        switch (token1) {
026            case TBaseType.rrw_hana_unset:
027                return "unset";
028            case TBaseType.rrw_hana_upsert:
029                return "upsert";
030            case TBaseType.rrw_hana_import:
031                return "import";
032            case TBaseType.rrw_hana_export:
033                return "export";
034            case TBaseType.rrw_hana_recover:
035                return "recover";
036            case TBaseType.rrw_hana_unload:
037                return "unload";
038            case TBaseType.rrw_hana_validate:
039                return "validate";
040            default:
041                return null;
042        }
043    }
044
045    @Override
046    protected void initializeCommands() {
047        // ALTER commands
048        addCmd(TBaseType.rrw_alter, "audit", "policy", ESqlStatementType.sstalterauditpolicy);
049        addCmd(TBaseType.rrw_alter, "clientside", ESqlStatementType.ssthanaalterclientsidekey);
050        addCmd(TBaseType.rrw_alter, "collection", ESqlStatementType.ssthanaaltercollection);
051        addCmd(TBaseType.rrw_alter, "library", ESqlStatementType.ssthanaalterlibrary);
052        addCmd(TBaseType.rrw_alter, "credential", ESqlStatementType.sstaltercredential);
053        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstalterdatabase);
054        addCmd(TBaseType.rrw_alter, "fulltext", "index", ESqlStatementType.sstalterfulltextindex);
055        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstalterfunction);
056        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstalterindex);
057        addCmd(TBaseType.rrw_alter, "ldap", "provider", ESqlStatementType.sstalterldapprovider);
058        addCmd(TBaseType.rrw_alter, "jwt", "provider", ESqlStatementType.sstalterjwtprovider);
059        addCmd(TBaseType.rrw_alter, "pse", ESqlStatementType.sstalterpse);
060        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstalterprocedure);
061        addCmd(TBaseType.rrw_alter, "remote", "source", ESqlStatementType.sstalterremotesource);
062        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstAlterRole);
063        addCmd(TBaseType.rrw_alter, "saml", "provider", ESqlStatementType.sstaltersamlprovider);
064        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstaltersequence);
065        addCmd(TBaseType.rrw_alter, "statistics", ESqlStatementType.sstalterstatistics);
066        addCmd(TBaseType.rrw_alter, "structured", "privilege", ESqlStatementType.sstalterstructuredprivilege);
067        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstaltersystem);
068        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
069        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstalteruser);
070        addCmd(TBaseType.rrw_alter, "usergroup", ESqlStatementType.sstalterusergroup);
071        addCmd(TBaseType.rrw_alter, "view", "cache", ESqlStatementType.sstalterviewcache);
072        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstalterview);
073        addCmd(TBaseType.rrw_alter, "virtual", "table", ESqlStatementType.sstaltervirtualtable);
074        addCmd(TBaseType.rrw_alter, "workload", "class", ESqlStatementType.sstalterworkloadclass);
075        addCmd(TBaseType.rrw_alter, "workload", "mapping", ESqlStatementType.sstalterworkloadmapping);
076
077        // BACKUP commands
078        addCmd(TBaseType.rrw_backup, "cancel", ESqlStatementType.sstbackupcancel);
079        addCmd(TBaseType.rrw_backup, "catalog", "delete", ESqlStatementType.sstbackupcatalogdelete);
080        addCmd(TBaseType.rrw_backup, "check", "access", ESqlStatementType.sstbackupcheckaccess);
081        addCmd(TBaseType.rrw_backup, "check", ESqlStatementType.sstbackupcheck);
082        addCmd(TBaseType.rrw_backup, "data", ESqlStatementType.sstbackupdata);
083        addCmd(TBaseType.rrw_backup, "list", "data", ESqlStatementType.sstbackuplistdata);
084
085        // CALL command
086        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
087
088        // COMMENT/COMMIT/CONNECT commands
089        addCmd(TBaseType.rrw_comment, "on", ESqlStatementType.sstcomment);
090        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstcommit);
091        addCmd(TBaseType.rrw_connect, ESqlStatementType.sstconnect);
092
093        // CREATE commands - ordered with longer patterns first
094        addCmd(TBaseType.rrw_create, "audit", "policy", ESqlStatementType.sstcreateauditpolicy);
095        addCmd(TBaseType.rrw_create, "btree", "index", ESqlStatementType.sstcreateindex);
096        addCmd(TBaseType.rrw_create, "certificate", ESqlStatementType.sstcreatecertificate);
097        addCmd(TBaseType.rrw_create, "clientside", ESqlStatementType.ssthanacreateclientsidekey);
098        addCmd(TBaseType.rrw_create, "library", ESqlStatementType.ssthanacreatelibrary);
099        addCmd(TBaseType.rrw_create, "or", "replace", "library", ESqlStatementType.ssthanacreatelibrary);
100        addCmd(TBaseType.rrw_create, "projection", "view", ESqlStatementType.ssthanacreateprojectionview);
101        addCmd(TBaseType.rrw_create, "or", "replace", "projection", ESqlStatementType.ssthanacreateprojectionview);
102        addCmd(TBaseType.rrw_create, "collection", ESqlStatementType.sstcreatecollection);
103        addCmd(TBaseType.rrw_create, "column", "table", ESqlStatementType.sstcreatetable);
104        addCmd(TBaseType.rrw_create, "cpbtree", "index", ESqlStatementType.sstcreateindex);
105        addCmd(TBaseType.rrw_create, "credential", ESqlStatementType.sstcreatecredential);
106        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
107        addCmd(TBaseType.rrw_create, "fulltext", "index", ESqlStatementType.sstcreatefulltextindex);
108        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction);
109        addCmd(TBaseType.rrw_create, "global", "temporary", "column", "table", ESqlStatementType.sstcreatetable);
110        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
111        addCmd(TBaseType.rrw_create, "graph", "workspace", ESqlStatementType.sstcreategraphworkspace);
112        addCmd(TBaseType.rrw_create, "history", "column", "table", ESqlStatementType.sstcreatetable);
113        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstcreateindex);
114        addCmd(TBaseType.rrw_create, "jwt", "provider", ESqlStatementType.sstcreateJWTProvider);
115        addCmd(TBaseType.rrw_create, "ldap", "provider", ESqlStatementType.sstcreateLDAPProvider);
116        addCmd(TBaseType.rrw_create, "local", "temporary", "column", "table", ESqlStatementType.sstcreatetable);
117        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
118        addCmd(TBaseType.rrw_create, "or", "replace", "force", "editionable", "view", ESqlStatementType.sstcreateview);
119        addCmd(TBaseType.rrw_create, "or", "replace", "public", "synonym", ESqlStatementType.sstcreatesynonym);
120        addCmd(TBaseType.rrw_create, "or", "replace", "synonym", ESqlStatementType.sstcreatesynonym);
121        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
122        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
123        addCmd(TBaseType.rrw_create, "pse", ESqlStatementType.sstcreatepse);
124        addCmd(TBaseType.rrw_create, "public", "synonym", ESqlStatementType.sstcreatesynonym);
125        addCmd(TBaseType.rrw_create, "remote", "source", ESqlStatementType.sstcreateremotesource);
126        addCmd(TBaseType.rrw_create, "restricted", "user", ESqlStatementType.sstcreateuser);
127        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstcreaterole);
128        addCmd(TBaseType.rrw_create, "row", "table", ESqlStatementType.sstcreatetable);
129        addCmd(TBaseType.rrw_create, "saml", "provider", ESqlStatementType.sstcreatesamlprovider);
130        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstcreateschema);
131        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstcreatesequence);
132        addCmd(TBaseType.rrw_create, "statistics", ESqlStatementType.sstcreatestatistics);
133        addCmd(TBaseType.rrw_create, "structured", "privilege", ESqlStatementType.sstcreatestructuredprivilege);
134        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstcreatesynonym);
135        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
136        addCmd(TBaseType.rrw_create, "trigger", ESqlStatementType.sstcreatetrigger);
137        addCmd(TBaseType.rrw_create, "type", ESqlStatementType.sstcreatetype);
138        addCmd(TBaseType.rrw_create, "unique", "index", ESqlStatementType.sstcreateindex);
139        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstcreateuser);
140        addCmd(TBaseType.rrw_create, "usergroup", ESqlStatementType.sstcreateusergroup);
141        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
142        addCmd(TBaseType.rrw_create, "virtual", "function", ESqlStatementType.sstcreatevirtualfunction);
143        addCmd(TBaseType.rrw_create, "virtual", "table", ESqlStatementType.sstcreatevirtualtable);
144        addCmd(TBaseType.rrw_create, "workload", "class", ESqlStatementType.sstcreateworkloadclass);
145        addCmd(TBaseType.rrw_create, "workload", "mapping", ESqlStatementType.sstcreateworkloadmapping);
146
147        // DELETE command
148        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
149
150        // DO command
151        addCmd(TBaseType.rrw_do, "begin", ESqlStatementType.sstdobeginend);
152
153        // DROP commands - ordered with longer patterns first
154        addCmd(TBaseType.rrw_drop, "audit", "policy", ESqlStatementType.sstdropauditpolicy);
155        addCmd(TBaseType.rrw_drop, "certificate", ESqlStatementType.sstdropcertificate);
156        addCmd(TBaseType.rrw_drop, "clientside", ESqlStatementType.ssthanadropclientsidekey);
157        addCmd(TBaseType.rrw_drop, "library", ESqlStatementType.ssthanadroplibrary);
158        addCmd(TBaseType.rrw_drop, "collection", ESqlStatementType.sstdropcollection);
159        addCmd(TBaseType.rrw_drop, "credential", ESqlStatementType.sstdropcredential);
160        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
161        addCmd(TBaseType.rrw_drop, "fulltext", "index", ESqlStatementType.sstdropfulltextindex);
162        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstdropfunction);
163        addCmd(TBaseType.rrw_drop, "graph", "workspace", ESqlStatementType.sstdropgraphworkspace);
164        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
165        addCmd(TBaseType.rrw_drop, "jwt", "provider", ESqlStatementType.sstdropJWTProvider);
166        addCmd(TBaseType.rrw_drop, "ldap", "provider", ESqlStatementType.sstdropLDAPProvider);
167        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure);
168        addCmd(TBaseType.rrw_drop, "pse", ESqlStatementType.sstdroppse);
169        addCmd(TBaseType.rrw_drop, "public", "synonym", ESqlStatementType.sstdropsynonym);
170        addCmd(TBaseType.rrw_drop, "remote", "source", ESqlStatementType.sstdropremotesource);
171        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstdroprole);
172        addCmd(TBaseType.rrw_drop, "saml", "provider", ESqlStatementType.sstdropsamlprovider);
173        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstdropschema);
174        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstdropsequence);
175        addCmd(TBaseType.rrw_drop, "statistics", ESqlStatementType.sstdropstatistics);
176        addCmd(TBaseType.rrw_drop, "structured", "privilege", ESqlStatementType.sstdropstructuredprivilege);
177        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstdropsynonym);
178        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
179        addCmd(TBaseType.rrw_drop, "trigger", ESqlStatementType.sstdroptrigger);
180        addCmd(TBaseType.rrw_drop, "type", ESqlStatementType.sstdroptype);
181        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstdropuser);
182        addCmd(TBaseType.rrw_drop, "usergroup", ESqlStatementType.sstdropusergroup);
183        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
184        addCmd(TBaseType.rrw_drop, "workload", "class", ESqlStatementType.sstdropworkloadclass);
185        addCmd(TBaseType.rrw_drop, "workload", "mapping", ESqlStatementType.sstdropworkloadmapping);
186
187        // EXPLAIN/EXPORT commands
188        addCmd(TBaseType.rrw_explain, "plan", ESqlStatementType.sstExplain);
189        addCmd(TBaseType.rrw_hana_export, ESqlStatementType.sstexport);
190
191        // GRANT command
192        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant);
193
194        // IMPORT commands
195        addCmd(TBaseType.rrw_hana_import, "from", ESqlStatementType.sstimportfrom);
196        addCmd(TBaseType.rrw_hana_import, "scan", ESqlStatementType.sstimportscan);
197        addCmd(TBaseType.rrw_hana_import, ESqlStatementType.sstimport);
198
199        // INSERT command
200        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
201
202        // LOAD/LOCK commands
203        addCmd(TBaseType.rrw_load, ESqlStatementType.sstload);
204        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstlocktable);
205
206        // MERGE commands
207        addCmd(TBaseType.rrw_merge, "history", "delta", ESqlStatementType.sstmergedelta);
208        addCmd(TBaseType.rrw_merge, "delta", ESqlStatementType.sstmergedelta);
209        addCmd(TBaseType.rrw_merge, "into", ESqlStatementType.sstmerge);
210
211        // RECOVER commands
212        addCmd(TBaseType.rrw_hana_recover, "database", ESqlStatementType.sstrecoverdatabase);
213        addCmd(TBaseType.rrw_hana_recover, "encryption", ESqlStatementType.ssthanarecoverencryptionrootkeys);
214        addCmd(TBaseType.rrw_hana_recover, "data", ESqlStatementType.sstrecoverdata);
215
216        // REFRESH/RENAME commands
217        addCmd(TBaseType.rrw_refresh, "statistics", ESqlStatementType.sstrefreshstatistics);
218        addCmd(TBaseType.rrw_refresh, "view", ESqlStatementType.ssthanarefreshview);
219        addCmd(TBaseType.rrw_rename, "collection", ESqlStatementType.sstrenamecollection);
220        addCmd(TBaseType.rrw_rename, "column", ESqlStatementType.sstrenamecolumn);
221        addCmd(TBaseType.rrw_rename, "database", ESqlStatementType.sstrenamedatabase);
222        addCmd(TBaseType.rrw_rename, "index", ESqlStatementType.sstrenameindex);
223        addCmd(TBaseType.rrw_rename, "table", ESqlStatementType.sstrenametable);
224        addCmd(TBaseType.rrw_rename, "schema", ESqlStatementType.ssthanarenameschema);
225
226        // REPLACE command
227        addCmd(TBaseType.rrw_replace, ESqlStatementType.sstreplace);
228
229        // REVOKE/ROLLBACK commands
230        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke);
231        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstrollback);
232
233        // SAVEPOINT command
234        addCmd(TBaseType.rrw_savepoint, ESqlStatementType.sstsavepoint);
235
236        // SELECT command
237        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
238
239        // SET commands - ordered with longer patterns first
240        addCmd(TBaseType.rrw_set, "history", "session", ESqlStatementType.sssethistorysession);
241        addCmd(TBaseType.rrw_set, "pse", ESqlStatementType.sstsetpse);
242        addCmd(TBaseType.rrw_set, "schema", ESqlStatementType.sstsetschema);
243        addCmd(TBaseType.rrw_set, "system", "license", ESqlStatementType.sstsetsystemlicense);
244        addCmd(TBaseType.rrw_set, "transaction", "autocommit", ESqlStatementType.sstsettransactionautocommit);
245        addCmd(TBaseType.rrw_set, "transaction", ESqlStatementType.sstsettransaction);
246        addCmd(TBaseType.rrw_set, ESqlStatementType.sstset);
247
248        // START TRANSACTION command
249        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction);
250
251        // TRUNCATE commands
252        addCmd(TBaseType.rrw_truncate, "collection", ESqlStatementType.ssttruncatecollection);
253        addCmd(TBaseType.rrw_truncate, "table", ESqlStatementType.ssttruncatetable);
254
255        // UNLOAD/UNSET commands
256        addCmd(TBaseType.rrw_hana_unload, ESqlStatementType.sstunload);
257        addCmd(TBaseType.rrw_hana_unset, "pse", ESqlStatementType.sstunsetpse);
258        addCmd(TBaseType.rrw_hana_unset, "system", "license", ESqlStatementType.sstunsetsystemlicense);
259        addCmd(TBaseType.rrw_hana_unset, ESqlStatementType.sstunset);
260
261        // UPDATE command
262        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
263
264        // UPSERT/VALIDATE commands
265        addCmd(TBaseType.rrw_hana_upsert, ESqlStatementType.sstupsert);
266        addCmd(TBaseType.rrw_hana_validate, "ldap", "provider", ESqlStatementType.sstvalidateLDAPProvider);
267        addCmd(TBaseType.rrw_hana_validate, "user", ESqlStatementType.sstvalidateUser);
268    }
269
270    @Override
271    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
272        // HANA administrative statements recognized by leading words run to
273        // the next top-level semicolon: while one is open, never start a new
274        // statement (protects CREATE PROJECTION VIEW ... AS SELECT and the
275        // action lists of CREATE/ALTER AUDIT POLICY from being split).
276        if (pstate != EFindSqlStateType.stnormal && psqlstatement != null) {
277            switch (psqlstatement.sqlstatementtype) {
278                case ssthanacreateclientsidekey:
279                case ssthanaalterclientsidekey:
280                case ssthanadropclientsidekey:
281                case ssthanaaltercollection:
282                case ssthanadroplibrary:
283                case ssthanacreateprojectionview:
284                case ssthanarecoverencryptionrootkeys:
285                case ssthanarefreshview:
286                case ssthanarenameschema:
287                case ssthanareleasesavepoint:
288                case sstcreateauditpolicy:
289                case sstalterauditpolicy:
290                    gnewsqlstatementtype = ESqlStatementType.sstinvalid;
291                    return null;
292                default:
293                    break;
294            }
295        }
296        TCustomSqlStatement ret = null;
297        int k;
298        boolean lcisnewsql;
299        TSourceToken lcpprevsolidtoken, lcnextsolidtoken, lctoken;
300
301        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
302
303        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
304                || (pcst.tokencode == TBaseType.cmtslashstar)
305                || (pcst.tokencode == TBaseType.lexspace)
306                || (pcst.tokencode == TBaseType.lexnewline)
307                || (pcst.tokentype == ETokenType.ttsemicolon)) {
308            return ret;
309        }
310
311        int lcpos = pcst.posinlist;
312        TSourceTokenList lcsourcetokenlist = pcst.container;
313        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
314
315        // Subquery after semicolon || at first line
316        if (pcst.tokentype == ETokenType.ttleftparenthesis) {  // (
317            k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
318            if (k > 0) {
319                if (pstate == EFindSqlStateType.stnormal) {
320                    ret = new TSelectSqlStatement(this.vendor);
321                    return ret;
322                }
323            }
324        }
325
326        // CTE
327        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
328            ret = findcte(pcst);
329            if ((ret != null)) return ret;
330        }
331
332        gnewsqlstatementtype = getStatementTypeForToken(pcst);
333
334        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
335        switch (gnewsqlstatementtype) {
336            case sstinvalid: {
337                // HANA doesn't support MSSQL-style labels
338                ret = null;
339                break;
340            }
341            case sstselect: {
342                lcisnewsql = true;
343
344                if (pstate != EFindSqlStateType.stnormal) {
345                    if ((lcprevsolidtoken != null)) {
346                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
347                            lcisnewsql = false; // subquery
348                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
349                            lcisnewsql = false;
350                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
351                            lcisnewsql = false;
352                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
353                            lcisnewsql = false;
354                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
355                            lcisnewsql = false;
356                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
357                            lcisnewsql = false;
358                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
359                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
360                                lcisnewsql = false;
361                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
362                                lcisnewsql = false;
363                        } else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for) {
364                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmssqlset)
365                                lcisnewsql = false;
366                        } else if (lcprevsolidtoken.tokentype == ETokenType.ttrightparenthesis) {
367                            if ((lccurrentsqlstatement != null) && (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)) {
368                                lcisnewsql = false;
369                            }
370                        }
371
372                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
373                            lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
374                            if ((lcpprevsolidtoken != null)) {
375                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
376                                    lcisnewsql = false;
377                            }
378                        }
379
380                    }
381
382                    if ((lccurrentsqlstatement != null)) {
383                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert) {
384                            lcisnewsql = false;
385                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstGrant) {
386                            if ((lcprevsolidtoken != null)) {
387                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_grant)
388                                    lcisnewsql = false;
389                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
390                                    lcisnewsql = false;
391                            }
392                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview) {
393                            lcisnewsql = false;
394                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstaltersequence) {
395                            lcisnewsql = false;
396                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstExplain) {
397                            lcisnewsql = false;
398                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstRevoke) {
399                            lcisnewsql = false;
400                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstupsert) {
401                            lcisnewsql = false;
402                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstalterview) {
403                            lcisnewsql = false;
404                        }
405                    }
406
407                }
408
409                if (lcisnewsql)
410                    ret = new TSelectSqlStatement(this.vendor);
411
412                break;
413
414            }
415            case sstinsert: {
416                lcisnewsql = true;
417                if (pstate != EFindSqlStateType.stnormal) {
418                    if ((lccurrentsqlstatement != null)) {
419                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateauditpolicy) {
420                            lcisnewsql = false;
421                        }
422                        // merge
423                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
424                            if (lcprevsolidtoken != null) {
425                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
426                                    lcisnewsql = false;
427                                }
428                            }
429                        }
430
431
432                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstGrant) {
433                            if ((lcprevsolidtoken != null)) {
434                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_grant)
435                                    lcisnewsql = false;
436                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
437                                    lcisnewsql = false;
438                            }
439                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstRevoke) {
440                            // Fix for issue #4315: REVOKE INSERT should not split into two statements
441                            if ((lcprevsolidtoken != null)) {
442                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_revoke)
443                                    lcisnewsql = false;
444                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
445                                    lcisnewsql = false;
446                            }
447                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
448                            lcisnewsql = false;
449                        }
450
451                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetrigger) {
452                            if ((lcprevsolidtoken != null)) {
453                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
454                                    lcisnewsql = false;
455                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
456                                    lcisnewsql = false;
457                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "after") == 0)
458                                    lcisnewsql = false;
459                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "of") == 0)
460                                    lcisnewsql = false;
461                            }
462                        }
463
464
465                    }
466                }
467
468                if (lcisnewsql) {
469                    ret = new TInsertSqlStatement(this.vendor);
470                    ret.dummytag = 1; //  select stmt in insert is permitted
471                    for (k = lcpos + 1; k < lcsourcetokenlist.size(); k++)    // iterate
472                    {
473                        if (lcsourcetokenlist.get(k).isnonsolidtoken()) continue;
474                        if (lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_values) break;
475                        if (lcsourcetokenlist.get(k).tokentype == ETokenType.ttsemicolon) break;
476                        if (lcsourcetokenlist.get(k).tokencode == TBaseType.rrw_select) {
477                            ret.dummytag = 0;
478                            break;
479                        }
480                    }    // for (
481                    if (k > lcsourcetokenlist.size() - 1)
482                        k = lcsourcetokenlist.size() - 1;
483
484                    for (int i = lcpos + 1; i <= k; i++)    // iterate
485                    {
486                        lcsourcetokenlist.get(i).tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
487                    }    // for (
488
489                }
490
491                break;
492            }
493            case sstupdate: {
494                lcisnewsql = true;
495                if (pstate != EFindSqlStateType.stnormal) {
496                    if ((lcprevsolidtoken != null)) { //
497                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
498                            lcisnewsql = false;
499                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
500                            lcisnewsql = false;
501                    }
502
503                    lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
504                    if (TBaseType.assigned(lcnextsolidtoken)) {
505                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
506                            k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
507                            if (k == 0) lcisnewsql = false;
508                        }
509                    }
510
511
512                    if (TBaseType.assigned(lccurrentsqlstatement)) {
513                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateauditpolicy) {
514                            lcisnewsql = false;
515                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
516                            lcisnewsql = false;
517                        }
518                        // merge
519                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
520                            if (lcprevsolidtoken != null) {
521                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
522                                    lcisnewsql = false;
523                                }
524                            }
525                        }
526
527                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstGrant) {
528                            if (TBaseType.assigned(lcprevsolidtoken)) {
529                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_grant)
530                                    lcisnewsql = false;
531                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
532                                    lcisnewsql = false;
533                            }
534                        } else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstRevoke) {
535                            // Fix for issue #4315: REVOKE UPDATE should not split into two statements
536                            if (TBaseType.assigned(lcprevsolidtoken)) {
537                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_revoke)
538                                    lcisnewsql = false;
539                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
540                                    lcisnewsql = false;
541                            }
542                        }
543                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetrigger) {
544                            if (TBaseType.assigned(lcprevsolidtoken)) {
545                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
546                                    lcisnewsql = false;
547                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
548                                    lcisnewsql = false;
549                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "after") == 0)
550                                    lcisnewsql = false;
551                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "of") == 0)
552                                    lcisnewsql = false;
553                            }
554                        }
555
556                    }
557                }
558
559                if (lcisnewsql) {
560                    ret = new TUpdateSqlStatement(this.vendor);
561                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
562                }
563
564                break;
565            }
566            case sstdelete: {
567                lcisnewsql = true;
568
569                if (pstate != EFindSqlStateType.stnormal) {
570                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
571                    if (TBaseType.assigned(lcprevsolidtoken)) {
572                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
573                            lcisnewsql = false;
574                    }
575
576                    if (TBaseType.assigned(lccurrentsqlstatement)) {
577                        // merge
578                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) {
579                            if (lcprevsolidtoken != null) {
580                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_then) {
581                                    lcisnewsql = false;
582                                }
583                            }
584                        }
585
586                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstGrant) {
587                            if (TBaseType.assigned(lcprevsolidtoken)) {
588                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_grant)
589                                    lcisnewsql = false;
590                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
591                                    lcisnewsql = false;
592                            }
593                        }
594
595                        // Fix for issue #4315: REVOKE DELETE should not split into two statements
596                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstRevoke) {
597                            if (TBaseType.assigned(lcprevsolidtoken)) {
598                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_revoke)
599                                    lcisnewsql = false;
600                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
601                                    lcisnewsql = false;
602                            }
603                        }
604
605                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetrigger) {
606                            if (TBaseType.assigned(lcprevsolidtoken)) {
607                                if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
608                                    lcisnewsql = false;
609                                else if (lcprevsolidtoken.tokentype == ETokenType.ttcomma)
610                                    lcisnewsql = false;
611                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "after") == 0)
612                                    lcisnewsql = false;
613                                else if (TBaseType.mycomparetext(lcprevsolidtoken.getAstext(), "of") == 0)
614                                    lcisnewsql = false;
615                            }
616                        }
617
618                        if ((lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstbackupcatalogdelete)
619                                || (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
620                        ) {
621                            lcisnewsql = false;
622                        }
623
624                    }
625                }
626
627                if (lcisnewsql)
628                    ret = new TDeleteSqlStatement(this.vendor);
629
630                break;
631            }
632            case sstcreatetable: {
633                ret = new TCreateTableSqlStatement(this.vendor);
634                break;
635            }
636            case sstcreateview: {
637                ret = new TCreateViewSqlStatement(this.vendor);
638                break;
639            }
640            case sstcreatesequence: {
641                ret = new TCreateSequenceStmt(this.vendor);
642                break;
643            }
644            case sstaltertable: {
645                lcisnewsql = true;
646                if (pstate != EFindSqlStateType.stnormal) {
647                    lcisnewsql = false;
648                }
649                if (lcisnewsql) {
650                    ret = new TAlterTableStatement(this.vendor);
651                }
652                break;
653            }
654            case sstcreateprocedure: {
655                ret = new TCreateProcedureStmt(this.vendor);
656                break;
657            }
658            case sstalterprocedure: {
659                boolean isAlter = false;
660                // hana  alter and create procedure 语法混在一起,无法区分
661                // c:\prg\gsp_java\gsp_java_core\gsp_sqlfiles\TestCases\public\allversions\hana\create_procedure.sql
662                if (pcst.tokencode == TBaseType.rrw_alter) {
663
664                    TSourceToken st = pcst.nextSolidToken(3);
665                    if (st != null) {
666                        switch (st.toString().toUpperCase()) {
667                            case "RECOMPILE":
668                                isAlter = true;
669                                break;
670                            case "ENCRYPTION":
671                                isAlter = true;
672                                break;
673                            case "ADD":
674                                isAlter = true;
675                                break;
676                            default:
677                                break;
678                        }
679                    }
680                }
681                if (isAlter) {
682                    ret = new TAlterProcedureStmt(this.vendor);
683                } else {
684                    ret = new TCreateProcedureStmt(this.vendor);
685                }
686
687                break;
688            }
689            case sstcreatefunction: {
690                ret = new TCreateFunctionStmt(this.vendor);
691                break;
692            }
693            case sstalterfunction: {
694                boolean isAlter = false;
695                // hana  alter and create function 语法混在一起,无法区分
696
697                if (pcst.tokencode == TBaseType.rrw_alter) {
698                    TSourceToken stAdd = pcst.searchToken("add", 4);
699                    TSourceToken stAlter = pcst.searchToken("alter", 4);
700                    TSourceToken stDrop = pcst.searchToken("drop", 4);
701                    if ((stAdd != null) || (stAlter != null) || (stDrop != null)) {
702                        isAlter = true;
703                    } else {
704                        TSourceToken st = pcst.searchToken("encryption", 4);
705                        if (st != null) {
706                            isAlter = true;
707                        }
708                    }
709                }
710
711                if (isAlter) {
712                    ret = new TAlterFunctionStmt(this.vendor);
713                } else {
714                    ret = new TCreateFunctionStmt(this.vendor);
715                }
716
717
718                break;
719            }
720            case sstcreatetrigger:
721            case sstaltertrigger: {
722                ret = new TCreateTriggerStmt(this.vendor);
723                break;
724            }
725            case sstGrant: {
726                lcisnewsql = true;
727
728                if (pstate != EFindSqlStateType.stnormal) {
729                    lcisnewsql = false;
730
731                }
732                if (lcisnewsql) {
733                    ret = new TGrantStmt(this.vendor);
734                    for (k = lcpos + 1; k < lcsourcetokenlist.size(); k++)    // iterate
735                    {
736                        lctoken = lcsourcetokenlist.get(k);
737                        if (lctoken.isnonsolidtoken()) continue;
738                        if (lctoken.tokencode == TBaseType.rrw_go) break;
739                        if (lctoken.tokentype == ETokenType.ttsemicolon) break;
740                        if (lctoken.tokencode == TBaseType.rrw_to) break;
741                        lctoken.tokenstatus = ETokenStatus.tsignoredbygetrawstatement;
742                    }
743                }
744                break;
745            }
746            case sstdropview: {
747                ret = new TDropViewSqlStatement(this.vendor);
748                break;
749            }
750            case sstdroptable: {
751                ret = new TDropTableSqlStatement(this.vendor);
752                break;
753            }
754            case sstdropindex: {
755                ret = new TDropIndexSqlStatement(this.vendor);
756                break;
757            }
758            case ssttruncatetable: {
759                ret = new TTruncateStatement(this.vendor);
760                break;
761            }
762            case sstcommit: {
763                lcisnewsql = true;
764                TSourceToken lcPrev = pcst.prevSolidToken();
765                if ((lcPrev != null) && (lcPrev.tokencode == TBaseType.rrw_hana_of)) {
766                    lcisnewsql = false;
767                }
768                if (pstate != EFindSqlStateType.stnormal) {
769                    lcisnewsql = false;
770
771                }
772                if (lcisnewsql) {
773                    ret = new TCommitStmt(this.vendor);
774                }
775
776                break;
777            }
778            case sstrollback: {
779                ret = new TRollbackStmt(this.vendor);
780                break;
781            }
782            case sstRevoke: {
783                lcisnewsql = true;
784
785                if (pstate != EFindSqlStateType.stnormal) {
786                    lcisnewsql = false;
787
788                }
789                if (lcisnewsql) {
790                    ret = new TRevokeStmt(this.vendor);
791                }
792                break;
793            }
794            case sstcreateindex: {
795                ret = new TCreateIndexSqlStatement(this.vendor);
796                break;
797            }
798            case sstset: {
799                lcisnewsql = true;
800                if (pstate != EFindSqlStateType.stnormal) {
801                    if (TBaseType.assigned(lccurrentsqlstatement)) {
802                        lcisnewsql = false;
803                    }
804                }
805
806                if (lcisnewsql) {
807                    ret = new TSetStmt(this.vendor);
808                }
809
810                break;
811            }
812            case sstdropsequence:
813                ret = new TDropSequenceStmt(this.vendor);
814                break;
815            case sstalterdatabase:
816                ret = new TAlterDatabaseStmt(this.vendor);
817                break;
818            case sstcreatedatabase: {
819                ret = new TCreateDatabaseSqlStatement(this.vendor);
820                break;
821            }
822            case sstcreateschema: {
823                ret = new TCreateSchemaSqlStatement(this.vendor);
824                break;
825            }
826            case sstcreatesynonym: {
827                ret = new TCreateSynonymStmt(this.vendor);
828                break;
829            }
830            case sstcreatetype:
831                ret = new TMssqlCreateType(this.vendor);
832                break;
833            case sstreplace:
834                lcisnewsql = true;
835                TSourceToken lcNext = pcst.nextSolidToken();
836                if ((lcNext != null) && (lcNext.tokencode == '(')) {
837                    lcisnewsql = false;
838                }
839                if (pstate != EFindSqlStateType.stnormal) {
840                    lcisnewsql = false;
841                }
842                if (lcisnewsql) {
843                    ret = new TUpsertStmt(this.vendor);
844                }
845                break;
846            case sstalterauditpolicy:
847                ret = new TAlterAuditPolicyStmt(this.vendor);
848                break;
849            case sstaltercredential:
850                ret = new TAlterCredentialStmt(this.vendor);
851                break;
852            case sstalterfulltextindex:
853                ret = new TAlterFulltextIndexStmt(this.vendor);
854                break;
855            case sstalterindex:
856                ret = new TAlterIndexStmt(this.vendor);
857                break;
858            case sstalterldapprovider:
859                ret = new TAlterLDAPProviderStmt(this.vendor);
860                break;
861            case sstalterjwtprovider:
862                ret = new TAlterJWTProviderStmt(this.vendor);
863                break;
864            case sstalterpse:
865                ret = new TAlterPSEStmt(this.vendor);
866                break;
867            case sstalterremotesource:
868                ret = new TAlterRemoteSourceStmt(this.vendor);
869                break;
870            case sstAlterRole:
871                ret = new TAlterRoleStmt(this.vendor);
872                break;
873            case sstaltersamlprovider:
874                ret = new TAlterSAMLProviderStmt(this.vendor);
875                break;
876            case sstaltersequence:
877                ret = new TAlterSequenceStatement(this.vendor);
878                break;
879            case sstalterstatistics:
880                ret = new TAlterStatisticsStmt(this.vendor);
881                break;
882            case sstaltersystem:
883                ret = new TAlterSystemStmt(this.vendor);
884                break;
885            case sstunload:
886                lcisnewsql = true;
887                if (pstate != EFindSqlStateType.stnormal) {
888                    lcisnewsql = false;
889                }
890                if (lcisnewsql) {
891                    ret = new TUnloadStmt(this.vendor);
892                    ret.sqlstatementtype = gnewsqlstatementtype;
893                }
894                break;
895            case sstunset:
896            case sstunsetpse:
897            case sstunsetsystemlicense:
898                lcisnewsql = true;
899                if (pstate != EFindSqlStateType.stnormal) {
900                    lcisnewsql = false;
901                }
902                if (lcisnewsql) {
903                    ret = new TUnsetStmt(this.vendor);
904                    ret.sqlstatementtype = gnewsqlstatementtype;
905                }
906                break;
907            case sstalteruser:
908                ret = new TAlterUserStmt(this.vendor);
909                break;
910            case sstconnect:
911                lcisnewsql = true;
912                if (pstate != EFindSqlStateType.stnormal) {
913                    lcisnewsql = false;
914                }
915                if (lcisnewsql) {
916                    ret = new TConnectStmt(this.vendor);
917                    ret.sqlstatementtype = gnewsqlstatementtype;
918                }
919                break;
920            case sstalterusergroup:
921                ret = new TAlterUserGroupStmt(this.vendor);
922                break;
923            case sstalterview:
924            case sstalterviewcache:
925                ret = new TAlterViewStatement(this.vendor);
926                break;
927            case sstaltervirtualtable:
928                ret = new TAlterVirtualTableStmt(this.vendor);
929                break;
930            case sstalterworkloadclass:
931                ret = new TAlterWorkloadClassStmt(this.vendor);
932                break;
933            case sstalterworkloadmapping:
934                ret = new TAlterWorkloadMappingStmt(this.vendor);
935                break;
936            case sstbackupcancel:
937                ret = new TBackupCancelStmt(this.vendor);
938                break;
939            case sstbackupcatalogdelete:
940                ret = new TBackupCatalogDeleteStmt(this.vendor);
941                break;
942            case sstbackupcheck:
943            case sstbackupcheckaccess:
944                ret = new TBackupCheckStmt(this.vendor);
945                break;
946            case sstbackupdata:
947                ret = new TBackupDataStmt(this.vendor);
948                break;
949            case sstbackuplistdata:
950                ret = new TBackupListDataStmt(this.vendor);
951                break;
952            case sstcall:
953                ret = new TCallStatement(this.vendor);
954                break;
955            case sstcomment:
956                ret = new TCommentOnSqlStmt(this.vendor);
957                break;
958            case sstcreateauditpolicy:
959                ret = new TCreateAuditPolicyStmt(this.vendor);
960                break;
961            case sstcreatecertificate:
962                ret = new TCreateCertificateStmt(this.vendor);
963                break;
964            case sstcreatecollection:
965                ret = new TCreateCollectionStmt(this.vendor);
966                break;
967            case sstcreatecredential:
968                ret = new TCreateCredentialStmt(this.vendor);
969                break;
970            case sstcreatefulltextindex:
971                ret = new TCreateFulltextIndexStmt(this.vendor);
972                break;
973            case sstcreategraphworkspace:
974                ret = new TCreateGraphWorkspaceStmt(this.vendor);
975                break;
976            case sstcreateJWTProvider:
977                ret = new TCreateJWTProviderStmt(this.vendor);
978                break;
979            case sstcreateLDAPProvider:
980                ret = new TCreateLDAPProviderStmt(this.vendor);
981                break;
982            case sstcreatepse:
983                ret = new TCreatePSEStmt(this.vendor);
984                break;
985            case sstcreateremotesource:
986                ret = new TCreateRemoteSourceStmt(this.vendor);
987                break;
988            case sstcreaterole:
989                ret = new TCreateRoleStmt(this.vendor);
990                break;
991            case sstcreatesamlprovider:
992                ret = new TCreateSAMLProviderStmt(this.vendor);
993                break;
994            case sstcreatestatistics:
995                ret = new TCreateStatistics(this.vendor);
996                break;
997            case sstcreatestructuredprivilege:
998                ret = new TCreateStructuredPrivilegeStmt(this.vendor);
999                break;
1000            case sstcreateuser:
1001                ret = new TCreateUserStmt(this.vendor);
1002                break;
1003            case sstcreateusergroup:
1004                ret = new TCreateUserGroupStmt(this.vendor);
1005                break;
1006            case sstcreatevirtualfunction:
1007                ret = new TCreateVirtualFunctionStmt(this.vendor);
1008                break;
1009            case sstcreatevirtualtable:
1010                ret = new TCreateVirtualTableStmt(this.vendor);
1011                break;
1012            case sstcreateworkloadclass:
1013                ret = new TCreateWorkloadClassStmt(this.vendor);
1014                break;
1015            case sstcreateworkloadmapping:
1016                ret = new TCreateWorkloadMappingStmt(this.vendor);
1017                break;
1018            case sstdropauditpolicy:
1019            case sstdropcertificate:
1020            case sstdropcollection:
1021            case sstdropcredential:
1022            case sstdropfulltextindex:
1023            case sstdropJWTProvider:
1024            case sstdropLDAPProvider:
1025            case sstdroppse:
1026            case sstdropremotesource:
1027            case sstdropsamlprovider:
1028            case sstdropstatistics:
1029            case sstdropgraphworkspace:
1030            case sstdropstructuredprivilege:
1031            case sstdroptype:
1032            case sstdropusergroup:
1033            case sstdropworkloadclass:
1034            case sstdropworkloadmapping:
1035                lcisnewsql = true;
1036                if (pstate != EFindSqlStateType.stnormal) {
1037                    lcisnewsql = false;
1038                }
1039                if (lcisnewsql) {
1040                    ret = new TDropStmt(this.vendor);
1041                }
1042
1043                break;
1044            case sstdropdatabase:
1045                ret = new TDropDatabaseStmt(this.vendor);
1046                break;
1047            case sstdropfunction:
1048                ret = new TDropFunctionStmt(this.vendor);
1049                break;
1050            case sstdropprocedure:
1051                ret = new TDropProcedureStmt(this.vendor);
1052                break;
1053            case sstdroprole:
1054                ret = new TDropRoleStmt(this.vendor);
1055                break;
1056            case sstdropschema:
1057                ret = new TDropSchemaSqlStatement(this.vendor);
1058                break;
1059            case sstdropsynonym:
1060                ret = new TDropSynonymStmt(this.vendor);
1061                break;
1062            case sstdroptrigger:
1063                ret = new TDropTriggerSqlStatement(this.vendor);
1064                break;
1065            case sstdropuser:
1066                ret = new TDropUserStmt(this.vendor);
1067                break;
1068            case sstExplain:
1069                ret = new TExplainPlan(this.vendor);
1070                break;
1071            case sstexport:
1072                ret = new TExportStmt(this.vendor);
1073                break;
1074            case sstimport:
1075                ret = new TImportStmt(this.vendor);
1076                break;
1077            case sstload:
1078                lcisnewsql = true;
1079                if (pstate != EFindSqlStateType.stnormal) {
1080                    lcisnewsql = false;
1081                }
1082                if (lcisnewsql) {
1083                    ret = new TLoadStmt(this.vendor);
1084                }
1085
1086                break;
1087            case sstlocktable:
1088                ret = new TLockTableStmt(this.vendor);
1089                break;
1090            case sstmergedelta:
1091                ret = new TMergeDeltaStmt(this.vendor);
1092                break;
1093            case sstmerge:
1094                ret = new TMergeSqlStatement(this.vendor);
1095                break;
1096            case sstrecoverdata:
1097                ret = new TRecoverDataStmt(this.vendor);
1098                break;
1099            case sstrecoverdatabase:
1100                ret = new TRecoverDatabaseStmt(this.vendor);
1101                break;
1102            case sstrefreshstatistics:
1103                ret = new TRefreshStatisticsStmt(this.vendor);
1104                break;
1105            case sstrenamecollection:
1106            case sstrenamecolumn:
1107            case sstrenamedatabase:
1108            case sstrenameindex:
1109            case sstrenametable:
1110                ret = new TRenameStmt(this.vendor);
1111                break;
1112            case sssethistorysession:
1113            case sstsetpse:
1114            case sstsetschema:
1115            case sstsetsystemlicense:
1116            case sstsettransaction:
1117            case sstsettransactionautocommit:
1118                ret = new TSetDatabaseObjectStmt(this.vendor);
1119                break;
1120            case ssttruncatecollection:
1121                ret = new TTruncateCollectionStmt(this.vendor);
1122                break;
1123            case sstvalidateLDAPProvider:
1124                ret = new TValidateLDAPProviderStmt(this.vendor);
1125                break;
1126            case sstvalidateUser:
1127                ret = new TValidateUserStmt(this.vendor);
1128                break;
1129            case sstupsert:
1130                ret = new TUpsertStmt(this.vendor);
1131                break;
1132            case sstsavepoint: {
1133                lcisnewsql = true;
1134
1135                if (pstate != EFindSqlStateType.stnormal) {
1136                    lcisnewsql = false;
1137
1138                }
1139                if (lcisnewsql) {
1140                    ret = new TSavepointStmt(this.vendor);
1141                    ret.sqlstatementtype = gnewsqlstatementtype;
1142                }
1143                break;
1144            }
1145            default: {
1146                ret = new TUnknownSqlStatement(this.vendor);
1147                ret.sqlstatementtype = gnewsqlstatementtype;
1148                break;
1149            }
1150        }    // case
1151
1152        return ret;
1153    }
1154}