Merge lp:~vkolesnikov/pbxt/pbxt-bug-341115 into lp:pbxt

Proposed by Vladimir Kolesnikov
Status: Merged
Merged at revision: not available
Proposed branch: lp:~vkolesnikov/pbxt/pbxt-bug-341115
Merge into: lp:pbxt
Diff against target: None lines
To merge this branch: bzr merge lp:~vkolesnikov/pbxt/pbxt-bug-341115
Reviewer Review Type Date Requested Status
PBXT Core Pending
Review via email: mp+4590@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ChangeLog'
2--- ChangeLog 2009-03-13 15:14:42 +0000
3+++ ChangeLog 2009-03-17 16:06:29 +0000
4@@ -3,6 +3,8 @@
5
6 ------- 1.0.08 RC - Not yet released
7
8+RN228: Fixed bug #341115: 'Out of memory' error (a bug in key comparison algorithm)
9+
10 RN227: Changed conflict handling to use spin locks and improve efficiency.
11
12 RN226: Fixed bug #340316: Issue with bigint unsigned auto-increment field.
13
14=== modified file 'src/index_xt.cc'
15--- src/index_xt.cc 2009-03-13 15:14:42 +0000
16+++ src/index_xt.cc 2009-03-17 16:06:29 +0000
17@@ -428,7 +428,11 @@
18
19 switch (ind->mi_single_type) {
20 case HA_KEYTYPE_LONG_INT:
21- r = XT_GET_DISK_4(value->sv_key) - XT_GET_DISK_4(bitem);
22+ register xtInt4 a, b;
23+
24+ a = XT_GET_DISK_4(value->sv_key);
25+ b = XT_GET_DISK_4(bitem);
26+ r = (a < b) ? -1 : (a == b ? 0 : 1);
27 break;
28 case HA_KEYTYPE_ULONG_INT: {
29 register xtWord4 a, b;
30
31=== modified file 'test/mysql-test/r/pbxt_bugs.result'
32--- test/mysql-test/r/pbxt_bugs.result 2009-03-11 11:18:00 +0000
33+++ test/mysql-test/r/pbxt_bugs.result 2009-03-17 16:06:29 +0000
34@@ -1045,3 +1045,168 @@
35 16777215 -32768 16 17 18 19 20 20
36 4294967295 -128 21 22 23 24 25 25
37 9223372036854775807 9223372036854775807 26 27 28 29 30 30
38+CREATE TABLE t2(c1 INT SIGNED NOT NULL, c2 INT UNSIGNED NULL, c3 INT, KEY(c1), KEY(c2));
39+INSERT INTO t2 VALUES(-1,1,1),(-2,2,2),(-3,3,3),(-4,4,4),(-5,5,5),(-6,6,6),(-7,7,7),(-8,8,8),(-9,9,9),(10,10,10),(-11,NULL,11),(-12,12,12);
40+INSERT INTO t2 VALUES(-2147483648,0,13),(2147483647,4294967295,14),(0,2147483648,15),(2147483647,2147483647,16);
41+SELECT * FROM t2;
42+c1 c2 c3
43+-1 1 1
44+-11 NULL 11
45+-12 12 12
46+-2 2 2
47+-2147483648 0 13
48+-3 3 3
49+-4 4 4
50+-5 5 5
51+-6 6 6
52+-7 7 7
53+-8 8 8
54+-9 9 9
55+0 2147483648 15
56+10 10 10
57+2147483647 2147483647 16
58+2147483647 4294967295 14
59+EXPLAIN SELECT c1 FROM t2;
60+id select_type table type possible_keys key key_len ref rows Extra
61+1 SIMPLE t2 index NULL c1 4 NULL 16 Using index
62+SELECT c1 FROM t2;
63+c1
64+-2147483648
65+-12
66+-11
67+-9
68+-8
69+-7
70+-6
71+-5
72+-4
73+-3
74+-2
75+-1
76+0
77+10
78+2147483647
79+2147483647
80+UPDATE t2 SET c1=-2147483648 WHERE c2 <> 0 ORDER BY c2 LIMIT 2;
81+SELECT * FROM t2 WHERE c2 <> 0 ORDER BY c2;
82+c1 c2 c3
83+-2147483648 1 1
84+-2147483648 2 2
85+-3 3 3
86+-4 4 4
87+-5 5 5
88+-6 6 6
89+-7 7 7
90+-8 8 8
91+-9 9 9
92+10 10 10
93+-12 12 12
94+2147483647 2147483647 16
95+0 2147483648 15
96+2147483647 4294967295 14
97+UPDATE t2 SET c1=-2147483648 WHERE c2 >= 0 ORDER BY c2 DESC LIMIT 2;
98+SELECT * FROM t2 WHERE c2 >= 0 ORDER BY c2 DESC;
99+c1 c2 c3
100+-2147483648 4294967295 14
101+-2147483648 2147483648 15
102+2147483647 2147483647 16
103+-12 12 12
104+10 10 10
105+-9 9 9
106+-8 8 8
107+-7 7 7
108+-6 6 6
109+-5 5 5
110+-4 4 4
111+-3 3 3
112+-2147483648 2 2
113+-2147483648 1 1
114+-2147483648 0 13
115+UPDATE t2 SET c1=-2147483648 WHERE c2 <= 3 ORDER BY c2 LIMIT 2;
116+SELECT * FROM t2 WHERE c2 <= 3 ORDER BY c2;
117+c1 c2 c3
118+-2147483648 0 13
119+-2147483648 1 1
120+-2147483648 2 2
121+-3 3 3
122+UPDATE t2 SET c1=-2147483648 WHERE c2 <=> 4 ORDER BY c2 DESC LIMIT 2;
123+SELECT * FROM t2 WHERE c2 <=> 4 ORDER BY c2;
124+c1 c2 c3
125+-2147483648 4 4
126+UPDATE t2 SET c1=-2147483648 WHERE c2 BETWEEN 4 AND 7 ORDER BY c2 LIMIT 2;
127+SELECT * FROM t2 WHERE c2 BETWEEN 4 AND 7 ORDER BY c2;
128+c1 c2 c3
129+-2147483648 4 4
130+-2147483648 5 5
131+-6 6 6
132+-7 7 7
133+UPDATE t2 SET c1=-2147483648 WHERE c2 IN(8,9) ORDER BY c2 DESC LIMIT 2;
134+SELECT * FROM t2 WHERE c2 IN(8,9) ORDER BY c2 DESC;
135+c1 c2 c3
136+-2147483648 9 9
137+-2147483648 8 8
138+UPDATE t2 SET c1=-2147483648 WHERE c2 IS NULL ORDER BY c2 LIMIT 2;
139+SELECT * FROM t2 WHERE c2 IS NULL ORDER BY c2;
140+c1 c2 c3
141+-2147483648 NULL 11
142+UPDATE t2 SET c1=-2147483648 WHERE c2>= 6 AND c2 < 9 ORDER BY c2 LIMIT 2;
143+SELECT * FROM t2 WHERE c2>= 6 AND c2 < 9 ORDER BY c2;
144+c1 c2 c3
145+-2147483648 6 6
146+-2147483648 7 7
147+-2147483648 8 8
148+UPDATE t2 SET c1=-2147483648 WHERE c1=-12 OR c2=1;
149+SELECT * FROM t2 WHERE c1=-2147483648;
150+c1 c2 c3
151+-2147483648 2147483648 15
152+-2147483648 4294967295 14
153+-2147483648 6 6
154+-2147483648 NULL 11
155+-2147483648 0 13
156+-2147483648 12 12
157+-2147483648 7 7
158+-2147483648 1 1
159+-2147483648 2 2
160+-2147483648 4 4
161+-2147483648 5 5
162+-2147483648 9 9
163+-2147483648 8 8
164+SELECT * FROM t2;
165+c1 c2 c3
166+-2147483648 0 13
167+-2147483648 1 1
168+-2147483648 12 12
169+-2147483648 2 2
170+-2147483648 2147483648 15
171+-2147483648 4 4
172+-2147483648 4294967295 14
173+-2147483648 5 5
174+-2147483648 6 6
175+-2147483648 7 7
176+-2147483648 8 8
177+-2147483648 9 9
178+-2147483648 NULL 11
179+-3 3 3
180+10 10 10
181+2147483647 2147483647 16
182+EXPLAIN SELECT c1 FROM t2;
183+id select_type table type possible_keys key key_len ref rows Extra
184+1 SIMPLE t2 index NULL c1 4 NULL 16 Using index
185+SELECT c1 FROM t2;
186+c1
187+-2147483648
188+-2147483648
189+-2147483648
190+-2147483648
191+-2147483648
192+-2147483648
193+-2147483648
194+-2147483648
195+-2147483648
196+-2147483648
197+-2147483648
198+-2147483648
199+-2147483648
200+-3
201+10
202+2147483647
203
204=== modified file 'test/mysql-test/t/pbxt_bugs.test'
205--- test/mysql-test/t/pbxt_bugs.test 2009-03-11 11:18:00 +0000
206+++ test/mysql-test/t/pbxt_bugs.test 2009-03-17 16:06:29 +0000
207@@ -865,3 +865,42 @@
208 INSERT INTO t5(c2,c3) VALUES(33,34);
209
210 SELECT * FROM t5;
211+
212+# bug 341115: wrong key comparison algorithm led to endless resultset
213+
214+CREATE TABLE t2(c1 INT SIGNED NOT NULL, c2 INT UNSIGNED NULL, c3 INT, KEY(c1), KEY(c2));
215+INSERT INTO t2 VALUES(-1,1,1),(-2,2,2),(-3,3,3),(-4,4,4),(-5,5,5),(-6,6,6),(-7,7,7),(-8,8,8),(-9,9,9),(10,10,10),(-11,NULL,11),(-12,12,12);
216+INSERT INTO t2 VALUES(-2147483648,0,13),(2147483647,4294967295,14),(0,2147483648,15),(2147483647,2147483647,16);
217+--sorted_result
218+SELECT * FROM t2;
219+
220+# make sure it uses index scan
221+EXPLAIN SELECT c1 FROM t2;
222+
223+SELECT c1 FROM t2;
224+
225+UPDATE t2 SET c1=-2147483648 WHERE c2 <> 0 ORDER BY c2 LIMIT 2;
226+SELECT * FROM t2 WHERE c2 <> 0 ORDER BY c2;
227+UPDATE t2 SET c1=-2147483648 WHERE c2 >= 0 ORDER BY c2 DESC LIMIT 2;
228+SELECT * FROM t2 WHERE c2 >= 0 ORDER BY c2 DESC;
229+UPDATE t2 SET c1=-2147483648 WHERE c2 <= 3 ORDER BY c2 LIMIT 2;
230+SELECT * FROM t2 WHERE c2 <= 3 ORDER BY c2;
231+UPDATE t2 SET c1=-2147483648 WHERE c2 <=> 4 ORDER BY c2 DESC LIMIT 2;
232+SELECT * FROM t2 WHERE c2 <=> 4 ORDER BY c2;
233+UPDATE t2 SET c1=-2147483648 WHERE c2 BETWEEN 4 AND 7 ORDER BY c2 LIMIT 2;
234+SELECT * FROM t2 WHERE c2 BETWEEN 4 AND 7 ORDER BY c2;
235+UPDATE t2 SET c1=-2147483648 WHERE c2 IN(8,9) ORDER BY c2 DESC LIMIT 2;
236+SELECT * FROM t2 WHERE c2 IN(8,9) ORDER BY c2 DESC;
237+UPDATE t2 SET c1=-2147483648 WHERE c2 IS NULL ORDER BY c2 LIMIT 2;
238+SELECT * FROM t2 WHERE c2 IS NULL ORDER BY c2;
239+UPDATE t2 SET c1=-2147483648 WHERE c2>= 6 AND c2 < 9 ORDER BY c2 LIMIT 2;
240+SELECT * FROM t2 WHERE c2>= 6 AND c2 < 9 ORDER BY c2;
241+UPDATE t2 SET c1=-2147483648 WHERE c1=-12 OR c2=1;
242+SELECT * FROM t2 WHERE c1=-2147483648;
243+--sorted_result
244+SELECT * FROM t2;
245+
246+# make sure it uses index scan
247+EXPLAIN SELECT c1 FROM t2;
248+
249+SELECT c1 FROM t2;
250\ No newline at end of file

Subscribers

People subscribed via source and target branches