| 1 | /* Copyright (c) 2005, 2010, Oracle and/or its affiliates. |
| 2 | Copyright (c) 2012, 2016, MariaDB |
| 3 | |
| 4 | This program is free software; you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by |
| 6 | the Free Software Foundation; version 2 of the License. |
| 7 | |
| 8 | This program is distributed in the hope that it will be useful, |
| 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 | GNU General Public License for more details. |
| 12 | |
| 13 | You should have received a copy of the GNU General Public License |
| 14 | along with this program; if not, write to the Free Software |
| 15 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 16 | |
| 17 | #ifndef SQL_SHOW_H |
| 18 | #define SQL_SHOW_H |
| 19 | |
| 20 | #include "sql_list.h" /* List */ |
| 21 | #include "handler.h" /* enum_schema_tables */ |
| 22 | #include "table.h" /* enum_schema_table_state */ |
| 23 | #include "my_apc.h" |
| 24 | |
| 25 | /* Forward declarations */ |
| 26 | class JOIN; |
| 27 | class String; |
| 28 | class THD; |
| 29 | class sp_name; |
| 30 | struct TABLE_LIST; |
| 31 | typedef class st_select_lex SELECT_LEX; |
| 32 | struct LEX; |
| 33 | typedef struct st_mysql_show_var SHOW_VAR; |
| 34 | typedef struct st_schema_table ST_SCHEMA_TABLE; |
| 35 | struct TABLE; |
| 36 | typedef struct system_status_var STATUS_VAR; |
| 37 | |
| 38 | /* Used by handlers to store things in schema tables */ |
| 39 | #define IS_FILES_FILE_ID 0 |
| 40 | #define IS_FILES_FILE_NAME 1 |
| 41 | #define IS_FILES_FILE_TYPE 2 |
| 42 | #define IS_FILES_TABLESPACE_NAME 3 |
| 43 | #define IS_FILES_TABLE_CATALOG 4 |
| 44 | #define IS_FILES_TABLE_SCHEMA 5 |
| 45 | #define IS_FILES_TABLE_NAME 6 |
| 46 | #define IS_FILES_LOGFILE_GROUP_NAME 7 |
| 47 | #define IS_FILES_LOGFILE_GROUP_NUMBER 8 |
| 48 | #define IS_FILES_ENGINE 9 |
| 49 | #define IS_FILES_FULLTEXT_KEYS 10 |
| 50 | #define IS_FILES_DELETED_ROWS 11 |
| 51 | #define IS_FILES_UPDATE_COUNT 12 |
| 52 | #define IS_FILES_FREE_EXTENTS 13 |
| 53 | #define IS_FILES_TOTAL_EXTENTS 14 |
| 54 | #define IS_FILES_EXTENT_SIZE 15 |
| 55 | #define IS_FILES_INITIAL_SIZE 16 |
| 56 | #define IS_FILES_MAXIMUM_SIZE 17 |
| 57 | #define IS_FILES_AUTOEXTEND_SIZE 18 |
| 58 | #define IS_FILES_CREATION_TIME 19 |
| 59 | #define IS_FILES_LAST_UPDATE_TIME 20 |
| 60 | #define IS_FILES_LAST_ACCESS_TIME 21 |
| 61 | #define IS_FILES_RECOVER_TIME 22 |
| 62 | #define IS_FILES_TRANSACTION_COUNTER 23 |
| 63 | #define IS_FILES_VERSION 24 |
| 64 | #define IS_FILES_ROW_FORMAT 25 |
| 65 | #define IS_FILES_TABLE_ROWS 26 |
| 66 | #define IS_FILES_AVG_ROW_LENGTH 27 |
| 67 | #define IS_FILES_DATA_LENGTH 28 |
| 68 | #define IS_FILES_MAX_DATA_LENGTH 29 |
| 69 | #define IS_FILES_INDEX_LENGTH 30 |
| 70 | #define IS_FILES_DATA_FREE 31 |
| 71 | #define IS_FILES_CREATE_TIME 32 |
| 72 | #define IS_FILES_UPDATE_TIME 33 |
| 73 | #define IS_FILES_CHECK_TIME 34 |
| 74 | #define IS_FILES_CHECKSUM 35 |
| 75 | #define IS_FILES_STATUS 36 |
| 76 | #define 37 |
| 77 | |
| 78 | typedef enum { WITHOUT_DB_NAME, WITH_DB_NAME } enum_with_db_name; |
| 79 | int show_create_table(THD *thd, TABLE_LIST *table_list, String *packet, |
| 80 | Table_specification_st *create_info_arg, |
| 81 | enum_with_db_name with_db_name); |
| 82 | |
| 83 | int copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table); |
| 84 | |
| 85 | bool append_identifier(THD *thd, String *packet, const char *name, size_t length); |
| 86 | static inline bool append_identifier(THD *thd, String *packet, const LEX_CSTRING *name) |
| 87 | { |
| 88 | return append_identifier(thd, packet, name->str, name->length); |
| 89 | } |
| 90 | void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild); |
| 91 | int mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd); |
| 92 | bool mysqld_show_create_get_fields(THD *thd, TABLE_LIST *table_list, |
| 93 | List<Item> *field_list, String *buffer); |
| 94 | bool mysqld_show_create(THD *thd, TABLE_LIST *table_list); |
| 95 | void mysqld_show_create_db_get_fields(THD *thd, List<Item> *field_list); |
| 96 | bool mysqld_show_create_db(THD *thd, LEX_CSTRING *db_name, |
| 97 | LEX_CSTRING *orig_db_name, |
| 98 | const DDL_options_st &options); |
| 99 | |
| 100 | void mysqld_list_processes(THD *thd,const char *user,bool verbose); |
| 101 | int mysqld_show_status(THD *thd); |
| 102 | int mysqld_show_variables(THD *thd,const char *wild); |
| 103 | bool mysqld_show_storage_engines(THD *thd); |
| 104 | bool mysqld_show_authors(THD *thd); |
| 105 | bool mysqld_show_contributors(THD *thd); |
| 106 | bool mysqld_show_privileges(THD *thd); |
| 107 | char *make_backup_log_name(char *buff, const char *name, const char* log_ext); |
| 108 | uint calc_sum_of_all_status(STATUS_VAR *to); |
| 109 | bool append_definer(THD *thd, String *buffer, const LEX_CSTRING *definer_user, |
| 110 | const LEX_CSTRING *definer_host); |
| 111 | int add_status_vars(SHOW_VAR *list); |
| 112 | void remove_status_vars(SHOW_VAR *list); |
| 113 | void init_status_vars(); |
| 114 | void free_status_vars(); |
| 115 | void reset_status_vars(); |
| 116 | bool show_create_trigger(THD *thd, const sp_name *trg_name); |
| 117 | void view_store_options(THD *thd, TABLE_LIST *table, String *buff); |
| 118 | |
| 119 | void init_fill_schema_files_row(TABLE* table); |
| 120 | bool schema_table_store_record(THD *thd, TABLE *table); |
| 121 | void initialize_information_schema_acl(); |
| 122 | COND *make_cond_for_info_schema(THD *thd, COND *cond, TABLE_LIST *table); |
| 123 | |
| 124 | ST_SCHEMA_TABLE *find_schema_table(THD *thd, const LEX_CSTRING *table_name, |
| 125 | bool *in_plugin); |
| 126 | static inline ST_SCHEMA_TABLE *find_schema_table(THD *thd, const LEX_CSTRING *table_name) |
| 127 | { bool unused; return find_schema_table(thd, table_name, &unused); } |
| 128 | |
| 129 | ST_SCHEMA_TABLE *get_schema_table(enum enum_schema_tables schema_table_idx); |
| 130 | int make_schema_select(THD *thd, SELECT_LEX *sel, |
| 131 | ST_SCHEMA_TABLE *schema_table); |
| 132 | int mysql_schema_table(THD *thd, LEX *lex, TABLE_LIST *table_list); |
| 133 | bool get_schema_tables_result(JOIN *join, |
| 134 | enum enum_schema_table_state executed_place); |
| 135 | enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table); |
| 136 | TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list); |
| 137 | |
| 138 | const char* get_one_variable(THD *thd, const SHOW_VAR *variable, |
| 139 | enum_var_type value_type, SHOW_TYPE show_type, |
| 140 | system_status_var *status_var, |
| 141 | const CHARSET_INFO **charset, char *buff, |
| 142 | size_t *length); |
| 143 | |
| 144 | /* These functions were under INNODB_COMPATIBILITY_HOOKS */ |
| 145 | int get_quote_char_for_identifier(THD *thd, const char *name, size_t length); |
| 146 | THD *find_thread_by_id(longlong id, bool query_id= false); |
| 147 | |
| 148 | class select_result_explain_buffer; |
| 149 | /* |
| 150 | SHOW EXPLAIN request object. |
| 151 | */ |
| 152 | |
| 153 | class Show_explain_request : public Apc_target::Apc_call |
| 154 | { |
| 155 | public: |
| 156 | THD *target_thd; /* thd that we're running SHOW EXPLAIN for */ |
| 157 | THD *request_thd; /* thd that run SHOW EXPLAIN command */ |
| 158 | |
| 159 | /* If true, there was some error when producing EXPLAIN output. */ |
| 160 | bool failed_to_produce; |
| 161 | |
| 162 | /* SHOW EXPLAIN will be stored here */ |
| 163 | select_result_explain_buffer *explain_buf; |
| 164 | |
| 165 | /* Query that we've got SHOW EXPLAIN for */ |
| 166 | String query_str; |
| 167 | |
| 168 | /* Overloaded virtual function */ |
| 169 | void call_in_target_thread(); |
| 170 | }; |
| 171 | |
| 172 | /** |
| 173 | Condition pushdown used for INFORMATION_SCHEMA / SHOW queries. |
| 174 | This structure is to implement an optimization when |
| 175 | accessing data dictionary data in the INFORMATION_SCHEMA |
| 176 | or SHOW commands. |
| 177 | When the query contain a TABLE_SCHEMA or TABLE_NAME clause, |
| 178 | narrow the search for data based on the constraints given. |
| 179 | */ |
| 180 | typedef struct st_lookup_field_values |
| 181 | { |
| 182 | /** |
| 183 | Value of a TABLE_SCHEMA clause. |
| 184 | Note that this value length may exceed @c NAME_LEN. |
| 185 | @sa wild_db_value |
| 186 | */ |
| 187 | LEX_CSTRING db_value; |
| 188 | /** |
| 189 | Value of a TABLE_NAME clause. |
| 190 | Note that this value length may exceed @c NAME_LEN. |
| 191 | @sa wild_table_value |
| 192 | */ |
| 193 | LEX_CSTRING table_value; |
| 194 | /** |
| 195 | True when @c db_value is a LIKE clause, |
| 196 | false when @c db_value is an '=' clause. |
| 197 | */ |
| 198 | bool wild_db_value; |
| 199 | /** |
| 200 | True when @c table_value is a LIKE clause, |
| 201 | false when @c table_value is an '=' clause. |
| 202 | */ |
| 203 | bool wild_table_value; |
| 204 | } LOOKUP_FIELD_VALUES; |
| 205 | |
| 206 | /* |
| 207 | INFORMATION_SCHEMA: Execution plan for get_all_tables() call |
| 208 | */ |
| 209 | |
| 210 | class IS_table_read_plan : public Sql_alloc |
| 211 | { |
| 212 | public: |
| 213 | IS_table_read_plan() : no_rows(false), trivial_show_command(FALSE) {} |
| 214 | |
| 215 | bool no_rows; |
| 216 | /* |
| 217 | For EXPLAIN only: For SHOW KEYS and SHOW COLUMNS, we know which |
| 218 | db_name.table_name will be read, however for some reason we don't |
| 219 | set the fields in this->lookup_field_vals. |
| 220 | In order to not have JOIN::save_explain_data() walking over uninitialized |
| 221 | data, we set trivial_show_command=true. |
| 222 | */ |
| 223 | bool trivial_show_command; |
| 224 | |
| 225 | LOOKUP_FIELD_VALUES lookup_field_vals; |
| 226 | Item *partial_cond; |
| 227 | |
| 228 | bool has_db_lookup_value() |
| 229 | { |
| 230 | return (lookup_field_vals.db_value.length && |
| 231 | !lookup_field_vals.wild_db_value); |
| 232 | } |
| 233 | bool has_table_lookup_value() |
| 234 | { |
| 235 | return (lookup_field_vals.table_value.length && |
| 236 | !lookup_field_vals.wild_table_value); |
| 237 | } |
| 238 | }; |
| 239 | |
| 240 | bool optimize_schema_tables_reads(JOIN *join); |
| 241 | |
| 242 | /* Handle the ignored database directories list for SHOW/I_S. */ |
| 243 | bool ignore_db_dirs_init(); |
| 244 | void ignore_db_dirs_free(); |
| 245 | void ignore_db_dirs_reset(); |
| 246 | bool ignore_db_dirs_process_additions(); |
| 247 | bool push_ignored_db_dir(char *path); |
| 248 | extern char *opt_ignore_db_dirs; |
| 249 | |
| 250 | #endif /* SQL_SHOW_H */ |
| 251 | |