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, "dynamic", "table", ESqlStatementType.sstAlterDynamicTable);
039        addCmd(TBaseType.rrw_alter, "schema", ESqlStatementType.sstAlterSchema);
040        addCmd(TBaseType.rrw_alter, "session", ESqlStatementType.sstaltersession);
041        addCmd(TBaseType.rrw_alter, "sequence", ESqlStatementType.sstaltersequence);
042        addCmd(TBaseType.rrw_alter, "share", ESqlStatementType.sstAlterShare);
043        addCmd(TBaseType.rrw_alter, "stage", ESqlStatementType.sstAlterStage);
044        addCmd(TBaseType.rrw_alter, "table", ESqlStatementType.sstaltertable);
045        addCmd(TBaseType.rrw_alter, "user", ESqlStatementType.sstalteruser);
046        addCmd(TBaseType.rrw_alter, "view", ESqlStatementType.sstalterview);
047        addCmd(TBaseType.rrw_alter, "warehouse", ESqlStatementType.sstAlterWarehouse);
048
049        // BEGIN commands
050        addCmd(TBaseType.rrw_begin, "work", ESqlStatementType.sstbegintran);
051        addCmd(TBaseType.rrw_begin, "transaction", ESqlStatementType.sstbegintran);
052        addCmd(TBaseType.rrw_begin, "name", ESqlStatementType.sstbegintran);
053        addCmd(TBaseType.rrw_begin, ESqlStatementType.sstBegin);
054        addCmd(TBaseType.rrw_snowflake_begin_transaction, ESqlStatementType.sstbegintran);
055
056        // PL/SQL block delimiter for procedure body reparsing
057        addCmd(TBaseType.rrw_snowflake_plpgsql_function_delimiter, ESqlStatementType.sstPostgresqlBlock);
058
059        // Other commands
060        addCmd(TBaseType.rrw_call, ESqlStatementType.sstcall);
061        addCmd(TBaseType.rrw_comment, ESqlStatementType.sstcomment);
062        addCmd(TBaseType.rrw_commit, ESqlStatementType.sstcommit);
063        addCmd(TBaseType.rrw_snowflake_copy, "into", ESqlStatementType.sstCopyInto);
064
065        // CREATE commands - longer patterns first
066        addCmd(TBaseType.rrw_create, "or", "replace", "global", "temporary", "table", ESqlStatementType.sstcreatetable);
067        addCmd(TBaseType.rrw_create, "or", "replace", "local", "temporary", "table", ESqlStatementType.sstcreatetable);
068        addCmd(TBaseType.rrw_create, "or", "replace", "scoped", "temporary", "table", ESqlStatementType.sstcreatetable);
069        addCmd(TBaseType.rrw_create, "or", "replace", "scoped", "temp", "table", ESqlStatementType.sstcreatetable);
070        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "dynamic", "table", ESqlStatementType.sstcreatetable);
071        addCmd(TBaseType.rrw_create, "or", "replace", "external", "table", ESqlStatementType.sstcreatetable);
072        addCmd(TBaseType.rrw_create, "or", "replace", "dynamic", "table", ESqlStatementType.sstcreatetable);
073        addCmd(TBaseType.rrw_create, "or", "replace", "file", "format", ESqlStatementType.sstCreateFileFormat);
074        addCmd(TBaseType.rrw_create, "or", "replace", "force", "view", ESqlStatementType.sstcreateview);
075        addCmd(TBaseType.rrw_create, "or", "replace", "hybrid", "table", ESqlStatementType.sstcreatetable);
076        addCmd(TBaseType.rrw_create, "or", "replace", "iceberg", "table", ESqlStatementType.sstcreatetable);
077        addCmd(TBaseType.rrw_create, "or", "replace", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
078        addCmd(TBaseType.rrw_create, "or", "replace", "aggregation", "policy", ESqlStatementType.sstCreateAggregationPolicy);
079        addCmd(TBaseType.rrw_create, "or", "replace", "join", "policy", ESqlStatementType.sstCreateJoinPolicy);
080        addCmd(TBaseType.rrw_create, "or", "replace", "masking", "policy", ESqlStatementType.sstCreateMaskingPolicy);
081        addCmd(TBaseType.rrw_create, "or", "replace", "network", "policy", ESqlStatementType.sstCreateNetworkPolicy);
082        addCmd(TBaseType.rrw_create, "or", "replace", "projection", "policy", ESqlStatementType.sstCreateProjectionPolicy);
083        addCmd(TBaseType.rrw_create, "or", "replace", "row", "access", "policy", ESqlStatementType.sstCreateRowAccessPolicy);
084        addCmd(TBaseType.rrw_create, "or", "replace", "recursive", "view", ESqlStatementType.sstcreateview);
085        addCmd(TBaseType.rrw_create, "or", "replace", "resource", "monitor", ESqlStatementType.sstCreateResourceMonitor);
086        addCmd(TBaseType.rrw_create, "or", "replace", "secure", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
087        addCmd(TBaseType.rrw_create, "or", "replace", "secure", "view", ESqlStatementType.sstcreateview);
088        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "stage", ESqlStatementType.sstCreateStage);
089        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "stage", ESqlStatementType.sstCreateStage);
090        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "table", ESqlStatementType.sstcreatetable);
091        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "view", ESqlStatementType.sstcreateview);
092        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "database", ESqlStatementType.sstcreatedatabase);
093        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "schema", ESqlStatementType.sstcreateschema);
094        addCmd(TBaseType.rrw_create, "or", "replace", "transient", "table", ESqlStatementType.sstcreatetable);
095        addCmd(TBaseType.rrw_create, "or", "replace", "database", ESqlStatementType.sstcreatedatabase);
096        addCmd(TBaseType.rrw_create, "or", "replace", "function", ESqlStatementType.sstcreatefunction);
097        addCmd(TBaseType.rrw_create, "or", "replace", "search", "optimization", ESqlStatementType.sstcreateindex);
098        addCmd(TBaseType.rrw_create, "or", "replace", "secure", "function", ESqlStatementType.sstcreatefunction);
099        addCmd(TBaseType.rrw_create, "or", "replace", "temporary", "function", ESqlStatementType.sstcreatefunction);
100        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "function", ESqlStatementType.sstcreatefunction);
101        addCmd(TBaseType.rrw_create, "or", "replace", "external", "function", ESqlStatementType.sstSnowflakeCreateExternalFunction);
102        addCmd(TBaseType.rrw_create, "external", "function", ESqlStatementType.sstSnowflakeCreateExternalFunction);
103        addCmd(TBaseType.rrw_create, "or", "replace", "pipe", ESqlStatementType.sstCreatePipe);
104        addCmd(TBaseType.rrw_create, "or", "replace", "procedure", ESqlStatementType.sstcreateprocedure);
105        addCmd(TBaseType.rrw_create, "or", "replace", "role", ESqlStatementType.sstcreaterole);
106        addCmd(TBaseType.rrw_create, "or", "replace", "schema", ESqlStatementType.sstcreateschema);
107        addCmd(TBaseType.rrw_create, "or", "replace", "semantic", "view", ESqlStatementType.sstcreatesemanticview);
108        addCmd(TBaseType.rrw_create, "or", "replace", "sequence", ESqlStatementType.sstcreatesequence);
109        addCmd(TBaseType.rrw_create, "or", "replace", "share", ESqlStatementType.sstCreateShare);
110        addCmd(TBaseType.rrw_create, "or", "replace", "tag", ESqlStatementType.sstCreateTag);
111        addCmd(TBaseType.rrw_create, "or", "replace", "stage", ESqlStatementType.sstCreateStage);
112        addCmd(TBaseType.rrw_create, "or", "replace", "stream", ESqlStatementType.sstCreateStream);
113        addCmd(TBaseType.rrw_create, "or", "replace", "table", ESqlStatementType.sstcreatetable);
114        addCmd(TBaseType.rrw_create, "or", "replace", "task", ESqlStatementType.sstCreateTask);
115        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "table", ESqlStatementType.sstcreatetable);
116        addCmd(TBaseType.rrw_create, "or", "replace", "temp", "view", ESqlStatementType.sstcreateview);
117        addCmd(TBaseType.rrw_create, "or", "replace", "user", ESqlStatementType.sstcreateuser);
118        addCmd(TBaseType.rrw_create, "or", "replace", "view", ESqlStatementType.sstcreateview);
119        addCmd(TBaseType.rrw_create, "or", "replace", "warehouse", ESqlStatementType.sstCreateWarehouse);
120
121        // CREATE OR ALTER TABLE
122        addCmd(TBaseType.rrw_create, "or", "alter", "dynamic", "table", ESqlStatementType.sstcreatetable);
123        addCmd(TBaseType.rrw_create, "or", "alter", "table", ESqlStatementType.sstcreatetable);
124
125        // CREATE OR ALTER VIEW
126        addCmd(TBaseType.rrw_create, "or", "alter", "secure", "view", ESqlStatementType.sstcreateview);
127        addCmd(TBaseType.rrw_create, "or", "alter", "force", "view", ESqlStatementType.sstcreateview);
128        addCmd(TBaseType.rrw_create, "or", "alter", "temporary", "view", ESqlStatementType.sstcreateview);
129        addCmd(TBaseType.rrw_create, "or", "alter", "temp", "view", ESqlStatementType.sstcreateview);
130        addCmd(TBaseType.rrw_create, "or", "alter", "recursive", "view", ESqlStatementType.sstcreateview);
131        addCmd(TBaseType.rrw_create, "or", "alter", "view", ESqlStatementType.sstcreateview);
132
133        // CREATE OR ALTER TAG
134        addCmd(TBaseType.rrw_create, "or", "alter", "tag", ESqlStatementType.sstCreateTag);
135
136        // CREATE OR ALTER FUNCTION
137        addCmd(TBaseType.rrw_create, "or", "alter", "function", ESqlStatementType.sstcreatefunction);
138        addCmd(TBaseType.rrw_create, "or", "alter", "secure", "function", ESqlStatementType.sstcreatefunction);
139        addCmd(TBaseType.rrw_create, "or", "alter", "temporary", "function", ESqlStatementType.sstcreatefunction);
140        addCmd(TBaseType.rrw_create, "or", "alter", "temp", "function", ESqlStatementType.sstcreatefunction);
141        addCmd(TBaseType.rrw_create, "or", "alter", "external", "function", ESqlStatementType.sstcreatefunction);
142
143        // CREATE without OR REPLACE - 3+ tokens
144        addCmd(TBaseType.rrw_create, "global", "temporary", "table", ESqlStatementType.sstcreatetable);
145        addCmd(TBaseType.rrw_create, "global", "temp", "table", ESqlStatementType.sstcreatetable);
146        addCmd(TBaseType.rrw_create, "local", "temporary", "table", ESqlStatementType.sstcreatetable);
147        addCmd(TBaseType.rrw_create, "local", "temp", "table", ESqlStatementType.sstcreatetable);
148        addCmd(TBaseType.rrw_create, "scoped", "temporary", "table", ESqlStatementType.sstcreatetable);
149        addCmd(TBaseType.rrw_create, "scoped", "temp", "table", ESqlStatementType.sstcreatetable);
150        addCmd(TBaseType.rrw_create, "dynamic", "table", ESqlStatementType.sstcreatetable);
151        addCmd(TBaseType.rrw_create, "external", "table", ESqlStatementType.sstcreatetable);
152        addCmd(TBaseType.rrw_create, "external", "function", ESqlStatementType.sstcreatefunction);
153        addCmd(TBaseType.rrw_create, "file", "format", ESqlStatementType.sstCreateFileFormat);
154        addCmd(TBaseType.rrw_create, "global", "table", ESqlStatementType.sstcreatetable);
155        addCmd(TBaseType.rrw_create, "hybrid", "table", ESqlStatementType.sstcreatetable);
156        addCmd(TBaseType.rrw_create, "iceberg", "table", ESqlStatementType.sstcreatetable);
157        addCmd(TBaseType.rrw_create, "local", "table", ESqlStatementType.sstcreatetable);
158        addCmd(TBaseType.rrw_create, "materialized", "view", ESqlStatementType.sstcreatematerializedview);
159        addCmd(TBaseType.rrw_create, "aggregation", "policy", ESqlStatementType.sstCreateAggregationPolicy);
160        addCmd(TBaseType.rrw_create, "join", "policy", ESqlStatementType.sstCreateJoinPolicy);
161        addCmd(TBaseType.rrw_create, "masking", "policy", ESqlStatementType.sstCreateMaskingPolicy);
162        addCmd(TBaseType.rrw_create, "network", "policy", ESqlStatementType.sstCreateNetworkPolicy);
163        addCmd(TBaseType.rrw_create, "projection", "policy", ESqlStatementType.sstCreateProjectionPolicy);
164        addCmd(TBaseType.rrw_create, "recursive", "view", ESqlStatementType.sstcreateview);
165        addCmd(TBaseType.rrw_create, "resource", "monitor", ESqlStatementType.sstCreateResourceMonitor);
166        addCmd(TBaseType.rrw_create, "row", "access", "policy", ESqlStatementType.sstCreateRowAccessPolicy);
167        addCmd(TBaseType.rrw_create, "search", "optimization", ESqlStatementType.sstcreateindex);
168        addCmd(TBaseType.rrw_create, "secure", "materialized", "view", ESqlStatementType.sstcreatematerializedview);
169        addCmd(TBaseType.rrw_create, "secure", "view", ESqlStatementType.sstcreateview);
170        addCmd(TBaseType.rrw_create, "secure", "function", ESqlStatementType.sstcreatefunction);
171        addCmd(TBaseType.rrw_create, "temp", "stage", ESqlStatementType.sstCreateStage);
172        addCmd(TBaseType.rrw_create, "temp", "table", ESqlStatementType.sstcreatetable);
173        addCmd(TBaseType.rrw_create, "temporary", "stage", ESqlStatementType.sstCreateStage);
174        addCmd(TBaseType.rrw_create, "temporary", "function", ESqlStatementType.sstcreatefunction);
175        addCmd(TBaseType.rrw_create, "temp", "function", ESqlStatementType.sstcreatefunction);
176        addCmd(TBaseType.rrw_create, "temporary", "table", ESqlStatementType.sstcreatetable);
177        addCmd(TBaseType.rrw_create, "transient", "dynamic", "table", ESqlStatementType.sstcreatetable);
178        addCmd(TBaseType.rrw_create, "transient", "database", ESqlStatementType.sstcreatedatabase);
179        addCmd(TBaseType.rrw_create, "transient", "schema", ESqlStatementType.sstcreateschema);
180        addCmd(TBaseType.rrw_create, "transient", "table", ESqlStatementType.sstcreatetable);
181
182        // CREATE - 2 tokens
183        addCmd(TBaseType.rrw_create, "database", ESqlStatementType.sstcreatedatabase);
184        addCmd(TBaseType.rrw_create, "function", ESqlStatementType.sstcreatefunction);
185        addCmd(TBaseType.rrw_create, "pipe", ESqlStatementType.sstCreatePipe);
186        addCmd(TBaseType.rrw_create, "procedure", ESqlStatementType.sstcreateprocedure);
187        addCmd(TBaseType.rrw_create, "role", ESqlStatementType.sstcreaterole);
188        addCmd(TBaseType.rrw_create, "schema", ESqlStatementType.sstcreateschema);
189        addCmd(TBaseType.rrw_create, "semantic", "view", ESqlStatementType.sstcreatesemanticview);
190        addCmd(TBaseType.rrw_create, "sequence", ESqlStatementType.sstcreatesequence);
191        addCmd(TBaseType.rrw_create, "share", ESqlStatementType.sstCreateShare);
192        addCmd(TBaseType.rrw_create, "stage", ESqlStatementType.sstCreateStage);
193        addCmd(TBaseType.rrw_create, "stream", ESqlStatementType.sstCreateStream);
194        addCmd(TBaseType.rrw_create, "table", ESqlStatementType.sstcreatetable);
195        addCmd(TBaseType.rrw_create, "tag", ESqlStatementType.sstCreateTag);
196        addCmd(TBaseType.rrw_create, "task", ESqlStatementType.sstCreateTask);
197        addCmd(TBaseType.rrw_create, "user", ESqlStatementType.sstcreateuser);
198        addCmd(TBaseType.rrw_create, "view", ESqlStatementType.sstcreateview);
199        addCmd(TBaseType.rrw_create, "warehouse", ESqlStatementType.sstCreateWarehouse);
200
201        // DELETE
202        addCmd(TBaseType.rrw_delete, ESqlStatementType.sstdelete);
203
204        // DESCRIBE/DESC commands - 3 tokens
205        addCmd(TBaseType.rrw_snowflake_desc, "file", "format", ESqlStatementType.sstDescFileFormat);
206        addCmd(TBaseType.rrw_snowflake_desc, "network", "policy", ESqlStatementType.sstDescNetworkPolicy);
207        addCmd(TBaseType.rrw_describe, "file", "format", ESqlStatementType.sstDescFileFormat);
208        addCmd(TBaseType.rrw_describe, "network", "policy", ESqlStatementType.sstDescNetworkPolicy);
209        addCmd(TBaseType.rrw_describe, "user", "functions", ESqlStatementType.sstDescFunction);
210
211        // DESCRIBE/DESC commands - 2 tokens
212        addCmd(TBaseType.rrw_snowflake_desc, "function", ESqlStatementType.sstDescFunction);
213        addCmd(TBaseType.rrw_snowflake_desc, "pipe", ESqlStatementType.sstDescPipe);
214        addCmd(TBaseType.rrw_snowflake_desc, "result", ESqlStatementType.sstDescResult);
215        addCmd(TBaseType.rrw_snowflake_desc, "share", ESqlStatementType.sstDescShare);
216        addCmd(TBaseType.rrw_snowflake_desc, "stage", ESqlStatementType.sstDescStage);
217        addCmd(TBaseType.rrw_snowflake_desc, "storage", ESqlStatementType.sstDescStorage);
218        addCmd(TBaseType.rrw_snowflake_desc, "table", ESqlStatementType.sstDescTable);
219        addCmd(TBaseType.rrw_snowflake_desc, "user", ESqlStatementType.sstDescUser);
220        addCmd(TBaseType.rrw_snowflake_desc, "view", ESqlStatementType.sstDescView);
221        addCmd(TBaseType.rrw_describe, "function", ESqlStatementType.sstDescFunction);
222        addCmd(TBaseType.rrw_describe, "pipe", ESqlStatementType.sstDescPipe);
223        addCmd(TBaseType.rrw_describe, "result", ESqlStatementType.sstDescResult);
224        addCmd(TBaseType.rrw_describe, "share", ESqlStatementType.sstDescShare);
225        addCmd(TBaseType.rrw_describe, "stage", ESqlStatementType.sstDescStage);
226        addCmd(TBaseType.rrw_describe, "storage", ESqlStatementType.sstDescStorage);
227        addCmd(TBaseType.rrw_describe, "table", ESqlStatementType.sstDescTable);
228        addCmd(TBaseType.rrw_describe, "user", ESqlStatementType.sstDescUser);
229        addCmd(TBaseType.rrw_describe, "view", ESqlStatementType.sstDescView);
230        addCmd(TBaseType.rrw_snowflake_desc, "schema", ESqlStatementType.sstDescSchema);
231        addCmd(TBaseType.rrw_snowflake_desc, "database", ESqlStatementType.sstDescDatabase);
232        addCmd(TBaseType.rrw_describe, "schema", ESqlStatementType.sstDescSchema);
233        addCmd(TBaseType.rrw_describe, "database", ESqlStatementType.sstDescDatabase);
234
235        // DROP commands - 3 tokens
236        addCmd(TBaseType.rrw_drop, "file", "format", ESqlStatementType.sstDropFileFormat);
237        addCmd(TBaseType.rrw_drop, "materialized", "view", ESqlStatementType.sstDropMaterializedView);
238        addCmd(TBaseType.rrw_drop, "network", "policy", ESqlStatementType.sstDropNetworkPolicy);
239        addCmd(TBaseType.rrw_drop, "resource", "monitor", ESqlStatementType.sstDropResourceMonitor);
240
241        // DROP commands - 2 tokens
242        addCmd(TBaseType.rrw_drop, "database", ESqlStatementType.sstdropdatabase);
243        addCmd(TBaseType.rrw_drop, "function", ESqlStatementType.sstdropfunction);
244        addCmd(TBaseType.rrw_drop, "pipe", ESqlStatementType.sstDropPipe);
245        addCmd(TBaseType.rrw_drop, "procedure", ESqlStatementType.sstdropprocedure);
246        addCmd(TBaseType.rrw_drop, "role", ESqlStatementType.sstdroprole);
247        addCmd(TBaseType.rrw_drop, "schema", ESqlStatementType.sstdropschema);
248        addCmd(TBaseType.rrw_drop, "share", ESqlStatementType.sstDropShare);
249        addCmd(TBaseType.rrw_drop, "stage", ESqlStatementType.sstDropStage);
250        addCmd(TBaseType.rrw_drop, "stream", ESqlStatementType.sstDropStream);
251        addCmd(TBaseType.rrw_drop, "streamlit", ESqlStatementType.sstDropStreamlit);
252        addCmd(TBaseType.rrw_drop, "task", ESqlStatementType.sstDropTask);
253        addCmd(TBaseType.rrw_drop, "table", ESqlStatementType.sstdroptable);
254        addCmd(TBaseType.rrw_drop, "user", ESqlStatementType.sstdropuser);
255        addCmd(TBaseType.rrw_drop, "view", ESqlStatementType.sstdropview);
256        addCmd(TBaseType.rrw_drop, "warehouse", ESqlStatementType.sstDropWarehouse);
257
258        // EXECUTE
259        addCmd(TBaseType.rrw_execute, "immediate", ESqlStatementType.sstExecute);
260        addCmd(TBaseType.rrw_execute, "task", ESqlStatementType.sstExecute);
261
262        // Other commands
263        addCmd(TBaseType.rrw_get, ESqlStatementType.sstGet);
264        addCmd(TBaseType.rrw_grant, ESqlStatementType.sstGrant);
265        addCmd(TBaseType.rrw_insert, ESqlStatementType.sstinsert);
266        addCmd(TBaseType.rrw_snowflake_list, ESqlStatementType.sstList);
267        addCmd(TBaseType.rrw_snowflake_ls, ESqlStatementType.sstList);
268        addCmd(TBaseType.rrw_merge, ESqlStatementType.sstmerge);
269        addCmd(TBaseType.rrw_snowflake_pseudo_stmt_sign, ESqlStatementType.sstSnowflakePseudoExprStmt);
270        addCmd(TBaseType.rrw_snowflake_put, ESqlStatementType.sstPut);
271        addCmd(TBaseType.rrw_snowflake_remove, ESqlStatementType.sstRemove);
272        addCmd(TBaseType.rrw_revoke, ESqlStatementType.sstRevoke);
273        addCmd(TBaseType.rrw_snowflake_rm, ESqlStatementType.sstRemove);
274        addCmd(TBaseType.rrw_rollback, ESqlStatementType.sstrollback);
275        addCmd(TBaseType.rrw_select, ESqlStatementType.sstselect);
276        addCmd(TBaseType.rrw_table, ESqlStatementType.sstselect);  // TABLE t = SELECT * FROM t
277        addCmd(TBaseType.rrw_set, ESqlStatementType.sstset);
278
279        // SHOW commands - 3+ tokens
280        addCmd(TBaseType.rrw_show, "terse", "databases", ESqlStatementType.sstShowDatabases);
281        addCmd(TBaseType.rrw_show, "terse", "streams", ESqlStatementType.sstShowStreams);
282        addCmd(TBaseType.rrw_show, "terse", "tasks", ESqlStatementType.sstShowTasks);
283        addCmd(TBaseType.rrw_show, "terse", "roles", ESqlStatementType.sstShowRoles);
284        addCmd(TBaseType.rrw_show, "terse", "schemas", ESqlStatementType.sstShowSchemas);
285        addCmd(TBaseType.rrw_show, "file", "formats", ESqlStatementType.sstShowFileFormats);
286        addCmd(TBaseType.rrw_show, "network", "policies", ESqlStatementType.sstShowNetworkPolicies);
287        addCmd(TBaseType.rrw_show, "resource", "monitors", ESqlStatementType.sstShowResourceMonitors);
288        addCmd(TBaseType.rrw_show, "user", "functions", ESqlStatementType.sstShowUserFunctions);
289
290        // SHOW commands - 2 tokens
291        addCmd(TBaseType.rrw_show, "columns", ESqlStatementType.sstShowColumns);
292        addCmd(TBaseType.rrw_show, "databases", ESqlStatementType.sstShowDatabases);
293        addCmd(TBaseType.rrw_show, "functions", ESqlStatementType.sstShowFunctions);
294        addCmd(TBaseType.rrw_show, "grants", ESqlStatementType.sstShowGrants);
295        addCmd(TBaseType.rrw_show, "locks", ESqlStatementType.sstShowLocks);
296        addCmd(TBaseType.rrw_show, "objects", ESqlStatementType.sstShowObjects);
297        addCmd(TBaseType.rrw_show, "parameters", ESqlStatementType.sstShowParameters);
298        addCmd(TBaseType.rrw_show, "pipes", ESqlStatementType.sstShowPipes);
299        addCmd(TBaseType.rrw_show, "procedures", ESqlStatementType.sstShowProcedures);
300        addCmd(TBaseType.rrw_show, "roles", ESqlStatementType.sstShowRoles);
301        addCmd(TBaseType.rrw_show, "schemas", ESqlStatementType.sstShowSchemas);
302        addCmd(TBaseType.rrw_show, "sequences", ESqlStatementType.sstShowSequences);
303        addCmd(TBaseType.rrw_show, "shares", ESqlStatementType.sstShowShares);
304        addCmd(TBaseType.rrw_show, "stages", ESqlStatementType.sstShowStages);
305        addCmd(TBaseType.rrw_show, "streams", ESqlStatementType.sstShowStreams);
306        addCmd(TBaseType.rrw_show, "tables", ESqlStatementType.sstShowTables);
307        addCmd(TBaseType.rrw_show, "tasks", ESqlStatementType.sstShowTasks);
308        addCmd(TBaseType.rrw_show, "transactions", ESqlStatementType.sstShowTransactions);
309        addCmd(TBaseType.rrw_show, "users", ESqlStatementType.sstShowUsers);
310        addCmd(TBaseType.rrw_show, "variables", ESqlStatementType.sstShowVariables);
311        addCmd(TBaseType.rrw_show, "views", ESqlStatementType.sstShowViews);
312        addCmd(TBaseType.rrw_show, "warehouses", ESqlStatementType.sstShowWarehouses);
313
314        // Snowflake admin/DDL heads previously unrecognized by the splitter
315        // (they hit the error-token path and reported "Error when tokenize"
316        // on valid SQL). All route through the default branch to a typed
317        // TUnknownSqlStatement.
318        addCmd(TBaseType.rrw_create, "security", "integration", ESqlStatementType.sstSnowflakeCreateSecurityIntegration);
319        addCmd(TBaseType.rrw_create, "or", "replace", "security", "integration", " ", " ", ESqlStatementType.sstSnowflakeCreateSecurityIntegration);
320        addCmd(TBaseType.rrw_alter, "security", "integration", ESqlStatementType.sstSnowflakeAlterSecurityIntegration);
321        addCmd(TBaseType.rrw_create, "api", "integration", ESqlStatementType.sstSnowflakeCreateApiIntegration);
322        addCmd(TBaseType.rrw_create, "or", "replace", "api", "integration", " ", " ", ESqlStatementType.sstSnowflakeCreateApiIntegration);
323        addCmd(TBaseType.rrw_alter, "api", "integration", ESqlStatementType.sstSnowflakeAlterApiIntegration);
324        addCmd(TBaseType.rrw_create, "storage", "integration", ESqlStatementType.sstSnowflakeCreateStorageIntegration);
325        addCmd(TBaseType.rrw_create, "or", "replace", "storage", "integration", " ", " ", ESqlStatementType.sstSnowflakeCreateStorageIntegration);
326        addCmd(TBaseType.rrw_alter, "storage", "integration", ESqlStatementType.sstSnowflakeAlterStorageIntegration);
327        addCmd(TBaseType.rrw_create, "notification", "integration", ESqlStatementType.sstSnowflakeCreateNotificationIntegration);
328        addCmd(TBaseType.rrw_create, "or", "replace", "notification", "integration", " ", " ", ESqlStatementType.sstSnowflakeCreateNotificationIntegration);
329        addCmd(TBaseType.rrw_alter, "notification", "integration", ESqlStatementType.sstSnowflakeAlterNotificationIntegration);
330        addCmd(TBaseType.rrw_alter, "external", "function", ESqlStatementType.sstSnowflakeAlterExternalFunction);
331        addCmd(TBaseType.rrw_create, "managed", "account", ESqlStatementType.sstSnowflakeCreateManagedAccount);
332        addCmd(TBaseType.rrw_drop, "managed", "account", ESqlStatementType.sstSnowflakeDropManagedAccount);
333        addCmd(TBaseType.rrw_drop, "integration", ESqlStatementType.sstSnowflakeDropIntegration);
334        addCmd(TBaseType.rrw_drop, "external", "table", ESqlStatementType.sstSnowflakeDropExternalTable);
335        addCmd(TBaseType.rrw_alter, "stream", ESqlStatementType.sstSnowflakeAlterStream);
336        addCmd(TBaseType.rrw_alter, "procedure", ESqlStatementType.sstSnowflakeAlterProcedure);
337        addCmd(TBaseType.rrw_describe, "external", "table", ESqlStatementType.sstSnowflakeDescribe);
338        addCmd(TBaseType.rrw_describe, "integration", ESqlStatementType.sstSnowflakeDescribe);
339        addCmd(TBaseType.rrw_describe, "security", "integration", ESqlStatementType.sstSnowflakeDescribe);
340        addCmd(TBaseType.rrw_describe, "materialized", "view", ESqlStatementType.sstSnowflakeDescribe);
341        addCmd(TBaseType.rrw_describe, "procedure", ESqlStatementType.sstSnowflakeDescribe);
342        addCmd(TBaseType.rrw_describe, "stream", ESqlStatementType.sstSnowflakeDescribe);
343        addCmd(TBaseType.rrw_describe, "task", ESqlStatementType.sstSnowflakeDescribe);
344        addCmd(TBaseType.rrw_snowflake_desc_short, "external", "table", ESqlStatementType.sstSnowflakeDescribe);
345        addCmd(TBaseType.rrw_snowflake_desc_short, "integration", ESqlStatementType.sstSnowflakeDescribe);
346        addCmd(TBaseType.rrw_snowflake_desc_short, "security", "integration", ESqlStatementType.sstSnowflakeDescribe);
347        addCmd(TBaseType.rrw_snowflake_desc_short, "materialized", "view", ESqlStatementType.sstSnowflakeDescribe);
348        addCmd(TBaseType.rrw_snowflake_desc_short, "procedure", ESqlStatementType.sstSnowflakeDescribe);
349        addCmd(TBaseType.rrw_snowflake_desc_short, "stream", ESqlStatementType.sstSnowflakeDescribe);
350        addCmd(TBaseType.rrw_snowflake_desc_short, "task", ESqlStatementType.sstSnowflakeDescribe);
351        addCmd(TBaseType.rrw_explain, "using", ESqlStatementType.sstSnowflakeExplainUsing);
352        addCmd(TBaseType.rrw_show, "delegated", ESqlStatementType.sstSnowflakeShow);
353        addCmd(TBaseType.rrw_show, "external", ESqlStatementType.sstSnowflakeShow);
354        addCmd(TBaseType.rrw_show, "future", "grants", ESqlStatementType.sstSnowflakeShow);
355        addCmd(TBaseType.rrw_show, "global", "accounts", ESqlStatementType.sstSnowflakeShow);
356        addCmd(TBaseType.rrw_show, "integrations", ESqlStatementType.sstSnowflakeShow);
357        addCmd(TBaseType.rrw_show, "managed", ESqlStatementType.sstSnowflakeShow);
358        addCmd(TBaseType.rrw_show, "materialized", ESqlStatementType.sstSnowflakeShow);
359        addCmd(TBaseType.rrw_show, "notification", ESqlStatementType.sstSnowflakeShow);
360        addCmd(TBaseType.rrw_show, "replication", ESqlStatementType.sstSnowflakeShow);
361
362        // START, TRUNCATE, UNDROP, UNSET, UPDATE, USE
363        addCmd(TBaseType.rrw_start, "transaction", ESqlStatementType.sstbegintran);
364        addCmd(TBaseType.rrw_truncate, ESqlStatementType.sstpostgresqlTruncate);
365        addCmd(TBaseType.rrw_snowflake_undrop, "database", ESqlStatementType.sstUndropDatabase);
366        addCmd(TBaseType.rrw_snowflake_undrop, "schema", ESqlStatementType.sstUndropSchema);
367        addCmd(TBaseType.rrw_snowflake_undrop, "table", ESqlStatementType.sstUndropTable);
368        addCmd(TBaseType.rrw_snowflake_unset, ESqlStatementType.sstunset);
369        addCmd(TBaseType.rrw_update, ESqlStatementType.sstupdate);
370        addCmd(TBaseType.rrw_use, "secondary", "roles", ESqlStatementType.sstUseSecondaryRoles);
371        addCmd(TBaseType.rrw_use, ESqlStatementType.sstUse);
372    }
373
374    @Override
375    protected String getToken1Str(int token1) {
376        // Map vendor-specific token codes to their string representations
377        switch (token1) {
378            case TBaseType.rrw_snowflake_list:
379                return "list";
380            case TBaseType.rrw_snowflake_remove:
381                return "remove";
382            case TBaseType.rrw_snowflake_undrop:
383                return "undrop";
384            case TBaseType.rrw_snowflake_copy:
385                return "copy";
386            case TBaseType.rrw_snowflake_desc:
387                return "desc";
388            case TBaseType.rrw_snowflake_ls:
389                return "ls";
390            case TBaseType.rrw_snowflake_put:
391                return "put";
392            case TBaseType.rrw_snowflake_rm:
393                return "rm";
394            case TBaseType.rrw_snowflake_unset:
395                return "unset";
396            default:
397                return null;
398        }
399    }
400
401    @Override
402    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
403        TCustomSqlStatement ret = null;
404
405        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
406
407        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
408                || (pcst.tokencode == TBaseType.cmtslashstar)
409                || (pcst.tokencode == TBaseType.lexspace)
410                || (pcst.tokencode == TBaseType.lexnewline)
411                || (pcst.tokentype == ETokenType.ttsemicolon)) {
412            return null;
413        }
414
415        int lcpos = pcst.posinlist;
416        TSourceTokenList lcsourcetokenlist = pcst.container;
417        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
418
419        // REFRESH USING contains a complete MERGE or INSERT statement inside
420        // CREATE DYNAMIC TABLE. Keep every nested DML head in the current raw
421        // statement instead of splitting at UPDATE/INSERT/DELETE/SELECT.
422        if ((pcst.tokencode == TBaseType.rrw_with
423                || getStatementTypeForToken(pcst)
424                != ESqlStatementType.sstinvalid)
425                && isInsideDynamicTableRefreshUsing(
426                        pcst, lccurrentsqlstatement)) {
427            return null;
428        }
429
430        // Subquery after semicolon or at first line
431        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) {
432            int k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
433            if (k > 0) {
434                ret = new TSelectSqlStatement(this.vendor);
435            } else {
436                k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_with, 1, "(");
437                int k2 = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_as, 3, "(");
438                if ((k > 0) && (k2 > 2)) {
439                    ret = new TSelectSqlStatement(this.vendor);
440                }
441            }
442            return ret;
443        }
444
445        // WITH name(...) AS PROCEDURE (anonymous procedure call)
446        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
447            TSourceToken t1 = pcst.nextSolidToken(); // name
448            if (t1 != null) {
449                TSourceToken t2 = t1.nextSolidToken(); // ( or AS
450                // Skip past parenthesized parameter list if present: WITH name(...) AS PROCEDURE
451                if (t2 != null && t2.tokentype == ETokenType.ttleftparenthesis) {
452                    int parenDepth = 1;
453                    TSourceToken t = t2.nextSolidToken();
454                    while (t != null && parenDepth > 0) {
455                        if (t.tokentype == ETokenType.ttleftparenthesis) parenDepth++;
456                        else if (t.tokentype == ETokenType.ttrightparenthesis) parenDepth--;
457                        if (parenDepth > 0) t = t.nextSolidToken();
458                    }
459                    if (t != null) t2 = t.nextSolidToken(); // AS after )
460                    else t2 = null;
461                }
462                if (t2 != null && t2.tokencode == TBaseType.rrw_as) {
463                    TSourceToken t3 = t2.nextSolidToken(); // PROCEDURE
464                    if (t3 != null && t3.tokencode == TBaseType.rrw_procedure) {
465                        ret = new TCreateProcedureStmt(this.vendor);
466                        ret.sqlstatementtype = ESqlStatementType.sstcreateprocedure;
467                        return ret;
468                    }
469                }
470            }
471        }
472
473        // CTE
474        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
475            ret = findcte(pcst);
476            if (ret != null) return ret;
477        }
478
479        gnewsqlstatementtype = getStatementTypeForToken(pcst);
480
481        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
482        switch (gnewsqlstatementtype) {
483            case sstinvalid: {
484                ret = null;
485
486                if (pstate == EFindSqlStateType.stnormal) {
487                    if (pcst.tokencode == TBaseType.label_begin) {
488                        ret = new TCommonBlock(this.vendor);
489                        gnewsqlstatementtype = ret.sqlstatementtype;
490                    } else if (pcst.tokencode == TBaseType.rrw_declare) {
491                        ret = new TCommonBlock(this.vendor);
492                        gnewsqlstatementtype = ret.sqlstatementtype;
493                    } else if (pcst.tokencode == TBaseType.rrw_begin) {
494                        ret = new TCommonBlock(this.vendor);
495                        gnewsqlstatementtype = ret.sqlstatementtype;
496                    } else if (pcst.tokencode == TBaseType.rrw_procedure) {
497                        ret = new TPlsqlCreateProcedure(this.vendor);
498                        gnewsqlstatementtype = ret.sqlstatementtype;
499                    } else if (pcst.tokencode == TBaseType.rrw_function) {
500                        ret = new TPlsqlCreateFunction(this.vendor);
501                        gnewsqlstatementtype = ret.sqlstatementtype;
502                    } else if (pcst.tokencode == TBaseType.rrw_package) {
503                        ret = new TPlsqlCreatePackage(this.vendor);
504                        gnewsqlstatementtype = ret.sqlstatementtype;
505                    } else if (pcst.tokencode == TBaseType.rrw_while) {
506                        ret = new TCommonBlock(this.vendor);
507                        gnewsqlstatementtype = ret.sqlstatementtype;
508                    } else if (pcst.tokencode == TBaseType.rrw_for) {
509                        ret = new TCommonBlock(this.vendor);
510                        gnewsqlstatementtype = ret.sqlstatementtype;
511                    } else if (pcst.tokencode == TBaseType.rrw_loop) {
512                        ret = new TCommonBlock(this.vendor);
513                        gnewsqlstatementtype = ret.sqlstatementtype;
514                    } else if (pcst.tokencode == TBaseType.rrw_if) {
515                        ret = new TCommonBlock(this.vendor);
516                        gnewsqlstatementtype = ret.sqlstatementtype;
517                    } else if (pcst.tokencode == TBaseType.ident) {
518                        // Standalone variable assignment: IDENT := value;
519                        TSourceToken nextToken = pcst.nextSolidToken();
520                        if (nextToken != null && (nextToken.tokencode == TBaseType.assign_sign
521                                || nextToken.tokencode == '=')) {
522                            ret = new TAssignStmt(this.vendor);
523                            gnewsqlstatementtype = ESqlStatementType.sst_assignstmt;
524                        }
525                    }
526                }
527                break;
528            }
529            case sstselect: {
530                boolean lcisnewsql = true;
531
532                if (pstate != EFindSqlStateType.stnormal) {
533                    if (lcprevsolidtoken != null) {
534                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
535                            lcisnewsql = false; // subquery
536                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
537                            lcisnewsql = false;
538                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
539                            lcisnewsql = false;
540                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
541                            lcisnewsql = false;
542                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
543                            lcisnewsql = false;
544                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
545                            lcisnewsql = false;
546                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
547                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
548                                lcisnewsql = false;
549                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
550                                lcisnewsql = false;
551                        }
552
553                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
554                            TSourceToken lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
555                            if (lcpprevsolidtoken != null) {
556                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
557                                    lcisnewsql = false;
558                            }
559                        }
560                    }
561
562                    if (lccurrentsqlstatement != null) {
563                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
564                            lcisnewsql = false;
565                    }
566                }
567
568                if (lcisnewsql)
569                    ret = new TSelectSqlStatement(this.vendor);
570
571                break;
572            }
573            case sstinsert: {
574                boolean lcisnewsql = true;
575                if (pstate != EFindSqlStateType.stnormal) {
576                    if (lccurrentsqlstatement != null) {
577                    }
578                }
579
580                if (lcisnewsql)
581                    ret = new TInsertSqlStatement(this.vendor);
582
583                break;
584            }
585            case sstupdate: {
586                boolean lcisnewsql = true;
587                if (pstate != EFindSqlStateType.stnormal) {
588                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
589                    if (lcprevsolidtoken != null) {
590                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
591                            lcisnewsql = false;
592                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
593                            lcisnewsql = false;
594                    }
595
596                    TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
597                    if (lcnextsolidtoken != null) {
598                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
599                            int k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
600                            if (k == 0) lcisnewsql = false;
601                        }
602                    }
603
604                    if (lccurrentsqlstatement != null) {
605                    }
606                }
607
608                if (lcisnewsql) {
609                    ret = new TUpdateSqlStatement(this.vendor);
610                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
611                }
612                break;
613            }
614            case sstdelete: {
615                boolean lcisnewsql = true;
616
617                if (pstate != EFindSqlStateType.stnormal) {
618                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
619                    if (lcprevsolidtoken != null) {
620                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
621                            lcisnewsql = false;
622                    }
623
624                    if (lccurrentsqlstatement != null) {
625                    }
626                }
627
628                if (lcisnewsql)
629                    ret = new TDeleteSqlStatement(this.vendor);
630
631                break;
632            }
633            case sstmerge: {
634                ret = new TMergeSqlStatement(this.vendor);
635                ret.sqlstatementtype = gnewsqlstatementtype;
636                break;
637            }
638            case sstoraclecommit: {
639                ret = new TUnknownSqlStatement(this.vendor);
640                ret.sqlstatementtype = gnewsqlstatementtype;
641                break;
642            }
643            case sstoraclerollback: {
644                ret = new TUnknownSqlStatement(this.vendor);
645                ret.sqlstatementtype = gnewsqlstatementtype;
646                break;
647            }
648            case sstoraclerevoke: {
649                ret = new TUnknownSqlStatement(this.vendor);
650                ret.sqlstatementtype = gnewsqlstatementtype;
651                break;
652            }
653            case sstoraclegrant: {
654                ret = new TUnknownSqlStatement(this.vendor);
655                ret.sqlstatementtype = gnewsqlstatementtype;
656                break;
657            }
658            case sstcreatetable: {
659                ret = new TCreateTableSqlStatement(this.vendor);
660                break;
661            }
662            case sstoraclecreateview: {
663                ret = new TCreateViewSqlStatement(this.vendor);
664                break;
665            }
666            case sstAlterAccount: {
667                ret = new TAlterAccountStmt(this.vendor);
668                break;
669            }
670            case sstalterdatabase: {
671                ret = new TAlterDatabaseStmt(this.vendor);
672                break;
673            }
674            case sstAlterFileFormat: {
675                ret = new TAlterFileFormatStmt(this.vendor);
676                break;
677            }
678            case sstalterfunction: {
679                ret = new TAlterFunctionStmt(this.vendor);
680                break;
681            }
682            case sstAlterNetworkPolicy: {
683                ret = new TAlterNetworkPolicyStmt(this.vendor);
684                break;
685            }
686            case sstAlterPipe: {
687                ret = new TAlterPipeStmt(this.vendor);
688                break;
689            }
690            case sstAlterResourceMonitor: {
691                ret = new TAlterResourceMonitorStmt(this.vendor);
692                break;
693            }
694            case sstAlterRole: {
695                ret = new TAlterRoleStmt(this.vendor);
696                break;
697            }
698            case sstAlterSchema: {
699                ret = new TAlterSchemaStmt(this.vendor);
700                break;
701            }
702            case sstaltersequence: {
703                ret = new TAlterSequenceStatement(this.vendor);
704                break;
705            }
706            case sstaltersession: {
707                ret = new TAlterSessionStatement(this.vendor);
708                break;
709            }
710            case sstAlterStage: {
711                ret = new TAlterStageStmt(this.vendor);
712                break;
713            }
714            case sstalteruser: {
715                ret = new TAlterUserStmt(this.vendor);
716                break;
717            }
718            case sstAlterShare: {
719                ret = new TAlterShareStmt(this.vendor);
720                break;
721            }
722            case sstalterview: {
723                ret = new TAlterViewStatement(this.vendor);
724                break;
725            }
726            case sstAlterWarehouse: {
727                ret = new TAlterWarehouseStmt(this.vendor);
728                break;
729            }
730            case sstBegin: {
731                // Distinguish BEGIN...END scripting block from BEGIN [name] transaction.
732                // Pre-processing already converts BEGIN; to rrw_snowflake_begin_transaction.
733                // BEGIN WORK/TRANSACTION/NAME are handled by sstbegintran via addCmd.
734                // Remaining cases: BEGIN <ident> (transaction with name) vs BEGIN <keyword> (block).
735                boolean isblock = false;
736                TSourceToken firstSolid = null;
737
738                if (lcpos < lcsourcetokenlist.size() - 1) {
739                    for (int i = lcpos + 1; i < lcsourcetokenlist.size(); i++) {
740                        TSourceToken st = lcsourcetokenlist.get(i);
741                        if (st.issolidtoken()) {
742                            if (firstSolid == null) {
743                                firstSolid = st;
744                            }
745                        }
746                        // Newline before first semicolon means multiline block
747                        if (st.tokencode == TBaseType.lexnewline) {
748                            isblock = true;
749                            break;
750                        }
751                        if (st.tokencode == ';') {
752                            break;
753                        }
754                    }
755                }
756
757                // If no newline found, check if the first solid token is a keyword.
758                // Transaction names are identifiers (BEGIN my_txn;), not keywords.
759                // If it's a keyword (RETURN, SELECT, IF, LOOP, etc.), it's a block.
760                if (!isblock && firstSolid != null && firstSolid.tokencode != TBaseType.ident) {
761                    isblock = true;
762                }
763
764                if (isblock) {
765                    ret = new TCommonBlock(this.vendor);
766                    gnewsqlstatementtype = ret.sqlstatementtype;
767                } else {
768                    ret = new TBeginTran(this.vendor);
769                    pcst.tokencode = TBaseType.rrw_snowflake_begin_transaction;
770                }
771
772                break;
773            }
774            case sstbegintran: {
775                ret = new TBeginTran(this.vendor);
776                if (pcst.tokencode == TBaseType.rrw_begin) {
777                    pcst.tokencode = TBaseType.rrw_snowflake_begin_transaction;
778                }
779                break;
780            }
781            case sstcomment: {
782                ret = new TCommentOnSqlStmt(this.vendor);
783                break;
784            }
785            case sstcommit: {
786                ret = new TCommitStmt(this.vendor);
787                break;
788            }
789            case sstCopyInto: {
790                ret = new TSnowflakeCopyIntoStmt(this.vendor);
791                break;
792            }
793            case sstcreatedatabase: {
794                ret = new TCreateDatabaseSqlStatement(this.vendor);
795                break;
796            }
797            case sstCreateFileFormat: {
798                ret = new TCreateFileFormatStmt(this.vendor);
799                break;
800            }
801            case sstcreatefunction: {
802                ret = new TCreateFunctionStmt(this.vendor);
803                break;
804            }
805            case sstCreateAggregationPolicy: {
806                ret = new TCreateAggregationPolicyStmt(this.vendor);
807                break;
808            }
809            case sstCreateJoinPolicy: {
810                ret = new TCreateJoinPolicyStmt(this.vendor);
811                break;
812            }
813            case sstCreateMaskingPolicy: {
814                ret = new TCreateMaskingPolicyStmt(this.vendor);
815                break;
816            }
817            case sstCreateNetworkPolicy: {
818                ret = new TCreateNetworkPolicyStmt(this.vendor);
819                break;
820            }
821            case sstCreateProjectionPolicy: {
822                ret = new TCreateProjectionPolicyStmt(this.vendor);
823                break;
824            }
825            case sstCreateRowAccessPolicy: {
826                ret = new TCreateRowAccessPolicyStmt(this.vendor);
827                break;
828            }
829            case sstCreateTag: {
830                ret = new TCreateTagStmt(this.vendor);
831                break;
832            }
833            case sstCreatePipe: {
834                ret = new TCreatePipeStmt(this.vendor);
835                break;
836            }
837            case sstCreateResourceMonitor: {
838                ret = new TCreateResourceMonitorStmt(this.vendor);
839                break;
840            }
841            case sstcreaterole: {
842                ret = new TCreateRoleStmt(this.vendor);
843                break;
844            }
845            case sstcreateschema: {
846                ret = new TCreateSchemaSqlStatement(this.vendor);
847                break;
848            }
849            case sstcreatesequence: {
850                ret = new TCreateSequenceStmt(this.vendor);
851                break;
852            }
853            case sstCreateShare: {
854                ret = new TCreateShareStmt(this.vendor);
855                break;
856            }
857            case sstCreateStage: {
858                ret = new TCreateStageStmt(this.vendor);
859                break;
860            }
861            case sstcreateuser: {
862                ret = new TCreateUserStmt(this.vendor);
863                break;
864            }
865            case sstCreateWarehouse: {
866                ret = new TCreateWarehouseStmt(this.vendor);
867                break;
868            }
869            case sstDescFileFormat:
870            case sstDescFunction:
871            case sstDescNetworkPolicy:
872            case sstDescPipe:
873            case sstDescResult:
874            case sstDescShare:
875            case sstDescStage:
876            case sstDescTable:
877            case sstDescUser:
878            case sstDescView:
879            case sstDescStorage:
880            case sstDescSchema:
881            case sstDescDatabase: {
882                ret = new TDescribeStmt(this.vendor);
883                break;
884            }
885            case sstdropfunction: {
886                ret = new TDropFunctionStmt(this.vendor);
887                break;
888            }
889            case sstdropdatabase: {
890                ret = new TDropDatabaseStmt(this.vendor);
891                break;
892            }
893            case sstDropFileFormat: {
894                ret = new TDropStmt(this.vendor);
895                ret.sqlstatementtype = gnewsqlstatementtype;
896                break;
897            }
898            case sstDropNetworkPolicy: {
899                ret = new TDropStmt(this.vendor);
900                ret.sqlstatementtype = gnewsqlstatementtype;
901                break;
902            }
903            case sstDropPipe: {
904                ret = new TDropStmt(this.vendor);
905                ret.sqlstatementtype = gnewsqlstatementtype;
906                break;
907            }
908            case sstDropResourceMonitor: {
909                ret = new TDropStmt(this.vendor);
910                ret.sqlstatementtype = gnewsqlstatementtype;
911                break;
912            }
913            case sstdroprole: {
914                ret = new TDropRoleStmt(this.vendor);
915                break;
916            }
917            case sstdropschema: {
918                ret = new TDropSchemaSqlStatement(this.vendor);
919                break;
920            }
921            case sstDropShare: {
922                ret = new TDropStmt(this.vendor);
923                ret.sqlstatementtype = gnewsqlstatementtype;
924                break;
925            }
926            case sstDropStage: {
927                ret = new TDropStmt(this.vendor);
928                ret.sqlstatementtype = gnewsqlstatementtype;
929                break;
930            }
931            case sstdroptable: {
932                ret = new TDropTableSqlStatement(this.vendor);
933                break;
934            }
935            case sstdropuser: {
936                ret = new TDropUserStmt(this.vendor);
937                break;
938            }
939            case sstdropview: {
940                ret = new TDropViewSqlStatement(this.vendor);
941                break;
942            }
943            case sstDropWarehouse: {
944                ret = new TDropStmt(this.vendor);
945                ret.sqlstatementtype = gnewsqlstatementtype;
946                break;
947            }
948            case sstGet: {
949                ret = new TGetStmt(this.vendor);
950                break;
951            }
952            case sstGrant: {
953                ret = new TGrantStmt(this.vendor);
954                break;
955            }
956            case sstList: {
957                ret = new TListStmt(this.vendor);
958                break;
959            }
960            case sstPut: {
961                ret = new TPutStmt(this.vendor);
962                break;
963            }
964            case sstRemove: {
965                ret = new TRemoveStmt(this.vendor);
966                break;
967            }
968            case sstRevoke: {
969                ret = new TRevokeStmt(this.vendor);
970                break;
971            }
972            case sstrollback: {
973                ret = new TRollbackStmt(this.vendor);
974                break;
975            }
976            case sstset: {
977                ret = new TSetStmt(this.vendor);
978                break;
979            }
980            case sstShowColumns:
981            case sstShowDatabases:
982            case sstShowFileFormats:
983            case sstShowFunctions:
984            case sstShowGrants:
985            case sstShowNetworkPolicies:
986            case sstShowObjects:
987            case sstShowParameters:
988            case sstShowPipes:
989            case sstShowResourceMonitors:
990            case sstShowRoles:
991            case sstShowSchemas:
992            case sstShowSequences:
993            case sstShowShares:
994            case sstShowStages:
995            case sstShowTables:
996            case sstShowTransactions:
997            case sstShowUserFunctions:
998            case sstShowUsers:
999            case sstShowVariables:
1000            case sstShowViews:
1001            case sstShowWarehouses:
1002            case sstShowProcedures:
1003            case sstShowTasks:
1004            case sstShowStreams: {
1005                ret = new TShowStmt(this.vendor);
1006                ret.sqlstatementtype = gnewsqlstatementtype;
1007                break;
1008            }
1009            case sstTruncate: {
1010                ret = new TTruncateStatement(this.vendor);
1011                break;
1012            }
1013            case sstUndropDatabase:
1014            case sstUndropSchema:
1015            case sstUndropTable: {
1016                ret = new TUndropStmt(this.vendor);
1017                ret.sqlstatementtype = gnewsqlstatementtype;
1018                break;
1019            }
1020            case sstunset: {
1021                ret = new TUnsetStmt(this.vendor);
1022                break;
1023            }
1024            case sstcreatematerializedview: {
1025                ret = new TCreateMaterializedSqlStatement(this.vendor);
1026                break;
1027            }
1028            case sstoraclecreateindex: {
1029                ret = new TCreateIndexSqlStatement(this.vendor);
1030                break;
1031            }
1032            case sstoracledroptable: {
1033                ret = new TDropTableSqlStatement(this.vendor);
1034                break;
1035            }
1036            case sstoracledropview: {
1037                ret = new TDropViewSqlStatement(this.vendor);
1038                break;
1039            }
1040            case sstoracledropindex: {
1041                ret = new TDropIndexSqlStatement(this.vendor);
1042                break;
1043            }
1044            case sstaltertable: {
1045                ret = new TAlterTableStatement(this.vendor);
1046                break;
1047            }
1048            case sstoraclealtersession: {
1049                ret = new TAlterSessionStatement(this.vendor);
1050                break;
1051            }
1052            case sstplsql_createfunction: {
1053                ret = new TPlsqlCreateFunction(this.vendor);
1054                ret.sqlstatementtype = gnewsqlstatementtype;
1055                break;
1056            }
1057            case sstCommentOn: {
1058                ret = new TCommentOnSqlStmt(this.vendor);
1059                break;
1060            }
1061            case sstoraclecreatesequence: {
1062                ret = new TCreateSequenceStmt(this.vendor);
1063                break;
1064            }
1065            case sstpostgresqlCreateIndex:
1066                ret = new TCreateIndexSqlStatement(this.vendor);
1067                break;
1068            case sstpostgresqlCreateView:
1069                ret = new TCreateViewSqlStatement(this.vendor);
1070                break;
1071            case sstpostgresqlCreateFunction:
1072                ret = new TCreateFunctionStmt(this.vendor);
1073                break;
1074            case sstpostgresqlTruncate:
1075                ret = new TTruncateStatement(this.vendor);
1076                break;
1077            case sstpostgresqlDropTable:
1078                ret = new TDropTableSqlStatement(this.vendor);
1079                break;
1080            case sstcreateview:
1081                ret = new TCreateViewSqlStatement(this.vendor);
1082                break;
1083            case sstcall:
1084                ret = new TCallStatement(this.vendor);
1085                break;
1086            case sstSnowflakePseudoExprStmt:
1087                ret = new TPseudoExprStmt(this.vendor);
1088                break;
1089            case sstcreateprocedure:
1090                ret = new TCreateProcedureStmt(this.vendor);
1091                break;
1092            case sstCreateStream:
1093                ret = new TCreateStreamStmt(this.vendor);
1094                break;
1095            case sstUse:
1096                TSourceToken lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
1097                if (lcnextsolidtoken != null) {
1098                    if (lcnextsolidtoken.toString().equalsIgnoreCase("database")) {
1099                        ret = new TUseDatabase(this.vendor);
1100                    } else if (lcnextsolidtoken.toString().equalsIgnoreCase("role")) {
1101                        ret = new TUseRole(this.vendor);
1102                    } else if (lcnextsolidtoken.toString().equalsIgnoreCase("warehouse")) {
1103                        ret = new TUseWarehouse(this.vendor);
1104                        // non-identifier-compare: keyword token text, not a db object name
1105                    } else if (lcnextsolidtoken.toString().equalsIgnoreCase("schema")) {
1106                        ret = new TUseSchema(this.vendor);
1107                    } else {
1108                        // MantisBT 4677 — bare USE <name>, no object keyword.
1109                        // Snowflake makes BOTH keywords optional, so the form is
1110                        // decided by qualification. The rule lives in exactly one
1111                        // place (SnowflakeUseTarget) because the grammar action
1112                        // must reach the same verdict from the same evidence; two
1113                        // hand-kept copies drifted apart twice during this fix.
1114                        ret = SnowflakeUseTarget.of(lcsourcetokenlist, lcpos) == SnowflakeUseTarget.SCHEMA
1115                                ? new TUseSchema(this.vendor)
1116                                : new TUseDatabase(this.vendor);
1117                    }
1118                } else {
1119                    ret = new TUnknownSqlStatement(this.vendor);
1120                    ret.sqlstatementtype = gnewsqlstatementtype;
1121                }
1122                break;
1123            case sstExecute: {
1124                ret = new TExecuteSqlStatement(this.vendor);
1125                break;
1126            }
1127            case sstAlterTask:
1128                ret = new TAlterTaskStmt(this.vendor);
1129                break;
1130            case sstAlterDynamicTable:
1131                ret = new TAlterDynamicTableStmt(this.vendor);
1132                break;
1133            case sstCreateTask:
1134                ret = new TCreateTaskStmt(this.vendor);
1135                break;
1136            case sstcreatesemanticview:
1137                ret = new TCreateSemanticViewStmt(this.vendor);
1138                break;
1139            case sstAlterMaterializedView:
1140                ret = new TAlterMaterializedViewStmt(this.vendor);
1141                break;
1142            case sstDropMaterializedView:
1143                ret = new TDropMaterializedViewStmt(this.vendor);
1144                break;
1145            case sstdropprocedure:
1146                ret = new TDropProcedureStmt(this.vendor);
1147                break;
1148            case sstUseSecondaryRoles:
1149                ret = new TUseSecondaryRolesStmt(this.vendor);
1150                break;
1151            case sstDropStreamlit:
1152                ret = new TDropStmt(this.vendor);
1153                break;
1154            case sstDropStream:
1155                ret = new TDropStreamStmt(this.vendor);
1156                break;
1157            case sstDropTask:
1158                ret = new TDropTaskStmt(this.vendor);
1159                break;
1160            default: {
1161                ret = new TUnknownSqlStatement(this.vendor);
1162                ret.sqlstatementtype = gnewsqlstatementtype;
1163                break;
1164            }
1165        }
1166
1167        return ret;
1168    }
1169
1170    private boolean isInsideDynamicTableRefreshUsing(TSourceToken token,
1171            TCustomSqlStatement currentStatement) {
1172        if (currentStatement == null
1173                || currentStatement.sqlstatementtype
1174                != ESqlStatementType.sstcreatetable) {
1175            return false;
1176        }
1177
1178        int parenthesisDepth = 0;
1179        for (TSourceToken current = token.prevSolidToken(); current != null;
1180                current = current.prevSolidToken()) {
1181            if (current.tokentype == ETokenType.ttrightparenthesis) {
1182                parenthesisDepth++;
1183            } else if (current.tokentype == ETokenType.ttleftparenthesis) {
1184                if (parenthesisDepth > 0) {
1185                    parenthesisDepth--;
1186                    continue;
1187                }
1188
1189                TSourceToken usingToken = current.prevSolidToken();
1190                TSourceToken refreshToken = usingToken == null
1191                        ? null : usingToken.prevSolidToken();
1192                if (usingToken != null
1193                        && usingToken.tokencode == TBaseType.rrw_using
1194                        && refreshToken != null
1195                        && refreshToken.tokencode == TBaseType.rrw_refresh) {
1196                    return true;
1197                }
1198            } else if (current.tokentype == ETokenType.ttsemicolon
1199                    && parenthesisDepth == 0) {
1200                return false;
1201            }
1202        }
1203        return false;
1204    }
1205}