public determineQueryType()

in gui/frontend/src/parsing/mysql/MySQLBaseLexer.ts [320:1270]


    public determineQueryType(): QueryType {
        let token = this.nextDefaultChannelToken();
        if (token.type === Token.EOF) {
            return QueryType.Unknown;
        }

        switch (token.type) {
            case MySQLMRSLexer.ALTER_SYMBOL:
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                switch (token.type) {
                    case MySQLMRSLexer.DATABASE_SYMBOL: {
                        return QueryType.AlterDatabase;
                    }

                    case MySQLMRSLexer.LOGFILE_SYMBOL: {
                        return QueryType.AlterLogFileGroup;
                    }

                    case MySQLMRSLexer.FUNCTION_SYMBOL: {
                        return QueryType.AlterFunction;
                    }

                    case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                        return QueryType.AlterProcedure;
                    }

                    case MySQLMRSLexer.SERVER_SYMBOL: {
                        return QueryType.AlterServer;
                    }

                    case MySQLMRSLexer.TABLE_SYMBOL:
                    case MySQLMRSLexer.ONLINE_SYMBOL:  // Optional part of ALTER TABLE.
                    case MySQLMRSLexer.OFFLINE_SYMBOL: // ditto
                    case MySQLMRSLexer.IGNORE_SYMBOL: {
                        return QueryType.AlterTable;
                    }

                    case MySQLMRSLexer.TABLESPACE_SYMBOL: {
                        return QueryType.AlterTableSpace;
                    }

                    case MySQLMRSLexer.EVENT_SYMBOL: {
                        return QueryType.AlterEvent;
                    }

                    case MySQLMRSLexer.VIEW_SYMBOL: {
                        return QueryType.AlterView;
                    }

                    case MySQLMRSLexer.DEFINER_SYMBOL: { // Can be both event or view.
                        if (!this.skipDefiner()) {
                            return QueryType.Ambiguous;
                        }
                        token = this.nextDefaultChannelToken();

                        switch (token.type) {
                            case MySQLMRSLexer.EVENT_SYMBOL: {
                                return QueryType.AlterEvent;
                            }

                            case MySQLMRSLexer.SQL_SYMBOL:
                            case MySQLMRSLexer.VIEW_SYMBOL: {
                                return QueryType.AlterView;
                            }

                            default: {
                                return QueryType.Unknown;
                            }
                        }
                    }

                    case MySQLMRSLexer.ALGORITHM_SYMBOL: { // Optional part of CREATE VIEW.
                        return QueryType.AlterView;
                    }

                    case MySQLMRSLexer.USER_SYMBOL: {
                        return QueryType.AlterUser;
                    }

                    case MySQLMRSLexer.REST_SYMBOL: {
                        return QueryType.Rest;
                    }

                    default: {
                        return QueryType.Unknown;
                    }
                }

            case MySQLMRSLexer.CREATE_SYMBOL: {
                token = this.nextDefaultChannelToken();
                // Skip OR REPLACE
                if (token.type === MySQLMRSLexer.OR_SYMBOL) {
                    token = this.nextDefaultChannelToken();
                    if (token.type === MySQLMRSLexer.REPLACE_SYMBOL) {
                        token = this.nextDefaultChannelToken();
                    }
                }
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                switch (token.type) {
                    case MySQLMRSLexer.TEMPORARY_SYMBOL: // Optional part of CREATE TABLE.
                    case MySQLMRSLexer.TABLE_SYMBOL: {
                        return QueryType.CreateTable;
                    }

                    case MySQLMRSLexer.ONLINE_SYMBOL:
                    case MySQLMRSLexer.OFFLINE_SYMBOL:
                    case MySQLMRSLexer.INDEX_SYMBOL:
                    case MySQLMRSLexer.UNIQUE_SYMBOL:
                    case MySQLMRSLexer.FULLTEXT_SYMBOL:
                    case MySQLMRSLexer.SPATIAL_SYMBOL: {
                        return QueryType.CreateIndex;
                    }

                    case MySQLMRSLexer.DATABASE_SYMBOL: {
                        return QueryType.CreateDatabase;
                    }

                    case MySQLMRSLexer.TRIGGER_SYMBOL: {
                        return QueryType.CreateTrigger;
                    }

                    case MySQLMRSLexer.DEFINER_SYMBOL: { // Can be event, view, procedure, function, UDF, trigger.
                        if (!this.skipDefiner()) {
                            return QueryType.Ambiguous;
                        }

                        token = this.nextDefaultChannelToken();
                        switch (token.type) {
                            case MySQLMRSLexer.EVENT_SYMBOL: {
                                return QueryType.CreateEvent;
                            }

                            case MySQLMRSLexer.VIEW_SYMBOL:
                            case MySQLMRSLexer.SQL_SYMBOL: {
                                return QueryType.CreateView;
                            }

                            case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                                return QueryType.CreateProcedure;
                            }

                            case MySQLMRSLexer.FUNCTION_SYMBOL: {
                                token = this.nextDefaultChannelToken();
                                if (token.type === Token.EOF) {
                                    return QueryType.Ambiguous;
                                }

                                if (!this.isIdentifier(token.type)) {
                                    return QueryType.Ambiguous;
                                }

                                token = this.nextDefaultChannelToken();
                                if (token.type === MySQLMRSLexer.RETURNS_SYMBOL) {
                                    return QueryType.CreateUdf;
                                }

                                return QueryType.CreateFunction;
                            }

                            case MySQLMRSLexer.AGGREGATE_SYMBOL: {
                                return QueryType.CreateUdf;
                            }

                            case MySQLMRSLexer.TRIGGER_SYMBOL: {
                                return QueryType.CreateTrigger;
                            }

                            default: {
                                return QueryType.Unknown;
                            }
                        }
                    }

                    case MySQLMRSLexer.VIEW_SYMBOL:
                    case MySQLMRSLexer.ALGORITHM_SYMBOL: { // CREATE ALGORITHM ... VIEW
                        return QueryType.CreateView;
                    }

                    case MySQLMRSLexer.EVENT_SYMBOL: {
                        return QueryType.CreateEvent;
                    }

                    case MySQLMRSLexer.FUNCTION_SYMBOL: {
                        return QueryType.CreateFunction;
                    }

                    case MySQLMRSLexer.AGGREGATE_SYMBOL: {
                        return QueryType.CreateUdf;
                    }

                    case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                        return QueryType.CreateProcedure;
                    }

                    case MySQLMRSLexer.LOGFILE_SYMBOL: {
                        return QueryType.CreateLogFileGroup;
                    }

                    case MySQLMRSLexer.SERVER_SYMBOL: {
                        return QueryType.CreateServer;
                    }

                    case MySQLMRSLexer.TABLESPACE_SYMBOL: {
                        return QueryType.CreateTableSpace;
                    }

                    case MySQLMRSLexer.USER_SYMBOL: {
                        return QueryType.CreateUser;
                    }

                    case MySQLMRSLexer.REST_SYMBOL: {
                        return QueryType.Rest;
                    }

                    default: {
                        return QueryType.Unknown;
                    }
                }
            }

            case MySQLMRSLexer.DROP_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                switch (token.type) {
                    case MySQLMRSLexer.DATABASE_SYMBOL: {
                        return QueryType.DropDatabase;
                    }

                    case MySQLMRSLexer.EVENT_SYMBOL: {
                        return QueryType.DropEvent;
                    }

                    case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                        return QueryType.DropProcedure;
                    }

                    case MySQLMRSLexer.FUNCTION_SYMBOL: {
                        return QueryType.DropFunction;
                    }

                    case MySQLMRSLexer.ONLINE_SYMBOL:
                    case MySQLMRSLexer.OFFLINE_SYMBOL:
                    case MySQLMRSLexer.INDEX_SYMBOL: {
                        return QueryType.DropIndex;
                    }

                    case MySQLMRSLexer.LOGFILE_SYMBOL: {
                        return QueryType.DropLogfileGroup;
                    }

                    case MySQLMRSLexer.SERVER_SYMBOL: {
                        return QueryType.DropServer;
                    }

                    case MySQLMRSLexer.TEMPORARY_SYMBOL:
                    case MySQLMRSLexer.TABLE_SYMBOL:
                    case MySQLMRSLexer.TABLES_SYMBOL: {
                        return QueryType.DropTable;
                    }

                    case MySQLMRSLexer.TABLESPACE_SYMBOL: {
                        return QueryType.DropTablespace;
                    }

                    case MySQLMRSLexer.TRIGGER_SYMBOL: {
                        return QueryType.DropTrigger;
                    }

                    case MySQLMRSLexer.VIEW_SYMBOL: {
                        return QueryType.DropView;
                    }

                    case MySQLMRSLexer.PREPARE_SYMBOL: {
                        return QueryType.Deallocate;
                    }

                    case MySQLMRSLexer.USER_SYMBOL: {
                        return QueryType.DropUser;
                    }

                    case MySQLMRSLexer.REST_SYMBOL: {
                        return QueryType.Rest;
                    }

                    default: {
                        return QueryType.Unknown;
                    }
                }
            }

            case MySQLMRSLexer.TRUNCATE_SYMBOL: {
                return QueryType.TruncateTable;
            }

            case MySQLMRSLexer.CALL_SYMBOL: {
                return QueryType.Call;
            }

            case MySQLMRSLexer.DELETE_SYMBOL: {
                return QueryType.Delete;
            }

            case MySQLMRSLexer.DO_SYMBOL: {
                return QueryType.Do;
            }

            case MySQLMRSLexer.HANDLER_SYMBOL: {
                return QueryType.Handler;
            }

            case MySQLMRSLexer.INSERT_SYMBOL: {
                return QueryType.Insert;
            }

            case MySQLMRSLexer.LOAD_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                switch (token.type) {
                    case MySQLMRSLexer.DATA_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Ambiguous;
                        }

                        if (token.type === MySQLMRSLexer.FROM_SYMBOL) {
                            return QueryType.LoadDataMaster;
                        }

                        return QueryType.LoadData;
                    }
                    case MySQLMRSLexer.XML_SYMBOL: {
                        return QueryType.LoadXML;
                    }

                    case MySQLMRSLexer.TABLE_SYMBOL: {
                        return QueryType.LoadTableMaster;
                    }

                    case MySQLMRSLexer.INDEX_SYMBOL: {
                        return QueryType.LoadIndex;
                    }

                    default: {
                        return QueryType.Unknown;
                    }
                }
            }

            case MySQLMRSLexer.REPLACE_SYMBOL: {
                return QueryType.Replace;
            }

            case MySQLMRSLexer.SELECT_SYMBOL: {
                return QueryType.Select;
            }

            case MySQLMRSLexer.TABLE_SYMBOL: {
                return QueryType.Table;
            }

            case MySQLMRSLexer.VALUES_SYMBOL: {
                return QueryType.Values;
            }

            case MySQLMRSLexer.UPDATE_SYMBOL: {
                return QueryType.Update;
            }

            case MySQLMRSLexer.OPEN_PAR_SYMBOL: { // (((select ...)))
                while (token.type === MySQLMRSLexer.OPEN_PAR_SYMBOL) {
                    token = this.nextDefaultChannelToken();
                    if (token.type === Token.EOF) {
                        return QueryType.Ambiguous;
                    }
                }
                if (token.type === MySQLMRSLexer.SELECT_SYMBOL) {
                    return QueryType.Select;
                }

                return QueryType.Unknown;
            }

            case MySQLMRSLexer.START_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                if (token.type === MySQLMRSLexer.TRANSACTION_SYMBOL) {
                    return QueryType.StartTransaction;
                }

                return QueryType.StartSlave;
            }

            case MySQLMRSLexer.BEGIN_SYMBOL: { // Begin directly at the start of the query must be a transaction start.
                return QueryType.BeginWork;
            }

            case MySQLMRSLexer.COMMIT_SYMBOL: {
                return QueryType.Commit;
            }

            case MySQLMRSLexer.ROLLBACK_SYMBOL: {
                // We assume a transaction statement here unless we exactly know it's about a savepoint.
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.RollbackWork;
                }
                if (token.type === MySQLMRSLexer.WORK_SYMBOL) {
                    token = this.nextDefaultChannelToken();
                    if (token.type === Token.EOF) {
                        return QueryType.RollbackWork;
                    }
                }

                if (token.type === MySQLMRSLexer.TO_SYMBOL) {
                    return QueryType.RollbackSavePoint;
                }

                return QueryType.RollbackWork;
            }

            case MySQLMRSLexer.SET_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Set;
                }

                switch (token.type) {
                    case MySQLMRSLexer.PASSWORD_SYMBOL: {
                        return QueryType.SetPassword;
                    }

                    case MySQLMRSLexer.GLOBAL_SYMBOL:
                    case MySQLMRSLexer.LOCAL_SYMBOL:
                    case MySQLMRSLexer.SESSION_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Set;
                        }
                        break;
                    }

                    case MySQLMRSLexer.IDENTIFIER: {
                        const text = (token.text || "").toLowerCase();
                        if (text === "autocommit") {
                            return QueryType.SetAutoCommit;
                        }
                        break;
                    }

                    case MySQLMRSLexer.TRANSACTION_SYMBOL: {
                        return QueryType.SetTransaction;
                    }

                    default: {
                        return QueryType.Set;
                    }
                }

                return QueryType.Set;
            }

            case MySQLMRSLexer.SAVEPOINT_SYMBOL: {
                return QueryType.SavePoint;
            }

            case MySQLMRSLexer.RELEASE_SYMBOL: { // Release at the start of the query, obviously.
                return QueryType.ReleaseSavePoint;
            }

            case MySQLMRSLexer.LOCK_SYMBOL: {
                return QueryType.Lock;
            }

            case MySQLMRSLexer.UNLOCK_SYMBOL: {
                return QueryType.Unlock;
            }

            case MySQLMRSLexer.XA_SYMBOL: {
                return QueryType.XA;
            }

            case MySQLMRSLexer.PURGE_SYMBOL: {
                return QueryType.Purge;
            }

            case MySQLMRSLexer.CHANGE_SYMBOL: {
                return QueryType.ChangeMaster;
            }

            case MySQLMRSLexer.RESET_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Reset;
                }

                switch (token.type) {
                    case MySQLMRSLexer.MASTER_SYMBOL: {
                        return QueryType.ResetMaster;
                    }
                    case MySQLMRSLexer.SLAVE_SYMBOL: {
                        return QueryType.ResetSlave;
                    }
                    default: {
                        return QueryType.Reset;
                    }
                }
            }

            case MySQLMRSLexer.STOP_SYMBOL: {
                return QueryType.StopSlave;
            }

            case MySQLMRSLexer.PREPARE_SYMBOL: {
                return QueryType.Prepare;
            }

            case MySQLMRSLexer.EXECUTE_SYMBOL: {
                return QueryType.Execute;
            }

            case MySQLMRSLexer.DEALLOCATE_SYMBOL: {
                return QueryType.Deallocate;
            }

            case MySQLMRSLexer.GRANT_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                if (token.type === MySQLMRSLexer.PROXY_SYMBOL) {
                    return QueryType.GrantProxy;
                }

                return QueryType.Grant;
            }

            case MySQLMRSLexer.RENAME_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                if (token.type === MySQLMRSLexer.USER_SYMBOL) {
                    return QueryType.RenameUser;
                }

                return QueryType.RenameTable;
            }

            case MySQLMRSLexer.REVOKE_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                if (token.type === MySQLMRSLexer.PROXY_SYMBOL) {
                    return QueryType.RevokeProxy;
                }

                return QueryType.Revoke;
            }

            case MySQLMRSLexer.ANALYZE_SYMBOL: {
                return QueryType.AnalyzeTable;
            }

            case MySQLMRSLexer.CHECK_SYMBOL: {
                return QueryType.CheckTable;
            }

            case MySQLMRSLexer.CHECKSUM_SYMBOL: {
                return QueryType.ChecksumTable;
            }

            case MySQLMRSLexer.OPTIMIZE_SYMBOL: {
                return QueryType.OptimizeTable;
            }

            case MySQLMRSLexer.REPAIR_SYMBOL: {
                return QueryType.RepairTable;
            }

            case MySQLMRSLexer.BACKUP_SYMBOL: {
                return QueryType.BackUpTable;
            }

            case MySQLMRSLexer.RESTORE_SYMBOL: {
                return QueryType.RestoreTable;
            }

            case MySQLMRSLexer.INSTALL_SYMBOL: {
                return QueryType.InstallPlugin;
            }

            case MySQLMRSLexer.UNINSTALL_SYMBOL: {
                return QueryType.UninstallPlugin;
            }

            case MySQLMRSLexer.SHOW_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Show;
                }

                if (token.type === MySQLMRSLexer.FULL_SYMBOL) {
                    // Not all SHOW cases allow an optional FULL keyword, but this is not about checking for
                    // a valid query but to find the most likely type.
                    token = this.nextDefaultChannelToken();
                    if (token.type === Token.EOF) {
                        return QueryType.Show;
                    }
                }

                switch (token.type) {
                    case MySQLMRSLexer.GLOBAL_SYMBOL:
                    case MySQLMRSLexer.LOCK_SYMBOL:
                    case MySQLMRSLexer.SESSION_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Show;
                        }

                        if (token.type === MySQLMRSLexer.STATUS_SYMBOL) {
                            return QueryType.ShowStatus;
                        }

                        return QueryType.ShowVariables;
                    }

                    case MySQLMRSLexer.BINARY_SYMBOL: {
                        return QueryType.ShowBinaryLogs;
                    }

                    case MySQLMRSLexer.BINLOG_SYMBOL: {
                        return QueryType.ShowBinLogEvents;
                    }

                    case MySQLMRSLexer.RELAYLOG_SYMBOL: {
                        return QueryType.ShowRelayLogEvents;
                    }

                    case MySQLMRSLexer.CHAR_SYMBOL:
                    case MySQLMRSLexer.CHARSET_SYMBOL: {
                        return QueryType.ShowCharset;
                    }

                    case MySQLMRSLexer.COLLATION_SYMBOL: {
                        return QueryType.ShowCollation;
                    }

                    case MySQLMRSLexer.COLUMNS_SYMBOL: {
                        return QueryType.ShowColumns;
                    }

                    case MySQLMRSLexer.COUNT_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type !== MySQLMRSLexer.OPEN_PAR_SYMBOL) {
                            return QueryType.Show;
                        }

                        token = this.nextDefaultChannelToken();
                        if (token.type !== MySQLMRSLexer.MULT_OPERATOR) {
                            return QueryType.Show;
                        }

                        token = this.nextDefaultChannelToken();
                        if (token.type !== MySQLMRSLexer.CLOSE_PAR_SYMBOL) {
                            return QueryType.Show;
                        }

                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Show;
                        }

                        switch (token.type) {
                            case MySQLMRSLexer.WARNINGS_SYMBOL: {
                                return QueryType.ShowWarnings;
                            }

                            case MySQLMRSLexer.ERRORS_SYMBOL: {
                                return QueryType.ShowErrors;
                            }

                            default: {
                                return QueryType.Show;
                            }
                        }
                    }

                    case MySQLMRSLexer.CREATE_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Show;
                        }

                        switch (token.type) {
                            case MySQLMRSLexer.DATABASE_SYMBOL: {
                                return QueryType.ShowCreateDatabase;
                            }

                            case MySQLMRSLexer.EVENT_SYMBOL: {
                                return QueryType.ShowCreateEvent;
                            }

                            case MySQLMRSLexer.FUNCTION_SYMBOL: {
                                return QueryType.ShowCreateFunction;
                            }

                            case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                                return QueryType.ShowCreateProcedure;
                            }

                            case MySQLMRSLexer.TABLE_SYMBOL: {
                                return QueryType.ShowCreateTable;
                            }

                            case MySQLMRSLexer.TRIGGER_SYMBOL: {
                                return QueryType.ShowCreateTrigger;
                            }

                            case MySQLMRSLexer.VIEW_SYMBOL: {
                                return QueryType.ShowCreateView;
                            }

                            case MySQLMRSLexer.REST_SYMBOL: {
                                return QueryType.Rest;
                            }

                            default: {
                                return QueryType.Show;
                            }
                        }
                    }

                    case MySQLMRSLexer.DATABASES_SYMBOL: {
                        return QueryType.ShowDatabases;
                    }

                    case MySQLMRSLexer.ENGINE_SYMBOL: {
                        return QueryType.ShowEngineStatus;
                    }

                    case MySQLMRSLexer.STORAGE_SYMBOL:
                    case MySQLMRSLexer.ENGINES_SYMBOL: {
                        return QueryType.ShowStorageEngines;
                    }

                    case MySQLMRSLexer.ERRORS_SYMBOL: {
                        return QueryType.ShowErrors;
                    }

                    case MySQLMRSLexer.EVENTS_SYMBOL: {
                        return QueryType.ShowEvents;
                    }

                    case MySQLMRSLexer.FUNCTION_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Ambiguous;
                        }

                        if (token.type === MySQLMRSLexer.CODE_SYMBOL) {
                            return QueryType.ShowFunctionCode;
                        }

                        return QueryType.ShowFunctionStatus;
                    }

                    case MySQLMRSLexer.GRANT_SYMBOL: {
                        return QueryType.ShowGrants;
                    }

                    case MySQLMRSLexer.INDEX_SYMBOL:
                    case MySQLMRSLexer.INDEXES_SYMBOL:
                    case MySQLMRSLexer.KEY_SYMBOL: {
                        return QueryType.ShowIndexes;
                    }

                    case MySQLMRSLexer.MASTER_SYMBOL: {
                        return QueryType.ShowMasterStatus;
                    }

                    case MySQLMRSLexer.OPEN_SYMBOL: {
                        return QueryType.ShowOpenTables;
                    }

                    case MySQLMRSLexer.PLUGIN_SYMBOL:
                    case MySQLMRSLexer.PLUGINS_SYMBOL: {
                        return QueryType.ShowPlugins;
                    }

                    case MySQLMRSLexer.PROCEDURE_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Show;
                        }

                        if (token.type === MySQLMRSLexer.STATUS_SYMBOL) {
                            return QueryType.ShowProcedureStatus;
                        }

                        return QueryType.ShowProcedureCode;
                    }

                    case MySQLMRSLexer.PRIVILEGES_SYMBOL: {
                        return QueryType.ShowPrivileges;
                    }

                    case MySQLMRSLexer.FULL_SYMBOL:
                    case MySQLMRSLexer.PROCESSLIST_SYMBOL: {
                        return QueryType.ShowProcessList;
                    }

                    case MySQLMRSLexer.PROFILE_SYMBOL: {
                        return QueryType.ShowProfile;
                    }

                    case MySQLMRSLexer.PROFILES_SYMBOL: {
                        return QueryType.ShowProfiles;
                    }

                    case MySQLMRSLexer.SLAVE_SYMBOL: {
                        token = this.nextDefaultChannelToken();
                        if (token.type === Token.EOF) {
                            return QueryType.Ambiguous;
                        }

                        if (token.type === MySQLMRSLexer.HOSTS_SYMBOL) {
                            return QueryType.ShowSlaveHosts;
                        }

                        return QueryType.ShowSlaveStatus;
                    }

                    case MySQLMRSLexer.STATUS_SYMBOL: {
                        return QueryType.ShowStatus;
                    }

                    case MySQLMRSLexer.VARIABLES_SYMBOL: {
                        return QueryType.ShowVariables;
                    }

                    case MySQLMRSLexer.TABLE_SYMBOL: {
                        return QueryType.ShowTableStatus;
                    }

                    case MySQLMRSLexer.TABLES_SYMBOL: {
                        return QueryType.ShowTables;
                    }

                    case MySQLMRSLexer.TRIGGERS_SYMBOL: {
                        return QueryType.ShowTriggers;
                    }

                    case MySQLMRSLexer.WARNINGS_SYMBOL: {
                        return QueryType.ShowWarnings;
                    }

                    case MySQLMRSLexer.REST_SYMBOL: {
                        return QueryType.Rest;
                    }

                    default: {
                        return QueryType.Unknown;
                    }
                }
            }

            case MySQLMRSLexer.CACHE_SYMBOL: {
                return QueryType.CacheIndex;
            }

            case MySQLMRSLexer.FLUSH_SYMBOL: {
                return QueryType.Flush;
            }

            case MySQLMRSLexer.KILL_SYMBOL: {
                return QueryType.Kill;
            }

            case MySQLMRSLexer.EXPLAIN_SYMBOL:
            case MySQLMRSLexer.DESCRIBE_SYMBOL:
            case MySQLMRSLexer.DESC_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === Token.EOF) {
                    return QueryType.Ambiguous;
                }

                if (this.isIdentifier(token.type) || token.type === MySQLMRSLexer.DOT_SYMBOL) {
                    return QueryType.ExplainTable;
                }

                // EXTENDED is a bit special as it can be both, a table identifier or the keyword.
                if (token.type === MySQLMRSLexer.EXTENDED_SYMBOL) {
                    token = this.nextDefaultChannelToken();
                    if (token.type === Token.EOF) {
                        return QueryType.ExplainTable;
                    }

                    switch (token.type) {
                        case MySQLMRSLexer.DELETE_SYMBOL:
                        case MySQLMRSLexer.INSERT_SYMBOL:
                        case MySQLMRSLexer.REPLACE_SYMBOL:
                        case MySQLMRSLexer.UPDATE_SYMBOL: {
                            return QueryType.ExplainStatement;
                        }
                        default: {
                            return QueryType.ExplainTable;
                        }
                    }
                }

                return QueryType.ExplainStatement;
            }

            case MySQLMRSLexer.HELP_SYMBOL: {
                return QueryType.Help;
            }

            case MySQLMRSLexer.USE_SYMBOL: {
                token = this.nextDefaultChannelToken();
                if (token.type === MySQLMRSLexer.REST_SYMBOL) {
                    return QueryType.RestUse;
                }

                return QueryType.Use;
            }

            default: {
                return QueryType.Unknown;
            }
        }
    }