mirror of
https://github.com/MariaDB/server.git
synced 2026-05-03 13:45:34 +02:00
Bug #20909518: HANDLE_FATAL_SIGNAL (SIG=11) IN
FIND_USED_PARTITIONS | SQL/OPT_RANGE.CC:3884 Issue: ----- During partition pruning, first we identify the partition in which row can reside and then identify the subpartition. If we find a partition but not the subpartion then we hit a debug assert. While finding the subpartition we check the current thread's error status in part_val_int() function after some operation. In this case the thread's error status is already set to an error (multiple rows returned) so the function returns no partition found and results in incorrect behavior. SOLUTION: --------- Currently any error encountered in part_val_int is considered a "partition not found" type error. Instead of an assert, a check needs to be done and a valid error returned.
This commit is contained in:
parent
641ab6f368
commit
8006ad8053
1 changed files with 13 additions and 3 deletions
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -3088,6 +3088,7 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree)
|
|||
int partno= (int)key_tree->part;
|
||||
bool pushed= FALSE;
|
||||
bool set_full_part_if_bad_ret= FALSE;
|
||||
RANGE_OPT_PARAM *range_par= &(ppar->range_param);
|
||||
|
||||
if (key_tree->left != &null_element)
|
||||
{
|
||||
|
|
@ -3142,10 +3143,19 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree)
|
|||
key_tree->max_value,
|
||||
key_tree->min_flag | key_tree->max_flag,
|
||||
&subpart_iter);
|
||||
DBUG_ASSERT(res); /* We can't get "no satisfying subpartitions" */
|
||||
if (res == 0)
|
||||
{
|
||||
/*
|
||||
The only case where we can get "no satisfying subpartitions"
|
||||
returned from the above call is when an error has occurred.
|
||||
*/
|
||||
DBUG_ASSERT(range_par->thd->is_error());
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (res == -1)
|
||||
return -1; /* all subpartitions satisfy */
|
||||
|
||||
|
||||
uint32 subpart_id;
|
||||
bitmap_clear_all(&ppar->subparts_bitmap);
|
||||
while ((subpart_id= subpart_iter.get_next(&subpart_iter)) !=
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue