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}