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
97f9aa2a
Commit
97f9aa2a
authored
May 27, 2003
by
guilhem@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
temporary update of the test to satisfy merge; will commit a final update
soon.
parents
553637cb
9ed9ad53
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
127 additions
and
5 deletions
+127
-5
mysql-test/r/insert_select.result
mysql-test/r/insert_select.result
+14
-0
mysql-test/r/rpl_insert_id.result
mysql-test/r/rpl_insert_id.result
+28
-0
mysql-test/t/insert_select.test
mysql-test/t/insert_select.test
+19
-0
mysql-test/t/rpl_insert_id.test
mysql-test/t/rpl_insert_id.test
+18
-0
sql/slave.cc
sql/slave.cc
+27
-2
sql/sql_insert.cc
sql/sql_insert.cc
+21
-3
No files found.
mysql-test/r/insert_select.result
View file @
97f9aa2a
...
@@ -66,3 +66,17 @@ INSERT INTO crash1 (numeropost,icone,contenu,pseudo,date,signature,ip)
...
@@ -66,3 +66,17 @@ INSERT INTO crash1 (numeropost,icone,contenu,pseudo,date,signature,ip)
SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM crash2
SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM crash2
WHERE numeropost=9 ORDER BY numreponse ASC;
WHERE numeropost=9 ORDER BY numreponse ASC;
DROP TABLE IF EXISTS crash1,crash2;
DROP TABLE IF EXISTS crash1,crash2;
drop table if exists t1;
drop table if exists t2;
create table t1(a int, unique(a));
insert into t1 values(2);
create table t2(a int);
insert into t2 values(1),(2);
reset master;
insert into t1 select * from t2;
Duplicate entry '2' for key 1
show binlog events;
Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3
master-bin.001 79 Query 1 79 use test; insert into t1 select * from t2
drop table t1, t2;
mysql-test/r/rpl_insert_id.result
View file @
97f9aa2a
...
@@ -41,3 +41,31 @@ b c
...
@@ -41,3 +41,31 @@ b c
6 11
6 11
drop table t1;
drop table t1;
drop table t2;
drop table t2;
create table t1(a int auto_increment, key(a));
create table t2(b int auto_increment, c int, key(b));
insert into t1 values (10);
insert into t1 values (null),(null),(null);
insert into t2 values (5,0);
insert into t2 (c) select * from t1;
select * from t2;
b c
5 0
6 10
7 11
8 12
9 13
select * from t1;
a
10
11
12
13
select * from t2;
b c
5 0
6 10
7 11
8 12
9 13
drop table t1;
drop table t2;
mysql-test/t/insert_select.test
View file @
97f9aa2a
...
@@ -68,3 +68,22 @@ WHERE numeropost=9 ORDER BY numreponse ASC;
...
@@ -68,3 +68,22 @@ WHERE numeropost=9 ORDER BY numreponse ASC;
DROP
TABLE
IF
EXISTS
crash1
,
crash2
;
DROP
TABLE
IF
EXISTS
crash1
,
crash2
;
# Addendum by Guilhem:
# Check if a partly-completed INSERT SELECT in a MyISAM table goes
# into the binlog
drop
table
if
exists
t1
;
drop
table
if
exists
t2
;
create
table
t1
(
a
int
,
unique
(
a
));
insert
into
t1
values
(
2
);
create
table
t2
(
a
int
);
insert
into
t2
values
(
1
),(
2
);
reset
master
;
--
error
1062
insert
into
t1
select
*
from
t2
;
# The above should produce an error, but still be in the binlog;
# verify the binlog :
let
$VERSION
=
`select version()`
;
--
replace_result
$VERSION
VERSION
show
binlog
events
;
drop
table
t1
,
t2
;
mysql-test/t/rpl_insert_id.test
View file @
97f9aa2a
...
@@ -36,6 +36,24 @@ sync_with_master;
...
@@ -36,6 +36,24 @@ sync_with_master;
select
*
from
t1
;
select
*
from
t1
;
select
*
from
t2
;
select
*
from
t2
;
connection
master
;
connection
master
;
# check if INSERT SELECT in auto_increment is well replicated (bug #490)
drop
table
t1
;
drop
table
t2
;
create
table
t1
(
a
int
auto_increment
,
key
(
a
));
create
table
t2
(
b
int
auto_increment
,
c
int
,
key
(
b
));
insert
into
t1
values
(
10
);
insert
into
t1
values
(
null
),(
null
),(
null
);
insert
into
t2
values
(
5
,
0
);
insert
into
t2
(
c
)
select
*
from
t1
;
select
*
from
t2
;
save_master_pos
;
connection
slave
;
sync_with_master
;
select
*
from
t1
;
select
*
from
t2
;
connection
master
;
drop
table
t1
;
drop
table
t1
;
drop
table
t2
;
drop
table
t2
;
save_master_pos
;
save_master_pos
;
...
...
sql/slave.cc
View file @
97f9aa2a
...
@@ -1322,6 +1322,8 @@ static bool wait_for_relay_log_space(RELAY_LOG_INFO* rli)
...
@@ -1322,6 +1322,8 @@ static bool wait_for_relay_log_space(RELAY_LOG_INFO* rli)
!
rli
->
ignore_log_space_limit
)
!
rli
->
ignore_log_space_limit
)
{
{
pthread_cond_wait
(
&
rli
->
log_space_cond
,
&
rli
->
log_space_lock
);
pthread_cond_wait
(
&
rli
->
log_space_cond
,
&
rli
->
log_space_lock
);
/* Re-acquire the mutex as pthread_cond_wait released it */
pthread_mutex_lock
(
&
rli
->
log_space_lock
);
}
}
thd
->
proc_info
=
save_proc_info
;
thd
->
proc_info
=
save_proc_info
;
pthread_mutex_unlock
(
&
rli
->
log_space_lock
);
pthread_mutex_unlock
(
&
rli
->
log_space_lock
);
...
@@ -2028,7 +2030,11 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli)
...
@@ -2028,7 +2030,11 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli)
Log_event
*
ev
=
next_event
(
rli
);
Log_event
*
ev
=
next_event
(
rli
);
DBUG_ASSERT
(
rli
->
sql_thd
==
thd
);
DBUG_ASSERT
(
rli
->
sql_thd
==
thd
);
if
(
sql_slave_killed
(
thd
,
rli
))
if
(
sql_slave_killed
(
thd
,
rli
))
{
/* do not forget to free ev ! */
if
(
ev
)
delete
ev
;
return
1
;
return
1
;
}
if
(
ev
)
if
(
ev
)
{
{
int
type_code
=
ev
->
get_type_code
();
int
type_code
=
ev
->
get_type_code
();
...
@@ -2302,6 +2308,18 @@ reconnect done to recover from failed read");
...
@@ -2302,6 +2308,18 @@ reconnect done to recover from failed read");
goto
err
;
goto
err
;
}
}
flush_master_info
(
mi
);
flush_master_info
(
mi
);
/*
See if the relay logs take too much space.
We don't lock mi->rli.log_space_lock here; this dirty read saves time
and does not introduce any problem:
- if mi->rli.ignore_log_space_limit is 1 but becomes 0 just after (so
the clean value is 0), then we are reading only one more event as we
should, and we'll block only at the next event. No big deal.
- if mi->rli.ignore_log_space_limit is 0 but becomes 1 just after (so
the clean value is 1), then we are going into wait_for_relay_log_space()
for no reason, but this function will do a clean read, notice the clean
value and exit immediately.
*/
if
(
mi
->
rli
.
log_space_limit
&&
mi
->
rli
.
log_space_limit
<
if
(
mi
->
rli
.
log_space_limit
&&
mi
->
rli
.
log_space_limit
<
mi
->
rli
.
log_space_total
&&
mi
->
rli
.
log_space_total
&&
!
mi
->
rli
.
ignore_log_space_limit
)
!
mi
->
rli
.
ignore_log_space_limit
)
...
@@ -2416,7 +2434,9 @@ slave_begin:
...
@@ -2416,7 +2434,9 @@ slave_begin:
rli
->
pending
=
0
;
rli
->
pending
=
0
;
//tell the I/O thread to take relay_log_space_limit into account from now on
//tell the I/O thread to take relay_log_space_limit into account from now on
pthread_mutex_lock
(
&
rli
->
log_space_lock
);
rli
->
ignore_log_space_limit
=
0
;
rli
->
ignore_log_space_limit
=
0
;
pthread_mutex_unlock
(
&
rli
->
log_space_lock
);
if
(
init_relay_log_pos
(
rli
,
if
(
init_relay_log_pos
(
rli
,
rli
->
relay_log_name
,
rli
->
relay_log_name
,
...
@@ -3122,9 +3142,14 @@ Log_event* next_event(RELAY_LOG_INFO* rli)
...
@@ -3122,9 +3142,14 @@ Log_event* next_event(RELAY_LOG_INFO* rli)
pthread_mutex_lock
(
&
rli
->
log_space_lock
);
pthread_mutex_lock
(
&
rli
->
log_space_lock
);
// prevent the I/O thread from blocking next times
// prevent the I/O thread from blocking next times
rli
->
ignore_log_space_limit
=
1
;
rli
->
ignore_log_space_limit
=
1
;
// If the I/O thread is blocked, unblock it
/*
pthread_cond_broadcast
(
&
rli
->
log_space_cond
);
If the I/O thread is blocked, unblock it.
Ok to broadcast after unlock, because the mutex is only destroyed in
~st_relay_log_info(), i.e. when rli is destroyed, and rli will not be
destroyed before we exit the present function.
*/
pthread_mutex_unlock
(
&
rli
->
log_space_lock
);
pthread_mutex_unlock
(
&
rli
->
log_space_lock
);
pthread_cond_broadcast
(
&
rli
->
log_space_cond
);
// Note that wait_for_update unlocks lock_log !
// Note that wait_for_update unlocks lock_log !
rli
->
relay_log
.
wait_for_update
(
rli
->
sql_thd
);
rli
->
relay_log
.
wait_for_update
(
rli
->
sql_thd
);
// re-acquire data lock since we released it earlier
// re-acquire data lock since we released it earlier
...
...
sql/sql_insert.cc
View file @
97f9aa2a
...
@@ -1350,6 +1350,24 @@ void select_insert::send_error(uint errcode,const char *err)
...
@@ -1350,6 +1350,24 @@ void select_insert::send_error(uint errcode,const char *err)
::
send_error
(
&
thd
->
net
,
errcode
,
err
);
::
send_error
(
&
thd
->
net
,
errcode
,
err
);
table
->
file
->
extra
(
HA_EXTRA_NO_CACHE
);
table
->
file
->
extra
(
HA_EXTRA_NO_CACHE
);
table
->
file
->
activate_all_index
(
thd
);
table
->
file
->
activate_all_index
(
thd
);
/*
If at least one row has been inserted/modified and will stay in the table
(the table doesn't have transactions) (example: we got a duplicate key
error while inserting into a MyISAM table) we must write to the binlog (and
the error code will make the slave stop).
*/
if
((
info
.
copied
||
info
.
deleted
)
&&
!
table
->
file
->
has_transactions
())
{
if
(
last_insert_id
)
thd
->
insert_id
(
last_insert_id
);
// For binary log
mysql_update_log
.
write
(
thd
,
thd
->
query
,
thd
->
query_length
);
if
(
mysql_bin_log
.
is_open
())
{
Query_log_event
qinfo
(
thd
,
thd
->
query
,
thd
->
query_length
,
table
->
file
->
has_transactions
());
mysql_bin_log
.
write
(
&
qinfo
);
}
}
ha_rollback_stmt
(
thd
);
ha_rollback_stmt
(
thd
);
if
(
info
.
copied
||
info
.
deleted
)
if
(
info
.
copied
||
info
.
deleted
)
{
{
...
@@ -1365,7 +1383,10 @@ bool select_insert::send_eof()
...
@@ -1365,7 +1383,10 @@ bool select_insert::send_eof()
error
=
table
->
file
->
activate_all_index
(
thd
);
error
=
table
->
file
->
activate_all_index
(
thd
);
table
->
file
->
extra
(
HA_EXTRA_NO_IGNORE_DUP_KEY
);
table
->
file
->
extra
(
HA_EXTRA_NO_IGNORE_DUP_KEY
);
if
(
last_insert_id
)
thd
->
insert_id
(
last_insert_id
);
// For binary log
/* Write to binlog before commiting transaction */
/* Write to binlog before commiting transaction */
mysql_update_log
.
write
(
thd
,
thd
->
query
,
thd
->
query_length
);
if
(
mysql_bin_log
.
is_open
())
if
(
mysql_bin_log
.
is_open
())
{
{
Query_log_event
qinfo
(
thd
,
thd
->
query
,
thd
->
query_length
,
Query_log_event
qinfo
(
thd
,
thd
->
query
,
thd
->
query_length
,
...
@@ -1393,10 +1414,7 @@ bool select_insert::send_eof()
...
@@ -1393,10 +1414,7 @@ bool select_insert::send_eof()
else
else
sprintf
(
buff
,
ER
(
ER_INSERT_INFO
),
info
.
records
,
info
.
deleted
,
sprintf
(
buff
,
ER
(
ER_INSERT_INFO
),
info
.
records
,
info
.
deleted
,
thd
->
cuted_fields
);
thd
->
cuted_fields
);
if
(
last_insert_id
)
thd
->
insert_id
(
last_insert_id
);
// For update log
::
send_ok
(
&
thd
->
net
,
info
.
copied
+
info
.
deleted
,
last_insert_id
,
buff
);
::
send_ok
(
&
thd
->
net
,
info
.
copied
+
info
.
deleted
,
last_insert_id
,
buff
);
mysql_update_log
.
write
(
thd
,
thd
->
query
,
thd
->
query_length
);
return
0
;
return
0
;
}
}
}
}
...
...
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