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 addCmd(TBaseType.rrw_table, ESqlStatementType.sstselect); // TABLE t = SELECT * FROM t 084 085 addCmd(TBaseType.rrw_set, "role", ESqlStatementType.sstset); 086 addCmd(TBaseType.rrw_set, "session", ESqlStatementType.sstset); 087 088 // SHOW commands - longer patterns first 089 addCmd(TBaseType.rrw_show, "create", "function", ESqlStatementType.sstShow); 090 addCmd(TBaseType.rrw_show, "create", "table", ESqlStatementType.sstShow); 091 addCmd(TBaseType.rrw_show, "create", "view", ESqlStatementType.sstShow); 092 addCmd(TBaseType.rrw_show, "current", "roles", ESqlStatementType.sstShow); 093 addCmd(TBaseType.rrw_show, "role", "grants", ESqlStatementType.sstShow); 094 addCmd(TBaseType.rrw_show, "catalogs", ESqlStatementType.sstShow); 095 addCmd(TBaseType.rrw_show, "columns", ESqlStatementType.sstShow); 096 addCmd(TBaseType.rrw_show, "functions", ESqlStatementType.sstShow); 097 addCmd(TBaseType.rrw_show, "grants", ESqlStatementType.sstShow); 098 addCmd(TBaseType.rrw_show, "roles", ESqlStatementType.sstShow); 099 addCmd(TBaseType.rrw_show, "schemas", ESqlStatementType.sstShow); 100 addCmd(TBaseType.rrw_show, "session", ESqlStatementType.sstShow); 101 addCmd(TBaseType.rrw_show, "stats", ESqlStatementType.sstShow); 102 addCmd(TBaseType.rrw_show, "tables", ESqlStatementType.sstShow); 103 104 addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstStartTransaction); 105 106 addCmd(TBaseType.rrw_use, ESqlStatementType.sstUse); 107 addCmd(TBaseType.rrw_values, ESqlStatementType.sstValues); 108 } 109 110 @Override 111 public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement ){ 112 113 TCustomSqlStatement ret = null; 114 int k; 115 boolean lcisnewsql; 116 TSourceToken lcpprevsolidtoken,lcnextsolidtoken; 117 118 gnewsqlstatementtype = ESqlStatementType.sstinvalid; 119 120 if ( (pcst.tokencode == TBaseType.cmtdoublehyphen) 121 || (pcst.tokencode == TBaseType.cmtslashstar) 122 || (pcst.tokencode == TBaseType.lexspace) 123 || (pcst.tokencode == TBaseType.lexnewline) 124 || (pcst.tokentype == ETokenType.ttsemicolon) ) 125 { 126 return ret; 127 } 128 129 int lcpos = pcst.posinlist; 130 TSourceTokenList lcsourcetokenlist = pcst.container; 131 TCustomSqlStatement lccurrentsqlstatement = psqlstatement; 132 133 //subquery after semicolon || at first line 134 if ( (pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis) ) // ( 135 { 136 k = lcsourcetokenlist.solidtokenafterpos(lcpos,TBaseType.rrw_select,1,"("); 137 if ( k >0 ) 138 { 139 ret = new TSelectSqlStatement(this.vendor); 140 } 141 142 return ret; 143 } 144 145 //cte 146 if ( (pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with) ) 147 { 148 ret = findcte(pcst); 149 if ( (ret != null) ) return ret; 150 } 151 152 153 gnewsqlstatementtype = getStatementTypeForToken(pcst); 154 155 TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 156 157 if ((gnewsqlstatementtype == ESqlStatementType.sstinvalid)&&(pcst.tokencode == TBaseType.rrw_create)){ 158 //if (pcst.container.nextsolidtoken(pcst.posinlist,15,)) 159 TSourceToken viewToken = pcst.container.searchToken(TBaseType.rrw_view,"",pcst,15); 160 if (viewToken != null){ 161 gnewsqlstatementtype = ESqlStatementType.sstcreateview; 162 } 163 } 164 switch (gnewsqlstatementtype){ 165 case sstinvalid: 166 { 167 ret = null; 168 break; 169 } 170 case sstselect: 171 { 172 lcisnewsql = true; 173 174 if ( pstate != EFindSqlStateType.stnormal ) 175 { 176 // lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 177 if ( TBaseType.assigned(lcprevsolidtoken) ) 178 { 179 if ( lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis) 180 lcisnewsql = false; //subqery 181 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_union ) 182 lcisnewsql = false; 183 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_intersect ) 184 lcisnewsql = false; 185 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_minus ) 186 lcisnewsql = false; 187 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_except ) 188 lcisnewsql = false; 189 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_return ) 190 lcisnewsql = false; 191 else if ( lcprevsolidtoken.tokencode == TBaseType.rrw_as ) 192 { 193 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable ) 194 lcisnewsql = false; 195 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview ) 196 lcisnewsql = false; 197 } 198 199 if ( lcisnewsql && ( lcprevsolidtoken.tokencode == TBaseType.rrw_all) ) 200 { 201 lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist); 202 if ( TBaseType.assigned(lcpprevsolidtoken) ) 203 { 204 if ( lcpprevsolidtoken.tokencode == TBaseType.rrw_union ) 205 lcisnewsql = false; 206 } 207 } 208 209 } 210 211 212 if ( TBaseType.assigned(lccurrentsqlstatement) ) 213 { 214 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert ) 215 lcisnewsql = false; 216 } 217 218 } 219 220 if ( lcisnewsql ) 221 ret = new TSelectSqlStatement(this.vendor); 222 break; 223 } 224 case sstinsert: 225 { 226 lcisnewsql = true; 227 if ( pstate != EFindSqlStateType.stnormal ) 228 { 229 if ( TBaseType.assigned(lccurrentsqlstatement) ) 230 { 231 // MERGE ... WHEN NOT MATCHED THEN INSERT must stay inside the merge statement 232 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge ) 233 lcisnewsql = false; 234 } 235 } 236 237 if ( lcisnewsql ) { 238 ret = new TInsertSqlStatement(this.vendor); 239 ret.sqlstatementtype = gnewsqlstatementtype; 240 } 241 break; 242 } 243 case sstmerge: 244 { 245 ret = new TMergeSqlStatement(this.vendor); 246 break; 247 } 248 case sstdelete: 249 { 250 lcisnewsql = true; 251 252 if ( pstate != EFindSqlStateType.stnormal ) 253 { 254 lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos); 255 if ( TBaseType.assigned(lcprevsolidtoken) ) 256 { 257 if ( lcprevsolidtoken.tokencode == TBaseType.rrw_on ) 258 lcisnewsql = false; 259 } 260 261 if ( TBaseType.assigned(lccurrentsqlstatement) ) 262 { 263 // MERGE ... WHEN MATCHED THEN DELETE must stay inside the merge statement 264 if ( lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge ) 265 lcisnewsql = false; 266 } 267 } 268 269 if ( lcisnewsql ) 270 ret = new TDeleteSqlStatement(this.vendor); 271 break; 272 } 273 case sstaltertable: 274 { 275 ret = new TAlterTableStatement(this.vendor); 276 break; 277 } 278 case sstalterfunction: 279 { 280 ret = new TAlterFunctionStmt(this.vendor); 281 break; 282 } 283 case sstAlterSchema: 284 { 285 ret = new TAlterSchemaStmt(this.vendor); 286 break; 287 } 288 case sstanalyzeTable: 289 { 290 ret = new TAnalyzeStmt(this.vendor); 291 break; 292 } 293 case sstcall: 294 { 295 ret = new TCallStatement(this.vendor); 296 break; 297 } 298 case sstcommit: 299 { 300 ret = new TCommitStmt(this.vendor); 301 break; 302 } 303 case sstcreatefunction: 304 { 305 ret = new TCreateFunctionStmt(this.vendor); 306 break; 307 } 308 case sstcreaterole: 309 { 310 ret = new TCreateRoleStmt(this.vendor); 311 break; 312 } 313 case sstcreateschema: 314 { 315 ret = new TCreateSchemaSqlStatement(this.vendor); 316 break; 317 } 318 case sstcreatetable: 319 { 320 ret = new TCreateTableSqlStatement(this.vendor); 321 break; 322 } 323 case sstcreateview: 324 { 325 ret = new TCreateViewSqlStatement(this.vendor); 326 break; 327 } 328 case sstpostgresqlDeallocate: 329 { 330 ret = new TUnknownSqlStatement(this.vendor); 331 ret.sqlstatementtype = gnewsqlstatementtype; 332 break; 333 } 334 case sstdescribe: 335 { 336 ret = new TDescribeStmt(this.vendor); 337 break; 338 } 339 case sstdropfunction: 340 { 341 ret = new TDropFunctionStmt(this.vendor); 342 break; 343 } 344 case sstdroprole: 345 { 346 ret = new TDropRoleStmt(this.vendor); 347 break; 348 } 349 case sstdropschema: 350 { 351 ret = new TDropSchemaSqlStatement(this.vendor); 352 break; 353 } 354 case sstdroptable: 355 { 356 ret = new TDropTableSqlStatement(this.vendor); 357 break; 358 } 359 case sstdropview: 360 { 361 ret = new TDropViewSqlStatement(this.vendor); 362 break; 363 } 364 case sstExecute: 365 { 366 ret = new TExecuteSqlStatement(this.vendor); 367 break; 368 } 369 case sstExplain: 370 { 371 ret = new TExplainPlan(this.vendor); 372 break; 373 } 374 case sstGrant: 375 { 376 ret = new TGrantStmt(this.vendor); 377 break; 378 } 379 case sstprepare: 380 { 381 ret = new TPrepareStmt(this.vendor); 382 break; 383 } 384 case sstset: 385 case sstReset: 386 { 387 lcisnewsql = true; 388 if ( pstate != EFindSqlStateType.stnormal ) 389 { 390 if ( TBaseType.assigned(lccurrentsqlstatement) ) 391 { 392 lcisnewsql = false; 393 } 394 } 395 396 if ( lcisnewsql ) 397 { 398 ret = new TSetStmt(this.vendor); 399 } 400 break; 401 } 402 case sstShow: 403 { 404 ret = new TShowStmt(this.vendor); 405 ret.sqlstatementtype = gnewsqlstatementtype; 406 break; 407 } 408 case sstStartTransaction: 409 { 410 ret = new TStartTransactionStmt(this.vendor); 411 break; 412 } 413 case sstUse: 414 { 415 ret = new TUseDatabase(this.vendor); 416 break; 417 } 418 case sstValues: 419 { 420 if ( (pstate != EFindSqlStateType.stnormal) 421 && TBaseType.assigned(lccurrentsqlstatement) 422 && (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstmerge) ) 423 { 424 // VALUES of MERGE ... WHEN NOT MATCHED THEN INSERT ... VALUES (...) 425 break; 426 } 427 ret = new TSelectSqlStatement(this.vendor); 428 break; 429 } 430 case sstResetSession: 431 { 432 ret = new TResetSessionStmt(this.vendor); 433 break; 434 } 435 default: 436 { 437 ret = new TUnknownSqlStatement(this.vendor); 438 ret.sqlstatementtype = gnewsqlstatementtype; 439 break; 440 } 441 } // case 442 443 return ret; 444 445 } 446}