summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2003-08-01 14:58:57 +0200
committerunknown <serg@serg.mylan>2003-08-01 14:58:57 +0200
commit964569510899d778917849c4a9984cc3f2ab3b16 (patch)
treeaf561dccb79dcd184bfece98d96f9bc1fde44f4b
parent53c7ab7afbe74d8d063fe177420b339c762f27c3 (diff)
parent77e16415dc60baf120d98650ba058718a08494c0 (diff)
downloadmariadb-git-964569510899d778917849c4a9984cc3f2ab3b16.tar.gz
Merge bk-internal:/home/bk/mysql-4.0/
into serg.mylan:/usr/home/serg/Abk/mysql-4.0
-rw-r--r--myisam/ft_boolean_search.c4
-rw-r--r--myisam/mi_check.c11
-rw-r--r--myisam/myisamchk.c10
-rw-r--r--myisammrg/myrg_def.h2
-rw-r--r--myisammrg/myrg_queue.c12
-rw-r--r--myisammrg/myrg_rfirst.c2
-rw-r--r--myisammrg/myrg_rkey.c4
-rw-r--r--myisammrg/myrg_rlast.c2
-rw-r--r--myisammrg/myrg_rnext.c2
-rw-r--r--myisammrg/myrg_rprev.c2
-rw-r--r--mysql-test/r/fulltext.result11
-rw-r--r--mysql-test/r/select.result20
-rw-r--r--mysql-test/t/fulltext.test16
-rw-r--r--mysql-test/t/select.test20
-rw-r--r--sql/sql_select.cc4
15 files changed, 99 insertions, 23 deletions
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index ed6bf1808a9..6a7b7531d4d 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -299,7 +299,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
default_charset_info :
info->s->keyinfo[keynr].seg->charset);
ftb->with_scan=0;
- ftb->lastpos=0;
+ ftb->lastpos=HA_POS_ERROR;
bzero(& ftb->no_dupes, sizeof(TREE));
init_alloc_root(&ftb->mem_root, 1024, 1024);
@@ -543,7 +543,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
if (!ftb->queue.elements)
return 0;
- if (ftb->state != INDEX_SEARCH && docid < ftb->lastpos)
+ if (ftb->state != INDEX_SEARCH && docid <= ftb->lastpos)
{
FTB_EXPR *x;
uint i;
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 6caacd95386..4b28a88fc6e 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -3562,11 +3562,12 @@ int update_state_info(MI_CHECK *param, MI_INFO *info,uint update)
uint i, key_parts= mi_uint2korr(share->state.header.key_parts);
share->state.rec_per_key_rows=info->state->records;
share->state.changed&= ~STATE_NOT_ANALYZED;
- for (i=0; i<key_parts; i++)
- {
- if (!(share->state.rec_per_key_part[i]=param->rec_per_key_part[i]))
- share->state.changed|= STATE_NOT_ANALYZED;
- }
+ if (info->state->records)
+ for (i=0; i<key_parts; i++)
+ {
+ if (!(share->state.rec_per_key_part[i]=param->rec_per_key_part[i]))
+ share->state.changed|= STATE_NOT_ANALYZED;
+ }
}
if (update & (UPDATE_STAT | UPDATE_SORT | UPDATE_TIME | UPDATE_AUTO_INC))
{
diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c
index 882f868e326..1a27e9debe8 100644
--- a/myisam/myisamchk.c
+++ b/myisam/myisamchk.c
@@ -357,11 +357,15 @@ static void usage(void)
-e, --extend-check Check the table VERY throughly. Only use this in\n\
extreme cases as myisamchk should normally be able to\n\
find out if the table is ok even without this switch\n\
- -F, --fast Check only tables that haven't been closed properly\n\
- -C, --check-only-changed\n\
- Check only tables that have changed since last check\n\
+ -F, --fast Check only tables that haven't been closed properly.\n\
+ It also applies to other requested actions (e.g. --analyze\n\
+ will be ignored if the table is already analyzed).\n\
-f, --force Restart with '-r' if there are any errors in the table.\n\
States will be updated as with '--update-state'\n\
+ -C, --check-only-changed\n\
+ Check only tables that have changed since last check.\n\
+ It also applies to other requested actions (e.g. --analyze\n\
+ will be ignored if the table is already analyzed).\n\
-i, --information Print statistics information about table that is checked\n\
-m, --medium-check Faster than extend-check, but only finds 99.99% of\n\
all errors. Should be good enough for most cases\n\
diff --git a/myisammrg/myrg_def.h b/myisammrg/myrg_def.h
index d56cf4aa8d8..00e7950bccf 100644
--- a/myisammrg/myrg_def.h
+++ b/myisammrg/myrg_def.h
@@ -29,3 +29,5 @@ extern pthread_mutex_t THR_LOCK_open;
#endif
int _myrg_init_queue(MYRG_INFO *info,int inx,enum ha_rkey_function search_flag);
+int _myrg_mi_read_record(MI_INFO *info, byte *buf);
+
diff --git a/myisammrg/myrg_queue.c b/myisammrg/myrg_queue.c
index b4f729fc2cf..5ec382feb91 100644
--- a/myisammrg/myrg_queue.c
+++ b/myisammrg/myrg_queue.c
@@ -14,8 +14,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-/* Read record based on a key */
-
#include "myrg_def.h"
static int queue_key_cmp(void *keyseg, byte *a, byte *b)
@@ -55,3 +53,13 @@ int _myrg_init_queue(MYRG_INFO *info,int inx,enum ha_rkey_function search_flag)
}
return error;
}
+
+int _myrg_mi_read_record(MI_INFO *info, byte *buf)
+{
+ if (!(*info->read_record)(info,info->lastpos,buf))
+ {
+ info->update|= HA_STATE_AKTIV; /* Record is read */
+ return 0;
+ }
+ return my_errno;
+}
diff --git a/myisammrg/myrg_rfirst.c b/myisammrg/myrg_rfirst.c
index 2ee9c015a84..9ba07686c47 100644
--- a/myisammrg/myrg_rfirst.c
+++ b/myisammrg/myrg_rfirst.c
@@ -45,5 +45,5 @@ int myrg_rfirst(MYRG_INFO *info, byte *buf, int inx)
return HA_ERR_END_OF_FILE;
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
- return mi_rrnd(mi,buf,mi->lastpos);
+ return _myrg_mi_read_record(mi,buf);
}
diff --git a/myisammrg/myrg_rkey.c b/myisammrg/myrg_rkey.c
index ba042352a51..fbfa7f24921 100644
--- a/myisammrg/myrg_rkey.c
+++ b/myisammrg/myrg_rkey.c
@@ -36,7 +36,7 @@
SerG
*/
-int myrg_rkey(MYRG_INFO *info,byte *record,int inx, const byte *key,
+int myrg_rkey(MYRG_INFO *info,byte *buf,int inx, const byte *key,
uint key_len, enum ha_rkey_function search_flag)
{
byte *key_buff;
@@ -83,5 +83,5 @@ int myrg_rkey(MYRG_INFO *info,byte *record,int inx, const byte *key,
return HA_ERR_KEY_NOT_FOUND;
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
- return mi_rrnd(mi,record,mi->lastpos);
+ return _myrg_mi_read_record(mi,buf);
}
diff --git a/myisammrg/myrg_rlast.c b/myisammrg/myrg_rlast.c
index e03a07c295a..96bb798bd4f 100644
--- a/myisammrg/myrg_rlast.c
+++ b/myisammrg/myrg_rlast.c
@@ -45,6 +45,6 @@ int myrg_rlast(MYRG_INFO *info, byte *buf, int inx)
return HA_ERR_END_OF_FILE;
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
- return mi_rrnd(mi,buf,mi->lastpos);
+ return _myrg_mi_read_record(mi,buf);
}
diff --git a/myisammrg/myrg_rnext.c b/myisammrg/myrg_rnext.c
index 6d657b5926c..0929c63fc1d 100644
--- a/myisammrg/myrg_rnext.c
+++ b/myisammrg/myrg_rnext.c
@@ -49,5 +49,5 @@ int myrg_rnext(MYRG_INFO *info, byte *buf, int inx)
/* now, mymerge's read_next is as simple as one queue_top */
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
- return mi_rrnd(mi,buf,mi->lastpos);
+ return _myrg_mi_read_record(mi,buf);
}
diff --git a/myisammrg/myrg_rprev.c b/myisammrg/myrg_rprev.c
index c21ca06dacd..797993e903d 100644
--- a/myisammrg/myrg_rprev.c
+++ b/myisammrg/myrg_rprev.c
@@ -49,5 +49,5 @@ int myrg_rprev(MYRG_INFO *info, byte *buf, int inx)
/* now, mymerge's read_prev is as simple as one queue_top */
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
- return mi_rrnd(mi,buf,mi->lastpos);
+ return _myrg_mi_read_record(mi,buf);
}
diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result
index 646c1a7bee2..737390865f1 100644
--- a/mysql-test/r/fulltext.result
+++ b/mysql-test/r/fulltext.result
@@ -256,3 +256,14 @@ select ref_mag from t1 where match ref_mag against ('+test' in boolean mode);
ref_mag
test
drop table t1;
+create table t1 (t1_id int(11) primary key, name varchar(32));
+insert into t1 values (1, 'data1');
+insert into t1 values (2, 'data2');
+create table t2 (t2_id int(11) primary key, t1_id int(11), name varchar(32));
+insert into t2 values (1, 1, 'xxfoo');
+insert into t2 values (2, 1, 'xxbar');
+insert into t2 values (3, 1, 'xxbuz');
+select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode);
+t1_id name t2_id t1_id name
+1 data1 1 1 xxfoo
+drop table t1,t2;
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index 811c396ea67..bde527b9b44 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -3508,3 +3508,23 @@ aa id t2_id id
5 8303 2520 2520
6 8304 2521 2521
drop table t1,t2;
+create table t1 (id1 int NOT NULL);
+create table t2 (id2 int NOT NULL);
+create table t3 (id3 int NOT NULL);
+create table t4 (id4 int NOT NULL, id44 int NOT NULL, KEY (id4));
+insert into t1 values (1);
+insert into t1 values (2);
+insert into t2 values (1);
+insert into t4 values (1,1);
+explain select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3
+left join t4 on id3 = id4 where id2 = 1 or id4 = 1;
+table type possible_keys key key_len ref rows Extra
+t3 system NULL NULL NULL NULL 0 const row not found
+t1 ALL NULL NULL NULL NULL 2
+t2 ALL NULL NULL NULL NULL 1
+t4 ALL id4 NULL NULL NULL 1 Using where
+select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3
+left join t4 on id3 = id4 where id2 = 1 or id4 = 1;
+id1 id2 id3 id4 id44
+1 1 NULL NULL NULL
+drop table t1,t2,t3,t4;
diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test
index 942552f5e98..387a36f1f52 100644
--- a/mysql-test/t/fulltext.test
+++ b/mysql-test/t/fulltext.test
@@ -189,7 +189,7 @@ select * from t1 where match (a) against ('aaaa');
drop table t1;
#
-# bug 283 by jocelyn fournier <joc@presence-pc.com>
+# bug #283 by jocelyn fournier <joc@presence-pc.com>
# FULLTEXT index on a TEXT filed converted to a CHAR field doesn't work anymore
#
@@ -201,3 +201,17 @@ alter table t1 change ref_mag ref_mag char (255) not null;
select ref_mag from t1 where match ref_mag against ('+test' in boolean mode);
drop table t1;
+#
+# bug #942: JOIN
+#
+
+create table t1 (t1_id int(11) primary key, name varchar(32));
+insert into t1 values (1, 'data1');
+insert into t1 values (2, 'data2');
+create table t2 (t2_id int(11) primary key, t1_id int(11), name varchar(32));
+insert into t2 values (1, 1, 'xxfoo');
+insert into t2 values (2, 1, 'xxbar');
+insert into t2 values (3, 1, 'xxbuz');
+select * from t1 join t2 using(`t1_id`) where match (t1.name, t2.name) against('xxfoo' in boolean mode);
+drop table t1,t2;
+
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index c2e451ea7f3..9884c88b420 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -1832,3 +1832,23 @@ INSERT INTO t2 VALUES (2517), (2518), (2519), (2520), (2521), (2522);
select * from t1, t2 WHERE t1.t2_id = t2.id and t1.t2_id > 0 order by t1.id LIMIT 0, 5;
drop table t1,t2;
+#
+# outer join, impossible on condition, where, and usable key for range
+#
+create table t1 (id1 int NOT NULL);
+create table t2 (id2 int NOT NULL);
+create table t3 (id3 int NOT NULL);
+create table t4 (id4 int NOT NULL, id44 int NOT NULL, KEY (id4));
+
+insert into t1 values (1);
+insert into t1 values (2);
+insert into t2 values (1);
+insert into t4 values (1,1);
+
+explain select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3
+left join t4 on id3 = id4 where id2 = 1 or id4 = 1;
+select * from t1 left join t2 on id1 = id2 left join t3 on id1 = id3
+left join t4 on id3 = id4 where id2 = 1 or id4 = 1;
+
+drop table t1,t2,t3,t4;
+
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 4008bf75f01..6675a310464 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2641,9 +2641,6 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
join->thd->select_limit < join->best_positions[i].records_read &&
!(join->select_options & OPTION_FOUND_ROWS)))
{
- /* Join with outer join condition */
- COND *orig_cond=sel->cond;
- sel->cond=and_conds(sel->cond,tab->on_expr);
if (sel->test_quick_select(tab->keys,
used_tables & ~ current_map,
(join->select_options &
@@ -2651,7 +2648,6 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
HA_POS_ERROR :
join->thd->select_limit)) < 0)
DBUG_RETURN(1); // Impossible range
- sel->cond=orig_cond;
/* Fix for EXPLAIN */
if (sel->quick)
join->best_positions[i].records_read= sel->quick->records;