36
36
#include " sql_class.h" // set_var.h: THD
37
37
#include " set_var.h" /* Item */
38
38
39
- class Item_sum ;
40
39
class JOIN ;
41
- class Unique ;
40
+ class Item_sum ;
42
41
43
42
struct KEY_PART {
44
43
uint16 key,part;
@@ -390,7 +389,30 @@ class SEL_ARG :public Sql_alloc
390
389
{
391
390
return sel_cmp (field,max_value, arg->min_value , max_flag, arg->min_flag );
392
391
}
393
- SEL_ARG *clone_and (THD *thd, SEL_ARG* arg);
392
+ SEL_ARG *clone_and (THD *thd, SEL_ARG* arg)
393
+ { // Get overlapping range
394
+ uchar *new_min,*new_max;
395
+ uint8 flag_min,flag_max;
396
+ if (cmp_min_to_min (arg) >= 0 )
397
+ {
398
+ new_min=min_value; flag_min=min_flag;
399
+ }
400
+ else
401
+ {
402
+ new_min=arg->min_value ; flag_min=arg->min_flag ; /* purecov: deadcode */
403
+ }
404
+ if (cmp_max_to_max (arg) <= 0 )
405
+ {
406
+ new_max=max_value; flag_max=max_flag;
407
+ }
408
+ else
409
+ {
410
+ new_max=arg->max_value ; flag_max=arg->max_flag ;
411
+ }
412
+ return new (thd->mem_root ) SEL_ARG (field, part, new_min, new_max, flag_min,
413
+ flag_max,
414
+ MY_TEST (maybe_flag && arg->maybe_flag ));
415
+ }
394
416
SEL_ARG *clone_first (SEL_ARG *arg)
395
417
{ // min <= X < arg->min
396
418
return new SEL_ARG (field,part, min_value, arg->min_value ,
@@ -711,7 +733,14 @@ class RANGE_OPT_PARAM
711
733
bool force_default_mrr;
712
734
KEY_PART *key[MAX_KEY]; /* First key parts of keys used in the query */
713
735
714
- bool statement_should_be_aborted () const ;
736
+ bool statement_should_be_aborted () const
737
+ {
738
+ return
739
+ thd->killed ||
740
+ thd->is_fatal_error ||
741
+ thd->is_error () ||
742
+ alloced_sel_args > SEL_ARG::MAX_SEL_ARGS;
743
+ }
715
744
};
716
745
717
746
@@ -734,9 +763,21 @@ class QUICK_RANGE :public Sql_alloc {
734
763
QUICK_RANGE (); /* Full range */
735
764
QUICK_RANGE (THD *thd, const uchar *min_key_arg, uint min_length_arg,
736
765
key_part_map min_keypart_map_arg,
737
- const uchar *max_key_arg, uint max_length_arg,
766
+ const uchar *max_key_arg, uint max_length_arg,
738
767
key_part_map max_keypart_map_arg,
739
- uint flag_arg);
768
+ uint flag_arg)
769
+ : min_key((uchar*) thd->memdup (min_key_arg, min_length_arg + 1 )),
770
+ max_key((uchar*) thd->memdup(max_key_arg, max_length_arg + 1 )),
771
+ min_length((uint16) min_length_arg),
772
+ max_length((uint16) max_length_arg),
773
+ flag((uint16) flag_arg),
774
+ min_keypart_map(min_keypart_map_arg),
775
+ max_keypart_map(max_keypart_map_arg)
776
+ {
777
+ #ifdef HAVE_valgrind
778
+ dummy=0 ;
779
+ #endif
780
+ }
740
781
741
782
/* *
742
783
Initalizes a key_range object for communication with storage engine.
@@ -1683,7 +1724,13 @@ class SQL_SELECT :public Sql_alloc {
1683
1724
-1 if error
1684
1725
1 otherwise
1685
1726
*/
1686
- int skip_record (THD *thd);
1727
+ inline int skip_record (THD *thd)
1728
+ {
1729
+ int rc= MY_TEST (!cond || cond->val_int ());
1730
+ if (thd->is_error ())
1731
+ rc= -1 ;
1732
+ return rc;
1733
+ }
1687
1734
int test_quick_select (THD *thd, key_map keys, table_map prev_tables,
1688
1735
ha_rows limit, bool force_quick_range,
1689
1736
bool ordered_output, bool remove_false_parts_of_where,
0 commit comments