Skip to content

Commit 91b30e2

Browse files
abarkovclaude
andcommitted
MDEV-41265 SELECT/ UPDATE RETURNING INTO a single row-field fails with ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, even though the column count matches
my_var_sp_row_field::check_assignability() and my_var_sp_row_field_by_name::check_assignability() had an inverted condition. They returned true (error) when the select list had exactly one element, and false (OK) otherwise. A field of a ROW variable (r0.a) is a scalar target, so it accepts exactly one column. The check must fail when the number of select list elements is not 1: SELECT a INTO r0.a FROM t1; # was wrongly rejected, now works SELECT a,b INTO r0.a FROM t1; # was wrongly accepted, now fails with # ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT Fix: change 'select_list.elements == 1' to 'select_list.elements != 1' in both classes. Tests added to select_into_row.test for fields of: - an explicit ROW variable - a ROW TYPE OF table variable - a ROW TYPE OF cursor variable Each covers the one-column (OK) and two-column (error) cases. The bug was introduced in two steps: - a91b780 MDEV-36705 added my_var_sp_row_field with the inverted condition. - add6399 MDEV-40790 copied it into the new class my_var_sp_row_field_by_name. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
1 parent fffe55f commit 91b30e2

3 files changed

Lines changed: 171 additions & 2 deletions

File tree

‎mysql-test/main/select_into_row.result‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,85 @@ CALL p1;
137137
ERROR HY000: Row variable 'r0' does not have a field 'b1_non_existing'
138138
DROP PROCEDURE p1;
139139
DROP TABLE t1;
140+
#
141+
# MDEV-41265 SELECT/ UPDATE RETURNING INTO a single row-field fails with ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, even though the column count matches
142+
#
143+
# One scalar column into one field of an explicit ROW variable
144+
CREATE TABLE t1 (a INT, b VARCHAR(10));
145+
INSERT INTO t1 VALUES (1,'b1');
146+
CREATE PROCEDURE p1()
147+
BEGIN
148+
DECLARE r0 ROW (a INT, b VARCHAR(10));
149+
SELECT a INTO r0.a FROM t1;
150+
SELECT r0.a;
151+
END;
152+
$$
153+
CREATE PROCEDURE p2()
154+
BEGIN
155+
DECLARE r0 ROW (a INT, b VARCHAR(10));
156+
SELECT a,b INTO r0.a FROM t1;
157+
END;
158+
$$
159+
CALL p1;
160+
r0.a
161+
1
162+
CALL p2;
163+
ERROR 21000: The used SELECT statements have a different number of columns
164+
DROP PROCEDURE p1;
165+
DROP PROCEDURE p2;
166+
DROP TABLE t1;
167+
# One scalar column into one field of a `ROW TYPE OF table1` variable
168+
CREATE TABLE t1 (a INT, b VARCHAR(10));
169+
INSERT INTO t1 VALUES (1,'b1');
170+
CREATE PROCEDURE p1()
171+
BEGIN
172+
DECLARE r0 ROW TYPE OF t1;
173+
SELECT a INTO r0.a FROM t1;
174+
SELECT r0.a;
175+
END;
176+
$$
177+
CREATE PROCEDURE p2()
178+
BEGIN
179+
DECLARE r0 ROW TYPE OF t1;
180+
SELECT a,b INTO r0.a FROM t1;
181+
END;
182+
$$
183+
CALL p1;
184+
r0.a
185+
1
186+
CALL p2;
187+
ERROR 21000: The used SELECT statements have a different number of columns
188+
DROP PROCEDURE p1;
189+
DROP PROCEDURE p2;
190+
DROP TABLE t1;
191+
# One scalar column into one field of a `ROW TYPE OF cursor1` variable
192+
CREATE TABLE t1 (a INT, b VARCHAR(10));
193+
INSERT INTO t1 VALUES (1,'b1');
194+
CREATE PROCEDURE p1()
195+
BEGIN
196+
DECLARE c1 CURSOR FOR SELECT * FROM t1;
197+
BEGIN
198+
DECLARE r0 ROW TYPE OF c1;
199+
SELECT a INTO r0.a FROM t1;
200+
SELECT r0.a;
201+
END;
202+
END;
203+
$$
204+
CREATE PROCEDURE p2()
205+
BEGIN
206+
DECLARE c1 CURSOR FOR SELECT * FROM t1;
207+
BEGIN
208+
DECLARE r0 ROW TYPE OF c1;
209+
SELECT a,b INTO r0.a FROM t1;
210+
END;
211+
END;
212+
$$
213+
CALL p1;
214+
r0.a
215+
1
216+
CALL p2;
217+
ERROR 21000: The used SELECT statements have a different number of columns
218+
DROP PROCEDURE p1;
219+
DROP PROCEDURE p2;
220+
DROP TABLE t1;
140221
# End of 12.3 tests

