summaryrefslogtreecommitdiff
path: root/sql/opt_range.cc
diff options
context:
space:
mode:
authorunknown <monty@mishka.local>2004-05-16 14:48:32 +0300
committerunknown <monty@mishka.local>2004-05-16 14:48:32 +0300
commit70f79563d9fa8ef3cdfef01b8eee95ea6e927147 (patch)
tree318557f2fbc33b547d96f62b2544f2e9f4174082 /sql/opt_range.cc
parentc2ce702b3bfff6faa25c6e2b145e41394d544d8d (diff)
downloadmariadb-git-70f79563d9fa8ef3cdfef01b8eee95ea6e927147.tar.gz
key_cmp -> key_cmp_if_same
New records_in_range() interface (similar to read_range()) Macros for faster bitmap handling Simplify read_range() code (#WL1786) New general key_cmp() function to compare keys heap/hp_hash.c: New records_in_range() interface include/heap.h: New records_in_range() interface include/my_base.h: Moved 'key_range' here so that all table handlers can use it include/my_bitmap.h: Make some bitmap functions inline for faster usage in one thread include/myisam.h: New records_in_range() interface include/myisammrg.h: New records_in_range() interface myisam/mi_range.c: New records_in_range() interface myisam/mi_test2.c: New records_in_range() interface myisam/rt_test.c: New records_in_range() interface Indentation fixes myisam/sp_test.c: New records_in_range() interface Indentation fixes myisammrg/myrg_range.c: New records_in_range() interface mysys/my_bitmap.c: Make some bitmap functions inline for faster usage in one thread sql/examples/ha_example.cc: New records_in_range() interface sql/field.cc: Fixed indentation sql/ha_berkeley.cc: New records_in_range() interface sql/ha_berkeley.h: New records_in_range() interface sql/ha_heap.cc: New records_in_range() interface sql/ha_heap.h: New records_in_range() interface sql/ha_innodb.cc: New records_in_range() interface sql/ha_innodb.h: New records_in_range() interface sql/ha_isam.cc: New records_in_range() interface sql/ha_isam.h: New records_in_range() interface sql/ha_myisam.cc: New records_in_range() interface sql/ha_myisam.h: New records_in_range() interface sql/ha_myisammrg.cc: New records_in_range() interface sql/ha_myisammrg.h: New records_in_range() interface sql/ha_ndbcluster.cc: New records_in_range() interface sql/ha_ndbcluster.h: New records_in_range() interface sql/handler.cc: Simplify read_range() interface: - Add 'eq_range' to read_range_first - Remove 'eq_range' parameer from read_range_next() - Trust values from index_next_same() - Simplfy compare_key() by moving key_comparision to key.cc (as this code can be reused from other places) sql/handler.h: Move key_range to my_base.h to be used by external table handlers Simplify read_range() interface New records_in_range() interface sql/key.cc: Rename key_cmp() to key_cmp_if_same() to make it more descriptive Add new key_cmp() function usable from range and handler code. sql/mysql_priv.h: Prototypes for new functions sql/opt_range.cc: New records_in_range() interface Simplify cmp_prev() (We can in 5.0 simplify cmp_next() the same way) sql/opt_range.h: Added key_part_info to QUICK_SELECT to be able to use key_cmp() in get_next() sql/opt_sum.cc: key_cmp -> key_cmp_if_same sql/sql_acl.cc: key_cmp -> key_cmp_if_same sql/sql_select.cc: key_cmp -> key_cmp_if_same
Diffstat (limited to 'sql/opt_range.cc')
-rw-r--r--sql/opt_range.cc81
1 files changed, 31 insertions, 50 deletions
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 1e7bf90738c..3cc64c35223 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1800,8 +1800,8 @@ SEL_ARG *
SEL_ARG::insert(SEL_ARG *key)
{
SEL_ARG *element,**par,*last_element;
-
LINT_INIT(par); LINT_INIT(last_element);
+
for (element= this; element != &null_element ; )
{
last_element=element;
@@ -2296,26 +2296,32 @@ check_quick_keys(PARAM *param,uint idx,SEL_ARG *key_tree,
{
if (tmp_min_flag & GEOM_FLAG)
{
- tmp= param->table->file->
- records_in_range((int) keynr, (byte*)(param->min_key),
- min_key_length,
- (ha_rkey_function)(tmp_min_flag ^ GEOM_FLAG),
- (byte *)NullS, 0, HA_READ_KEY_EXACT);
+ key_range min_range;
+ min_range.key= (byte*) param->min_key;
+ min_range.length= min_key_length;
+ /* In this case tmp_min_flag contains the handler-read-function */
+ min_range.flag= (ha_rkey_function) (tmp_min_flag ^ GEOM_FLAG);
+
+ tmp= param->table->file->records_in_range(keynr, &min_range,
+ (key_range*) 0);
}
else
{
- tmp=param->table->file->
- records_in_range((int) keynr,
- (byte*) (!min_key_length ? NullS :
- param->min_key),
- min_key_length,
- tmp_min_flag & NEAR_MIN ?
- HA_READ_AFTER_KEY : HA_READ_KEY_EXACT,
- (byte*) (!max_key_length ? NullS :
- param->max_key),
- max_key_length,
- (tmp_max_flag & NEAR_MAX ?
- HA_READ_BEFORE_KEY : HA_READ_AFTER_KEY));
+ key_range min_range, max_range;
+
+ min_range.key= (byte*) param->min_key;
+ min_range.length= min_key_length;
+ min_range.flag= (tmp_min_flag & NEAR_MIN ? HA_READ_AFTER_KEY :
+ HA_READ_KEY_EXACT);
+ max_range.key= param->max_key;
+ max_range.length= max_key_length;
+ max_range.flag= (tmp_max_flag & NEAR_MAX ?
+ HA_READ_BEFORE_KEY : HA_READ_AFTER_KEY);
+ tmp=param->table->file->records_in_range(keynr,
+ (min_key_length ? &min_range :
+ (key_range*) 0),
+ (max_key_length ? &max_range :
+ (key_range*) 0));
}
}
end:
@@ -2604,7 +2610,7 @@ int QUICK_SELECT::get_next()
if (range)
{
// Already read through key
- result= file->read_range_next(test(range->flag & EQ_RANGE));
+ result= file->read_range_next();
if (result != HA_ERR_END_OF_FILE)
DBUG_RETURN(result);
}
@@ -2628,6 +2634,7 @@ int QUICK_SELECT::get_next()
result= file->read_range_first(range->min_length ? &start_key : 0,
range->max_length ? &end_key : 0,
+ test(range->flag & EQ_RANGE),
sorted);
if (range->flag == (UNIQUE_RANGE | EQ_RANGE))
range=0; // Stop searching
@@ -2815,40 +2822,14 @@ int QUICK_SELECT_DESC::get_next()
int QUICK_SELECT_DESC::cmp_prev(QUICK_RANGE *range_arg)
{
+ int cmp;
if (range_arg->flag & NO_MIN_RANGE)
return 0; /* key can't be to small */
- KEY_PART *key_part = key_parts;
- uint store_length;
-
- for (char *key = range_arg->min_key, *end = key + range_arg->min_length;
- key < end;
- key += store_length, key_part++)
- {
- int cmp;
- store_length= key_part->store_length;
- if (key_part->null_bit)
- {
- // this key part allows null values; NULL is lower than everything else
- if (*key)
- {
- // the range is expecting a null value
- if (!key_part->field->is_null())
- return 0; // not null -- still inside the range
- continue; // null -- exact match, go to next key part
- }
- else if (key_part->field->is_null())
- return 1; // null -- outside the range
- key++;
- store_length--;
- }
- if ((cmp = key_part->field->key_cmp((byte*) key,
- key_part->length)) > 0)
- return 0;
- if (cmp < 0)
- return 1;
- }
- return (range_arg->flag & NEAR_MIN) ? 1 : 0; // Exact match
+ cmp= key_cmp(key_part_info, range_arg->min_key, range_arg->min_length);
+ if (cmp > 0 || cmp == 0 && !(range_arg->flag & NEAR_MIN))
+ return 0;
+ return 1; // outside of range
}