Adding Item_func_pad as a common parent for Item_func_lpad and Item_func_rpad
Removing duplication: - fix_length_and_dec() - tmp_value - lpad_str, rpad_str -> pad_str
This commit is contained in:
parent
1bcbe6fc2b
commit
736a1d29bc
@ -3152,7 +3152,7 @@ err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_rpad::fix_length_and_dec()
|
void Item_func_pad::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
// Handle character set for args[0] and args[2].
|
// Handle character set for args[0] and args[2].
|
||||||
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
||||||
@ -3187,7 +3187,7 @@ String *Item_func_rpad::val_str(String *str)
|
|||||||
longlong count= args[1]->val_int();
|
longlong count= args[1]->val_int();
|
||||||
longlong byte_count;
|
longlong byte_count;
|
||||||
String *res= args[0]->val_str(str);
|
String *res= args[0]->val_str(str);
|
||||||
String *rpad= args[2]->val_str(&rpad_str);
|
String *rpad= args[2]->val_str(&pad_str);
|
||||||
|
|
||||||
if (!res || args[1]->null_value || !rpad ||
|
if (!res || args[1]->null_value || !rpad ||
|
||||||
((count < 0) && !args[1]->unsigned_flag))
|
((count < 0) && !args[1]->unsigned_flag))
|
||||||
@ -3260,32 +3260,6 @@ String *Item_func_rpad::val_str(String *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_lpad::fix_length_and_dec()
|
|
||||||
{
|
|
||||||
// Handle character set for args[0] and args[2].
|
|
||||||
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (args[1]->const_item())
|
|
||||||
{
|
|
||||||
ulonglong char_length= (ulonglong) args[1]->val_int();
|
|
||||||
DBUG_ASSERT(collation.collation->mbmaxlen > 0);
|
|
||||||
/* 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 (args[1]->null_value)
|
|
||||||
char_length= 0;
|
|
||||||
else if (char_length > INT_MAX32)
|
|
||||||
char_length= INT_MAX32;
|
|
||||||
fix_char_length_ulonglong(char_length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
max_length= MAX_BLOB_WIDTH;
|
|
||||||
maybe_null= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String *Item_func_lpad::val_str(String *str)
|
String *Item_func_lpad::val_str(String *str)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
@ -3294,7 +3268,7 @@ String *Item_func_lpad::val_str(String *str)
|
|||||||
longlong count= args[1]->val_int();
|
longlong count= args[1]->val_int();
|
||||||
longlong byte_count;
|
longlong byte_count;
|
||||||
String *res= args[0]->val_str(&tmp_value);
|
String *res= args[0]->val_str(&tmp_value);
|
||||||
String *pad= args[2]->val_str(&lpad_str);
|
String *pad= args[2]->val_str(&pad_str);
|
||||||
|
|
||||||
if (!res || args[1]->null_value || !pad ||
|
if (!res || args[1]->null_value || !pad ||
|
||||||
((count < 0) && !args[1]->unsigned_flag))
|
((count < 0) && !args[1]->unsigned_flag))
|
||||||
|
@ -1003,28 +1003,35 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_rpad :public Item_str_func
|
class Item_func_pad: public Item_str_func
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
String tmp_value, pad_str;
|
||||||
|
public:
|
||||||
|
Item_func_pad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
|
Item_str_func(thd, arg1, arg2, arg3) {}
|
||||||
|
void fix_length_and_dec();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Item_func_rpad :public Item_func_pad
|
||||||
{
|
{
|
||||||
String tmp_value, rpad_str;
|
|
||||||
public:
|
public:
|
||||||
Item_func_rpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
Item_func_rpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
Item_str_func(thd, arg1, arg2, arg3) {}
|
Item_func_pad(thd, arg1, arg2, arg3) {}
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec();
|
|
||||||
const char *func_name() const { return "rpad"; }
|
const char *func_name() const { return "rpad"; }
|
||||||
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
||||||
{ return get_item_copy<Item_func_rpad>(thd, mem_root, this); }
|
{ return get_item_copy<Item_func_rpad>(thd, mem_root, this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_lpad :public Item_str_func
|
class Item_func_lpad :public Item_func_pad
|
||||||
{
|
{
|
||||||
String tmp_value, lpad_str;
|
|
||||||
public:
|
public:
|
||||||
Item_func_lpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
Item_func_lpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
Item_str_func(thd, arg1, arg2, arg3) {}
|
Item_func_pad(thd, arg1, arg2, arg3) {}
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec();
|
|
||||||
const char *func_name() const { return "lpad"; }
|
const char *func_name() const { return "lpad"; }
|
||||||
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
||||||
{ return get_item_copy<Item_func_lpad>(thd, mem_root, this); }
|
{ return get_item_copy<Item_func_lpad>(thd, mem_root, this); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user