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}