mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
WL#2575 - Fulltext: Parser plugin for FTS
WL#2763 - MySQL plugin interface: step 1 Manual merge from CNET tree. include/ft_global.h: Default parser added. include/my_global.h: dlopen related code moved from sql_udf.cc into my_global.h include/myisam.h: Added fulltext parser to MI_KEYDEF libmysqld/Makefile.am: Added LIBDIR macro. mysql-test/r/connect.result: Test result fixed: added plugin table mysql-test/r/information_schema.result: Test result fixed: added plugin table. mysql-test/r/mysqlcheck.result: Test result fixed: added plugin table. mysql-test/r/system_mysql_db.result: Test fixed: added plugin table mysql-test/t/system_mysql_db_fix.test: Test fixed: added plugin table scripts/mysql_create_system_tables.sh: Added mysql.plugin table. scripts/mysql_fix_privilege_tables.sql: Added mysql.plugin table. sql/Makefile.am: Added LIBDIR macro. sql/ha_myisam.cc: Pass fulltext parser from sql to myisam layer. sql/lex.h: Plugin related symbols. sql/mysqld.cc: Initialize/deinitialize plugins, pass opt_plugin_dir. plugin-dir renamed to plugin_dir. plugin_dir is relative to mysql_home now. sql/set_var.cc: plugin_dir added to SHOW VARIABLES. sql/share/errmsg.txt: Plugin related error messages. sql/sql_class.h: Added parser to Key class. Hold parser_name instead of plugin in Key class. sql/sql_lex.h: INSTALL/UNINSTALL PLUGIN commands. sql/sql_parse.cc: INSTALL/UNINSTALL PLUGIN commands. sql/sql_show.cc: SHOW CREATE TABLE: output parser name if index was created WITH PARSER. sql/sql_table.cc: Pass fulltext parser from yacc to sql layer. sql/sql_udf.cc: dlopen related code moved into my_global.h. Implemented better check for UDF path. UDF loads libraries that are under plugin_dir now. sql/sql_yacc.yy: INSTALL/UNINSTALL PLUGIN syntax. Added WITH PARSER syntax to CREATE/ALTER TABLE/INDEX. opt_fulltext_parser must allocate memory, since it will be used afterwards. sql/table.cc: Save/restore fulltext parser in extra data segment. Added DBUG_PRINTs. storage/myisam/ft_boolean_search.c: Split functions so they can be used by fulltext parser. Use fulltext parser if specified. storage/myisam/ft_nlq_search.c: Use fulltext parser. storage/myisam/ft_parser.c: Split functions so they can be used by fulltext parser. Use fulltext parser if specified. storage/myisam/ft_static.c: Default fulltext parser added. storage/myisam/ft_update.c: Use fulltext parser. storage/myisam/ftdefs.h: FTB_PARAM moved into plugin.h and renamed to MYSQL_FTPARSER_BOOLEAN_INFO. storage/myisam/mi_open.c: Set default parser.
This commit is contained in:
@ -38,36 +38,10 @@
|
||||
#ifdef HAVE_DLOPEN
|
||||
extern "C"
|
||||
{
|
||||
#if defined(__WIN__)
|
||||
void* dlsym(void* lib,const char* name)
|
||||
{
|
||||
return GetProcAddress((HMODULE)lib,name);
|
||||
}
|
||||
void* dlopen(const char* libname,int unused)
|
||||
{
|
||||
return LoadLibraryEx(libname,NULL,0);
|
||||
}
|
||||
void dlclose(void* lib)
|
||||
{
|
||||
FreeLibrary((HMODULE)lib);
|
||||
}
|
||||
|
||||
#elif !defined(OS2)
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <hash.h>
|
||||
}
|
||||
|
||||
#ifndef RTLD_NOW
|
||||
#define RTLD_NOW 1 // For FreeBSD 2.2.2
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DLERROR
|
||||
#define dlerror() ""
|
||||
#endif
|
||||
|
||||
static bool initialized = 0;
|
||||
static MEM_ROOT mem;
|
||||
static HASH udf_hash;
|
||||
@ -194,8 +168,10 @@ void udf_init()
|
||||
This is done to ensure that only approved dll from the system
|
||||
directories are used (to make this even remotely secure).
|
||||
*/
|
||||
if (strchr(dl_name, '/') ||
|
||||
IF_WIN(strchr(dl_name, '\\'),0) ||
|
||||
if (my_strchr(files_charset_info, dl_name,
|
||||
dl_name + strlen(dl_name), '/') ||
|
||||
IF_WIN(my_strchr(files_charset_info, dl_name,
|
||||
dl_name + strlen(dl_name), '\\'),0) ||
|
||||
strlen(name.str) > NAME_LEN)
|
||||
{
|
||||
sql_print_error("Invalid row in mysql.func table for function '%.64s'",
|
||||
@ -214,10 +190,13 @@ void udf_init()
|
||||
void *dl = find_udf_dl(tmp->dl);
|
||||
if (dl == NULL)
|
||||
{
|
||||
if (!(dl = dlopen(tmp->dl, RTLD_NOW)))
|
||||
char dlpath[FN_REFLEN];
|
||||
strxnmov(dlpath, sizeof(dlpath) - 1, opt_plugin_dir, "/", tmp->dl,
|
||||
NullS);
|
||||
if (!(dl= dlopen(dlpath, RTLD_NOW)))
|
||||
{
|
||||
/* Print warning to log */
|
||||
sql_print_error(ER(ER_CANT_OPEN_LIBRARY), tmp->dl,errno,dlerror());
|
||||
sql_print_error(ER(ER_CANT_OPEN_LIBRARY), dlpath, errno, dlerror());
|
||||
/* Keep the udf in the hash so that we can remove it later */
|
||||
continue;
|
||||
}
|
||||
@ -412,7 +391,9 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
||||
This is done to ensure that only approved dll from the system
|
||||
directories are used (to make this even remotely secure).
|
||||
*/
|
||||
if (strchr(udf->dl, '/') || IF_WIN(strchr(udf->dl, '\\'),0))
|
||||
if (my_strchr(files_charset_info, udf->dl, udf->dl + strlen(udf->dl), '/') ||
|
||||
IF_WIN(strchr(files_charset_info, udf->dl,
|
||||
udf->dl + strlen(udf->dl), '\\'),0))
|
||||
{
|
||||
my_message(ER_UDF_NO_PATHS, ER(ER_UDF_NO_PATHS), MYF(0));
|
||||
DBUG_RETURN(1);
|
||||
@ -431,12 +412,14 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
||||
}
|
||||
if (!(dl = find_udf_dl(udf->dl)))
|
||||
{
|
||||
if (!(dl = dlopen(udf->dl, RTLD_NOW)))
|
||||
char dlpath[FN_REFLEN];
|
||||
strxnmov(dlpath, sizeof(dlpath) - 1, opt_plugin_dir, "/", udf->dl, NullS);
|
||||
if (!(dl = dlopen(dlpath, RTLD_NOW)))
|
||||
{
|
||||
DBUG_PRINT("error",("dlopen of %s failed, error: %d (%s)",
|
||||
udf->dl,errno,dlerror()));
|
||||
dlpath, errno, dlerror()));
|
||||
my_error(ER_CANT_OPEN_LIBRARY, MYF(0),
|
||||
udf->dl, errno, dlerror());
|
||||
dlpath, errno, dlerror());
|
||||
goto err;
|
||||
}
|
||||
new_dl=1;
|
||||
|
Reference in New Issue
Block a user