Commit 60e3b617 authored by serg@serg.mylan's avatar serg@serg.mylan

Incompatible ftparser plugin API change.

mysql_parse() and mysql_add_word() now take a MYSQL_FTPARSER_PARAM*,
not a mysql_ftparam.
parent 9874a762
...@@ -83,12 +83,12 @@ link_sources: ...@@ -83,12 +83,12 @@ link_sources:
for f in $(sql_src) ; do \ for f in $(sql_src) ; do \
rm -f $$f; \ rm -f $$f; \
@LN_CP_F@ $(top_srcdir)/sql/$$f $$f; \ @LN_CP_F@ $(top_srcdir)/sql/$$f $$f; \
done; \ done;
for f in $(strings_src) ; do \ for f in $(strings_src) ; do \
rm -f $(srcdir)/$$f; \ rm -f $(srcdir)/$$f; \
@LN_CP_F@ $(top_srcdir)/strings/$$f $$f; \ @LN_CP_F@ $(top_srcdir)/strings/$$f $$f; \
done; \ done;
rm -f $(srcdir)/my_user.c; \ -rm -f $(srcdir)/my_user.c;
@LN_CP_F@ $(top_srcdir)/sql-common/my_user.c my_user.c @LN_CP_F@ $(top_srcdir)/sql-common/my_user.c my_user.c
......
...@@ -98,9 +98,11 @@ struct st_mysql_plugin ...@@ -98,9 +98,11 @@ struct st_mysql_plugin
API for Full-text [pre]parser plugin. (MYSQL_FTPARSER_PLUGIN) API for Full-text [pre]parser plugin. (MYSQL_FTPARSER_PLUGIN)
*/ */
#define MYSQL_FTPARSER_INTERFACE_VERSION 0x0000 #define MYSQL_FTPARSER_INTERFACE_VERSION 0x0100
/* Parsing modes. Set in MYSQL_FTPARSER_PARAM::mode */ /* Parsing modes. Set in MYSQL_FTPARSER_PARAM::mode */
enum enum_ftparser_mode
{
/* /*
Fast and simple mode. This mode is used for indexing, and natural Fast and simple mode. This mode is used for indexing, and natural
language queries. language queries.
...@@ -109,7 +111,7 @@ struct st_mysql_plugin ...@@ -109,7 +111,7 @@ struct st_mysql_plugin
index. Stopwords or too short/long words should not be returned. The index. Stopwords or too short/long words should not be returned. The
'boolean_info' argument of mysql_add_word() does not have to be set. 'boolean_info' argument of mysql_add_word() does not have to be set.
*/ */
#define MYSQL_FTPARSER_SIMPLE_MODE 0 MYSQL_FTPARSER_SIMPLE_MODE= 0,
/* /*
Parse with stopwords mode. This mode is used in boolean searches for Parse with stopwords mode. This mode is used in boolean searches for
...@@ -120,7 +122,7 @@ struct st_mysql_plugin ...@@ -120,7 +122,7 @@ struct st_mysql_plugin
or long. The 'boolean_info' argument of mysql_add_word() does not or long. The 'boolean_info' argument of mysql_add_word() does not
have to be set. have to be set.
*/ */
#define MYSQL_FTPARSER_WITH_STOPWORDS 1 MYSQL_FTPARSER_WITH_STOPWORDS= 1,
/* /*
Parse in boolean mode. This mode is used to parse a boolean query string. Parse in boolean mode. This mode is used to parse a boolean query string.
...@@ -133,7 +135,8 @@ struct st_mysql_plugin ...@@ -133,7 +135,8 @@ struct st_mysql_plugin
MYSQL_FTPARSER_WITH_STOPWORDS mode, no word should be ignored. MYSQL_FTPARSER_WITH_STOPWORDS mode, no word should be ignored.
Instead, use FT_TOKEN_STOPWORD for the token type of such a word. Instead, use FT_TOKEN_STOPWORD for the token type of such a word.
*/ */
#define MYSQL_FTPARSER_FULL_BOOLEAN_INFO 2 MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
};
/* /*
Token types for boolean mode searching (used for the type member of Token types for boolean mode searching (used for the type member of
...@@ -209,22 +212,20 @@ typedef struct st_mysql_ftparser_boolean_info ...@@ -209,22 +212,20 @@ typedef struct st_mysql_ftparser_boolean_info
to invoke the MySQL default parser. If plugin's role is to extract to invoke the MySQL default parser. If plugin's role is to extract
textual data from .doc, .pdf or .xml content, it might extract textual data from .doc, .pdf or .xml content, it might extract
plaintext from the content, and then pass the text to the default plaintext from the content, and then pass the text to the default
MySQL parser to be parsed. When mysql_parser is called, its param MySQL parser to be parsed.
argument should be given as the mysql_ftparam value.
mysql_add_word: A server callback to add a new word. When parsing mysql_add_word: A server callback to add a new word. When parsing
a document, the server sets this to point at a function that adds a document, the server sets this to point at a function that adds
the word to MySQL full-text index. When parsing a search query, the word to MySQL full-text index. When parsing a search query,
this function will add the new word to the list of words to search this function will add the new word to the list of words to search
for. When mysql_add_word is called, its param argument should be for. The boolean_info argument can be NULL for all cases except
given as the mysql_ftparam value. boolean_info can be NULL for all when mode is MYSQL_FTPARSER_FULL_BOOLEAN_INFO.
cases except when mode is MYSQL_FTPARSER_FULL_BOOLEAN_INFO.
ftparser_state: A generic pointer. The plugin can set it to point ftparser_state: A generic pointer. The plugin can set it to point
to information to be used internally for its own purposes. to information to be used internally for its own purposes.
mysql_ftparam: This is set by the server. It is passed as the first mysql_ftparam: This is set by the server. It is used by MySQL functions
argument to the mysql_parse or mysql_add_word callback. The plugin called via mysql_parse() and mysql_add_word() callback. The plugin
should not modify it. should not modify it.
cs: Information about the character set of the document or query string. cs: Information about the character set of the document or query string.
...@@ -239,15 +240,17 @@ typedef struct st_mysql_ftparser_boolean_info ...@@ -239,15 +240,17 @@ typedef struct st_mysql_ftparser_boolean_info
typedef struct st_mysql_ftparser_param typedef struct st_mysql_ftparser_param
{ {
int (*mysql_parse)(void *param, char *doc, int doc_len); int (*mysql_parse)(struct st_mysql_ftparser_param *,
int (*mysql_add_word)(void *param, char *word, int word_len, char *doc, int doc_len);
int (*mysql_add_word)(struct st_mysql_ftparser_param *,
char *word, int word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info); MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
void *ftparser_state; void *ftparser_state;
void *mysql_ftparam; void *mysql_ftparam;
struct charset_info_st *cs; struct charset_info_st *cs;
char *doc; char *doc;
int length; int length;
int mode; enum enum_ftparser_mode mode;
} MYSQL_FTPARSER_PARAM; } MYSQL_FTPARSER_PARAM;
/* /*
......
...@@ -144,10 +144,7 @@ static void add_word(MYSQL_FTPARSER_PARAM *param, char *word, size_t len) ...@@ -144,10 +144,7 @@ static void add_word(MYSQL_FTPARSER_PARAM *param, char *word, size_t len)
MYSQL_FTPARSER_BOOLEAN_INFO bool_info= MYSQL_FTPARSER_BOOLEAN_INFO bool_info=
{ FT_TOKEN_WORD, 0, 0, 0, 0, ' ', 0 }; { FT_TOKEN_WORD, 0, 0, 0, 0, ' ', 0 };
if (param->mode == MYSQL_FTPARSER_FULL_BOOLEAN_INFO) param->mysql_add_word(param, word, len, &bool_info);
param->mysql_add_word(param->mysql_ftparam, word, len, &bool_info);
else
param->mysql_add_word(param->mysql_ftparam, word, len, 0);
} }
/* /*
......
...@@ -41,8 +41,8 @@ static int min_plugin_interface_version= 0x0000; ...@@ -41,8 +41,8 @@ static int min_plugin_interface_version= 0x0000;
static int min_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]= static int min_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
{ {
0x0000, 0x0000,
0x0000, MYSQL_HANDLERTON_INTERFACE_VERSION,
0x0000 MYSQL_FTPARSER_INTERFACE_VERSION
}; };
static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]= static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
{ {
...@@ -50,6 +50,7 @@ static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]= ...@@ -50,6 +50,7 @@ static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
MYSQL_HANDLERTON_INTERFACE_VERSION, MYSQL_HANDLERTON_INTERFACE_VERSION,
MYSQL_FTPARSER_INTERFACE_VERSION MYSQL_FTPARSER_INTERFACE_VERSION
}; };
static DYNAMIC_ARRAY plugin_dl_array; static DYNAMIC_ARRAY plugin_dl_array;
static DYNAMIC_ARRAY plugin_array; static DYNAMIC_ARRAY plugin_array;
static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM]; static HASH plugin_hash[MYSQL_MAX_PLUGIN_TYPE_NUM];
......
...@@ -160,7 +160,6 @@ static int FTB_WORD_cmp_list(CHARSET_INFO *cs, FTB_WORD **a, FTB_WORD **b) ...@@ -160,7 +160,6 @@ static int FTB_WORD_cmp_list(CHARSET_INFO *cs, FTB_WORD **a, FTB_WORD **b)
typedef struct st_my_ftb_param typedef struct st_my_ftb_param
{ {
MYSQL_FTPARSER_PARAM *up;
FTB *ftb; FTB *ftb;
FTB_EXPR *ftbe; FTB_EXPR *ftbe;
byte *up_quot; byte *up_quot;
...@@ -168,10 +167,11 @@ typedef struct st_my_ftb_param ...@@ -168,10 +167,11 @@ typedef struct st_my_ftb_param
} MY_FTB_PARAM; } MY_FTB_PARAM;
static int ftb_query_add_word(void *param, char *word, int word_len, static int ftb_query_add_word(MYSQL_FTPARSER_PARAM *param,
char *word, int word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *info) MYSQL_FTPARSER_BOOLEAN_INFO *info)
{ {
MY_FTB_PARAM *ftb_param= (MY_FTB_PARAM *)param; MY_FTB_PARAM *ftb_param= param->mysql_ftparam;
FTB_WORD *ftbw; FTB_WORD *ftbw;
FTB_EXPR *ftbe, *tmp_expr; FTB_EXPR *ftbe, *tmp_expr;
FT_WORD *phrase_word; FT_WORD *phrase_word;
...@@ -269,9 +269,10 @@ static int ftb_query_add_word(void *param, char *word, int word_len, ...@@ -269,9 +269,10 @@ static int ftb_query_add_word(void *param, char *word, int word_len,
} }
static int ftb_parse_query_internal(void *param, char *query, int len) static int ftb_parse_query_internal(MYSQL_FTPARSER_PARAM *param,
char *query, int len)
{ {
MY_FTB_PARAM *ftb_param= (MY_FTB_PARAM *)param; MY_FTB_PARAM *ftb_param= param->mysql_ftparam;
MYSQL_FTPARSER_BOOLEAN_INFO info; MYSQL_FTPARSER_BOOLEAN_INFO info;
CHARSET_INFO *cs= ftb_param->ftb->charset; CHARSET_INFO *cs= ftb_param->ftb->charset;
char **start= &query; char **start= &query;
...@@ -281,7 +282,7 @@ static int ftb_parse_query_internal(void *param, char *query, int len) ...@@ -281,7 +282,7 @@ static int ftb_parse_query_internal(void *param, char *query, int len)
info.prev= ' '; info.prev= ' ';
info.quot= 0; info.quot= 0;
while (ft_get_word(cs, start, end, &w, &info)) while (ft_get_word(cs, start, end, &w, &info))
ftb_param->up->mysql_add_word(param, w.pos, w.len, &info); param->mysql_add_word(param, w.pos, w.len, &info);
return(0); return(0);
} }
...@@ -299,7 +300,6 @@ static void _ftb_parse_query(FTB *ftb, byte *query, uint len, ...@@ -299,7 +300,6 @@ static void _ftb_parse_query(FTB *ftb, byte *query, uint len,
if (! (param= ftparser_call_initializer(ftb->info, ftb->keynr, 0))) if (! (param= ftparser_call_initializer(ftb->info, ftb->keynr, 0)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
ftb_param.up= param;
ftb_param.ftb= ftb; ftb_param.ftb= ftb;
ftb_param.depth= 0; ftb_param.depth= 0;
ftb_param.ftbe= ftb->root; ftb_param.ftbe= ftb->root;
...@@ -571,7 +571,6 @@ err: ...@@ -571,7 +571,6 @@ err:
typedef struct st_my_ftb_phrase_param typedef struct st_my_ftb_phrase_param
{ {
MYSQL_FTPARSER_PARAM *up;
LIST *phrase; LIST *phrase;
LIST *document; LIST *document;
CHARSET_INFO *cs; CHARSET_INFO *cs;
...@@ -581,10 +580,11 @@ typedef struct st_my_ftb_phrase_param ...@@ -581,10 +580,11 @@ typedef struct st_my_ftb_phrase_param
} MY_FTB_PHRASE_PARAM; } MY_FTB_PHRASE_PARAM;
static int ftb_phrase_add_word(void *param, char *word, int word_len, static int ftb_phrase_add_word(MYSQL_FTPARSER_PARAM *param,
char *word, int word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused))) MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused)))
{ {
MY_FTB_PHRASE_PARAM *phrase_param= (MY_FTB_PHRASE_PARAM *)param; MY_FTB_PHRASE_PARAM *phrase_param= param->mysql_ftparam;
FT_WORD *w= (FT_WORD *)phrase_param->document->data; FT_WORD *w= (FT_WORD *)phrase_param->document->data;
LIST *phrase, *document; LIST *phrase, *document;
w->pos= word; w->pos= word;
...@@ -611,14 +611,15 @@ static int ftb_phrase_add_word(void *param, char *word, int word_len, ...@@ -611,14 +611,15 @@ static int ftb_phrase_add_word(void *param, char *word, int word_len,
} }
static int ftb_check_phrase_internal(void *param, char *document, int len) static int ftb_check_phrase_internal(MYSQL_FTPARSER_PARAM *param,
char *document, int len)
{ {
FT_WORD word; FT_WORD word;
MY_FTB_PHRASE_PARAM *phrase_param= (MY_FTB_PHRASE_PARAM *)param; MY_FTB_PHRASE_PARAM *phrase_param= param->mysql_ftparam;
const char *docend= document + len; const char *docend= document + len;
while (ft_simple_get_word(phrase_param->cs, &document, docend, &word, FALSE)) while (ft_simple_get_word(phrase_param->cs, &document, docend, &word, FALSE))
{ {
phrase_param->up->mysql_add_word(param, word.pos, word.len, 0); param->mysql_add_word(param, word.pos, word.len, 0);
if (phrase_param->match) if (phrase_param->match)
return 1; return 1;
} }
...@@ -651,7 +652,6 @@ static int _ftb_check_phrase(FTB *ftb, const byte *document, uint len, ...@@ -651,7 +652,6 @@ static int _ftb_check_phrase(FTB *ftb, const byte *document, uint len,
if (! (param= ftparser_call_initializer(ftb->info, ftb->keynr, 1))) if (! (param= ftparser_call_initializer(ftb->info, ftb->keynr, 1)))
DBUG_RETURN(0); DBUG_RETURN(0);
ftb_param.up= param;
ftb_param.phrase= ftbe->phrase; ftb_param.phrase= ftbe->phrase;
ftb_param.document= ftbe->document; ftb_param.document= ftbe->document;
ftb_param.cs= ftb->charset; ftb_param.cs= ftb->charset;
...@@ -820,16 +820,16 @@ err: ...@@ -820,16 +820,16 @@ err:
typedef struct st_my_ftb_find_param typedef struct st_my_ftb_find_param
{ {
MYSQL_FTPARSER_PARAM *up;
FT_INFO *ftb; FT_INFO *ftb;
FT_SEG_ITERATOR *ftsi; FT_SEG_ITERATOR *ftsi;
} MY_FTB_FIND_PARAM; } MY_FTB_FIND_PARAM;
static int ftb_find_relevance_add_word(void *param, char *word, int len, static int ftb_find_relevance_add_word(MYSQL_FTPARSER_PARAM *param,
char *word, int len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused))) MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused)))
{ {
MY_FTB_FIND_PARAM *ftb_param= (MY_FTB_FIND_PARAM *)param; MY_FTB_FIND_PARAM *ftb_param= param->mysql_ftparam;
FT_INFO *ftb= ftb_param->ftb; FT_INFO *ftb= ftb_param->ftb;
FTB_WORD *ftbw; FTB_WORD *ftbw;
int a, b, c; int a, b, c;
...@@ -859,14 +859,15 @@ static int ftb_find_relevance_add_word(void *param, char *word, int len, ...@@ -859,14 +859,15 @@ static int ftb_find_relevance_add_word(void *param, char *word, int len,
} }
static int ftb_find_relevance_parse(void *param, char *doc, int len) static int ftb_find_relevance_parse(MYSQL_FTPARSER_PARAM *param,
char *doc, int len)
{ {
MY_FTB_FIND_PARAM *ftb_param=(MY_FTB_FIND_PARAM *)param; MY_FTB_FIND_PARAM *ftb_param= param->mysql_ftparam;
FT_INFO *ftb= ftb_param->ftb; FT_INFO *ftb= ftb_param->ftb;
char *end= doc + len; char *end= doc + len;
FT_WORD w; FT_WORD w;
while (ft_simple_get_word(ftb->charset, &doc, end, &w, TRUE)) while (ft_simple_get_word(ftb->charset, &doc, end, &w, TRUE))
ftb_param->up->mysql_add_word(param, w.pos, w.len, 0); param->mysql_add_word(param, w.pos, w.len, 0);
return(0); return(0);
} }
...@@ -910,7 +911,6 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) ...@@ -910,7 +911,6 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
_mi_ft_segiterator_init(ftb->info, ftb->keynr, record, &ftsi); _mi_ft_segiterator_init(ftb->info, ftb->keynr, record, &ftsi);
memcpy(&ftsi2, &ftsi, sizeof(ftsi)); memcpy(&ftsi2, &ftsi, sizeof(ftsi));
ftb_param.up= param;
ftb_param.ftb= ftb; ftb_param.ftb= ftb;
ftb_param.ftsi= &ftsi2; ftb_param.ftsi= &ftsi2;
param->mysql_parse= ftb_find_relevance_parse; param->mysql_parse= ftb_find_relevance_parse;
......
...@@ -27,7 +27,6 @@ typedef struct st_ft_docstat { ...@@ -27,7 +27,6 @@ typedef struct st_ft_docstat {
typedef struct st_my_ft_parser_param typedef struct st_my_ft_parser_param
{ {
MYSQL_FTPARSER_PARAM *up;
TREE *wtree; TREE *wtree;
my_bool with_alloc; my_bool with_alloc;
} MY_FT_PARSER_PARAM; } MY_FT_PARSER_PARAM;
...@@ -241,14 +240,16 @@ void ft_parse_init(TREE *wtree, CHARSET_INFO *cs) ...@@ -241,14 +240,16 @@ void ft_parse_init(TREE *wtree, CHARSET_INFO *cs)
} }
static int ft_add_word(void *param, byte *word, uint word_len, static int ft_add_word(MYSQL_FTPARSER_PARAM *param,
char *word, int word_len,
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused))) MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info __attribute__((unused)))
{ {
TREE *wtree; TREE *wtree;
FT_WORD w; FT_WORD w;
MY_FT_PARSER_PARAM *ft_param=param->mysql_ftparam;
DBUG_ENTER("ft_add_word"); DBUG_ENTER("ft_add_word");
wtree= ((MY_FT_PARSER_PARAM *)param)->wtree; wtree= ft_param->wtree;
if (((MY_FT_PARSER_PARAM *)param)->with_alloc) if (ft_param->with_alloc)
{ {
byte *ptr; byte *ptr;
/* allocating the data in the tree - to avoid mallocs and frees */ /* allocating the data in the tree - to avoid mallocs and frees */
...@@ -269,16 +270,17 @@ static int ft_add_word(void *param, byte *word, uint word_len, ...@@ -269,16 +270,17 @@ static int ft_add_word(void *param, byte *word, uint word_len,
} }
static int ft_parse_internal(void *param, byte *doc, int doc_len) static int ft_parse_internal(MYSQL_FTPARSER_PARAM *param,
byte *doc, int doc_len)
{ {
byte *end=doc+doc_len; byte *end=doc+doc_len;
MY_FT_PARSER_PARAM *ft_param=(MY_FT_PARSER_PARAM *)param; MY_FT_PARSER_PARAM *ft_param=param->mysql_ftparam;
TREE *wtree= ft_param->wtree; TREE *wtree= ft_param->wtree;
FT_WORD w; FT_WORD w;
DBUG_ENTER("ft_parse_internal"); DBUG_ENTER("ft_parse_internal");
while (ft_simple_get_word(wtree->custom_arg, &doc, end, &w, TRUE)) while (ft_simple_get_word(wtree->custom_arg, &doc, end, &w, TRUE))
if (ft_param->up->mysql_add_word(param, w.pos, w.len, 0)) if (param->mysql_add_word(param, w.pos, w.len, 0))
DBUG_RETURN(1); DBUG_RETURN(1);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -292,7 +294,6 @@ int ft_parse(TREE *wtree, byte *doc, int doclen, my_bool with_alloc, ...@@ -292,7 +294,6 @@ int ft_parse(TREE *wtree, byte *doc, int doclen, my_bool with_alloc,
DBUG_ENTER("ft_parse"); DBUG_ENTER("ft_parse");
DBUG_ASSERT(parser); DBUG_ASSERT(parser);
my_param.up= param;
my_param.wtree= wtree; my_param.wtree= wtree;
my_param.with_alloc= with_alloc; my_param.with_alloc= with_alloc;
......
...@@ -629,7 +629,7 @@ const char *ft_precompiled_stopwords[] = { ...@@ -629,7 +629,7 @@ const char *ft_precompiled_stopwords[] = {
static int ft_default_parser_parse(MYSQL_FTPARSER_PARAM *param) static int ft_default_parser_parse(MYSQL_FTPARSER_PARAM *param)
{ {
return param->mysql_parse(param->mysql_ftparam, param->doc, param->length); return param->mysql_parse(param, param->doc, param->length);
} }
struct st_mysql_ftparser ft_default_parser= struct st_mysql_ftparser ft_default_parser=
......
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