001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.snowflake.*;
006import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateFunction;
007import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreatePackage;
008import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateProcedure;
009
010/**
011 * Snowflake SQL command resolver.
012 * Extracted from monolithic TSqlCmds for lazy loading.
013 *
014 * @since 3.1.0.9
015 */
016public class TSqlCmdsSnowflake extends AbstractSqlCmds {
017
018    public TSqlCmdsSnowflake() {
019        super(EDbVendor.dbvsnowflake);
020    }
021
022    @Override
023    protected void initializeCommands() {
024        // Commands must be in order: longer patterns BEFORE shorter patterns with same prefix
025
026        // ALTER commands
027        addCmd(TBaseType.rrw_alter, "external", "table", ESqlStatementType.sstaltertable);
028        addCmd(TBaseType.rrw_alter, "account", ESqlStatementType.sstAlterAccount);
029        addCmd(TBaseType.rrw_alter, "database", ESqlStatementType.sstalterdatabase);
030        addCmd(TBaseType.rrw_alter, "file", "format", ESqlStatementType.sstAlterFileFormat);
031        addCmd(TBaseType.rrw_alter, "function", ESqlStatementType.sstalterfunction);
032        addCmd(TBaseType.rrw_alter, "materialized", "view", ESqlStatementType.sstAlterMaterializedView);
033        addCmd(TBaseType.rrw_alter, "network", "policy", ESqlStatementType.sstAlterNetworkPolicy);
034        addCmd(TBaseType.rrw_alter, "pipe", ESqlStatementType.sstAlterPipe);
035        addCmd(TBaseType.rrw_alter, "resource", "monitor", ESqlStatementType.sstAlterResourceMonitor);
036        addCmd(TBaseType.rrw_alter, "role", ESqlStatementType.sstAlterRole);
037        addCmd(TBaseType.rrw_alter, "task", ESqlStatementType.sstAlterTask);
038        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstAlterSchema);
039        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstaltersession);
040        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstaltersequence);
041        addCmd(TBaseType.rrw_alter, "share", ESqlStatementType.sstAlterShare);
042        addCmd(TBaseType.rrw_alter, "stage", ESqlStatementType.sstAlterStage);
043        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
044        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstalteruser);
045        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstalterview);
046        addCmd(TBaseType.rrw_alter, "warehouse", ESqlStatementType.sstAlterWarehouse);
047
048        // BEGIN commands
049        addCmd(TBaseType.rrw_begin, "work", ESqlStatementType.sstbegintran);
050        addCmd(TBaseType.rrw_begin, "transaction", ESqlStatementType.sstbegintran);
051        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstBegin);
052        addCmd(TBaseType.rrw_snowflake_begin_transaction, ESqlStatementType.sstbegintran);
053
054        // PL/SQL block delimiter for procedure body reparsing
055        addCmd(TBaseType.rrw_snowflake_plpgsql_function_delimiter, ESqlStatementType.sstPostgresqlBlock);
056
057        // Other commands
058        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
059        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstcomment);
060        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstcommit);
061        addCmd(TBaseType.rrw_snowflake_copy, "into", ESqlStatementType.sstCopyInto);
062
063        // CREATE commands - longer patterns first
064        addCmd(TBaseType.rrw_create, "or", "replace", "global", "temporary", "table", ESqlStatementType.sstcreatetable);
065        addCmd(TBaseType.rrw_create, "or", "replace", "local", "temporary", "table", ESqlStatementType.sstcreatetable);
066        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "dynamic", "table", ESqlStatementType.sstcreatetable);
067        addCmd(TBaseType.rrw_create, "or", "replace", "external", "table", ESqlStatementType.sstcreatetable);
068        addCmd(TBaseType.rrw_create, "or", "replace", "dynamic", "table", ESqlStatementType.sstcreatetable);
069        addCmd(TBaseType.rrw_create, "or", "replace", "file", "format", ESqlStatementType.sstCreateFileFormat);
070        addCmd(TBaseType.rrw_create, "or", "replace", "force", "view", ESqlStatementType.sstcreateview);
071        addCmd(TBaseType.rrw_create, "or", "replace", "hybrid", "table", ESqlStatementType.sstcreatetable);
072        addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
073        addCmd(TBaseType.rrw_create, "or", "replace", "network", "policy", ESqlStatementType.sstCreateNetworkPolicy);
074        addCmd(TBaseType.rrw_create, "or", "replace", "recursive", "view", ESqlStatementType.sstcreateview);
075        addCmd(TBaseType.rrw_create, "or", "replace", "resource", "monitor", ESqlStatementType.sstCreateResourceMonitor);
076        addCmd(TBaseType.rrw_create, "or", "replace", "secure", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
077        addCmd(TBaseType.rrw_create, "or", "replace", "secure", "view", ESqlStatementType.sstcreateview);
078        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "stage", ESqlStatementType.sstCreateStage);
079        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "table", ESqlStatementType.sstcreatetable);
080        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "view", ESqlStatementType.sstcreateview);
081        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "database", ESqlStatementType.sstcreatedatabase);
082        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "schema", ESqlStatementType.sstcreateschema);
083        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "table", ESqlStatementType.sstcreatetable);
084        addCmd(TBaseType.rrw_create, "or", "replace", "database", ESqlStatementType.sstcreatedatabase);
085        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction);
086        addCmd(TBaseType.rrw_create, "or", "replace", "pipe", ESqlStatementType.sstCreatePipe);
087        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
088        addCmd(TBaseType.rrw_create, "or", "replace", "role", ESqlStatementType.sstcreaterole);
089        addCmd(TBaseType.rrw_create, "or", "replace", "schema", ESqlStatementType.sstcreateschema);
090        addCmd(TBaseType.rrw_create, "or", "replace", "semantic", "view", ESqlStatementType.sstcreatesemanticview);
091        addCmd(TBaseType.rrw_create, "or", "replace", "sequence", ESqlStatementType.sstcreatesequence);
092        addCmd(TBaseType.rrw_create, "or", "replace", "share", ESqlStatementType.sstCreateShare);
093        addCmd(TBaseType.rrw_create, "or", "replace", "stage", ESqlStatementType.sstCreateStage);
094        addCmd(TBaseType.rrw_create, "or", "replace", "stream", ESqlStatementType.sstCreateStream);
095        addCmd(TBaseType.rrw_create, "or", "replace", "table", ESqlStatementType.sstcreatetable);
096        addCmd(TBaseType.rrw_create, "or", "replace", "task", ESqlStatementType.sstCreateTask);
097        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "table", ESqlStatementType.sstcreatetable);
098        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "view", ESqlStatementType.sstcreateview);
099        addCmd(TBaseType.rrw_create, "or", "replace", "user", ESqlStatementType.sstcreateuser);
100        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
101        addCmd(TBaseType.rrw_create, "or", "replace", "warehouse", ESqlStatementType.sstCreateWarehouse);
102
103        // CREATE without OR REPLACE - 3+ tokens
104        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
105        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
106        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
107        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
108        addCmd(TBaseType.rrw_create, "dynamic", "table", ESqlStatementType.sstcreatetable);
109        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstcreatetable);
110        addCmd(TBaseType.rrw_create, "file", "format", ESqlStatementType.sstCreateFileFormat);
111        addCmd(TBaseType.rrw_create, "global", "table", ESqlStatementType.sstcreatetable);
112        addCmd(TBaseType.rrw_create, "hybrid", "table", ESqlStatementType.sstcreatetable);
113        addCmd(TBaseType.rrw_create, "local", "table", ESqlStatementType.sstcreatetable);
114        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
115        addCmd(TBaseType.rrw_create, "network", "policy", ESqlStatementType.sstCreateNetworkPolicy);
116        addCmd(TBaseType.rrw_create, "recursive", "view", ESqlStatementType.sstcreateview);
117        addCmd(TBaseType.rrw_create, "resource", "monitor", ESqlStatementType.sstCreateResourceMonitor);
118        addCmd(TBaseType.rrw_create, "secure", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
119        addCmd(TBaseType.rrw_create, "secure", "view", ESqlStatementType.sstcreateview);
120        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
121        addCmd(TBaseType.rrw_create, "temporary", "stage", ESqlStatementType.sstCreateStage);
122        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
123        addCmd(TBaseType.rrw_create, "transient", "dynamic", "table", ESqlStatementType.sstcreatetable);
124        addCmd(TBaseType.rrw_create, "transient", "database", ESqlStatementType.sstcreatedatabase);
125        addCmd(TBaseType.rrw_create, "transient", "schema", ESqlStatementType.sstcreateschema);
126        addCmd(TBaseType.rrw_create, "transient", "table", ESqlStatementType.sstcreatetable);
127
128        // CREATE - 2 tokens
129        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
130        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction);
131        addCmd(TBaseType.rrw_create, "pipe", ESqlStatementType.sstCreatePipe);
132        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
133        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstcreaterole);
134        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstcreateschema);
135        addCmd(TBaseType.rrw_create, "semantic", "view", ESqlStatementType.sstcreatesemanticview);
136        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstcreatesequence);
137        addCmd(TBaseType.rrw_create, "share", ESqlStatementType.sstCreateShare);
138        addCmd(TBaseType.rrw_create, "stage", ESqlStatementType.sstCreateStage);
139        addCmd(TBaseType.rrw_create, "stream", ESqlStatementType.sstCreateStream);
140        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
141        addCmd(TBaseType.rrw_create, "task", ESqlStatementType.sstCreateTask);
142        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstcreateuser);
143        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
144        addCmd(TBaseType.rrw_create, "warehouse", ESqlStatementType.sstCreateWarehouse);
145
146        // DELETE
147        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
148
149        // DESCRIBE/DESC commands - 3 tokens
150        addCmd(TBaseType.rrw_snowflake_desc, "file", "format", ESqlStatementType.sstDescFileFormat);
151        addCmd(TBaseType.rrw_snowflake_desc, "network", "policy", ESqlStatementType.sstDescNetworkPolicy);
152        addCmd(TBaseType.rrw_describe, "file", "format", ESqlStatementType.sstDescFileFormat);
153        addCmd(TBaseType.rrw_describe, "network", "policy", ESqlStatementType.sstDescNetworkPolicy);
154        addCmd(TBaseType.rrw_describe, "user", "functions", ESqlStatementType.sstDescFunction);
155
156        // DESCRIBE/DESC commands - 2 tokens
157        addCmd(TBaseType.rrw_snowflake_desc, "function", ESqlStatementType.sstDescFunction);
158        addCmd(TBaseType.rrw_snowflake_desc, "pipe", ESqlStatementType.sstDescPipe);
159        addCmd(TBaseType.rrw_snowflake_desc, "result", ESqlStatementType.sstDescResult);
160        addCmd(TBaseType.rrw_snowflake_desc, "share", ESqlStatementType.sstDescShare);
161        addCmd(TBaseType.rrw_snowflake_desc, "stage", ESqlStatementType.sstDescStage);
162        addCmd(TBaseType.rrw_snowflake_desc, "storage", ESqlStatementType.sstDescStorage);
163        addCmd(TBaseType.rrw_snowflake_desc, "table", ESqlStatementType.sstDescTable);
164        addCmd(TBaseType.rrw_snowflake_desc, "user", ESqlStatementType.sstDescUser);
165        addCmd(TBaseType.rrw_snowflake_desc, "view", ESqlStatementType.sstDescView);
166        addCmd(TBaseType.rrw_describe, "function", ESqlStatementType.sstDescFunction);
167        addCmd(TBaseType.rrw_describe, "pipe", ESqlStatementType.sstDescPipe);
168        addCmd(TBaseType.rrw_describe, "result", ESqlStatementType.sstDescResult);
169        addCmd(TBaseType.rrw_describe, "share", ESqlStatementType.sstDescShare);
170        addCmd(TBaseType.rrw_describe, "stage", ESqlStatementType.sstDescStage);
171        addCmd(TBaseType.rrw_describe, "storage", ESqlStatementType.sstDescStorage);
172        addCmd(TBaseType.rrw_describe, "table", ESqlStatementType.sstDescTable);
173        addCmd(TBaseType.rrw_describe, "user", ESqlStatementType.sstDescUser);
174        addCmd(TBaseType.rrw_describe, "view", ESqlStatementType.sstDescView);
175
176        // DROP commands - 3 tokens
177        addCmd(TBaseType.rrw_drop, "file", "format", ESqlStatementType.sstDropFileFormat);
178        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstDropMaterializedView);
179        addCmd(TBaseType.rrw_drop, "network", "policy", ESqlStatementType.sstDropNetworkPolicy);
180        addCmd(TBaseType.rrw_drop, "resource", "monitor", ESqlStatementType.sstDropResourceMonitor);
181
182        // DROP commands - 2 tokens
183        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
184        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstdropfunction);
185        addCmd(TBaseType.rrw_drop, "pipe", ESqlStatementType.sstDropPipe);
186        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure);
187        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstdroprole);
188        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstdropschema);
189        addCmd(TBaseType.rrw_drop, "share", ESqlStatementType.sstDropShare);
190        addCmd(TBaseType.rrw_drop, "stage", ESqlStatementType.sstDropStage);
191        addCmd(TBaseType.rrw_drop, "stream", ESqlStatementType.sstDropStream);
192        addCmd(TBaseType.rrw_drop, "streamlit", ESqlStatementType.sstDropStreamlit);
193        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
194        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstdropuser);
195        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
196        addCmd(TBaseType.rrw_drop, "warehouse", ESqlStatementType.sstDropWarehouse);
197
198        // EXECUTE
199        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstExecute);
200
201        // Other commands
202        addCmd(TBaseType.rrw_get, ESqlStatementType.sstGet);
203        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant);
204        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
205        addCmd(TBaseType.rrw_snowflake_list, ESqlStatementType.sstList);
206        addCmd(TBaseType.rrw_snowflake_ls, ESqlStatementType.sstList);
207        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
208        addCmd(TBaseType.rrw_snowflake_pseudo_stmt_sign, ESqlStatementType.sstSnowflakePseudoExprStmt);
209        addCmd(TBaseType.rrw_snowflake_put, ESqlStatementType.sstPut);
210        addCmd(TBaseType.rrw_snowflake_remove, ESqlStatementType.sstRemove);
211        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke);
212        addCmd(TBaseType.rrw_snowflake_rm, ESqlStatementType.sstRemove);
213        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstrollback);
214        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
215        addCmd(TBaseType.rrw_set, ESqlStatementType.sstset);
216
217        // SHOW commands - 3+ tokens
218        addCmd(TBaseType.rrw_show, "terse", "databases", ESqlStatementType.sstShowDatabases);
219        addCmd(TBaseType.rrw_show, "terse", "streams", ESqlStatementType.sstShowStreams);
220        addCmd(TBaseType.rrw_show, "terse", "tasks", ESqlStatementType.sstShowTasks);
221        addCmd(TBaseType.rrw_show, "file", "formats", ESqlStatementType.sstShowFileFormats);
222        addCmd(TBaseType.rrw_show, "network", "policies", ESqlStatementType.sstShowNetworkPolicies);
223        addCmd(TBaseType.rrw_show, "resource", "monitors", ESqlStatementType.sstShowResourceMonitors);
224        addCmd(TBaseType.rrw_show, "user", "functions", ESqlStatementType.sstShowUserFunctions);
225
226        // SHOW commands - 2 tokens
227        addCmd(TBaseType.rrw_show, "columns", ESqlStatementType.sstShowColumns);
228        addCmd(TBaseType.rrw_show, "databases", ESqlStatementType.sstShowDatabases);
229        addCmd(TBaseType.rrw_show, "functions", ESqlStatementType.sstShowFunctions);
230        addCmd(TBaseType.rrw_show, "grants", ESqlStatementType.sstShowGrants);
231        addCmd(TBaseType.rrw_show, "locks", ESqlStatementType.sstShowLocks);
232        addCmd(TBaseType.rrw_show, "objects", ESqlStatementType.sstShowObjects);
233        addCmd(TBaseType.rrw_show, "parameters", ESqlStatementType.sstShowParameters);
234        addCmd(TBaseType.rrw_show, "pipes", ESqlStatementType.sstShowPipes);
235        addCmd(TBaseType.rrw_show, "procedures", ESqlStatementType.sstShowProcedures);
236        addCmd(TBaseType.rrw_show, "roles", ESqlStatementType.sstShowRoles);
237        addCmd(TBaseType.rrw_show, "schemas", ESqlStatementType.sstShowSchemas);
238        addCmd(TBaseType.rrw_show, "sequences", ESqlStatementType.sstShowSequences);
239        addCmd(TBaseType.rrw_show, "shares", ESqlStatementType.sstShowShares);
240        addCmd(TBaseType.rrw_show, "stages", ESqlStatementType.sstShowStages);
241        addCmd(TBaseType.rrw_show, "streams", ESqlStatementType.sstShowStreams);
242        addCmd(TBaseType.rrw_show, "tables", ESqlStatementType.sstShowTables);
243        addCmd(TBaseType.rrw_show, "tasks", ESqlStatementType.sstShowTasks);
244        addCmd(TBaseType.rrw_show, "transactions", ESqlStatementType.sstShowTransactions);
245        addCmd(TBaseType.rrw_show, "users", ESqlStatementType.sstShowUsers);
246        addCmd(TBaseType.rrw_show, "variables", ESqlStatementType.sstShowVariables);
247        addCmd(TBaseType.rrw_show, "views", ESqlStatementType.sstShowViews);
248        addCmd(TBaseType.rrw_show, "warehouses", ESqlStatementType.sstShowWarehouses);
249
250        // START, TRUNCATE, UNDROP, UNSET, UPDATE, USE
251        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstbegintran);
252        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
253        addCmd(TBaseType.rrw_snowflake_undrop, "database", ESqlStatementType.sstUndropDatabase);
254        addCmd(TBaseType.rrw_snowflake_undrop, "schema", ESqlStatementType.sstUndropSchema);
255        addCmd(TBaseType.rrw_snowflake_undrop, "table", ESqlStatementType.sstUndropTable);
256        addCmd(TBaseType.rrw_snowflake_unset, ESqlStatementType.sstunset);
257        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
258        addCmd(TBaseType.rrw_use, "secondary", "roles", ESqlStatementType.sstUseSecondaryRoles);
259        addCmd(TBaseType.rrw_use, ESqlStatementType.sstUse);
260    }
261
262    @Override
263    protected String getToken1Str(int token1) {
264        // Map vendor-specific token codes to their string representations
265        switch (token1) {
266            case TBaseType.rrw_snowflake_list:
267                return "list";
268            case TBaseType.rrw_snowflake_remove:
269                return "remove";
270            case TBaseType.rrw_snowflake_undrop:
271                return "undrop";
272            case TBaseType.rrw_snowflake_copy:
273                return "copy";
274            case TBaseType.rrw_snowflake_desc:
275                return "desc";
276            case TBaseType.rrw_snowflake_ls:
277                return "ls";
278            case TBaseType.rrw_snowflake_put:
279                return "put";
280            case TBaseType.rrw_snowflake_rm:
281                return "rm";
282            case TBaseType.rrw_snowflake_unset:
283                return "unset";
284            default:
285                return null;
286        }
287    }
288
289    @Override
290    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
291        TCustomSqlStatement ret = null;
292
293        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
294
295        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
296                || (pcst.tokencode == TBaseType.cmtslashstar)
297                || (pcst.tokencode == TBaseType.lexspace)
298                || (pcst.tokencode == TBaseType.lexnewline)
299                || (pcst.tokentype == ETokenType.ttsemicolon)) {
300            return null;
301        }
302
303        int lcpos = pcst.posinlist;
304        TSourceTokenList lcsourcetokenlist = pcst.container;
305        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
306
307        // Subquery after semicolon or at first line
308        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) {
309            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
310            if (k > 0) {
311                ret = new TSelectSqlStatement(this.vendor);
312            } else {
313                k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_with, 1, "(");
314                int k2 = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_as, 3, "(");
315                if ((k > 0) && (k2 > 2)) {
316                    ret = new TSelectSqlStatement(this.vendor);
317                }
318            }
319            return ret;
320        }
321
322        // CTE
323        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
324            ret = findcte(pcst);
325            if (ret != null) return ret;
326        }
327
328        gnewsqlstatementtype = getStatementTypeForToken(pcst);
329
330        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
331        switch (gnewsqlstatementtype) {
332            case sstinvalid: {
333                ret = null;
334
335                if (pstate == EFindSqlStateType.stnormal) {
336                    if (pcst.tokencode == TBaseType.label_begin) {
337                        ret = new TCommonBlock(this.vendor);
338                        gnewsqlstatementtype = ret.sqlstatementtype;
339                    } else if (pcst.tokencode == TBaseType.rrw_declare) {
340                        ret = new TCommonBlock(this.vendor);
341                        gnewsqlstatementtype = ret.sqlstatementtype;
342                    } else if (pcst.tokencode == TBaseType.rrw_begin) {
343                        ret = new TCommonBlock(this.vendor);
344                        gnewsqlstatementtype = ret.sqlstatementtype;
345                    } else if (pcst.tokencode == TBaseType.rrw_procedure) {
346                        ret = new TPlsqlCreateProcedure(this.vendor);
347                        gnewsqlstatementtype = ret.sqlstatementtype;
348                    } else if (pcst.tokencode == TBaseType.rrw_function) {
349                        ret = new TPlsqlCreateFunction(this.vendor);
350                        gnewsqlstatementtype = ret.sqlstatementtype;
351                    } else if (pcst.tokencode == TBaseType.rrw_package) {
352                        ret = new TPlsqlCreatePackage(this.vendor);
353                        gnewsqlstatementtype = ret.sqlstatementtype;
354                    }
355                }
356                break;
357            }
358            case sstselect: {
359                boolean lcisnewsql = true;
360
361                if (pstate != EFindSqlStateType.stnormal) {
362                    if (lcprevsolidtoken != null) {
363                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
364                            lcisnewsql = false; // subquery
365                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
366                            lcisnewsql = false;
367                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
368                            lcisnewsql = false;
369                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
370                            lcisnewsql = false;
371                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
372                            lcisnewsql = false;
373                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
374                            lcisnewsql = false;
375                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
376                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
377                                lcisnewsql = false;
378                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
379                                lcisnewsql = false;
380                        }
381
382                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
383                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
384                            if (lcpprevsolidtoken != null) {
385                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
386                                    lcisnewsql = false;
387                            }
388                        }
389                    }
390
391                    if (lccurrentsqlstatement != null) {
392                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
393                            lcisnewsql = false;
394                    }
395                }
396
397                if (lcisnewsql)
398                    ret = new TSelectSqlStatement(this.vendor);
399
400                break;
401            }
402            case sstinsert: {
403                boolean lcisnewsql = true;
404                if (pstate != EFindSqlStateType.stnormal) {
405                    if (lccurrentsqlstatement != null) {
406                    }
407                }
408
409                if (lcisnewsql)
410                    ret = new TInsertSqlStatement(this.vendor);
411
412                break;
413            }
414            case sstupdate: {
415                boolean lcisnewsql = true;
416                if (pstate != EFindSqlStateType.stnormal) {
417                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
418                    if (lcprevsolidtoken != null) {
419                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
420                            lcisnewsql = false;
421                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
422                            lcisnewsql = false;
423                    }
424
425                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
426                    if (lcnextsolidtoken != null) {
427                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
428                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
429                            if (k == 0) lcisnewsql = false;
430                        }
431                    }
432
433                    if (lccurrentsqlstatement != null) {
434                    }
435                }
436
437                if (lcisnewsql) {
438                    ret = new TUpdateSqlStatement(this.vendor);
439                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
440                }
441                break;
442            }
443            case sstdelete: {
444                boolean lcisnewsql = true;
445
446                if (pstate != EFindSqlStateType.stnormal) {
447                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
448                    if (lcprevsolidtoken != null) {
449                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
450                            lcisnewsql = false;
451                    }
452
453                    if (lccurrentsqlstatement != null) {
454                    }
455                }
456
457                if (lcisnewsql)
458                    ret = new TDeleteSqlStatement(this.vendor);
459
460                break;
461            }
462            case sstmerge: {
463                ret = new TMergeSqlStatement(this.vendor);
464                ret.sqlstatementtype = gnewsqlstatementtype;
465                break;
466            }
467            case sstoraclecommit: {
468                ret = new TUnknownSqlStatement(this.vendor);
469                ret.sqlstatementtype = gnewsqlstatementtype;
470                break;
471            }
472            case sstoraclerollback: {
473                ret = new TUnknownSqlStatement(this.vendor);
474                ret.sqlstatementtype = gnewsqlstatementtype;
475                break;
476            }
477            case sstoraclerevoke: {
478                ret = new TUnknownSqlStatement(this.vendor);
479                ret.sqlstatementtype = gnewsqlstatementtype;
480                break;
481            }
482            case sstoraclegrant: {
483                ret = new TUnknownSqlStatement(this.vendor);
484                ret.sqlstatementtype = gnewsqlstatementtype;
485                break;
486            }
487            case sstcreatetable: {
488                ret = new TCreateTableSqlStatement(this.vendor);
489                break;
490            }
491            case sstoraclecreateview: {
492                ret = new TCreateViewSqlStatement(this.vendor);
493                break;
494            }
495            case sstAlterAccount: {
496                ret = new TAlterAccountStmt(this.vendor);
497                break;
498            }
499            case sstalterdatabase: {
500                ret = new TAlterDatabaseStmt(this.vendor);
501                break;
502            }
503            case sstAlterFileFormat: {
504                ret = new TAlterFileFormatStmt(this.vendor);
505                break;
506            }
507            case sstalterfunction: {
508                ret = new TAlterFunctionStmt(this.vendor);
509                break;
510            }
511            case sstAlterNetworkPolicy: {
512                ret = new TAlterNetworkPolicyStmt(this.vendor);
513                break;
514            }
515            case sstAlterPipe: {
516                ret = new TAlterPipeStmt(this.vendor);
517                break;
518            }
519            case sstAlterResourceMonitor: {
520                ret = new TAlterResourceMonitorStmt(this.vendor);
521                break;
522            }
523            case sstAlterRole: {
524                ret = new TAlterRoleStmt(this.vendor);
525                break;
526            }
527            case sstAlterSchema: {
528                ret = new TAlterSchemaStmt(this.vendor);
529                break;
530            }
531            case sstaltersequence: {
532                ret = new TAlterSequenceStatement(this.vendor);
533                break;
534            }
535            case sstaltersession: {
536                ret = new TAlterSessionStatement(this.vendor);
537                break;
538            }
539            case sstAlterStage: {
540                ret = new TAlterStageStmt(this.vendor);
541                break;
542            }
543            case sstalteruser: {
544                ret = new TAlterUserStmt(this.vendor);
545                break;
546            }
547            case sstAlterShare: {
548                ret = new TAlterShareStmt(this.vendor);
549                break;
550            }
551            case sstalterview: {
552                ret = new TAlterViewStatement(this.vendor);
553                break;
554            }
555            case sstAlterWarehouse: {
556                ret = new TAlterWarehouseStmt(this.vendor);
557                break;
558            }
559            case sstBegin: {
560                boolean isblock = false;
561                int numOfSolidToken = 0;
562                TSourceToken st;
563                if (lcpos == lcsourcetokenlist.size() - 1) {
564                    // this is the last token
565                } else {
566                    for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
567                        st = lcsourcetokenlist.get(i);
568                        if (st.issolidtoken()) {
569                            numOfSolidToken++;
570                        }
571                        // Check for newline before semicolon - if found, must be a block
572                        if (st.tokencode == TBaseType.lexnewline) {
573                            isblock = true;
574                            // Continue to look for semicolon to complete the check
575                        }
576
577                        if (st.tokencode == ';') {
578                            if (numOfSolidToken <= 3) {
579                            } else {
580                                isblock = true;
581                            }
582                            break;
583                        }
584
585                        if (numOfSolidToken > 3) {
586                            isblock = true;
587                            break;
588                        }
589                    }
590                }
591
592                if (isblock) {
593                    ret = new TCommonBlock(this.vendor);
594                    gnewsqlstatementtype = ret.sqlstatementtype;
595                } else {
596                    ret = new TBeginTran(this.vendor);
597                    pcst.tokencode = TBaseType.rrw_snowflake_begin_transaction;
598                }
599
600                break;
601            }
602            case sstbegintran: {
603                ret = new TBeginTran(this.vendor);
604                if (pcst.tokencode == TBaseType.rrw_begin) {
605                    pcst.tokencode = TBaseType.rrw_snowflake_begin_transaction;
606                }
607                break;
608            }
609            case sstcomment: {
610                ret = new TCommentOnSqlStmt(this.vendor);
611                break;
612            }
613            case sstcommit: {
614                ret = new TCommitStmt(this.vendor);
615                break;
616            }
617            case sstCopyInto: {
618                ret = new TSnowflakeCopyIntoStmt(this.vendor);
619                break;
620            }
621            case sstcreatedatabase: {
622                ret = new TCreateDatabaseSqlStatement(this.vendor);
623                break;
624            }
625            case sstCreateFileFormat: {
626                ret = new TCreateFileFormatStmt(this.vendor);
627                break;
628            }
629            case sstcreatefunction: {
630                ret = new TCreateFunctionStmt(this.vendor);
631                break;
632            }
633            case sstCreateNetworkPolicy: {
634                ret = new TCreateNetworkPolicyStmt(this.vendor);
635                break;
636            }
637            case sstCreatePipe: {
638                ret = new TCreatePipeStmt(this.vendor);
639                break;
640            }
641            case sstCreateResourceMonitor: {
642                ret = new TCreateResourceMonitorStmt(this.vendor);
643                break;
644            }
645            case sstcreaterole: {
646                ret = new TCreateRoleStmt(this.vendor);
647                break;
648            }
649            case sstcreateschema: {
650                ret = new TCreateSchemaSqlStatement(this.vendor);
651                break;
652            }
653            case sstcreatesequence: {
654                ret = new TCreateSequenceStmt(this.vendor);
655                break;
656            }
657            case sstCreateShare: {
658                ret = new TCreateShareStmt(this.vendor);
659                break;
660            }
661            case sstCreateStage: {
662                ret = new TCreateStageStmt(this.vendor);
663                break;
664            }
665            case sstcreateuser: {
666                ret = new TCreateUserStmt(this.vendor);
667                break;
668            }
669            case sstCreateWarehouse: {
670                ret = new TCreateWarehouseStmt(this.vendor);
671                break;
672            }
673            case sstDescFileFormat:
674            case sstDescFunction:
675            case sstDescNetworkPolicy:
676            case sstDescPipe:
677            case sstDescResult:
678            case sstDescShare:
679            case sstDescStage:
680            case sstDescTable:
681            case sstDescUser:
682            case sstDescView:
683            case sstDescStorage: {
684                ret = new TDescribeStmt(this.vendor);
685                break;
686            }
687            case sstdropfunction: {
688                ret = new TDropFunctionStmt(this.vendor);
689                break;
690            }
691            case sstdropdatabase: {
692                ret = new TDropDatabaseStmt(this.vendor);
693                break;
694            }
695            case sstDropFileFormat: {
696                ret = new TDropStmt(this.vendor);
697                ret.sqlstatementtype = gnewsqlstatementtype;
698                break;
699            }
700            case sstDropNetworkPolicy: {
701                ret = new TDropStmt(this.vendor);
702                ret.sqlstatementtype = gnewsqlstatementtype;
703                break;
704            }
705            case sstDropPipe: {
706                ret = new TDropStmt(this.vendor);
707                ret.sqlstatementtype = gnewsqlstatementtype;
708                break;
709            }
710            case sstDropResourceMonitor: {
711                ret = new TDropStmt(this.vendor);
712                ret.sqlstatementtype = gnewsqlstatementtype;
713                break;
714            }
715            case sstdroprole: {
716                ret = new TDropRoleStmt(this.vendor);
717                break;
718            }
719            case sstdropschema: {
720                ret = new TDropSchemaSqlStatement(this.vendor);
721                break;
722            }
723            case sstDropShare: {
724                ret = new TDropStmt(this.vendor);
725                ret.sqlstatementtype = gnewsqlstatementtype;
726                break;
727            }
728            case sstDropStage: {
729                ret = new TDropStmt(this.vendor);
730                ret.sqlstatementtype = gnewsqlstatementtype;
731                break;
732            }
733            case sstdroptable: {
734                ret = new TDropTableSqlStatement(this.vendor);
735                break;
736            }
737            case sstdropuser: {
738                ret = new TDropUserStmt(this.vendor);
739                break;
740            }
741            case sstdropview: {
742                ret = new TDropViewSqlStatement(this.vendor);
743                break;
744            }
745            case sstDropWarehouse: {
746                ret = new TDropStmt(this.vendor);
747                ret.sqlstatementtype = gnewsqlstatementtype;
748                break;
749            }
750            case sstGet: {
751                ret = new TGetStmt(this.vendor);
752                break;
753            }
754            case sstGrant: {
755                ret = new TGrantStmt(this.vendor);
756                break;
757            }
758            case sstList: {
759                ret = new TListStmt(this.vendor);
760                break;
761            }
762            case sstPut: {
763                ret = new TPutStmt(this.vendor);
764                break;
765            }
766            case sstRemove: {
767                ret = new TRemoveStmt(this.vendor);
768                break;
769            }
770            case sstRevoke: {
771                ret = new TRevokeStmt(this.vendor);
772                break;
773            }
774            case sstrollback: {
775                ret = new TRollbackStmt(this.vendor);
776                break;
777            }
778            case sstset: {
779                ret = new TSetStmt(this.vendor);
780                break;
781            }
782            case sstShowColumns:
783            case sstShowDatabases:
784            case sstShowFileFormats:
785            case sstShowFunctions:
786            case sstShowGrants:
787            case sstShowNetworkPolicies:
788            case sstShowObjects:
789            case sstShowParameters:
790            case sstShowPipes:
791            case sstShowResourceMonitors:
792            case sstShowRoles:
793            case sstShowSchemas:
794            case sstShowSequences:
795            case sstShowShares:
796            case sstShowStages:
797            case sstShowTables:
798            case sstShowTransactions:
799            case sstShowUserFunctions:
800            case sstShowUsers:
801            case sstShowVariables:
802            case sstShowViews:
803            case sstShowWarehouses:
804            case sstShowProcedures:
805            case sstShowTasks:
806            case sstShowStreams: {
807                ret = new TShowStmt(this.vendor);
808                ret.sqlstatementtype = gnewsqlstatementtype;
809                break;
810            }
811            case sstTruncate: {
812                ret = new TTruncateStatement(this.vendor);
813                break;
814            }
815            case sstUndropDatabase:
816            case sstUndropSchema:
817            case sstUndropTable: {
818                ret = new TUndropStmt(this.vendor);
819                ret.sqlstatementtype = gnewsqlstatementtype;
820                break;
821            }
822            case sstunset: {
823                ret = new TUnsetStmt(this.vendor);
824                break;
825            }
826            case sstcreatematerializedview: {
827                ret = new TCreateMaterializedSqlStatement(this.vendor);
828                break;
829            }
830            case sstoraclecreateindex: {
831                ret = new TCreateIndexSqlStatement(this.vendor);
832                break;
833            }
834            case sstoracledroptable: {
835                ret = new TDropTableSqlStatement(this.vendor);
836                break;
837            }
838            case sstoracledropview: {
839                ret = new TDropViewSqlStatement(this.vendor);
840                break;
841            }
842            case sstoracledropindex: {
843                ret = new TDropIndexSqlStatement(this.vendor);
844                break;
845            }
846            case sstaltertable: {
847                ret = new TAlterTableStatement(this.vendor);
848                break;
849            }
850            case sstoraclealtersession: {
851                ret = new TAlterSessionStatement(this.vendor);
852                break;
853            }
854            case sstplsql_createfunction: {
855                ret = new TPlsqlCreateFunction(this.vendor);
856                ret.sqlstatementtype = gnewsqlstatementtype;
857                break;
858            }
859            case sstCommentOn: {
860                ret = new TCommentOnSqlStmt(this.vendor);
861                break;
862            }
863            case sstoraclecreatesequence: {
864                ret = new TCreateSequenceStmt(this.vendor);
865                break;
866            }
867            case sstpostgresqlCreateIndex:
868                ret = new TCreateIndexSqlStatement(this.vendor);
869                break;
870            case sstpostgresqlCreateView:
871                ret = new TCreateViewSqlStatement(this.vendor);
872                break;
873            case sstpostgresqlCreateFunction:
874                ret = new TCreateFunctionStmt(this.vendor);
875                break;
876            case sstpostgresqlTruncate:
877                ret = new TTruncateStatement(this.vendor);
878                break;
879            case sstpostgresqlDropTable:
880                ret = new TDropTableSqlStatement(this.vendor);
881                break;
882            case sstcreateview:
883                ret = new TCreateViewSqlStatement(this.vendor);
884                break;
885            case sstcall:
886                ret = new TCallStatement(this.vendor);
887                break;
888            case sstSnowflakePseudoExprStmt:
889                ret = new TPseudoExprStmt(this.vendor);
890                break;
891            case sstcreateprocedure:
892                ret = new TCreateProcedureStmt(this.vendor);
893                break;
894            case sstCreateStream:
895                ret = new TCreateStreamStmt(this.vendor);
896                break;
897            case sstUse:
898                TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
899                if (lcnextsolidtoken != null) {
900                    if (lcnextsolidtoken.toString().equalsIgnoreCase("database")) {
901                        ret = new TUseDatabase(this.vendor);
902                    } else if (lcnextsolidtoken.toString().equalsIgnoreCase("role")) {
903                        ret = new TUseRole(this.vendor);
904                    } else if (lcnextsolidtoken.toString().equalsIgnoreCase("warehouse")) {
905                        ret = new TUseWarehouse(this.vendor);
906                    } else {
907                        ret = new TUseSchema(this.vendor);
908                    }
909                } else {
910                    ret = new TUnknownSqlStatement(this.vendor);
911                    ret.sqlstatementtype = gnewsqlstatementtype;
912                }
913                break;
914            case sstExecute: {
915                ret = new TExecuteSqlStatement(this.vendor);
916                break;
917            }
918            case sstAlterTask:
919                ret = new TAlterTaskStmt(this.vendor);
920                break;
921            case sstCreateTask:
922                ret = new TCreateTaskStmt(this.vendor);
923                break;
924            case sstcreatesemanticview:
925                ret = new TCreateSemanticViewStmt(this.vendor);
926                break;
927            case sstAlterMaterializedView:
928                ret = new TAlterMaterializedViewStmt(this.vendor);
929                break;
930            case sstDropMaterializedView:
931                ret = new TDropMaterializedViewStmt(this.vendor);
932                break;
933            case sstdropprocedure:
934                ret = new TDropProcedureStmt(this.vendor);
935                break;
936            case sstUseSecondaryRoles:
937                ret = new TUseSecondaryRolesStmt(this.vendor);
938                break;
939            case sstDropStreamlit:
940                ret = new TDropStmt(this.vendor);
941                break;
942            case sstDropStream:
943                ret = new TDropStreamStmt(this.vendor);
944                break;
945            default: {
946                ret = new TUnknownSqlStatement(this.vendor);
947                ret.sqlstatementtype = gnewsqlstatementtype;
948                break;
949            }
950        }
951
952        return ret;
953    }
954}