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