001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005
006/**
007 * StarRocks SQL command resolver.
008 * Handles StarRocks-specific statement detection and command resolution.
009 *
010 * StarRocks is a fork of Apache Doris (from 2020) and maintains MySQL protocol
011 * compatibility. This extends Doris commands with StarRocks-specific additions
012 * such as external catalogs, async materialized views, and SUBMIT TASK.
013 *
014 * @since 4.0.2.0
015 */
016public class TSqlCmdsStarrocks extends AbstractSqlCmds {
017
018    public TSqlCmdsStarrocks() {
019        super(EDbVendor.dbvstarrocks);
020    }
021
022    @Override
023    protected void initializeCommands() {
024        // Standard SQL commands (SELECT, INSERT, UPDATE, DELETE)
025        addCmd(TBaseType.rrw_select, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstselect);
026        addCmd(TBaseType.rrw_insert, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstinsert);
027        addCmd(TBaseType.rrw_update, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstupdate);
028        addCmd(TBaseType.rrw_delete, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstdelete);
029
030        // Pipe query support (FROM table |> SELECT ... or TABLE name |> SELECT ...)
031        addCmd(TBaseType.rrw_from, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstselect);
032        addCmd(TBaseType.rrw_table, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstselect);
033
034        // MERGE INTO (StarRocks supports this)
035        addCmd(TBaseType.rrw_merge, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmerge);
036
037        // CREATE statements
038        addCmd(TBaseType.rrw_create, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatedatabase);
039        addCmd(TBaseType.rrw_create, "schema", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatedatabase);
040        addCmd(TBaseType.rrw_create, "external", "table", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
041        addCmd(TBaseType.rrw_create, "external", "catalog", " ", " ", " ", " ", ESqlStatementType.sstunknown);
042        addCmd(TBaseType.rrw_create, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
043        addCmd(TBaseType.rrw_create, "temporary", "table", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
044        addCmd(TBaseType.rrw_create, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstcreateview);
045        addCmd(TBaseType.rrw_create, "or", "replace", "view", " ", " ", " ", ESqlStatementType.sstcreateview);
046        addCmd(TBaseType.rrw_create, "materialized", "view", " ", " ", " ", " ", ESqlStatementType.sstcreatematerializedview);
047        addCmd(TBaseType.rrw_create, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
048        addCmd(TBaseType.rrw_create, "unique", "index", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
049        addCmd(TBaseType.rrw_create, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateuser);
050        addCmd(TBaseType.rrw_create, "or", "replace", "global", "aggregate", "function", " ", ESqlStatementType.sstmysqlcreatefunction);
051        addCmd(TBaseType.rrw_create, "or", "replace", "global", "table", "function", " ", ESqlStatementType.sstmysqlcreatefunction);
052        addCmd(TBaseType.rrw_create, "or", "replace", "global", "function", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
053        addCmd(TBaseType.rrw_create, "or", "replace", "aggregate", "function", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
054        addCmd(TBaseType.rrw_create, "or", "replace", "table", "function", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
055        addCmd(TBaseType.rrw_create, "or", "replace", "function", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
056        addCmd(TBaseType.rrw_create, "global", "aggregate", "function", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
057        addCmd(TBaseType.rrw_create, "global", "table", "function", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
058        addCmd(TBaseType.rrw_create, "global", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
059        addCmd(TBaseType.rrw_create, "aggregate", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
060        addCmd(TBaseType.rrw_create, "table", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
061        addCmd(TBaseType.rrw_create, "function", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
062        addCmd(TBaseType.rrw_create, "procedure", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateprocedure);
063        addCmd(TBaseType.rrw_create, "role", " ", " ", " ", " ", " ", ESqlStatementType.sstunknown);
064        addCmd(TBaseType.rrw_create, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksCreateRoutineLoad);
065        addCmd(TBaseType.rrw_create, "resource", "group", " ", " ", " ", " ", ESqlStatementType.sststarrocksCreateResourceGroup);
066        addCmd(TBaseType.rrw_create, "storage", "volume", " ", " ", " ", " ", ESqlStatementType.sststarrocksCreateStorageVolume);
067
068        // Routine Load management statements
069        addCmd(TBaseType.rrw_pause, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksPauseRoutineLoad);
070        addCmd(TBaseType.rrw_resume, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksResumeRoutineLoad);
071        addCmd(TBaseType.rrw_stop, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksStopRoutineLoad);
072
073        // SUBMIT TASK (asynchronous ETL jobs)
074        addCmd(TBaseType.rrw_submit, "task", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksSubmitTask);
075
076        // ALTER statements
077        addCmd(TBaseType.rrw_alter, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterdatabase);
078        addCmd(TBaseType.rrw_alter, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstaltertable);
079        addCmd(TBaseType.rrw_alter, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterview);
080        addCmd(TBaseType.rrw_alter, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmssqlalteruser);
081        addCmd(TBaseType.rrw_alter, "materialized", "view", " ", " ", " ", " ", ESqlStatementType.sstAlterMaterializedView);
082        addCmd(TBaseType.rrw_alter, "catalog", " ", " ", " ", " ", " ", ESqlStatementType.sstunknown);
083        addCmd(TBaseType.rrw_alter, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksAlterRoutineLoad);
084        addCmd(TBaseType.rrw_alter, "resource", "group", " ", " ", " ", " ", ESqlStatementType.sststarrocksAlterResourceGroup);
085        addCmd(TBaseType.rrw_alter, "storage", "volume", " ", " ", " ", " ", ESqlStatementType.sststarrocksAlterStorageVolume);
086
087        // DROP statements
088        addCmd(TBaseType.rrw_drop, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropdatabase);
089        addCmd(TBaseType.rrw_drop, "schema", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropdatabase);
090        addCmd(TBaseType.rrw_drop, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptable);
091        addCmd(TBaseType.rrw_drop, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptable);
092        addCmd(TBaseType.rrw_drop, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstdropview);
093        addCmd(TBaseType.rrw_drop, "materialized", "view", " ", " ", " ", " ", ESqlStatementType.sstDropMaterializedView);
094        addCmd(TBaseType.rrw_drop, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropindex);
095        addCmd(TBaseType.rrw_drop, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropuser);
096        addCmd(TBaseType.rrw_drop, "global", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqldropfunction);
097        addCmd(TBaseType.rrw_drop, "function", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropfunction);
098        addCmd(TBaseType.rrw_drop, "procedure", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropprocedure);
099        addCmd(TBaseType.rrw_drop, "catalog", " ", " ", " ", " ", " ", ESqlStatementType.sstunknown);
100        addCmd(TBaseType.rrw_drop, "role", " ", " ", " ", " ", " ", ESqlStatementType.sstunknown);
101        addCmd(TBaseType.rrw_drop, "task", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksDropTask);
102        addCmd(TBaseType.rrw_drop, "resource", "group", " ", " ", " ", " ", ESqlStatementType.sststarrocksDropResourceGroup);
103        addCmd(TBaseType.rrw_drop, "storage", "volume", " ", " ", " ", " ", ESqlStatementType.sststarrocksDropStorageVolume);
104
105        // TRUNCATE
106        addCmd(TBaseType.rrw_truncate, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqltruncate);
107        addCmd(TBaseType.rrw_truncate, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqltruncate);
108
109        // Stream Load Transaction control (transactional bulk loading)
110        // NOTE: More specific patterns must come BEFORE generic patterns
111        addCmd(TBaseType.rrw_begin, "load", "transaction", " ", " ", " ", " ", ESqlStatementType.sststarrocksBeginLoadTransaction);
112        addCmd(TBaseType.rrw_commit, "load", "transaction", " ", " ", " ", " ", ESqlStatementType.sststarrocksCommitLoadTransaction);
113        // ROLLBACK LOAD TRANSACTION for abort operations
114        addCmd(TBaseType.rrw_rollback, "load", "transaction", " ", " ", " ", " ", ESqlStatementType.sststarrocksAbortLoadTransaction);
115        addCmd(TBaseType.rrw_show, "load", "transaction", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowLoadTransaction);
116
117        // Transaction control (generic - must come AFTER specific load transaction patterns)
118        addCmd(TBaseType.rrw_begin, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlstarttransaction);
119        addCmd(TBaseType.rrw_commit, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcommit);
120        addCmd(TBaseType.rrw_rollback, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrollback);
121
122        // SHOW FUNCTIONS statements
123        addCmd(TBaseType.rrw_show, "full", "builtin", "functions", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
124        addCmd(TBaseType.rrw_show, "full", "global", "functions", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
125        addCmd(TBaseType.rrw_show, "full", "functions", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
126        addCmd(TBaseType.rrw_show, "builtin", "functions", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
127        addCmd(TBaseType.rrw_show, "global", "functions", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
128        addCmd(TBaseType.rrw_show, "functions", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowFunctions);
129
130        // SHOW statements (StarRocks supports many SHOW commands)
131        addCmd(TBaseType.rrw_show, "databases", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowdatabases);
132        addCmd(TBaseType.rrw_show, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtables);
133        addCmd(TBaseType.rrw_show, "full", "tables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtables);
134        addCmd(TBaseType.rrw_show, "columns", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcolumns);
135        addCmd(TBaseType.rrw_show, "full", "columns", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcolumns);
136        addCmd(TBaseType.rrw_show, "create", "database", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreatedatabase);
137        addCmd(TBaseType.rrw_show, "create", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreatetable);
138        addCmd(TBaseType.rrw_show, "create", "view", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreateview);
139        addCmd(TBaseType.rrw_show, "create", "materialized", "view", " ", " ", ESqlStatementType.sstmysqlshow);
140        addCmd(TBaseType.rrw_show, "materialized", "views", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
141        addCmd(TBaseType.rrw_show, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
142        addCmd(TBaseType.rrw_show, "indexes", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
143        addCmd(TBaseType.rrw_show, "status", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowstatus);
144        addCmd(TBaseType.rrw_show, "table", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtablestatus);
145        addCmd(TBaseType.rrw_show, "variables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
146        addCmd(TBaseType.rrw_show, "global", "variables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
147        addCmd(TBaseType.rrw_show, "session", "variables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
148        addCmd(TBaseType.rrw_show, "warnings", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowwarnings);
149        addCmd(TBaseType.rrw_show, "errors", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowerrors);
150        addCmd(TBaseType.rrw_show, "processlist", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprocesslist);
151        addCmd(TBaseType.rrw_show, "full", "processlist", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprocesslist);
152        addCmd(TBaseType.rrw_show, "grants", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowgrants);
153        addCmd(TBaseType.rrw_show, "partitions", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
154        addCmd(TBaseType.rrw_show, "data", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
155        addCmd(TBaseType.rrw_show, "catalogs", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
156        addCmd(TBaseType.rrw_show, "backends", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
157        addCmd(TBaseType.rrw_show, "frontends", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
158        addCmd(TBaseType.rrw_show, "tablet", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
159        addCmd(TBaseType.rrw_show, "tablets", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
160        addCmd(TBaseType.rrw_show, "broker", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
161        addCmd(TBaseType.rrw_show, "brokers", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
162        addCmd(TBaseType.rrw_show, "resources", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshow);
163        addCmd(TBaseType.rrw_show, "routine", "load", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowRoutineLoad);
164        addCmd(TBaseType.rrw_show, "all", "routine", "load", " ", " ", " ", ESqlStatementType.sststarrocksShowRoutineLoad);
165        addCmd(TBaseType.rrw_show, "export", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowExport);
166        addCmd(TBaseType.rrw_show, "resource", "group", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowResourceGroup);
167        addCmd(TBaseType.rrw_show, "resource", "groups", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowResourceGroup);
168        addCmd(TBaseType.rrw_show, "storage", "volumes", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowStorageVolume);
169
170        // DESC STORAGE VOLUME
171        addCmd(TBaseType.rrw_describe, "storage", "volume", " ", " ", " ", " ", ESqlStatementType.sststarrocksDescStorageVolume);
172
173        // EXPORT and CANCEL EXPORT
174        addCmd(TBaseType.rrw_export, "table", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksExport);
175        addCmd(TBaseType.rrw_cancel, "export", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCancelExport);
176
177        // BACKUP SNAPSHOT and REPOSITORY statements
178        addCmd(TBaseType.rrw_backup, " ", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksBackup);
179        addCmd(TBaseType.rrw_backup, "database", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksBackup);
180        addCmd(TBaseType.rrw_backup, "snapshot", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksBackup);
181        addCmd(TBaseType.rrw_create, "repository", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCreateRepository);
182        addCmd(TBaseType.rrw_create, "read", "only", "repository", " ", " ", " ", ESqlStatementType.sststarrocksCreateRepository);
183        addCmd(TBaseType.rrw_drop, "repository", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksDropRepository);
184
185        // RESTORE SNAPSHOT and related statements
186        addCmd(TBaseType.rrw_restore, " ", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksRestore);
187        addCmd(TBaseType.rrw_restore, "snapshot", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksRestore);
188
189        // SHOW BACKUP/RESTORE/SNAPSHOT statements
190        addCmd(TBaseType.rrw_show, "backup", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowBackup);
191        addCmd(TBaseType.rrw_show, "restore", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowRestore);
192        addCmd(TBaseType.rrw_show, "snapshot", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowSnapshot);
193
194        // CANCEL BACKUP/RESTORE statements
195        addCmd(TBaseType.rrw_cancel, "backup", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCancelBackup);
196        addCmd(TBaseType.rrw_cancel, "restore", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCancelRestore);
197
198        // CACHE SELECT statement
199        addCmd(TBaseType.rrw_cache, "select", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCacheSelect);
200
201        // DICTIONARY statements
202        addCmd(TBaseType.rrw_create, "dictionary", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksCreateDictionary);
203        addCmd(TBaseType.rrw_drop, "dictionary", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksDropDictionary);
204        addCmd(TBaseType.rrw_refresh, "dictionary", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksRefreshDictionary);
205        addCmd(TBaseType.rrw_cancel, "refresh", "dictionary", " ", " ", " ", " ", ESqlStatementType.sststarrocksRefreshDictionary);
206        addCmd(TBaseType.rrw_show, "dictionary", " ", " ", " ", " ", " ", ESqlStatementType.sststarrocksShowDictionary);
207
208        // SET statements
209        addCmd(TBaseType.rrw_set, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
210        addCmd(TBaseType.rrw_set, "global", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
211        addCmd(TBaseType.rrw_set, "session", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
212        addCmd(TBaseType.rrw_set, "catalog", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
213
214        // USE statement
215        addCmd(TBaseType.rrw_use, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqluse);
216
217        // DESCRIBE/DESC
218        addCmd(TBaseType.rrw_describe, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstdescribe);
219
220        // EXPLAIN
221        addCmd(TBaseType.rrw_explain, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstExplain);
222
223        // GRANT/REVOKE
224        addCmd(TBaseType.rrw_grant, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlgrant);
225        addCmd(TBaseType.rrw_revoke, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrevoke);
226
227        // LOAD DATA (StarRocks supports various load methods)
228        addCmd(TBaseType.rrw_load, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlloaddatainfile);
229        addCmd(TBaseType.rrw_load, "label", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlloaddatainfile);
230
231        // ANALYZE TABLE/DATABASE
232        addCmd(TBaseType.rrw_analyze, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
233        addCmd(TBaseType.rrw_analyze, "full", "table", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
234        addCmd(TBaseType.rrw_analyze, "sample", "table", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
235        addCmd(TBaseType.rrw_analyze, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
236        addCmd(TBaseType.rrw_analyze, "full", "database", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
237        addCmd(TBaseType.rrw_analyze, "sample", "database", " ", " ", " ", " ", ESqlStatementType.sstanalyzeTable);
238
239        // KILL
240        addCmd(TBaseType.rrw_kill, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlkill);
241
242        // CALL
243        addCmd(TBaseType.rrw_call, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcall);
244
245        // PREPARE/EXECUTE/DEALLOCATE
246        addCmd(TBaseType.rrw_prepare, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlprepare);
247        addCmd(TBaseType.rrw_execute, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlexecute);
248        addCmd(TBaseType.rrw_deallocate, "prepare", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldeallocateprepare);
249
250        // REFRESH MATERIALIZED VIEW (StarRocks specific)
251        addCmd(TBaseType.rrw_refresh, "materialized", "view", " ", " ", " ", " ", ESqlStatementType.sstpostgresqlRefreshMaterializedView);
252    }
253
254    @Override
255    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
256        TCustomSqlStatement ret = null;
257        int k;
258        boolean lcisnewsql;
259        TSourceToken lcpprevsolidtoken, lcnextsolidtoken;
260
261        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
262
263        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
264                || (pcst.tokencode == TBaseType.cmtslashstar)
265                || (pcst.tokencode == TBaseType.lexspace)
266                || (pcst.tokencode == TBaseType.lexnewline)
267                || (pcst.tokentype == ETokenType.ttsemicolon)) {
268            return ret;
269        }
270
271        int lcpos = pcst.posinlist;
272        TSourceTokenList lcsourcetokenlist = pcst.container;
273        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
274
275        // Subquery after semicolon or at first line
276        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) {
277            k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
278            if (k > 0) {
279                ret = new TSelectSqlStatement(vendor);
280            }
281            return ret;
282        }
283
284        // CTE
285        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
286            ret = findcte(pcst);
287            if ((ret != null)) return ret;
288        }
289
290        gnewsqlstatementtype = getStatementTypeForToken(pcst);
291
292        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
293
294        // Handle CREATE ... VIEW pattern
295        if ((gnewsqlstatementtype == ESqlStatementType.sstinvalid) && (pcst.tokencode == TBaseType.rrw_create)) {
296            TSourceToken viewToken = pcst.container.searchToken(TBaseType.rrw_view, "", pcst, 15);
297            if (viewToken != null) {
298                gnewsqlstatementtype = ESqlStatementType.sstcreateview;
299            }
300        }
301
302        switch (gnewsqlstatementtype) {
303            case sstinvalid: {
304                ret = null;
305                break;
306            }
307            case sstselect: {
308                lcisnewsql = true;
309
310                if (pstate != EFindSqlStateType.stnormal) {
311                    if (TBaseType.assigned(lcprevsolidtoken)) {
312                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
313                            lcisnewsql = false;
314                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
315                            lcisnewsql = false;
316                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
317                            lcisnewsql = false;
318                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
319                            lcisnewsql = false;
320                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
321                            lcisnewsql = false;
322                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
323                            lcisnewsql = false;
324                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
325                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
326                                lcisnewsql = false;
327                            else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
328                                lcisnewsql = false;
329                            else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatematerializedview)
330                                lcisnewsql = false;
331                        }
332                    }
333                }
334                if (lcisnewsql) {
335                    ret = new TSelectSqlStatement(vendor);
336                }
337                break;
338            }
339            case sstanalyzeTable: {
340                if (pstate == EFindSqlStateType.stnormal) {
341                    ret = new TAnalyzeStmt(vendor);
342                }
343                break;
344            }
345            case sststarrocksCreateRoutineLoad: {
346                if (pstate == EFindSqlStateType.stnormal) {
347                    ret = new TCreateRoutineLoadStmt(vendor);
348                }
349                break;
350            }
351            case sststarrocksPauseRoutineLoad: {
352                if (pstate == EFindSqlStateType.stnormal) {
353                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksPauseRoutineLoad);
354                }
355                break;
356            }
357            case sststarrocksResumeRoutineLoad: {
358                if (pstate == EFindSqlStateType.stnormal) {
359                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksResumeRoutineLoad);
360                }
361                break;
362            }
363            case sststarrocksStopRoutineLoad: {
364                if (pstate == EFindSqlStateType.stnormal) {
365                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksStopRoutineLoad);
366                }
367                break;
368            }
369            case sststarrocksAlterRoutineLoad: {
370                if (pstate == EFindSqlStateType.stnormal) {
371                    ret = new TAlterRoutineLoadStmt(vendor);
372                }
373                break;
374            }
375            case sststarrocksShowRoutineLoad: {
376                if (pstate == EFindSqlStateType.stnormal) {
377                    ret = new TShowRoutineLoadStmt(vendor);
378                }
379                break;
380            }
381            case sststarrocksSubmitTask: {
382                if (pstate == EFindSqlStateType.stnormal) {
383                    ret = new TSubmitTaskStmt(vendor);
384                }
385                break;
386            }
387            case sststarrocksDropTask: {
388                if (pstate == EFindSqlStateType.stnormal) {
389                    ret = new TStarrocksDropTaskStmt(vendor);
390                }
391                break;
392            }
393            case sststarrocksBeginLoadTransaction: {
394                if (pstate == EFindSqlStateType.stnormal) {
395                    ret = new TBeginLoadTransactionStmt(vendor);
396                }
397                break;
398            }
399            case sststarrocksCommitLoadTransaction: {
400                if (pstate == EFindSqlStateType.stnormal) {
401                    ret = new TCommitLoadTransactionStmt(vendor);
402                }
403                break;
404            }
405            case sststarrocksAbortLoadTransaction: {
406                if (pstate == EFindSqlStateType.stnormal) {
407                    ret = new TAbortLoadTransactionStmt(vendor);
408                }
409                break;
410            }
411            case sststarrocksShowLoadTransaction: {
412                if (pstate == EFindSqlStateType.stnormal) {
413                    ret = new TShowLoadTransactionStmt(vendor);
414                }
415                break;
416            }
417            case sststarrocksExport: {
418                if (pstate == EFindSqlStateType.stnormal) {
419                    ret = new TStarrocksExportStmt(vendor);
420                }
421                break;
422            }
423            case sststarrocksShowExport: {
424                if (pstate == EFindSqlStateType.stnormal) {
425                    ret = new TStarrocksShowExportStmt(vendor);
426                }
427                break;
428            }
429            case sststarrocksCancelExport: {
430                if (pstate == EFindSqlStateType.stnormal) {
431                    ret = new TStarrocksCancelExportStmt(vendor);
432                }
433                break;
434            }
435            case sststarrocksCreateResourceGroup: {
436                if (pstate == EFindSqlStateType.stnormal) {
437                    ret = new TStarrocksCreateResourceGroupStmt(vendor);
438                }
439                break;
440            }
441            case sststarrocksDropResourceGroup: {
442                if (pstate == EFindSqlStateType.stnormal) {
443                    ret = new TStarrocksDropResourceGroupStmt(vendor);
444                }
445                break;
446            }
447            case sststarrocksAlterResourceGroup: {
448                if (pstate == EFindSqlStateType.stnormal) {
449                    ret = new TStarrocksAlterResourceGroupStmt(vendor);
450                }
451                break;
452            }
453            case sststarrocksShowResourceGroup: {
454                if (pstate == EFindSqlStateType.stnormal) {
455                    ret = new TStarrocksShowResourceGroupStmt(vendor);
456                }
457                break;
458            }
459            case sststarrocksCreateStorageVolume: {
460                if (pstate == EFindSqlStateType.stnormal) {
461                    ret = new TStarrocksCreateStorageVolumeStmt(vendor);
462                }
463                break;
464            }
465            case sststarrocksAlterStorageVolume: {
466                if (pstate == EFindSqlStateType.stnormal) {
467                    ret = new TStarrocksAlterStorageVolumeStmt(vendor);
468                }
469                break;
470            }
471            case sststarrocksDropStorageVolume: {
472                if (pstate == EFindSqlStateType.stnormal) {
473                    ret = new TStarrocksDropStorageVolumeStmt(vendor);
474                }
475                break;
476            }
477            case sststarrocksShowStorageVolume: {
478                if (pstate == EFindSqlStateType.stnormal) {
479                    ret = new TStarrocksShowStorageVolumeStmt(vendor);
480                }
481                break;
482            }
483            case sststarrocksDescStorageVolume: {
484                if (pstate == EFindSqlStateType.stnormal) {
485                    ret = new TStarrocksDescStorageVolumeStmt(vendor);
486                }
487                break;
488            }
489            case sststarrocksBackup: {
490                if (pstate == EFindSqlStateType.stnormal) {
491                    ret = new TStarrocksBackupStmt(vendor);
492                }
493                break;
494            }
495            case sststarrocksCreateRepository: {
496                if (pstate == EFindSqlStateType.stnormal) {
497                    ret = new TStarrocksCreateRepositoryStmt(vendor);
498                }
499                break;
500            }
501            case sststarrocksDropRepository: {
502                if (pstate == EFindSqlStateType.stnormal) {
503                    ret = new TStarrocksDropRepositoryStmt(vendor);
504                }
505                break;
506            }
507            case sststarrocksRestore: {
508                if (pstate == EFindSqlStateType.stnormal) {
509                    ret = new TStarrocksRestoreStmt(vendor);
510                }
511                break;
512            }
513            case sststarrocksShowBackup:
514            case sststarrocksShowRestore: {
515                if (pstate == EFindSqlStateType.stnormal) {
516                    ret = new TStarrocksShowBackupRestoreStmt(vendor);
517                }
518                break;
519            }
520            case sststarrocksShowSnapshot: {
521                if (pstate == EFindSqlStateType.stnormal) {
522                    ret = new TStarrocksShowSnapshotStmt(vendor);
523                }
524                break;
525            }
526            case sststarrocksCancelBackup:
527            case sststarrocksCancelRestore: {
528                if (pstate == EFindSqlStateType.stnormal) {
529                    ret = new TStarrocksCancelBackupRestoreStmt(vendor);
530                }
531                break;
532            }
533            case sststarrocksCacheSelect: {
534                if (pstate == EFindSqlStateType.stnormal) {
535                    ret = new TStarrocksCacheSelectStmt(vendor);
536                }
537                break;
538            }
539            case sststarrocksCreateDictionary: {
540                if (pstate == EFindSqlStateType.stnormal) {
541                    ret = new TStarrocksCreateDictionaryStmt(vendor);
542                }
543                break;
544            }
545            case sststarrocksDropDictionary: {
546                if (pstate == EFindSqlStateType.stnormal) {
547                    ret = new TStarrocksDropDictionaryStmt(vendor);
548                }
549                break;
550            }
551            case sststarrocksRefreshDictionary: {
552                if (pstate == EFindSqlStateType.stnormal) {
553                    ret = new TStarrocksRefreshDictionaryStmt(vendor);
554                }
555                break;
556            }
557            case sststarrocksShowDictionary: {
558                if (pstate == EFindSqlStateType.stnormal) {
559                    ret = new TStarrocksShowDictionaryStmt(vendor);
560                }
561                break;
562            }
563            case sstinsert: {
564                if (pstate == EFindSqlStateType.stnormal) {
565                    ret = new TInsertSqlStatement(vendor);
566                }
567                break;
568            }
569            case sstupdate: {
570                if (pstate == EFindSqlStateType.stnormal) {
571                    ret = new TUpdateSqlStatement(vendor);
572                }
573                break;
574            }
575            case sstdelete: {
576                if (pstate == EFindSqlStateType.stnormal) {
577                    ret = new TDeleteSqlStatement(vendor);
578                }
579                break;
580            }
581            case sstmerge: {
582                if (pstate == EFindSqlStateType.stnormal) {
583                    ret = new TMergeSqlStatement(vendor);
584                }
585                break;
586            }
587            case sstmysqlcreatefunction: {
588                if (pstate == EFindSqlStateType.stnormal) {
589                    ret = new TCreateFunctionStmt(vendor);
590                }
591                break;
592            }
593            case sstmysqldropfunction: {
594                if (pstate == EFindSqlStateType.stnormal) {
595                    ret = new TDropFunctionStmt(vendor);
596                }
597                break;
598            }
599            case sststarrocksShowFunctions: {
600                if (pstate == EFindSqlStateType.stnormal) {
601                    ret = new TStarrocksShowFunctionsStmt(vendor);
602                }
603                break;
604            }
605            default: {
606                ret = new TUnknownSqlStatement(vendor);
607                ret.sqlstatementtype = gnewsqlstatementtype;
608                break;
609            }
610        }
611
612        return ret;
613    }
614}