198 uint8_t min_flag,max_flag,maybe_flag;
214 unsigned char *min_value,*max_value;
223 enum leaf_color { BLACK,RED } color;
224 enum Type { IMPOSSIBLE, MAYBE, MAYBE_KEY, KEY_RANGE } type;
235 SEL_ARG(
Field *,
const unsigned char *,
const unsigned char *);
239 unsigned char *min_value,
240 unsigned char *max_value,
262 inline bool is_same(
SEL_ARG *arg)
264 if (type != arg->type || part != arg->part)
266 if (type != KEY_RANGE)
268 return (cmp_min_to_min(arg) == 0 && cmp_max_to_max(arg) == 0);
271 inline void merge_flags(
SEL_ARG *arg)
273 maybe_flag|= arg->maybe_flag;
276 inline void maybe_smaller()
282 inline bool is_null_interval()
284 return (maybe_null && max_value[0] == 1);
287 inline int cmp_min_to_min(
SEL_ARG *arg)
289 return sel_cmp(field,min_value, arg->min_value, min_flag, arg->min_flag);
292 inline int cmp_min_to_max(
SEL_ARG *arg)
294 return sel_cmp(field,min_value, arg->max_value, min_flag, arg->max_flag);
297 inline int cmp_max_to_max(
SEL_ARG *arg)
299 return sel_cmp(field,max_value, arg->max_value, max_flag, arg->max_flag);
302 inline int cmp_max_to_min(
SEL_ARG *arg)
304 return sel_cmp(field,max_value, arg->min_value, max_flag, arg->min_flag);
319 void copy_min_to_min(
SEL_ARG *arg);
321 void copy_min_to_max(
SEL_ARG *arg);
323 void copy_max_to_min(
SEL_ARG *arg);
326 int store_min(uint32_t length,
unsigned char **min_key, uint32_t min_key_flag);
329 int store_max(uint32_t length,
unsigned char **max_key, uint32_t max_key_flag);
332 int store_min_key(
KEY_PART *key,
unsigned char **range_key, uint32_t *range_key_flag);
335 int store_max_key(
KEY_PART *key,
unsigned char **range_key, uint32_t *range_key_flag);
350 inline bool simple_key()
352 return (! next_key_part && elements == 1);
355 void increment_use_count(
long count)
359 next_key_part->use_count+= count;
360 count*= (next_key_part->use_count - count);
361 for (
SEL_ARG *pos= next_key_part->first(); pos; pos= pos->next)
362 if (pos->next_key_part)
363 pos->increment_use_count(count);
369 for (
SEL_ARG *pos= first(); pos; pos= pos->next)
370 if (pos->next_key_part)
372 pos->next_key_part->use_count--;
373 pos->next_key_part->free_tree();
379 return parent->left ==
this ? &parent->left : &parent->right;
399 bool is_singlepoint()
405 if (min_flag || max_flag)
407 unsigned char *min_val= min_value;
408 unsigned char *max_val= max_value;
413 if (*min_val != *max_val)
421 return ! field->key_cmp(min_val, max_val);
432 int sel_cmp(
Field *in_field,
440 if (a_flag & (NO_MIN_RANGE | NO_MAX_RANGE))
442 if ((a_flag & (NO_MIN_RANGE | NO_MAX_RANGE)) ==
443 (b_flag & (NO_MIN_RANGE | NO_MAX_RANGE)))
445 return (a_flag & NO_MIN_RANGE) ? -1 : 1;
447 if (b_flag & (NO_MIN_RANGE | NO_MAX_RANGE))
448 return (b_flag & NO_MIN_RANGE) ? 1 : -1;
450 if (in_field->real_maybe_null())
460 cmp= in_field->key_cmp(a , b);
461 if (cmp)
return cmp < 0 ? -1 : 1;
465 if (a_flag & (NEAR_MIN | NEAR_MAX))
467 if ((a_flag & (NEAR_MIN | NEAR_MAX)) == (b_flag & (NEAR_MIN | NEAR_MAX)))
469 if (! (b_flag & (NEAR_MIN | NEAR_MAX)))
470 return (a_flag & NEAR_MIN) ? 2 : -2;
471 return (a_flag & NEAR_MIN) ? 1 : -1;
473 if (b_flag & (NEAR_MIN | NEAR_MAX))
474 return (b_flag & NEAR_MIN) ? -2 : 2;