diff options
author | Sergei Golubchik <sergii@pisem.net> | 2013-01-28 09:12:23 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2013-01-28 09:12:23 +0100 |
commit | 34e84c227f1cb76771eabf229b4cf1b5292eef25 (patch) | |
tree | e811e54db5452bbe05647d16fa4991c0332121d7 /sql | |
parent | 0791692bdc311f39181b9df236981a2cb439638e (diff) | |
parent | 5138bf4238d4a8850ee364a3adf10dc2687af67c (diff) | |
download | mariadb-git-34e84c227f1cb76771eabf229b4cf1b5292eef25.tar.gz |
5.2 merge
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_strfunc.cc | 20 | ||||
-rw-r--r-- | sql/opt_range.cc | 8 | ||||
-rw-r--r-- | sql/sql_insert.cc | 2 |
3 files changed, 20 insertions, 10 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index d0b284a363d..71526c433ed 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1167,7 +1167,7 @@ void Item_str_func::left_right_max_length() if (args[1]->const_item()) { int length=(int) args[1]->val_int()*collation.collation->mbmaxlen; - if (length <= 0) + if (args[1]->null_value || length <= 0) max_length=0; else set_if_smaller(max_length,(uint) length); @@ -1270,7 +1270,9 @@ void Item_func_substr::fix_length_and_dec() if (args[1]->const_item()) { int32 start= (int32) args[1]->val_int(); - if (start < 0) + if (args[1]->null_value) + max_length= 0; + else if (start < 0) max_length= ((uint)(-start) > max_length) ? 0 : (uint)(-start); else max_length-= min((uint)(start - 1), max_length); @@ -1278,7 +1280,7 @@ void Item_func_substr::fix_length_and_dec() if (arg_count == 3 && args[2]->const_item()) { int32 length= (int32) args[2]->val_int(); - if (length <= 0) + if (args[2]->null_value || length <= 0) max_length=0; /* purecov: inspected */ else set_if_smaller(max_length,(uint) length); @@ -2412,7 +2414,9 @@ void Item_func_repeat::fix_length_and_dec() /* Assumes that the maximum length of a String is < INT_MAX32. */ /* Set here so that rest of code sees out-of-bound value as such. */ - if (count > INT_MAX32) + if (args[1]->null_value) + count= 0; + else if (count > INT_MAX32) count= INT_MAX32; ulonglong max_result_length= (ulonglong) args[0]->max_length * count; @@ -2500,7 +2504,9 @@ void Item_func_rpad::fix_length_and_dec() /* Assumes that the maximum length of a String is < INT_MAX32. */ /* Set here so that rest of code sees out-of-bound value as such. */ - if (temp > INT_MAX32) + if (args[1]->null_value) + temp= 0; + else if (temp > INT_MAX32) temp = INT_MAX32; length= temp * collation.collation->mbmaxlen; @@ -2617,7 +2623,9 @@ void Item_func_lpad::fix_length_and_dec() /* Assumes that the maximum length of a String is < INT_MAX32. */ /* Set here so that rest of code sees out-of-bound value as such. */ - if (temp > INT_MAX32) + if (args[1]->null_value) + temp= 0; + else if (temp > INT_MAX32) temp= INT_MAX32; length= temp * collation.collation->mbmaxlen; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 3cad647ba1c..0d1aa83b5e6 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -13160,9 +13160,10 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_min() */ if (min_max_arg_part && min_max_arg_part->field->is_null()) { + uchar *tmp_key_buff= (uchar*)my_alloca(max_used_key_length); /* Find the first subsequent record without NULL in the MIN/MAX field. */ - key_copy(tmp_record, record, index_info, max_used_key_length); - result= file->ha_index_read_map(record, tmp_record, + key_copy(tmp_key_buff, record, index_info, max_used_key_length); + result= file->ha_index_read_map(record, tmp_key_buff, make_keypart_map(real_key_parts), HA_READ_AFTER_KEY); /* @@ -13178,10 +13179,11 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_min() if (!result) { if (key_cmp(index_info->key_part, group_prefix, real_prefix_len)) - key_restore(record, tmp_record, index_info, 0); + key_restore(record, tmp_key_buff, index_info, 0); } else if (result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) result= 0; /* There is a result in any case. */ + my_afree(tmp_key_buff); } } diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index bfd08e83ca2..7ab2ed8e1b6 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2129,7 +2129,7 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd) { my_ptrdiff_t adjust_ptrs; Field **field,**org_field, *found_next_number_field; - Field **vfield; + Field **UNINIT_VAR(vfield); TABLE *copy; TABLE_SHARE *share; uchar *bitmap; |