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