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, Inc.
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
22
#include <boost/lexical_cast.hpp>
23
#include <boost/exception/get_error_info.hpp>
26
#include "drizzled/session.h"
27
#include "drizzled/item/string.h"
28
#include "drizzled/sql_list.h"
36
Execute update of all variables.
38
First run a check of all variables that all updates will go ok.
39
If yes, then execute all updates, returning an error if any one failed.
41
This should ensure that in all normal cases none all or variables are
44
@param Session Thread id
45
@param var_list List of variables to update
50
1 ERROR, message sent (normally no variables was updated)
52
-1 ERROR, message not sent
55
int sql_set_variables(Session *session, List<set_var_base> *var_list)
58
List_iterator_fast<set_var_base> it(*var_list);
63
if ((error= var->check(session)))
66
if (!(error= test(session->is_error())))
70
error|= var->update(session); // Returns 0, -1 or 1
74
free_underlaid_joins(session, &session->lex->select_lex);
79
/*****************************************************************************
80
Functions to handle SET mysql_internal_variable=const_expr
81
*****************************************************************************/
82
set_var::set_var(sql_var_t type_arg, sys_var *var_arg,
83
const LEX_STRING *base_name_arg, Item *value_arg) :
84
var(var_arg), type(type_arg), base(*base_name_arg)
87
If the set value is a field, change it to a string to allow things like
88
SET table_type=MYISAM;
90
if (value_arg && value_arg->type() == Item::FIELD_ITEM)
92
Item_field *item= (Item_field*) value_arg;
93
if (!(value=new Item_string(item->field_name,
94
(uint32_t) strlen(item->field_name),
95
item->collation.collation)))
96
value=value_arg; /* Give error message later */
102
int set_var::check(Session *session)
104
if (var->is_readonly())
106
my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->getName().c_str(), "read only");
109
if (var->check_type(type))
111
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
112
my_error(err, MYF(0), var->getName().c_str());
115
/* value is a NULL pointer if we are using SET ... = DEFAULT */
118
if (var->check_default(type))
120
my_error(ER_NO_DEFAULT, MYF(0), var->getName().c_str());
126
if ((!value->fixed &&
127
value->fix_fields(session, &value)) || value->check_cols(1))
129
if (var->check_update_type(value->result_type()))
131
my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), var->getName().c_str());
134
return var->check(session, this) ? -1 : 0;
140
@param session thread handler
141
@returns 0|1 ok or ERROR
143
@note ERROR can be only due to abnormal operations involving
144
the server's execution evironment such as
145
out of memory, hard disk failure or the computer blows up.
146
Consider set_var::check() method if there is a need to return
147
an error due to logics.
149
int set_var::update(Session *session)
154
var->set_default(session, type);
155
else if (var->update(session, this))
156
return -1; // should never happen
157
if (var->getAfterUpdateTrigger())
158
(*var->getAfterUpdateTrigger())(session, type);
160
catch (invalid_option_value &ex)
162
/* TODO: Fix this to be typesafe once we have properly typed set_var */
163
string new_val= boost::lexical_cast<string>(save_result.uint32_t_value);
164
if (boost::get_error_info<invalid_max_info>(ex) != NULL)
166
const uint64_t max_val= *(boost::get_error_info<invalid_max_info>(ex));
167
string explanation("(> ");
168
explanation.append(boost::lexical_cast<std::string>(max_val));
169
explanation.push_back(')');
170
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
171
ER_INVALID_OPTION_VALUE,
172
ER(ER_INVALID_OPTION_VALUE),
173
var->getName().c_str(),
175
explanation.c_str());
177
else if (boost::get_error_info<invalid_min_info>(ex) != NULL)
179
const int64_t min_val= *(boost::get_error_info<invalid_min_info>(ex));
180
string explanation("(< ");
181
explanation.append(boost::lexical_cast<std::string>(min_val));
182
explanation.push_back(')');
183
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
184
ER_INVALID_OPTION_VALUE,
185
ER(ER_INVALID_OPTION_VALUE),
186
var->getName().c_str(),
188
explanation.c_str());
192
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
193
ER_INVALID_OPTION_VALUE,
194
ER(ER_INVALID_OPTION_VALUE),
195
var->getName().c_str(),
203
/*****************************************************************************
204
Functions to handle SET @user_variable=const_expr
205
*****************************************************************************/
207
int set_var_user::check(Session *session)
210
Item_func_set_user_var can't substitute something else on its place =>
211
0 can be passed as last argument (reference on item)
213
return (user_var_item->fix_fields(session, (Item**) 0) ||
214
user_var_item->check(0)) ? -1 : 0;
218
int set_var_user::update(Session *)
220
if (user_var_item->update())
222
/* Give an error if it's not given already */
223
my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY), MYF(0));
229
} /* namespace drizzled */