001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.postgresql.TRefreshMaterializedViewStmt;
006import gudusoft.gsqlparser.stmt.redshift.*;
007
008/**
009 * Redshift SQL command resolver.
010 * Handles Amazon Redshift SQL syntax and command recognition.
011 *
012 * @since 3.1.0.9
013 */
014public class TSqlCmdsRedshift extends AbstractSqlCmds {
015
016    public TSqlCmdsRedshift() {
017        super(EDbVendor.dbvredshift);
018    }
019
020    @Override
021    protected void initializeCommands() {
022        // Commands sorted alphabetically
023        // Redshift is PostgreSQL-based but has its own command set
024
025        // ABORT commands
026        addCmd(TBaseType.rrw_abort, ESqlStatementType.sstredshiftAbort);
027        addCmd(TBaseType.rrw_abort, "transaction", ESqlStatementType.sstredshiftAbort);
028        addCmd(TBaseType.rrw_abort, "work", ESqlStatementType.sstredshiftAbort);
029
030        // ALTER commands (ordered: longer patterns first)
031        addCmd(TBaseType.rrw_alter, "external", "schema", ESqlStatementType.sstredshiftAlterExternalSchema);
032        addCmd(TBaseType.rrw_alter, "external", "view", ESqlStatementType.sstredshiftAlterExternalView);
033        addCmd(TBaseType.rrw_alter, "default", "privileges", ESqlStatementType.sstredshiftAlterDefaultPrivileges);
034        addCmd(TBaseType.rrw_alter, "identity", "provider", ESqlStatementType.sstredshiftAlterIdentityProvider);
035        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstredshiftAlterMaterializedView);
036        addCmd(TBaseType.rrw_alter, "masking", ESqlStatementType.sstredshiftAlterMaskingPolicy);
037        addCmd(TBaseType.rrw_alter, "rls", ESqlStatementType.sstredshiftAlterRlsPolicy);
038        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstalterdatabase);
039        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstredshiftAlterFunction);
040        addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstredshiftAlterGroup);
041        addCmd(TBaseType.rrw_alter, "datashare", ESqlStatementType.sstredshiftAlterDatashare);
042        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstredshiftAlterProcedure);
043        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstredshiftAlterRole);
044        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstredshiftAlterSchema);
045        addCmd(TBaseType.rrw_alter, "system", ESqlStatementType.sstredshiftAlterSystem);
046        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
047        addCmd(TBaseType.rrw_alter, "template", ESqlStatementType.sstredshiftAlterTemplate);
048        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstredshiftAlterUser);
049
050        // ATTACH commands
051        addCmd(TBaseType.rrw_redshift_attach, "rls", ESqlStatementType.sstredshiftAttachRlsPolicy);
052        addCmd(TBaseType.rrw_redshift_attach, "masking", ESqlStatementType.sstredshiftAttachMaskingPolicy);
053
054        // ANALYZE commands (longer pattern first)
055        addCmd(TBaseType.rrw_analyze, "Compression", ESqlStatementType.sstredshiftAnalyzeCompression);
056        addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstredshiftAnalyze);
057
058        // BEGIN
059        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstredshiftBegin);
060
061        // CALL
062        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
063
064        // CANCEL
065        addCmd(TBaseType.rrw_redshift_cancel, ESqlStatementType.sstredshiftCancel);
066
067        // CLOSE
068        addCmd(TBaseType.rrw_close, ESqlStatementType.sstredshiftClose);
069
070        // COMMENT
071        addCmd(TBaseType.rrw_comment, "on", ESqlStatementType.sstredshiftComment);
072
073        // COMMIT
074        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstredshiftCommit);
075
076        // COPY (longer patterns first)
077        addCmd(TBaseType.rrw_redshift_copy, "job", ESqlStatementType.sstredshiftCopyJob);
078        addCmd(TBaseType.rrw_redshift_copy, ESqlStatementType.sstredshiftCopy);
079
080        // DETACH commands
081        addCmd(TBaseType.rrw_redshift_detach, "rls", ESqlStatementType.sstredshiftDetachRlsPolicy);
082        addCmd(TBaseType.rrw_redshift_detach, "masking", ESqlStatementType.sstredshiftDetachMaskingPolicy);
083
084        // CREATE commands (ordered: longer patterns first)
085        addCmd(TBaseType.rrw_create, "external", "protected", "view", ESqlStatementType.sstredshiftCreateExternalView);
086        addCmd(TBaseType.rrw_create, "external", "function", ESqlStatementType.sstredshiftCreateExternalFunction);
087        addCmd(TBaseType.rrw_create, "external", "view", ESqlStatementType.sstredshiftCreateExternalView);
088        addCmd(TBaseType.rrw_create, "or", "replace", "external", "function", ESqlStatementType.sstredshiftCreateExternalFunction);
089        addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
090        addCmd(TBaseType.rrw_create, "or", "replace", "library", ESqlStatementType.sstredshiftCreateLibrary);
091        addCmd(TBaseType.rrw_create, "or", "replace", "template", ESqlStatementType.sstredshiftCreateTemplate);
092        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
093        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
094        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
095        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction);
096        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
097        addCmd(TBaseType.rrw_create, "identity", "provider", ESqlStatementType.sstredshiftCreateIdentityProvider);
098        addCmd(TBaseType.rrw_create, "masking", "policies", ESqlStatementType.sstredshiftCreateMaskingPolicy);
099        addCmd(TBaseType.rrw_create, "masking", "policy", ESqlStatementType.sstredshiftCreateMaskingPolicy);
100        addCmd(TBaseType.rrw_create, "external", "schema", ESqlStatementType.sstredshiftCreateSchema);
101        addCmd(TBaseType.rrw_create, "external", "model", ESqlStatementType.sstredshiftCreateExternalModel);
102        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstcreatetable);
103        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
104        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
105        addCmd(TBaseType.rrw_create, "local", "table", ESqlStatementType.sstcreatetable);
106        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
107        addCmd(TBaseType.rrw_create, "rls", "policies", ESqlStatementType.sstredshiftCreateRlsPolicy);
108        addCmd(TBaseType.rrw_create, "rls", "policy", ESqlStatementType.sstredshiftCreateRlsPolicy);
109        addCmd(TBaseType.rrw_create, "datashare", ESqlStatementType.sstredshiftCreateDatashare);
110        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
111        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction);
112        addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstredshiftCreateGroup);
113        addCmd(TBaseType.rrw_create, "library", ESqlStatementType.sstredshiftCreateLibrary);
114        addCmd(TBaseType.rrw_create, "model", ESqlStatementType.sstredshiftCreateModel);
115        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
116        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstredshiftCreateRole);
117        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstredshiftCreateSchema);
118        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
119        addCmd(TBaseType.rrw_create, "template", ESqlStatementType.sstredshiftCreateTemplate);
120        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstredshiftCreateUser);
121        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
122
123        // DESC
124        addCmd(TBaseType.rrw_redshift_desc, "identity", "provider", ESqlStatementType.sstredshiftDescIdentityProvider);
125        addCmd(TBaseType.rrw_redshift_desc, "datashare", ESqlStatementType.sstredshiftDescDatashare);
126
127        // DEALLOCATE
128        addCmd(TBaseType.rrw_deallocate, ESqlStatementType.sstredshiftDeallocate);
129
130        // DECLARE
131        addCmd(TBaseType.rrw_declare, ESqlStatementType.sstredshiftDeclare);
132
133        // DELETE
134        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
135
136        // DROP commands (ordered: longer patterns first)
137        addCmd(TBaseType.rrw_drop, "external", "view", ESqlStatementType.sstredshiftDropExternalView);
138        addCmd(TBaseType.rrw_drop, "identity", "provider", ESqlStatementType.sstredshiftDropIdentityProvider);
139        addCmd(TBaseType.rrw_drop, "masking", "policies", ESqlStatementType.sstredshiftDropMaskingPolicy);
140        addCmd(TBaseType.rrw_drop, "masking", "policy", ESqlStatementType.sstredshiftDropMaskingPolicy);
141        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstredshiftDropMaterializedView);
142        addCmd(TBaseType.rrw_drop, "rls", "policies", ESqlStatementType.sstredshiftDropRlsPolicy);
143        addCmd(TBaseType.rrw_drop, "rls", "policy", ESqlStatementType.sstredshiftDropRlsPolicy);
144        addCmd(TBaseType.rrw_drop, "datashare", ESqlStatementType.sstredshiftDropDatashare);
145        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstredshiftDropDatabase);
146        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstredshiftDropFunction);
147        addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstredshiftDropGroup);
148        addCmd(TBaseType.rrw_drop, "library", ESqlStatementType.sstredshiftDropLibrary);
149        addCmd(TBaseType.rrw_drop, "model", ESqlStatementType.sstredshiftDropModel);
150        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstredshiftDropProcedure);
151        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstredshiftDropRole);
152        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstredshiftDropSchema);
153        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
154        addCmd(TBaseType.rrw_drop, "template", ESqlStatementType.sstredshiftDropTemplate);
155        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstredshiftDropUser);
156        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
157
158        // END
159        addCmd(TBaseType.rrw_end, ESqlStatementType.sstredshiftEnd);
160
161        // EXECUTE
162        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstExecutePreparedStmt);
163
164        // EXPLAIN
165        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstExplain);
166
167        // FETCH
168        addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstFetchFrom);
169
170        // GRANT
171        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant);
172
173        // INSERT
174        addCmd(TBaseType.rrw_insert, "into", ESqlStatementType.sstinsert);
175
176        // LOCK
177        addCmd(TBaseType.rrw_lock, ESqlStatementType.sstredshiftLock);
178
179        // MERGE
180        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
181
182        // PREPARE
183        addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstredshiftPrepare);
184
185        // REFRESH
186        addCmd(TBaseType.rrw_refresh, "materialized", "view", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
187
188        // RESET
189        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstredshiftReset);
190
191        // REVOKE
192        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke);
193
194        // ROLLBACK
195        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstredshiftRollback);
196
197        // SELECT
198        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
199
200        // SET commands (ordered: longer patterns first)
201        addCmd(TBaseType.rrw_set, "local", "Authorization", ESqlStatementType.sstredshiftSetSessionAuthorization);
202        addCmd(TBaseType.rrw_set, "Characteristics", ESqlStatementType.sstredshiftSetSessionCharacteristics);
203        addCmd(TBaseType.rrw_set, "Authorization", ESqlStatementType.sstredshiftSetSessionAuthorization);
204        addCmd(TBaseType.rrw_set, ESqlStatementType.sstredshiftSet);
205
206        // SHOW
207        addCmd(TBaseType.rrw_show, ESqlStatementType.sstredshiftShow);
208
209        // START TRANSACTION
210        addCmd(TBaseType.rrw_start, "Transaction", ESqlStatementType.sstStartTransaction);
211
212        // TRUNCATE
213        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
214
215        // UNLOAD
216        addCmd(TBaseType.rrw_redshift_unload, ESqlStatementType.sstredshiftUnload);
217
218        // UPDATE
219        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
220
221        // USE
222        addCmd(TBaseType.rrw_use, "database", ESqlStatementType.sstUseDatabase);
223        addCmd(TBaseType.rrw_use, "schema", ESqlStatementType.sstUseDatabase);
224        addCmd(TBaseType.rrw_use, ESqlStatementType.sstUseDatabase);
225
226        // VACUUM
227        addCmd(TBaseType.rrw_redshift_vacuum, ESqlStatementType.sstredshiftVacuum);
228    }
229
230    @Override
231    protected String getToken1Str(int token1) {
232        // Handle vendor-specific reserved words (token codes > TBaseType.rrw_abort)
233        switch (token1) {
234            case TBaseType.rrw_redshift_desc:
235                return "desc";
236            case TBaseType.rrw_redshift_cancel:
237                return "cancel";
238            case TBaseType.rrw_redshift_copy:
239                return "copy";
240            case TBaseType.rrw_redshift_unload:
241                return "unload";
242            case TBaseType.rrw_redshift_vacuum:
243                return "vacuum";
244            case TBaseType.rrw_redshift_attach:
245                return "attach";
246            case TBaseType.rrw_redshift_detach:
247                return "detach";
248            case TBaseType.rrw_redshift_library:
249                return "library";
250            default:
251                return null;
252        }
253    }
254
255    @Override
256    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
257        TCustomSqlStatement ret = null;
258
259        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
260
261        // Skip comments, whitespace, and semicolons
262        if ((token.tokencode == TBaseType.cmtdoublehyphen)
263                || (token.tokencode == TBaseType.cmtslashstar)
264                || (token.tokencode == TBaseType.lexspace)
265                || (token.tokencode == TBaseType.lexnewline)
266                || (token.tokentype == ETokenType.ttsemicolon)) {
267            return null;
268        }
269
270        int lcpos = token.posinlist;
271        TSourceTokenList lcsourcetokenlist = token.container;
272        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
273
274        // Subquery after semicolon or at first line
275        if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) {
276            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
277            if (k > 0) {
278                ret = new TSelectSqlStatement(this.vendor);
279            }
280            return ret;
281        }
282
283        // CTE (Common Table Expression)
284        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
285            ret = findcte(token);
286            if (ret != null) return ret;
287        }
288
289        gnewsqlstatementtype = getStatementTypeForToken(token);
290
291        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
292
293        switch (gnewsqlstatementtype) {
294            case sstinvalid:
295                ret = null;
296                break;
297
298            case sstselect: {
299                boolean lcisnewsql = true;
300
301                if (state != EFindSqlStateType.stnormal) {
302                    if (lcprevsolidtoken != null) {
303                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
304                            lcisnewsql = false; // subquery
305                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
306                            lcisnewsql = false;
307                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
308                            lcisnewsql = false;
309                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
310                            lcisnewsql = false;
311                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
312                            lcisnewsql = false;
313                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
314                            lcisnewsql = false;
315                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
316                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
317                                lcisnewsql = false;
318                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
319                                lcisnewsql = false;
320                        }
321
322                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
323                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
324                            if (lcpprevsolidtoken != null) {
325                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
326                                    lcisnewsql = false;
327                            }
328                        }
329                    }
330
331                    if (lccurrentsqlstatement != null) {
332                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
333                            lcisnewsql = false;
334                    }
335                }
336
337                if (lcisnewsql)
338                    ret = new TSelectSqlStatement(this.vendor);
339
340                break;
341            }
342
343            case sstinsert: {
344                ret = new TInsertSqlStatement(this.vendor);
345                break;
346            }
347
348            case sstupdate: {
349                boolean lcisnewsql = true;
350                if (state != EFindSqlStateType.stnormal) {
351                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
352                    if (lcprevsolidtoken != null) {
353                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
354                            lcisnewsql = false;
355                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
356                            lcisnewsql = false;
357                    }
358
359                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
360                    if (lcnextsolidtoken != null) {
361                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
362                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
363                            if (k == 0) lcisnewsql = false;
364                        }
365                    }
366                }
367
368                if (lcisnewsql) {
369                    ret = new TUpdateSqlStatement(this.vendor);
370                    ret.dummytag = 1; // means set clause in update is not found yet
371                }
372                break;
373            }
374
375            case sstdelete: {
376                boolean lcisnewsql = true;
377
378                if (state != EFindSqlStateType.stnormal) {
379                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
380                    if (lcprevsolidtoken != null) {
381                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
382                            lcisnewsql = false;
383                    }
384                }
385
386                if (lcisnewsql)
387                    ret = new TDeleteSqlStatement(this.vendor);
388
389                break;
390            }
391
392            case sstredshiftAbort:
393                ret = new TRedshiftAbort(this.vendor);
394                ret.sqlstatementtype = gnewsqlstatementtype;
395                break;
396
397            case sstalterdatabase:
398                ret = new TAlterDatabaseStmt(this.vendor);
399                break;
400
401            case sstredshiftAlterGroup:
402                ret = new TAlterGroup(this.vendor);
403                break;
404
405            case sstredshiftAlterSchema:
406                ret = new TRedshiftAlterSchema(this.vendor);
407                break;
408
409            case sstaltertable:
410                ret = new TAlterTableStatement(this.vendor);
411                break;
412
413            case sstredshiftAlterUser:
414                ret = new TRedshiftAlterUser(this.vendor);
415                break;
416
417            case sstredshiftAnalyze:
418                ret = new TRedshiftAnalyze(this.vendor);
419                break;
420
421            case sstredshiftAnalyzeCompression:
422                ret = new TRedshiftAnalyzeCompression(this.vendor);
423                break;
424
425            case sstredshiftBegin:
426                ret = new TRedshiftBegin(this.vendor);
427                break;
428
429            case sstredshiftCancel:
430                ret = new TRedshiftCancel(this.vendor);
431                break;
432
433            case sstredshiftClose:
434                ret = new TCloseStmt(this.vendor);
435                break;
436
437            case sstredshiftComment:
438                ret = new TRedshiftComment(this.vendor);
439                break;
440
441            case sstredshiftCommit:
442                ret = new TRedshiftCommit(this.vendor);
443                break;
444
445            case sstredshiftCopy:
446                ret = new TRedshiftCopy(this.vendor);
447                break;
448
449            case sstcreatedatabase:
450                ret = new TCreateDatabaseSqlStatement(this.vendor);
451                break;
452
453            case sstredshiftCreateGroup:
454                ret = new TCreateGroup(this.vendor);
455                break;
456
457            case sstredshiftCreateRole:
458            case sstredshiftAlterRole:
459            case sstredshiftDropRole:
460            case sstredshiftCreateDatashare:
461            case sstredshiftAlterDatashare:
462            case sstredshiftDropDatashare:
463            case sstredshiftDescDatashare:
464            case sstredshiftCreateRlsPolicy:
465            case sstredshiftAttachRlsPolicy:
466            case sstredshiftDetachRlsPolicy:
467            case sstredshiftDropRlsPolicy:
468            case sstredshiftAlterRlsPolicy:
469            case sstredshiftCreateMaskingPolicy:
470            case sstredshiftAlterMaskingPolicy:
471            case sstredshiftAttachMaskingPolicy:
472            case sstredshiftDetachMaskingPolicy:
473            case sstredshiftDropMaskingPolicy:
474            case sstredshiftCreateIdentityProvider:
475            case sstredshiftAlterIdentityProvider:
476            case sstredshiftDropIdentityProvider:
477            case sstredshiftDescIdentityProvider:
478            case sstredshiftCreateModel:
479            case sstredshiftCreateExternalModel:
480            case sstredshiftDropModel:
481            case sstredshiftAlterDefaultPrivileges:
482            case sstredshiftCreateLibrary:
483            case sstredshiftDropLibrary:
484            case sstredshiftAlterFunction:
485            case sstredshiftDropFunction:
486            case sstredshiftAlterProcedure:
487            case sstredshiftDropProcedure:
488            case sstredshiftAlterSystem:
489            case sstredshiftDropMaterializedView:
490            case sstredshiftAlterMaterializedView:
491            case sstredshiftCreateExternalView:
492            case sstredshiftAlterExternalView:
493            case sstredshiftDropExternalView:
494            case sstredshiftAlterExternalSchema:
495            case sstredshiftCopyJob:
496                ret = new TUnknownSqlStatement(this.vendor);
497                ret.sqlstatementtype = gnewsqlstatementtype;
498                break;
499
500            case sstredshiftCreateSchema:
501                ret = new TCreateSchemaSqlStatement(this.vendor);
502                break;
503
504            case sstcreatetable:
505                ret = new TCreateTableSqlStatement(this.vendor);
506                break;
507
508            case sstredshiftCreateUser:
509                ret = new TRedshiftCreateUser(this.vendor);
510                break;
511
512            case sstredshiftCreateTemplate:
513            case sstredshiftAlterTemplate:
514            case sstredshiftDropTemplate:
515            case sstredshiftCreateExternalFunction:
516                ret = new TUnknownSqlStatement(this.vendor);
517                ret.sqlstatementtype = gnewsqlstatementtype;
518                break;
519
520            case sstcreateview:
521                ret = new TCreateViewSqlStatement(this.vendor);
522                break;
523
524            case sstredshiftDeallocate:
525                ret = new TRedshiftDeallocate(this.vendor);
526                break;
527
528            case sstredshiftDeclare:
529                ret = new TRedshiftDeclare(this.vendor);
530                break;
531
532            case sstredshiftDropDatabase:
533                ret = new TDropDatabaseStmt(this.vendor);
534                break;
535
536            case sstredshiftDropGroup:
537                ret = new TDropGroup(this.vendor);
538                break;
539
540            case sstredshiftDropSchema:
541                ret = new TRedshiftDropSchema(this.vendor);
542                break;
543
544            case sstdroptable:
545                ret = new TDropTableSqlStatement(this.vendor);
546                break;
547
548            case sstredshiftDropUser:
549                ret = new TRedshiftDropUser(this.vendor);
550                break;
551
552            case sstdropview:
553                ret = new TDropViewSqlStatement(this.vendor);
554                break;
555
556            case sstredshiftEnd:
557                ret = new TRedshiftEnd(this.vendor);
558                break;
559
560            case sstExecutePreparedStmt:
561                ret = new TExecuteSqlStatement(this.vendor);
562                break;
563
564            case sstExplain:
565                ret = new TExplainPlan(this.vendor);
566                break;
567
568            case sstFetchFrom:
569                ret = new TFetchFromStmt(this.vendor);
570                break;
571
572            case sstGrant:
573                ret = new TGrantStmt(this.vendor);
574                break;
575
576            case sstredshiftLock:
577                ret = new TLockTableStmt(this.vendor);
578                break;
579
580            case sstredshiftPrepare:
581                ret = new TRedshiftPrepare(this.vendor);
582                break;
583
584            case sstredshiftReset:
585                ret = new TRedshiftReset(this.vendor);
586                break;
587
588            case sstRevoke:
589                ret = new TRevokeStmt(this.vendor);
590                break;
591
592            case sstredshiftRollback:
593                ret = new TRedshiftRollback(this.vendor);
594                break;
595
596            case sstredshiftSet:
597                ret = new TSetStmt(this.vendor);
598                break;
599
600            case sstredshiftSetSessionAuthorization:
601                ret = new TRedshiftSessionAuthorization(this.vendor);
602                break;
603
604            case sstredshiftShow:
605                ret = new TShowStmt(this.vendor);
606                break;
607
608            case sstStartTransaction: {
609                boolean lcisnewsql = true;
610                if (state != EFindSqlStateType.stnormal) {
611                    // Inside another statement - START WITH is hierarchical clause, not START TRANSACTION
612                    lcisnewsql = false;
613                }
614                if (lcisnewsql)
615                    ret = new TStartTransactionStmt(this.vendor);
616                break;
617            }
618
619            case sstTruncate:
620                ret = new TTruncateStatement(this.vendor);
621                break;
622
623            case sstredshiftUnload:
624                ret = new TUnloadStmt(this.vendor);
625                break;
626
627            case sstredshiftVacuum:
628                ret = new TRedshiftVacuum(this.vendor);
629                break;
630
631            case sstcreatefunction:
632                ret = new TCreateFunctionStmt(this.vendor);
633                break;
634
635            case sstcreateprocedure:
636                ret = new TCreateProcedureStmt(this.vendor);
637                break;
638
639            case sstcreatematerializedview:
640                ret = new TCreateMaterializedSqlStatement(this.vendor);
641                break;
642
643            case sstcall:
644                ret = new TCallStatement(this.vendor);
645                break;
646
647            case sstmerge:
648                ret = new TMergeSqlStatement(this.vendor);
649                break;
650
651            case sstpostgresqlRefreshMaterializedView:
652                ret = new TRefreshMaterializedViewStmt(this.vendor);
653                break;
654
655            case sstUseDatabase:
656                ret = new TUnknownSqlStatement(this.vendor);
657                ret.sqlstatementtype = gnewsqlstatementtype;
658                break;
659
660            default:
661                ret = new TUnknownSqlStatement(this.vendor);
662                ret.sqlstatementtype = gnewsqlstatementtype;
663                break;
664        }
665
666        return ret;
667    }
668}