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