60
60
return (var_entry->val_int(&null_value));
64
Get variable by name and, if necessary, put the record of variable
65
use into the binary log.
67
When a user variable is invoked from an update query (INSERT, UPDATE etc),
68
stores this variable and its value in session->user_var_events, so that it can be
69
written to the binlog (will be written just before the query is written, see
72
@param session Current thread
73
@param name Variable name
74
@param[out] out_entry variable structure or NULL. The pointer is set
75
regardless of whether function succeeded or not.
80
1 Failed to put appropriate record into binary log
84
static int get_var_with_binlog(Session *session, enum_sql_command sql_command,
85
LEX_STRING &name, user_var_entry **out_entry)
87
BINLOG_USER_VAR_EVENT *user_var_event;
88
user_var_entry *var_entry;
89
var_entry= get_variable(&session->user_vars, name, 0);
92
Any reference to user-defined variable which is done from stored
93
function or trigger affects their execution and the execution of the
94
calling statement. We must log all such variables even if they are
95
not involved in table-updating statements.
97
if (!(opt_bin_log && is_update_query(sql_command)))
99
*out_entry= var_entry;
106
If the variable does not exist, it's NULL, but we want to create it so
107
that it gets into the binlog (if it didn't, the slave could be
108
influenced by a variable of the same name previously set by another
110
We create it like if it had been explicitly set with SET before.
111
The 'new' mimics what sql_yacc.yy does when 'SET @a=10;'.
112
sql_set_variables() is what is called from 'case SQLCOM_SET_OPTION'
113
in dispatch_command()). Instead of building a one-element list to pass to
114
sql_set_variables(), we could instead manually call check() and update();
115
this would save memory and time; but calling sql_set_variables() makes
116
one unique place to maintain (sql_set_variables()).
118
Manipulation with lex is necessary since free_underlaid_joins
119
is going to release memory belonging to the main query.
122
List<set_var_base> tmp_var_list;
123
LEX *sav_lex= session->lex, lex_tmp;
124
session->lex= &lex_tmp;
126
tmp_var_list.push_back(new set_var_user(new Item_func_set_user_var(name,
128
/* Create the variable */
129
if (sql_set_variables(session, &tmp_var_list))
131
session->lex= sav_lex;
134
session->lex= sav_lex;
135
if (!(var_entry= get_variable(&session->user_vars, name, 0)))
138
else if (var_entry->used_query_id == session->query_id)
141
If this variable was already stored in user_var_events by this query
142
(because it's used in more than one place in the query), don't store
145
*out_entry= var_entry;
151
First we need to store value of var_entry, when the next situation
154
> insert into t1 values (@a), (@a:=@a+1), (@a:=@a+1);
155
We have to write to binlog value @a= 1.
157
We allocate the user_var_event on user_var_events_alloc pool, not on
158
the this-statement-execution pool because in SPs user_var_event objects
159
may need to be valid after current [SP] statement execution pool is
162
size= ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)) + var_entry->length;
163
if (!(user_var_event= (BINLOG_USER_VAR_EVENT *)
164
alloc_root(session->user_var_events_alloc, size)))
167
user_var_event->value= (char*) user_var_event +
168
ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT));
169
user_var_event->user_var_event= var_entry;
170
user_var_event->type= var_entry->type;
171
user_var_event->charset_number= var_entry->collation.collation->number;
172
if (!var_entry->value)
175
user_var_event->length= 0;
176
user_var_event->value= 0;
180
user_var_event->length= var_entry->length;
181
memcpy(user_var_event->value, var_entry->value,
184
/* Mark that this variable has been used by this query */
185
var_entry->used_query_id= session->query_id;
186
if (insert_dynamic(&session->user_var_events, (unsigned char*) &user_var_event))
189
*out_entry= var_entry;
193
*out_entry= var_entry;
197
63
void Item_func_get_user_var::fix_length_and_dec()
199
65
Session *session=current_session;
202
67
decimals=NOT_FIXED_DEC;
203
68
max_length=MAX_BLOB_WIDTH;
205
error= get_var_with_binlog(session, session->lex->sql_command, name, &var_entry);
70
var_entry= get_variable(&session->user_vars, name, 0);
208
73
If the variable didn't exist it has been created as a STRING-type.