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}