diff options
author | Alexander Barkov <bar@mariadb.com> | 2018-06-05 10:25:39 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2018-06-05 10:25:39 +0400 |
commit | 106f0b5798a2b5d13b7d67c3cc678fc0cc2184c2 (patch) | |
tree | 051be6f9936bb23d3db3e3591016e09de159f19c /mysql-test/main/sp-row.test | |
parent | b50685af82508ca1cc83e1743dff527770e6e64b (diff) | |
download | mariadb-git-106f0b5798a2b5d13b7d67c3cc678fc0cc2184c2.tar.gz |
MDEV-16385 ROW SP variable is allowed in unexpected context
The problem described in the bug report happened because the code
did not test check_cols(1) after fix_fields() in a few places.
Additionally, fix_fields() could be called multiple times for SP variables,
because they are all fixed at a early stage in append_for_log().
Solution:
1. Adding a few helper methods
- fix_fields_if_needed()
- fix_fields_if_needed_for_scalar()
- fix_fields_if_needed_for_bool()
- fix_fields_if_needed_for_order_by()
and using it in many cases instead of fix_fields() where
the "fixed" status is not definitely known to be "false".
2. Adding DBUG_ASSERT(!fixed) into Item_splocal*::fix_fields()
to catch double execution.
3. Adding tests.
As a good side effect, the patch removes a lot of duplicate code (~60 lines):
if (!item->fixed &&
item->fix_fields(..) &&
item->check_cols(1))
return true;
Diffstat (limited to 'mysql-test/main/sp-row.test')
-rw-r--r-- | mysql-test/main/sp-row.test | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/mysql-test/main/sp-row.test b/mysql-test/main/sp-row.test index 837e24c89c0..3352c940cb6 100644 --- a/mysql-test/main/sp-row.test +++ b/mysql-test/main/sp-row.test @@ -1504,3 +1504,38 @@ BEGIN NOT ATOMIC END; $$ DELIMITER ;$$ + +--echo # +--echo # MDEV-16385 ROW SP variable is allowed in unexpected context +--echo # + +CREATE TABLE t1 (a INT); +DELIMITER $$; +--error ER_OPERAND_COLUMNS +BEGIN NOT ATOMIC + DECLARE row ROW(a INT); + SELECT * FROM t1 ORDER BY row; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + +CREATE TABLE t1 (a INT); +DELIMITER $$; +--error ER_OPERAND_COLUMNS +BEGIN NOT ATOMIC + DECLARE row ROW(a INT); + SELECT * FROM t1 HAVING row; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + +DELIMITER $$; +--error ER_OPERAND_COLUMNS +BEGIN NOT ATOMIC + DECLARE a ROW(a INT); + SELECT 1 LIKE 2 ESCAPE a; +END; +$$ +DELIMITER ;$$ |