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}