64
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 ||
139
drizzle_bin_log.is_query_in_union(session, var_entry->used_query_id))
142
If this variable was already stored in user_var_events by this query
143
(because it's used in more than one place in the query), don't store
146
*out_entry= var_entry;
152
First we need to store value of var_entry, when the next situation
155
> insert into t1 values (@a), (@a:=@a+1), (@a:=@a+1);
156
We have to write to binlog value @a= 1.
158
We allocate the user_var_event on user_var_events_alloc pool, not on
159
the this-statement-execution pool because in SPs user_var_event objects
160
may need to be valid after current [SP] statement execution pool is
163
size= ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)) + var_entry->length;
164
if (!(user_var_event= (BINLOG_USER_VAR_EVENT *)
165
alloc_root(session->user_var_events_alloc, size)))
168
user_var_event->value= (char*) user_var_event +
169
ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT));
170
user_var_event->user_var_event= var_entry;
171
user_var_event->type= var_entry->type;
172
user_var_event->charset_number= var_entry->collation.collation->number;
173
if (!var_entry->value)
176
user_var_event->length= 0;
177
user_var_event->value= 0;
181
user_var_event->length= var_entry->length;
182
memcpy(user_var_event->value, var_entry->value,
185
/* Mark that this variable has been used by this query */
186
var_entry->used_query_id= session->query_id;
187
if (insert_dynamic(&session->user_var_events, (unsigned char*) &user_var_event))
190
*out_entry= var_entry;
194
*out_entry= var_entry;
67
198
void Item_func_get_user_var::fix_length_and_dec()
200
Session *session=current_session;
70
203
decimals=NOT_FIXED_DEC;
71
204
max_length=MAX_BLOB_WIDTH;
73
var_entry= session.getVariable(name, false);
206
error= get_var_with_binlog(session, session->lex->sql_command, name, &var_entry);
76
209
If the variable didn't exist it has been created as a STRING-type.