diff options
author | unknown <gluh@gluh.mysql.r18.ru> | 2003-01-31 09:43:53 +0400 |
---|---|---|
committer | unknown <gluh@gluh.mysql.r18.ru> | 2003-01-31 09:43:53 +0400 |
commit | 5017595c664550850b9f2eccd3dd2ab487f6fb36 (patch) | |
tree | c1bdb67886529690cc8dbaceb225f81dacda0474 /sql/item_func.cc | |
parent | b399d48e036b89db4e4bd123235ca13b9478d0cc (diff) | |
parent | 82bf7e97ee2b92754a4b26486638160375b3c2b7 (diff) | |
download | mariadb-git-5017595c664550850b9f2eccd3dd2ab487f6fb36.tar.gz |
conflicts resolving
BitKeeper/etc/logging_ok:
auto-union
include/my_sys.h:
Auto merged
sql/item_func.cc:
Auto merged
sql/log.cc:
Auto merged
sql/log_event.h:
Auto merged
sql/sql_class.cc:
Auto merged
sql/sql_class.h:
Auto merged
sql/log_event.cc:
merged
sql/sql_parse.cc:
merged
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 7ebbe3f9463..38249ef9a22 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1941,6 +1941,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, entry->value=0; entry->length=0; entry->update_query_id=0; + entry->used_query_id=current_thd->query_id; entry->type=STRING_RESULT; memcpy(entry->name.str, name.str, name.length+1); if (hash_insert(hash,(byte*) entry)) @@ -2074,7 +2075,7 @@ Item_func_set_user_var::val_str(String *str) { String *res=args[0]->val_str(str); if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT, default_charset_info); + update_hash((void*) 0, 0, STRING_RESULT, default_charset_info); else update_hash(res->c_ptr(),res->length()+1,STRING_RESULT,res->charset()); return res; @@ -2173,14 +2174,58 @@ longlong Item_func_get_user_var::val_int() return LL(0); // Impossible } +/* From sql_parse.cc */ +extern bool is_update_query(enum enum_sql_command command); void Item_func_get_user_var::fix_length_and_dec() { + BINLOG_USER_VAR_EVENT *user_var_event; THD *thd=current_thd; maybe_null=1; decimals=NOT_FIXED_DEC; max_length=MAX_BLOB_WIDTH; - var_entry= get_variable(&thd->user_vars, name, 0); + + if ((var_entry= get_variable(&thd->user_vars, name, 0))) + { + if (opt_bin_log && is_update_query(thd->lex.sql_command) && + var_entry->used_query_id != thd->query_id) + { + /* + First we need to store value of var_entry, when the next situation appers: + > set @a:=1; + > insert into t1 values (@a), (@a:=@a+1), (@a:=@a+1); + We have to write to binlog value @a= 1; + */ + uint size= ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)) + var_entry->length; + if (!(user_var_event= (BINLOG_USER_VAR_EVENT *) thd->alloc(size))) + goto err; + + user_var_event->value= (char*) user_var_event + + 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->var_charset->number; + if (!var_entry->value) + { + /* NULL value*/ + user_var_event->length= 0; + user_var_event->value= 0; + } + else + { + user_var_event->length= var_entry->length; + memcpy(user_var_event->value, var_entry->value, + var_entry->length); + } + var_entry->used_query_id= thd->query_id; + if (insert_dynamic(&thd->user_var_events, (gptr) &user_var_event)) + goto err; + } + } + return; +err: + thd->fatal_error= 1; + return; } |