Merge bk-internal:/home/bk/mysql-4.1/
into serg.mylan:/usr/home/serg/Abk/mysql-4.1
This commit is contained in:
commit
cb6cd9affe
@ -61,12 +61,12 @@ typedef struct st_ftb_expr FTB_EXPR;
|
|||||||
struct st_ftb_expr
|
struct st_ftb_expr
|
||||||
{
|
{
|
||||||
FTB_EXPR *up;
|
FTB_EXPR *up;
|
||||||
my_off_t docid[2];
|
uint flags;
|
||||||
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
|
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
|
||||||
|
my_off_t docid[2];
|
||||||
float weight;
|
float weight;
|
||||||
float cur_weight;
|
float cur_weight;
|
||||||
byte *quot, *qend;
|
byte *quot, *qend;
|
||||||
uint flags;
|
|
||||||
uint yesses; /* number of "yes" words matched */
|
uint yesses; /* number of "yes" words matched */
|
||||||
uint nos; /* number of "no" words matched */
|
uint nos; /* number of "no" words matched */
|
||||||
uint ythresh; /* number of "yes" words in expr */
|
uint ythresh; /* number of "yes" words in expr */
|
||||||
@ -76,13 +76,13 @@ struct st_ftb_expr
|
|||||||
typedef struct st_ftb_word
|
typedef struct st_ftb_word
|
||||||
{
|
{
|
||||||
FTB_EXPR *up;
|
FTB_EXPR *up;
|
||||||
MI_KEYDEF *keyinfo;
|
uint flags;
|
||||||
my_off_t docid[2]; /* for index search and for scan */
|
|
||||||
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
|
/* ^^^^^^^^^^^^^^^^^^ FTB_{EXPR,WORD} common section */
|
||||||
|
my_off_t docid[2]; /* for index search and for scan */
|
||||||
my_off_t key_root;
|
my_off_t key_root;
|
||||||
|
MI_KEYDEF *keyinfo;
|
||||||
float weight;
|
float weight;
|
||||||
uint ndepth;
|
uint ndepth;
|
||||||
uint flags;
|
|
||||||
uint len;
|
uint len;
|
||||||
uchar off;
|
uchar off;
|
||||||
byte word[1];
|
byte word[1];
|
||||||
@ -193,7 +193,7 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)),
|
static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)),
|
||||||
const void *a,const void *b)
|
const void *a,const void *b)
|
||||||
{
|
{
|
||||||
return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b)));
|
return CMP_NUM((*((my_off_t*)a)), (*((my_off_t*)b)));
|
||||||
}
|
}
|
||||||
@ -238,9 +238,9 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
|||||||
if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0)
|
if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
This word MUST BE present in every document returned,
|
This word MUST BE present in every document returned,
|
||||||
so we can stop the search right now
|
so we can stop the search right now
|
||||||
*/
|
*/
|
||||||
ftb->state=INDEX_DONE;
|
ftb->state=INDEX_DONE;
|
||||||
return 1; /* search is done */
|
return 1; /* search is done */
|
||||||
}
|
}
|
||||||
@ -250,7 +250,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
|||||||
|
|
||||||
/* going up to the first-level tree to continue search there */
|
/* going up to the first-level tree to continue search there */
|
||||||
_mi_dpointer(info, (uchar*) (ftbw->word+ftbw->off+HA_FT_WLEN),
|
_mi_dpointer(info, (uchar*) (ftbw->word+ftbw->off+HA_FT_WLEN),
|
||||||
ftbw->key_root);
|
ftbw->key_root);
|
||||||
ftbw->key_root=info->s->state.key_root[ftb->keynr];
|
ftbw->key_root=info->s->state.key_root[ftb->keynr];
|
||||||
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
|
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
|
||||||
ftbw->off=0;
|
ftbw->off=0;
|
||||||
@ -297,7 +297,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
if (ftbw->flags & FTB_FLAG_TRUNC)
|
if (ftbw->flags & FTB_FLAG_TRUNC)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
special treatment for truncation operator
|
special treatment for truncation operator
|
||||||
1. there are some (besides this) +words
|
1. there are some (besides this) +words
|
||||||
| no need to search in the index, it can never ADD new rows
|
| no need to search in the index, it can never ADD new rows
|
||||||
| to the result, and to remove half-matched rows we do scan anyway
|
| to the result, and to remove half-matched rows we do scan anyway
|
||||||
@ -348,7 +348,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
|||||||
|
|
||||||
|
|
||||||
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
||||||
uint query_len)
|
uint query_len)
|
||||||
{
|
{
|
||||||
FTB *ftb;
|
FTB *ftb;
|
||||||
FTB_EXPR *ftbe;
|
FTB_EXPR *ftbe;
|
||||||
@ -419,7 +419,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0,
|
|||||||
while (p0 < e0)
|
while (p0 < e0)
|
||||||
{
|
{
|
||||||
while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] !=
|
while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] !=
|
||||||
cs->to_upper[(uint) (uchar) *s1])
|
cs->to_upper[(uint) (uchar) *s1])
|
||||||
/* no-op */;
|
/* no-op */;
|
||||||
if (p0 >= e0)
|
if (p0 >= e0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -429,7 +429,7 @@ static int _ftb_strstr(const byte *s0, const byte *e0,
|
|||||||
|
|
||||||
p1=s1+1;
|
p1=s1+1;
|
||||||
while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] ==
|
while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] ==
|
||||||
cs->to_upper[(uint) (uchar) *p1])
|
cs->to_upper[(uint) (uchar) *p1])
|
||||||
p0++, p1++;
|
p0++, p1++;
|
||||||
if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0])))
|
if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0])))
|
||||||
return 1;
|
return 1;
|
||||||
@ -487,12 +487,12 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_
|
|||||||
if (yn & FTB_FLAG_NO)
|
if (yn & FTB_FLAG_NO)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
NOTE: special sort function of queue assures that all
|
NOTE: special sort function of queue assures that all
|
||||||
(yn & FTB_FLAG_NO) != 0
|
(yn & FTB_FLAG_NO) != 0
|
||||||
events for every particular subexpression will
|
events for every particular subexpression will
|
||||||
"auto-magically" happen BEFORE all the
|
"auto-magically" happen BEFORE all the
|
||||||
(yn & FTB_FLAG_YES) != 0 events. So no
|
(yn & FTB_FLAG_YES) != 0 events. So no
|
||||||
already matched expression can become not-matched again.
|
already matched expression can become not-matched again.
|
||||||
*/
|
*/
|
||||||
++ftbe->nos;
|
++ftbe->nos;
|
||||||
break;
|
break;
|
||||||
@ -500,7 +500,7 @@ static void _ftb_climb_the_tree(FTB *ftb, FTB_WORD *ftbw, FT_SEG_ITERATOR *ftsi_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ftbe->ythresh)
|
if (ftbe->ythresh)
|
||||||
weight/=3;
|
weight/=3;
|
||||||
ftbe->cur_weight += weight;
|
ftbe->cur_weight += weight;
|
||||||
if ((int) ftbe->yesses < ythresh)
|
if ((int) ftbe->yesses < ythresh)
|
||||||
break;
|
break;
|
||||||
@ -535,8 +535,8 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
|
|||||||
ftb->queue.first_cmp_arg=(void *)&curdoc;
|
ftb->queue.first_cmp_arg=(void *)&curdoc;
|
||||||
|
|
||||||
while (ftb->state == INDEX_SEARCH &&
|
while (ftb->state == INDEX_SEARCH &&
|
||||||
(curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) !=
|
(curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) !=
|
||||||
HA_POS_ERROR)
|
HA_POS_ERROR)
|
||||||
{
|
{
|
||||||
while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0])
|
while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0])
|
||||||
{
|
{
|
||||||
@ -554,7 +554,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
|
|||||||
/* curdoc matched ! */
|
/* curdoc matched ! */
|
||||||
if (is_tree_inited(&ftb->no_dupes) &&
|
if (is_tree_inited(&ftb->no_dupes) &&
|
||||||
tree_insert(&ftb->no_dupes, &curdoc, 0,
|
tree_insert(&ftb->no_dupes, &curdoc, 0,
|
||||||
ftb->no_dupes.custom_arg)->count >1)
|
ftb->no_dupes.custom_arg)->count >1)
|
||||||
/* but it managed already to get past this line once */
|
/* but it managed already to get past this line once */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -93,27 +93,30 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
|
|||||||
for (;doc<end;doc++)
|
for (;doc<end;doc++)
|
||||||
{
|
{
|
||||||
if (true_word_char(cs,*doc)) break;
|
if (true_word_char(cs,*doc)) break;
|
||||||
if (*doc == FTB_RQUOT && param->quot) {
|
if (*doc == FTB_RQUOT && param->quot)
|
||||||
|
{
|
||||||
param->quot=doc;
|
param->quot=doc;
|
||||||
*start=doc+1;
|
*start=doc+1;
|
||||||
return 3; /* FTB_RBR */
|
return 3; /* FTB_RBR */
|
||||||
}
|
}
|
||||||
if ((*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT)
|
if (!param->quot)
|
||||||
&& !param->quot)
|
|
||||||
{
|
{
|
||||||
/* param->prev=' '; */
|
if (*doc == FTB_LBR || *doc == FTB_RBR || *doc == FTB_LQUOT)
|
||||||
*start=doc+1;
|
{
|
||||||
if (*doc == FTB_LQUOT) param->quot=*start;
|
/* param->prev=' '; */
|
||||||
return (*doc == FTB_RBR)+2;
|
*start=doc+1;
|
||||||
}
|
if (*doc == FTB_LQUOT) param->quot=*start;
|
||||||
if (param->prev == ' ' && !param->quot)
|
return (*doc == FTB_RBR)+2;
|
||||||
{
|
}
|
||||||
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else
|
if (param->prev == ' ')
|
||||||
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else
|
{
|
||||||
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else
|
if (*doc == FTB_YES ) { param->yesno=+1; continue; } else
|
||||||
if (*doc == FTB_INC ) { param->plusminus++; continue; } else
|
if (*doc == FTB_EGAL) { param->yesno= 0; continue; } else
|
||||||
if (*doc == FTB_DEC ) { param->plusminus--; continue; } else
|
if (*doc == FTB_NO ) { param->yesno=-1; continue; } else
|
||||||
if (*doc == FTB_NEG ) { param->pmsign=!param->pmsign; continue; }
|
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; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
param->prev=*doc;
|
param->prev=*doc;
|
||||||
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
|
param->yesno=(FTB_YES==' ') ? 1 : (param->quot != 0);
|
||||||
@ -139,6 +142,11 @@ byte ft_get_word(CHARSET_INFO *cs, byte **start, byte *end,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (param->quot)
|
||||||
|
{
|
||||||
|
param->quot=*start=doc;
|
||||||
|
return 3; /* FTB_RBR */
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ ERROR 42000: You have an error in your SQL syntax. Check the manual that corres
|
|||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values (1),(2),(3);
|
insert into t1 values (1),(2),(3);
|
||||||
update (select * from t1) as t1 set a = 5;
|
update (select * from t1) as t1 set a = 5;
|
||||||
ERROR HY000: The target table t1 of the UPDATE is not updatable.
|
ERROR HY000: The target table t1 of the UPDATE is not updatable
|
||||||
delete from (select * from t1);
|
delete from (select * from t1);
|
||||||
ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(select * from t1)' at line 1
|
ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(select * from t1)' at line 1
|
||||||
insert into (select * from t1) values (5);
|
insert into (select * from t1) values (5);
|
||||||
@ -264,7 +264,7 @@ N M
|
|||||||
2 2
|
2 2
|
||||||
3 0
|
3 0
|
||||||
UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2, P2.N = 2;
|
UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2, P2.N = 2;
|
||||||
ERROR HY000: The target table P2 of the UPDATE is not updatable.
|
ERROR HY000: The target table P2 of the UPDATE is not updatable
|
||||||
UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
|
UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
|
||||||
ERROR 42S22: Unknown column 'aaaa' in 'field list'
|
ERROR 42S22: Unknown column 'aaaa' in 'field list'
|
||||||
delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
||||||
@ -272,7 +272,7 @@ select * from t1;
|
|||||||
N M
|
N M
|
||||||
3 0
|
3 0
|
||||||
delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
||||||
ERROR HY000: The target table P2 of the DELETE is not updatable.
|
ERROR HY000: The target table P2 of the DELETE is not updatable
|
||||||
delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
|
||||||
ERROR 42S22: Unknown column 'aaa' in 'field list'
|
ERROR 42S22: Unknown column 'aaa' in 'field list'
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -140,6 +140,9 @@ select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
|
|||||||
a b
|
a b
|
||||||
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
|
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
|
||||||
a b
|
a b
|
||||||
|
select * from t1 where MATCH a,b AGAINST('"space model' IN BOOLEAN MODE);
|
||||||
|
a b
|
||||||
|
Full-text search in MySQL implements vector space model
|
||||||
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
||||||
a b
|
a b
|
||||||
Full-text search in MySQL implements vector space model
|
Full-text search in MySQL implements vector space model
|
||||||
|
@ -125,11 +125,11 @@ Warning 1265 Using storage engine MyISAM for table 't1'
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (id int) type=heap;
|
create table t1 (id int) type=heap;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
Warning 1286 'TYPE=storage_engine' is deprecated, use 'ENGINE=storage_engine' instead
|
||||||
alter table t1 type=myisam;
|
alter table t1 type=myisam;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
Warning 1286 'TYPE=storage_engine' is deprecated, use 'ENGINE=storage_engine' instead
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set table_type=MYISAM;
|
set table_type=MYISAM;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1286 'table_type' is deprecated. Use 'storage_engine' instead.
|
Warning 1286 'table_type' is deprecated, use 'storage_engine' instead
|
||||||
|
@ -64,6 +64,10 @@ select * from t1 where MATCH a,b AGAINST ('"text search" +"now support"' IN BOOL
|
|||||||
select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
|
select * from t1 where MATCH a,b AGAINST ('"text i"' IN BOOLEAN MODE);
|
||||||
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
|
select * from t1 where MATCH a,b AGAINST ('"xt indexes"' IN BOOLEAN MODE);
|
||||||
|
|
||||||
|
# bug#2708 crash
|
||||||
|
|
||||||
|
select * from t1 where MATCH a,b AGAINST('"space model' IN BOOLEAN MODE);
|
||||||
|
|
||||||
# boolean w/o index:
|
# boolean w/o index:
|
||||||
|
|
||||||
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
select * from t1 where MATCH a AGAINST ("search" IN BOOLEAN MODE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user