[MDEV-2996] LP:663818 - Wrong result with join_cache_level={3,5}, join_cache_hashed=on in maria-5.3-mwl128 Created: 2010-10-20  Updated: 2015-02-02  Resolved: 2012-10-04

Status: Closed
Project: MariaDB Server
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Critical
Reporter: Philip Stoev (Inactive) Assignee: Igor Babaev
Resolution: Fixed Votes: 0
Labels: Launchpad

Attachments: XML File LPexportBug663818.xml    

 Description   

The following query produces 1 less row than desired, when executed with join_cache_hashed=on, join_cache_level=3, join_buffer_size=10000:

SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;

The plan is:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table1 index PRIMARY PRIMARY 4 NULL 11 Using where; Using index
1 SIMPLE table2 eq_ref PRIMARY PRIMARY 4 test.table1.pk 1 Using index; Using join buffer (flat, BNLH join)



 Comments   
Comment by Philip Stoev (Inactive) [ 2010-10-20 ]

Re: Wrong result with join_cache_level=3, join_buffer_size=10K, join_cache_hashed=on in maria-5.3-mwl128
Test case:

--source include/have_innodb.inc
CREATE TABLE `X` (
`pk` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`pk`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;
INSERT INTO `X` VALUES (1);
INSERT INTO `X` VALUES (2);
INSERT INTO `X` VALUES (11);
INSERT INTO `X` VALUES (12);
INSERT INTO `X` VALUES (13);
INSERT INTO `X` VALUES (14);
INSERT INTO `X` VALUES (15);
INSERT INTO `X` VALUES (16);
INSERT INTO `X` VALUES (17);
INSERT INTO `X` VALUES (18);
INSERT INTO `X` VALUES (19);
CREATE TABLE `V` (
`pk` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`pk`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=latin1;
INSERT INTO `V` VALUES (1);
INSERT INTO `V` VALUES (10);
INSERT INTO `V` VALUES (11);
INSERT INTO `V` VALUES (12);
INSERT INTO `V` VALUES (13);
INSERT INTO `V` VALUES (14);
INSERT INTO `V` VALUES (15);
INSERT INTO `V` VALUES (16);
INSERT INTO `V` VALUES (17);
INSERT INTO `V` VALUES (18);
INSERT INTO `V` VALUES (19);
INSERT INTO `V` VALUES (20);
INSERT INTO `V` VALUES (21);

SET SESSION join_cache_level=3;
SET SESSION join_buffer_size=10000;

SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;
EXPLAIN SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;
CREATE TABLE p1 AS
SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;

SET SESSION optimizer_switch='join_cache_hashed=off';

SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;
EXPLAIN SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;

CREATE TABLE p2 AS
SELECT table1 .`pk`
FROM X table1 JOIN V table2 ON table1 .`pk` = table2 .`pk`
WHERE table2 .`pk` <> 8;
--let $diff_table_1 = test.p1
--let $diff_table_2 = test.p2
--source include/diff_tables.inc

Comment by Philip Stoev (Inactive) [ 2010-10-21 ]

Re: Wrong result with join_cache_level=3, join_buffer_size=10K, join_cache_hashed=on in maria-5.3-mwl128
Not reproducible with 5.3-main

Comment by Philip Stoev (Inactive) [ 2010-10-21 ]

Re: Wrong result with join_cache_level=3, join_buffer_size=10K, join_cache_hashed=on in maria-5.3-mwl128
Here is another test case with the default join_buffer_size:

CREATE TABLE `M` (
`col_varchar_1024_latin1_key` varchar(1024) DEFAULT NULL,
`col_varchar_10_latin1_key` varchar(10) DEFAULT NULL,
`col_datetime_key` datetime DEFAULT NULL,
`col_int_key` int(11) DEFAULT NULL,
KEY `col_int_key` (`col_int_key`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `M` VALUES ('XMCXE','bqcpbhsnmm','2005-12-06 08:39:18',-1849032704);
INSERT INTO `M` VALUES ('IOVYB','t','2000-01-20 00:00:00',0);
CREATE TABLE `K` (
`col_datetime_key` datetime DEFAULT NULL,
`col_int` int(11) DEFAULT NULL,
`col_varchar_10_latin1_key` varchar(10) DEFAULT NULL,
`col_int_key` int(11) DEFAULT NULL,
`col_varchar_1024_latin1_key` varchar(1024) DEFAULT NULL,
KEY `col_varchar_1024_latin1_key` (`col_varchar_1024_latin1_key`(1000)),
KEY `test_idx` (`col_int_key`,`col_int`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `K` VALUES ('2005-06-08 22:15:04',4,'was',-418381824,'clasizomrohcwftsfaiijvvsiknlnceuogscieejgjkpwchiklgqvfuxfplhqeamqxggdleymimjjswulpxkwcovdvzgtoqdxqqgqnjzskbuhlkhrvbhckqnnqpijobqqphtzywplgonecwmiucqtczfbafejsqpklcsvlaftwkzxpkxwbaropraalifipatjkgfsxdgnqyhtfpdneqhtmdvjvpzxljycsdkqbylczifltspxjbbrweeclwnlnbxzvfyfyjwydjrfimdjjksvjgxgondjphggpfujlvfrcclylvbajaqzywwregtqthijfmdtmvluizjjpratqbicqozmbuykypyeypkrrpdgpiv');
INSERT INTO `K` VALUES ('2008-09-12 09:33:37',1119289344,'no',2,'KFXFJ');
INSERT INTO `K` VALUES ('2006-09-05 00:00:00',3,'xgclasizom',527958016,'back');
INSERT INTO `K` VALUES ('2006-09-04 23:28:42',4,'TNNQF',0,'iizmxgclasizomrohcwftsfaiijvvsiknlnceuogscieejgjkpwchiklgqvfuxfplhqeamqxggdleymimjjswulpxkwcovdvzgtoqdxqqgqnjzskbuhlkhrvbhckqnnqpijobqqphtzywplgonecwmiucqtczfbafejsqpklcsvlaftwkzxpkxwbaropraalifipatjkgfsxdgnqyhtfpdneqhtmdvjvpzxljycsdkqbylczifltspxjbbrweeclwnlnbxzvfyfyjwydjrfimdjjksvjgxgondjphggpfujlvfrcclylvbajaqzywwregtqthijfmdtmvluizjjpratqbicqozmbuykypyeypkrrpdgpivtpkdcydziiscsjvfbwcpaigrlddeirkedqogmadegpyckuuzpxjwusjbafkgsucpeudjqivgzqeujkxitkixmopghkyhimjnwsxdriisfcjhpsvbisbdsddmacyzcdyecostdenazbhzvbqenjfykzlzfmbrwvqhnypqblxeyaykaveiznsroiuhqelrkjmviebfkjuxgkfuandsosoydkttflrhvsglikkubitlqptnsglxgjptrxkrurwywowifjftrvtexasdbsdzvppwiaonidtelahawdpokevmcurruavqeylhzfcsnkgfjrhwkchovvqxwkxxwptyjubpiuznkrehnxsdoxbdbyemjivvduklxmkalbyjykocwukfcsamuzevibremfzrymegyqtlrxbrcdlqdvxe');
INSERT INTO `K` VALUES ('2006-07-15 00:13:49',356712448,'BBNQK',-1095696384,'trziizmxgclasizomrohcwftsfaiijvvsiknlnceuogscieejgjkpwchiklgqvfuxfplhqeamqxggdleymimjjswulpxkwcovdvzgtoqdxqqgqnjzskbuhlkhrvbhckqnnqpijobqqphtzywplgonecwmiucqtczfbafejsqpklcsvlaftwkzxpkxwbaropraalifipatjkgfsxdgnqyhtfpdneqhtmdvjvpzxljycsdkqbylczifltspxjbbrweeclwnlnbxzvfyfyjwydjrfimdjjksvjgxgondjphggpfujlvfrcclylvbajaqzywwregtqthijfmdtmvluizjjpratqbicqozmbuykypyeypkrrpdgpivtpkdcydziiscsjvfbwcpaigrlddeirkedqogmadegpyckuuzpxjwusjbafkgsucpeudjqivgzqeujkxitkixmopghkyhimjnwsxdriisfcjhpsvbisbdsddmacyzcdyecostdenazbhzvbqenjfykzlzfmbrwvqhnypqblxeyaykaveiznsroiuhqelrkjmviebfkjuxgkfuandsosoydkttflrhvsglikkubitlqptnsglxgjptrxkrurwywowifjftrvtexasdbsdzvppwiaonidtelahawdpokevmcurruavqeylhzfcsnkgfjrhwkchovvqxwkxxwptyjubpiuznkrehnxsdoxbdbyemjivvduklxmkalbyjykocwukfcsamuzevibremfzrymegyqtlrxbrcdlqdvxefnpgoqgasadrjykjzqnouqsqgyoqkwrlvqlaxqh');
INSERT INTO `K` VALUES ('0000-00-00 00:00:00',4,'pgtrziizmx',1604059136,'t');
INSERT INTO `K` VALUES ('0000-00-00 00:00:00',428277760,'XVPUL',6,'BQABY');

SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
EXPLAIN SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
SET SESSION join_cache_level = 5;
SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
EXPLAIN SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
CREATE TABLE p1 AS SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
SET SESSION optimizer_switch='join_cache_bka=off';
SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
EXPLAIN SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
CREATE TABLE p2 AS SELECT table1 .`col_datetime_key` FROM K table1 JOIN M table2 ON table1 .`col_varchar_1024_latin1_key` = table2 .`col_varchar_10_latin1_key` WHERE 6 OR 4 AND table2 .`col_int_key` ;
--let $diff = `SELECT ((SELECT COUNT FROM p2) - (SELECT COUNT FROM p1)) != 0`

  1. if ($diff) { # --die repeatable # }
  2. --exit
Comment by Rasmus Johansson (Inactive) [ 2011-12-13 ]

Launchpad bug id: 663818

Generated at Thu Feb 08 06:45:37 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.