001package gudusoft.gsqlparser.sqlcmds; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.*; 005import gudusoft.gsqlparser.stmt.presto.*; 006 007/** 008 * Presto SQL command resolver. 009 * Contains all Presto-specific SQL command recognition logic. 010 * 011 * @since 3.1.0.9 012 */ 013public class TSqlCmdsPresto extends AbstractSqlCmds { 014 015 // Temporary field for statement type during issql processing 016 private ESqlStatementType gnewsqlstatementtype = ESqlStatementType.sstinvalid; 017 018 public TSqlCmdsPresto() { 019 super(EDbVendor.dbvpresto); 020 } 021 022 @Override 023 protected String getToken1Str(int token1) { 024 // Presto vendor-specific tokens 025 switch (token1) { 026 case TBaseType.rrw_presto_verbose: 027 return "verbose"; 028 default: 029 return null; 030 } 031 } 032 033 @Override 034 protected void initializeCommands() { 035 // Presto commands - longer patterns BEFORE shorter patterns 036 addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstalterfunction); 037 addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstAlterSchema); 038 addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable); 039 040 addCmd(TBaseType.rrw_analyze, ESqlStatementType.sstAnalyzeTable); 041 042 addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall); 043 addCmd(TBaseType.rrw_commit, ESqlStatementType.sstcommit); 044 045 // CREATE FUNCTION variants - longer patterns first 046 addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction); 047 addCmd(TBaseType.rrw_create, "temporary", "function", ESqlStatementType.sstcreatefunction); 048 addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction); 049 050 addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstcreaterole); 051 addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstcreateschema); 052 addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable); 053 addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview); 054 055 addCmd(TBaseType.rrw_deallocate, "prepare", ESqlStatementType.sstpostgresqlDeallocate); 056 057 addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete); 058 addCmd(TBaseType.rrw_describe, ESqlStatementType.sstdescribe); 059 060 addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstdropfunction); 061 addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstdroprole); 062 addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstdropschema); 063 addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable); 064 addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview); 065 066 addCmd(TBaseType.rrw_execute, ESqlStatementType.sstExecute); 067 addCmd(TBaseType.rrw_explain, ESqlStatementType.sstExplain); 068 069 addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant); 070 071 addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert); 072 073 addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge); 074 075 addCmd(TBaseType.rrw_prepare, ESqlStatementType.sstprepare); 076 077 addCmd(TBaseType.rrw_reset, "session", ESqlStatementType.sstResetSession); 078 079 addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke); 080 addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstrollback); 081 082 addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect); 083 084 addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstset); 085 addCmd(TBaseType.rrw_set, "session", ESqlStatementType.sstset); 086 087 // SHOW commands - longer patterns first 088 addCmd(TBaseType.rrw_show, "create", "function", ESqlStatementType.sstShow); 089 addCmd(TBaseType.rrw_show, "create", "table", ESqlStatementType.sstShow); 090 addCmd(TBaseType.rrw_show, "create", "view", ESqlStatementType.sstShow); 091 addCmd(TBaseType.rrw_show, "current", "roles", ESqlStatementType.sstShow); 092 addCmd(TBaseType.rrw_show, "role", "grants", ESqlStatementType.sstShow); 093 addCmd(TBaseType.rrw_show, "catalogs", ESqlStatementType.sstShow); 094 addCmd(TBaseType.rrw_show, "columns", ESqlStatementType.sstShow); 095 addCmd(TBaseType.rrw_show, "functions", ESqlStatementType.sstShow); 096 addCmd(TBaseType.rrw_show, "grants", ESqlStatementType.sstShow); 097 addCmd(TBaseType.rrw_show, "roles", ESqlStatementType.sstShow); 098 addCmd(TBaseType.rrw_show, "schemas", ESqlStatementType.sstShow); 099 addCmd(TBaseType.rrw_show, "session", ESqlStatementType.sstShow); 100 addCmd(TBaseType.rrw_show, "stats", ESqlStatementType.sstShow); 101 addCmd(TBaseType.rrw_show, "tables", ESqlStatementType.sstShow); 102 103 addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction); 104 105 addCmd(TBaseType.rrw_use, ESqlStatementType.sstUse); 106 addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues); 107 } 108 109 @Override 110 public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement ){ 111 112 TCustomSqlStatement ret = null; 113 int k; 114 boolean lcisnewsql; 115 TSourceToken lcpprevsolidtoken,lcnextsolidtoken; 116 117 gnewsqlstatementtype = ESqlStatementType.sstinvalid; 118 119 if ( (pcst.tokencode == TBaseType.cmtdoublehyphen) 120 || (pcst.tokencode == TBaseType.cmtslashstar) 121 || (pcst.tokencode == TBaseType.lexspace) 122 || (pcst.tokencode == TBaseType.lexnewline) 123 || (pcst.tokentype == ETokenType.ttsemicolon) ) 124 { 125 return ret; 126 } 127 128 int lcpos = pcst.posinlist; 129 TSourceTokenList lcsourcetokenlist = pcst.container; 130 TCustomSqlStatement lccurrentsqlstatement = psqlstatement; 131 132 //subquery after semicolon || at first line 133 if ( (pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis) ) // ( 134 { 135 k = lcsourcetokenlist.solidtokenafterpos(lcpos,TBaseType.rrw_select,1,"("); 136 if ( k >0 ) 137 { 138 ret = new TSelectSqlStatement(this.vendor); 139 } 140 141 return ret; 142 } 143 144 //cte 145 if ( (pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with) ) 146 { 147 ret = findcte(pcst); 148 if ( (ret != null) ) return ret; 149 } 150 151 152 gnewsqlstatementtype = getStatementTypeForToken(pcst); 153 154 TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 155 156 if ((gnewsqlstatementtype == ESqlStatementType.sstinvalid)&&(pcst.tokencode == TBaseType.rrw_create)){ 157 //if (pcst.container.nextsolidtoken(pcst.posinlist,15,)) 158 TSourceToken viewToken = pcst.container.searchToken(TBaseType.rrw_view,"",pcst,15); 159 if (viewToken != null){ 160 gnewsqlstatementtype = ESqlStatementType.sstcreateview; 161 } 162 } 163 switch (gnewsqlstatementtype){ 164 case sstinvalid: 165 { 166 ret = null; 167 break; 168 } 169 case sstselect: 170 { 171 lcisnewsql = true; 172 173 if ( pstate != EFindSqlStateType.stnormal ) 174 { 175 // lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 176 if ( TBaseType.assigned(lcprevsolidtoken) ) 177 { 178 if ( lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis) 179 lcisnewsql = false; //subqery 180 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_union ) 181 lcisnewsql = false; 182 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_intersect ) 183 lcisnewsql = false; 184 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_minus ) 185 lcisnewsql = false; 186 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_except ) 187 lcisnewsql = false; 188 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_return ) 189 lcisnewsql = false; 190 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_as ) 191 { 192 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable ) 193 lcisnewsql = false; 194 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview ) 195 lcisnewsql = false; 196 } 197 198 if ( lcisnewsql && ( lcprevsolidtoken.tokencode == TBaseType.rrw_all) ) 199 { 200 lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist); 201 if ( TBaseType.assigned(lcpprevsolidtoken) ) 202 { 203 if ( lcpprevsolidtoken.tokencode == TBaseType.rrw_union ) 204 lcisnewsql = false; 205 } 206 } 207 208 } 209 210 211 if ( TBaseType.assigned(lccurrentsqlstatement) ) 212 { 213 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert ) 214 lcisnewsql = false; 215 } 216 217 } 218 219 if ( lcisnewsql ) 220 ret = new TSelectSqlStatement(this.vendor); 221 break; 222 } 223 case sstinsert: 224 { 225 lcisnewsql = true; 226 if ( pstate != EFindSqlStateType.stnormal ) 227 { 228 if ( TBaseType.assigned(lccurrentsqlstatement) ) 229 { 230 // MERGE ... WHEN NOT MATCHED THEN INSERT must stay inside the merge statement 231 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge ) 232 lcisnewsql = false; 233 } 234 } 235 236 if ( lcisnewsql ) { 237 ret = new TInsertSqlStatement(this.vendor); 238 ret.sqlstatementtype = gnewsqlstatementtype; 239 } 240 break; 241 } 242 case sstmerge: 243 { 244 ret = new TMergeSqlStatement(this.vendor); 245 break; 246 } 247 case sstdelete: 248 { 249 lcisnewsql = true; 250 251 if ( pstate != EFindSqlStateType.stnormal ) 252 { 253 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 254 if ( TBaseType.assigned(lcprevsolidtoken) ) 255 { 256 if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on ) 257 lcisnewsql = false; 258 } 259 260 if ( TBaseType.assigned(lccurrentsqlstatement) ) 261 { 262 // MERGE ... WHEN MATCHED THEN DELETE must stay inside the merge statement 263 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge ) 264 lcisnewsql = false; 265 } 266 } 267 268 if ( lcisnewsql ) 269 ret = new TDeleteSqlStatement(this.vendor); 270 break; 271 } 272 case sstaltertable: 273 { 274 ret = new TAlterTableStatement(this.vendor); 275 break; 276 } 277 case sstalterfunction: 278 { 279 ret = new TAlterFunctionStmt(this.vendor); 280 break; 281 } 282 case sstAlterSchema: 283 { 284 ret = new TAlterSchemaStmt(this.vendor); 285 break; 286 } 287 case sstanalyzeTable: 288 { 289 ret = new TAnalyzeStmt(this.vendor); 290 break; 291 } 292 case sstcall: 293 { 294 ret = new TCallStatement(this.vendor); 295 break; 296 } 297 case sstcommit: 298 { 299 ret = new TCommitStmt(this.vendor); 300 break; 301 } 302 case sstcreatefunction: 303 { 304 ret = new TCreateFunctionStmt(this.vendor); 305 break; 306 } 307 case sstcreaterole: 308 { 309 ret = new TCreateRoleStmt(this.vendor); 310 break; 311 } 312 case sstcreateschema: 313 { 314 ret = new TCreateSchemaSqlStatement(this.vendor); 315 break; 316 } 317 case sstcreatetable: 318 { 319 ret = new TCreateTableSqlStatement(this.vendor); 320 break; 321 } 322 case sstcreateview: 323 { 324 ret = new TCreateViewSqlStatement(this.vendor); 325 break; 326 } 327 case sstpostgresqlDeallocate: 328 { 329 ret = new TUnknownSqlStatement(this.vendor); 330 ret.sqlstatementtype = gnewsqlstatementtype; 331 break; 332 } 333 case sstdescribe: 334 { 335 ret = new TDescribeStmt(this.vendor); 336 break; 337 } 338 case sstdropfunction: 339 { 340 ret = new TDropFunctionStmt(this.vendor); 341 break; 342 } 343 case sstdroprole: 344 { 345 ret = new TDropRoleStmt(this.vendor); 346 break; 347 } 348 case sstdropschema: 349 { 350 ret = new TDropSchemaSqlStatement(this.vendor); 351 break; 352 } 353 case sstdroptable: 354 { 355 ret = new TDropTableSqlStatement(this.vendor); 356 break; 357 } 358 case sstdropview: 359 { 360 ret = new TDropViewSqlStatement(this.vendor); 361 break; 362 } 363 case sstExecute: 364 { 365 ret = new TExecuteSqlStatement(this.vendor); 366 break; 367 } 368 case sstExplain: 369 { 370 ret = new TExplainPlan(this.vendor); 371 break; 372 } 373 case sstGrant: 374 { 375 ret = new TGrantStmt(this.vendor); 376 break; 377 } 378 case sstprepare: 379 { 380 ret = new TPrepareStmt(this.vendor); 381 break; 382 } 383 case sstset: 384 case sstReset: 385 { 386 lcisnewsql = true; 387 if ( pstate != EFindSqlStateType.stnormal ) 388 { 389 if ( TBaseType.assigned(lccurrentsqlstatement) ) 390 { 391 lcisnewsql = false; 392 } 393 } 394 395 if ( lcisnewsql ) 396 { 397 ret = new TSetStmt(this.vendor); 398 } 399 break; 400 } 401 case sstShow: 402 { 403 ret = new TShowStmt(this.vendor); 404 ret.sqlstatementtype = gnewsqlstatementtype; 405 break; 406 } 407 case sstStartTransaction: 408 { 409 ret = new TStartTransactionStmt(this.vendor); 410 break; 411 } 412 case sstUse: 413 { 414 ret = new TUseDatabase(this.vendor); 415 break; 416 } 417 case sstValues: 418 { 419 if ( (pstate != EFindSqlStateType.stnormal) 420 && TBaseType.assigned(lccurrentsqlstatement) 421 && (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) ) 422 { 423 // VALUES of MERGE ... WHEN NOT MATCHED THEN INSERT ... VALUES (...) 424 break; 425 } 426 ret = new TSelectSqlStatement(this.vendor); 427 break; 428 } 429 case sstResetSession: 430 { 431 ret = new TResetSessionStmt(this.vendor); 432 break; 433 } 434 default: 435 { 436 ret = new TUnknownSqlStatement(this.vendor); 437 ret.sqlstatementtype = gnewsqlstatementtype; 438 break; 439 } 440 } // case 441 442 return ret; 443 444 } 445}