001package gudusoft.gsqlparser.sqlcmds; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.*; 005import gudusoft.gsqlparser.stmt.redshift.*; 006 007/** 008 * Redshift SQL command resolver. 009 * Handles Amazon Redshift SQL syntax and command recognition. 010 * 011 * @since 3.1.0.9 012 */ 013public class TSqlCmdsRedshift extends AbstractSqlCmds { 014 015 public TSqlCmdsRedshift() { 016 super(EDbVendor.dbvredshift); 017 } 018 019 @Override 020 protected void initializeCommands() { 021 // Commands sorted alphabetically 022 // Redshift is PostgreSQL-based but has its own command set 023 024 // ABORT commands 025 addCmd(TBaseType.rrw_abort, ESqlStatementType.sstredshiftAbort); 026 addCmd(TBaseType.rrw_abort, "transaction", ESqlStatementType.sstredshiftAbort); 027 addCmd(TBaseType.rrw_abort, "work", ESqlStatementType.sstredshiftAbort); 028 029 // ALTER commands 030 addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstalterdatabase); 031 addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstredshiftAlterGroup); 032 addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstredshiftAlterSchema); 033 addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable); 034 addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstredshiftAlterUser); 035 036 // ANALYZE commands (longer pattern first) 037 addCmd(TBaseType.rrw_analyze, "Compression", ESqlStatementType.sstredshiftAnalyzeCompression); 038 addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstredshiftAnalyze); 039 040 // BEGIN 041 addCmd(TBaseType.rrw_begin, ESqlStatementType.sstredshiftBegin); 042 043 // CALL 044 addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall); 045 046 // CANCEL 047 addCmd(TBaseType.rrw_redshift_cancel, ESqlStatementType.sstredshiftCancel); 048 049 // CLOSE 050 addCmd(TBaseType.rrw_close, ESqlStatementType.sstredshiftClose); 051 052 // COMMENT 053 addCmd(TBaseType.rrw_comment, "on", ESqlStatementType.sstredshiftComment); 054 055 // COMMIT 056 addCmd(TBaseType.rrw_commit, ESqlStatementType.sstredshiftCommit); 057 058 // COPY 059 addCmd(TBaseType.rrw_redshift_copy, ESqlStatementType.sstredshiftCopy); 060 061 // CREATE commands (ordered: longer patterns first) 062 addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview); 063 addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable); 064 addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable); 065 addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure); 066 addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction); 067 addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview); 068 addCmd(TBaseType.rrw_create, "external", "schema", ESqlStatementType.sstredshiftCreateSchema); 069 addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstcreatetable); 070 addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable); 071 addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable); 072 addCmd(TBaseType.rrw_create, "local", "table", ESqlStatementType.sstcreatetable); 073 addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview); 074 addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase); 075 addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction); 076 addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstredshiftCreateGroup); 077 addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure); 078 addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstredshiftCreateSchema); 079 addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable); 080 addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstredshiftCreateUser); 081 addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview); 082 083 // DEALLOCATE 084 addCmd(TBaseType.rrw_deallocate, ESqlStatementType.sstredshiftDeallocate); 085 086 // DECLARE 087 addCmd(TBaseType.rrw_declare, ESqlStatementType.sstredshiftDeclare); 088 089 // DELETE 090 addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete); 091 092 // DROP commands 093 addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstredshiftDropDatabase); 094 addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstredshiftDropGroup); 095 addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstredshiftDropSchema); 096 addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable); 097 addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstredshiftDropUser); 098 addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview); 099 100 // END 101 addCmd(TBaseType.rrw_end, ESqlStatementType.sstredshiftEnd); 102 103 // EXECUTE 104 addCmd(TBaseType.rrw_execute, ESqlStatementType.sstExecutePreparedStmt); 105 106 // EXPLAIN 107 addCmd(TBaseType.rrw_explain, ESqlStatementType.sstExplain); 108 109 // FETCH 110 addCmd(TBaseType.rrw_fetch, ESqlStatementType.sstFetchFrom); 111 112 // GRANT 113 addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant); 114 115 // INSERT 116 addCmd(TBaseType.rrw_insert, "into", ESqlStatementType.sstinsert); 117 118 // LOCK 119 addCmd(TBaseType.rrw_lock, ESqlStatementType.sstredshiftLock); 120 121 // MERGE 122 addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge); 123 124 // PREPARE 125 addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstredshiftPrepare); 126 127 // RESET 128 addCmd(TBaseType.rrw_reset, ESqlStatementType.sstredshiftReset); 129 130 // REVOKE 131 addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke); 132 133 // ROLLBACK 134 addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstredshiftRollback); 135 136 // SELECT 137 addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect); 138 139 // SET commands (ordered: longer patterns first) 140 addCmd(TBaseType.rrw_set, "local", "Authorization", ESqlStatementType.sstredshiftSetSessionAuthorization); 141 addCmd(TBaseType.rrw_set, "Characteristics", ESqlStatementType.sstredshiftSetSessionCharacteristics); 142 addCmd(TBaseType.rrw_set, "Authorization", ESqlStatementType.sstredshiftSetSessionAuthorization); 143 addCmd(TBaseType.rrw_set, ESqlStatementType.sstredshiftSet); 144 145 // SHOW 146 addCmd(TBaseType.rrw_show, ESqlStatementType.sstredshiftShow); 147 148 // START TRANSACTION 149 addCmd(TBaseType.rrw_start, "Transaction", ESqlStatementType.sstStartTransaction); 150 151 // TRUNCATE 152 addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate); 153 154 // UNLOAD 155 addCmd(TBaseType.rrw_redshift_unload, ESqlStatementType.sstredshiftUnload); 156 157 // UPDATE 158 addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate); 159 160 // VACUUM 161 addCmd(TBaseType.rrw_redshift_vacuum, ESqlStatementType.sstredshiftVacuum); 162 } 163 164 @Override 165 protected String getToken1Str(int token1) { 166 // Handle vendor-specific reserved words (token codes > TBaseType.rrw_abort) 167 switch (token1) { 168 case TBaseType.rrw_redshift_cancel: 169 return "cancel"; 170 case TBaseType.rrw_redshift_copy: 171 return "copy"; 172 case TBaseType.rrw_redshift_unload: 173 return "unload"; 174 case TBaseType.rrw_redshift_vacuum: 175 return "vacuum"; 176 default: 177 return null; 178 } 179 } 180 181 @Override 182 public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) { 183 TCustomSqlStatement ret = null; 184 185 gnewsqlstatementtype = ESqlStatementType.sstinvalid; 186 187 // Skip comments, whitespace, and semicolons 188 if ((token.tokencode == TBaseType.cmtdoublehyphen) 189 || (token.tokencode == TBaseType.cmtslashstar) 190 || (token.tokencode == TBaseType.lexspace) 191 || (token.tokencode == TBaseType.lexnewline) 192 || (token.tokentype == ETokenType.ttsemicolon)) { 193 return null; 194 } 195 196 int lcpos = token.posinlist; 197 TSourceTokenList lcsourcetokenlist = token.container; 198 TCustomSqlStatement lccurrentsqlstatement = currentStatement; 199 200 // Subquery after semicolon or at first line 201 if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) { 202 int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "("); 203 if (k > 0) { 204 ret = new TSelectSqlStatement(this.vendor); 205 } 206 return ret; 207 } 208 209 // CTE (Common Table Expression) 210 if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) { 211 ret = findcte(token); 212 if (ret != null) return ret; 213 } 214 215 gnewsqlstatementtype = getStatementTypeForToken(token); 216 217 TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 218 219 switch (gnewsqlstatementtype) { 220 case sstinvalid: 221 ret = null; 222 break; 223 224 case sstselect: { 225 boolean lcisnewsql = true; 226 227 if (state != EFindSqlStateType.stnormal) { 228 if (lcprevsolidtoken != null) { 229 if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis) 230 lcisnewsql = false; // subquery 231 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union) 232 lcisnewsql = false; 233 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect) 234 lcisnewsql = false; 235 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus) 236 lcisnewsql = false; 237 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except) 238 lcisnewsql = false; 239 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return) 240 lcisnewsql = false; 241 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) { 242 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable) 243 lcisnewsql = false; 244 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview) 245 lcisnewsql = false; 246 } 247 248 if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) { 249 TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist); 250 if (lcpprevsolidtoken != null) { 251 if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union) 252 lcisnewsql = false; 253 } 254 } 255 } 256 257 if (lccurrentsqlstatement != null) { 258 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert) 259 lcisnewsql = false; 260 } 261 } 262 263 if (lcisnewsql) 264 ret = new TSelectSqlStatement(this.vendor); 265 266 break; 267 } 268 269 case sstinsert: { 270 ret = new TInsertSqlStatement(this.vendor); 271 break; 272 } 273 274 case sstupdate: { 275 boolean lcisnewsql = true; 276 if (state != EFindSqlStateType.stnormal) { 277 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 278 if (lcprevsolidtoken != null) { 279 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 280 lcisnewsql = false; 281 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for) 282 lcisnewsql = false; 283 } 284 285 TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false); 286 if (lcnextsolidtoken != null) { 287 if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) { 288 int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "("); 289 if (k == 0) lcisnewsql = false; 290 } 291 } 292 } 293 294 if (lcisnewsql) { 295 ret = new TUpdateSqlStatement(this.vendor); 296 ret.dummytag = 1; // means set clause in update is not found yet 297 } 298 break; 299 } 300 301 case sstdelete: { 302 boolean lcisnewsql = true; 303 304 if (state != EFindSqlStateType.stnormal) { 305 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 306 if (lcprevsolidtoken != null) { 307 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 308 lcisnewsql = false; 309 } 310 } 311 312 if (lcisnewsql) 313 ret = new TDeleteSqlStatement(this.vendor); 314 315 break; 316 } 317 318 case sstredshiftAbort: 319 ret = new TRedshiftAbort(this.vendor); 320 ret.sqlstatementtype = gnewsqlstatementtype; 321 break; 322 323 case sstalterdatabase: 324 ret = new TAlterDatabaseStmt(this.vendor); 325 break; 326 327 case sstredshiftAlterGroup: 328 ret = new TAlterGroup(this.vendor); 329 break; 330 331 case sstredshiftAlterSchema: 332 ret = new TRedshiftAlterSchema(this.vendor); 333 break; 334 335 case sstaltertable: 336 ret = new TAlterTableStatement(this.vendor); 337 break; 338 339 case sstredshiftAlterUser: 340 ret = new TRedshiftAlterUser(this.vendor); 341 break; 342 343 case sstredshiftAnalyze: 344 ret = new TRedshiftAnalyze(this.vendor); 345 break; 346 347 case sstredshiftAnalyzeCompression: 348 ret = new TRedshiftAnalyzeCompression(this.vendor); 349 break; 350 351 case sstredshiftBegin: 352 ret = new TRedshiftBegin(this.vendor); 353 break; 354 355 case sstredshiftCancel: 356 ret = new TRedshiftCancel(this.vendor); 357 break; 358 359 case sstredshiftClose: 360 ret = new TCloseStmt(this.vendor); 361 break; 362 363 case sstredshiftComment: 364 ret = new TRedshiftComment(this.vendor); 365 break; 366 367 case sstredshiftCommit: 368 ret = new TRedshiftCommit(this.vendor); 369 break; 370 371 case sstredshiftCopy: 372 ret = new TRedshiftCopy(this.vendor); 373 break; 374 375 case sstcreatedatabase: 376 ret = new TCreateDatabaseSqlStatement(this.vendor); 377 break; 378 379 case sstredshiftCreateGroup: 380 ret = new TCreateGroup(this.vendor); 381 break; 382 383 case sstredshiftCreateSchema: 384 ret = new TCreateSchemaSqlStatement(this.vendor); 385 break; 386 387 case sstcreatetable: 388 ret = new TCreateTableSqlStatement(this.vendor); 389 break; 390 391 case sstredshiftCreateUser: 392 ret = new TRedshiftCreateUser(this.vendor); 393 break; 394 395 case sstcreateview: 396 ret = new TCreateViewSqlStatement(this.vendor); 397 break; 398 399 case sstredshiftDeallocate: 400 ret = new TRedshiftDeallocate(this.vendor); 401 break; 402 403 case sstredshiftDeclare: 404 ret = new TRedshiftDeclare(this.vendor); 405 break; 406 407 case sstredshiftDropDatabase: 408 ret = new TDropDatabaseStmt(this.vendor); 409 break; 410 411 case sstredshiftDropGroup: 412 ret = new TDropGroup(this.vendor); 413 break; 414 415 case sstredshiftDropSchema: 416 ret = new TRedshiftDropSchema(this.vendor); 417 break; 418 419 case sstdroptable: 420 ret = new TDropTableSqlStatement(this.vendor); 421 break; 422 423 case sstredshiftDropUser: 424 ret = new TRedshiftDropUser(this.vendor); 425 break; 426 427 case sstdropview: 428 ret = new TDropViewSqlStatement(this.vendor); 429 break; 430 431 case sstredshiftEnd: 432 ret = new TRedshiftEnd(this.vendor); 433 break; 434 435 case sstExecutePreparedStmt: 436 ret = new TExecuteSqlStatement(this.vendor); 437 break; 438 439 case sstExplain: 440 ret = new TExplainPlan(this.vendor); 441 break; 442 443 case sstFetchFrom: 444 ret = new TFetchFromStmt(this.vendor); 445 break; 446 447 case sstGrant: 448 ret = new TGrantStmt(this.vendor); 449 break; 450 451 case sstredshiftLock: 452 ret = new TLockTableStmt(this.vendor); 453 break; 454 455 case sstredshiftPrepare: 456 ret = new TRedshiftPrepare(this.vendor); 457 break; 458 459 case sstredshiftReset: 460 ret = new TRedshiftReset(this.vendor); 461 break; 462 463 case sstRevoke: 464 ret = new TRevokeStmt(this.vendor); 465 break; 466 467 case sstredshiftRollback: 468 ret = new TRedshiftRollback(this.vendor); 469 break; 470 471 case sstredshiftSet: 472 ret = new TSetStmt(this.vendor); 473 break; 474 475 case sstredshiftSetSessionAuthorization: 476 ret = new TRedshiftSessionAuthorization(this.vendor); 477 break; 478 479 case sstredshiftShow: 480 ret = new TShowStmt(this.vendor); 481 break; 482 483 case sstStartTransaction: 484 ret = new TStartTransactionStmt(this.vendor); 485 break; 486 487 case sstTruncate: 488 ret = new TTruncateStatement(this.vendor); 489 break; 490 491 case sstredshiftUnload: 492 ret = new TUnloadStmt(this.vendor); 493 break; 494 495 case sstredshiftVacuum: 496 ret = new TRedshiftVacuum(this.vendor); 497 break; 498 499 case sstcreatefunction: 500 ret = new TCreateFunctionStmt(this.vendor); 501 break; 502 503 case sstcreateprocedure: 504 ret = new TCreateProcedureStmt(this.vendor); 505 break; 506 507 case sstcreatematerializedview: 508 ret = new TCreateMaterializedSqlStatement(this.vendor); 509 break; 510 511 case sstcall: 512 ret = new TCallStatement(this.vendor); 513 break; 514 515 case sstmerge: 516 ret = new TMergeSqlStatement(this.vendor); 517 break; 518 519 default: 520 ret = new TUnknownSqlStatement(this.vendor); 521 ret.sqlstatementtype = gnewsqlstatementtype; 522 break; 523 } 524 525 return ret; 526 } 527}