Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
418c1f30
Commit
418c1f30
authored
Sep 18, 2006
by
istruewing@chilla.local
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-5.0-engines
into chilla.local:/home/mydev/mysql-5.0--team
parents
d8e27606
97b52dad
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
181 additions
and
24 deletions
+181
-24
myisam/mi_rkey.c
myisam/mi_rkey.c
+34
-20
mysql-test/r/index_merge.result
mysql-test/r/index_merge.result
+31
-0
mysql-test/r/myisam.result
mysql-test/r/myisam.result
+28
-0
mysql-test/t/index_merge.test
mysql-test/t/index_merge.test
+32
-0
mysql-test/t/myisam.test
mysql-test/t/myisam.test
+36
-0
sql/ha_myisam.cc
sql/ha_myisam.cc
+8
-0
sql/ha_myisam.h
sql/ha_myisam.h
+1
-0
sql/handler.cc
sql/handler.cc
+9
-0
sql/handler.h
sql/handler.h
+1
-0
sql/opt_range.cc
sql/opt_range.cc
+1
-4
No files found.
myisam/mi_rkey.c
View file @
418c1f30
...
...
@@ -94,28 +94,42 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
myisam_read_vec
[
search_flag
],
info
->
s
->
state
.
key_root
[
inx
]))
{
/*
If we
are searching for an exact key (including the data pointer)
and this was added by an concurrent insert,
then the result is "key not found".
If we
searching for a partial key (or using >, >=, < or <=) and
the data is outside of the data file, we need to continue searching
for the first key inside the data file
*/
if
((
search_flag
==
HA_READ_KEY_EXACT
)
&&
(
info
->
lastpos
>=
info
->
state
->
data_file_length
))
if
(
info
->
lastpos
>=
info
->
state
->
data_file_length
&&
(
search_flag
!=
HA_READ_KEY_EXACT
||
last_used_keyseg
!=
keyinfo
->
seg
+
keyinfo
->
keysegs
))
{
my_errno
=
HA_ERR_KEY_NOT_FOUND
;
info
->
lastpos
=
HA_OFFSET_ERROR
;
}
else
while
(
info
->
lastpos
>=
info
->
state
->
data_file_length
)
{
/*
Skip rows that are inserted by other threads since we got a lock
Note that this can only happen if we are not searching after an
exact key, because the keys are sorted according to position
*/
if
(
_mi_search_next
(
info
,
keyinfo
,
info
->
lastkey
,
info
->
lastkey_length
,
myisam_readnext_vec
[
search_flag
],
info
->
s
->
state
.
key_root
[
inx
]))
break
;
do
{
uint
not_used
[
2
];
/*
Skip rows that are inserted by other threads since we got a lock
Note that this can only happen if we are not searching after an
full length exact key, because the keys are sorted
according to position
*/
if
(
_mi_search_next
(
info
,
keyinfo
,
info
->
lastkey
,
info
->
lastkey_length
,
myisam_readnext_vec
[
search_flag
],
info
->
s
->
state
.
key_root
[
inx
]))
break
;
/*
Check that the found key does still match the search.
_mi_search_next() delivers the next key regardless of its
value.
*/
if
(
search_flag
==
HA_READ_KEY_EXACT
&&
ha_key_cmp
(
keyinfo
->
seg
,
key_buff
,
info
->
lastkey
,
use_key_length
,
SEARCH_FIND
,
not_used
))
{
my_errno
=
HA_ERR_KEY_NOT_FOUND
;
info
->
lastpos
=
HA_OFFSET_ERROR
;
break
;
}
}
while
(
info
->
lastpos
>=
info
->
state
->
data_file_length
);
}
}
}
...
...
mysql-test/r/index_merge.result
View file @
418c1f30
...
...
@@ -424,3 +424,34 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t3 index_merge a,b a,b 5,5 NULL # Using intersect(a,b); Using where
drop table t3;
drop table t0, t1, t2;
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(1);
CREATE TABLE t2(a INT, b INT, dummy CHAR(16) DEFAULT '', KEY(a), KEY(b));
INSERT INTO t2(a,b) VALUES
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(1,2);
LOCK TABLES t1 WRITE, t2 WRITE;
INSERT INTO t2(a,b) VALUES(1,2);
SELECT t2.a FROM t1,t2 WHERE t2.b=2 AND t2.a=1;
a
1
1
UNLOCK TABLES;
DROP TABLE t1, t2;
mysql-test/r/myisam.result
View file @
418c1f30
...
...
@@ -515,6 +515,34 @@ select c1 from t1 order by c1 limit 1;
c1
a
drop table t1;
create table t1 (a int not null, primary key(a));
create table t2 (a int not null, b int not null, primary key(a,b));
insert into t1 values (1),(2),(3),(4),(5),(6);
insert into t2 values (1,1),(2,1);
lock tables t1 read local, t2 read local;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
a a b
1 1 1
2 2 1
insert into t2 values(2,0);
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
a a b
1 1 1
2 2 1
drop table t1,t2;
CREATE TABLE t1 (c1 varchar(250) NOT NULL);
CREATE TABLE t2 (c1 varchar(250) NOT NULL, PRIMARY KEY (c1));
INSERT INTO t1 VALUES ('test000001'), ('test000002'), ('test000003');
INSERT INTO t2 VALUES ('test000002'), ('test000003'), ('test000004');
LOCK TABLES t1 READ LOCAL, t2 READ LOCAL;
SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2
WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1;
t1c1 t2c1
INSERT INTO t2 VALUES ('test000001'), ('test000005');
SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2
WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1;
t1c1 t2c1
DROP TABLE t1,t2;
CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) ENGINE=MyISAM;
Got one of the listed errors
create table t1 (a int, b varchar(200), c text not null) checksum=1;
...
...
mysql-test/t/index_merge.test
View file @
418c1f30
...
...
@@ -383,3 +383,35 @@ explain select * from t3 where a=1 and b=1;
drop
table
t3
;
drop
table
t0
,
t1
,
t2
;
#
# BUG#20256 - LOCK WRITE - MyISAM
#
CREATE
TABLE
t1
(
a
INT
);
INSERT
INTO
t1
VALUES
(
1
);
CREATE
TABLE
t2
(
a
INT
,
b
INT
,
dummy
CHAR
(
16
)
DEFAULT
''
,
KEY
(
a
),
KEY
(
b
));
INSERT
INTO
t2
(
a
,
b
)
VALUES
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),(
0
,
0
),
(
1
,
2
);
LOCK
TABLES
t1
WRITE
,
t2
WRITE
;
INSERT
INTO
t2
(
a
,
b
)
VALUES
(
1
,
2
);
SELECT
t2
.
a
FROM
t1
,
t2
WHERE
t2
.
b
=
2
AND
t2
.
a
=
1
;
UNLOCK
TABLES
;
DROP
TABLE
t1
,
t2
;
mysql-test/t/myisam.test
View file @
418c1f30
...
...
@@ -488,6 +488,42 @@ insert into t1 values ('a'), ('b');
select
c1
from
t1
order
by
c1
limit
1
;
drop
table
t1
;
#
# Bug #14400 Join could miss concurrently inserted row
#
# Partial key.
create
table
t1
(
a
int
not
null
,
primary
key
(
a
));
create
table
t2
(
a
int
not
null
,
b
int
not
null
,
primary
key
(
a
,
b
));
insert
into
t1
values
(
1
),(
2
),(
3
),(
4
),(
5
),(
6
);
insert
into
t2
values
(
1
,
1
),(
2
,
1
);
lock
tables
t1
read
local
,
t2
read
local
;
select
straight_join
*
from
t1
,
t2
force
index
(
primary
)
where
t1
.
a
=
t2
.
a
;
connect
(
root
,
localhost
,
root
,,
test
,
$MASTER_MYPORT
,
master
.
sock
);
insert
into
t2
values
(
2
,
0
);
disconnect
root
;
connection
default
;
select
straight_join
*
from
t1
,
t2
force
index
(
primary
)
where
t1
.
a
=
t2
.
a
;
drop
table
t1
,
t2
;
#
# Full key.
CREATE
TABLE
t1
(
c1
varchar
(
250
)
NOT
NULL
);
CREATE
TABLE
t2
(
c1
varchar
(
250
)
NOT
NULL
,
PRIMARY
KEY
(
c1
));
INSERT
INTO
t1
VALUES
(
'test000001'
),
(
'test000002'
),
(
'test000003'
);
INSERT
INTO
t2
VALUES
(
'test000002'
),
(
'test000003'
),
(
'test000004'
);
LOCK
TABLES
t1
READ
LOCAL
,
t2
READ
LOCAL
;
SELECT
t1
.
c1
AS
t1c1
,
t2
.
c1
AS
t2c1
FROM
t1
,
t2
WHERE
t1
.
c1
=
t2
.
c1
HAVING
t1c1
!=
t2c1
;
connect
(
con1
,
localhost
,
root
,,);
connection
con1
;
INSERT
INTO
t2
VALUES
(
'test000001'
),
(
'test000005'
);
disconnect
con1
;
connection
default
;
SELECT
t1
.
c1
AS
t1c1
,
t2
.
c1
AS
t2c1
FROM
t1
,
t2
WHERE
t1
.
c1
=
t2
.
c1
HAVING
t1c1
!=
t2c1
;
DROP
TABLE
t1
,
t2
;
# End of 4.0 tests
#
# Test RTREE index
#
...
...
sql/ha_myisam.cc
View file @
418c1f30
...
...
@@ -169,6 +169,14 @@ ha_myisam::ha_myisam(TABLE *table_arg)
can_enable_indexes
(
1
)
{}
handler
*
ha_myisam
::
clone
(
MEM_ROOT
*
mem_root
)
{
ha_myisam
*
new_handler
=
static_cast
<
ha_myisam
*>
(
handler
::
clone
(
mem_root
));
if
(
new_handler
)
new_handler
->
file
->
state
=
file
->
state
;
return
new_handler
;
}
static
const
char
*
ha_myisam_exts
[]
=
{
".MYI"
,
...
...
sql/ha_myisam.h
View file @
418c1f30
...
...
@@ -45,6 +45,7 @@ class ha_myisam: public handler
public:
ha_myisam
(
TABLE
*
table_arg
);
~
ha_myisam
()
{}
handler
*
clone
(
MEM_ROOT
*
mem_root
);
const
char
*
table_type
()
const
{
return
"MyISAM"
;
}
const
char
*
index_type
(
uint
key_number
);
const
char
**
bas_ext
()
const
;
...
...
sql/handler.cc
View file @
418c1f30
...
...
@@ -1374,6 +1374,15 @@ int ha_delete_table(THD *thd, enum db_type table_type, const char *path,
/****************************************************************************
** General handler functions
****************************************************************************/
handler
*
handler
::
clone
(
MEM_ROOT
*
mem_root
)
{
handler
*
new_handler
=
get_new_handler
(
table
,
mem_root
,
table
->
s
->
db_type
);
if
(
new_handler
&&
!
new_handler
->
ha_open
(
table
->
s
->
path
,
table
->
db_stat
,
HA_OPEN_IGNORE_IF_LOCKED
))
return
new_handler
;
return
NULL
;
}
/* Open database-handler. Try O_RDONLY if can't open as O_RDWR */
/* Don't wait for locks if not HA_OPEN_WAIT_IF_LOCKED is set */
...
...
sql/handler.h
View file @
418c1f30
...
...
@@ -563,6 +563,7 @@ public:
pushed_cond
(
NULL
)
{}
virtual
~
handler
(
void
)
{
/* TODO: DBUG_ASSERT(inited == NONE); */
}
virtual
handler
*
clone
(
MEM_ROOT
*
mem_root
);
int
ha_open
(
const
char
*
name
,
int
mode
,
int
test_if_locked
);
void
adjust_next_insert_id_after_explicit_value
(
ulonglong
nr
);
bool
update_auto_increment
();
...
...
sql/opt_range.cc
View file @
418c1f30
...
...
@@ -1034,10 +1034,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
}
THD
*
thd
=
current_thd
;
if
(
!
(
file
=
get_new_handler
(
head
,
thd
->
mem_root
,
head
->
s
->
db_type
)))
goto
failure
;
DBUG_PRINT
(
"info"
,
(
"Allocated new handler %p"
,
file
));
if
(
file
->
ha_open
(
head
->
s
->
path
,
head
->
db_stat
,
HA_OPEN_IGNORE_IF_LOCKED
))
if
(
!
(
file
=
head
->
file
->
clone
(
thd
->
mem_root
)))
{
/* Caller will free the memory */
goto
failure
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment