1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +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

@@ -24,6 +24,14 @@ typedef struct st_ft_docstat {
double sum;
} FT_DOCSTAT;
typedef struct st_my_ft_parser_param
{
TREE *wtree;
my_bool with_alloc;
} MY_FT_PARSER_PARAM;
static int FT_WORD_cmp(CHARSET_INFO* cs, FT_WORD *w1, FT_WORD *w2)
{
return mi_compare_text(cs, (uchar*) w1->pos, w1->len,
@@ -102,13 +110,14 @@ my_bool ft_boolean_check_syntax_string(const byte *str)
4 - stopword found
*/
byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
FT_WORD *word, FTB_PARAM *param)
FT_WORD *word, MYSQL_FTPARSER_BOOLEAN_INFO *param)
{
byte *doc=*start;
uint mwc, length, mbl;
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
param->plusminus=param->pmsign=0;
param->weight_adjust= param->wasign= 0;
param->type= FT_TOKEN_EOF;
while (doc<end)
{
@@ -119,7 +128,8 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
{
param->quot=doc;
*start=doc+1;
return 3; /* FTB_RBR */
param->type= FT_TOKEN_RIGHT_PAREN;
goto ret;
}
if (!param->quot)
{
@@ -128,21 +138,22 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
/* param->prev=' '; */
*start=doc+1;
if (*doc == FTB_LQUOT) param->quot=*start;
return (*doc == FTB_RBR)+2;
param->type= (*doc == FTB_RBR ? FT_TOKEN_RIGHT_PAREN : FT_TOKEN_LEFT_PAREN);
goto ret;
}
if (param->prev == ' ')
{
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else
if (*doc == FTB_INC ) { param->plusminus++; continue; } else
if (*doc == FTB_DEC ) { param->plusminus--; continue; } else
if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; }
if (*doc == FTB_INC ) { param->weight_adjust++; continue; } else
if (*doc == FTB_DEC ) { param->weight_adjust--; continue; } else
if (*doc == FTB_NEG ) { param->wasign= !param->wasign; continue; }
}
}
param->prev=*doc;
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
param->plusminus=param->pmsign=0;
param->weight_adjust= param->wasign= 0;
}
mwc=length=0;
@@ -161,20 +172,24 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
|| param->trunc) && length < ft_max_word_len)
{
*start=doc;
return 1;
param->type= FT_TOKEN_WORD;
goto ret;
}
else if (length) /* make sure length > 0 (if start contains spaces only) */
{
*start= doc;
return 4;
param->type= FT_TOKEN_STOPWORD;
goto ret;
}
}
if (param->quot)
{
param->quot=*start=doc;
return 3; /* FTB_RBR */
param->type= 3; /* FT_RBR */
goto ret;
}
return 0;
ret:
return param->type;
}
byte ft_simple_get_word(CHARSET_INFO *cs, byte **start, const byte *end,
@@ -220,30 +235,67 @@ void ft_parse_init(TREE *wtree, CHARSET_INFO *cs)
DBUG_VOID_RETURN;
}
int ft_parse(TREE *wtree, byte *doc, int doclen, my_bool with_alloc)
{
byte *end=doc+doclen;
FT_WORD w;
DBUG_ENTER("ft_parse");
while (ft_simple_get_word(wtree->custom_arg, &doc, end, &w, TRUE))
static int ft_add_word(void *param, byte *word, uint word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused)))
{
TREE *wtree;
FT_WORD w;
DBUG_ENTER("ft_add_word");
wtree= ((MY_FT_PARSER_PARAM *)param)->wtree;
if (((MY_FT_PARSER_PARAM *)param)->with_alloc)
{
if (with_alloc)
{
byte *ptr;
/* allocating the data in the tree - to avoid mallocs and frees */
DBUG_ASSERT(wtree->with_delete==0);
ptr=(byte *)alloc_root(& wtree->mem_root,w.len);
memcpy(ptr, w.pos, w.len);
w.pos=ptr;
}
if (!tree_insert(wtree, &w, 0, wtree->custom_arg))
goto err;
byte *ptr;
/* allocating the data in the tree - to avoid mallocs and frees */
DBUG_ASSERT(wtree->with_delete == 0);
ptr= (byte *)alloc_root(&wtree->mem_root, word_len);
memcpy(ptr, word, word_len);
w.pos= ptr;
}
else
w.pos= word;
w.len= word_len;
if (!tree_insert(wtree, &w, 0, wtree->custom_arg))
{
delete_tree(wtree);
DBUG_RETURN(1);
}
DBUG_RETURN(0);
err:
delete_tree(wtree);
DBUG_RETURN(1);
}
static int ft_parse_internal(void *param, byte *doc, uint doc_len)
{
byte *end=doc+doc_len;
FT_WORD w;
TREE *wtree;
DBUG_ENTER("ft_parse_internal");
wtree= ((MY_FT_PARSER_PARAM *)param)->wtree;
while (ft_simple_get_word(wtree->custom_arg, &doc, end, &w, TRUE))
if (ft_add_word(param, w.pos, w.len, 0))
DBUG_RETURN(1);
DBUG_RETURN(0);
}
int ft_parse(TREE *wtree, byte *doc, int doclen, my_bool with_alloc,
struct st_mysql_ftparser *parser)
{
MYSQL_FTPARSER_PARAM param;
MY_FT_PARSER_PARAM my_param;
DBUG_ENTER("ft_parse");
DBUG_ASSERT(parser);
my_param.wtree= wtree;
my_param.with_alloc= with_alloc;
param.mysql_parse= ft_parse_internal;
param.mysql_add_word= ft_add_word;
param.ftparser_state= 0;
param.mysql_ftparam= &my_param;
param.cs= wtree->custom_arg;
param.doc= doc;
param.length= doclen;
param.mode= MYSQL_FTPARSER_SIMPLE_MODE;
DBUG_RETURN(parser->parse(&param));
}