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}