001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.hive.*;
006
007/**
008 * Hive SQL command resolver.
009 * Contains all Hive-specific SQL command recognition logic.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsHive extends AbstractSqlCmds {
014
015    // Temporary field for statement type during issql processing
016    private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid;
017
018    public TSqlCmdsHive() {
019        super(EDbVendor.dbvhive);
020    }
021
022    /**
023     * For dialect subclasses (e.g. Impala) that reuse the Hive command table
024     * but must stamp statements with their own vendor.
025     */
026    protected TSqlCmdsHive(EDbVendor vendor) {
027        super(vendor);
028    }
029
030    @Override
031    protected String getToken1Str(int token1) {
032        switch (token1) {
033            case TBaseType.rrw_hive_desc:
034                return "desc";
035            case TBaseType.rrw_hive_export:
036                return "export";
037            case TBaseType.rrw_hive_import:
038                return "import";
039            case TBaseType.rrw_hive_msck:
040                return "msck";
041            case TBaseType.rrw_hive_reload:
042                return "reload";
043            case TBaseType.rrw_hive_list:
044                return "list";
045            case TBaseType.rrw_reset:
046                return "reset";
047            default:
048                return null;
049        }
050    }
051
052    @Override
053    protected void initializeCommands() {
054        // Hive commands - longer patterns before shorter ones with same prefix
055
056        // ADD commands
057        addCmd(TBaseType.rrw_add, "jar", ESqlStatementType.ssthiveShow);
058        addCmd(TBaseType.rrw_add, "file", ESqlStatementType.ssthiveShow);
059
060        // ALTER commands - longer patterns first
061        addCmd(TBaseType.rrw_alter, "scheduled", "query", ESqlStatementType.ssthiveShow);
062        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstAlterMaterializedView);
063        addCmd(TBaseType.rrw_alter, "connector", ESqlStatementType.ssthiveShow);
064        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstalterdatabase);
065        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstalterdatabase);
066        addCmd(TBaseType.rrw_alter, "index", ESqlStatementType.sstalterindex);
067        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
068        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstalterview);
069
070        // ANALYZE commands
071        addCmd(TBaseType.rrw_analyze, "table", ESqlStatementType.sstanalyzeTable);
072
073        // CREATE commands - longer patterns first
074        addCmd(TBaseType.rrw_create, "scheduled", "query", ESqlStatementType.ssthiveShow);
075        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
076        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
077        addCmd(TBaseType.rrw_create, "remote", "database", ESqlStatementType.sstcreatedatabase);
078        addCmd(TBaseType.rrw_create, "remote", "schema", ESqlStatementType.sstcreatedatabase);
079        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstcreatetable);
080        addCmd(TBaseType.rrw_create, "temporary", "function", ESqlStatementType.ssthiveCreateFunction);
081        addCmd(TBaseType.rrw_create, "temporary", "macro", ESqlStatementType.sstCreateMacro);
082        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
083        addCmd(TBaseType.rrw_create, "transactional", "table", ESqlStatementType.sstcreatetable);
084        addCmd(TBaseType.rrw_create, "managed", "table", ESqlStatementType.sstcreatetable);
085        addCmd(TBaseType.rrw_create, "connector", ESqlStatementType.ssthiveShow);
086        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
087        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.ssthiveCreateFunction);
088        addCmd(TBaseType.rrw_create, "index", ESqlStatementType.sstcreateindex);
089        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
090        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.ssthiveCreateRole);
091        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstcreatedatabase);
092        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
093        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
094
095        // DELETE commands - resource patterns before DML delete
096        addCmd(TBaseType.rrw_delete, "jar", ESqlStatementType.ssthiveShow);
097        addCmd(TBaseType.rrw_delete, "file", ESqlStatementType.ssthiveShow);
098        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
099
100        // DESCRIBE commands
101        addCmd(TBaseType.rrw_hive_desc, ESqlStatementType.ssthiveDesc);
102        addCmd(TBaseType.rrw_describe, ESqlStatementType.ssthiveDesc);
103
104        // DROP commands - longer patterns first
105        addCmd(TBaseType.rrw_drop, "scheduled", "query", ESqlStatementType.ssthiveShow);
106        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstoracledropmaterializedview);
107        addCmd(TBaseType.rrw_drop, "temporary", "function", ESqlStatementType.ssthiveDropFunciton);
108        addCmd(TBaseType.rrw_drop, "temporary", "macro", ESqlStatementType.sstDropMacro);
109        addCmd(TBaseType.rrw_drop, "connector", ESqlStatementType.ssthiveShow);
110        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.ssthiveDropDatabase);
111        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.ssthiveDropFunciton);
112        addCmd(TBaseType.rrw_drop, "index", ESqlStatementType.sstdropindex);
113        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure);
114        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.ssthiveDropRole);
115        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.ssthiveDropDatabase);
116        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
117        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
118
119        // EXPLAIN commands
120        addCmd(TBaseType.rrw_explain, ESqlStatementType.ssthiveExplain);
121
122        // EXPORT commands
123        addCmd(TBaseType.rrw_hive_export, "table", ESqlStatementType.ssthiveExportTable);
124
125        // GRANT commands
126        addCmd(TBaseType.rrw_grant, "role", ESqlStatementType.ssthiveGrantRole);
127        addCmd(TBaseType.rrw_grant, ESqlStatementType.ssthiveGrant);
128
129        // IMPORT commands - longer patterns first
130        addCmd(TBaseType.rrw_hive_import, "external", "table", ESqlStatementType.ssthiveImportTable);
131        addCmd(TBaseType.rrw_hive_import, "from", ESqlStatementType.ssthiveImportTable);
132        addCmd(TBaseType.rrw_hive_import, "table", ESqlStatementType.ssthiveImportTable);
133
134        // INSERT commands
135        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
136
137        // LIST commands
138        addCmd(TBaseType.rrw_hive_list, ESqlStatementType.ssthiveShow);
139
140        // LOAD commands
141        addCmd(TBaseType.rrw_load, "data", ESqlStatementType.ssthiveLoad);
142
143        // LOCK commands
144        addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.ssthiveLockTable);
145
146        // MERGE commands
147        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
148
149        // MSCK commands
150        addCmd(TBaseType.rrw_hive_msck, ESqlStatementType.sstmsck);
151
152        // RELOAD commands
153        addCmd(TBaseType.rrw_hive_reload, "functions", ESqlStatementType.ssthiveShow);
154        addCmd(TBaseType.rrw_hive_reload, "function", ESqlStatementType.ssthiveShow);
155
156        // RESET commands
157        addCmd(TBaseType.rrw_reset, ESqlStatementType.ssthiveSet);
158
159        // REVOKE commands
160        addCmd(TBaseType.rrw_revoke, "role", ESqlStatementType.ssthiveRevokeRole);
161        addCmd(TBaseType.rrw_revoke, "admin", ESqlStatementType.ssthiveRevokeRole);
162        addCmd(TBaseType.rrw_revoke, ESqlStatementType.ssthiveRevoke);
163
164        // SELECT commands
165        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
166
167        // SET commands
168        addCmd(TBaseType.rrw_set, ESqlStatementType.ssthiveSet);
169
170        // SHOW commands - longer patterns first
171        addCmd(TBaseType.rrw_show, "role", "grant", ESqlStatementType.ssthiveShowRoleGrants);
172        addCmd(TBaseType.rrw_show, "grant", ESqlStatementType.ssthiveShowGrants);
173        addCmd(TBaseType.rrw_show, ESqlStatementType.ssthiveShow);
174
175        // TRUNCATE commands
176        addCmd(TBaseType.rrw_truncate, "table", ESqlStatementType.sstTruncate);
177
178        // UNLOCK commands
179        addCmd(TBaseType.rrw_unlock, "table", ESqlStatementType.ssthiveUnlockTable);
180
181        // UPDATE commands
182        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
183
184        // VALUES commands (standalone table value constructor)
185        addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues);
186
187        // UPSERT commands
188        addCmd(TBaseType.rrw_hive_upsert, ESqlStatementType.sstupsert);
189
190        // USE commands
191        addCmd(TBaseType.rrw_use, ESqlStatementType.ssthiveSwitchDatabase);
192
193        // Transaction commands
194        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstcommit);
195        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstrollback);
196        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction);
197        addCmd(TBaseType.rrw_abort, "transactions", ESqlStatementType.sstrollback);
198    }
199
200    @Override
201    public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) {
202        TCustomSqlStatement ret = null;
203
204        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
205
206        if ((token.tokencode == TBaseType.cmtdoublehyphen)
207                || (token.tokencode == TBaseType.cmtslashstar)
208                || (token.tokencode == TBaseType.lexspace)
209                || (token.tokencode == TBaseType.lexnewline)
210                || (token.tokentype == ETokenType.ttsemicolon)) {
211            return null;
212        }
213
214        int lcpos = token.posinlist;
215        TSourceTokenList lcsourcetokenlist = token.container;
216        TCustomSqlStatement lccurrentsqlstatement = currentStatement;
217
218        // FROM query
219        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_from)) {
220            if (token.container == null) {
221                return new TSelectSqlStatement(this.vendor);
222            }
223
224            // Search select or insert who comes first
225            int lcpos1 = token.posinlist;
226            TSourceTokenList lcsourcetokenlist1 = token.container;
227            TSourceToken tmpSt;
228            int parenthesisCnt = 0;
229            for (int k = lcpos1 + 1; k < lcsourcetokenlist1.size(); k++) {
230                tmpSt = lcsourcetokenlist1.get(k);
231                if (tmpSt.tokencode == ';') break;
232                if (tmpSt.tokencode == '(') parenthesisCnt++;
233                if (tmpSt.tokencode == ')') parenthesisCnt--;
234                if (parenthesisCnt == 0) {
235                    if (tmpSt.tokencode == TBaseType.rrw_select) {
236                        ret = new TSelectSqlStatement(this.vendor);
237                        break;
238                    } else if (tmpSt.tokencode == TBaseType.rrw_insert) {
239                        ret = new TInsertSqlStatement(this.vendor);
240                        break;
241                    }
242                }
243            }
244
245            if (ret == null) {
246                ret = new TSelectSqlStatement(this.vendor);
247                // FROM (
248                //         FROM pv_users
249                //         MAP pv_users.userid, pv_users.date
250                //         USING 'map_script'
251                // AS dt, uid
252                // CLUSTER BY dt) map_output;
253            }
254
255            return ret;
256        }
257
258        // CTE
259        if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) {
260            ret = findcte(token);
261            if ((ret != null)) return ret;
262        }
263
264        // RELOAD, LIST, RESET keywords: tokencode doesn't match rrw_ constants, so detect by string
265        if (state == EFindSqlStateType.stnormal && token.tokentype == ETokenType.ttkeyword) {
266            String tokenStr = token.toString().toUpperCase();
267            if (tokenStr.equals("RELOAD") || tokenStr.equals("LIST") || tokenStr.equals("REPL")) {
268                return new THiveShow(this.vendor);
269            }
270            if (tokenStr.equals("RESET")) {
271                return new THiveSet(this.vendor);
272            }
273        }
274
275        gnewsqlstatementtype = getStatementTypeForToken(token);
276
277        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
278        switch (gnewsqlstatementtype) {
279            case sstinvalid: {
280                ret = null;
281                break;
282            }
283            case sstselect: {
284                boolean lcisnewsql = true;
285
286                if (state != EFindSqlStateType.stnormal) {
287
288                    if ((lccurrentsqlstatement != null)) {
289                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.ssthiveFromQuery)
290                            lcisnewsql = false;
291                    }
292
293                }
294
295                if (lcisnewsql)
296                    ret = new TSelectSqlStatement(this.vendor);
297
298                break;
299            }
300            case sstinsert: {
301                boolean lcisnewsql = true;
302                if (state != EFindSqlStateType.stnormal) {
303                    if ((lccurrentsqlstatement != null)) {
304                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.ssthiveFromQuery)
305                            lcisnewsql = false;
306                    }
307                }
308
309                if (lcisnewsql)
310                    ret = new TInsertSqlStatement(this.vendor);
311
312                break;
313            }
314            case sstTruncate: {
315                ret = new TTruncateStatement(this.vendor);
316                break;
317            }
318            case sstalterdatabase: {
319                ret = new TAlterDatabaseStmt(this.vendor);
320                break;
321            }
322            case sstalterindex: {
323                ret = new TAlterIndexStmt(this.vendor);
324                break;
325            }
326            case sstaltertable: {
327                ret = new TAlterTableStatement(this.vendor);
328                break;
329            }
330            case sstalterview: {
331                ret = new TAlterViewStatement(this.vendor);
332                break;
333            }
334            case sstanalyzeTable: {
335                ret = new TAnalyzeStmt(this.vendor);
336                break;
337            }
338            case sstcreatedatabase: {
339                ret = new TCreateDatabaseSqlStatement(this.vendor);
340                break;
341            }
342            case sstcreatetable: {
343                ret = new TCreateTableSqlStatement(this.vendor);
344                break;
345            }
346            case sstcreateindex: {
347                ret = new TCreateIndexSqlStatement(this.vendor);
348                break;
349            }
350            case sstcreateview: {
351                ret = new TCreateViewSqlStatement(this.vendor);
352                break;
353            }
354            case ssthiveCreateRole: {
355                ret = new THiveCreateRole(this.vendor);
356                break;
357            }
358            case sstcreateprocedure: {
359                ret = new TCreateProcedureStmt(this.vendor);
360                break;
361            }
362            case ssthiveCreateFunction: {
363                ret = new THiveCreateFunction(this.vendor);
364                break;
365            }
366            case ssthiveDesc: {
367                ret = new THiveDescribe(this.vendor);
368                break;
369            }
370            case ssthiveDropDatabase: {
371                ret = new THiveDropDatabase(this.vendor);
372                break;
373            }
374            case sstdropindex: {
375                ret = new TDropIndexSqlStatement(this.vendor);
376                break;
377            }
378            case ssthiveDropRole: {
379                ret = new THiveDropRole(this.vendor);
380                break;
381            }
382            case sstdroptable: {
383                ret = new TDropTableSqlStatement(this.vendor);
384                break;
385            }
386            case ssthiveDropFunciton: {
387                ret = new THiveDropFunction(this.vendor);
388                break;
389            }
390            case sstdropprocedure: {
391                ret = new TDropProcedureStmt(this.vendor);
392                break;
393            }
394            case sstdropview: {
395                ret = new TDropViewSqlStatement(this.vendor);
396                break;
397            }
398            case ssthiveExplain: {
399                ret = new THiveExplain(this.vendor);
400                break;
401            }
402            case ssthiveExportTable: {
403                ret = new THiveExportTable(this.vendor);
404                break;
405            }
406            case ssthiveGrant: {
407                ret = new THiveGrant(this.vendor);
408                break;
409            }
410            case ssthiveGrantRole: {
411                ret = new THiveGrantRole(this.vendor);
412                break;
413            }
414            case ssthiveImportTable: {
415                ret = new THiveImportTable(this.vendor);
416                break;
417            }
418            case ssthiveLoad: {
419                ret = new THiveLoad(this.vendor);
420                break;
421            }
422            case ssthiveLockTable: {
423                ret = new TLockTableStmt(this.vendor);
424                break;
425            }
426            case sstmsck: {
427                ret = new TMSCKStmt(this.vendor);
428                break;
429            }
430            case ssthiveRevoke: {
431                ret = new THiveRevoke(this.vendor);
432                break;
433            }
434            case ssthiveRevokeRole: {
435                ret = new THiveRevokeRole(this.vendor);
436                break;
437            }
438            case ssthiveSet: {
439                ret = new THiveSet(this.vendor);
440                break;
441            }
442            case ssthiveShow: {
443                ret = new THiveShow(this.vendor);
444                break;
445            }
446            case ssthiveShowGrants: {
447                ret = new THiveShowGrant(this.vendor);
448                break;
449            }
450            case ssthiveShowRoleGrants: {
451                ret = new THiveShowRoleGrant(this.vendor);
452                break;
453            }
454            case ssthiveUnlockTable: {
455                ret = new THiveUnlockTable(this.vendor);
456                break;
457            }
458            case ssthiveSwitchDatabase: {
459                ret = new TUseDatabase(this.vendor);
460                break;
461            }
462            case sstmerge: {
463                ret = new TMergeSqlStatement(this.vendor);
464                break;
465            }
466            case sstupdate: {
467                ret = new TUpdateSqlStatement(this.vendor);
468                break;
469            }
470            case sstdelete: {
471                ret = new TDeleteSqlStatement(this.vendor);
472                break;
473            }
474            case sstCreateMacro:
475                ret = new TCreateMacro(this.vendor);
476                break;
477            case sstDropMacro:
478                ret = new TDropMacro(this.vendor);
479                break;
480            case sstcreatematerializedview:
481                ret = new TCreateMaterializedSqlStatement(this.vendor);
482                break;
483            case sstAlterMaterializedView:
484                ret = new TAlterMaterializedViewStmt(this.vendor);
485                break;
486            case sstoracledropmaterializedview:
487                ret = new TDropMaterializedViewStmt(this.vendor);
488                break;
489            case sstupsert:
490                ret = new TUpsertStmt(this.vendor);
491                break;
492            case sstcommit:
493                ret = new TCommitStmt(this.vendor);
494                break;
495            case sstrollback:
496                ret = new TRollbackStmt(this.vendor);
497                break;
498            case sstStartTransaction:
499                ret = new TBeginTran(this.vendor);
500                break;
501            case sstValues:
502                ret = new TSelectSqlStatement(this.vendor);
503                break;
504            default: {
505                ret = new TUnknownSqlStatement(this.vendor);
506                ret.sqlstatementtype = gnewsqlstatementtype;
507                break;
508            }
509        }    // case
510
511        return ret;
512    }
513}