1
0
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:
unknown
2005-11-06 13:13:06 +01:00
parent dbfe5a961f
commit 66002e452d
32 changed files with 613 additions and 235 deletions

View File

@ -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;