001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.netezza.*;
006
007/**
008 * Netezza SQL command resolver.
009 * Contains all Netezza-specific SQL command recognition logic.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsNetezza extends AbstractSqlCmds {
014
015    // Temporary field for statement type during issql processing
016    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
017
018    public TSqlCmdsNetezza() {
019        super(EDbVendor.dbvnetezza);
020    }
021
022    @Override
023    protected String getToken1Str(int token1) {
024        // Netezza vendor-specific reserved words
025        switch (token1) {
026            case TBaseType.rrw_netezza_copy:
027                return "copy";
028            case TBaseType.rrw_netezza_generate:
029                return "generate";
030            case TBaseType.rrw_netezza_groom:
031                return "groom";
032            default:
033                return null;
034        }
035    }
036
037    @Override
038    protected void initializeCommands() {
039        // Netezza commands - longer patterns before shorter ones with same prefix
040
041        // ALTER commands
042        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstnetezzaAlterDatabase);
043        addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstnetezzaAlterGroup);
044        addCmd(TBaseType.rrw_alter, "history", ESqlStatementType.sstnetezzaAlterHistoryConfiguration);
045        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstAlterSchema);
046        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstnetezzaAlterSequence);
047        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstaltersession);
048        addCmd(TBaseType.rrw_alter, "synonym", ESqlStatementType.sstAlterSynonym);
049        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstnetezzaAlterTable);
050        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstnetezzaAlterUser);
051        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstnetezzaAlterView);
052        addCmd(TBaseType.rrw_alter, "views", ESqlStatementType.sstnetezzaAlterView);
053
054        // BEGIN
055        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstnetezzaBegin);
056
057        // CALL
058        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
059
060        // COMMENT
061        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstnetezzaComment);
062
063        // COMMIT
064        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstnetezzaCommit);
065
066        // COPY (vendor-specific token)
067        addCmd(TBaseType.rrw_netezza_copy, ESqlStatementType.sstnetezzaCopy);
068
069        // CREATE commands - longer patterns first
070        addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
071        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
072        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
073        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
074        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstnetezzaCreateExternalTable);
075        addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstnetezzaCreateGruop);
076        addCmd(TBaseType.rrw_create, "history", "configuration", ESqlStatementType.sstnetezzaCreateHistoryConfiguration);
077        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
078        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
079        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstcreatesequence);
080        addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstcreatesynonym);
081        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
082        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
083        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
084        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstnetezzaCreateUser);
085        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
086
087        // DELETE
088        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
089
090        // DROP commands - longer patterns first
091        addCmd(TBaseType.rrw_drop, "connection", ESqlStatementType.sstnetezzaDropConnection);
092        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
093        addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstnetezzaDropGroup);
094        addCmd(TBaseType.rrw_drop, "history", "configuration", ESqlStatementType.sstnetezzaDropHistoryConfiguration);
095        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure);
096        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstnetezzaDropSchema);
097        addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstnetezzaDropSequence);
098        addCmd(TBaseType.rrw_drop, "session", ESqlStatementType.sstnetezzaDropSession);
099        addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstdropsynonym);
100        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstnetezzaDropTable);
101        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstnetezzaDropUser);
102        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstnetezzaDropView);
103
104        // EXEC/EXECUTE
105        addCmd(TBaseType.rrw_exec, ESqlStatementType.sstexecutestmt);
106        addCmd(TBaseType.rrw_execute, ESqlStatementType.sstexecutestmt);
107
108        // EXPLAIN
109        addCmd(TBaseType.rrw_explain, ESqlStatementType.sstExplain);
110
111        // GENERATE commands (vendor-specific token) - longer patterns first
112        addCmd(TBaseType.rrw_netezza_generate, "express", "statistics", ESqlStatementType.sstnetezzaGenerateStatistics);
113        addCmd(TBaseType.rrw_netezza_generate, "statistics", ESqlStatementType.sstnetezzaGenerateStatistics);
114
115        // GRANT
116        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstnetezzaGrant);
117
118        // GROOM commands (vendor-specific token)
119        addCmd(TBaseType.rrw_netezza_groom, "table", ESqlStatementType.sstnetezzaGroomTable);
120
121        // INSERT
122        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
123
124        // LOCK
125        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstlocktable);
126
127        // MERGE
128        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
129
130        // RESET
131        addCmd(TBaseType.rrw_reset, ESqlStatementType.sstnetezzaReset);
132
133        // REVOKE
134        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstnetezzaRevoke);
135
136        // ROLLBACK
137        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstnetezzaRollback);
138
139        // SELECT
140        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
141
142        // SET commands - longer patterns first
143        addCmd(TBaseType.rrw_set, "catalog", ESqlStatementType.sstSetCatalog);
144        addCmd(TBaseType.rrw_set, "schema", ESqlStatementType.sstSetSchema);
145        addCmd(TBaseType.rrw_set, ESqlStatementType.sstnetezzaSet);
146
147        // SHOW
148        addCmd(TBaseType.rrw_show, ESqlStatementType.sstnetezzaShow);
149
150        // TRUNCATE
151        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate);
152
153        // UPDATE
154        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
155    }
156
157    @Override
158    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
159        TCustomSqlStatement ret = null;
160
161        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
162
163        // Skip whitespace, comments, semicolons
164        if ((token.tokencode == TBaseType.cmtdoublehyphen)
165                || (token.tokencode == TBaseType.cmtslashstar)
166                || (token.tokencode == TBaseType.lexspace)
167                || (token.tokencode == TBaseType.lexnewline)
168                || (token.tokentype == ETokenType.ttsemicolon)) {
169            return null;
170        }
171
172        int lcpos = token.posinlist;
173        TSourceTokenList lcsourcetokenlist = token.container;
174        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
175
176        // Subquery after semicolon or at first line
177        if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) {
178            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
179            if (k > 0) {
180                ret = new TSelectSqlStatement(this.vendor);
181            }
182
183            k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_with, 1, "(");
184            if (k > 0) {
185                ret = new TSelectSqlStatement(this.vendor);
186            }
187
188            return ret;
189        }
190
191        // CTE
192        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
193            ret = findcte(token);
194            if ((ret != null)) return ret;
195        }
196
197        gnewsqlstatementtype = getStatementTypeForToken(token);
198
199        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
200
201        switch (gnewsqlstatementtype) {
202            case sstinvalid: {
203                ret = null;
204                if (state == EFindSqlStateType.stnormal) {
205                }
206                break;
207            }
208            case sstselect: {
209                boolean lcisnewsql = true;
210
211                if (state != EFindSqlStateType.stnormal) {
212                    if ((lcprevsolidtoken != null)) {
213                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
214                            lcisnewsql = false; // subquery
215                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
216                            lcisnewsql = false;
217                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
218                            lcisnewsql = false;
219                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
220                            lcisnewsql = false;
221                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
222                            lcisnewsql = false;
223                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
224                            lcisnewsql = false;
225                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
226                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
227                                lcisnewsql = false;
228                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
229                                lcisnewsql = false;
230                        }
231
232                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
233                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
234                            if ((lcpprevsolidtoken != null)) {
235                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
236                                    lcisnewsql = false;
237                            }
238                        }
239                    }
240
241                    if ((lccurrentsqlstatement != null)) {
242                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
243                            lcisnewsql = false;
244                    }
245                }
246
247                if (lcisnewsql)
248                    ret = new TSelectSqlStatement(this.vendor);
249
250                break;
251            }
252            case sstinsert: {
253                boolean lcisnewsql = true;
254                if (state != EFindSqlStateType.stnormal) {
255                    if ((lccurrentsqlstatement != null)) {
256                    }
257                }
258
259                if (lcisnewsql)
260                    ret = new TInsertSqlStatement(this.vendor);
261
262                break;
263            }
264            case sstupdate: {
265                boolean lcisnewsql = true;
266                if (state != EFindSqlStateType.stnormal) {
267                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
268                    if ((lcprevsolidtoken != null)) {
269                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
270                            lcisnewsql = false;
271                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
272                            lcisnewsql = false;
273                    }
274
275                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
276                    if ((lcnextsolidtoken != null)) {
277                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
278                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
279                            if (k == 0) lcisnewsql = false;
280                        }
281                    }
282
283                    if ((lccurrentsqlstatement != null)) {
284                    }
285                }
286
287                if (lcisnewsql) {
288                    ret = new TUpdateSqlStatement(this.vendor);
289                    ret.dummytag = 1; // means set clause in update is not found yet
290                }
291                break;
292            }
293            case sstdelete: {
294                boolean lcisnewsql = true;
295
296                if (state != EFindSqlStateType.stnormal) {
297                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
298                    if ((lcprevsolidtoken != null)) {
299                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
300                            lcisnewsql = false;
301                    }
302
303                    if ((lccurrentsqlstatement != null)) {
304                    }
305                }
306
307                if (lcisnewsql)
308                    ret = new TDeleteSqlStatement(this.vendor);
309
310                break;
311            }
312            case sstTruncate: {
313                ret = new TTruncateStatement(this.vendor);
314                ret.sqlstatementtype = gnewsqlstatementtype;
315                break;
316            }
317            case sstcreatetable:
318            case sstnetezzaCreateExternalTable: {
319                ret = new TCreateTableSqlStatement(this.vendor);
320                break;
321            }
322            case sstcreateview: {
323                ret = new TCreateViewSqlStatement(this.vendor);
324                break;
325            }
326            case sstcreatematerializedview: {
327                ret = new TCreateMaterializedSqlStatement(this.vendor);
328                break;
329            }
330            case sstcreatedatabase: {
331                ret = new TCreateDatabaseSqlStatement(this.vendor);
332                break;
333            }
334            case sstdroptable: {
335                ret = new TDropTableSqlStatement(this.vendor);
336                break;
337            }
338            case sstdropview: {
339                ret = new TDropViewSqlStatement(this.vendor);
340                break;
341            }
342            case sstaltertable: {
343                ret = new TAlterTableStatement(this.vendor);
344                break;
345            }
346            case sstaltersession: {
347                ret = new TAlterSessionStatement(this.vendor);
348                break;
349            }
350            case sstnetezzaGroomTable: {
351                ret = new TNetezzaGroomTable(this.vendor);
352                break;
353            }
354            case sstnetezzaGenerateStatistics: {
355                ret = new TNetezzaGenerateStatistics(this.vendor);
356                break;
357            }
358            case sstnetezzaAlterTable: {
359                ret = new TAlterTableStatement(this.vendor);
360                break;
361            }
362            case sstnetezzaDropSchema: {
363                ret = new TDropSchemaSqlStatement(this.vendor);
364                break;
365            }
366            case sstnetezzaCreateUser: {
367                ret = new TCreateUserStmt(this.vendor);
368                break;
369            }
370            case sstnetezzaAlterView: {
371                ret = new TAlterViewStatement(this.vendor);
372                break;
373            }
374            case sstnetezzaAlterDatabase: {
375                ret = new TAlterDatabaseStmt(this.vendor);
376                break;
377            }
378            case sstAlterSchema: {
379                ret = new TAlterSchemaStmt(this.vendor);
380                break;
381            }
382            case sstAlterSynonym: {
383                ret = new TAlterSynonymStmt(this.vendor);
384                break;
385            }
386            case sstnetezzaDropTable: {
387                ret = new TDropTableSqlStatement(this.vendor);
388                break;
389            }
390            case sstnetezzaDropView: {
391                ret = new TDropViewSqlStatement(this.vendor);
392                break;
393            }
394            case sstmerge: {
395                ret = new TMergeSqlStatement(this.vendor);
396                break;
397            }
398            case sstdropprocedure: {
399                ret = new TDropProcedureStmt(this.vendor);
400                break;
401            }
402            case sstdropsynonym:
403                ret = new TDropSynonymStmt(this.vendor);
404                break;
405            case sstdropdatabase:
406                ret = new TDropDatabaseStmt(this.vendor);
407                break;
408            case sstcall:
409                ret = new TCallStatement(this.vendor);
410                break;
411            case sstcreatesynonym:
412                ret = new TCreateSynonymStmt(this.vendor);
413                break;
414            case sstcreatesequence:
415                ret = new TCreateSequenceStmt(this.vendor);
416                break;
417            case sstnetezzaDropSequence:
418                ret = new TDropSequenceStmt(this.vendor);
419                break;
420            case sstnetezzaGrant:
421                ret = new TGrantStmt(this.vendor);
422                break;
423            case sstexecutestmt:
424                ret = new TExecuteSqlStatement(this.vendor);
425                break;
426            case sstlocktable:
427                ret = new TLockTableStmt(this.vendor);
428                break;
429            case sstnetezzaComment:
430                ret = new TCommentOnSqlStmt(this.vendor);
431                break;
432            case sstcreateprocedure:
433                ret = new TCreateProcedureStmt(this.vendor);
434                break;
435            case sstnetezzaCopy:
436                ret = new TCopyStmt(this.vendor);
437                break;
438            case sstExplain:
439                ret = new TExplainPlan(this.vendor);
440                break;
441            case sstSetCatalog:
442                ret = new TSetCatalogStmt(this.vendor);
443                break;
444            case sstSetSchema:
445                ret = new TSetSchemaStmt(this.vendor);
446                break;
447            case sstnetezzaCommit:
448            case sstnetezzaRollback:
449            case sstnetezzaRevoke:
450            default: {
451                ret = new TUnknownSqlStatement(this.vendor);
452                ret.sqlstatementtype = gnewsqlstatementtype;
453                break;
454            }
455        }
456
457        return ret;
458    }
459}