Commit 157b3667 authored by unknown's avatar unknown
Browse files

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()
parent 5861dc5b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
+24 −0
Original line number Diff line number Diff line
@@ -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;
+8 −4
Original line number Diff line number Diff line
@@ -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);
}

+2 −2
Original line number Diff line number Diff line
@@ -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,