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}