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 sstcreatetable:
304                ret = new TCreateTableSqlStatement(vendor);
305                break;
306
307            case sstinvalid: {
308                ret = null;
309                break;
310            }
311            case sstselect: {
312                lcisnewsql = true;
313
314                if (pstate != EFindSqlStateType.stnormal) {
315                    if (TBaseType.assigned(lcprevsolidtoken)) {
316                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
317                            lcisnewsql = false;
318                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
319                            lcisnewsql = false;
320                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
321                            lcisnewsql = false;
322                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
323                            lcisnewsql = false;
324                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
325                            lcisnewsql = false;
326                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
327                            lcisnewsql = false;
328                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
329                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
330                                lcisnewsql = false;
331                            else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
332                                lcisnewsql = false;
333                            else if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatematerializedview)
334                                lcisnewsql = false;
335                        }
336                    }
337                }
338                if (lcisnewsql) {
339                    ret = new TSelectSqlStatement(vendor);
340                }
341                break;
342            }
343            case sstanalyzeTable: {
344                if (pstate == EFindSqlStateType.stnormal) {
345                    ret = new TAnalyzeStmt(vendor);
346                }
347                break;
348            }
349            case sststarrocksCreateRoutineLoad: {
350                if (pstate == EFindSqlStateType.stnormal) {
351                    ret = new TCreateRoutineLoadStmt(vendor);
352                }
353                break;
354            }
355            case sststarrocksPauseRoutineLoad: {
356                if (pstate == EFindSqlStateType.stnormal) {
357                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksPauseRoutineLoad);
358                }
359                break;
360            }
361            case sststarrocksResumeRoutineLoad: {
362                if (pstate == EFindSqlStateType.stnormal) {
363                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksResumeRoutineLoad);
364                }
365                break;
366            }
367            case sststarrocksStopRoutineLoad: {
368                if (pstate == EFindSqlStateType.stnormal) {
369                    ret = new TRoutineLoadJobActionStmt(vendor, ESqlStatementType.sststarrocksStopRoutineLoad);
370                }
371                break;
372            }
373            case sststarrocksAlterRoutineLoad: {
374                if (pstate == EFindSqlStateType.stnormal) {
375                    ret = new TAlterRoutineLoadStmt(vendor);
376                }
377                break;
378            }
379            case sststarrocksShowRoutineLoad: {
380                if (pstate == EFindSqlStateType.stnormal) {
381                    ret = new TShowRoutineLoadStmt(vendor);
382                }
383                break;
384            }
385            case sststarrocksSubmitTask: {
386                if (pstate == EFindSqlStateType.stnormal) {
387                    ret = new TSubmitTaskStmt(vendor);
388                }
389                break;
390            }
391            case sststarrocksDropTask: {
392                if (pstate == EFindSqlStateType.stnormal) {
393                    ret = new TStarrocksDropTaskStmt(vendor);
394                }
395                break;
396            }
397            case sststarrocksBeginLoadTransaction: {
398                if (pstate == EFindSqlStateType.stnormal) {
399                    ret = new TBeginLoadTransactionStmt(vendor);
400                }
401                break;
402            }
403            case sststarrocksCommitLoadTransaction: {
404                if (pstate == EFindSqlStateType.stnormal) {
405                    ret = new TCommitLoadTransactionStmt(vendor);
406                }
407                break;
408            }
409            case sststarrocksAbortLoadTransaction: {
410                if (pstate == EFindSqlStateType.stnormal) {
411                    ret = new TAbortLoadTransactionStmt(vendor);
412                }
413                break;
414            }
415            case sststarrocksShowLoadTransaction: {
416                if (pstate == EFindSqlStateType.stnormal) {
417                    ret = new TShowLoadTransactionStmt(vendor);
418                }
419                break;
420            }
421            case sststarrocksExport: {
422                if (pstate == EFindSqlStateType.stnormal) {
423                    ret = new TStarrocksExportStmt(vendor);
424                }
425                break;
426            }
427            case sststarrocksShowExport: {
428                if (pstate == EFindSqlStateType.stnormal) {
429                    ret = new TStarrocksShowExportStmt(vendor);
430                }
431                break;
432            }
433            case sststarrocksCancelExport: {
434                if (pstate == EFindSqlStateType.stnormal) {
435                    ret = new TStarrocksCancelExportStmt(vendor);
436                }
437                break;
438            }
439            case sststarrocksCreateResourceGroup: {
440                if (pstate == EFindSqlStateType.stnormal) {
441                    ret = new TStarrocksCreateResourceGroupStmt(vendor);
442                }
443                break;
444            }
445            case sststarrocksDropResourceGroup: {
446                if (pstate == EFindSqlStateType.stnormal) {
447                    ret = new TStarrocksDropResourceGroupStmt(vendor);
448                }
449                break;
450            }
451            case sststarrocksAlterResourceGroup: {
452                if (pstate == EFindSqlStateType.stnormal) {
453                    ret = new TStarrocksAlterResourceGroupStmt(vendor);
454                }
455                break;
456            }
457            case sststarrocksShowResourceGroup: {
458                if (pstate == EFindSqlStateType.stnormal) {
459                    ret = new TStarrocksShowResourceGroupStmt(vendor);
460                }
461                break;
462            }
463            case sststarrocksCreateStorageVolume: {
464                if (pstate == EFindSqlStateType.stnormal) {
465                    ret = new TStarrocksCreateStorageVolumeStmt(vendor);
466                }
467                break;
468            }
469            case sststarrocksAlterStorageVolume: {
470                if (pstate == EFindSqlStateType.stnormal) {
471                    ret = new TStarrocksAlterStorageVolumeStmt(vendor);
472                }
473                break;
474            }
475            case sststarrocksDropStorageVolume: {
476                if (pstate == EFindSqlStateType.stnormal) {
477                    ret = new TStarrocksDropStorageVolumeStmt(vendor);
478                }
479                break;
480            }
481            case sststarrocksShowStorageVolume: {
482                if (pstate == EFindSqlStateType.stnormal) {
483                    ret = new TStarrocksShowStorageVolumeStmt(vendor);
484                }
485                break;
486            }
487            case sststarrocksDescStorageVolume: {
488                if (pstate == EFindSqlStateType.stnormal) {
489                    ret = new TStarrocksDescStorageVolumeStmt(vendor);
490                }
491                break;
492            }
493            case sststarrocksBackup: {
494                if (pstate == EFindSqlStateType.stnormal) {
495                    ret = new TStarrocksBackupStmt(vendor);
496                }
497                break;
498            }
499            case sststarrocksCreateRepository: {
500                if (pstate == EFindSqlStateType.stnormal) {
501                    ret = new TStarrocksCreateRepositoryStmt(vendor);
502                }
503                break;
504            }
505            case sststarrocksDropRepository: {
506                if (pstate == EFindSqlStateType.stnormal) {
507                    ret = new TStarrocksDropRepositoryStmt(vendor);
508                }
509                break;
510            }
511            case sststarrocksRestore: {
512                if (pstate == EFindSqlStateType.stnormal) {
513                    ret = new TStarrocksRestoreStmt(vendor);
514                }
515                break;
516            }
517            case sststarrocksShowBackup:
518            case sststarrocksShowRestore: {
519                if (pstate == EFindSqlStateType.stnormal) {
520                    ret = new TStarrocksShowBackupRestoreStmt(vendor);
521                }
522                break;
523            }
524            case sststarrocksShowSnapshot: {
525                if (pstate == EFindSqlStateType.stnormal) {
526                    ret = new TStarrocksShowSnapshotStmt(vendor);
527                }
528                break;
529            }
530            case sststarrocksCancelBackup:
531            case sststarrocksCancelRestore: {
532                if (pstate == EFindSqlStateType.stnormal) {
533                    ret = new TStarrocksCancelBackupRestoreStmt(vendor);
534                }
535                break;
536            }
537            case sststarrocksCacheSelect: {
538                if (pstate == EFindSqlStateType.stnormal) {
539                    ret = new TStarrocksCacheSelectStmt(vendor);
540                }
541                break;
542            }
543            case sststarrocksCreateDictionary: {
544                if (pstate == EFindSqlStateType.stnormal) {
545                    ret = new TStarrocksCreateDictionaryStmt(vendor);
546                }
547                break;
548            }
549            case sststarrocksDropDictionary: {
550                if (pstate == EFindSqlStateType.stnormal) {
551                    ret = new TStarrocksDropDictionaryStmt(vendor);
552                }
553                break;
554            }
555            case sststarrocksRefreshDictionary: {
556                if (pstate == EFindSqlStateType.stnormal) {
557                    ret = new TStarrocksRefreshDictionaryStmt(vendor);
558                }
559                break;
560            }
561            case sststarrocksShowDictionary: {
562                if (pstate == EFindSqlStateType.stnormal) {
563                    ret = new TStarrocksShowDictionaryStmt(vendor);
564                }
565                break;
566            }
567            case sstinsert: {
568                if (pstate == EFindSqlStateType.stnormal) {
569                    ret = new TInsertSqlStatement(vendor);
570                }
571                break;
572            }
573            case sstupdate: {
574                if (pstate == EFindSqlStateType.stnormal) {
575                    ret = new TUpdateSqlStatement(vendor);
576                }
577                break;
578            }
579            case sstdelete: {
580                if (pstate == EFindSqlStateType.stnormal) {
581                    ret = new TDeleteSqlStatement(vendor);
582                }
583                break;
584            }
585            case sstmerge: {
586                if (pstate == EFindSqlStateType.stnormal) {
587                    ret = new TMergeSqlStatement(vendor);
588                }
589                break;
590            }
591            case sstmysqlcreatefunction: {
592                if (pstate == EFindSqlStateType.stnormal) {
593                    ret = new TCreateFunctionStmt(vendor);
594                }
595                break;
596            }
597            case sstmysqldropfunction: {
598                if (pstate == EFindSqlStateType.stnormal) {
599                    ret = new TDropFunctionStmt(vendor);
600                }
601                break;
602            }
603            case sststarrocksShowFunctions: {
604                if (pstate == EFindSqlStateType.stnormal) {
605                    ret = new TStarrocksShowFunctionsStmt(vendor);
606                }
607                break;
608            }
609            default: {
610                ret = new TUnknownSqlStatement(vendor);
611                ret.sqlstatementtype = gnewsqlstatementtype;
612                break;
613            }
614        }
615
616        return ret;
617    }
618}