‎mysql-test/main/select_into_row.test‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,92 @@ CALL p1;
171171
DROP PROCEDURE p1;
172172
DROP TABLE t1;
173173

174+
--echo #
175+
--echo # MDEV-41265 SELECT/ UPDATE RETURNING INTO a single row-field fails with ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, even though the column count matches
176+
--echo #
177+
178+
--echo # One scalar column into one field of an explicit ROW variable
179+
180+
CREATE TABLE t1 (a INT, b VARCHAR(10));
181+
INSERT INTO t1 VALUES (1,'b1');
182+
DELIMITER $$;
183+
CREATE PROCEDURE p1()
184+
BEGIN
185+
DECLARE r0 ROW (a INT, b VARCHAR(10));
186+
SELECT a INTO r0.a FROM t1;
187+
SELECT r0.a;
188+
END;
189+
$$
190+
CREATE PROCEDURE p2()
191+
BEGIN
192+
DECLARE r0 ROW (a INT, b VARCHAR(10));
193+
SELECT a,b INTO r0.a FROM t1;
194+
END;
195+
$$
196+
DELIMITER ;$$
197+
CALL p1;
198+
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
199+
CALL p2;
200+
DROP PROCEDURE p1;
201+
DROP PROCEDURE p2;
202+
DROP TABLE t1;
203+
204+
--echo # One scalar column into one field of a `ROW TYPE OF table1` variable
205+
206+
CREATE TABLE t1 (a INT, b VARCHAR(10));
207+
INSERT INTO t1 VALUES (1,'b1');
208+
DELIMITER $$;
209+
CREATE PROCEDURE p1()
210+
BEGIN
211+
DECLARE r0 ROW TYPE OF t1;
212+
SELECT a INTO r0.a FROM t1;
213+
SELECT r0.a;
214+
END;
215+
$$
216+
CREATE PROCEDURE p2()
217+
BEGIN
218+
DECLARE r0 ROW TYPE OF t1;
219+
SELECT a,b INTO r0.a FROM t1;
220+
END;
221+
$$
222+
DELIMITER ;$$
223+
CALL p1;
224+
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
225+
CALL p2;
226+
DROP PROCEDURE p1;
227+
DROP PROCEDURE p2;
228+
DROP TABLE t1;
229+
230+
--echo # One scalar column into one field of a `ROW TYPE OF cursor1` variable
231+
232+
CREATE TABLE t1 (a INT, b VARCHAR(10));
233+
INSERT INTO t1 VALUES (1,'b1');
234+
DELIMITER $$;
235+
CREATE PROCEDURE p1()
236+
BEGIN
237+
DECLARE c1 CURSOR FOR SELECT * FROM t1;
238+
BEGIN
239+
DECLARE r0 ROW TYPE OF c1;
240+
SELECT a INTO r0.a FROM t1;
241+
SELECT r0.a;
242+
END;
243+
END;
244+
$$
245+
CREATE PROCEDURE p2()
246+
BEGIN
247+
DECLARE c1 CURSOR FOR SELECT * FROM t1;
248+
BEGIN
249+
DECLARE r0 ROW TYPE OF c1;
250+
SELECT a,b INTO r0.a FROM t1;
251+
END;
252+
END;
253+
$$
254+
DELIMITER ;$$
255+
CALL p1;
256+
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
257+
CALL p2;
258+
DROP PROCEDURE p1;
259+
DROP PROCEDURE p2;
260+
DROP TABLE t1;
261+
174262
--echo # End of 12.3 tests

‎sql/sql_type_row.cc‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class my_var_sp_row_field: public my_var_sp
125125
bool *assign_as_row) const override
126126
{
127127
*assign_as_row= false;
128-
return select_list.elements == 1;
128+
return select_list.elements != 1;
129129
}
130130
bool set(THD *thd, Item *item) override
131131
{
@@ -151,7 +151,7 @@ class my_var_sp_row_field_by_name: public my_var_sp
151151
bool *assign_as_row) const override
152152
{
153153
*assign_as_row= false;
154-
return select_list.elements == 1;
154+
return select_list.elements != 1;
155155
}
156156
bool set(THD *thd, Item *item) override
157157
{

0 commit comments

Comments
 (0)