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
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/sql_base.h>
26
#include <drizzled/sql_select.h>
27
#include <drizzled/item/cmpfunc.h>
28
#include <drizzled/item/field.h>
29
#include <drizzled/item/outer_ref.h>
30
#include <drizzled/plugin/client.h>
32
using namespace drizzled;
35
Store the pointer to this item field into a list if not already there.
37
The method is used by Item::walk to collect all unique Item_field objects
38
from a tree of Items into a set of items represented as a list.
40
Item_cond::walk() and Item_func::walk() stop the evaluation of the
41
processor function for its arguments once the processor returns
42
true.Therefore in order to force this method being called for all item
43
arguments in a condition the method must return false.
45
@param arg pointer to a List<Item_field>
48
false to force the evaluation of collect_item_field_processor
49
for the subsequent items.
52
bool Item_field::collect_item_field_processor(unsigned char *arg)
54
List<Item_field> *item_list= (List<Item_field>*) arg;
55
List_iterator<Item_field> item_list_it(*item_list);
56
Item_field *curr_item;
57
while ((curr_item= item_list_it++))
59
if (curr_item->eq(this, 1))
60
return(false); /* Already in the set. */
62
item_list->push_back(this);
68
Check if an Item_field references some field from a list of fields.
70
Check whether the Item_field represented by 'this' references any
71
of the fields in the keyparts passed via 'arg'. Used with the
72
method Item::walk() to test whether any keypart in a sequence of
73
keyparts is referenced in an expression.
75
@param arg Field being compared, arg must be of type Field
78
true if 'this' references the field 'arg'
83
bool Item_field::find_item_in_field_list_processor(unsigned char *arg)
85
KEY_PART_INFO *first_non_group_part= *((KEY_PART_INFO **) arg);
86
KEY_PART_INFO *last_part= *(((KEY_PART_INFO **) arg) + 1);
87
KEY_PART_INFO *cur_part;
89
for (cur_part= first_non_group_part; cur_part != last_part; cur_part++)
91
if (field->eq(cur_part->field))
99
Mark field in read_map
102
This is used by filesort to register used fields in a a temporary
103
column read set or to register used fields in a view
106
bool Item_field::register_field_in_read_map(unsigned char *arg)
108
Table *table= (Table *) arg;
109
if (field->table == table || !table)
110
field->table->setReadSet(field->field_index);
116
Item_field::Item_field(Field *f)
117
:Item_ident(0, NULL, *f->table_name, f->field_name),
118
item_equal(0), no_const_subst(0),
119
have_privileges(0), any_privileges(0)
123
field_name and table_name should not point to garbage
124
if this item is to be reused
126
orig_table_name= orig_field_name= "";
131
Constructor used inside setup_wild().
133
Ensures that field, table, and database names will live as long as
134
Item_field (this is important in prepared statements).
137
Item_field::Item_field(Session *, Name_resolution_context *context_arg,
139
:Item_ident(context_arg, f->table->s->db.str, *f->table_name, f->field_name),
140
item_equal(0), no_const_subst(0),
141
have_privileges(0), any_privileges(0)
147
Item_field::Item_field(Name_resolution_context *context_arg,
148
const char *db_arg,const char *table_name_arg,
149
const char *field_name_arg)
150
:Item_ident(context_arg, db_arg,table_name_arg,field_name_arg),
151
field(0), result_field(0), item_equal(0), no_const_subst(0),
152
have_privileges(0), any_privileges(0)
154
Select_Lex *select= current_session->lex->current_select;
155
collation.set(DERIVATION_IMPLICIT);
156
if (select && select->parsing_place != IN_HAVING)
157
select->select_n_where_fields++;
161
Constructor need to process subselect with temporary tables (see Item)
164
Item_field::Item_field(Session *session, Item_field *item)
165
:Item_ident(session, item),
167
result_field(item->result_field),
168
item_equal(item->item_equal),
169
no_const_subst(item->no_const_subst),
170
have_privileges(item->have_privileges),
171
any_privileges(item->any_privileges)
173
collation.set(DERIVATION_IMPLICIT);
176
void Item_field::set_field(Field *field_par)
178
field=result_field=field_par; // for easy coding with fields
179
maybe_null=field->maybe_null();
180
decimals= field->decimals();
181
max_length= field_par->max_display_length();
182
table_name= *field_par->table_name;
183
field_name= field_par->field_name;
184
db_name= field_par->table->s->db.str;
185
alias_name_used= field_par->table->alias_name_used;
186
unsigned_flag=test(field_par->flags & UNSIGNED_FLAG);
187
collation.set(field_par->charset(), field_par->derivation());
189
if (field->table->s->tmp_table == SYSTEM_TMP_TABLE)
195
Reset this item to point to a field from the new temporary table.
196
This is used when we create a new temporary table for each execution
197
of prepared statement.
200
void Item_field::reset_field(Field *f)
203
/* 'name' is pointing at field->field_name of old field */
204
name= (char*) f->field_name;
208
String *Item_field::val_str(String *str)
211
if ((null_value=field->is_null()))
213
str->set_charset(str_value.charset());
214
return field->val_str(str,&str_value);
218
double Item_field::val_real()
221
if ((null_value=field->is_null()))
223
return field->val_real();
227
int64_t Item_field::val_int()
230
if ((null_value=field->is_null()))
232
return field->val_int();
236
my_decimal *Item_field::val_decimal(my_decimal *decimal_value)
238
if ((null_value= field->is_null()))
240
return field->val_decimal(decimal_value);
244
String *Item_field::str_result(String *str)
246
if ((null_value=result_field->is_null()))
248
str->set_charset(str_value.charset());
249
return result_field->val_str(str,&str_value);
252
bool Item_field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
254
if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
256
memset(ltime, 0, sizeof(*ltime));
262
bool Item_field::get_date_result(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
264
if ((null_value=result_field->is_null()) ||
265
result_field->get_date(ltime,fuzzydate))
267
memset(ltime, 0, sizeof(*ltime));
273
bool Item_field::get_time(DRIZZLE_TIME *ltime)
275
if ((null_value=field->is_null()) || field->get_time(ltime))
277
memset(ltime, 0, sizeof(*ltime));
283
double Item_field::val_result()
285
if ((null_value=result_field->is_null()))
287
return result_field->val_real();
290
int64_t Item_field::val_int_result()
292
if ((null_value=result_field->is_null()))
294
return result_field->val_int();
298
my_decimal *Item_field::val_decimal_result(my_decimal *decimal_value)
300
if ((null_value= result_field->is_null()))
302
return result_field->val_decimal(decimal_value);
306
bool Item_field::val_bool_result()
308
if ((null_value= result_field->is_null()))
310
switch (result_field->result_type()) {
312
return result_field->val_int() != 0;
315
my_decimal decimal_value;
316
my_decimal *val= result_field->val_decimal(&decimal_value);
318
return !my_decimal_is_zero(val);
323
return result_field->val_real() != 0.0;
327
return 0; // Shut up compiler
332
bool Item_field::eq(const Item *item, bool) const
334
const Item *item_ptr= item->real_item();
335
if (item_ptr->type() != FIELD_ITEM)
338
const Item_field *item_field= static_cast<const Item_field *>(item_ptr);
339
if (item_field->field && field)
340
return item_field->field == field;
342
We may come here when we are trying to find a function in a GROUP BY
343
clause from the select list.
344
In this case the '100 % correct' way to do this would be to first
345
run fix_fields() on the GROUP BY item and then retry this function, but
346
I think it's better to relax the checking a bit as we will in
347
most cases do the correct thing by just checking the field name.
348
(In cases where we would choose wrong we would have to generate a
351
return (!my_strcasecmp(system_charset_info, item_field->name,
353
(!item_field->table_name || !table_name ||
354
(!my_strcasecmp(table_alias_charset, item_field->table_name,
356
(!item_field->db_name || !db_name ||
357
(item_field->db_name && !strcmp(item_field->db_name,
362
table_map Item_field::used_tables() const
364
if (field->table->const_table)
365
return 0; // const item
366
return (depended_from ? OUTER_REF_TABLE_BIT : field->table->map);
369
enum Item_result Item_field::result_type () const
371
return field->result_type();
375
Item_result Item_field::cast_to_int_type() const
377
return field->cast_to_int_type();
381
enum_field_types Item_field::field_type() const
383
return field->type();
387
void Item_field::fix_after_pullout(Select_Lex *new_parent, Item **)
389
if (new_parent == depended_from)
391
Name_resolution_context *ctx= new Name_resolution_context();
392
ctx->outer_context= NULL; // We don't build a complete name resolver
393
ctx->select_lex= new_parent;
394
ctx->first_name_resolution_table= context->first_name_resolution_table;
395
ctx->last_name_resolution_table= context->last_name_resolution_table;
400
bool Item_field::is_null()
402
return field->is_null();
406
Item *Item_field::get_tmp_table_item(Session *session)
408
Item_field *new_item= new Item_field(session, this);
410
new_item->field= new_item->result_field;
414
int64_t Item_field::val_int_endpoint(bool, bool *)
416
int64_t res= val_int();
417
return null_value? INT64_MIN : res;
422
Resolve the name of an outer select column reference.
424
The method resolves the column reference represented by 'this' as a column
425
present in outer selects that contain current select.
427
In prepared statements, because of cache, find_field_in_tables()
428
can resolve fields even if they don't belong to current context.
429
In this case this method only finds appropriate context and marks
430
current select as dependent. The found reference of field should be
431
provided in 'from_field'.
433
@param[in] session current thread
434
@param[in,out] from_field found field reference or (Field*)not_found_field
435
@param[in,out] reference view column if this item was resolved to a
439
This is the inner loop of Item_field::fix_fields:
441
for each outer query Q_k beginning from the inner-most one
443
search for a column or derived column named col_ref_i
444
[in table T_j] in the FROM clause of Q_k;
446
if such a column is not found
447
Search for a column or derived column named col_ref_i
448
[in table T_j] in the SELECT and GROUP clauses of Q_k.
453
1 column succefully resolved and fix_fields() should continue.
455
0 column fully fixed and fix_fields() should return false
461
Item_field::fix_outer_field(Session *session, Field **from_field, Item **reference)
463
enum_parsing_place place= NO_MATTER;
464
bool field_found= (*from_field != not_found_field);
465
bool upward_lookup= false;
468
If there are outer contexts (outer selects, but current select is
469
not derived table or view) try to resolve this reference in the
472
We treat each subselect as a separate namespace, so that different
473
subselects may contain columns with the same names. The subselects
474
are searched starting from the innermost.
476
Name_resolution_context *last_checked_context= context;
477
Item **ref= (Item **) not_found_item;
478
Select_Lex *current_sel= (Select_Lex *) session->lex->current_select;
479
Name_resolution_context *outer_context= 0;
480
Select_Lex *select= 0;
481
/* Currently derived tables cannot be correlated */
482
if (current_sel->master_unit()->first_select()->linkage !=
484
outer_context= context->outer_context;
487
outer_context= outer_context->outer_context)
489
select= outer_context->select_lex;
490
Item_subselect *prev_subselect_item=
491
last_checked_context->select_lex->master_unit()->item;
492
last_checked_context= outer_context;
495
place= prev_subselect_item->parsing_place;
497
If outer_field is set, field was already found by first call
498
to find_field_in_tables(). Only need to find appropriate context.
500
if (field_found && outer_context->select_lex !=
501
cached_table->select_lex)
504
In case of a view, find_field_in_tables() writes the pointer to
505
the found view field into '*reference', in other words, it
506
substitutes this Item_field with the found expression.
508
if (field_found || (*from_field= find_field_in_tables(session, this,
510
first_name_resolution_table,
512
last_name_resolution_table,
514
IGNORE_EXCEPT_NON_UNIQUE,
520
if (*from_field != view_ref_found)
522
prev_subselect_item->used_tables_cache|= (*from_field)->table->map;
523
prev_subselect_item->const_item_cache= 0;
524
set_field(*from_field);
525
if (!last_checked_context->select_lex->having_fix_field &&
526
select->group_list.elements &&
527
(place == SELECT_LIST || place == IN_HAVING))
531
If an outer field is resolved in a grouping select then it
532
is replaced for an Item_outer_ref object. Otherwise an
533
Item_field object is used.
534
The new Item_outer_ref object is saved in the inner_refs_list of
535
the outer select. Here it is only created. It can be fixed only
536
after the original field has been fixed and this is done in the
537
fix_inner_refs() function.
540
if (!(rf= new Item_outer_ref(context, this)))
542
session->change_item_tree(reference, rf);
543
select->inner_refs_list.push_back(rf);
544
rf->in_sum_func= session->lex->in_sum_func;
547
A reference is resolved to a nest level that's outer or the same as
548
the nest level of the enclosing set function : adjust the value of
549
max_arg_level for the function if it's needed.
551
if (session->lex->in_sum_func &&
552
session->lex->in_sum_func->nest_level >= select->nest_level)
554
Item::Type ref_type= (*reference)->type();
555
set_if_bigger(session->lex->in_sum_func->max_arg_level,
557
set_field(*from_field);
559
mark_as_dependent(session, last_checked_context->select_lex,
560
context->select_lex, this,
561
((ref_type == REF_ITEM ||
562
ref_type == FIELD_ITEM) ?
563
(Item_ident*) (*reference) : 0));
569
Item::Type ref_type= (*reference)->type();
570
prev_subselect_item->used_tables_cache|=
571
(*reference)->used_tables();
572
prev_subselect_item->const_item_cache&=
573
(*reference)->const_item();
574
mark_as_dependent(session, last_checked_context->select_lex,
575
context->select_lex, this,
576
((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
577
(Item_ident*) (*reference) :
580
A reference to a view field had been found and we
581
substituted it instead of this Item (find_field_in_tables
582
does it by assigning the new value to *reference), so now
583
we can return from this function.
591
/* Search in SELECT and GROUP lists of the outer select. */
592
if (place != IN_WHERE && place != IN_ON)
594
if (!(ref= resolve_ref_in_select_and_group(session, this, select)))
595
return -1; /* Some error occurred (e.g. ambiguous names). */
596
if (ref != not_found_item)
598
assert(*ref && (*ref)->fixed);
599
prev_subselect_item->used_tables_cache|= (*ref)->used_tables();
600
prev_subselect_item->const_item_cache&= (*ref)->const_item();
606
Reference is not found in this select => this subquery depend on
607
outer select (or we just trying to find wrong identifier, in this
608
case it does not matter which used tables bits we set)
610
prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
611
prev_subselect_item->const_item_cache= 0;
617
if (ref == not_found_item && *from_field == not_found_field)
621
// We can't say exactly what absent table or field
622
my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), session->where);
626
/* Call find_field_in_tables only to report the error */
627
find_field_in_tables(session, this,
628
context->first_name_resolution_table,
629
context->last_name_resolution_table,
630
reference, REPORT_ALL_ERRORS, true);
634
else if (ref != not_found_item)
639
/* Should have been checked in resolve_ref_in_select_and_group(). */
640
assert(*ref && (*ref)->fixed);
642
Here, a subset of actions performed by Item_ref::set_properties
643
is not enough. So we pass ptr to NULL into Item_[direct]_ref
644
constructor, so no initialization is performed, and call
648
*ref= NULL; // Don't call set_properties()
649
rf= (place == IN_HAVING ?
650
new Item_ref(context, ref, (char*) table_name,
651
(char*) field_name, alias_name_used) :
652
(!select->group_list.elements ?
653
new Item_direct_ref(context, ref, (char*) table_name,
654
(char*) field_name, alias_name_used) :
655
new Item_outer_ref(context, ref, (char*) table_name,
656
(char*) field_name, alias_name_used)));
661
if (place != IN_HAVING && select->group_list.elements)
663
outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf);
664
((Item_outer_ref*)rf)->in_sum_func= session->lex->in_sum_func;
666
session->change_item_tree(reference, rf);
668
rf is Item_ref => never substitute other items (in this case)
669
during fix_fields() => we can use rf after fix_fields()
671
assert(!rf->fixed); // Assured by Item_ref()
672
if (rf->fix_fields(session, reference) || rf->check_cols(1))
675
mark_as_dependent(session, last_checked_context->select_lex,
676
context->select_lex, this,
682
mark_as_dependent(session, last_checked_context->select_lex,
684
this, (Item_ident*)*reference);
685
if (last_checked_context->select_lex->having_fix_field)
688
rf= new Item_ref(context,
689
(cached_table->db[0] ? cached_table->db : 0),
690
(char*) cached_table->alias, (char*) field_name);
693
session->change_item_tree(reference, rf);
695
rf is Item_ref => never substitute other items (in this case)
696
during fix_fields() => we can use rf after fix_fields()
698
assert(!rf->fixed); // Assured by Item_ref()
699
if (rf->fix_fields(session, reference) || rf->check_cols(1))
709
Resolve the name of a column reference.
711
The method resolves the column reference represented by 'this' as a column
712
present in one of: FROM clause, SELECT clause, GROUP BY clause of a query
713
Q, or in outer queries that contain Q.
715
The name resolution algorithm used is (where [T_j] is an optional table
716
name that qualifies the column name):
719
resolve_column_reference([T_j].col_ref_i)
721
search for a column or derived column named col_ref_i
722
[in table T_j] in the FROM clause of Q;
724
if such a column is NOT found AND // Lookup in outer queries.
725
there are outer queries
727
for each outer query Q_k beginning from the inner-most one
729
search for a column or derived column named col_ref_i
730
[in table T_j] in the FROM clause of Q_k;
732
if such a column is not found
733
Search for a column or derived column named col_ref_i
734
[in table T_j] in the SELECT and GROUP clauses of Q_k.
740
Notice that compared to Item_ref::fix_fields, here we first search the FROM
741
clause, and then we search the SELECT and GROUP BY clauses.
743
@param[in] session current thread
744
@param[in,out] reference view column if this item was resolved to a
753
bool Item_field::fix_fields(Session *session, Item **reference)
756
Field *from_field= (Field *)not_found_field;
757
bool outer_fixed= false;
759
if (!field) // If field is not checked
762
In case of view, find_field_in_tables() write pointer to view field
763
expression to 'reference', i.e. it substitute that expression instead
766
if ((from_field= find_field_in_tables(session, this,
767
context->first_name_resolution_table,
768
context->last_name_resolution_table,
770
session->lex->use_only_table_context ?
772
IGNORE_EXCEPT_NON_UNIQUE, true)) ==
776
/* Look up in current select's item_list to find aliased fields */
777
if (session->lex->current_select->is_item_list_lookup)
780
enum_resolution_type resolution;
781
Item** res= find_item_in_list(this, session->lex->current_select->item_list,
782
&counter, REPORT_EXCEPT_NOT_FOUND,
786
if (resolution == RESOLVED_AGAINST_ALIAS)
787
alias_name_used= true;
788
if (res != (Item **)not_found_item)
790
if ((*res)->type() == Item::FIELD_ITEM)
793
It's an Item_field referencing another Item_field in the select
795
Use the field from the Item_field in the select list and leave
796
the Item_field instance in place.
799
Field *new_field= (*((Item_field**)res))->field;
801
if (new_field == NULL)
803
/* The column to which we link isn't valid. */
804
my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name,
805
current_session->where);
809
set_field(new_field);
815
It's not an Item_field in the select list so we must make a new
816
Item_ref to point to the Item in the select list and replace the
817
Item_field created by the parser with the new Item_ref.
819
Item_ref *rf= new Item_ref(context, db_name,table_name,field_name);
822
session->change_item_tree(reference, rf);
824
Because Item_ref never substitutes itself with other items
825
in Item_ref::fix_fields(), we can safely use the original
826
pointer to it even after fix_fields()
828
return rf->fix_fields(session, reference) || rf->check_cols(1);
832
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
836
goto mark_non_agg_field;
838
else if (!from_field)
841
if (!outer_fixed && cached_table && cached_table->select_lex &&
842
context->select_lex &&
843
cached_table->select_lex != context->select_lex)
846
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
850
goto mark_non_agg_field;
854
if it is not expression from merged VIEW we will set this field.
856
We can leave expression substituted from view for next PS/SP rexecution
857
(i.e. do not register this substitution for reverting on cleanup()
858
(register_item_tree_changing())), because this subtree will be
859
fix_field'ed during setup_tables()->setup_underlying() (i.e. before
860
all other expressions of query, and references on tables which do
861
not present in query will not make problems.
863
Also we suppose that view can't be changed during PS/SP life.
865
if (from_field == view_ref_found)
868
set_field(from_field);
869
if (session->lex->in_sum_func &&
870
session->lex->in_sum_func->nest_level ==
871
session->lex->current_select->nest_level)
873
set_if_bigger(session->lex->in_sum_func->max_arg_level,
874
session->lex->current_select->nest_level);
877
else if (session->mark_used_columns != MARK_COLUMNS_NONE)
879
Table *table= field->table;
880
MyBitmap *current_bitmap, *other_bitmap;
881
if (session->mark_used_columns == MARK_COLUMNS_READ)
883
current_bitmap= table->read_set;
884
other_bitmap= table->write_set;
888
current_bitmap= table->write_set;
889
other_bitmap= table->read_set;
891
if (! current_bitmap->testAndSet(field->field_index))
893
if (! other_bitmap->isBitSet(field->field_index))
895
/* First usage of column */
896
table->used_fields++; // Used to optimize loops
897
table->covering_keys&= field->part_of_key;
906
context->process_error(session);
910
Item *Item_field::safe_charset_converter(const CHARSET_INFO * const tocs)
913
return Item::safe_charset_converter(tocs);
917
void Item_field::cleanup()
919
Item_ident::cleanup();
921
Even if this object was created by direct link to field in setup_wild()
922
it will be linked correctly next time by name of field and table alias.
923
I.e. we can drop 'field'.
925
field= result_field= 0;
931
bool Item_field::result_as_int64_t()
933
return field->can_be_compared_as_int64_t();
938
Find a field among specified multiple equalities.
940
The function first searches the field among multiple equalities
941
of the current level (in the cond_equal->current_level list).
942
If it fails, it continues searching in upper levels accessed
943
through a pointer cond_equal->upper_levels.
944
The search terminates as soon as a multiple equality containing
947
@param cond_equal reference to list of multiple equalities where
948
the field (this object) is to be looked for
951
- First Item_equal containing the field, if success
955
Item_equal *Item_field::find_item_equal(COND_EQUAL *cond_equal)
960
List_iterator_fast<Item_equal> li(cond_equal->current_level);
963
if (item->contains(field))
967
The field is not found in any of the multiple equalities
968
of the current level. Look for it in upper levels
970
cond_equal= cond_equal->upper_levels;
977
Check whether a field can be substituted by an equal item.
979
The function checks whether a substitution of the field
980
occurrence for an equal item is valid.
982
@param arg *arg != NULL <-> the field is in the context where
983
substitution for an equal item is valid
986
The following statement is not always true:
990
This means substitution of an item for an equal item not always
991
yields an equavalent condition. Here's an example:
994
(LENGTH('a')=1) != (LENGTH('a ')=2)
996
Such a substitution is surely valid if either the substituted
997
field is not of a STRING type or if it is an argument of
998
a comparison predicate.
1001
true substitution is valid
1006
bool Item_field::subst_argument_checker(unsigned char **arg)
1008
return (result_type() != STRING_RESULT) || (*arg);
1013
Set a pointer to the multiple equality the field reference belongs to
1016
The function looks for a multiple equality containing the field item
1017
among those referenced by arg.
1018
In the case such equality exists the function does the following.
1019
If the found multiple equality contains a constant, then the field
1020
reference is substituted for this constant, otherwise it sets a pointer
1021
to the multiple equality in the field item.
1024
@param arg reference to list of multiple equalities where
1025
the field (this object) is to be looked for
1028
This function is supposed to be called as a callback parameter in calls
1029
of the compile method.
1032
- pointer to the replacing constant item, if the field item was substituted
1033
- pointer to the field item, otherwise.
1036
Item *Item_field::equal_fields_propagator(unsigned char *arg)
1040
item_equal= find_item_equal((COND_EQUAL *) arg);
1043
item= item_equal->get_const();
1045
Disable const propagation for items used in different comparison contexts.
1046
This must be done because, for example, Item_hex_string->val_int() is not
1047
the same as (Item_hex_string->val_str() in BINARY column)->val_int().
1048
We cannot simply disable the replacement in a particular context (
1049
e.g. <bin_col> = <int_col> AND <bin_col> = <hex_string>) since
1050
Items don't know the context they are in and there are functions like
1051
IF (<hex_string>, 'yes', 'no').
1052
The same problem occurs when comparing a DATE/TIME field with a
1053
DATE/TIME represented as an int and as a string.
1056
(cmp_context != (Item_result)-1 && item->cmp_context != cmp_context))
1064
Mark the item to not be part of substitution if it's not a binary item.
1066
See comments in Arg_comparator::set_compare_func() for details.
1069
bool Item_field::set_no_const_sub(unsigned char *)
1071
if (field->charset() != &my_charset_bin)
1078
Replace an Item_field for an equal Item_field that evaluated earlier
1081
The function returns a pointer to an item that is taken from
1082
the very beginning of the item_equal list which the Item_field
1083
object refers to (belongs to) unless item_equal contains a constant
1084
item. In this case the function returns this constant item,
1085
(if the substitution does not require conversion).
1086
If the Item_field object does not refer any Item_equal object
1087
'this' is returned .
1089
@param arg a dummy parameter, is not used here
1093
This function is supposed to be called as a callback parameter in calls
1094
of the thransformer method.
1097
- pointer to a replacement Item_field if there is a better equal item or
1098
a pointer to a constant equal item;
1102
Item *Item_field::replace_equal_field(unsigned char *)
1106
Item *const_item_ptr= item_equal->get_const();
1109
if (cmp_context != (Item_result)-1 &&
1110
const_item_ptr->cmp_context != cmp_context)
1112
return const_item_ptr;
1114
Item_field *subst= item_equal->get_first();
1115
if (subst && !field->eq(subst->field))
1122
uint32_t Item_field::max_disp_length()
1124
return field->max_display_length();
1129
void Item_field::make_field(SendField *tmp_field)
1131
field->make_field(tmp_field);
1132
assert(tmp_field->table_name != 0);
1134
tmp_field->col_name=name; // Use user supplied name
1136
tmp_field->table_name= table_name;
1138
tmp_field->db_name= db_name;
1143
Set a field's value from a item.
1146
void Item_field::save_org_in_field(Field *to)
1148
if (field->is_null())
1151
set_field_to_null_with_conversions(to, 1);
1156
field_conv(to,field);
1161
int Item_field::save_in_field(Field *to, bool no_conversions)
1164
if (result_field->is_null())
1167
res= set_field_to_null_with_conversions(to, no_conversions);
1172
res= field_conv(to,result_field);
1179
bool Item_field::send(plugin::Client *client, String *)
1181
return client->store(result_field);
1185
void Item_field::update_null_value()
1188
need to set no_errors to prevent warnings about type conversion
1191
Session *session= field->table->in_use;
1194
no_errors= session->no_errors;
1195
session->no_errors= 1;
1196
Item::update_null_value();
1197
session->no_errors= no_errors;
1202
Add the field to the select list and substitute it for the reference to
1206
Item_field::update_value_transformer()
1207
select_arg current select
1210
If the field doesn't belong to the table being inserted into then it is
1211
added to the select list, pointer to it is stored in the ref_pointer_array
1212
of the select and the field itself is substituted for the Item_ref object.
1213
This is done in order to get correct values from update fields that
1214
belongs to the SELECT part in the INSERT .. SELECT .. ON DUPLICATE KEY
1219
ref if all conditions are met
1220
this field otherwise
1223
Item *Item_field::update_value_transformer(unsigned char *select_arg)
1225
Select_Lex *select= (Select_Lex*)select_arg;
1228
if (field->table != select->context.table_list->table)
1230
List<Item> *all_fields= &select->join->all_fields;
1231
Item **ref_pointer_array= select->ref_pointer_array;
1232
int el= all_fields->elements;
1235
ref_pointer_array[el]= (Item*)this;
1236
all_fields->push_front((Item*)this);
1237
ref= new Item_ref(&select->context, ref_pointer_array + el,
1238
table_name, field_name);
1245
void Item_field::print(String *str, enum_query_type query_type)
1247
if (field && field->table->const_table)
1249
char buff[MAX_FIELD_WIDTH];
1250
String tmp(buff,sizeof(buff),str->charset());
1251
field->val_str(&tmp);
1257
Item_ident::print(str, query_type);