001package gudusoft.gsqlparser.sqlcmds;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.*;
005import gudusoft.gsqlparser.stmt.mysql.*;
006
007/**
008 * MySQL SQL command resolver.
009 * Handles MySQL-specific statement detection and command resolution.
010 *
011 * @since 3.1.0.9
012 */
013public class TSqlCmdsMysql extends AbstractSqlCmds {
014
015    public TSqlCmdsMysql() {
016        super(EDbVendor.dbvmysql);
017    }
018
019    @Override
020    protected void initializeCommands() {
021        // MySQL commands - sorted alphabetically by first token
022        // Note: Longer patterns should come before shorter ones with same prefix
023
024        addCmd(TBaseType.rrw_alter, "algorithm", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterview);
025        addCmd(TBaseType.rrw_alter, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterdatabase);
026        addCmd(TBaseType.rrw_alter, "function", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterfunction);
027        addCmd(TBaseType.rrw_alter, "procedure", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterprocedure);
028        addCmd(TBaseType.rrw_alter, "sql", "security", "definer", "view", " ", " ", ESqlStatementType.sstmysqlalterview);
029        addCmd(TBaseType.rrw_alter, "sql", "security", "invoker", "view", " ", " ", ESqlStatementType.sstmysqlalterview);
030        addCmd(TBaseType.rrw_alter, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstaltertable);
031        addCmd(TBaseType.rrw_alter, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlalterview);
032        addCmd(TBaseType.rrw_analyze, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlanalyzetable);
033        addCmd(TBaseType.rrw_backup, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlbackuptable);
034        addCmd(TBaseType.rrw_begin, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlstarttransaction);
035        addCmd(TBaseType.rrw_cache, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcacheindex);
036        addCmd(TBaseType.rrw_call, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcall);
037        addCmd(TBaseType.rrw_case, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcase);
038        addCmd(TBaseType.rrw_change, "master", "to", " ", " ", " ", " ", ESqlStatementType.sstmysqlchangemasterto);
039        addCmd(TBaseType.rrw_check, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlchecktable);
040        addCmd(TBaseType.rrw_check, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlchecktable);
041        addCmd(TBaseType.rrw_checksum, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlchecksumtable);
042        addCmd(TBaseType.rrw_close, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlclose);
043        addCmd(TBaseType.rrw_commit, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcommit);
044        addCmd(TBaseType.rrw_create, "aggregate", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
045        addCmd(TBaseType.rrw_create, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatedatabase);
046        addCmd(TBaseType.rrw_create, "definer", "=", "current_user", "function", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
047        addCmd(TBaseType.rrw_create, "definer", "=", "current_user", "procedure", " ", " ", ESqlStatementType.sstmysqlcreateprocedure);
048        addCmd(TBaseType.rrw_create, "definer", "=", "current_user", "trigger", " ", " ", ESqlStatementType.sstcreatetrigger);
049        addCmd(TBaseType.rrw_create, "definer", "=", "*", "*", "*", "function", ESqlStatementType.sstmysqlcreatefunction);
050        addCmd(TBaseType.rrw_create, "definer", "=", "*", "*", "*", "procedure", ESqlStatementType.sstmysqlcreateprocedure);
051        addCmd(TBaseType.rrw_create, "definer", "=", "*", "*", "*", "trigger", ESqlStatementType.sstcreatetrigger);
052        addCmd(TBaseType.rrw_create, "definer", "=", "*", "procedure", " ", " ", ESqlStatementType.sstmysqlcreateprocedure);
053        addCmd(TBaseType.rrw_create, "definer", "=", "*", "function", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
054        addCmd(TBaseType.rrw_create, "definer", "=", "*", "trigger", " ", " ", ESqlStatementType.sstcreatetrigger);
055        addCmd(TBaseType.rrw_create, "fulltext", "index", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
056        addCmd(TBaseType.rrw_create, "function", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatefunction);
057        addCmd(TBaseType.rrw_create, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
058        addCmd(TBaseType.rrw_create, "or", "replace", "table", " ", " ", " ", ESqlStatementType.sstcreatetable);
059        addCmd(TBaseType.rrw_create, "or", "replace", "*", "*", "*", "view", ESqlStatementType.sstcreateview);
060        addCmd(TBaseType.rrw_create, "or", "replace", "view", " ", " ", " ", ESqlStatementType.sstcreateview);
061        addCmd(TBaseType.rrw_create, "procedure", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateprocedure);
062        addCmd(TBaseType.rrw_create, "spatial", "index", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
063        addCmd(TBaseType.rrw_create, "schema", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreatedatabase);
064        addCmd(TBaseType.rrw_create, "temporary", "table", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
065        addCmd(TBaseType.rrw_create, "temp", "table", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
066        addCmd(TBaseType.rrw_create, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstcreatetable);
067        addCmd(TBaseType.rrw_create, "trigger", " ", " ", " ", " ", " ", ESqlStatementType.sstcreatetrigger);
068        addCmd(TBaseType.rrw_create, "unique", "index", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateindex);
069        addCmd(TBaseType.rrw_create, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlcreateuser);
070        addCmd(TBaseType.rrw_create, "*", "*", "*", "*", "*", "view", ESqlStatementType.sstcreateview);
071        addCmd(TBaseType.rrw_create, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstcreateview);
072        addCmd(TBaseType.rrw_deallocate, "prepare", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldeallocateprepare);
073        addCmd(TBaseType.rrw_declare, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldeclare);
074        addCmd(TBaseType.rrw_delete, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstdelete);
075        addCmd(TBaseType.rrw_mysql_delimiter, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldelimiter);
076        addCmd(TBaseType.rrw_mysql_desc, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstdescribe);
077        addCmd(TBaseType.rrw_describe, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstdescribe);
078        addCmd(TBaseType.rrw_do, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldo);
079        addCmd(TBaseType.rrw_drop, "database", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropdatabase);
080        addCmd(TBaseType.rrw_drop, "function", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropfunction);
081        addCmd(TBaseType.rrw_drop, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropindex);
082        addCmd(TBaseType.rrw_drop, "prepare", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropprepare);
083        addCmd(TBaseType.rrw_drop, "procedure", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropprocedure);
084        addCmd(TBaseType.rrw_drop, "schema", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropdatabase);
085        addCmd(TBaseType.rrw_drop, "temporary", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptable);
086        addCmd(TBaseType.rrw_drop, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptable);
087        addCmd(TBaseType.rrw_drop, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptable);
088        addCmd(TBaseType.rrw_drop, "trigger", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldroptrigger);
089        addCmd(TBaseType.rrw_drop, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldropuser);
090        addCmd(TBaseType.rrw_drop, "view", " ", " ", " ", " ", " ", ESqlStatementType.sstdropview);
091        addCmd(TBaseType.rrw_execute, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlexecute);
092        addCmd(TBaseType.rrw_explain, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstExplain);
093        addCmd(TBaseType.rrw_fetch, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlfetch);
094        addCmd(TBaseType.rrw_flush, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlflush);
095        addCmd(TBaseType.rrw_grant, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlgrant);
096        addCmd(TBaseType.rrw_handler, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlhandler);
097        addCmd(TBaseType.rrw_if, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlifstmt);
098        addCmd(TBaseType.rrw_insert, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstinsert);
099        addCmd(TBaseType.rrw_iterate, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqliterate);
100        addCmd(TBaseType.rrw_kill, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlkill);
101        addCmd(TBaseType.rrw_leave, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlleave);
102        addCmd(TBaseType.rrw_load, "data", "from", "master", " ", " ", " ", ESqlStatementType.sstmysqlloaddatafrommaster);
103        addCmd(TBaseType.rrw_load, "data", "local", "infile", " ", " ", " ", ESqlStatementType.sstmysqlloaddatainfile);
104        addCmd(TBaseType.rrw_load, "data", "infile", " ", " ", " ", " ", ESqlStatementType.sstmysqlloaddatainfile);
105        addCmd(TBaseType.rrw_load, "index", "into", "cache", " ", " ", " ", ESqlStatementType.sstmysqlloadindexintocache);
106        addCmd(TBaseType.rrw_load, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlloadtable);
107        addCmd(TBaseType.rrw_lock, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqllocktable);
108        addCmd(TBaseType.rrw_lock, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqllocktable);
109        addCmd(TBaseType.rrw_loop, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlloop);
110        addCmd(TBaseType.rrw_open, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlopen);
111        addCmd(TBaseType.rrw_optimize, "no_write_to_binlog", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqloptimizetable);
112        addCmd(TBaseType.rrw_optimize, "local", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqloptimizetable);
113        addCmd(TBaseType.rrw_optimize, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqloptimizetable);
114        addCmd(TBaseType.rrw_prepare, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlprepare);
115        addCmd(TBaseType.rrw_purge, "binary", "logs", " ", " ", " ", " ", ESqlStatementType.sstmysqlpurgelogs);
116        addCmd(TBaseType.rrw_purge, "master", "logs", " ", " ", " ", " ", ESqlStatementType.sstmysqlpurgelogs);
117        addCmd(TBaseType.rrw_purge, "logs", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlpurgelogs);
118        addCmd(TBaseType.rrw_release, "savepoint", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlreleasesavepoint);
119        addCmd(TBaseType.rrw_rename, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrenametable);
120        addCmd(TBaseType.rrw_rename, "user", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrenameuser);
121        addCmd(TBaseType.rrw_repair, "no_write_to_binlog", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqlrepairtable);
122        addCmd(TBaseType.rrw_repair, "local", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqlrepairtable);
123        addCmd(TBaseType.rrw_repair, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrepairtable);
124        addCmd(TBaseType.rrw_repeat, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrepeat);
125        addCmd(TBaseType.rrw_replace, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlreplace);
126        addCmd(TBaseType.rrw_reset, "master", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlresetmaster);
127        addCmd(TBaseType.rrw_reset, "slave", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlresetslave);
128        addCmd(TBaseType.rrw_reset, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlreset);
129        addCmd(TBaseType.rrw_restore, "table", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrestoretable);
130        addCmd(TBaseType.rrw_revoke, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrevoke);
131        addCmd(TBaseType.rrw_rollback, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlrollback);
132        addCmd(TBaseType.rrw_savepoint, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlsavepoint);
133        addCmd(TBaseType.rrw_select, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstselect);
134        addCmd(TBaseType.rrw_set, "global", "sql_slave_skip_counter", " ", " ", " ", " ", ESqlStatementType.sstmysqlsetglobalsql_slave_skip_counter);
135        addCmd(TBaseType.rrw_set, "global", "transaction", " ", " ", " ", " ", ESqlStatementType.sstmysqlsettransaction);
136        addCmd(TBaseType.rrw_set, "session", "transaction", " ", " ", " ", " ", ESqlStatementType.sstmysqlsettransaction);
137        addCmd(TBaseType.rrw_set, "autocommit", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlsetautocommit);
138        addCmd(TBaseType.rrw_set, "delimiter", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqldelimiter);
139        addCmd(TBaseType.rrw_set, "PASSWORD", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
140        addCmd(TBaseType.rrw_set, "sql_log_bin", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlsetsql_log_bin);
141        addCmd(TBaseType.rrw_set, "transaction", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlsettransaction);
142        addCmd(TBaseType.rrw_set, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlset);
143        addCmd(TBaseType.rrw_show, "bdb", "logs", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowlogs);
144        addCmd(TBaseType.rrw_show, "binlog", "events", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowbinlogevents);
145        addCmd(TBaseType.rrw_show, "character", "set", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcharacterset);
146        addCmd(TBaseType.rrw_show, "charset", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcharacterset);
147        addCmd(TBaseType.rrw_show, "collation", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcollation);
148        addCmd(TBaseType.rrw_show, "columns", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcolumns);
149        addCmd(TBaseType.rrw_show, "count", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowwarnings);
150        addCmd(TBaseType.rrw_show, "create", "schema", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreateschema);
151        addCmd(TBaseType.rrw_show, "create", "database", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreatedatabase);
152        addCmd(TBaseType.rrw_show, "create", "function", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreatefunction);
153        addCmd(TBaseType.rrw_show, "create", "procedure", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreateprocedure);
154        addCmd(TBaseType.rrw_show, "create", "table", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreatetable);
155        addCmd(TBaseType.rrw_show, "create", "view", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcreateview);
156        addCmd(TBaseType.rrw_show, "databases", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowdatabases);
157        addCmd(TBaseType.rrw_show, "engine", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowengine);
158        addCmd(TBaseType.rrw_show, "engines", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowengines);
159        addCmd(TBaseType.rrw_show, "errors", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowerrors);
160        addCmd(TBaseType.rrw_show, "extend", "indexes", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
161        addCmd(TBaseType.rrw_show, "extend", "index", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
162        addCmd(TBaseType.rrw_show, "extend", "keys", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
163        addCmd(TBaseType.rrw_show, "fields", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowfields);
164        addCmd(TBaseType.rrw_show, "full", "columns", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowcolumns);
165        addCmd(TBaseType.rrw_show, "full", "fields", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowfields);
166        addCmd(TBaseType.rrw_show, "full", "processlist", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprocesslist);
167        addCmd(TBaseType.rrw_show, "full", "tables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtables);
168        addCmd(TBaseType.rrw_show, "function", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowfunctionstatus);
169        addCmd(TBaseType.rrw_show, "global", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowstatus);
170        addCmd(TBaseType.rrw_show, "global", "variables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
171        addCmd(TBaseType.rrw_show, "grants", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowgrants);
172        addCmd(TBaseType.rrw_show, "indexes", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
173        addCmd(TBaseType.rrw_show, "index", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
174        addCmd(TBaseType.rrw_show, "innodb", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowinnodbstatus);
175        addCmd(TBaseType.rrw_show, "keys", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowindex);
176        addCmd(TBaseType.rrw_show, "logs", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowlogs);
177        addCmd(TBaseType.rrw_show, "master", "logs", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowmasterlogs);
178        addCmd(TBaseType.rrw_show, "master", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowmasterstatus);
179        addCmd(TBaseType.rrw_show, "open", "tables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtables);
180        addCmd(TBaseType.rrw_show, "plugins", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowplugins);
181        addCmd(TBaseType.rrw_show, "privileges", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprivileges);
182        addCmd(TBaseType.rrw_show, "procedure", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowfunctionstatus);
183        addCmd(TBaseType.rrw_show, "processlist", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprocesslist);
184        addCmd(TBaseType.rrw_show, "profile", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprofile);
185        addCmd(TBaseType.rrw_show, "profiles", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowprofiles);
186        addCmd(TBaseType.rrw_show, "replica", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowreplicaStatus);
187        addCmd(TBaseType.rrw_show, "session", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowstatus);
188        addCmd(TBaseType.rrw_show, "session", "variables", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
189        addCmd(TBaseType.rrw_show, "slave", "hosts", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowslavehosts);
190        addCmd(TBaseType.rrw_show, "slave", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowslavestatus);
191        addCmd(TBaseType.rrw_show, "status", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowstatus);
192        addCmd(TBaseType.rrw_show, "storage", "engines", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowengines);
193        addCmd(TBaseType.rrw_show, "table", "status", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtablestatus);
194        addCmd(TBaseType.rrw_show, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtables);
195        addCmd(TBaseType.rrw_show, "triggers", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowtriggers);
196        addCmd(TBaseType.rrw_show, "variables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowvariables);
197        addCmd(TBaseType.rrw_show, "warnings", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlshowwarnings);
198        addCmd(TBaseType.rrw_signal, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlsignal);
199        addCmd(TBaseType.rrw_start, "slave", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlstartslave);
200        addCmd(TBaseType.rrw_start, "transaction", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlstarttransaction);
201        addCmd(TBaseType.rrw_stop, "slave", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlstopslave);
202        addCmd(TBaseType.rrw_truncate, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqltruncate);
203        addCmd(TBaseType.rrw_unlock, "tables", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlunlocktable);
204        addCmd(TBaseType.rrw_update, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstupdate);
205        addCmd(TBaseType.rrw_use, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqluse);
206        addCmd(TBaseType.rrw_while, " ", " ", " ", " ", " ", " ", ESqlStatementType.sstmysqlwhile);
207    }
208
209    @Override
210    protected String getToken1Str(int token1) {
211        // Handle MySQL vendor-specific reserved words
212        switch (token1) {
213            case TBaseType.rrw_mysql_delimiter:
214                return "delimiter";
215            case TBaseType.rrw_mysql_desc:
216                return "desc";
217            default:
218                return null;
219        }
220    }
221
222    @Override
223    public TCustomSqlStatement issql(TSourceToken pcst, EFindSqlStateType pstate, TCustomSqlStatement psqlstatement) {
224        TCustomSqlStatement ret = null;
225        int k;
226        boolean lcisnewsql;
227        TSourceToken lcpprevsolidtoken, lcnextsolidtoken;
228
229        gnewsqlstatementtype = ESqlStatementType.sstinvalid;
230
231        if ((pcst.tokencode == TBaseType.cmtdoublehyphen)
232                || (pcst.tokencode == TBaseType.cmtslashstar)
233                || (pcst.tokencode == TBaseType.lexspace)
234                || (pcst.tokencode == TBaseType.lexnewline)
235                || (pcst.tokentype == ETokenType.ttsemicolon)) {
236            return ret;
237        }
238
239        int lcpos = pcst.posinlist;
240        TSourceTokenList lcsourcetokenlist = pcst.container;
241        TCustomSqlStatement lccurrentsqlstatement = psqlstatement;
242
243        // subquery after semicolon || at first line
244        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokentype == ETokenType.ttleftparenthesis)) // (
245        {
246            k = lcsourcetokenlist.solidtokenafterpos(lcpos, TBaseType.rrw_select, 1, "(");
247            if (k > 0) {
248                ret = new TSelectSqlStatement(vendor);
249            }
250
251            return ret;
252        }
253
254        // cte
255        if ((pstate == EFindSqlStateType.stnormal) && (pcst.tokencode == TBaseType.rrw_with)) {
256            ret = findcte(pcst);
257            if ((ret != null)) return ret;
258        }
259
260        gnewsqlstatementtype = getStatementTypeForToken(pcst);
261
262        TSourceToken lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
263
264        if ((gnewsqlstatementtype == ESqlStatementType.sstinvalid) && (pcst.tokencode == TBaseType.rrw_create)) {
265            TSourceToken viewToken = pcst.container.searchToken(TBaseType.rrw_view, "", pcst, 15);
266            if (viewToken != null) {
267                gnewsqlstatementtype = ESqlStatementType.sstcreateview;
268            }
269        }
270        switch (gnewsqlstatementtype) {
271            case sstinvalid: {
272                ret = null;
273                break;
274            }
275            case sstselect: {
276                lcisnewsql = true;
277
278                if (pstate != EFindSqlStateType.stnormal) {
279                    if (TBaseType.assigned(lcprevsolidtoken)) {
280                        if (lcprevsolidtoken.tokentype == ETokenType.ttleftparenthesis)
281                            lcisnewsql = false; // subquery
282                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_union)
283                            lcisnewsql = false;
284                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_intersect)
285                            lcisnewsql = false;
286                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_minus)
287                            lcisnewsql = false;
288                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_except)
289                            lcisnewsql = false;
290                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_return)
291                            lcisnewsql = false;
292                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_as) {
293                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreatetable)
294                                lcisnewsql = false;
295                            if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstcreateview)
296                                lcisnewsql = false;
297                        }
298
299                        if (lcisnewsql && (lcprevsolidtoken.tokencode == TBaseType.rrw_all)) {
300                            lcpprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcprevsolidtoken.posinlist);
301                            if (TBaseType.assigned(lcpprevsolidtoken)) {
302                                if (lcpprevsolidtoken.tokencode == TBaseType.rrw_union)
303                                    lcisnewsql = false;
304                            }
305                        }
306
307                    }
308
309
310                    if (TBaseType.assigned(lccurrentsqlstatement)) {
311                        if (lccurrentsqlstatement.sqlstatementtype == ESqlStatementType.sstinsert)
312                            lcisnewsql = false;
313                    }
314
315                }
316
317                if (lcisnewsql)
318                    ret = new TSelectSqlStatement(vendor);
319                break;
320            }
321            case sstinsert:
322            case sstmysqlreplace: {
323                lcisnewsql = true;
324                if (pstate != EFindSqlStateType.stnormal) {
325                    if (TBaseType.assigned(lccurrentsqlstatement)) {
326
327                    }
328                }
329
330                if (lcisnewsql)
331                    ret = new TInsertSqlStatement(vendor);
332                ret.sqlstatementtype = gnewsqlstatementtype;
333                break;
334            }
335            case sstupdate: {
336                lcisnewsql = true;
337                if (pstate != EFindSqlStateType.stnormal) {
338                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
339                    if (TBaseType.assigned(lcprevsolidtoken)) {
340                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
341                            lcisnewsql = false;
342                        else if (lcprevsolidtoken.tokencode == TBaseType.rrw_for)
343                            lcisnewsql = false;
344                    }
345
346                    lcnextsolidtoken = lcsourcetokenlist.nextsolidtoken(lcpos, 1, false);
347                    if (TBaseType.assigned(lcnextsolidtoken)) {
348                        if (lcnextsolidtoken.tokentype == ETokenType.ttleftparenthesis) {
349                            k = lcsourcetokenlist.solidtokenafterpos(lcnextsolidtoken.posinlist, TBaseType.rrw_select, 1, "(");
350                            if (k == 0) lcisnewsql = false;
351                        }
352                    }
353
354
355                    if (TBaseType.assigned(lccurrentsqlstatement)) {
356                    }
357                }
358
359                if (lcisnewsql) {
360                    ret = new TUpdateSqlStatement(vendor);
361                    ret.dummytag = 1; // means set clause in update is not found yet, used to separate set clause from set statement
362                }
363                break;
364            }
365            case sstdelete: {
366                lcisnewsql = true;
367
368                if (pstate != EFindSqlStateType.stnormal) {
369                    lcprevsolidtoken = lcsourcetokenlist.solidtokenbefore(lcpos);
370                    if (TBaseType.assigned(lcprevsolidtoken)) {
371                        if (lcprevsolidtoken.tokencode == TBaseType.rrw_on)
372                            lcisnewsql = false;
373                    }
374
375                    if (TBaseType.assigned(lccurrentsqlstatement)) {
376                    }
377                }
378
379                if (lcisnewsql)
380                    ret = new TDeleteSqlStatement(vendor);
381                break;
382            }
383            case sstmerge: {
384                ret = new TMergeSqlStatement(vendor);
385                ret.sqlstatementtype = gnewsqlstatementtype;
386                break;
387            }
388            case sstcommit: {
389                ret = new TUnknownSqlStatement(vendor);
390                ret.sqlstatementtype = gnewsqlstatementtype;
391                break;
392            }
393            case sstrollback: {
394                ret = new TUnknownSqlStatement(vendor);
395                ret.sqlstatementtype = gnewsqlstatementtype;
396                break;
397            }
398            case sstsavepoint: {
399                ret = new TUnknownSqlStatement(vendor);
400                ret.sqlstatementtype = gnewsqlstatementtype;
401                break;
402            }
403            case sstRevoke: {
404                ret = new TUnknownSqlStatement(vendor);
405                ret.sqlstatementtype = gnewsqlstatementtype;
406                break;
407            }
408            case sstcreatetable: {
409                ret = new TCreateTableSqlStatement(vendor);
410                break;
411            }
412            case sstcreateview: {
413                ret = new TCreateViewSqlStatement(vendor);
414                break;
415            }
416            case sstmysqlcreateindex: {
417                ret = new TCreateIndexSqlStatement(vendor);
418                break;
419            }
420            case sstcreatedatabase: {
421                ret = new TCreateDatabaseSqlStatement(vendor);
422                break;
423            }
424            case sstmysqldroptable:
425            case sstdroptable: {
426                ret = new TDropTableSqlStatement(vendor);
427                break;
428            }
429            case sstdropview: {
430                ret = new TDropViewSqlStatement(vendor);
431                break;
432            }
433            case sstdropindex: {
434                ret = new TDropIndexSqlStatement(vendor);
435                break;
436            }
437            case sstaltertable: {
438                ret = new TAlterTableStatement(vendor);
439                break;
440            }
441            case sstaltersession: {
442                ret = new TAlterSessionStatement(vendor);
443                break;
444            }
445            case sstmysqlset: {
446                ret = new TSetStmt(vendor);
447                break;
448            }
449            case sstmysqlcreateprocedure: {
450                ret = new TCreateProcedureStmt(vendor);
451                break;
452            }
453            case sstmysqlcreatefunction: {
454                ret = new TCreateFunctionStmt(vendor);
455                break;
456            }
457            case sstcreatetrigger: {
458                ret = new TCreateTriggerStmt(vendor);
459                break;
460            }
461            case sstmysqlcall: {
462                ret = new TCallStatement(vendor);
463                break;
464            }
465            case sstmysqltruncate: {
466                ret = new TTruncateStatement(vendor);
467                break;
468            }
469            case sstmysqlprepare: {
470                ret = new TPrepareStmt(vendor);
471                break;
472            }
473            case sstdescribe: {
474                ret = new TDescribeStmt(vendor);
475                break;
476            }
477            case sstExplain: {
478                ret = new TExplainPlan(vendor);
479                break;
480            }
481            case sstmysqldropindex: {
482                ret = new TDropIndexSqlStatement(vendor);
483                break;
484            }
485            case sstmysqldropprocedure: {
486                ret = new TDropProcedureStmt(vendor);
487                break;
488            }
489            case sstmysqlsignal: {
490                ret = new TMySQLSignal(vendor);
491                break;
492            }
493            case sstmysqlstarttransaction: {
494                if (pstate == EFindSqlStateType.stnormal) {
495                    ret = new TUnknownSqlStatement(vendor);
496                    ret.sqlstatementtype = gnewsqlstatementtype;
497                }
498                break;
499            }
500            case sstmysqluse: {
501                ret = new TUseDatabase(vendor);
502                break;
503            }
504            case sstmysqlexecute: {
505                ret = new TExecuteSqlStatement(vendor);
506                ret.sqlstatementtype = gnewsqlstatementtype;
507                break;
508            }
509            case sstmysqlcreatedatabase: {
510                ret = new TCreateDatabaseSqlStatement(vendor);
511                break;
512            }
513            case sstmysqlrenametable: {
514                ret = new TRenameStmt(vendor);
515                break;
516            }
517            case sstmysqlshowindex:
518                ret = new TShowIndexStmt(vendor);
519                break;
520            case sstmysqlloaddatainfile:
521                ret = new TLoadDataStmt(vendor);
522                break;
523            case sstmysqlshowlogs:
524            case sstmysqlshowbinlogevents:
525            case sstmysqlshowcharacterset:
526            case sstmysqlshowcollation:
527            case sstmysqlshowcolumns:
528            case sstmysqlshowwarnings:
529            case sstmysqlshowcreatedatabase:
530            case sstmysqlshowcreatefunction:
531            case sstmysqlshowcreateprocedure:
532            case sstmysqlshowcreatetable:
533            case sstmysqlshowcreateview:
534            case sstmysqlshowdatabases:
535            case sstmysqlshowerrors:
536            case sstmysqlshowfields:
537            case sstmysqlshowprocesslist:
538            case sstmysqlshowtables:
539            case sstmysqlshowfunctionstatus:
540            case sstmysqlshowstatus:
541            case sstmysqlshowvariables:
542            case sstmysqlshowgrants:
543            case sstmysqlshowinnodbstatus:
544            case sstmysqlshowmasterlogs:
545            case sstmysqlshowplugins:
546            case sstmysqlshowprivileges:
547            case sstmysqlshowprofile:
548            case sstmysqlshowprofiles:
549            case sstmysqlshowslavehosts:
550            case sstmysqlshowslavestatus:
551            case sstmysqlshowtablestatus:
552            case sstmysqlshowtriggers:
553            case sstmysqlshowcreateschema:
554            case sstmysqlshowengines:
555                ret = new TMySQLShowStmt(vendor);
556                ret.sqlstatementtype = gnewsqlstatementtype;
557                break;
558            case sstmysqlshowengine:
559                ret = new TShowEngineStmt(vendor);
560                break;
561            case sstmysqlshowreplicaStatus:
562                ret = new TShowStmt(vendor);
563                ret.sqlstatementtype = gnewsqlstatementtype;
564                break;
565            case sstmysqlalterfunction:
566                ret = new TAlterFunctionStmt(vendor);
567                break;
568            case sstmysqlalterprocedure:
569                ret = new TAlterProcedureStmt(vendor);
570                break;
571            case sstmysqldropfunction:
572                ret = new TDropFunctionStmt(vendor);
573                break;
574            case sstmysqldroptrigger:
575                ret = new TDropTriggerSqlStatement(vendor);
576                break;
577            case sstmysqloptimizetable:
578                ret = new TMySQLOptimizeTableStmt(vendor);
579                break;
580            case sstmysqlalterview:
581                ret = new TAlterViewStatement(vendor);
582                break;
583            default: {
584                ret = new TUnknownSqlStatement(vendor);
585                ret.sqlstatementtype = gnewsqlstatementtype;
586                break;
587            }
588        }    // case
589
590        return ret;
591    }
592}