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}