1
by brian
clean slate |
1 |
#
|
2 |
# Bug#21476: Lost Database Connection During Query
|
|
3 |
#
|
|
4 |
# When the amount of stack space we think we need to report an error is
|
|
5 |
# actually too small, then we can get SEGVs. But, we don't want to reserve
|
|
6 |
# space that we could use to get real work done. So, we want the reserved
|
|
7 |
# space small, and this test verifies that the reservation is not too small.
|
|
8 |
||
9 |
CREATE TABLE `t_bug21476` ( |
|
10 |
`ID_BOARD` smallint(5) unsigned NOT NULL default '0', |
|
11 |
`ID_MEMBER` mediumint(8) unsigned NOT NULL default '0', |
|
12 |
`logTime` int(10) unsigned NOT NULL default '0', |
|
13 |
`ID_MSG` mediumint(8) unsigned NOT NULL default '0', |
|
14 |
PRIMARY KEY (`ID_MEMBER`,`ID_BOARD`), |
|
15 |
KEY `logTime` (`logTime`) |
|
16 |
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bulgarian_ci; |
|
17 |
||
18 |
INSERT INTO `t_bug21476` VALUES (2,2,1154870939,0),(1,2,1154870957,0),(2,183,1154941362,0),(2,84,1154904301,0),(1,84,1154905867,0),(2,13,1154947484,10271),(3,84,1154880549,0),(1,6,1154892183,0),(2,25,1154947581,10271),(3,25,1154904760,0),(1,25,1154947373,10271),(1,179,1154899992,0),(2,179,1154899410,0),(5,25,1154901666,0),(2,329,1154902026,0),(3,329,1154902040,0),(1,329,1154902058,0),(1,13,1154930841,0),(3,85,1154904987,0),(1,183,1154929665,0),(3,13,1154931268,0),(1,85,1154936888,0),(1,169,1154937959,0),(2,169,1154941717,0),(3,183,1154939810,0),(3,169,1154941734,0); |
|
19 |
||
20 |
delimiter //; |
|
21 |
let $query_head=UPDATE t_bug21476 SET ID_MSG = IF(logTime BETWEEN 1 AND 1101770053, 2, // |
|
22 |
let $query_tail =) WHERE logTime BETWEEN 1 AND 1104091539 AND ID_MSG = 0// |
|
23 |
||
24 |
# Scan over the possible stack heights, trying to recurse to exactly that
|
|
25 |
# depth. Eventually, we will reach our imposed limit on height and try to
|
|
26 |
# raise an error. If the remaining stack space is enough to raise that error,
|
|
27 |
# we will get an error-number of 1436 and quit the loop. If it's not enough
|
|
28 |
# space, we should get a SEGV
|
|
29 |
||
30 |
# Well more than enough recursions to find the end of our stack.
|
|
31 |
let $i = 100000// |
|
32 |
disable_query_log// |
|
33 |
disable_result_log// |
|
34 |
while ($i) |
|
35 |
{
|
|
36 |
# If we SEGV because the min stack size is exceeded, this would return error
|
|
37 |
# 2013 .
|
|
38 |
error 0,1436 // |
|
39 |
eval $query_head 0 $query_tail// |
|
40 |
||
41 |
if ($mysql_errno != 1436) |
|
42 |
{
|
|
43 |
# We reached the place where we reported an error about the stack limit,
|
|
44 |
# and we successfully returned the error. That means that at the stack
|
|
45 |
# limit, we still have enough space reserved to report an error.
|
|
46 |
let $i = 1// |
|
47 |
}
|
|
48 |
||
49 |
# Multiplying by three stack frames should be fine enough resolution.
|
|
50 |
# Trading exactness for speed.
|
|
51 |
||
52 |
# go one more level deep
|
|
53 |
let $query_head = $query_head IF(logTime <= 1104091$i, $i, // |
|
54 |
let $query_tail =) $query_tail// |
|
55 |
||
56 |
# go one more level deep
|
|
57 |
let $query_head = $query_head IF(logTime <= 1105091$i, $i, // |
|
58 |
let $query_tail =) $query_tail// |
|
59 |
||
60 |
# go one more level deep
|
|
61 |
let $query_head = $query_head IF(logTime <= 1106091$i, $i, // |
|
62 |
let $query_tail =) $query_tail// |
|
63 |
||
64 |
dec $i// |
|
65 |
}
|
|
66 |
enable_result_log// |
|
67 |
enable_query_log// |
|
68 |
||
69 |
echo Assertion: mysql_errno 1436 == $mysql_errno// |
|
70 |
||
71 |
delimiter ;// |
|
72 |
DROP TABLE `t_bug21476`; |
|
73 |
||
74 |
--echo End of 5.0 tests. |