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