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