summaryrefslogtreecommitdiff
path: root/sql/opt_sum.cc
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2006-06-02 17:06:10 -0700
committerunknown <igor@rurik.mysql.com>2006-06-02 17:06:10 -0700
commit5fd2a3503203ac8263861f25fa80ac5f538b908d (patch)
tree15bc7fdfa17f8a8f8f09eda2d7b1452ec5985783 /sql/opt_sum.cc
parentcbbd0fdb2c14984e8abf5f9dc8ee8280eda367a9 (diff)
parentccad0572f5c7a20d909785732995984de9d76552 (diff)
downloadmariadb-git-5fd2a3503203ac8263861f25fa80ac5f538b908d.tar.gz
Merge rurik.mysql.com:/home/igor/mysql-4.1-opt
into rurik.mysql.com:/home/igor/mysql-5.0-opt sql/opt_sum.cc: Auto merged sql/sql_select.cc: Auto merged sql/sql_select.h: Auto merged mysql-test/r/func_group.result: SCCS merged mysql-test/t/func_group.test: SCCS merged
Diffstat (limited to 'sql/opt_sum.cc')
-rw-r--r--sql/opt_sum.cc17
1 files changed, 14 insertions, 3 deletions
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 373753a7b80..4a7ec0c5928 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -569,6 +569,10 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
break; // Found a part od the key for the field
}
+#if 0
+ if (part->length != (((Item_field*) args[0])->field)->field_length)
+ return 0;
+#endif
bool is_field_part= part == field_part;
if (!(is_field_part || eq_type))
return 0;
@@ -608,7 +612,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
}
else
{
- store_val_in_field(part->field, args[between && max_fl ? 2 : 1]);
+ store_val_in_field(part->field, args[between && max_fl ? 2 : 1],
+ CHECK_FIELD_IGNORE);
if (part->null_bit)
*key_ptr++= (byte) test(part->field->is_null());
part->field->get_key_image((char*) key_ptr, part->length, Field::itRAW);
@@ -663,6 +668,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
field BETWEEN const1 AND const2
3. all references to the columns from the same table as column field
occur only in conjucts mentioned above.
+ 4. each of k first components the index is not partial, i.e. is not
+ defined on a fixed length proper prefix of the field.
If such an index exists the function through the ref parameter
returns the key value to find max/min for the field using the index,
@@ -672,8 +679,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
of the whole search key)
NOTE
- This function may set table->key_read to 1, which must be reset after
- index is used! (This can only happen when function returns 1)
+ This function may set table->key_read to 1, which must be reset after
+ index is used! (This can only happen when function returns 1)
RETURN
0 Index can not be used to optimize MIN(field)/MAX(field)
@@ -707,6 +714,10 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
if (!(table->file->index_flags(idx, jdx, 0) & HA_READ_ORDER))
return 0;
+ /* Check whether the index component is partial */
+ if (part->length < table->field[part->fieldnr-1]->pack_length())
+ break;
+
if (field->eq(part->field))
{
ref->key= idx;