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