001package gudusoft.gsqlparser.sqlcmds; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.*; 005import gudusoft.gsqlparser.stmt.netezza.*; 006 007/** 008 * Netezza SQL command resolver. 009 * Contains all Netezza-specific SQL command recognition logic. 010 * 011 * @since 3.1.0.9 012 */ 013public class TSqlCmdsNetezza extends AbstractSqlCmds { 014 015 // Temporary field for statement type during issql processing 016 private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid; 017 018 public TSqlCmdsNetezza() { 019 super(EDbVendor.dbvnetezza); 020 } 021 022 @Override 023 protected String getToken1Str(int token1) { 024 // Netezza vendor-specific reserved words 025 switch (token1) { 026 case TBaseType.rrw_netezza_copy: 027 return "copy"; 028 case TBaseType.rrw_netezza_generate: 029 return "generate"; 030 case TBaseType.rrw_netezza_groom: 031 return "groom"; 032 default: 033 return null; 034 } 035 } 036 037 @Override 038 protected void initializeCommands() { 039 // Netezza commands - longer patterns before shorter ones with same prefix 040 041 // ALTER commands 042 addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstnetezzaAlterDatabase); 043 addCmd(TBaseType.rrw_alter, "group", ESqlStatementType.sstnetezzaAlterGroup); 044 addCmd(TBaseType.rrw_alter, "history", ESqlStatementType.sstnetezzaAlterHistoryConfiguration); 045 addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstAlterSchema); 046 addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstnetezzaAlterSequence); 047 addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstaltersession); 048 addCmd(TBaseType.rrw_alter, "synonym", ESqlStatementType.sstAlterSynonym); 049 addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstnetezzaAlterTable); 050 addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstnetezzaAlterUser); 051 addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstnetezzaAlterView); 052 addCmd(TBaseType.rrw_alter, "views", ESqlStatementType.sstnetezzaAlterView); 053 054 // BEGIN 055 addCmd(TBaseType.rrw_begin, ESqlStatementType.sstnetezzaBegin); 056 057 // CALL - longer patterns first 058 addCmd(TBaseType.rrw_call, "procedure", ESqlStatementType.sstcall); 059 addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall); 060 061 // COMMENT 062 addCmd(TBaseType.rrw_comment, ESqlStatementType.sstnetezzaComment); 063 064 // COMMIT 065 addCmd(TBaseType.rrw_commit, ESqlStatementType.sstnetezzaCommit); 066 067 // COPY (vendor-specific token) 068 addCmd(TBaseType.rrw_netezza_copy, ESqlStatementType.sstnetezzaCopy); 069 070 // CREATE commands - longer patterns first 071 addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview); 072 addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure); 073 addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview); 074 addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase); 075 addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstnetezzaCreateExternalTable); 076 addCmd(TBaseType.rrw_create, "group", ESqlStatementType.sstnetezzaCreateGruop); 077 addCmd(TBaseType.rrw_create, "history", "configuration", ESqlStatementType.sstnetezzaCreateHistoryConfiguration); 078 addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview); 079 addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure); 080 addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstcreatesequence); 081 addCmd(TBaseType.rrw_create, "synonym", ESqlStatementType.sstcreatesynonym); 082 addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable); 083 addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable); 084 addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable); 085 addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstnetezzaCreateUser); 086 addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview); 087 088 // DELETE 089 addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete); 090 091 // DROP commands - longer patterns first 092 addCmd(TBaseType.rrw_drop, "connection", ESqlStatementType.sstnetezzaDropConnection); 093 addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase); 094 addCmd(TBaseType.rrw_drop, "group", ESqlStatementType.sstnetezzaDropGroup); 095 addCmd(TBaseType.rrw_drop, "history", "configuration", ESqlStatementType.sstnetezzaDropHistoryConfiguration); 096 addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure); 097 addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstnetezzaDropSchema); 098 addCmd(TBaseType.rrw_drop, "sequence", ESqlStatementType.sstnetezzaDropSequence); 099 addCmd(TBaseType.rrw_drop, "session", ESqlStatementType.sstnetezzaDropSession); 100 addCmd(TBaseType.rrw_drop, "synonym", ESqlStatementType.sstdropsynonym); 101 addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstnetezzaDropTable); 102 addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstnetezzaDropUser); 103 addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstnetezzaDropView); 104 105 // EXEC/EXECUTE - longer patterns first 106 addCmd(TBaseType.rrw_exec, "procedure", ESqlStatementType.sstexecutestmt); 107 addCmd(TBaseType.rrw_execute, "procedure", ESqlStatementType.sstexecutestmt); 108 addCmd(TBaseType.rrw_exec, ESqlStatementType.sstexecutestmt); 109 addCmd(TBaseType.rrw_execute, ESqlStatementType.sstexecutestmt); 110 111 // EXPLAIN 112 addCmd(TBaseType.rrw_explain, ESqlStatementType.sstExplain); 113 114 // GENERATE commands (vendor-specific token) - longer patterns first 115 addCmd(TBaseType.rrw_netezza_generate, "express", "statistics", ESqlStatementType.sstnetezzaGenerateStatistics); 116 addCmd(TBaseType.rrw_netezza_generate, "statistics", ESqlStatementType.sstnetezzaGenerateStatistics); 117 118 // GRANT 119 addCmd(TBaseType.rrw_grant, ESqlStatementType.sstnetezzaGrant); 120 121 // GROOM commands (vendor-specific token) 122 addCmd(TBaseType.rrw_netezza_groom, "table", ESqlStatementType.sstnetezzaGroomTable); 123 124 // INSERT 125 addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert); 126 127 // LOCK 128 addCmd(TBaseType.rrw_lock, "table", ESqlStatementType.sstlocktable); 129 130 // MERGE 131 addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge); 132 133 // RESET 134 addCmd(TBaseType.rrw_reset, ESqlStatementType.sstnetezzaReset); 135 136 // REVOKE 137 addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstnetezzaRevoke); 138 139 // ROLLBACK 140 addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstnetezzaRollback); 141 142 // SELECT 143 addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect); 144 145 // SET commands - longer patterns first 146 addCmd(TBaseType.rrw_set, "catalog", ESqlStatementType.sstSetCatalog); 147 addCmd(TBaseType.rrw_set, "schema", ESqlStatementType.sstSetSchema); 148 addCmd(TBaseType.rrw_set, ESqlStatementType.sstnetezzaSet); 149 150 // SHOW 151 addCmd(TBaseType.rrw_show, ESqlStatementType.sstnetezzaShow); 152 153 // TRUNCATE 154 addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstTruncate); 155 156 // UPDATE 157 addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate); 158 } 159 160 @Override 161 public TCustomSqlStatement issql(TSourceToken token, EFindSqlStateType state, TCustomSqlStatement currentStatement) { 162 TCustomSqlStatement ret = null; 163 164 gnewsqlstatementtype = ESqlStatementType.sstinvalid; 165 166 // Skip whitespace, comments, semicolons 167 if ((token.tokencode == TBaseType.cmtdoublehyphen) 168 || (token.tokencode == TBaseType.cmtslashstar) 169 || (token.tokencode == TBaseType.lexspace) 170 || (token.tokencode == TBaseType.lexnewline) 171 || (token.tokentype == ETokenType.ttsemicolon)) { 172 return null; 173 } 174 175 int lcpos = token.posinlist; 176 TSourceTokenList lcsourcetokenlist = token.container; 177 TCustomSqlStatement lccurrentsqlstatement = currentStatement; 178 179 // Subquery after semicolon or at first line 180 if ((state == EFindSqlStateType.stnormal) && (token.tokentype == ETokenType.ttleftparenthesis)) { 181 int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "("); 182 if (k > 0) { 183 ret = new TSelectSqlStatement(this.vendor); 184 } 185 186 k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_with, 1, "("); 187 if (k > 0) { 188 ret = new TSelectSqlStatement(this.vendor); 189 } 190 191 return ret; 192 } 193 194 // CTE 195 if ((state == EFindSqlStateType.stnormal) && (token.tokencode == TBaseType.rrw_with)) { 196 ret = findcte(token); 197 if ((ret != null)) return ret; 198 } 199 200 gnewsqlstatementtype = getStatementTypeForToken(token); 201 202 TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 203 204 switch (gnewsqlstatementtype) { 205 case sstinvalid: { 206 ret = null; 207 if (state == EFindSqlStateType.stnormal) { 208 } 209 break; 210 } 211 case sstselect: { 212 boolean lcisnewsql = true; 213 214 if (state != EFindSqlStateType.stnormal) { 215 if ((lcprevsolidtoken != null)) { 216 if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis) 217 lcisnewsql = false; // subquery 218 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union) 219 lcisnewsql = false; 220 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect) 221 lcisnewsql = false; 222 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus) 223 lcisnewsql = false; 224 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except) 225 lcisnewsql = false; 226 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return) 227 lcisnewsql = false; 228 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) { 229 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable) 230 lcisnewsql = false; 231 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview) 232 lcisnewsql = false; 233 } 234 235 if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) { 236 TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist); 237 if ((lcpprevsolidtoken != null)) { 238 if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union) 239 lcisnewsql = false; 240 } 241 } 242 } 243 244 if ((lccurrentsqlstatement != null)) { 245 if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert) 246 lcisnewsql = false; 247 } 248 } 249 250 if (lcisnewsql) 251 ret = new TSelectSqlStatement(this.vendor); 252 253 break; 254 } 255 case sstinsert: { 256 boolean lcisnewsql = true; 257 if (state != EFindSqlStateType.stnormal) { 258 if ((lccurrentsqlstatement != null)) { 259 } 260 } 261 262 if (lcisnewsql) 263 ret = new TInsertSqlStatement(this.vendor); 264 265 break; 266 } 267 case sstupdate: { 268 boolean lcisnewsql = true; 269 if (state != EFindSqlStateType.stnormal) { 270 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 271 if ((lcprevsolidtoken != null)) { 272 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 273 lcisnewsql = false; 274 else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for) 275 lcisnewsql = false; 276 } 277 278 TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false); 279 if ((lcnextsolidtoken != null)) { 280 if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) { 281 int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "("); 282 if (k == 0) lcisnewsql = false; 283 } 284 } 285 286 if ((lccurrentsqlstatement != null)) { 287 } 288 } 289 290 if (lcisnewsql) { 291 ret = new TUpdateSqlStatement(this.vendor); 292 ret.dummytag = 1; // means set clause in update is not found yet 293 } 294 break; 295 } 296 case sstdelete: { 297 boolean lcisnewsql = true; 298 299 if (state != EFindSqlStateType.stnormal) { 300 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 301 if ((lcprevsolidtoken != null)) { 302 if (lcprevsolidtoken.tokencode == TBaseType.rrw_on) 303 lcisnewsql = false; 304 } 305 306 if ((lccurrentsqlstatement != null)) { 307 } 308 } 309 310 if (lcisnewsql) 311 ret = new TDeleteSqlStatement(this.vendor); 312 313 break; 314 } 315 case sstTruncate: { 316 ret = new TTruncateStatement(this.vendor); 317 ret.sqlstatementtype = gnewsqlstatementtype; 318 break; 319 } 320 case sstcreatetable: 321 case sstnetezzaCreateExternalTable: { 322 ret = new TCreateTableSqlStatement(this.vendor); 323 break; 324 } 325 case sstcreateview: { 326 ret = new TCreateViewSqlStatement(this.vendor); 327 break; 328 } 329 case sstcreatematerializedview: { 330 ret = new TCreateMaterializedSqlStatement(this.vendor); 331 break; 332 } 333 case sstcreatedatabase: { 334 ret = new TCreateDatabaseSqlStatement(this.vendor); 335 break; 336 } 337 case sstdroptable: { 338 ret = new TDropTableSqlStatement(this.vendor); 339 break; 340 } 341 case sstdropview: { 342 ret = new TDropViewSqlStatement(this.vendor); 343 break; 344 } 345 case sstaltertable: { 346 ret = new TAlterTableStatement(this.vendor); 347 break; 348 } 349 case sstaltersession: { 350 ret = new TAlterSessionStatement(this.vendor); 351 break; 352 } 353 case sstnetezzaGroomTable: { 354 ret = new TNetezzaGroomTable(this.vendor); 355 break; 356 } 357 case sstnetezzaGenerateStatistics: { 358 ret = new TNetezzaGenerateStatistics(this.vendor); 359 break; 360 } 361 case sstnetezzaAlterTable: { 362 ret = new TAlterTableStatement(this.vendor); 363 break; 364 } 365 case sstnetezzaDropSchema: { 366 ret = new TDropSchemaSqlStatement(this.vendor); 367 break; 368 } 369 case sstnetezzaCreateUser: { 370 ret = new TCreateUserStmt(this.vendor); 371 break; 372 } 373 case sstnetezzaAlterView: { 374 ret = new TAlterViewStatement(this.vendor); 375 break; 376 } 377 case sstnetezzaAlterDatabase: { 378 ret = new TAlterDatabaseStmt(this.vendor); 379 break; 380 } 381 case sstAlterSchema: { 382 ret = new TAlterSchemaStmt(this.vendor); 383 break; 384 } 385 case sstAlterSynonym: { 386 ret = new TAlterSynonymStmt(this.vendor); 387 break; 388 } 389 case sstnetezzaDropTable: { 390 ret = new TDropTableSqlStatement(this.vendor); 391 break; 392 } 393 case sstnetezzaDropView: { 394 ret = new TDropViewSqlStatement(this.vendor); 395 break; 396 } 397 case sstmerge: { 398 ret = new TMergeSqlStatement(this.vendor); 399 break; 400 } 401 case sstdropprocedure: { 402 ret = new TDropProcedureStmt(this.vendor); 403 break; 404 } 405 case sstdropsynonym: 406 ret = new TDropSynonymStmt(this.vendor); 407 break; 408 case sstdropdatabase: 409 ret = new TDropDatabaseStmt(this.vendor); 410 break; 411 case sstcall: 412 ret = new TCallStatement(this.vendor); 413 break; 414 case sstcreatesynonym: 415 ret = new TCreateSynonymStmt(this.vendor); 416 break; 417 case sstcreatesequence: 418 ret = new TCreateSequenceStmt(this.vendor); 419 break; 420 case sstnetezzaDropSequence: 421 ret = new TDropSequenceStmt(this.vendor); 422 break; 423 case sstnetezzaGrant: 424 ret = new TGrantStmt(this.vendor); 425 break; 426 case sstexecutestmt: 427 ret = new TExecuteSqlStatement(this.vendor); 428 break; 429 case sstlocktable: 430 ret = new TLockTableStmt(this.vendor); 431 break; 432 case sstnetezzaComment: 433 ret = new TCommentOnSqlStmt(this.vendor); 434 break; 435 case sstcreateprocedure: 436 ret = new TCreateProcedureStmt(this.vendor); 437 break; 438 case sstnetezzaCopy: 439 ret = new TCopyStmt(this.vendor); 440 break; 441 case sstExplain: 442 ret = new TExplainPlan(this.vendor); 443 break; 444 case sstSetCatalog: 445 ret = new TSetCatalogStmt(this.vendor); 446 break; 447 case sstSetSchema: 448 ret = new TSetSchemaStmt(this.vendor); 449 break; 450 case sstnetezzaCommit: 451 case sstnetezzaRollback: 452 case sstnetezzaRevoke: 453 default: { 454 ret = new TUnknownSqlStatement(this.vendor); 455 ret.sqlstatementtype = gnewsqlstatementtype; 456 break; 457 } 458 } 459 460 return ret; 461 } 462}