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}