1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
#include "drizzled/session.h"
22
#include "drizzled/item/string.h"
23
#include "drizzled/sql_list.h"
31
Execute update of all variables.
33
First run a check of all variables that all updates will go ok.
34
If yes, then execute all updates, returning an error if any one failed.
36
This should ensure that in all normal cases none all or variables are
39
@param Session Thread id
40
@param var_list List of variables to update
45
1 ERROR, message sent (normally no variables was updated)
47
-1 ERROR, message not sent
50
int sql_set_variables(Session *session, List<set_var_base> *var_list)
53
List_iterator_fast<set_var_base> it(*var_list);
58
if ((error= var->check(session)))
61
if (!(error= test(session->is_error())))
65
error|= var->update(session); // Returns 0, -1 or 1
69
free_underlaid_joins(session, &session->lex->select_lex);
74
/*****************************************************************************
75
Functions to handle SET mysql_internal_variable=const_expr
76
*****************************************************************************/
77
set_var::set_var(sql_var_t type_arg, sys_var *var_arg,
78
const LEX_STRING *base_name_arg, Item *value_arg) :
79
var(var_arg), type(type_arg), base(*base_name_arg)
82
If the set value is a field, change it to a string to allow things like
83
SET table_type=MYISAM;
85
if (value_arg && value_arg->type() == Item::FIELD_ITEM)
87
Item_field *item= (Item_field*) value_arg;
88
if (!(value=new Item_string(item->field_name,
89
(uint32_t) strlen(item->field_name),
90
item->collation.collation)))
91
value=value_arg; /* Give error message later */
97
int set_var::check(Session *session)
99
if (var->is_readonly())
101
my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->getName().c_str(), "read only");
104
if (var->check_type(type))
106
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
107
my_error(err, MYF(0), var->getName().c_str());
110
/* value is a NULL pointer if we are using SET ... = DEFAULT */
113
if (var->check_default(type))
115
my_error(ER_NO_DEFAULT, MYF(0), var->getName().c_str());
121
if ((!value->fixed &&
122
value->fix_fields(session, &value)) || value->check_cols(1))
124
if (var->check_update_type(value->result_type()))
126
my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), var->getName().c_str());
129
return var->check(session, this) ? -1 : 0;
135
@param session thread handler
136
@returns 0|1 ok or ERROR
138
@note ERROR can be only due to abnormal operations involving
139
the server's execution evironment such as
140
out of memory, hard disk failure or the computer blows up.
141
Consider set_var::check() method if there is a need to return
142
an error due to logics.
144
int set_var::update(Session *session)
147
var->set_default(session, type);
148
else if (var->update(session, this))
149
return -1; // should never happen
150
if (var->getAfterUpdateTrigger())
151
(*var->getAfterUpdateTrigger())(session, type);
155
/*****************************************************************************
156
Functions to handle SET @user_variable=const_expr
157
*****************************************************************************/
159
int set_var_user::check(Session *session)
162
Item_func_set_user_var can't substitute something else on its place =>
163
0 can be passed as last argument (reference on item)
165
return (user_var_item->fix_fields(session, (Item**) 0) ||
166
user_var_item->check(0)) ? -1 : 0;
170
int set_var_user::update(Session *)
172
if (user_var_item->update())
174
/* Give an error if it's not given already */
175
my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY), MYF(0));
181
} /* namespace drizzled */