Merge lp:~linuxjedi/drizzle/trunk-bug-639716-take2 into lp:drizzle/7.0

Proposed by Andrew Hutchings
Status: Merged
Approved by: Brian Aker
Approved revision: 2049
Merged at revision: 2057
Proposed branch: lp:~linuxjedi/drizzle/trunk-bug-639716-take2
Merge into: lp:drizzle/7.0
Diff against target: 260 lines (+97/-18)
9 files modified
drizzled/item/subselect.cc (+1/-0)
drizzled/join.cc (+5/-2)
drizzled/optimizer/range.cc (+1/-1)
drizzled/sql_select.cc (+9/-9)
drizzled/sql_select.h (+1/-5)
drizzled/sql_update.cc (+1/-1)
drizzled/table_reference.h (+14/-0)
tests/suite/regression/r/639716.result (+28/-0)
tests/suite/regression/t/639716.test (+37/-0)
To merge this branch: bzr merge lp:~linuxjedi/drizzle/trunk-bug-639716-take2
Reviewer Review Type Date Requested Status
Drizzle Developers Pending
Review via email: mp+45168@code.launchpad.net

Description of the change

An improved fix for crashes due to join initialization issues.

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 'drizzled/item/subselect.cc'
2--- drizzled/item/subselect.cc 2010-12-25 01:27:46 +0000
3+++ drizzled/item/subselect.cc 2011-01-04 20:22:25 +0000
4@@ -3022,6 +3022,7 @@
5 */
6 if (!(tab= (JoinTable*) session->alloc(sizeof(JoinTable))))
7 return(true);
8+ new (tab) JoinTable();
9 tab->table= tmp_table;
10 tab->ref.key= 0; /* The only temp table index. */
11 tab->ref.key_length= tmp_key->key_length;
12
13=== modified file 'drizzled/join.cc'
14--- drizzled/join.cc 2011-01-01 09:24:57 +0000
15+++ drizzled/join.cc 2011-01-04 20:22:25 +0000
16@@ -1587,7 +1587,7 @@
17 if (sort_table_cond)
18 {
19 if (!curr_table->select)
20- if (!(curr_table->select= new optimizer::SqlSelect))
21+ if (!(curr_table->select= new optimizer::SqlSelect()))
22 return;
23 if (!curr_table->select->cond)
24 curr_table->select->cond= sort_table_cond;
25@@ -3220,6 +3220,9 @@
26 (JoinTable*) session->alloc(sizeof(JoinTable)*table_count)))
27 return(true);
28
29+ for (i= 0; i < table_count; i++)
30+ new (join_tab+i) JoinTable();
31+
32 join->full_join=0;
33
34 used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read
35@@ -4382,6 +4385,7 @@
36 if (!(join->join_tab_reexec=
37 (JoinTable*) join->session->alloc(sizeof(JoinTable))))
38 return(true);
39+ new (join->join_tab_reexec) JoinTable();
40 if (join->tmp_join)
41 join->tmp_join->join_tab_reexec= join->join_tab_reexec;
42 }
43@@ -4402,7 +4406,6 @@
44 join->row_limit=join->unit->select_limit_cnt;
45 join->do_send_rows = (join->row_limit) ? 1 : 0;
46
47- join_tab->cache.buff=0; /* No caching */
48 join_tab->table=tmp_table;
49 join_tab->select=0;
50 join_tab->select_cond=0;
51
52=== modified file 'drizzled/optimizer/range.cc'
53--- drizzled/optimizer/range.cc 2010-12-18 04:43:40 +0000
54+++ drizzled/optimizer/range.cc 2011-01-04 20:22:25 +0000
55@@ -348,7 +348,7 @@
56 {
57 return 0;
58 }
59- if (! (select= new optimizer::SqlSelect))
60+ if (! (select= new optimizer::SqlSelect()))
61 {
62 *error= 1; // out of memory
63 return 0;
64
65=== modified file 'drizzled/sql_select.cc'
66--- drizzled/sql_select.cc 2010-12-24 07:15:43 +0000
67+++ drizzled/sql_select.cc 2011-01-04 20:22:25 +0000
68@@ -78,7 +78,7 @@
69 static Item* part_of_refkey(Table *form,Field *field);
70 static bool cmp_buffer_with_ref(JoinTable *tab);
71 static void change_cond_ref_to_const(Session *session,
72- vector<COND_CMP>& save_list,
73+ list<COND_CMP>& save_list,
74 Item *and_father,
75 Item *cond,
76 Item *field,
77@@ -2364,7 +2364,7 @@
78 and_level
79 */
80 static void change_cond_ref_to_const(Session *session,
81- vector<COND_CMP>& save_list,
82+ list<COND_CMP>& save_list,
83 Item *and_father,
84 Item *cond,
85 Item *field,
86@@ -2470,7 +2470,7 @@
87 }
88
89 static void propagate_cond_constants(Session *session,
90- vector<COND_CMP>& save_list,
91+ list<COND_CMP>& save_list,
92 COND *and_father,
93 COND *cond)
94 {
95@@ -2479,7 +2479,7 @@
96 bool and_level= ((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC;
97 List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
98 Item *item;
99- vector<COND_CMP> save;
100+ list<COND_CMP> save;
101 while ((item=li++))
102 {
103 propagate_cond_constants(session, save, and_level ? cond : item, item);
104@@ -2487,13 +2487,13 @@
105 if (and_level)
106 {
107 // Handle other found items
108- for (vector<COND_CMP>::iterator iter= save.begin(); iter != save.end(); ++iter)
109+ for (list<COND_CMP>::iterator iter= save.begin(); iter != save.end(); ++iter)
110 {
111- Item **args= iter->cmp_func->arguments();
112+ Item **args= iter->second->arguments();
113 if (not args[0]->const_item())
114 {
115- change_cond_ref_to_const(session, save_list, iter->and_level,
116- iter->and_level, args[0], args[1] );
117+ change_cond_ref_to_const(session, save, iter->first,
118+ iter->first, args[0], args[1] );
119 }
120 }
121 }
122@@ -2684,7 +2684,7 @@
123 &join->cond_equal);
124
125 /* change field = field to field = const for each found field = const */
126- vector<COND_CMP> temp;
127+ list<COND_CMP> temp;
128 propagate_cond_constants(session, temp, conds, conds);
129 /*
130 Remove all instances of item == item
131
132=== modified file 'drizzled/sql_select.h'
133--- drizzled/sql_select.h 2010-12-24 07:15:43 +0000
134+++ drizzled/sql_select.h 2011-01-04 20:22:25 +0000
135@@ -82,11 +82,7 @@
136 item->marker should be 0 for all items on entry
137 Return in cond_value false if condition is impossible (1 = 2)
138 *****************************************************************************/
139-struct COND_CMP {
140- Item *and_level;
141- Item_func *cmp_func;
142- COND_CMP(Item *a,Item_func *b) :and_level(a),cmp_func(b) {}
143-};
144+typedef std::pair<Item*, Item_func*> COND_CMP;
145
146 void TEST_join(Join *join);
147
148
149=== modified file 'drizzled/sql_update.cc'
150--- drizzled/sql_update.cc 2010-12-24 07:15:43 +0000
151+++ drizzled/sql_update.cc 2011-01-04 20:22:25 +0000
152@@ -413,7 +413,7 @@
153 }
154 else
155 {
156- select= new optimizer::SqlSelect;
157+ select= new optimizer::SqlSelect();
158 select->head=table;
159 }
160 if (tempfile.reinit_io_cache(internal::READ_CACHE,0L,0,0))
161
162=== modified file 'drizzled/table_reference.h'
163--- drizzled/table_reference.h 2010-12-18 04:43:40 +0000
164+++ drizzled/table_reference.h 2011-01-04 20:22:25 +0000
165@@ -39,6 +39,20 @@
166
167 struct table_reference_st
168 {
169+ table_reference_st() :
170+ key_err(false),
171+ key_parts(0),
172+ key_length(0),
173+ key(0),
174+ key_buff(NULL),
175+ key_buff2(NULL),
176+ key_copy(NULL),
177+ items(NULL),
178+ cond_guards(NULL),
179+ null_ref_key(NULL),
180+ disable_cache(false)
181+ { }
182+
183 bool key_err;
184 uint32_t key_parts; /**< num of key parts */
185 uint32_t key_length; /**< length of key_buff */
186
187=== added file 'tests/suite/regression/r/639716.result'
188--- tests/suite/regression/r/639716.result 1970-01-01 00:00:00 +0000
189+++ tests/suite/regression/r/639716.result 2011-01-04 20:22:25 +0000
190@@ -0,0 +1,28 @@
191+DROP TABLE IF EXISTS `a`;
192+DROP TABLE IF EXISTS `aa`;
193+DROP TABLE IF EXISTS `c`;
194+CREATE TABLE `a` (
195+`pk` INT NOT NULL DEFAULT '0',
196+`col_enum_key` ENUM('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL,
197+PRIMARY KEY (`pk`),
198+KEY `col_enum_key` (`col_enum_key`)
199+) ENGINE=InnoDB COLLATE = utf8_general_ci;
200+CREATE TABLE `aa` (
201+`pk` INT NOT NULL DEFAULT '0',
202+`col_int_not_null_key` INT NOT NULL,
203+PRIMARY KEY (`pk`),
204+KEY `col_int_not_null_key` (`col_int_not_null_key`)
205+) ENGINE=InnoDB COLLATE = utf8_general_ci;
206+INSERT INTO `aa` VALUES (1,-523436032),(2,1),(3,621543424),(4,880148480),(5,1963982848),(6,8),(7,1445462016),(8,0),(9,-747241472),(10,6);
207+CREATE TABLE `c` (
208+`pk` INT NOT NULL DEFAULT '0',
209+`col_int_key` INT DEFAULT NULL,
210+`col_enum_key` ENUM('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL,
211+PRIMARY KEY (`pk`),
212+KEY `col_int_key` (`col_int_key`),
213+KEY `col_enum_key` (`col_enum_key`)
214+) ENGINE=InnoDB COLLATE = utf8_general_ci;
215+INSERT INTO `c` VALUES (1,NULL,'h');
216+SELECT X . `col_int_key` FROM `c` AS X LEFT JOIN `a` AS Y USING ( `col_enum_key` ) WHERE X . `col_enum_key` = ( SELECT `col_int_not_null_key` FROM `aa` WHERE `pk` = 5 ) LIMIT 8 ;
217+ERROR HY000: Received an invalid enum value '1963982848'.
218+DROP TABLE `a`,`aa`,`c`;
219
220=== added file 'tests/suite/regression/t/639716.test'
221--- tests/suite/regression/t/639716.test 1970-01-01 00:00:00 +0000
222+++ tests/suite/regression/t/639716.test 2011-01-04 20:22:25 +0000
223@@ -0,0 +1,37 @@
224+--disable_warnings
225+DROP TABLE IF EXISTS `a`;
226+DROP TABLE IF EXISTS `aa`;
227+DROP TABLE IF EXISTS `c`;
228+--enable_warnings
229+
230+CREATE TABLE `a` (
231+ `pk` INT NOT NULL DEFAULT '0',
232+ `col_enum_key` ENUM('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL,
233+ PRIMARY KEY (`pk`),
234+ KEY `col_enum_key` (`col_enum_key`)
235+) ENGINE=InnoDB COLLATE = utf8_general_ci;
236+
237+CREATE TABLE `aa` (
238+ `pk` INT NOT NULL DEFAULT '0',
239+ `col_int_not_null_key` INT NOT NULL,
240+ PRIMARY KEY (`pk`),
241+ KEY `col_int_not_null_key` (`col_int_not_null_key`)
242+) ENGINE=InnoDB COLLATE = utf8_general_ci;
243+
244+INSERT INTO `aa` VALUES (1,-523436032),(2,1),(3,621543424),(4,880148480),(5,1963982848),(6,8),(7,1445462016),(8,0),(9,-747241472),(10,6);
245+
246+CREATE TABLE `c` (
247+ `pk` INT NOT NULL DEFAULT '0',
248+ `col_int_key` INT DEFAULT NULL,
249+ `col_enum_key` ENUM('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL,
250+ PRIMARY KEY (`pk`),
251+ KEY `col_int_key` (`col_int_key`),
252+ KEY `col_enum_key` (`col_enum_key`)
253+) ENGINE=InnoDB COLLATE = utf8_general_ci;
254+
255+INSERT INTO `c` VALUES (1,NULL,'h');
256+
257+--error 1691
258+SELECT X . `col_int_key` FROM `c` AS X LEFT JOIN `a` AS Y USING ( `col_enum_key` ) WHERE X . `col_enum_key` = ( SELECT `col_int_not_null_key` FROM `aa` WHERE `pk` = 5 ) LIMIT 8 ;
259+
260+DROP TABLE `a`,`aa`,`c`;

Subscribers

People subscribed via source and target branches