Commit 8d3eb141 authored by Alexey Botchkov's avatar Alexey Botchkov

merging fix

parents ec524d50 1ee4a3ac
...@@ -42,7 +42,7 @@ ulong myisam_bulk_insert_tree_size=8192*1024; ...@@ -42,7 +42,7 @@ ulong myisam_bulk_insert_tree_size=8192*1024;
ulong myisam_data_pointer_size=4; ulong myisam_data_pointer_size=4;
static int always_valid(const char *filename) static int always_valid(const char *filename __attribute__((unused)))
{ {
return 0; return 0;
} }
......
drop table if exists t1; drop table if exists t1;
CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB"; CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
Warnings:
Warning 1105 plugin_dir was not specified
CREATE FUNCTION myfunc_double RETURNS REAL SONAME "UDF_EXAMPLE_LIB"; CREATE FUNCTION myfunc_double RETURNS REAL SONAME "UDF_EXAMPLE_LIB";
CREATE FUNCTION myfunc_nonexist RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB"; CREATE FUNCTION myfunc_nonexist RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB";
ERROR HY000: Can't find function 'myfunc_nonexist' in library ERROR HY000: Can't find function 'myfunc_nonexist' in library
...@@ -197,6 +199,8 @@ DROP FUNCTION avgcost; ...@@ -197,6 +199,8 @@ DROP FUNCTION avgcost;
select * from mysql.func; select * from mysql.func;
name ret dl type name ret dl type
CREATE FUNCTION is_const RETURNS STRING SONAME "UDF_EXAMPLE_LIB"; CREATE FUNCTION is_const RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
Warnings:
Warning 1105 plugin_dir was not specified
select IS_const(3); select IS_const(3);
IS_const(3) IS_const(3)
const const
...@@ -206,6 +210,8 @@ name ret dl type ...@@ -206,6 +210,8 @@ name ret dl type
select is_const(3); select is_const(3);
ERROR 42000: FUNCTION test.is_const does not exist ERROR 42000: FUNCTION test.is_const does not exist
CREATE FUNCTION is_const RETURNS STRING SONAME "UDF_EXAMPLE_LIB"; CREATE FUNCTION is_const RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
Warnings:
Warning 1105 plugin_dir was not specified
select select
is_const(3) as const, is_const(3) as const,
is_const(3.14) as const, is_const(3.14) as const,
......
...@@ -109,8 +109,16 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags) ...@@ -109,8 +109,16 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags)
int my_is_symlink(const char *filename __attribute__((unused))) int my_is_symlink(const char *filename __attribute__((unused)))
{ {
#if defined (HAVE_LSTAT) && defined (S_ISLNK)
struct stat stat_buff; struct stat stat_buff;
return !lstat(filename, &stat_buff) && S_ISLNK(stat_buff.st_mode); return !lstat(filename, &stat_buff) && S_ISLNK(stat_buff.st_mode);
#elif defined (_WIN32)
DWORD dwAttr = GetFileAttributes(filename);
return (dwAttr != INVALID_FILE_ATTRIBUTES) &&
(dwAttr & FILE_ATTRIBUTE_REPARSE_POINT);
#else /* No symlinks */
return 0;
#endif
} }
......
...@@ -333,10 +333,10 @@ void thr_lock_init(THR_LOCK *lock) ...@@ -333,10 +333,10 @@ void thr_lock_init(THR_LOCK *lock)
void thr_lock_delete(THR_LOCK *lock) void thr_lock_delete(THR_LOCK *lock)
{ {
DBUG_ENTER("thr_lock_delete"); DBUG_ENTER("thr_lock_delete");
VOID(pthread_mutex_destroy(&lock->mutex));
pthread_mutex_lock(&THR_LOCK_lock); pthread_mutex_lock(&THR_LOCK_lock);
thr_lock_thread_list=list_delete(thr_lock_thread_list,&lock->list); thr_lock_thread_list=list_delete(thr_lock_thread_list,&lock->list);
pthread_mutex_unlock(&THR_LOCK_lock); pthread_mutex_unlock(&THR_LOCK_lock);
pthread_mutex_destroy(&lock->mutex);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -1343,6 +1343,9 @@ extern char *default_tz_name; ...@@ -1343,6 +1343,9 @@ extern char *default_tz_name;
extern my_bool opt_large_pages; extern my_bool opt_large_pages;
extern uint opt_large_page_size; extern uint opt_large_page_size;
extern char *opt_plugin_dir_ptr;
extern char opt_plugin_dir[FN_REFLEN];
extern MYSQL_LOG mysql_log,mysql_slow_log,mysql_bin_log; extern MYSQL_LOG mysql_log,mysql_slow_log,mysql_bin_log;
extern FILE *bootstrap_file; extern FILE *bootstrap_file;
extern int bootstrap_error; extern int bootstrap_error;
......
...@@ -324,6 +324,9 @@ arg_cmp_func Arg_comparator::comparator_matrix[5][2] = ...@@ -324,6 +324,9 @@ arg_cmp_func Arg_comparator::comparator_matrix[5][2] =
/* static variables */ /* static variables */
char opt_plugin_dir[FN_REFLEN];
char *opt_plugin_dir_ptr;
static bool lower_case_table_names_used= 0; static bool lower_case_table_names_used= 0;
static bool volatile select_thread_in_use, signal_thread_in_use; static bool volatile select_thread_in_use, signal_thread_in_use;
static bool volatile ready_to_exit; static bool volatile ready_to_exit;
...@@ -4985,6 +4988,7 @@ enum options_mysqld ...@@ -4985,6 +4988,7 @@ enum options_mysqld
OPT_OLD_STYLE_USER_LIMITS, OPT_OLD_STYLE_USER_LIMITS,
OPT_LOG_SLOW_ADMIN_STATEMENTS, OPT_LOG_SLOW_ADMIN_STATEMENTS,
OPT_TABLE_LOCK_WAIT_TIMEOUT, OPT_TABLE_LOCK_WAIT_TIMEOUT,
OPT_PLUGIN_DIR,
OPT_PORT_OPEN_TIMEOUT, OPT_PORT_OPEN_TIMEOUT,
OPT_MERGE, OPT_MERGE,
OPT_INNODB_ROLLBACK_ON_TIMEOUT, OPT_INNODB_ROLLBACK_ON_TIMEOUT,
...@@ -6217,6 +6221,10 @@ The minimum value for this variable is 4096.", ...@@ -6217,6 +6221,10 @@ The minimum value for this variable is 4096.",
(gptr*) &global_system_variables.optimizer_search_depth, (gptr*) &global_system_variables.optimizer_search_depth,
(gptr*) &max_system_variables.optimizer_search_depth, (gptr*) &max_system_variables.optimizer_search_depth,
0, GET_ULONG, OPT_ARG, MAX_TABLES+1, 0, MAX_TABLES+2, 0, 1, 0}, 0, GET_ULONG, OPT_ARG, MAX_TABLES+1, 0, MAX_TABLES+2, 0, 1, 0},
{"plugin_dir", OPT_PLUGIN_DIR,
"Directory for plugins.",
(gptr*) &opt_plugin_dir_ptr, (gptr*) &opt_plugin_dir_ptr, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"preload_buffer_size", OPT_PRELOAD_BUFFER_SIZE, {"preload_buffer_size", OPT_PRELOAD_BUFFER_SIZE,
"The size of the buffer that is allocated when preloading indexes", "The size of the buffer that is allocated when preloading indexes",
(gptr*) &global_system_variables.preload_buff_size, (gptr*) &global_system_variables.preload_buff_size,
...@@ -7758,6 +7766,9 @@ static void fix_paths(void) ...@@ -7758,6 +7766,9 @@ static void fix_paths(void)
(void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir (void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
(void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home); (void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
(void) my_load_path(pidfile_name,pidfile_name,mysql_real_data_home); (void) my_load_path(pidfile_name,pidfile_name,mysql_real_data_home);
(void) my_load_path(opt_plugin_dir, opt_plugin_dir_ptr ? opt_plugin_dir_ptr :
"", "");
opt_plugin_dir_ptr= opt_plugin_dir;
char *sharedir=get_relative_path(SHAREDIR); char *sharedir=get_relative_path(SHAREDIR);
if (test_if_hard_path(sharedir)) if (test_if_hard_path(sharedir))
......
...@@ -1026,6 +1026,7 @@ struct show_var_st init_vars[]= { ...@@ -1026,6 +1026,7 @@ struct show_var_st init_vars[]= {
{sys_optimizer_search_depth.name,(char*) &sys_optimizer_search_depth, {sys_optimizer_search_depth.name,(char*) &sys_optimizer_search_depth,
SHOW_SYS}, SHOW_SYS},
{"pid_file", (char*) pidfile_name, SHOW_CHAR}, {"pid_file", (char*) pidfile_name, SHOW_CHAR},
{"plugin_dir", (char*) opt_plugin_dir, SHOW_CHAR},
{"port", (char*) &mysqld_port, SHOW_INT}, {"port", (char*) &mysqld_port, SHOW_INT},
{sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS}, {sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS},
{"protocol_version", (char*) &protocol_version, SHOW_INT}, {"protocol_version", (char*) &protocol_version, SHOW_INT},
......
...@@ -7950,7 +7950,7 @@ C_MODE_START ...@@ -7950,7 +7950,7 @@ C_MODE_START
int test_if_data_home_dir(const char *dir) int test_if_data_home_dir(const char *dir)
{ {
char path[FN_REFLEN]; char path[FN_REFLEN];
uint dir_len; int dir_len;
DBUG_ENTER("test_if_data_home_dir"); DBUG_ENTER("test_if_data_home_dir");
if (!dir) if (!dir)
......
...@@ -214,7 +214,17 @@ void udf_init() ...@@ -214,7 +214,17 @@ void udf_init()
void *dl = find_udf_dl(tmp->dl); void *dl = find_udf_dl(tmp->dl);
if (dl == NULL) if (dl == NULL)
{ {
if (!(dl = dlopen(tmp->dl, RTLD_NOW))) char dlpath[FN_REFLEN];
if (*opt_plugin_dir)
strxnmov(dlpath, sizeof(dlpath) - 1, opt_plugin_dir, "/", tmp->dl,
NullS);
else
{
strxnmov(dlpath, sizeof(dlpath)-1, tmp->dl, NullS);
push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"plugin_dir was not specified");
}
if (!(dl = dlopen(dlpath, RTLD_NOW)))
{ {
/* Print warning to log */ /* Print warning to log */
sql_print_error(ER(ER_CANT_OPEN_LIBRARY), tmp->dl,errno,dlerror()); sql_print_error(ER(ER_CANT_OPEN_LIBRARY), tmp->dl,errno,dlerror());
...@@ -443,8 +453,18 @@ int mysql_create_function(THD *thd,udf_func *udf) ...@@ -443,8 +453,18 @@ int mysql_create_function(THD *thd,udf_func *udf)
} }
if (!(dl = find_udf_dl(udf->dl))) if (!(dl = find_udf_dl(udf->dl)))
{ {
DBUG_PRINT("info", ("Calling dlopen, udf->dl: %s", udf->dl)); char dlpath[FN_REFLEN];
if (!(dl = dlopen(udf->dl, RTLD_NOW))) if (*opt_plugin_dir)
strxnmov(dlpath, sizeof(dlpath) - 1, opt_plugin_dir, "/", udf->dl,
NullS);
else
{
strxnmov(dlpath, sizeof(dlpath)-1, udf->dl, NullS);
push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"plugin_dir was not specified");
}
DBUG_PRINT("info", ("Calling dlopen, udf->dl: %s", dlpath));
if (!(dl = dlopen(dlpath, RTLD_NOW)))
{ {
DBUG_PRINT("error",("dlopen of %s failed, error: %d (%s)", DBUG_PRINT("error",("dlopen of %s failed, error: %d (%s)",
udf->dl,errno,dlerror())); udf->dl,errno,dlerror()));
......
...@@ -35,6 +35,9 @@ ...@@ -35,6 +35,9 @@
#ifndef SHAREDIR #ifndef SHAREDIR
#define SHAREDIR "share/" #define SHAREDIR "share/"
#endif #endif
#ifndef PLUGINDIR
#define PLUGINDIR "lib/plugin"
#endif
#define ER(X) errmesg[(X) - ER_ERROR_FIRST] #define ER(X) errmesg[(X) - ER_ERROR_FIRST]
#define ER_SAFE(X) (((X) >= ER_ERROR_FIRST && (X) <= ER_ERROR_LAST) ? ER(X) : "Invalid error code") #define ER_SAFE(X) (((X) >= ER_ERROR_FIRST && (X) <= ER_ERROR_LAST) ? ER(X) : "Invalid error code")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment