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