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