22 #include <boost/foreach.hpp>
23 #include <boost/lexical_cast.hpp>
24 #include <boost/exception/get_error_info.hpp>
27 #include <drizzled/session.h>
28 #include <drizzled/item/string.h>
29 #include <drizzled/function/set_user_var.h>
30 #include <drizzled/sql_lex.h>
31 #include <drizzled/util/test.h>
61 BOOST_FOREACH(SetVarVector::const_reference it, var_list)
63 if ((error= it->check(session)))
66 if (!(error= test(session->
is_error())))
68 BOOST_FOREACH(SetVarVector::const_reference it, var_list)
70 error|= it->update(session);
83 set_var::set_var(sql_var_t type_arg, sys_var *var_arg,
str_ref base_name_arg, Item *value_arg) :
93 if (value_arg && value_arg->type() == Item::FIELD_ITEM)
95 Item_field *item= (Item_field*) value_arg;
96 value=
new Item_string(
str_ref(item->field_name), item->collation.collation);
104 int set_var::check(Session *session)
106 if (var->is_readonly())
108 my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0), var->getName().c_str(),
"read only");
111 if (var->check_type(type))
113 int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
114 my_error(static_cast<drizzled::error_t>(err), MYF(0), var->getName().c_str());
120 if (var->check_default(type))
122 my_error(ER_NO_DEFAULT, MYF(0), var->getName().c_str());
128 if ((!value->fixed &&
129 value->fix_fields(session, &value)) || value->check_cols(1))
131 if (var->check_update_type(value->result_type()))
133 my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), var->getName().c_str());
136 return var->check(session,
this) ? -1 : 0;
156 var->set_default(session, type);
157 else if (
var->update(session,
this))
159 if (
var->getAfterUpdateTrigger())
160 (*
var->getAfterUpdateTrigger())(session, type);
165 string new_val= boost::lexical_cast<
string>(uint64_t_value);
166 if (boost::get_error_info<invalid_max_info>(ex) != NULL)
168 const uint64_t max_val= *(boost::get_error_info<invalid_max_info>(ex));
169 string explanation(
"(> ");
170 explanation.append(boost::lexical_cast<std::string>(max_val));
171 explanation.push_back(
')');
172 push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
173 ER_INVALID_OPTION_VALUE,
174 ER(ER_INVALID_OPTION_VALUE),
175 var->getName().c_str(),
177 explanation.c_str());
179 else if (boost::get_error_info<invalid_min_info>(ex) != NULL)
181 const int64_t min_val= *(boost::get_error_info<invalid_min_info>(ex));
182 string explanation(
"(< ");
183 explanation.append(boost::lexical_cast<std::string>(min_val));
184 explanation.push_back(
')');
185 push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
186 ER_INVALID_OPTION_VALUE,
187 ER(ER_INVALID_OPTION_VALUE),
188 var->getName().c_str(),
190 explanation.c_str());
192 else if (boost::get_error_info<invalid_value>(ex) != NULL)
194 const std::string str_val= *(boost::get_error_info<invalid_value>(ex));
195 string explanation(
"(");
196 explanation.append(str_val);
197 explanation.push_back(
')');
198 push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
199 ER_INVALID_OPTION_VALUE,
200 ER(ER_INVALID_OPTION_VALUE),
201 var->getName().c_str(),
203 explanation.c_str());
207 push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
208 ER_INVALID_OPTION_VALUE,
209 ER(ER_INVALID_OPTION_VALUE),
210 var->getName().c_str(),
222 int set_var_user::check(
Session *session)
228 return (user_var_item->fix_fields(session, (
Item**) 0) ||
229 user_var_item->check(0)) ? -1 : 0;
233 int set_var_user::update(Session *)
235 user_var_item->update();
239 void set_var::setValue(
const std::string &new_value)
241 str_value= new_value;
244 void set_var::setValue(uint64_t new_value)
246 uint64_t_value= new_value;
249 void set_var::updateValue()
251 if (var->show_type() != SHOW_CHAR)
253 uint64_t_value= value->val_int();