mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Removing "DTCollation user_var_entry::collation", using a CHARSET_INFO
pointer instread, as the "derivation" and "repertoire" parts of DTCollation were not really used by user_var_entry.
This commit is contained in:
parent
afa1773439
commit
2dc32c02ab
5 changed files with 34 additions and 38 deletions
|
@ -3327,7 +3327,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
|
|||
break;
|
||||
case STRING_RESULT:
|
||||
{
|
||||
CHARSET_INFO *fromcs= entry->collation.collation;
|
||||
CHARSET_INFO *fromcs= entry->charset();
|
||||
CHARSET_INFO *tocs= thd->variables.collation_connection;
|
||||
uint32 dummy_offset;
|
||||
|
||||
|
|
|
@ -4647,7 +4647,7 @@ user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
|
|||
entry->value=0;
|
||||
entry->length=0;
|
||||
entry->update_query_id=0;
|
||||
entry->collation.set(NULL, DERIVATION_IMPLICIT, 0);
|
||||
entry->set_charset(NULL);
|
||||
entry->unsigned_flag= 0;
|
||||
/*
|
||||
If we are here, we were called from a SET or a query which sets a
|
||||
|
@ -4727,11 +4727,10 @@ bool Item_func_set_user_var::fix_fields(THD *thd, Item **ref)
|
|||
and the variable has previously been initialized.
|
||||
*/
|
||||
null_item= (args[0]->type() == NULL_ITEM);
|
||||
if (!entry->collation.collation || !null_item)
|
||||
entry->collation.set(args[0]->collation.derivation == DERIVATION_NUMERIC ?
|
||||
default_charset() : args[0]->collation.collation,
|
||||
DERIVATION_IMPLICIT);
|
||||
collation.set(entry->collation.collation, DERIVATION_IMPLICIT);
|
||||
if (!entry->charset() || !null_item)
|
||||
entry->set_charset(args[0]->collation.derivation == DERIVATION_NUMERIC ?
|
||||
default_charset() : args[0]->collation.collation);
|
||||
collation.set(entry->charset(), DERIVATION_IMPLICIT);
|
||||
cached_result_type= args[0]->result_type();
|
||||
if (thd->lex->current_select)
|
||||
{
|
||||
|
@ -4831,7 +4830,7 @@ bool Item_func_set_user_var::register_field_in_bitmap(uchar *arg)
|
|||
|
||||
static bool
|
||||
update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
|
||||
Item_result type, CHARSET_INFO *cs, Derivation dv,
|
||||
Item_result type, CHARSET_INFO *cs,
|
||||
bool unsigned_arg)
|
||||
{
|
||||
if (set_null)
|
||||
|
@ -4882,7 +4881,7 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
|
|||
if (type == DECIMAL_RESULT)
|
||||
((my_decimal*)entry->value)->fix_buffer_pointer();
|
||||
entry->length= length;
|
||||
entry->collation.set(cs, dv);
|
||||
entry->set_charset(cs);
|
||||
entry->unsigned_flag= unsigned_arg;
|
||||
}
|
||||
entry->type=type;
|
||||
|
@ -4893,7 +4892,7 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
|
|||
bool
|
||||
Item_func_set_user_var::update_hash(void *ptr, uint length,
|
||||
Item_result res_type,
|
||||
CHARSET_INFO *cs, Derivation dv,
|
||||
CHARSET_INFO *cs,
|
||||
bool unsigned_arg)
|
||||
{
|
||||
/*
|
||||
|
@ -4903,7 +4902,7 @@ Item_func_set_user_var::update_hash(void *ptr, uint length,
|
|||
if ((null_value= args[0]->null_value) && null_item)
|
||||
res_type= entry->type; // Don't change type of item
|
||||
if (::update_hash(entry, (null_value= args[0]->null_value),
|
||||
ptr, length, res_type, cs, dv, unsigned_arg))
|
||||
ptr, length, res_type, cs, unsigned_arg))
|
||||
{
|
||||
null_value= 1;
|
||||
return 1;
|
||||
|
@ -4983,19 +4982,19 @@ String *user_var_entry::val_str(bool *null_value, String *str,
|
|||
|
||||
switch (type) {
|
||||
case REAL_RESULT:
|
||||
str->set_real(*(double*) value, decimals, collation.collation);
|
||||
str->set_real(*(double*) value, decimals, charset());
|
||||
break;
|
||||
case INT_RESULT:
|
||||
if (!unsigned_flag)
|
||||
str->set(*(longlong*) value, collation.collation);
|
||||
str->set(*(longlong*) value, charset());
|
||||
else
|
||||
str->set(*(ulonglong*) value, collation.collation);
|
||||
str->set(*(ulonglong*) value, charset());
|
||||
break;
|
||||
case DECIMAL_RESULT:
|
||||
str_set_decimal((my_decimal *) value, str, collation.collation);
|
||||
str_set_decimal((my_decimal *) value, str, charset());
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
if (str->copy(value, length, collation.collation))
|
||||
if (str->copy(value, length, charset()))
|
||||
str= 0; // EOM error
|
||||
break;
|
||||
case ROW_RESULT:
|
||||
|
@ -5024,7 +5023,7 @@ my_decimal *user_var_entry::val_decimal(bool *null_value, my_decimal *val)
|
|||
my_decimal2decimal((my_decimal *) value, val);
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
str2my_decimal(E_DEC_FATAL_ERROR, value, length, collation.collation, val);
|
||||
str2my_decimal(E_DEC_FATAL_ERROR, value, length, charset(), val);
|
||||
break;
|
||||
case ROW_RESULT:
|
||||
case TIME_RESULT:
|
||||
|
@ -5152,37 +5151,33 @@ Item_func_set_user_var::update()
|
|||
case REAL_RESULT:
|
||||
{
|
||||
res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal),
|
||||
REAL_RESULT, default_charset(), DERIVATION_IMPLICIT, 0);
|
||||
REAL_RESULT, default_charset(), 0);
|
||||
break;
|
||||
}
|
||||
case INT_RESULT:
|
||||
{
|
||||
res= update_hash((void*) &save_result.vint, sizeof(save_result.vint),
|
||||
INT_RESULT, default_charset(), DERIVATION_IMPLICIT,
|
||||
unsigned_flag);
|
||||
INT_RESULT, default_charset(), unsigned_flag);
|
||||
break;
|
||||
}
|
||||
case STRING_RESULT:
|
||||
{
|
||||
if (!save_result.vstr) // Null value
|
||||
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin,
|
||||
DERIVATION_IMPLICIT, 0);
|
||||
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin, 0);
|
||||
else
|
||||
res= update_hash((void*) save_result.vstr->ptr(),
|
||||
save_result.vstr->length(), STRING_RESULT,
|
||||
save_result.vstr->charset(),
|
||||
DERIVATION_IMPLICIT, 0);
|
||||
save_result.vstr->charset(), 0);
|
||||
break;
|
||||
}
|
||||
case DECIMAL_RESULT:
|
||||
{
|
||||
if (!save_result.vdec) // Null value
|
||||
res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin,
|
||||
DERIVATION_IMPLICIT, 0);
|
||||
res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin, 0);
|
||||
else
|
||||
res= update_hash((void*) save_result.vdec,
|
||||
sizeof(my_decimal), DECIMAL_RESULT,
|
||||
default_charset(), DERIVATION_IMPLICIT, 0);
|
||||
default_charset(), 0);
|
||||
break;
|
||||
}
|
||||
case ROW_RESULT:
|
||||
|
@ -5576,7 +5571,7 @@ get_var_with_binlog(THD *thd, enum_sql_command sql_command,
|
|||
ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT));
|
||||
user_var_event->user_var_event= var_entry;
|
||||
user_var_event->type= var_entry->type;
|
||||
user_var_event->charset_number= var_entry->collation.collation->number;
|
||||
user_var_event->charset_number= var_entry->charset()->number;
|
||||
user_var_event->unsigned_flag= var_entry->unsigned_flag;
|
||||
if (!var_entry->value)
|
||||
{
|
||||
|
@ -5624,7 +5619,7 @@ void Item_func_get_user_var::fix_length_and_dec()
|
|||
unsigned_flag= var_entry->unsigned_flag;
|
||||
max_length= var_entry->length;
|
||||
|
||||
collation.set(var_entry->collation);
|
||||
collation.set(var_entry->charset(), DERIVATION_IMPLICIT);
|
||||
switch (m_cached_result_type) {
|
||||
case REAL_RESULT:
|
||||
fix_char_length(DBL_DIG + 8);
|
||||
|
@ -5716,9 +5711,9 @@ bool Item_user_var_as_out_param::fix_fields(THD *thd, Item **ref)
|
|||
of fields in LOAD DATA INFILE.
|
||||
(Since Item_user_var_as_out_param is used only there).
|
||||
*/
|
||||
entry->collation.set(thd->lex->exchange->cs ?
|
||||
thd->lex->exchange->cs :
|
||||
thd->variables.collation_database);
|
||||
entry->set_charset(thd->lex->exchange->cs ?
|
||||
thd->lex->exchange->cs :
|
||||
thd->variables.collation_database);
|
||||
entry->update_query_id= thd->query_id;
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -5726,8 +5721,7 @@ bool Item_user_var_as_out_param::fix_fields(THD *thd, Item **ref)
|
|||
|
||||
void Item_user_var_as_out_param::set_null_value(CHARSET_INFO* cs)
|
||||
{
|
||||
::update_hash(entry, TRUE, 0, 0, STRING_RESULT, cs,
|
||||
DERIVATION_IMPLICIT, 0 /* unsigned_arg */);
|
||||
::update_hash(entry, TRUE, 0, 0, STRING_RESULT, cs, 0 /* unsigned_arg */);
|
||||
}
|
||||
|
||||
|
||||
|
@ -5735,7 +5729,7 @@ void Item_user_var_as_out_param::set_value(const char *str, uint length,
|
|||
CHARSET_INFO* cs)
|
||||
{
|
||||
::update_hash(entry, FALSE, (void*)str, length, STRING_RESULT, cs,
|
||||
DERIVATION_IMPLICIT, 0 /* unsigned_arg */);
|
||||
0 /* unsigned_arg */);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1696,7 +1696,7 @@ public:
|
|||
my_decimal *val_decimal_result(my_decimal *);
|
||||
bool is_null_result();
|
||||
bool update_hash(void *ptr, uint length, enum Item_result type,
|
||||
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
|
||||
CHARSET_INFO *cs, bool unsigned_arg);
|
||||
bool send(Protocol *protocol, String *str_arg);
|
||||
void make_field(Send_field *tmp_field);
|
||||
bool check(bool use_result_field);
|
||||
|
|
|
@ -7997,7 +7997,7 @@ int User_var_log_event::do_apply_event(rpl_group_info *rgi)
|
|||
a single record and with a single column. Thus, like
|
||||
a column value, it could always have IMPLICIT derivation.
|
||||
*/
|
||||
e->update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT,
|
||||
e->update_hash(val, val_len, type, charset,
|
||||
(flags & User_var_log_event::UNSIGNED_F));
|
||||
if (!is_deferred())
|
||||
free_root(thd->mem_root, 0);
|
||||
|
|
|
@ -4949,6 +4949,7 @@ public:
|
|||
// this is needed for user_vars hash
|
||||
class user_var_entry
|
||||
{
|
||||
CHARSET_INFO *m_charset;
|
||||
public:
|
||||
user_var_entry() {} /* Remove gcc warning */
|
||||
LEX_STRING name;
|
||||
|
@ -4962,7 +4963,8 @@ class user_var_entry
|
|||
longlong val_int(bool *null_value) const;
|
||||
String *val_str(bool *null_value, String *str, uint decimals);
|
||||
my_decimal *val_decimal(bool *null_value, my_decimal *result);
|
||||
DTCollation collation;
|
||||
CHARSET_INFO *charset() const { return m_charset; }
|
||||
void set_charset(CHARSET_INFO *cs) { m_charset= cs; }
|
||||
};
|
||||
|
||||
user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
|
||||
|
|
Loading…
Reference in a new issue