mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Bug#17588348: INDEX MERGE USED ON PARTITIONED TABLE
CAN RETURN WRONG RESULT SET PROBLEM ------- In ha_partition::cmp_ref() we were only calling the underlying cmp_ref() of storage engine if the records are in the same partiton,else we sort by partition and returns the result.But the index merge intersect algorithm expects first to sort by row-id first and then by partition id. FIX --- Compare the refernces first using storage engine cmp_ref and then if references are equal(only happens if non clustered index is used) then sort it by partition id. [Approved by Mattiasj #rb3755] -
This commit is contained in:
parent
175085e7d2
commit
097a5b59ed
1 changed files with 17 additions and 7 deletions
|
@ -7485,19 +7485,29 @@ uint ha_partition::min_record_length(uint options) const
|
|||
|
||||
int ha_partition::cmp_ref(const uchar *ref1, const uchar *ref2)
|
||||
{
|
||||
uint part_id;
|
||||
int cmp;
|
||||
my_ptrdiff_t diff1, diff2;
|
||||
handler *file;
|
||||
DBUG_ENTER("ha_partition::cmp_ref");
|
||||
|
||||
cmp = m_file[0]->cmp_ref((ref1 + PARTITION_BYTES_IN_POS),
|
||||
(ref2 + PARTITION_BYTES_IN_POS));
|
||||
if (cmp)
|
||||
DBUG_RETURN(cmp);
|
||||
|
||||
if ((ref1[0] == ref2[0]) && (ref1[1] == ref2[1]))
|
||||
{
|
||||
part_id= uint2korr(ref1);
|
||||
file= m_file[part_id];
|
||||
DBUG_ASSERT(part_id < m_tot_parts);
|
||||
DBUG_RETURN(file->cmp_ref((ref1 + PARTITION_BYTES_IN_POS),
|
||||
(ref2 + PARTITION_BYTES_IN_POS)));
|
||||
/* This means that the references are same and are in same partition.*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/*
|
||||
In Innodb we compare with either primary key value or global DB_ROW_ID so
|
||||
it is not possible that the two references are equal and are in different
|
||||
partitions, but in myisam it is possible since we are comparing offsets.
|
||||
Remove this assert if DB_ROW_ID is changed to be per partition.
|
||||
*/
|
||||
DBUG_ASSERT(!m_innodb);
|
||||
|
||||
diff1= ref2[1] - ref1[1];
|
||||
diff2= ref2[0] - ref1[0];
|
||||
if (diff1 > 0)
|
||||
|
|
Loading…
Reference in a new issue