Drizzled Public API Documentation

insert_value.cc
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
5  *
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.
9  *
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.
14  *
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
18  */
19 
20 #include <config.h>
21 #include <drizzled/error.h>
22 #include <drizzled/name_resolution_context.h>
23 #include <drizzled/table.h>
24 #include <drizzled/item/insert_value.h>
25 #include <drizzled/item/ref.h>
26 #include <drizzled/item/copy_string.h>
27 #include <drizzled/item/default_value.h>
28 #include <drizzled/field/null.h>
29 
30 namespace drizzled {
31 
32 bool Item_insert_value::eq(const Item *item, bool binary_cmp) const
33 {
34  return item->type() == INSERT_VALUE_ITEM &&
35  ((Item_default_value *)item)->arg->eq(arg, binary_cmp);
36 }
37 
39 {
40  assert(fixed == 0);
41  /* We should only check that arg is in first table */
42  if (!arg->fixed)
43  {
44  TableList *orig_next_table= context->last_name_resolution_table;
46  bool res= arg->fix_fields(session, &arg);
47  context->last_name_resolution_table= orig_next_table;
48  if (res)
49  return true;
50  }
51 
52  if (arg->type() == REF_ITEM)
53  {
54  Item_ref *ref= (Item_ref *)arg;
55  if (ref->ref[0]->type() != FIELD_ITEM)
56  {
57  my_error(ER_BAD_FIELD_ERROR, MYF(0), "", "VALUES() function");
58  return true;
59  }
60  arg= ref->ref[0];
61  }
62  /*
63  According to our SQL grammar, VALUES() function can reference
64  only to a column.
65  */
66  assert(arg->type() == FIELD_ITEM);
67 
68  Item_field *field_arg= (Item_field *)arg;
69 
70  if (field_arg->field->getTable()->insert_values.size())
71  {
72  Field *def_field= (Field*) memory::sql_alloc(field_arg->field->size_of());
73  memcpy(def_field, field_arg->field, field_arg->field->size_of());
74  def_field->move_field_offset((ptrdiff_t)
75  (&def_field->getTable()->insert_values[0] - def_field->getTable()->record[0]));
76  set_field(def_field);
77  }
78  else
79  {
80  /* charset doesn't matter here, it's to avoid sigsegv only */
81  Field* tmp_field= new Field_null(0, 0, field_arg->field->field_name);
82  tmp_field->init(field_arg->field->getTable());
83  set_field(tmp_field);
84  }
85  return false;
86 }
87 
88 
90 {
91  str->append(STRING_WITH_LEN("values("));
92  arg->print(str);
93  str->append(')');
94 }
95 
96 
97 } /* namespace drizzled */
bool fixed
Definition: item.h:120
TODO: Rename this file - func.h is stupid.
unsigned char * record[2]
Definition: table.h:139
bool fix_fields(Session *, Item **)
Definition: insert_value.cc:38
virtual void print(String *str)
Definition: item.cc:362
virtual void print(String *str)
Definition: insert_value.cc:89
bool eq(const Item *item, bool binary_cmp) const
Definition: insert_value.cc:32