mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
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
This commit is contained in:
commit
5fd2a35032
5 changed files with 61 additions and 7 deletions
|
@ -821,6 +821,30 @@ SELECT MAX(id) FROM t1 WHERE id < 3 AND a=2 AND b=6;
|
|||
MAX(id)
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id int PRIMARY KEY, b char(3), INDEX(b));
|
||||
INSERT INTO t1 VALUES (1,'xx'), (2,'aa');
|
||||
SELECT * FROM t1;
|
||||
id b
|
||||
1 xx
|
||||
2 aa
|
||||
SELECT MAX(b) FROM t1 WHERE b < 'ppppp';
|
||||
MAX(b)
|
||||
aa
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
SELECT MAX(b) FROM t1 WHERE b < 'pp';
|
||||
MAX(b)
|
||||
aa
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id int PRIMARY KEY, b char(16), INDEX(b(4)));
|
||||
INSERT INTO t1 VALUES (1, 'xxxxbbbb'), (2, 'xxxxaaaa');
|
||||
SELECT MAX(b) FROM t1;
|
||||
MAX(b)
|
||||
xxxxbbbb
|
||||
EXPLAIN SELECT MAX(b) FROM t1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
||||
DROP TABLE t1;
|
||||
create table t2 (ff double);
|
||||
insert into t2 values (2.2);
|
||||
select cast(sum(distinct ff) as decimal(5,2)) from t2;
|
||||
|
|
|
@ -539,6 +539,25 @@ INSERT INTO t1 VALUES
|
|||
SELECT MAX(id) FROM t1 WHERE id < 3 AND a=2 AND b=6;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #18206: min/max optimization cannot be applied to partial index
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (id int PRIMARY KEY, b char(3), INDEX(b));
|
||||
INSERT INTO t1 VALUES (1,'xx'), (2,'aa');
|
||||
SELECT * FROM t1;
|
||||
|
||||
SELECT MAX(b) FROM t1 WHERE b < 'ppppp';
|
||||
SHOW WARNINGS;
|
||||
SELECT MAX(b) FROM t1 WHERE b < 'pp';
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (id int PRIMARY KEY, b char(16), INDEX(b(4)));
|
||||
INSERT INTO t1 VALUES (1, 'xxxxbbbb'), (2, 'xxxxaaaa');
|
||||
SELECT MAX(b) FROM t1;
|
||||
EXPLAIN SELECT MAX(b) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
|
|
|
@ -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,
|
||||
|
@ -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;
|
||||
|
|
|
@ -4788,7 +4788,7 @@ get_store_key(THD *thd, KEYUSE *keyuse, table_map used_tables,
|
|||
*/
|
||||
|
||||
bool
|
||||
store_val_in_field(Field *field,Item *item)
|
||||
store_val_in_field(Field *field, Item *item, enum_check_fields check_flag)
|
||||
{
|
||||
bool error;
|
||||
THD *thd= field->table->in_use;
|
||||
|
@ -4799,7 +4799,7 @@ store_val_in_field(Field *field,Item *item)
|
|||
with select_insert, which make count_cuted_fields= 1
|
||||
*/
|
||||
enum_check_fields old_count_cuted_fields= thd->count_cuted_fields;
|
||||
thd->count_cuted_fields= CHECK_FIELD_WARN;
|
||||
thd->count_cuted_fields= check_flag;
|
||||
error= item->save_in_field(field, 1);
|
||||
thd->count_cuted_fields= old_count_cuted_fields;
|
||||
return error || cuted_fields != thd->cuted_fields;
|
||||
|
@ -10928,7 +10928,7 @@ static bool test_if_ref(Item_field *left_item,Item *right_item)
|
|||
field->real_type() != MYSQL_TYPE_VARCHAR &&
|
||||
(field->type() != FIELD_TYPE_FLOAT || field->decimals() == 0))
|
||||
{
|
||||
return !store_val_in_field(field,right_item);
|
||||
return !store_val_in_field(field, right_item, CHECK_FIELD_WARN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -404,7 +404,7 @@ extern const char *join_type_str[];
|
|||
void TEST_join(JOIN *join);
|
||||
|
||||
/* Extern functions in sql_select.cc */
|
||||
bool store_val_in_field(Field *field,Item *val);
|
||||
bool store_val_in_field(Field *field, Item *val, enum_check_fields check_flag);
|
||||
TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
||||
ORDER *group, bool distinct, bool save_sum_fields,
|
||||
ulonglong select_options, ha_rows rows_limit,
|
||||
|
|
Loading…
Reference in a new issue