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 <drizzled/session.h>
23
#include <drizzled/table.h>
24
#include <drizzled/error.h>
25
#include <drizzled/join.h>
26
#include <drizzled/sql_base.h>
27
#include <drizzled/sql_select.h>
28
#include <drizzled/item/cmpfunc.h>
29
#include <drizzled/item/field.h>
30
#include <drizzled/item/outer_ref.h>
31
#include <drizzled/plugin/client.h>
33
#include <boost/dynamic_bitset.hpp>
39
Store the pointer to this item field into a list if not already there.
41
The method is used by Item::walk to collect all unique Item_field objects
42
from a tree of Items into a set of items represented as a list.
44
Item_cond::walk() and Item_func::walk() stop the evaluation of the
45
processor function for its arguments once the processor returns
46
true.Therefore in order to force this method being called for all item
47
arguments in a condition the method must return false.
49
@param arg pointer to a List<Item_field>
52
false to force the evaluation of collect_item_field_processor
53
for the subsequent items.
56
bool Item_field::collect_item_field_processor(unsigned char *arg)
58
List<Item_field> *item_list= (List<Item_field>*) arg;
59
List_iterator<Item_field> item_list_it(*item_list);
60
Item_field *curr_item;
61
while ((curr_item= item_list_it++))
63
if (curr_item->eq(this, 1))
64
return(false); /* Already in the set. */
66
item_list->push_back(this);
72
Check if an Item_field references some field from a list of fields.
74
Check whether the Item_field represented by 'this' references any
75
of the fields in the keyparts passed via 'arg'. Used with the
76
method Item::walk() to test whether any keypart in a sequence of
77
keyparts is referenced in an expression.
79
@param arg Field being compared, arg must be of type Field
82
true if 'this' references the field 'arg'
87
bool Item_field::find_item_in_field_list_processor(unsigned char *arg)
89
KeyPartInfo *first_non_group_part= *((KeyPartInfo **) arg);
90
KeyPartInfo *last_part= *(((KeyPartInfo **) arg) + 1);
91
KeyPartInfo *cur_part;
93
for (cur_part= first_non_group_part; cur_part != last_part; cur_part++)
95
if (field->eq(cur_part->field))
103
Mark field in read_map
106
This is used by filesort to register used fields in a a temporary
107
column read set or to register used fields in a view
110
bool Item_field::register_field_in_read_map(unsigned char *arg)
112
Table *table= (Table *) arg;
113
if (field->getTable() == table || !table)
114
field->getTable()->setReadSet(field->position());
120
Item_field::Item_field(Field *f)
121
:Item_ident(0, NULL, f->getTable()->getAlias(), f->field_name),
122
item_equal(0), no_const_subst(0),
123
have_privileges(0), any_privileges(0)
127
field_name and table_name should not point to garbage
128
if this item is to be reused
130
orig_table_name= orig_field_name= "";
135
Constructor used inside setup_wild().
137
Ensures that field, table, and database names will live as long as
138
Item_field (this is important in prepared statements).
141
Item_field::Item_field(Session *,
142
Name_resolution_context *context_arg,
144
Item_ident(context_arg,
145
f->getTable()->getShare()->getSchemaName(),
146
f->getTable()->getAlias(),
157
Item_field::Item_field(Name_resolution_context *context_arg,
158
const char *db_arg,const char *table_name_arg,
159
const char *field_name_arg) :
160
Item_ident(context_arg, db_arg,table_name_arg,field_name_arg),
168
Select_Lex *select= getSession().getLex()->current_select;
169
collation.set(DERIVATION_IMPLICIT);
171
if (select && select->parsing_place != IN_HAVING)
172
select->select_n_where_fields++;
176
Constructor need to process subselect with temporary tables (see Item)
179
Item_field::Item_field(Session *session, Item_field *item) :
180
Item_ident(session, item),
182
result_field(item->result_field),
183
item_equal(item->item_equal),
184
no_const_subst(item->no_const_subst),
185
have_privileges(item->have_privileges),
186
any_privileges(item->any_privileges)
188
collation.set(DERIVATION_IMPLICIT);
191
void Item_field::set_field(Field *field_par)
193
field=result_field=field_par; // for easy coding with fields
194
maybe_null=field->maybe_null();
195
decimals= field->decimals();
196
max_length= field_par->max_display_length();
197
table_name= field_par->getTable()->getAlias();
198
field_name= field_par->field_name;
199
db_name= field_par->getTable()->getShare()->getSchemaName();
200
alias_name_used= field_par->getTable()->alias_name_used;
201
unsigned_flag=test(field_par->flags & UNSIGNED_FLAG);
202
collation.set(field_par->charset(), field_par->derivation());
208
Reset this item to point to a field from the new temporary table.
209
This is used when we create a new temporary table for each execution
210
of prepared statement.
213
void Item_field::reset_field(Field *f)
216
/* 'name' is pointing at field->field_name of old field */
217
name= (char*) f->field_name;
221
String *Item_field::val_str(String *str)
224
if ((null_value=field->is_null()))
226
str->set_charset(str_value.charset());
227
return field->val_str(str,&str_value);
231
double Item_field::val_real()
234
if ((null_value=field->is_null()))
236
return field->val_real();
240
int64_t Item_field::val_int()
243
if ((null_value=field->is_null()))
245
return field->val_int();
249
type::Decimal *Item_field::val_decimal(type::Decimal *decimal_value)
251
if ((null_value= field->is_null()))
253
return field->val_decimal(decimal_value);
257
String *Item_field::str_result(String *str)
259
if ((null_value=result_field->is_null()))
261
str->set_charset(str_value.charset());
262
return result_field->val_str(str,&str_value);
265
bool Item_field::get_date(type::Time <ime,uint32_t fuzzydate)
267
if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
275
bool Item_field::get_date_result(type::Time <ime,uint32_t fuzzydate)
277
if ((null_value=result_field->is_null()) ||
278
result_field->get_date(ltime,fuzzydate))
286
bool Item_field::get_time(type::Time <ime)
288
if ((null_value=field->is_null()) || field->get_time(ltime))
296
double Item_field::val_result()
298
if ((null_value=result_field->is_null()))
300
return result_field->val_real();
303
int64_t Item_field::val_int_result()
305
if ((null_value=result_field->is_null()))
307
return result_field->val_int();
311
type::Decimal *Item_field::val_decimal_result(type::Decimal *decimal_value)
313
if ((null_value= result_field->is_null()))
315
return result_field->val_decimal(decimal_value);
319
bool Item_field::val_bool_result()
321
if ((null_value= result_field->is_null()))
326
switch (result_field->result_type()) {
328
return result_field->val_int() != 0;
332
type::Decimal decimal_value;
333
type::Decimal *val= result_field->val_decimal(&decimal_value);
335
return not val->isZero();
341
return result_field->val_real() != 0.0;
345
return 0; // Shut up compiler
349
return 0; // Shut up compiler
353
bool Item_field::eq(const Item *item, bool) const
355
const Item *item_ptr= item->real_item();
356
if (item_ptr->type() != FIELD_ITEM)
359
const Item_field *item_field= static_cast<const Item_field *>(item_ptr);
360
if (item_field->field && field)
361
return item_field->field == field;
363
We may come here when we are trying to find a function in a GROUP BY
364
clause from the select list.
365
In this case the '100 % correct' way to do this would be to first
366
run fix_fields() on the GROUP BY item and then retry this function, but
367
I think it's better to relax the checking a bit as we will in
368
most cases do the correct thing by just checking the field name.
369
(In cases where we would choose wrong we would have to generate a
372
return (not my_strcasecmp(system_charset_info, item_field->name, field_name) &&
373
(not item_field->table_name || not table_name ||
374
(not my_strcasecmp(table_alias_charset, item_field->table_name, table_name) &&
375
(not item_field->db_name || not db_name ||
376
(item_field->db_name && not my_strcasecmp(system_charset_info, item_field->db_name, db_name))))));
380
table_map Item_field::used_tables() const
382
if (field->getTable()->const_table)
384
return 0; // const item
387
return (depended_from ? OUTER_REF_TABLE_BIT : field->getTable()->map);
390
enum Item_result Item_field::result_type () const
392
return field->result_type();
396
Item_result Item_field::cast_to_int_type() const
398
return field->cast_to_int_type();
402
enum_field_types Item_field::field_type() const
404
return field->type();
408
void Item_field::fix_after_pullout(Select_Lex *new_parent, Item **)
410
if (new_parent == depended_from)
412
Name_resolution_context *ctx= new Name_resolution_context();
413
ctx->outer_context= NULL; // We don't build a complete name resolver
414
ctx->select_lex= new_parent;
415
ctx->first_name_resolution_table= context->first_name_resolution_table;
416
ctx->last_name_resolution_table= context->last_name_resolution_table;
421
bool Item_field::is_null()
423
return field->is_null();
427
Item *Item_field::get_tmp_table_item(Session *session)
429
Item_field *new_item= new Item_field(session, this);
431
new_item->field= new_item->result_field;
435
int64_t Item_field::val_int_endpoint(bool, bool *)
437
int64_t res= val_int();
438
return null_value? INT64_MIN : res;
443
Resolve the name of an outer select column reference.
445
The method resolves the column reference represented by 'this' as a column
446
present in outer selects that contain current select.
448
In prepared statements, because of cache, find_field_in_tables()
449
can resolve fields even if they don't belong to current context.
450
In this case this method only finds appropriate context and marks
451
current select as dependent. The found reference of field should be
452
provided in 'from_field'.
454
@param[in] session current thread
455
@param[in,out] from_field found field reference or (Field*)not_found_field
456
@param[in,out] reference view column if this item was resolved to a
460
This is the inner loop of Item_field::fix_fields:
462
for each outer query Q_k beginning from the inner-most one
464
search for a column or derived column named col_ref_i
465
[in table T_j] in the FROM clause of Q_k;
467
if such a column is not found
468
Search for a column or derived column named col_ref_i
469
[in table T_j] in the SELECT and GROUP clauses of Q_k.
474
1 column succefully resolved and fix_fields() should continue.
476
0 column fully fixed and fix_fields() should return false
482
Item_field::fix_outer_field(Session *session, Field **from_field, Item **reference)
484
enum_parsing_place place= NO_MATTER;
485
bool field_found= (*from_field != not_found_field);
486
bool upward_lookup= false;
489
If there are outer contexts (outer selects, but current select is
490
not derived table or view) try to resolve this reference in the
493
We treat each subselect as a separate namespace, so that different
494
subselects may contain columns with the same names. The subselects
495
are searched starting from the innermost.
497
Name_resolution_context *last_checked_context= context;
498
Item **ref= (Item **) not_found_item;
499
Select_Lex *current_sel= (Select_Lex *) session->lex->current_select;
500
Name_resolution_context *outer_context= 0;
501
Select_Lex *select= 0;
502
/* Currently derived tables cannot be correlated */
503
if (current_sel->master_unit()->first_select()->linkage !=
505
outer_context= context->outer_context;
508
outer_context= outer_context->outer_context)
510
select= outer_context->select_lex;
511
Item_subselect *prev_subselect_item=
512
last_checked_context->select_lex->master_unit()->item;
513
last_checked_context= outer_context;
516
place= prev_subselect_item->parsing_place;
518
If outer_field is set, field was already found by first call
519
to find_field_in_tables(). Only need to find appropriate context.
521
if (field_found && outer_context->select_lex !=
522
cached_table->select_lex)
525
In case of a view, find_field_in_tables() writes the pointer to
526
the found view field into '*reference', in other words, it
527
substitutes this Item_field with the found expression.
529
if (field_found || (*from_field= find_field_in_tables(session, this,
531
first_name_resolution_table,
533
last_name_resolution_table,
535
IGNORE_EXCEPT_NON_UNIQUE,
541
if (*from_field != view_ref_found)
543
prev_subselect_item->used_tables_cache|= (*from_field)->getTable()->map;
544
prev_subselect_item->const_item_cache= false;
545
set_field(*from_field);
546
if (!last_checked_context->select_lex->having_fix_field &&
547
select->group_list.elements &&
548
(place == SELECT_LIST || place == IN_HAVING))
552
If an outer field is resolved in a grouping select then it
553
is replaced for an Item_outer_ref object. Otherwise an
554
Item_field object is used.
555
The new Item_outer_ref object is saved in the inner_refs_list of
556
the outer select. Here it is only created. It can be fixed only
557
after the original field has been fixed and this is done in the
558
fix_inner_refs() function.
561
if (!(rf= new Item_outer_ref(context, this)))
563
session->change_item_tree(reference, rf);
564
select->inner_refs_list.push_back(rf);
565
rf->in_sum_func= session->lex->in_sum_func;
568
A reference is resolved to a nest level that's outer or the same as
569
the nest level of the enclosing set function : adjust the value of
570
max_arg_level for the function if it's needed.
572
if (session->lex->in_sum_func &&
573
session->lex->in_sum_func->nest_level >= select->nest_level)
575
Item::Type ref_type= (*reference)->type();
576
set_if_bigger(session->lex->in_sum_func->max_arg_level,
578
set_field(*from_field);
580
mark_as_dependent(session, last_checked_context->select_lex,
581
context->select_lex, this,
582
((ref_type == REF_ITEM ||
583
ref_type == FIELD_ITEM) ?
584
(Item_ident*) (*reference) : 0));
590
Item::Type ref_type= (*reference)->type();
591
prev_subselect_item->used_tables_cache|=
592
(*reference)->used_tables();
593
prev_subselect_item->const_item_cache&=
594
(*reference)->const_item();
595
mark_as_dependent(session, last_checked_context->select_lex,
596
context->select_lex, this,
597
((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
598
(Item_ident*) (*reference) :
601
A reference to a view field had been found and we
602
substituted it instead of this Item (find_field_in_tables
603
does it by assigning the new value to *reference), so now
604
we can return from this function.
612
/* Search in SELECT and GROUP lists of the outer select. */
613
if (place != IN_WHERE && place != IN_ON)
615
if (!(ref= resolve_ref_in_select_and_group(session, this, select)))
616
return -1; /* Some error occurred (e.g. ambiguous names). */
617
if (ref != not_found_item)
619
assert(*ref && (*ref)->fixed);
620
prev_subselect_item->used_tables_cache|= (*ref)->used_tables();
621
prev_subselect_item->const_item_cache&= (*ref)->const_item();
627
Reference is not found in this select => this subquery depend on
628
outer select (or we just trying to find wrong identifier, in this
629
case it does not matter which used tables bits we set)
631
prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
632
prev_subselect_item->const_item_cache= false;
638
if (ref == not_found_item && *from_field == not_found_field)
642
// We can't say exactly what absent table or field
643
my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), session->where());
647
/* Call find_field_in_tables only to report the error */
648
find_field_in_tables(session, this,
649
context->first_name_resolution_table,
650
context->last_name_resolution_table,
651
reference, REPORT_ALL_ERRORS, true);
655
else if (ref != not_found_item)
660
/* Should have been checked in resolve_ref_in_select_and_group(). */
661
assert(*ref && (*ref)->fixed);
663
Here, a subset of actions performed by Item_ref::set_properties
664
is not enough. So we pass ptr to NULL into Item_[direct]_ref
665
constructor, so no initialization is performed, and call
669
*ref= NULL; // Don't call set_properties()
670
rf= (place == IN_HAVING ?
671
new Item_ref(context, ref, (char*) table_name,
672
(char*) field_name, alias_name_used) :
673
(!select->group_list.elements ?
674
new Item_direct_ref(context, ref, (char*) table_name,
675
(char*) field_name, alias_name_used) :
676
new Item_outer_ref(context, ref, (char*) table_name,
677
(char*) field_name, alias_name_used)));
682
if (place != IN_HAVING && select->group_list.elements)
684
outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf);
685
((Item_outer_ref*)rf)->in_sum_func= session->lex->in_sum_func;
687
session->change_item_tree(reference, rf);
689
rf is Item_ref => never substitute other items (in this case)
690
during fix_fields() => we can use rf after fix_fields()
692
assert(!rf->fixed); // Assured by Item_ref()
693
if (rf->fix_fields(session, reference) || rf->check_cols(1))
696
mark_as_dependent(session, last_checked_context->select_lex,
697
context->select_lex, this,
703
mark_as_dependent(session, last_checked_context->select_lex,
705
this, (Item_ident*)*reference);
706
if (last_checked_context->select_lex->having_fix_field)
709
rf= new Item_ref(context,
710
(cached_table->getSchemaName()[0] ? cached_table->getSchemaName() : 0),
711
(char*) cached_table->alias, (char*) field_name);
714
session->change_item_tree(reference, rf);
716
rf is Item_ref => never substitute other items (in this case)
717
during fix_fields() => we can use rf after fix_fields()
719
assert(!rf->fixed); // Assured by Item_ref()
720
if (rf->fix_fields(session, reference) || rf->check_cols(1))
730
Resolve the name of a column reference.
732
The method resolves the column reference represented by 'this' as a column
733
present in one of: FROM clause, SELECT clause, GROUP BY clause of a query
734
Q, or in outer queries that contain Q.
736
The name resolution algorithm used is (where [T_j] is an optional table
737
name that qualifies the column name):
740
resolve_column_reference([T_j].col_ref_i)
742
search for a column or derived column named col_ref_i
743
[in table T_j] in the FROM clause of Q;
745
if such a column is NOT found AND // Lookup in outer queries.
746
there are outer queries
748
for each outer query Q_k beginning from the inner-most one
750
search for a column or derived column named col_ref_i
751
[in table T_j] in the FROM clause of Q_k;
753
if such a column is not found
754
Search for a column or derived column named col_ref_i
755
[in table T_j] in the SELECT and GROUP clauses of Q_k.
761
Notice that compared to Item_ref::fix_fields, here we first search the FROM
762
clause, and then we search the SELECT and GROUP BY clauses.
764
@param[in] session current thread
765
@param[in,out] reference view column if this item was resolved to a
774
bool Item_field::fix_fields(Session *session, Item **reference)
777
Field *from_field= (Field *)not_found_field;
778
bool outer_fixed= false;
780
if (!field) // If field is not checked
783
In case of view, find_field_in_tables() write pointer to view field
784
expression to 'reference', i.e. it substitute that expression instead
787
if ((from_field= find_field_in_tables(session, this,
788
context->first_name_resolution_table,
789
context->last_name_resolution_table,
791
session->lex->use_only_table_context ?
793
IGNORE_EXCEPT_NON_UNIQUE, true)) ==
797
/* Look up in current select's item_list to find aliased fields */
798
if (session->lex->current_select->is_item_list_lookup)
801
enum_resolution_type resolution;
802
Item** res= find_item_in_list(session,
803
this, session->lex->current_select->item_list,
804
&counter, REPORT_EXCEPT_NOT_FOUND,
808
if (resolution == RESOLVED_AGAINST_ALIAS)
809
alias_name_used= true;
810
if (res != (Item **)not_found_item)
812
if ((*res)->type() == Item::FIELD_ITEM)
815
It's an Item_field referencing another Item_field in the select
817
Use the field from the Item_field in the select list and leave
818
the Item_field instance in place.
821
Field *new_field= (*((Item_field**)res))->field;
823
if (new_field == NULL)
825
/* The column to which we link isn't valid. */
826
my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name,
831
set_field(new_field);
837
It's not an Item_field in the select list so we must make a new
838
Item_ref to point to the Item in the select list and replace the
839
Item_field created by the parser with the new Item_ref.
841
Item_ref *rf= new Item_ref(context, db_name,table_name,field_name);
844
session->change_item_tree(reference, rf);
846
Because Item_ref never substitutes itself with other items
847
in Item_ref::fix_fields(), we can safely use the original
848
pointer to it even after fix_fields()
850
return rf->fix_fields(session, reference) || rf->check_cols(1);
854
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
858
goto mark_non_agg_field;
860
else if (!from_field)
863
if (!outer_fixed && cached_table && cached_table->select_lex &&
864
context->select_lex &&
865
cached_table->select_lex != context->select_lex)
868
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
872
goto mark_non_agg_field;
876
if it is not expression from merged VIEW we will set this field.
878
We can leave expression substituted from view for next PS/SP rexecution
879
(i.e. do not register this substitution for reverting on cleanup()
880
(register_item_tree_changing())), because this subtree will be
881
fix_field'ed during setup_tables()->setup_underlying() (i.e. before
882
all other expressions of query, and references on tables which do
883
not present in query will not make problems.
885
Also we suppose that view can't be changed during PS/SP life.
887
if (from_field == view_ref_found)
890
set_field(from_field);
891
if (session->lex->in_sum_func &&
892
session->lex->in_sum_func->nest_level ==
893
session->lex->current_select->nest_level)
895
set_if_bigger(session->lex->in_sum_func->max_arg_level,
896
session->lex->current_select->nest_level);
899
else if (session->mark_used_columns != MARK_COLUMNS_NONE)
901
Table *table= field->getTable();
902
boost::dynamic_bitset<> *current_bitmap, *other_bitmap;
903
if (session->mark_used_columns == MARK_COLUMNS_READ)
905
current_bitmap= table->read_set;
906
other_bitmap= table->write_set;
910
current_bitmap= table->write_set;
911
other_bitmap= table->read_set;
913
//if (! current_bitmap->testAndSet(field->position()))
914
if (! current_bitmap->test(field->position()))
916
if (! other_bitmap->test(field->position()))
918
/* First usage of column */
919
table->used_fields++; // Used to optimize loops
920
table->covering_keys&= field->part_of_key;
929
context->process_error(session);
933
Item *Item_field::safe_charset_converter(const CHARSET_INFO * const tocs)
936
return Item::safe_charset_converter(tocs);
940
void Item_field::cleanup()
942
Item_ident::cleanup();
944
Even if this object was created by direct link to field in setup_wild()
945
it will be linked correctly next time by name of field and table alias.
946
I.e. we can drop 'field'.
948
field= result_field= 0;
954
bool Item_field::result_as_int64_t()
956
return field->can_be_compared_as_int64_t();
961
Find a field among specified multiple equalities.
963
The function first searches the field among multiple equalities
964
of the current level (in the cond_equal->current_level list).
965
If it fails, it continues searching in upper levels accessed
966
through a pointer cond_equal->upper_levels.
967
The search terminates as soon as a multiple equality containing
970
@param cond_equal reference to list of multiple equalities where
971
the field (this object) is to be looked for
974
- First Item_equal containing the field, if success
978
Item_equal *Item_field::find_item_equal(COND_EQUAL *cond_equal)
983
List_iterator_fast<Item_equal> li(cond_equal->current_level);
986
if (item->contains(field))
990
The field is not found in any of the multiple equalities
991
of the current level. Look for it in upper levels
993
cond_equal= cond_equal->upper_levels;
1000
Check whether a field can be substituted by an equal item.
1002
The function checks whether a substitution of the field
1003
occurrence for an equal item is valid.
1005
@param arg *arg != NULL <-> the field is in the context where
1006
substitution for an equal item is valid
1009
The following statement is not always true:
1013
This means substitution of an item for an equal item not always
1014
yields an equavalent condition. Here's an example:
1017
(LENGTH('a')=1) != (LENGTH('a ')=2)
1019
Such a substitution is surely valid if either the substituted
1020
field is not of a STRING type or if it is an argument of
1021
a comparison predicate.
1024
true substitution is valid
1029
bool Item_field::subst_argument_checker(unsigned char **arg)
1031
return (result_type() != STRING_RESULT) || (*arg);
1036
Set a pointer to the multiple equality the field reference belongs to
1039
The function looks for a multiple equality containing the field item
1040
among those referenced by arg.
1041
In the case such equality exists the function does the following.
1042
If the found multiple equality contains a constant, then the field
1043
reference is substituted for this constant, otherwise it sets a pointer
1044
to the multiple equality in the field item.
1047
@param arg reference to list of multiple equalities where
1048
the field (this object) is to be looked for
1051
This function is supposed to be called as a callback parameter in calls
1052
of the compile method.
1055
- pointer to the replacing constant item, if the field item was substituted
1056
- pointer to the field item, otherwise.
1059
Item *Item_field::equal_fields_propagator(unsigned char *arg)
1063
item_equal= find_item_equal((COND_EQUAL *) arg);
1066
item= item_equal->get_const();
1068
Disable const propagation for items used in different comparison contexts.
1069
This must be done because, for example, Item_hex_string->val_int() is not
1070
the same as (Item_hex_string->val_str() in BINARY column)->val_int().
1071
We cannot simply disable the replacement in a particular context (
1072
e.g. <bin_col> = <int_col> AND <bin_col> = <hex_string>) since
1073
Items don't know the context they are in and there are functions like
1074
IF (<hex_string>, 'yes', 'no').
1075
The same problem occurs when comparing a DATE/TIME field with a
1076
DATE/TIME represented as an int and as a string.
1079
(cmp_context != (Item_result)-1 && item->cmp_context != cmp_context))
1087
Mark the item to not be part of substitution if it's not a binary item.
1089
See comments in Arg_comparator::set_compare_func() for details.
1092
bool Item_field::set_no_const_sub(unsigned char *)
1094
if (field->charset() != &my_charset_bin)
1101
Replace an Item_field for an equal Item_field that evaluated earlier
1104
The function returns a pointer to an item that is taken from
1105
the very beginning of the item_equal list which the Item_field
1106
object refers to (belongs to) unless item_equal contains a constant
1107
item. In this case the function returns this constant item,
1108
(if the substitution does not require conversion).
1109
If the Item_field object does not refer any Item_equal object
1110
'this' is returned .
1112
@param arg a dummy parameter, is not used here
1116
This function is supposed to be called as a callback parameter in calls
1117
of the thransformer method.
1120
- pointer to a replacement Item_field if there is a better equal item or
1121
a pointer to a constant equal item;
1125
Item *Item_field::replace_equal_field(unsigned char *)
1129
Item *const_item_ptr= item_equal->get_const();
1132
if (cmp_context != (Item_result)-1 &&
1133
const_item_ptr->cmp_context != cmp_context)
1135
return const_item_ptr;
1137
Item_field *subst= item_equal->get_first();
1138
if (subst && !field->eq(subst->field))
1145
uint32_t Item_field::max_disp_length()
1147
return field->max_display_length();
1152
void Item_field::make_field(SendField *tmp_field)
1154
field->make_field(tmp_field);
1155
assert(tmp_field->table_name != 0);
1157
tmp_field->col_name=name; // Use user supplied name
1159
tmp_field->table_name= table_name;
1161
tmp_field->db_name= db_name;
1166
Set a field's value from a item.
1169
void Item_field::save_org_in_field(Field *to)
1171
if (field->is_null())
1174
set_field_to_null_with_conversions(to, 1);
1179
field_conv(to,field);
1184
int Item_field::save_in_field(Field *to, bool no_conversions)
1187
if (result_field->is_null())
1190
res= set_field_to_null_with_conversions(to, no_conversions);
1195
res= field_conv(to,result_field);
1202
bool Item_field::send(plugin::Client *client, String *)
1204
return client->store(result_field);
1208
void Item_field::update_null_value()
1211
need to set no_errors to prevent warnings about type conversion
1214
Session *session= field->getTable()->in_use;
1217
no_errors= session->no_errors;
1218
session->no_errors= 1;
1219
Item::update_null_value();
1220
session->no_errors= no_errors;
1225
Add the field to the select list and substitute it for the reference to
1229
Item_field::update_value_transformer()
1230
select_arg current select
1233
If the field doesn't belong to the table being inserted into then it is
1234
added to the select list, pointer to it is stored in the ref_pointer_array
1235
of the select and the field itself is substituted for the Item_ref object.
1236
This is done in order to get correct values from update fields that
1237
belongs to the SELECT part in the INSERT .. SELECT .. ON DUPLICATE KEY
1242
ref if all conditions are met
1243
this field otherwise
1246
Item *Item_field::update_value_transformer(unsigned char *select_arg)
1248
Select_Lex *select= (Select_Lex*)select_arg;
1251
if (field->getTable() != select->context.table_list->table)
1253
List<Item> *all_fields= &select->join->all_fields;
1254
Item **ref_pointer_array= select->ref_pointer_array;
1255
int el= all_fields->elements;
1258
ref_pointer_array[el]= (Item*)this;
1259
all_fields->push_front((Item*)this);
1260
ref= new Item_ref(&select->context, ref_pointer_array + el,
1261
table_name, field_name);
1268
void Item_field::print(String *str, enum_query_type query_type)
1270
if (field && field->getTable()->const_table)
1272
char buff[MAX_FIELD_WIDTH];
1273
String tmp(buff,sizeof(buff),str->charset());
1274
field->val_str_internal(&tmp);
1275
if (field->is_null()) {
1276
str->append("NULL");
1285
Item_ident::print(str, query_type);
1289
} /* namespace drizzled */