| 3344 | */ |
| 3345 | |
| 3346 | bool run_set_statement_if_requested(THD *thd, LEX *lex) |
| 3347 | { |
| 3348 | if (!lex->stmt_var_list.is_empty() && !thd->slave_thread) |
| 3349 | { |
| 3350 | Query_arena backup; |
| 3351 | DBUG_PRINT("info", ("SET STATEMENT %d vars", lex->stmt_var_list.elements)); |
| 3352 | |
| 3353 | lex->old_var_list.empty(); |
| 3354 | List_iterator_fast<set_var_base> it(lex->stmt_var_list); |
| 3355 | set_var_base *var; |
| 3356 | |
| 3357 | if (lex->set_arena_for_set_stmt(&backup)) |
| 3358 | return true; |
| 3359 | |
| 3360 | MEM_ROOT *mem_root= thd->mem_root; |
| 3361 | while ((var= it++)) |
| 3362 | { |
| 3363 | DBUG_ASSERT(var->is_system()); |
| 3364 | set_var *o= NULL, *v= (set_var*)var; |
| 3365 | if (!v->var->is_set_stmt_ok()) |
| 3366 | { |
| 3367 | my_error(ER_SET_STATEMENT_NOT_SUPPORTED, MYF(0), v->var->name.str); |
| 3368 | lex->reset_arena_for_set_stmt(&backup); |
| 3369 | lex->old_var_list.empty(); |
| 3370 | lex->free_arena_for_set_stmt(); |
| 3371 | return true; |
| 3372 | } |
| 3373 | if (v->var->session_is_default(thd)) |
| 3374 | o= new set_var(thd,v->type, v->var, &v->base, NULL); |
| 3375 | else |
| 3376 | { |
| 3377 | switch (v->var->option.var_type & GET_TYPE_MASK) |
| 3378 | { |
| 3379 | case GET_BIT: |
| 3380 | case GET_BOOL: |
| 3381 | case GET_INT: |
| 3382 | case GET_LONG: |
| 3383 | case GET_LL: |
| 3384 | { |
| 3385 | bool null_value; |
| 3386 | longlong val= v->var->val_int(&null_value, thd, v->type, &v->base); |
| 3387 | o= new set_var(thd, v->type, v->var, &v->base, |
| 3388 | (null_value ? |
| 3389 | (Item *) new (mem_root) Item_null(thd) : |
| 3390 | (Item *) new (mem_root) Item_int(thd, val))); |
| 3391 | } |
| 3392 | break; |
| 3393 | case GET_UINT: |
| 3394 | case GET_ULONG: |
| 3395 | case GET_ULL: |
| 3396 | { |
| 3397 | bool null_value; |
| 3398 | ulonglong val= v->var->val_int(&null_value, thd, v->type, &v->base); |
| 3399 | o= new set_var(thd, v->type, v->var, &v->base, |
| 3400 | (null_value ? |
| 3401 | (Item *) new (mem_root) Item_null(thd) : |
| 3402 | (Item *) new (mem_root) Item_uint(thd, val))); |
| 3403 | } |
no test coverage detected