'Unknown column' when re-executing a prepared query optimized with materialization
Bug #612530 reported by
Philip Stoev
This bug affects 1 person
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
MariaDB |
Fix Released
|
Critical
|
Timour Katchaounov | ||
5.3 |
Fix Released
|
Critical
|
Timour Katchaounov |
Bug Description
When the following query:
SELECT table1 .`col_varchar_key`
FROM (
SELECT *
FROM BB ) table1 STRAIGHT_JOIN B ON ( 'd' , 'f' ) IN (
SELECT `col_varchar_nokey` SUBQUERY2_field1 , `col_varchar_nokey`
FROM view_B )
is executed with subquery cache by preparing it and running it twice, the server returns the following error:
1054: 'Unknown column 'materialized subselect.
The main problem aside, it may not be wise to output optimizer-internal information in error messages. A generic "internal optimizer error" or a direct assertion may be less confusing than a message about a table or a column the user never created herself.
summary: |
'Unknown column' when re-executing a prepared query optimized with - subquery caching + materialization |
Changed in maria: | |
importance: | Medium → Critical |
To post a comment you must log in.
Test case. Views seem to be required for this particular query, but the bug has also been observed without them.
SET LOCAL optimizer_switch = 'partial_ match_rowid_ merge=off, partial_ match_table_ scan=off, semijoin= off';
CREATE TABLE `BB` ( varchar_ nokey` varchar(1) NOT NULL, key`,`col_ int_key` ) varchar_ nokey` varchar(1) NOT NULL, key`,`col_ int_key` )
`col_int_key` int(11) NOT NULL,
`col_varchar_key` varchar(1) NOT NULL,
`col_
KEY `col_int_key` (`col_int_key`),
KEY `col_varchar_key` (`col_varchar_
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `BB` VALUES (9,'p','p');
CREATE TABLE `B` (
`col_int_key` int(11) NOT NULL,
`col_varchar_key` varchar(1) NOT NULL,
`col_
KEY `col_int_key` (`col_int_key`),
KEY `col_varchar_key` (`col_varchar_
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `B` VALUES (7,'p','p');
CREATE VIEW view_B AS SELECT * FROM B;
PREPARE st1 FROM "
SELECT table1 .`col_varchar_key`
FROM (
SELECT *
FROM BB ) table1 STRAIGHT_JOIN B ON ( 'd' , 'f' ) IN (
SELECT `col_varchar_nokey` SUBQUERY2_field1 , `col_varchar_nokey`
FROM view_B ) ";
EXECUTE st1;
--error 0
EXECUTE st1;
DEALLOCATE PREPARE st1;