From 65af83f642374c9d9476a125af30f723f7684e2e Mon Sep 17 00:00:00 2001 From: Neeraj Bisht Date: Tue, 15 Jan 2013 14:24:35 +0530 Subject: [PATCH] Bug#11758009 - UNION EXECUTION ORDER WRONG ? Problem:- In case of blob data field, UNION ALL doesn't give correct result. Analysis:- In MyISAM table, when we dont want to check for the distinct for particular key, we set the key_map to zero. While writing record in MyISAM table, we check the distinct with the help of keys, by checking whether that key is active in key_map and then writing the record. In case of blob field, we are checking for distinct by unique constraint, where we are not checking whether that unique key is active or not in key_map. Solution:- Before checking for distinct, check whether any key is active in key_map. storage/myisam/mi_write.c: check whether key_map is active before checking distinct. --- storage/myisam/mi_write.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c index 81262c229ce..1bcf1b28ecf 100644 --- a/storage/myisam/mi_write.c +++ b/storage/myisam/mi_write.c @@ -90,12 +90,15 @@ int mi_write(MI_INFO *info, uchar *record) goto err2; /* Calculate and check all unique constraints */ - for (i=0 ; i < share->state.header.uniques ; i++) + if (mi_is_any_key_active(share->state.key_map)) { - if (mi_check_unique(info,share->uniqueinfo+i,record, - mi_unique_hash(share->uniqueinfo+i,record), - HA_OFFSET_ERROR)) - goto err2; + for (i= 0 ; i < share->state.header.uniques ; i++) + { + if (mi_check_unique(info, share->uniqueinfo + i, record, + mi_unique_hash(share->uniqueinfo + i, record), + HA_OFFSET_ERROR)) + goto err2; + } } /* Write all keys to indextree */