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