MySQL 8.4.3
Source Code Documentation
|
#include "sql/sql_plugin.h"
#include "my_config.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <optional>
#include "map_helpers.h"
#include "mutex_lock.h"
#include "my_alloc.h"
#include "my_base.h"
#include "my_compiler.h"
#include "my_dbug.h"
#include "my_getopt.h"
#include "my_inttypes.h"
#include "my_list.h"
#include "my_macros.h"
#include "my_psi_config.h"
#include "my_sharedlib.h"
#include "my_sys.h"
#include "my_thread_local.h"
#include "mysql/components/services/bits/psi_bits.h"
#include "mysql/components/services/bits/psi_memory_bits.h"
#include "mysql/components/services/bits/psi_mutex_bits.h"
#include "mysql/components/services/log_builtins.h"
#include "mysql/components/services/log_shared.h"
#include "mysql/components/services/system_variable_source_type.h"
#include "mysql/my_loglevel.h"
#include "mysql/plugin_audit.h"
#include "mysql/plugin_auth.h"
#include "mysql/plugin_clone.h"
#include "mysql/plugin_group_replication.h"
#include "mysql/plugin_keyring.h"
#include "mysql/plugin_validate_password.h"
#include "mysql/psi/mysql_memory.h"
#include "mysql/psi/mysql_mutex.h"
#include "mysql/psi/mysql_rwlock.h"
#include "mysql/psi/mysql_system.h"
#include "mysql/psi/mysql_thread.h"
#include "mysql/service_mysql_alloc.h"
#include "mysql/strings/m_ctype.h"
#include "mysql_com.h"
#include "mysql_version.h"
#include "mysqld_error.h"
#include "nulls.h"
#include "prealloced_array.h"
#include "sql/auth/auth_acls.h"
#include "sql/auth/auth_common.h"
#include "sql/auto_thd.h"
#include "sql/current_thd.h"
#include "sql/dd/cache/dictionary_client.h"
#include "sql/dd/dd_schema.h"
#include "sql/dd/info_schema/metadata.h"
#include "sql/dd/string_type.h"
#include "sql/dd_sql_view.h"
#include "sql/debug_sync.h"
#include "sql/derror.h"
#include "sql/field.h"
#include "sql/handler.h"
#include "sql/iterators/row_iterator.h"
#include "sql/key.h"
#include "sql/lock.h"
#include "sql/log.h"
#include "sql/mdl.h"
#include "sql/mysqld.h"
#include "sql/persisted_variable.h"
#include "sql/protocol_classic.h"
#include "sql/psi_memory_key.h"
#include "sql/sd_notify.h"
#include "sql/set_var.h"
#include "sql/sql_audit.h"
#include "sql/sql_backup_lock.h"
#include "sql/sql_base.h"
#include "sql/sql_class.h"
#include "sql/sql_const.h"
#include "sql/sql_error.h"
#include "sql/sql_executor.h"
#include "sql/sql_lex.h"
#include "sql/sql_list.h"
#include "sql/sql_parse.h"
#include "sql/sql_plugin_var.h"
#include "sql/sql_show.h"
#include "sql/sql_system_table_check.h"
#include "sql/sql_table.h"
#include "sql/sys_vars_resource_mgr.h"
#include "sql/sys_vars_shared.h"
#include "sql/system_variables.h"
#include "sql/table.h"
#include "sql/thd_raii.h"
#include "sql/thr_malloc.h"
#include "sql/transaction.h"
#include "sql_string.h"
#include "string_with_len.h"
#include "strxmov.h"
#include "strxnmov.h"
#include "template_utils.h"
#include "thr_lock.h"
#include "thr_mutex.h"
#include "typelib.h"
#include <dlfcn.h>
#include <algorithm>
#include <memory>
#include <new>
#include <unordered_map>
#include <utility>
#include "sql/srv_session.h"
#include "sql/sql_plugin_services.h"
Namespaces | |
namespace | dd |
The version of the current data dictionary table definitions. | |
namespace | dd::upgrade |
Macros | |
#define | REPORT_TO_LOG 1 |
#define | REPORT_TO_USER 2 |
#define | my_intern_plugin_lock(A, B) intern_plugin_lock(A, B) |
#define | my_intern_plugin_lock_ci(A, B) intern_plugin_lock(A, B) |
Functions | |
int | initialize_schema_table (st_plugin_int *plugin) |
int | finalize_schema_table (st_plugin_int *plugin) |
static void | plugin_load (MEM_ROOT *tmp_root, int *argc, char **argv) |
Reads the plugins from mysql.plugin and loads them. More... | |
static bool | plugin_load_list (MEM_ROOT *tmp_root, int *argc, char **argv, const char *list, bool load_early) |
Load a list of plugins. More... | |
static bool | check_if_option_is_deprecated (int optid, const struct my_option *opt, char *argument) |
Check option being used and raise deprecation warning if required. More... | |
static int | test_plugin_options (MEM_ROOT *tmp_root, st_plugin_int *tmp, int *argc, char **argv, const std::optional< enum_plugin_load_option > force_load_option) |
Create and register system variables supplied from the plugin and assigns initial values from corresponding command line arguments. More... | |
static bool | register_builtin (st_mysql_plugin *, st_plugin_int *, st_plugin_int **) |
static void | unlock_variables (struct System_variables *vars) |
static void | cleanup_variables (THD *thd, struct System_variables *vars) |
static void | plugin_vars_free_values (sys_var *vars) |
Free values of thread variables of a plugin. More... | |
static void | plugin_var_memalloc_free (struct System_variables *vars) |
Free all elements allocated by plugin_var_memalloc_session_update(). More... | |
static void | restore_pluginvar_names (sys_var *first) |
static void | reap_plugins () |
malloc_unordered_map< std::string, st_bookmark * > * | get_bookmark_hash () |
static void | report_error (int where_to, uint error,...) |
bool | check_valid_path (const char *path, size_t len) |
Check if the provided path is valid in the sense that it does cause a relative reference outside the directory. More... | |
static st_plugin_dl * | plugin_dl_find (const LEX_STRING *dl) |
static st_plugin_dl * | plugin_dl_insert_or_reuse (st_plugin_dl *plugin_dl) |
static void | free_plugin_mem (st_plugin_dl *p) |
static st_plugin_dl * | plugin_dl_add (const LEX_STRING *dl, int report, bool load_early) |
Loads a dynamic plugin. More... | |
static void | plugin_dl_del (const LEX_STRING *dl) |
static st_plugin_int * | plugin_find_internal (const LEX_CSTRING &name, int type) |
static SHOW_COMP_OPTION | plugin_status (const LEX_CSTRING &name, int type) |
bool | plugin_is_ready (const LEX_CSTRING &name, int type) |
SHOW_COMP_OPTION | plugin_status (const char *name, size_t len, int type) |
plugin_ref | intern_plugin_lock (LEX *lex, plugin_ref rc) |
plugin_ref | plugin_lock (THD *thd, plugin_ref *ptr) |
plugin_ref | plugin_lock_by_name (THD *thd, const LEX_CSTRING &name, int type) |
static st_plugin_int * | plugin_insert_or_reuse (st_plugin_int *plugin) |
static bool | plugin_add (MEM_ROOT *tmp_root, LEX_CSTRING name, const LEX_STRING *dl, int *argc, char **argv, int report, bool load_early) |
Adds a plugin to the global plugin list. More... | |
static void | plugin_deinitialize (st_plugin_int *plugin, bool ref_check) |
static void | plugin_del (st_plugin_int *plugin) |
void | intern_plugin_unlock (LEX *lex, plugin_ref plugin) |
void | plugin_unlock (THD *thd, plugin_ref plugin) |
void | plugin_unlock_list (THD *thd, plugin_ref *list, size_t count) |
static int | plugin_initialize (st_plugin_int *plugin) |
static void | convert_dash_to_underscore (char *str, size_t len) |
static void | init_plugin_psi_keys (void) |
static bool | plugin_init_internals () |
Initialize the internals of the plugin system. More... | |
static bool | plugin_init_initialize_and_reap () |
Initialize the plugins. More... | |
bool | plugin_register_early_plugins (int *argc, char **argv, int flags) |
Register and initialize early plugins. More... | |
bool | update_persisted_plugin_sysvars (const char *name) |
Update read-write persisted plugin system variables. More... | |
bool | plugin_register_builtin_and_init_core_se (int *argc, char **argv) |
Register the builtin plugins. More... | |
bool | is_builtin_and_core_se_initialized () |
bool | dd::upgrade::plugin_initialize_delayed_after_upgrade () |
Initialize delayed plugins. More... | |
void | dd::upgrade::delay_initialization_of_dependent_plugins () |
Reset state of delayed plugins to indicate that they wait for upgrade to complete. More... | |
bool | plugin_register_dynamic_and_init_all (int *argc, char **argv, int flags) |
Register and initialize the dynamic plugins. More... | |
void | plugin_shutdown () |
bool | end_transaction (THD *thd, bool error) |
bool | plugin_early_load_one (int *argc, char **argv, const char *plugin) |
Initialize one plugin. More... | |
static bool | mysql_install_plugin (THD *thd, LEX_CSTRING name, const LEX_STRING *dl) |
static bool | mysql_uninstall_plugin (THD *thd, LEX_CSTRING name) |
bool | plugin_foreach_with_mask (THD *thd, plugin_foreach_func **funcs, int type, uint state_mask, void *arg) |
bool | plugin_foreach_with_mask (THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg) |
static st_bookmark * | register_var (const char *plugin, const char *name, int flags) |
void | alloc_and_copy_thd_dynamic_variables (THD *thd, bool global_lock) |
Allocate memory and copy dynamic variables from global system variables to per-thread system variables copy. More... | |
static bool * | mysql_sys_var_bool (THD *thd, int offset) |
For correctness and simplicity's sake, a pointer to a function must be compatible with pointed-to type, that is, the return and parameters types must be the same. More... | |
static int * | mysql_sys_var_int (THD *thd, int offset) |
static unsigned int * | mysql_sys_var_uint (THD *thd, int offset) |
static unsigned long * | mysql_sys_var_ulong (THD *thd, int offset) |
static unsigned long long * | mysql_sys_var_ulonglong (THD *thd, int offset) |
static char ** | mysql_sys_var_str (THD *thd, int offset) |
static double * | mysql_sys_var_double (THD *thd, int offset) |
void | plugin_thdvar_init (THD *thd, bool enable_plugins) |
void | plugin_thdvar_cleanup (THD *thd, bool enable_plugins) |
void | plugin_thdvar_safe_update (THD *thd, SYS_VAR *var, char **dest, const char *value) |
Set value for a thread local variable. More... | |
static int | construct_options (MEM_ROOT *mem_root, st_plugin_int *tmp, my_option *options) |
Creates a set of my_option objects associated with a specified plugin- handle. More... | |
static my_option * | construct_help_options (MEM_ROOT *mem_root, st_plugin_int *p) |
void | add_plugin_options (std::vector< my_option > *options, MEM_ROOT *mem_root) |
st_plugin_int * | plugin_find_by_type (const LEX_CSTRING &plugin, int type) |
Searches for a correctly loaded plugin of a particular type by name. More... | |
#define my_intern_plugin_lock | ( | A, | |
B | |||
) | intern_plugin_lock(A, B) |
#define my_intern_plugin_lock_ci | ( | A, | |
B | |||
) | intern_plugin_lock(A, B) |
#define REPORT_TO_LOG 1 |
#define REPORT_TO_USER 2 |
void alloc_and_copy_thd_dynamic_variables | ( | THD * | thd, |
bool | global_lock | ||
) |
Allocate memory and copy dynamic variables from global system variables to per-thread system variables copy.
thd | thread context |
global_lock | If true LOCK_global_system_variables should be acquired while copying variables from global variables copy. |
|
static |
Check option being used and raise deprecation warning if required.
optid | ID of the option that was passed through command line |
opt | List of options |
argument | unused |
A deprecation warning will be raised if –plugin-xxx type of option is used.
0 | Success |
bool check_valid_path | ( | const char * | path, |
size_t | len | ||
) |
Check if the provided path is valid in the sense that it does cause a relative reference outside the directory.
|
static |
|
static |
some plugin variables (those that don't have PLUGIN_VAR_EXPERIMENTAL flag) have their names prefixed with the plugin name. Restore the names here to get the correct (not double-prefixed) help text. We won't need @sysvars anymore and don't care about their proper names.
|
static |
Creates a set of my_option objects associated with a specified plugin- handle.
mem_root | Memory allocator to be used. | |
tmp | A pointer to a plugin handle | |
[out] | options | A pointer to a pre-allocated static array |
The set is stored in the pre-allocated static array supplied to the function. The size of the array is calculated as (number_of_plugin_varaibles*2+3). The reason is that each option can have a prefix '–plugin-' in addition to the shorter form '–<plugin-name>'. There is also space allocated for terminating NULL pointers.
-1 | An error occurred |
0 | Success |
Used to circumvent the const attribute on my_option::name
|
inlinestatic |
bool end_transaction | ( | THD * | thd, |
bool | error | ||
) |
int finalize_schema_table | ( | st_plugin_int * | plugin | ) |
|
inlinestatic |
malloc_unordered_map< std::string, st_bookmark * > * get_bookmark_hash | ( | ) |
|
static |
int initialize_schema_table | ( | st_plugin_int * | plugin | ) |
plugin_ref intern_plugin_lock | ( | LEX * | lex, |
plugin_ref | rc | ||
) |
void intern_plugin_unlock | ( | LEX * | lex, |
plugin_ref | plugin | ||
) |
bool is_builtin_and_core_se_initialized | ( | ) |
|
static |
|
static |
For correctness and simplicity's sake, a pointer to a function must be compatible with pointed-to type, that is, the return and parameters types must be the same.
Thus, a callback function is defined for each scalar type. The functions are assigned in construct_options to their respective types.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Adds a plugin to the global plugin list.
Also installs the plugin variables. In case of error releases LOCK_plugin and LOCK_system_variables_hash and reports the error.
|
static |
|
static |
|
static |
Loads a dynamic plugin.
Fills in a st_plugin_dl structure. Initializes the plugin services pointer inside the plugin. Does not initialize the individual plugins. Must have LOCK_plugin and LOCK_system_variables locked(write). On error releases LOCK_system_variables and LOCK_plugin.
NULL | failed to load the plugin |
|
static |
|
static |
|
static |
bool plugin_early_load_one | ( | int * | argc, |
char ** | argv, | ||
const char * | plugin | ||
) |
Initialize one plugin.
This function is used to early load one single plugin. This function is used by key migration tool.
[in] | argc | Command line argument counter |
[in] | argv | Command line arguments |
[in] | plugin | library file name |
0 | OK |
1 | ERROR |
st_plugin_int * plugin_find_by_type | ( | const LEX_CSTRING & | plugin, |
int | type | ||
) |
Searches for a correctly loaded plugin of a particular type by name.
plugin | the name of the plugin we're looking for |
type | type of the plugin (0-MYSQL_MAX_PLUGIN_TYPE_NUM) |
|
static |
bool plugin_foreach_with_mask | ( | THD * | thd, |
plugin_foreach_func ** | funcs, | ||
int | type, | ||
uint | state_mask, | ||
void * | arg | ||
) |
bool plugin_foreach_with_mask | ( | THD * | thd, |
plugin_foreach_func * | func, | ||
int | type, | ||
uint | state_mask, | ||
void * | arg | ||
) |
|
static |
Initialize the plugins.
Reap those that fail to initialize.
|
static |
Initialize the internals of the plugin system.
Allocate required resources, initialize mutex, etc.
|
static |
|
static |
bool plugin_is_ready | ( | const LEX_CSTRING & | name, |
int | type | ||
) |
|
static |
Reads the plugins from mysql.plugin and loads them.
Called only by plugin_register_dynamic_and_init_all() a.k.a. the bootstrap sequence.
|
static |
Load a list of plugins.
Called by plugin_register_early_plugins() and plugin_register_dynamic_and_init_all(), a.k.a. the bootstrap sequence.
true | failure |
false | success |
plugin_ref plugin_lock | ( | THD * | thd, |
plugin_ref * | ptr | ||
) |
plugin_ref plugin_lock_by_name | ( | THD * | thd, |
const LEX_CSTRING & | name, | ||
int | type | ||
) |
bool plugin_register_builtin_and_init_core_se | ( | int * | argc, |
char ** | argv | ||
) |
Register the builtin plugins.
Some of the plugins (MyISAM, CSV and InnoDB) are also initialized.
argc | number of arguments, propagated to the plugin |
argv | actual arguments, propagated to the plugin |
bool plugin_register_dynamic_and_init_all | ( | int * | argc, |
char ** | argv, | ||
int | flags | ||
) |
Register and initialize the dynamic plugins.
Also initialize the remaining builtin plugins that are not initialized already.
argc | Command line argument counter |
argv | Command line arguments |
flags | Flags to control whether dynamic loading and plugin initialization should be skipped |
bool plugin_register_early_plugins | ( | int * | argc, |
char ** | argv, | ||
int | flags | ||
) |
Register and initialize early plugins.
argc | Command line argument counter |
argv | Command line arguments |
flags | Flags to control whether dynamic loading and plugin initialization should be skipped |
void plugin_shutdown | ( | void | ) |
SHOW_COMP_OPTION plugin_status | ( | const char * | name, |
size_t | len, | ||
int | type | ||
) |
|
static |
void plugin_thdvar_cleanup | ( | THD * | thd, |
bool | enable_plugins | ||
) |
void plugin_thdvar_init | ( | THD * | thd, |
bool | enable_plugins | ||
) |
Set value for a thread local variable.
[in] | thd | Thread context. |
[in] | var | Plugin variable. |
[in,out] | dest | Destination memory pointer. |
[in] | value | New value. |
Note: new value should be '\0'-terminated for string variables.
Used in plugin.h:THDVAR_SET(thd, name, value) macro.
void plugin_unlock | ( | THD * | thd, |
plugin_ref | plugin | ||
) |
void plugin_unlock_list | ( | THD * | thd, |
plugin_ref * | list, | ||
size_t | count | ||
) |
|
static |
Free all elements allocated by plugin_var_memalloc_session_update().
[in] | vars | system variables structure |
|
static |
Free values of thread variables of a plugin.
This must be called before a plugin is deleted. Otherwise its variables are no longer accessible and the value space is lost. Note that only string values with PLUGIN_VAR_MEMALLOC are allocated and must be freed.
[in] | vars | Chain of system variables of a plugin |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Create and register system variables supplied from the plugin and assigns initial values from corresponding command line arguments.
tmp_root | Temporary scratch space | |
[out] | tmp | Internal plugin structure |
argc | Number of command line arguments | |
argv | Command line argument vector | |
force_load_option | empty if not specified, otherwise one of enum_plugin_load_option |
The plugin will be updated with a policy on how to handle errors during initialization.
0 | Initialization should proceed. |
1 | Plugin is disabled. |
-1 | An error has occurred. |
|
static |
bool update_persisted_plugin_sysvars | ( | const char * | name | ) |
Update read-write persisted plugin system variables.
name | plugin name |
|
static |
|
static |
|
static |
|
static |
|
static |
const char* global_plugin_typelib_names[] |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
mysql_mutex_t LOCK_plugin |
Serializes access to the global plugin memory list.
LOCK_plugin must be acquired before accessing plugin_dl_array, plugin_array and plugin_hash. We are always manipulating ref count, so a rwlock here is unnecessary. If it must be taken together with the LOCK_system_variables_hash then LOCK_plugin must be taken after LOCK_system_variables_hash.
mysql_mutex_t LOCK_plugin_delete |
mysql_mutex_t LOCK_plugin_install |
Serializes the INSTALL and UNINSTALL PLUGIN commands.
Must be taken before LOCK_plugin.
|
static |
Hash for system variables of string type with MEMALLOC flag.
|
static |
|
static |
|
extern |
|
extern |
|
static |
|
static |
|
static |
I_List<i_string>* opt_early_plugin_load_list_ptr = &opt_early_plugin_load_list |
char opt_plugin_dir[FN_REFLEN] |
char* opt_plugin_dir_ptr |
I_List<i_string>* opt_plugin_load_list_ptr = &opt_plugin_load_list |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
plugin_type_init plugin_type_deinitialize[MYSQL_MAX_PLUGIN_TYPE_NUM] |
plugin_type_init plugin_type_initialize[MYSQL_MAX_PLUGIN_TYPE_NUM] |
const LEX_CSTRING plugin_type_names[MYSQL_MAX_PLUGIN_TYPE_NUM] |
|
static |
|
static |