Below is the list of changes that have just been committed into a local
5.1 repository of svoj. When svoj does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2194 06/06/14 15:17:47 svoj@stripped +3 -0
Merge svojtovich@stripped:/home/bk/mysql-5.1-engines
into may.pils.ru:/home/svoj/devel/mysql/BUG19580/mysql-5.1-new
storage/myisam/ftdefs.h
1.38 06/06/14 15:17:40 svoj@stripped +0 -0
Auto merged
storage/myisam/ft_update.c
1.44 06/06/14 15:17:40 svoj@stripped +0 -0
Auto merged
storage/myisam/ft_parser.c
1.55 06/06/14 15:17:40 svoj@stripped +0 -0
Auto merged
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: svoj
# Host: may.pils.ru
# Root: /home/svoj/devel/mysql/BUG19580/mysql-5.1-new/RESYNC
--- 1.54/storage/myisam/ft_parser.c 2006-05-30 21:14:53 +05:00
+++ 1.55/storage/myisam/ft_parser.c 2006-06-14 15:17:40 +05:00
@@ -111,6 +111,7 @@ byte ft_get_word(CHARSET_INFO *cs, byte
FT_WORD *word, MYSQL_FTPARSER_BOOLEAN_INFO *param)
{
byte *doc=*start;
+ int ctype;
uint mwc, length, mbl;
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
@@ -119,9 +120,11 @@ byte ft_get_word(CHARSET_INFO *cs, byte
while (doc<end)
{
- for (;doc<end;doc++)
+ for (; doc < end; doc+= (mbl > 0 ? mbl : 1))
{
- if (true_word_char(cs,*doc)) break;
+ mbl= cs->cset->ctype(cs, &ctype, (uchar*)doc, (uchar*)end);
+ if (true_word_char(ctype, *doc))
+ break;
if (*doc == FTB_RQUOT && param->quot)
{
param->quot=doc;
@@ -155,14 +158,16 @@ byte ft_get_word(CHARSET_INFO *cs, byte
}
mwc=length=0;
- for (word->pos=doc; doc<end; length++, mbl=my_mbcharlen(cs, *(uchar *)doc), doc+=(mbl ? mbl : 1))
- if (true_word_char(cs,*doc))
+ for (word->pos= doc; doc < end; length++, doc+= (mbl > 0 ? mbl : 1))
+ {
+ mbl= cs->cset->ctype(cs, &ctype, (uchar*)doc, (uchar*)end);
+ if (true_word_char(ctype, *doc))
mwc=0;
else if (!misc_word_char(*doc) || mwc)
break;
else
mwc++;
-
+ }
param->prev='A'; /* be sure *prev is true_word_char */
word->len= (uint)(doc-word->pos) - mwc;
if ((param->trunc=(doc<end && *doc == FTB_TRUNC)))
@@ -197,24 +202,31 @@ byte ft_simple_get_word(CHARSET_INFO *cs
{
byte *doc= *start;
uint mwc, length, mbl;
+ int ctype;
DBUG_ENTER("ft_simple_get_word");
do
{
- for (;; doc++)
+ for (;; doc+= (mbl > 0 ? mbl : 1))
{
- if (doc >= end) DBUG_RETURN(0);
- if (true_word_char(cs, *doc)) break;
+ if (doc >= end)
+ DBUG_RETURN(0);
+ mbl= cs->cset->ctype(cs, &ctype, (uchar*)doc, (uchar*)end);
+ if (true_word_char(ctype, *doc))
+ break;
}
mwc= length= 0;
- for (word->pos=doc; doc<end; length++, mbl=my_mbcharlen(cs, *(uchar *)doc), doc+=(mbl ? mbl : 1))
- if (true_word_char(cs,*doc))
+ for (word->pos= doc; doc < end; length++, doc+= (mbl > 0 ? mbl : 1))
+ {
+ mbl= cs->cset->ctype(cs, &ctype, (uchar*)doc, (uchar*)end);
+ if (true_word_char(ctype, *doc))
mwc= 0;
else if (!misc_word_char(*doc) || mwc)
break;
else
mwc++;
+ }
word->len= (uint)(doc-word->pos) - mwc;
--- 1.43/storage/myisam/ft_update.c 2006-05-29 16:45:08 +05:00
+++ 1.44/storage/myisam/ft_update.c 2006-06-14 15:17:40 +05:00
@@ -77,7 +77,7 @@ uint _mi_ft_segiterator(register FT_SEG_
{
uint pack_length= (ftsi->seg->bit_start);
ftsi->len= (pack_length == 1 ? (uint) *(uchar*) ftsi->pos :
- uint2korr(ftsi->pos));
+ uint2korr(ftsi->pos));
ftsi->pos+= pack_length; /* Skip VARCHAR length */
DBUG_RETURN(1);
}
@@ -95,9 +95,8 @@ uint _mi_ft_segiterator(register FT_SEG_
/* parses a document i.e. calls ft_parse for every keyseg */
-uint _mi_ft_parse(TREE *parsed, MI_INFO *info, uint keynr,
- const byte *record, my_bool with_alloc,
- MYSQL_FTPARSER_PARAM *param)
+uint _mi_ft_parse(TREE *parsed, MI_INFO *info, uint keynr, const byte *record,
+ MYSQL_FTPARSER_PARAM *param, MEM_ROOT *mem_root)
{
FT_SEG_ITERATOR ftsi;
struct st_mysql_ftparser *parser;
@@ -110,14 +109,14 @@ uint _mi_ft_parse(TREE *parsed, MI_INFO
while (_mi_ft_segiterator(&ftsi))
{
if (ftsi.pos)
- if (ft_parse(parsed, (byte *)ftsi.pos, ftsi.len, with_alloc, parser,
- param))
+ if (ft_parse(parsed, (byte *)ftsi.pos, ftsi.len, parser, param, mem_root))
DBUG_RETURN(1);
}
DBUG_RETURN(0);
}
-FT_WORD * _mi_ft_parserecord(MI_INFO *info, uint keynr, const byte *record)
+FT_WORD *_mi_ft_parserecord(MI_INFO *info, uint keynr, const byte *record,
+ MEM_ROOT *mem_root)
{
TREE ptree;
MYSQL_FTPARSER_PARAM *param;
@@ -125,10 +124,11 @@ FT_WORD * _mi_ft_parserecord(MI_INFO *in
if (! (param= ftparser_call_initializer(info, keynr, 0)))
DBUG_RETURN(NULL);
bzero((char*) &ptree, sizeof(ptree));
- if (_mi_ft_parse(&ptree, info, keynr, record, 0, param))
+ param->flags= 0;
+ if (_mi_ft_parse(&ptree, info, keynr, record, param, mem_root))
DBUG_RETURN(NULL);
- DBUG_RETURN(ft_linearize(&ptree));
+ DBUG_RETURN(ft_linearize(&ptree, mem_root));
}
static int _mi_ft_store(MI_INFO *info, uint keynr, byte *keybuf,
@@ -201,10 +201,11 @@ int _mi_ft_update(MI_INFO *info, uint ke
int cmp, cmp2;
DBUG_ENTER("_mi_ft_update");
- if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, oldrec)))
- goto err0;
- if (!(new_word=newlist=_mi_ft_parserecord(info, keynr, newrec)))
- goto err1;
+ if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, oldrec,
+ &info->ft_memroot)) ||
+ !(new_word=newlist=_mi_ft_parserecord(info, keynr, newrec,
+ &info->ft_memroot)))
+ goto err;
error=0;
while(old_word->pos && new_word->pos)
@@ -217,13 +218,13 @@ int _mi_ft_update(MI_INFO *info, uint ke
{
key_length=_ft_make_key(info,keynr,keybuf,old_word,pos);
if ((error=_mi_ck_delete(info,keynr,(uchar*) keybuf,key_length)))
- goto err2;
+ goto err;
}
if (cmp > 0 || cmp2)
{
key_length=_ft_make_key(info,keynr,keybuf,new_word,pos);
if ((error=_mi_ck_write(info,keynr,(uchar*) keybuf,key_length)))
- goto err2;
+ goto err;
}
if (cmp<=0) old_word++;
if (cmp>=0) new_word++;
@@ -233,11 +234,8 @@ int _mi_ft_update(MI_INFO *info, uint ke
else if (new_word->pos)
error=_mi_ft_store(info,keynr,keybuf,new_word,pos);
-err2:
- my_free((char*) newlist,MYF(0));
-err1:
- my_free((char*) oldlist,MYF(0));
-err0:
+err:
+ free_root(&info->ft_memroot, MYF(MY_MARK_BLOCKS_FREE));
DBUG_RETURN(error);
}
@@ -250,12 +248,13 @@ int _mi_ft_add(MI_INFO *info, uint keynr
int error= -1;
FT_WORD *wlist;
DBUG_ENTER("_mi_ft_add");
+ DBUG_PRINT("enter",("keynr: %d",keynr));
- if ((wlist=_mi_ft_parserecord(info, keynr, record)))
- {
+ if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
error=_mi_ft_store(info,keynr,keybuf,wlist,pos);
- my_free((char*) wlist,MYF(0));
- }
+
+ free_root(&info->ft_memroot, MYF(MY_MARK_BLOCKS_FREE));
+ DBUG_PRINT("exit",("Return: %d",error));
DBUG_RETURN(error);
}
@@ -270,11 +269,10 @@ int _mi_ft_del(MI_INFO *info, uint keynr
DBUG_ENTER("_mi_ft_del");
DBUG_PRINT("enter",("keynr: %d",keynr));
- if ((wlist=_mi_ft_parserecord(info, keynr, record)))
- {
+ if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot)))
error=_mi_ft_erase(info,keynr,keybuf,wlist,pos);
- my_free((char*) wlist,MYF(0));
- }
+
+ free_root(&info->ft_memroot, MYF(MY_MARK_BLOCKS_FREE));
DBUG_PRINT("exit",("Return: %d",error));
DBUG_RETURN(error);
}
--- 1.37/storage/myisam/ftdefs.h 2006-05-29 16:45:09 +05:00
+++ 1.38/storage/myisam/ftdefs.h 2006-06-14 15:17:40 +05:00
@@ -31,6 +31,8 @@
#define FT_MAX_WORD_LEN_FOR_SORT 31
+#define FTPARSER_MEMROOT_ALLOC_SIZE 65536
+
#define COMPILE_STOPWORDS_IN
/* Interested readers may consult SMART
@@ -120,12 +122,12 @@ void _mi_ft_segiterator_dummy_init(const
uint _mi_ft_segiterator(FT_SEG_ITERATOR *);
void ft_parse_init(TREE *, CHARSET_INFO *);
-int ft_parse(TREE *, byte *, int, my_bool, struct st_mysql_ftparser *parser,
- MYSQL_FTPARSER_PARAM *param);
-FT_WORD * ft_linearize(TREE *);
-FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const byte *);
-uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *, my_bool,
- MYSQL_FTPARSER_PARAM *param);
+int ft_parse(TREE *, byte *, int, struct st_mysql_ftparser *parser,
+ MYSQL_FTPARSER_PARAM *, MEM_ROOT *);
+FT_WORD * ft_linearize(TREE *, MEM_ROOT *);
+FT_WORD * _mi_ft_parserecord(MI_INFO *, uint, const byte *, MEM_ROOT *);
+uint _mi_ft_parse(TREE *, MI_INFO *, uint, const byte *,
+ MYSQL_FTPARSER_PARAM *, MEM_ROOT *);
FT_INFO *ft_init_nlq_search(MI_INFO *, uint, byte *, uint, uint, byte *);
FT_INFO *ft_init_boolean_search(MI_INFO *, uint, byte *, uint, CHARSET_INFO *);
| Thread |
|---|
| • bk commit into 5.1 tree (svoj:1.2194) | Sergey Vojtovich | 14 Jun |