Commit 4fcc5a7f authored by unknown's avatar unknown

fixed error handling in SET and DO operators (BUG#1484)


mysql-test/r/subselect.result:
  test for BUG#1484
mysql-test/t/subselect.test:
  layout fix
  test for BUG#1484
sql/set_var.cc:
  value evaluating can fail (because of subqueries for example) => we should check result of operartion and prevent assigning incorrect value
sql/sql_do.cc:
  DO should ignore all errors
parent a9d38863
...@@ -1439,3 +1439,10 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1439,3 +1439,10 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where 1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort 2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
drop table if exists t2, t3; drop table if exists t2, t3;
create table t1 (s1 int);
insert into t1 values (1);
insert into t1 values (2);
set sort_buffer_size = (select s1 from t1);
ERROR 21000: Subquery returns more than 1 row
do (select * from t1);
drop table t1;
...@@ -951,6 +951,7 @@ select s1, s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2') from t1; ...@@ -951,6 +951,7 @@ select s1, s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2') from t1;
explain select s1, s1 NOT IN (SELECT s1 FROM t2) from t1; explain select s1, s1 NOT IN (SELECT s1 FROM t2) from t1;
explain select s1, s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2') from t1; explain select s1, s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2') from t1;
drop table t1,t2; drop table t1,t2;
# #
# correct ALL optimisation # correct ALL optimisation
# #
...@@ -960,8 +961,21 @@ insert into t3 values (6),(7),(3); ...@@ -960,8 +961,21 @@ insert into t3 values (6),(7),(3);
select * from t3 where a >= all (select b from t2); select * from t3 where a >= all (select b from t2);
explain select * from t3 where a >= all (select b from t2); explain select * from t3 where a >= all (select b from t2);
#
# optimized static ALL/ANY with grouping # optimized static ALL/ANY with grouping
#
insert into t2 values (2,2), (2,1), (3,3), (3,1); insert into t2 values (2,2), (2,1), (3,3), (3,1);
select * from t3 where a > all (select max(b) from t2 group by a); select * from t3 where a > all (select max(b) from t2 group by a);
explain select * from t3 where a > all (select max(b) from t2 group by a); explain select * from t3 where a > all (select max(b) from t2 group by a);
drop table if exists t2, t3; drop table if exists t2, t3;
#
# DO and SET with errors
#
create table t1 (s1 int);
insert into t1 values (1);
insert into t1 values (2);
-- error 1241
set sort_buffer_size = (select s1 from t1);
do (select * from t1);
drop table t1;
...@@ -859,6 +859,8 @@ void fix_max_relay_log_size(THD *thd, enum_var_type type) ...@@ -859,6 +859,8 @@ void fix_max_relay_log_size(THD *thd, enum_var_type type)
bool sys_var_long_ptr::update(THD *thd, set_var *var) bool sys_var_long_ptr::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
if (option_limits) if (option_limits)
*value= (ulong) getopt_ull_limit_value(tmp, option_limits); *value= (ulong) getopt_ull_limit_value(tmp, option_limits);
...@@ -878,6 +880,8 @@ void sys_var_long_ptr::set_default(THD *thd, enum_var_type type) ...@@ -878,6 +880,8 @@ void sys_var_long_ptr::set_default(THD *thd, enum_var_type type)
bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var) bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
if (option_limits) if (option_limits)
*value= (ulonglong) getopt_ull_limit_value(tmp, option_limits); *value= (ulonglong) getopt_ull_limit_value(tmp, option_limits);
...@@ -925,6 +929,8 @@ byte *sys_var_enum::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base) ...@@ -925,6 +929,8 @@ byte *sys_var_enum::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
bool sys_var_thd_ulong::update(THD *thd, set_var *var) bool sys_var_thd_ulong::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
/* Don't use bigger value than given with --maximum-variable-name=.. */ /* Don't use bigger value than given with --maximum-variable-name=.. */
if ((ulong) tmp > max_system_variables.*offset) if ((ulong) tmp > max_system_variables.*offset)
...@@ -964,6 +970,8 @@ byte *sys_var_thd_ulong::value_ptr(THD *thd, enum_var_type type, ...@@ -964,6 +970,8 @@ byte *sys_var_thd_ulong::value_ptr(THD *thd, enum_var_type type,
bool sys_var_thd_ha_rows::update(THD *thd, set_var *var) bool sys_var_thd_ha_rows::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
/* Don't use bigger value than given with --maximum-variable-name=.. */ /* Don't use bigger value than given with --maximum-variable-name=.. */
if ((ha_rows) tmp > max_system_variables.*offset) if ((ha_rows) tmp > max_system_variables.*offset)
...@@ -1010,6 +1018,8 @@ byte *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type, ...@@ -1010,6 +1018,8 @@ byte *sys_var_thd_ha_rows::value_ptr(THD *thd, enum_var_type type,
bool sys_var_thd_ulonglong::update(THD *thd, set_var *var) bool sys_var_thd_ulonglong::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
if ((ulonglong) tmp > max_system_variables.*offset) if ((ulonglong) tmp > max_system_variables.*offset)
tmp= max_system_variables.*offset; tmp= max_system_variables.*offset;
...@@ -1581,6 +1591,9 @@ void sys_var_collation_server::set_default(THD *thd, enum_var_type type) ...@@ -1581,6 +1591,9 @@ void sys_var_collation_server::set_default(THD *thd, enum_var_type type)
bool sys_var_key_buffer_size::update(THD *thd, set_var *var) bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
{ {
ulonglong tmp= var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
NAMED_LIST *list; NAMED_LIST *list;
LEX_STRING *base_name= &var->base; LEX_STRING *base_name= &var->base;
...@@ -1676,7 +1689,11 @@ int set_var_collation_client::update(THD *thd) ...@@ -1676,7 +1689,11 @@ int set_var_collation_client::update(THD *thd)
bool sys_var_timestamp::update(THD *thd, set_var *var) bool sys_var_timestamp::update(THD *thd, set_var *var)
{ {
thd->set_time((time_t) var->value->val_int()); time_t tmp= (time_t) var->value->val_int();
if (thd->net.report_error)
return 1;
thd->set_time(tmp);
return 0; return 0;
} }
...@@ -1697,7 +1714,11 @@ byte *sys_var_timestamp::value_ptr(THD *thd, enum_var_type type, ...@@ -1697,7 +1714,11 @@ byte *sys_var_timestamp::value_ptr(THD *thd, enum_var_type type,
bool sys_var_last_insert_id::update(THD *thd, set_var *var) bool sys_var_last_insert_id::update(THD *thd, set_var *var)
{ {
thd->insert_id(var->value->val_int()); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
thd->insert_id(tmp);
return 0; return 0;
} }
...@@ -1712,7 +1733,11 @@ byte *sys_var_last_insert_id::value_ptr(THD *thd, enum_var_type type, ...@@ -1712,7 +1733,11 @@ byte *sys_var_last_insert_id::value_ptr(THD *thd, enum_var_type type,
bool sys_var_insert_id::update(THD *thd, set_var *var) bool sys_var_insert_id::update(THD *thd, set_var *var)
{ {
thd->next_insert_id=var->value->val_int(); ulonglong tmp= var->value->val_int();
if (thd->net.report_error)
return 1;
thd->next_insert_id= tmp;
return 0; return 0;
} }
...@@ -1779,13 +1804,21 @@ bool sys_var_slave_skip_counter::update(THD *thd, set_var *var) ...@@ -1779,13 +1804,21 @@ bool sys_var_slave_skip_counter::update(THD *thd, set_var *var)
bool sys_var_rand_seed1::update(THD *thd, set_var *var) bool sys_var_rand_seed1::update(THD *thd, set_var *var)
{ {
thd->rand.seed1= (ulong) var->value->val_int(); ulong tmp= (ulong) var->value->val_int();
if (thd->net.report_error)
return 1;
thd->rand.seed1= tmp;
return 0; return 0;
} }
bool sys_var_rand_seed2::update(THD *thd, set_var *var) bool sys_var_rand_seed2::update(THD *thd, set_var *var)
{ {
thd->rand.seed2= (ulong) var->value->val_int(); ulong tmp= (ulong) var->value->val_int();
if (thd->net.report_error)
return 1;
thd->rand.seed2= tmp;
return 0; return 0;
} }
......
...@@ -29,6 +29,7 @@ int mysql_do(THD *thd, List<Item> &values) ...@@ -29,6 +29,7 @@ int mysql_do(THD *thd, List<Item> &values)
DBUG_RETURN(-1); DBUG_RETURN(-1);
while ((value = li++)) while ((value = li++))
value->val_int(); value->val_int();
thd->clear_error(); // DO always is OK
send_ok(thd); send_ok(thd);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment