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, const SetVarVector &var_list)
59
SetVarVector::const_iterator it(var_list.begin());
61
while (it != var_list.end())
63
if ((error= (*it)->check(session)))
67
if (!(error= test(session->is_error())))
70
while (it != var_list.end())
72
error|= (*it)->update(session); // Returns 0, -1 or 1
78
free_underlaid_joins(session, &session->lex->select_lex);
83
/*****************************************************************************
84
Functions to handle SET mysql_internal_variable=const_expr
85
*****************************************************************************/
86
set_var::set_var(sql_var_t type_arg, sys_var *var_arg,
87
const LEX_STRING *base_name_arg, Item *value_arg) :
95
If the set value is a field, change it to a string to allow things like
96
SET table_type=MYISAM;
98
if (value_arg && value_arg->type() == Item::FIELD_ITEM)
100
Item_field *item= (Item_field*) value_arg;
101
if (!(value=new Item_string(item->field_name,
102
(uint32_t) strlen(item->field_name),
103
item->collation.collation)))
104
value=value_arg; /* Give error message later */
112
int set_var::check(Session *session)
114
if (var->is_readonly())
116
my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->getName().c_str(), "read only");
119
if (var->check_type(type))
121
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
122
my_error(static_cast<drizzled::error_t>(err), MYF(0), var->getName().c_str());
125
/* value is a NULL pointer if we are using SET ... = DEFAULT */
128
if (var->check_default(type))
130
my_error(ER_NO_DEFAULT, MYF(0), var->getName().c_str());
136
if ((!value->fixed &&
137
value->fix_fields(session, &value)) || value->check_cols(1))
139
if (var->check_update_type(value->result_type()))
141
my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), var->getName().c_str());
144
return var->check(session, this) ? -1 : 0;
150
@param session thread handler
151
@returns 0|1 ok or ERROR
153
@note ERROR can be only due to abnormal operations involving
154
the server's execution evironment such as
155
out of memory, hard disk failure or the computer blows up.
156
Consider set_var::check() method if there is a need to return
157
an error due to logics.
159
int set_var::update(Session *session)
164
var->set_default(session, type);
165
else if (var->update(session, this))
166
return -1; // should never happen
167
if (var->getAfterUpdateTrigger())
168
(*var->getAfterUpdateTrigger())(session, type);
170
catch (invalid_option_value &ex)
172
/* TODO: Fix this to be typesafe once we have properly typed set_var */
173
string new_val= boost::lexical_cast<string>(uint64_t_value);
174
if (boost::get_error_info<invalid_max_info>(ex) != NULL)
176
const uint64_t max_val= *(boost::get_error_info<invalid_max_info>(ex));
177
string explanation("(> ");
178
explanation.append(boost::lexical_cast<std::string>(max_val));
179
explanation.push_back(')');
180
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
181
ER_INVALID_OPTION_VALUE,
182
ER(ER_INVALID_OPTION_VALUE),
183
var->getName().c_str(),
185
explanation.c_str());
187
else if (boost::get_error_info<invalid_min_info>(ex) != NULL)
189
const int64_t min_val= *(boost::get_error_info<invalid_min_info>(ex));
190
string explanation("(< ");
191
explanation.append(boost::lexical_cast<std::string>(min_val));
192
explanation.push_back(')');
193
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
194
ER_INVALID_OPTION_VALUE,
195
ER(ER_INVALID_OPTION_VALUE),
196
var->getName().c_str(),
198
explanation.c_str());
200
else if (boost::get_error_info<invalid_value>(ex) != NULL)
202
const std::string str_val= *(boost::get_error_info<invalid_value>(ex));
203
string explanation("(");
204
explanation.append(str_val);
205
explanation.push_back(')');
206
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
207
ER_INVALID_OPTION_VALUE,
208
ER(ER_INVALID_OPTION_VALUE),
209
var->getName().c_str(),
211
explanation.c_str());
215
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
216
ER_INVALID_OPTION_VALUE,
217
ER(ER_INVALID_OPTION_VALUE),
218
var->getName().c_str(),
226
/*****************************************************************************
227
Functions to handle SET @user_variable=const_expr
228
*****************************************************************************/
230
int set_var_user::check(Session *session)
233
Item_func_set_user_var can't substitute something else on its place =>
234
0 can be passed as last argument (reference on item)
236
return (user_var_item->fix_fields(session, (Item**) 0) ||
237
user_var_item->check(0)) ? -1 : 0;
241
int set_var_user::update(Session *)
243
if (user_var_item->update())
245
/* Give an error if it's not given already */
246
my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY), MYF(0));
252
void set_var::setValue(const std::string &new_value)
254
str_value= new_value;
257
void set_var::setValue(uint64_t new_value)
259
uint64_t_value= new_value;
262
void set_var::updateValue()
264
if (var->show_type() != SHOW_CHAR)
266
uint64_t_value= value->val_int();
271
} /* namespace drizzled */