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