#include #include #include #include #include #include #include int fulltext_boolean_test_init(MYSQL_FTPARSER_PARAM *param) { DBUG_ENTER("fulltext_boolean_test_init"); DBUG_RETURN(0); } int fulltext_boolean_test_deinit(MYSQL_FTPARSER_PARAM *param) { DBUG_ENTER("fulltext_boolean_test_deinit"); DBUG_RETURN(0); } int fulltext_boolean_plugin_test_init(void *p) { DBUG_ENTER("fulltext_boolean_plugin_test_init"); DBUG_RETURN(0); } int fulltext_boolean_plugin_test_deinit(void *p) { DBUG_ENTER("fulltext_boolean_plugin_test_deinit"); DBUG_RETURN(0); } static void boolean_test_add_word(MYSQL_FTPARSER_PARAM *param, char *word, int length, MYSQL_FTPARSER_BOOLEAN_INFO *boolinfo) { DBUG_ENTER("boolean_test_add_word"); char debug[255]=""; strncpy(debug, word, length); fprintf(stderr, "Word: %s\n", debug); param->flags |= MYSQL_FTFLAGS_NEED_COPY; param->mysql_add_word(param, word, length, boolinfo); DBUG_VOID_RETURN; } static void boolean_test_add_symbol(MYSQL_FTPARSER_PARAM *param, MYSQL_FTPARSER_BOOLEAN_INFO *boolinfo) { DBUG_ENTER("boolean_test_add_symbol"); fprintf(stderr, "Sym: %d\n", boolinfo->type); param->mysql_add_word(param, NULL, 0, boolinfo); DBUG_VOID_RETURN; } int fulltext_boolean_test_parser(MYSQL_FTPARSER_PARAM *param) { DBUG_ENTER("fulltext_boolean_test_parser"); char *pos; char *end = param->doc + param->length; int inquote = 0; char word[255]; int wordpos=0; MYSQL_FTPARSER_BOOLEAN_INFO boolinfo = { FT_TOKEN_WORD, 0, 0, 0, 0, ' ', 0 }; for (pos = param->doc; pos < end; pos++) { if (inquote) { boolinfo.yesno = 1; } else { boolinfo.yesno = 0; } switch (*pos) { case '\'': case '\"': if (inquote) { inquote = 0; boolean_test_add_word(param, word, wordpos, &boolinfo); wordpos=0; boolinfo.type = FT_TOKEN_RIGHT_PAREN; boolean_test_add_symbol(param, &boolinfo); boolinfo.quot = 0; boolinfo.type = FT_TOKEN_WORD; continue; } else { inquote = 1; boolinfo.type = FT_TOKEN_LEFT_PAREN; boolinfo.quot = pos; boolean_test_add_symbol(param, &boolinfo); boolinfo.type = FT_TOKEN_WORD; continue; } break; } if ((isspace(*pos)) && (wordpos > 0)) { boolean_test_add_word(param, word, wordpos, &boolinfo); wordpos=0; } else if (!isspace(*pos)) { word[wordpos] = *pos; wordpos++; } } if (wordpos > 0) { boolean_test_add_word(param, word, wordpos, &boolinfo); } DBUG_RETURN(0); } int fulltext_boolean_test_parse(MYSQL_FTPARSER_PARAM *param) { DBUG_ENTER("fulltext_boolean_parse"); if(param->mode == MYSQL_FTPARSER_FULL_BOOLEAN_INFO){ DBUG_RETURN(fulltext_boolean_test_parser(param)); } else { DBUG_RETURN(param->mysql_parse(param, param->doc, param->length)); } } static struct st_mysql_ftparser fulltext_boolean_test_descriptor= { MYSQL_FTPARSER_INTERFACE_VERSION, /* interface version */ fulltext_boolean_test_parse, /* parsing function */ fulltext_boolean_test_init, /* parser init function */ fulltext_boolean_test_deinit /* parser deinit function */ }; mysql_declare_plugin(fulltext_boolean_test) { MYSQL_FTPARSER_PLUGIN, &fulltext_boolean_test_descriptor, "fulltext_boolean_test", "Andrew Hutchings ", "A Full-Text boolean test parser to show quote bug", PLUGIN_LICENSE_GPL, fulltext_boolean_plugin_test_init, fulltext_boolean_plugin_test_deinit, 0x0010, NULL, NULL, NULL } mysql_declare_plugin_end;