mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Fixed an unlikely optimizer bug that casued a core dump in pt_range.cc::sel_cmp()
mysql-test/r/join.result: Test of range optimizer bug mysql-test/t/join.test: Test of range optimizer bug sql/sql_rename.cc: Added missing DEBUG_PRINT()
This commit is contained in:
parent
5861dc5b8b
commit
157b36675e
4 changed files with 38 additions and 6 deletions
|
@ -37,3 +37,7 @@ COUNT(t1.Title)
|
|||
t1_id t2_id type cost_unit min_value max_value t3_id item_id id name
|
||||
22 1 Percent Cost 100 -1 6 291 1 s1
|
||||
23 1 Percent Cost 100 -1 21 291 1 s1
|
||||
rate_code base_rate
|
||||
cust 20
|
||||
rate_code base_rate
|
||||
cust 20
|
||||
|
|
|
@ -219,3 +219,27 @@ CREATE TABLE t2 (
|
|||
INSERT INTO t2 VALUES (1,'s1'),(2,'s2'),(3,'s3'),(4,'s4'),(5,'s5');
|
||||
select t1.*, t2.* from t1, t2 where t2.id=t1.t2_id limit 2;
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Bug in range optimiser with MAYBE_KEY
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
siteid varchar(25) NOT NULL default '',
|
||||
emp_id varchar(30) NOT NULL default '',
|
||||
rate_code varchar(10) default NULL,
|
||||
UNIQUE KEY site_emp (siteid,emp_id),
|
||||
KEY siteid (siteid)
|
||||
) TYPE=MyISAM;
|
||||
INSERT INTO t1 VALUES ('rivercats','psmith','cust'), ('rivercats','KWalker','cust');
|
||||
CREATE TABLE t2 (
|
||||
siteid varchar(25) NOT NULL default '',
|
||||
rate_code varchar(10) NOT NULL default '',
|
||||
base_rate float NOT NULL default '0',
|
||||
PRIMARY KEY (siteid,rate_code),
|
||||
FULLTEXT KEY rate_code (rate_code)
|
||||
) TYPE=MyISAM;
|
||||
INSERT INTO t2 VALUES ('rivercats','cust',20);
|
||||
SELECT emp.rate_code, lr.base_rate FROM t1 AS emp LEFT JOIN t2 AS lr USING (siteid, rate_code) WHERE emp.emp_id = 'psmith' AND lr.siteid = 'rivercats';
|
||||
SELECT emp.rate_code, lr.base_rate FROM t1 AS emp LEFT JOIN t2 AS lr USING (siteid, rate_code) WHERE lr.siteid = 'rivercats' AND emp.emp_id = 'psmith';
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -1341,7 +1341,8 @@ key_and(SEL_ARG *key1,SEL_ARG *key2,uint clone_flag)
|
|||
}
|
||||
|
||||
if (((clone_flag & CLONE_KEY2_MAYBE) &&
|
||||
!(clone_flag & CLONE_KEY1_MAYBE)) ||
|
||||
!(clone_flag & CLONE_KEY1_MAYBE) &&
|
||||
key2->type != SEL_ARG::MAYBE_KEY) ||
|
||||
key1->type == SEL_ARG::MAYBE_KEY)
|
||||
{ // Put simple key in key2
|
||||
swap(SEL_ARG *,key1,key2);
|
||||
|
@ -1369,7 +1370,10 @@ key_and(SEL_ARG *key1,SEL_ARG *key2,uint clone_flag)
|
|||
{
|
||||
key1->maybe_smaller();
|
||||
if (key2->next_key_part)
|
||||
{
|
||||
key1->use_count--; // Incremented in and_all_keys
|
||||
return and_all_keys(key1,key2,clone_flag);
|
||||
}
|
||||
key2->use_count--; // Key2 doesn't have a tree
|
||||
}
|
||||
return key1;
|
||||
|
@ -2068,7 +2072,7 @@ void SEL_ARG::test_use_count(SEL_ARG *root)
|
|||
{
|
||||
if (this == root && use_count != 1)
|
||||
{
|
||||
sql_print_error("Use_count: Wrong count %lu for root",use_count);
|
||||
sql_print_error("Note: Use_count: Wrong count %lu for root",use_count);
|
||||
return;
|
||||
}
|
||||
if (this->type != SEL_ARG::KEY_RANGE)
|
||||
|
@ -2082,7 +2086,7 @@ void SEL_ARG::test_use_count(SEL_ARG *root)
|
|||
ulong count=count_key_part_usage(root,pos->next_key_part);
|
||||
if (count > pos->next_key_part->use_count)
|
||||
{
|
||||
sql_print_error("Use_count: Wrong count for key at %lx, %lu should be %lu",
|
||||
sql_print_error("Note: Use_count: Wrong count for key at %lx, %lu should be %lu",
|
||||
pos,pos->next_key_part->use_count,count);
|
||||
return;
|
||||
}
|
||||
|
@ -2090,7 +2094,7 @@ void SEL_ARG::test_use_count(SEL_ARG *root)
|
|||
}
|
||||
}
|
||||
if (e_count != elements)
|
||||
sql_print_error("Wrong use count: %u for tree at %lx", e_count,
|
||||
sql_print_error("Warning: Wrong use count: %u for tree at %lx", e_count,
|
||||
(gptr) this);
|
||||
}
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error)
|
|||
if (!access(name,F_OK))
|
||||
{
|
||||
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),name);
|
||||
return ren_table; // This can't be skipped
|
||||
DBUG_RETURN(ren_table); // This can't be skipped
|
||||
}
|
||||
sprintf(name,"%s/%s/%s%s",mysql_data_home,
|
||||
ren_table->db,ren_table->real_name,
|
||||
|
@ -131,7 +131,7 @@ rename_tables(THD *thd, TABLE_LIST *table_list, bool skip_error)
|
|||
{
|
||||
my_error(ER_FILE_NOT_FOUND, MYF(0), name, my_errno);
|
||||
if (!skip_error)
|
||||
return ren_table;
|
||||
DBUG_RETURN(ren_table);
|
||||
}
|
||||
else if (mysql_rename_table(table_type,
|
||||
ren_table->db, ren_table->real_name,
|
||||
|
|
Loading…
Reference in a new issue