1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
4
* Copyright (C) 2008 Sun Microsystems
6
6
* This program is free software; you can redistribute it and/or modify
7
7
* it under the terms of the GNU General Public License as published by
17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
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>
29
#include <drizzled/function/set_user_var.h>
25
#include "drizzled/session.h"
26
#include "drizzled/item/string.h"
27
#include "drizzled/sql_list.h"
31
29
using namespace std;
53
51
-1 ERROR, message not sent
56
int sql_set_variables(Session *session, const SetVarVector &var_list)
54
int sql_set_variables(Session *session, List<set_var_base> *var_list)
60
SetVarVector::const_iterator it(var_list.begin());
62
while (it != var_list.end())
57
List_iterator_fast<set_var_base> it(*var_list);
64
if ((error= (*it)->check(session)))
62
if ((error= var->check(session)))
68
65
if (!(error= test(session->is_error())))
71
while (it != var_list.end())
73
error|= (*it)->update(session); // Returns 0, -1 or 1
69
error|= var->update(session); // Returns 0, -1 or 1
79
free_underlaid_joins(session, &session->getLex()->select_lex);
73
free_underlaid_joins(session, &session->lex->select_lex);
86
80
*****************************************************************************/
87
81
set_var::set_var(sql_var_t type_arg, sys_var *var_arg,
88
82
const LEX_STRING *base_name_arg, Item *value_arg) :
83
var(var_arg), type(type_arg), base(*base_name_arg)
96
86
If the set value is a field, change it to a string to allow things like
120
108
if (var->check_type(type))
122
110
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
123
my_error(static_cast<drizzled::error_t>(err), MYF(0), var->getName().c_str());
111
my_error(err, MYF(0), var->getName().c_str());
126
114
/* value is a NULL pointer if we are using SET ... = DEFAULT */
168
156
if (var->getAfterUpdateTrigger())
169
157
(*var->getAfterUpdateTrigger())(session, type);
171
catch (invalid_option_value &ex)
159
catch (boost::exception &)
173
161
/* TODO: Fix this to be typesafe once we have properly typed set_var */
174
string new_val= boost::lexical_cast<string>(uint64_t_value);
175
if (boost::get_error_info<invalid_max_info>(ex) != NULL)
177
const uint64_t max_val= *(boost::get_error_info<invalid_max_info>(ex));
178
string explanation("(> ");
179
explanation.append(boost::lexical_cast<std::string>(max_val));
180
explanation.push_back(')');
181
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
182
ER_INVALID_OPTION_VALUE,
183
ER(ER_INVALID_OPTION_VALUE),
184
var->getName().c_str(),
186
explanation.c_str());
188
else if (boost::get_error_info<invalid_min_info>(ex) != NULL)
190
const int64_t min_val= *(boost::get_error_info<invalid_min_info>(ex));
191
string explanation("(< ");
192
explanation.append(boost::lexical_cast<std::string>(min_val));
193
explanation.push_back(')');
194
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
195
ER_INVALID_OPTION_VALUE,
196
ER(ER_INVALID_OPTION_VALUE),
197
var->getName().c_str(),
199
explanation.c_str());
201
else if (boost::get_error_info<invalid_value>(ex) != NULL)
203
const std::string str_val= *(boost::get_error_info<invalid_value>(ex));
204
string explanation("(");
205
explanation.append(str_val);
206
explanation.push_back(')');
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(),
212
explanation.c_str());
216
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
217
ER_INVALID_OPTION_VALUE,
218
ER(ER_INVALID_OPTION_VALUE),
219
var->getName().c_str(),
162
string new_val= boost::lexical_cast<string>(save_result.uint32_t_value);
163
push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
164
ER_TRUNCATED_WRONG_VALUE,
165
ER(ER_TRUNCATED_WRONG_VALUE), var->getName().c_str(),
253
void set_var::setValue(const std::string &new_value)
255
str_value= new_value;
258
void set_var::setValue(uint64_t new_value)
260
uint64_t_value= new_value;
263
void set_var::updateValue()
265
if (var->show_type() != SHOW_CHAR)
267
uint64_t_value= value->val_int();
272
197
} /* namespace drizzled */