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