17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#include <drizzled/server_includes.h>
22
22
#include <drizzled/function/set_user_var.h>
23
#include <drizzled/function/update_hash.h>
23
24
#include <drizzled/field/num.h>
24
25
#include <drizzled/session.h>
25
#include <drizzled/plugin/client.h>
31
32
When a user variable is updated (in a SET command or a query like
92
93
Table *table= (Table *) arg;
93
if (result_field->getTable() == table || !table)
94
result_field->getTable()->setReadSet(result_field->position());
94
if (result_field->table == table || !table)
95
result_field->table->read_set->set(result_field->field_index);
101
Mark field in bitmap supplied as *arg
105
bool Item_func_set_user_var::register_field_in_bitmap(unsigned char *arg)
107
bitset<MAX_FIELDS> *bitmap = (bitset<MAX_FIELDS> *) arg;
111
bitmap->set(result_field->field_index);
101
117
Item_func_set_user_var::update_hash(void *ptr, uint32_t length,
110
126
if ((null_value= args[0]->null_value) && null_item)
111
127
res_type= entry->type; // Don't change type of item
112
if (entry->update_hash((null_value= args[0]->null_value),
113
ptr, length, res_type, cs, dv, unsigned_arg))
128
if (::update_hash(entry, (null_value= args[0]->null_value),
129
ptr, length, res_type, cs, dv, unsigned_arg))
141
157
switch (cached_result_type) {
142
158
case REAL_RESULT:
144
save_result.vreal= use_result_field ? result_field->val_real() :
160
save_result.vreal= use_result_field ? result_field->val_real() :
150
save_result.vint= use_result_field ? result_field->val_int() :
152
unsigned_flag= use_result_field ? ((Field_num*)result_field)->unsigned_flag:
153
args[0]->unsigned_flag;
166
save_result.vint= use_result_field ? result_field->val_int() :
168
unsigned_flag= use_result_field ? ((Field_num*)result_field)->unsigned_flag:
169
args[0]->unsigned_flag;
156
172
case STRING_RESULT:
158
save_result.vstr= use_result_field ? result_field->val_str_internal(&value) :
159
args[0]->val_str(&value);
174
save_result.vstr= use_result_field ? result_field->val_str(&value) :
175
args[0]->val_str(&value);
162
178
case DECIMAL_RESULT:
164
save_result.vdec= use_result_field ?
165
result_field->val_decimal(&decimal_buff) :
166
args[0]->val_decimal(&decimal_buff);
180
save_result.vdec= use_result_field ?
181
result_field->val_decimal(&decimal_buff) :
182
args[0]->val_decimal(&decimal_buff);
170
187
// This case should never be chosen
198
214
switch (cached_result_type) {
199
215
case REAL_RESULT:
201
res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal),
202
REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, 0);
217
res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal),
218
REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, 0);
208
res= update_hash((void*) &save_result.vint, sizeof(save_result.vint),
209
INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT,
223
res= update_hash((void*) &save_result.vint, sizeof(save_result.vint),
224
INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT,
214
228
case STRING_RESULT:
216
if (!save_result.vstr) // Null value
217
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin,
218
DERIVATION_IMPLICIT, 0);
220
res= update_hash((void*) save_result.vstr->ptr(),
221
save_result.vstr->length(), STRING_RESULT,
222
save_result.vstr->charset(),
223
DERIVATION_IMPLICIT, 0);
230
if (!save_result.vstr) // Null value
231
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin,
232
DERIVATION_IMPLICIT, 0);
234
res= update_hash((void*) save_result.vstr->ptr(),
235
save_result.vstr->length(), STRING_RESULT,
236
save_result.vstr->charset(),
237
DERIVATION_IMPLICIT, 0);
227
240
case DECIMAL_RESULT:
229
if (!save_result.vdec) // Null value
230
res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin,
231
DERIVATION_IMPLICIT, 0);
233
res= update_hash((void*) save_result.vdec,
234
sizeof(my_decimal), DECIMAL_RESULT,
235
&my_charset_bin, DERIVATION_IMPLICIT, 0);
242
if (!save_result.vdec) // Null value
243
res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin,
244
DERIVATION_IMPLICIT, 0);
246
res= update_hash((void*) save_result.vdec,
247
sizeof(my_decimal), DECIMAL_RESULT,
248
&my_charset_bin, DERIVATION_IMPLICIT, 0);
240
253
// This case should never be chosen
320
332
str->append(')');
323
bool Item_func_set_user_var::send(plugin::Client *client, String *str_arg)
336
void Item_func_set_user_var::print_as_stmt(String *str,
337
enum_query_type query_type)
339
str->append(STRING_WITH_LEN("set @"));
340
str->append(name.str, name.length);
341
str->append(STRING_WITH_LEN(":="));
342
args[0]->print(str, query_type);
346
bool Item_func_set_user_var::send(Protocol *protocol, String *str_arg)
325
348
if (result_field)
329
return client->store(result_field);
352
return protocol->store(result_field);
331
return Item::send(client, str_arg);
354
return Item::send(protocol, str_arg);
334
void Item_func_set_user_var::make_field(SendField *tmp_field)
357
void Item_func_set_user_var::make_field(Send_field *tmp_field)
336
359
if (result_field)