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