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