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
20
#include <drizzled/server_includes.h>
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::filed_for_view_update()
121
Item_field::Item_field(Field *f)
122
:Item_ident(0, NULL, *f->table_name, f->field_name),
123
item_equal(0), no_const_subst(0),
124
have_privileges(0), any_privileges(0)
128
field_name and table_name should not point to garbage
129
if this item is to be reused
131
orig_table_name= orig_field_name= "";
136
Constructor used inside setup_wild().
138
Ensures that field, table, and database names will live as long as
139
Item_field (this is important in prepared statements).
142
Item_field::Item_field(Session *, Name_resolution_context *context_arg,
144
:Item_ident(context_arg, f->table->s->db.str, *f->table_name, f->field_name),
145
item_equal(0), no_const_subst(0),
146
have_privileges(0), any_privileges(0)
152
Item_field::Item_field(Name_resolution_context *context_arg,
153
const char *db_arg,const char *table_name_arg,
154
const char *field_name_arg)
155
:Item_ident(context_arg, db_arg,table_name_arg,field_name_arg),
156
field(0), result_field(0), item_equal(0), no_const_subst(0),
157
have_privileges(0), any_privileges(0)
159
Select_Lex *select= current_session->lex->current_select;
160
collation.set(DERIVATION_IMPLICIT);
161
if (select && select->parsing_place != IN_HAVING)
162
select->select_n_where_fields++;
166
Constructor need to process subselect with temporary tables (see Item)
169
Item_field::Item_field(Session *session, Item_field *item)
170
:Item_ident(session, item),
172
result_field(item->result_field),
173
item_equal(item->item_equal),
174
no_const_subst(item->no_const_subst),
175
have_privileges(item->have_privileges),
176
any_privileges(item->any_privileges)
178
collation.set(DERIVATION_IMPLICIT);
181
void Item_field::set_field(Field *field_par)
183
field=result_field=field_par; // for easy coding with fields
184
maybe_null=field->maybe_null();
185
decimals= field->decimals();
186
max_length= field_par->max_display_length();
187
table_name= *field_par->table_name;
188
field_name= field_par->field_name;
189
db_name= field_par->table->s->db.str;
190
alias_name_used= field_par->table->alias_name_used;
191
unsigned_flag=test(field_par->flags & UNSIGNED_FLAG);
192
collation.set(field_par->charset(), field_par->derivation());
194
if (field->table->s->tmp_table == SYSTEM_TMP_TABLE)
200
Reset this item to point to a field from the new temporary table.
201
This is used when we create a new temporary table for each execution
202
of prepared statement.
205
void Item_field::reset_field(Field *f)
208
/* 'name' is pointing at field->field_name of old field */
209
name= (char*) f->field_name;
213
String *Item_field::val_str(String *str)
216
if ((null_value=field->is_null()))
218
str->set_charset(str_value.charset());
219
return field->val_str(str,&str_value);
223
double Item_field::val_real()
226
if ((null_value=field->is_null()))
228
return field->val_real();
232
int64_t Item_field::val_int()
235
if ((null_value=field->is_null()))
237
return field->val_int();
241
my_decimal *Item_field::val_decimal(my_decimal *decimal_value)
243
if ((null_value= field->is_null()))
245
return field->val_decimal(decimal_value);
249
String *Item_field::str_result(String *str)
251
if ((null_value=result_field->is_null()))
253
str->set_charset(str_value.charset());
254
return result_field->val_str(str,&str_value);
257
bool Item_field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
259
if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
261
memset(ltime, 0, sizeof(*ltime));
267
bool Item_field::get_date_result(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
269
if ((null_value=result_field->is_null()) ||
270
result_field->get_date(ltime,fuzzydate))
272
memset(ltime, 0, sizeof(*ltime));
278
bool Item_field::get_time(DRIZZLE_TIME *ltime)
280
if ((null_value=field->is_null()) || field->get_time(ltime))
282
memset(ltime, 0, sizeof(*ltime));
288
double Item_field::val_result()
290
if ((null_value=result_field->is_null()))
292
return result_field->val_real();
295
int64_t Item_field::val_int_result()
297
if ((null_value=result_field->is_null()))
299
return result_field->val_int();
303
my_decimal *Item_field::val_decimal_result(my_decimal *decimal_value)
305
if ((null_value= result_field->is_null()))
307
return result_field->val_decimal(decimal_value);
311
bool Item_field::val_bool_result()
313
if ((null_value= result_field->is_null()))
315
switch (result_field->result_type()) {
317
return result_field->val_int() != 0;
320
my_decimal decimal_value;
321
my_decimal *val= result_field->val_decimal(&decimal_value);
323
return !my_decimal_is_zero(val);
328
return result_field->val_real() != 0.0;
332
return 0; // Shut up compiler
337
bool Item_field::eq(const Item *item, bool) const
339
const Item *item_ptr= item->real_item();
340
if (item_ptr->type() != FIELD_ITEM)
343
const Item_field *item_field= static_cast<const Item_field *>(item_ptr);
344
if (item_field->field && field)
345
return item_field->field == field;
347
We may come here when we are trying to find a function in a GROUP BY
348
clause from the select list.
349
In this case the '100 % correct' way to do this would be to first
350
run fix_fields() on the GROUP BY item and then retry this function, but
351
I think it's better to relax the checking a bit as we will in
352
most cases do the correct thing by just checking the field name.
353
(In cases where we would choose wrong we would have to generate a
356
return (!my_strcasecmp(system_charset_info, item_field->name,
358
(!item_field->table_name || !table_name ||
359
(!my_strcasecmp(table_alias_charset, item_field->table_name,
361
(!item_field->db_name || !db_name ||
362
(item_field->db_name && !strcmp(item_field->db_name,
367
table_map Item_field::used_tables() const
369
if (field->table->const_table)
370
return 0; // const item
371
return (depended_from ? OUTER_REF_TABLE_BIT : field->table->map);
374
enum Item_result Item_field::result_type () const
376
return field->result_type();
380
Item_result Item_field::cast_to_int_type() const
382
return field->cast_to_int_type();
386
enum_field_types Item_field::field_type() const
388
return field->type();
392
void Item_field::fix_after_pullout(Select_Lex *new_parent, Item **)
394
if (new_parent == depended_from)
396
Name_resolution_context *ctx= new Name_resolution_context();
397
ctx->outer_context= NULL; // We don't build a complete name resolver
398
ctx->select_lex= new_parent;
399
ctx->first_name_resolution_table= context->first_name_resolution_table;
400
ctx->last_name_resolution_table= context->last_name_resolution_table;
405
bool Item_field::is_null()
407
return field->is_null();
411
Item *Item_field::get_tmp_table_item(Session *session)
413
Item_field *new_item= new Item_field(session, this);
415
new_item->field= new_item->result_field;
419
int64_t Item_field::val_int_endpoint(bool, bool *)
421
int64_t res= val_int();
422
return null_value? INT64_MIN : res;
427
Resolve the name of an outer select column reference.
429
The method resolves the column reference represented by 'this' as a column
430
present in outer selects that contain current select.
432
In prepared statements, because of cache, find_field_in_tables()
433
can resolve fields even if they don't belong to current context.
434
In this case this method only finds appropriate context and marks
435
current select as dependent. The found reference of field should be
436
provided in 'from_field'.
438
@param[in] session current thread
439
@param[in,out] from_field found field reference or (Field*)not_found_field
440
@param[in,out] reference view column if this item was resolved to a
444
This is the inner loop of Item_field::fix_fields:
446
for each outer query Q_k beginning from the inner-most one
448
search for a column or derived column named col_ref_i
449
[in table T_j] in the FROM clause of Q_k;
451
if such a column is not found
452
Search for a column or derived column named col_ref_i
453
[in table T_j] in the SELECT and GROUP clauses of Q_k.
458
1 column succefully resolved and fix_fields() should continue.
460
0 column fully fixed and fix_fields() should return false
466
Item_field::fix_outer_field(Session *session, Field **from_field, Item **reference)
468
enum_parsing_place place= NO_MATTER;
469
bool field_found= (*from_field != not_found_field);
470
bool upward_lookup= false;
473
If there are outer contexts (outer selects, but current select is
474
not derived table or view) try to resolve this reference in the
477
We treat each subselect as a separate namespace, so that different
478
subselects may contain columns with the same names. The subselects
479
are searched starting from the innermost.
481
Name_resolution_context *last_checked_context= context;
482
Item **ref= (Item **) not_found_item;
483
Select_Lex *current_sel= (Select_Lex *) session->lex->current_select;
484
Name_resolution_context *outer_context= 0;
485
Select_Lex *select= 0;
486
/* Currently derived tables cannot be correlated */
487
if (current_sel->master_unit()->first_select()->linkage !=
489
outer_context= context->outer_context;
492
outer_context= outer_context->outer_context)
494
select= outer_context->select_lex;
495
Item_subselect *prev_subselect_item=
496
last_checked_context->select_lex->master_unit()->item;
497
last_checked_context= outer_context;
500
place= prev_subselect_item->parsing_place;
502
If outer_field is set, field was already found by first call
503
to find_field_in_tables(). Only need to find appropriate context.
505
if (field_found && outer_context->select_lex !=
506
cached_table->select_lex)
509
In case of a view, find_field_in_tables() writes the pointer to
510
the found view field into '*reference', in other words, it
511
substitutes this Item_field with the found expression.
513
if (field_found || (*from_field= find_field_in_tables(session, this,
515
first_name_resolution_table,
517
last_name_resolution_table,
519
IGNORE_EXCEPT_NON_UNIQUE,
525
if (*from_field != view_ref_found)
527
prev_subselect_item->used_tables_cache|= (*from_field)->table->map;
528
prev_subselect_item->const_item_cache= 0;
529
set_field(*from_field);
530
if (!last_checked_context->select_lex->having_fix_field &&
531
select->group_list.elements &&
532
(place == SELECT_LIST || place == IN_HAVING))
536
If an outer field is resolved in a grouping select then it
537
is replaced for an Item_outer_ref object. Otherwise an
538
Item_field object is used.
539
The new Item_outer_ref object is saved in the inner_refs_list of
540
the outer select. Here it is only created. It can be fixed only
541
after the original field has been fixed and this is done in the
542
fix_inner_refs() function.
545
if (!(rf= new Item_outer_ref(context, this)))
547
session->change_item_tree(reference, rf);
548
select->inner_refs_list.push_back(rf);
549
rf->in_sum_func= session->lex->in_sum_func;
552
A reference is resolved to a nest level that's outer or the same as
553
the nest level of the enclosing set function : adjust the value of
554
max_arg_level for the function if it's needed.
556
if (session->lex->in_sum_func &&
557
session->lex->in_sum_func->nest_level >= select->nest_level)
559
Item::Type ref_type= (*reference)->type();
560
set_if_bigger(session->lex->in_sum_func->max_arg_level,
562
set_field(*from_field);
564
mark_as_dependent(session, last_checked_context->select_lex,
565
context->select_lex, this,
566
((ref_type == REF_ITEM ||
567
ref_type == FIELD_ITEM) ?
568
(Item_ident*) (*reference) : 0));
574
Item::Type ref_type= (*reference)->type();
575
prev_subselect_item->used_tables_cache|=
576
(*reference)->used_tables();
577
prev_subselect_item->const_item_cache&=
578
(*reference)->const_item();
579
mark_as_dependent(session, last_checked_context->select_lex,
580
context->select_lex, this,
581
((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
582
(Item_ident*) (*reference) :
585
A reference to a view field had been found and we
586
substituted it instead of this Item (find_field_in_tables
587
does it by assigning the new value to *reference), so now
588
we can return from this function.
596
/* Search in SELECT and GROUP lists of the outer select. */
597
if (place != IN_WHERE && place != IN_ON)
599
if (!(ref= resolve_ref_in_select_and_group(session, this, select)))
600
return -1; /* Some error occurred (e.g. ambiguous names). */
601
if (ref != not_found_item)
603
assert(*ref && (*ref)->fixed);
604
prev_subselect_item->used_tables_cache|= (*ref)->used_tables();
605
prev_subselect_item->const_item_cache&= (*ref)->const_item();
611
Reference is not found in this select => this subquery depend on
612
outer select (or we just trying to find wrong identifier, in this
613
case it does not matter which used tables bits we set)
615
prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
616
prev_subselect_item->const_item_cache= 0;
622
if (ref == not_found_item && *from_field == not_found_field)
626
// We can't say exactly what absent table or field
627
my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), session->where);
631
/* Call find_field_in_tables only to report the error */
632
find_field_in_tables(session, this,
633
context->first_name_resolution_table,
634
context->last_name_resolution_table,
635
reference, REPORT_ALL_ERRORS, true);
639
else if (ref != not_found_item)
644
/* Should have been checked in resolve_ref_in_select_and_group(). */
645
assert(*ref && (*ref)->fixed);
647
Here, a subset of actions performed by Item_ref::set_properties
648
is not enough. So we pass ptr to NULL into Item_[direct]_ref
649
constructor, so no initialization is performed, and call
653
*ref= NULL; // Don't call set_properties()
654
rf= (place == IN_HAVING ?
655
new Item_ref(context, ref, (char*) table_name,
656
(char*) field_name, alias_name_used) :
657
(!select->group_list.elements ?
658
new Item_direct_ref(context, ref, (char*) table_name,
659
(char*) field_name, alias_name_used) :
660
new Item_outer_ref(context, ref, (char*) table_name,
661
(char*) field_name, alias_name_used)));
666
if (place != IN_HAVING && select->group_list.elements)
668
outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf);
669
((Item_outer_ref*)rf)->in_sum_func= session->lex->in_sum_func;
671
session->change_item_tree(reference, rf);
673
rf is Item_ref => never substitute other items (in this case)
674
during fix_fields() => we can use rf after fix_fields()
676
assert(!rf->fixed); // Assured by Item_ref()
677
if (rf->fix_fields(session, reference) || rf->check_cols(1))
680
mark_as_dependent(session, last_checked_context->select_lex,
681
context->select_lex, this,
687
mark_as_dependent(session, last_checked_context->select_lex,
689
this, (Item_ident*)*reference);
690
if (last_checked_context->select_lex->having_fix_field)
693
rf= new Item_ref(context,
694
(cached_table->db[0] ? cached_table->db : 0),
695
(char*) cached_table->alias, (char*) field_name);
698
session->change_item_tree(reference, rf);
700
rf is Item_ref => never substitute other items (in this case)
701
during fix_fields() => we can use rf after fix_fields()
703
assert(!rf->fixed); // Assured by Item_ref()
704
if (rf->fix_fields(session, reference) || rf->check_cols(1))
714
Resolve the name of a column reference.
716
The method resolves the column reference represented by 'this' as a column
717
present in one of: FROM clause, SELECT clause, GROUP BY clause of a query
718
Q, or in outer queries that contain Q.
720
The name resolution algorithm used is (where [T_j] is an optional table
721
name that qualifies the column name):
724
resolve_column_reference([T_j].col_ref_i)
726
search for a column or derived column named col_ref_i
727
[in table T_j] in the FROM clause of Q;
729
if such a column is NOT found AND // Lookup in outer queries.
730
there are outer queries
732
for each outer query Q_k beginning from the inner-most one
734
search for a column or derived column named col_ref_i
735
[in table T_j] in the FROM clause of Q_k;
737
if such a column is not found
738
Search for a column or derived column named col_ref_i
739
[in table T_j] in the SELECT and GROUP clauses of Q_k.
745
Notice that compared to Item_ref::fix_fields, here we first search the FROM
746
clause, and then we search the SELECT and GROUP BY clauses.
748
@param[in] session current thread
749
@param[in,out] reference view column if this item was resolved to a
758
bool Item_field::fix_fields(Session *session, Item **reference)
761
Field *from_field= (Field *)not_found_field;
762
bool outer_fixed= false;
764
if (!field) // If field is not checked
767
In case of view, find_field_in_tables() write pointer to view field
768
expression to 'reference', i.e. it substitute that expression instead
771
if ((from_field= find_field_in_tables(session, this,
772
context->first_name_resolution_table,
773
context->last_name_resolution_table,
775
session->lex->use_only_table_context ?
777
IGNORE_EXCEPT_NON_UNIQUE, true)) ==
781
/* Look up in current select's item_list to find aliased fields */
782
if (session->lex->current_select->is_item_list_lookup)
785
enum_resolution_type resolution;
786
Item** res= find_item_in_list(this, session->lex->current_select->item_list,
787
&counter, REPORT_EXCEPT_NOT_FOUND,
791
if (resolution == RESOLVED_AGAINST_ALIAS)
792
alias_name_used= true;
793
if (res != (Item **)not_found_item)
795
if ((*res)->type() == Item::FIELD_ITEM)
798
It's an Item_field referencing another Item_field in the select
800
Use the field from the Item_field in the select list and leave
801
the Item_field instance in place.
804
Field *new_field= (*((Item_field**)res))->field;
806
if (new_field == NULL)
808
/* The column to which we link isn't valid. */
809
my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name,
810
current_session->where);
814
set_field(new_field);
820
It's not an Item_field in the select list so we must make a new
821
Item_ref to point to the Item in the select list and replace the
822
Item_field created by the parser with the new Item_ref.
824
Item_ref *rf= new Item_ref(context, db_name,table_name,field_name);
827
session->change_item_tree(reference, rf);
829
Because Item_ref never substitutes itself with other items
830
in Item_ref::fix_fields(), we can safely use the original
831
pointer to it even after fix_fields()
833
return rf->fix_fields(session, reference) || rf->check_cols(1);
837
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
841
goto mark_non_agg_field;
843
else if (!from_field)
846
if (!outer_fixed && cached_table && cached_table->select_lex &&
847
context->select_lex &&
848
cached_table->select_lex != context->select_lex)
851
if ((ret= fix_outer_field(session, &from_field, reference)) < 0)
855
goto mark_non_agg_field;
859
if it is not expression from merged VIEW we will set this field.
861
We can leave expression substituted from view for next PS/SP rexecution
862
(i.e. do not register this substitution for reverting on cleanup()
863
(register_item_tree_changing())), because this subtree will be
864
fix_field'ed during setup_tables()->setup_underlying() (i.e. before
865
all other expressions of query, and references on tables which do
866
not present in query will not make problems.
868
Also we suppose that view can't be changed during PS/SP life.
870
if (from_field == view_ref_found)
873
set_field(from_field);
874
if (session->lex->in_sum_func &&
875
session->lex->in_sum_func->nest_level ==
876
session->lex->current_select->nest_level)
878
set_if_bigger(session->lex->in_sum_func->max_arg_level,
879
session->lex->current_select->nest_level);
882
else if (session->mark_used_columns != MARK_COLUMNS_NONE)
884
Table *table= field->table;
885
MyBitmap *current_bitmap, *other_bitmap;
886
if (session->mark_used_columns == MARK_COLUMNS_READ)
888
current_bitmap= table->read_set;
889
other_bitmap= table->write_set;
893
current_bitmap= table->write_set;
894
other_bitmap= table->read_set;
896
if (! current_bitmap->testAndSet(field->field_index))
898
if (! other_bitmap->isBitSet(field->field_index))
900
/* First usage of column */
901
table->used_fields++; // Used to optimize loops
902
table->covering_keys&= field->part_of_key;
911
context->process_error(session);
915
Item *Item_field::safe_charset_converter(const CHARSET_INFO * const tocs)
918
return Item::safe_charset_converter(tocs);
922
void Item_field::cleanup()
924
Item_ident::cleanup();
926
Even if this object was created by direct link to field in setup_wild()
927
it will be linked correctly next time by name of field and table alias.
928
I.e. we can drop 'field'.
930
field= result_field= 0;
936
bool Item_field::result_as_int64_t()
938
return field->can_be_compared_as_int64_t();
943
Find a field among specified multiple equalities.
945
The function first searches the field among multiple equalities
946
of the current level (in the cond_equal->current_level list).
947
If it fails, it continues searching in upper levels accessed
948
through a pointer cond_equal->upper_levels.
949
The search terminates as soon as a multiple equality containing
952
@param cond_equal reference to list of multiple equalities where
953
the field (this object) is to be looked for
956
- First Item_equal containing the field, if success
960
Item_equal *Item_field::find_item_equal(COND_EQUAL *cond_equal)
965
List_iterator_fast<Item_equal> li(cond_equal->current_level);
968
if (item->contains(field))
972
The field is not found in any of the multiple equalities
973
of the current level. Look for it in upper levels
975
cond_equal= cond_equal->upper_levels;
982
Check whether a field can be substituted by an equal item.
984
The function checks whether a substitution of the field
985
occurrence for an equal item is valid.
987
@param arg *arg != NULL <-> the field is in the context where
988
substitution for an equal item is valid
991
The following statement is not always true:
995
This means substitution of an item for an equal item not always
996
yields an equavalent condition. Here's an example:
999
(LENGTH('a')=1) != (LENGTH('a ')=2)
1001
Such a substitution is surely valid if either the substituted
1002
field is not of a STRING type or if it is an argument of
1003
a comparison predicate.
1006
true substitution is valid
1011
bool Item_field::subst_argument_checker(unsigned char **arg)
1013
return (result_type() != STRING_RESULT) || (*arg);
1018
Set a pointer to the multiple equality the field reference belongs to
1021
The function looks for a multiple equality containing the field item
1022
among those referenced by arg.
1023
In the case such equality exists the function does the following.
1024
If the found multiple equality contains a constant, then the field
1025
reference is substituted for this constant, otherwise it sets a pointer
1026
to the multiple equality in the field item.
1029
@param arg reference to list of multiple equalities where
1030
the field (this object) is to be looked for
1033
This function is supposed to be called as a callback parameter in calls
1034
of the compile method.
1037
- pointer to the replacing constant item, if the field item was substituted
1038
- pointer to the field item, otherwise.
1041
Item *Item_field::equal_fields_propagator(unsigned char *arg)
1045
item_equal= find_item_equal((COND_EQUAL *) arg);
1048
item= item_equal->get_const();
1050
Disable const propagation for items used in different comparison contexts.
1051
This must be done because, for example, Item_hex_string->val_int() is not
1052
the same as (Item_hex_string->val_str() in BINARY column)->val_int().
1053
We cannot simply disable the replacement in a particular context (
1054
e.g. <bin_col> = <int_col> AND <bin_col> = <hex_string>) since
1055
Items don't know the context they are in and there are functions like
1056
IF (<hex_string>, 'yes', 'no').
1057
The same problem occurs when comparing a DATE/TIME field with a
1058
DATE/TIME represented as an int and as a string.
1061
(cmp_context != (Item_result)-1 && item->cmp_context != cmp_context))
1069
Mark the item to not be part of substitution if it's not a binary item.
1071
See comments in Arg_comparator::set_compare_func() for details.
1074
bool Item_field::set_no_const_sub(unsigned char *)
1076
if (field->charset() != &my_charset_bin)
1083
Replace an Item_field for an equal Item_field that evaluated earlier
1086
The function returns a pointer to an item that is taken from
1087
the very beginning of the item_equal list which the Item_field
1088
object refers to (belongs to) unless item_equal contains a constant
1089
item. In this case the function returns this constant item,
1090
(if the substitution does not require conversion).
1091
If the Item_field object does not refer any Item_equal object
1092
'this' is returned .
1094
@param arg a dummy parameter, is not used here
1098
This function is supposed to be called as a callback parameter in calls
1099
of the thransformer method.
1102
- pointer to a replacement Item_field if there is a better equal item or
1103
a pointer to a constant equal item;
1107
Item *Item_field::replace_equal_field(unsigned char *)
1111
Item *const_item_ptr= item_equal->get_const();
1114
if (cmp_context != (Item_result)-1 &&
1115
const_item_ptr->cmp_context != cmp_context)
1117
return const_item_ptr;
1119
Item_field *subst= item_equal->get_first();
1120
if (subst && !field->eq(subst->field))
1127
uint32_t Item_field::max_disp_length()
1129
return field->max_display_length();
1134
void Item_field::make_field(SendField *tmp_field)
1136
field->make_field(tmp_field);
1137
assert(tmp_field->table_name != 0);
1139
tmp_field->col_name=name; // Use user supplied name
1141
tmp_field->table_name= table_name;
1143
tmp_field->db_name= db_name;
1148
Set a field's value from a item.
1151
void Item_field::save_org_in_field(Field *to)
1153
if (field->is_null())
1156
set_field_to_null_with_conversions(to, 1);
1161
field_conv(to,field);
1166
int Item_field::save_in_field(Field *to, bool no_conversions)
1169
if (result_field->is_null())
1172
res= set_field_to_null_with_conversions(to, no_conversions);
1177
res= field_conv(to,result_field);
1184
bool Item_field::send(plugin::Client *client, String *)
1186
return client->store(result_field);
1190
void Item_field::update_null_value()
1193
need to set no_errors to prevent warnings about type conversion
1196
Session *session= field->table->in_use;
1199
no_errors= session->no_errors;
1200
session->no_errors= 1;
1201
Item::update_null_value();
1202
session->no_errors= no_errors;
1207
Add the field to the select list and substitute it for the reference to
1211
Item_field::update_value_transformer()
1212
select_arg current select
1215
If the field doesn't belong to the table being inserted into then it is
1216
added to the select list, pointer to it is stored in the ref_pointer_array
1217
of the select and the field itself is substituted for the Item_ref object.
1218
This is done in order to get correct values from update fields that
1219
belongs to the SELECT part in the INSERT .. SELECT .. ON DUPLICATE KEY
1224
ref if all conditions are met
1225
this field otherwise
1228
Item *Item_field::update_value_transformer(unsigned char *select_arg)
1230
Select_Lex *select= (Select_Lex*)select_arg;
1233
if (field->table != select->context.table_list->table)
1235
List<Item> *all_fields= &select->join->all_fields;
1236
Item **ref_pointer_array= select->ref_pointer_array;
1237
int el= all_fields->elements;
1240
ref_pointer_array[el]= (Item*)this;
1241
all_fields->push_front((Item*)this);
1242
ref= new Item_ref(&select->context, ref_pointer_array + el,
1243
table_name, field_name);
1250
void Item_field::print(String *str, enum_query_type query_type)
1252
if (field && field->table->const_table)
1254
char buff[MAX_FIELD_WIDTH];
1255
String tmp(buff,sizeof(buff),str->charset());
1256
field->val_str(&tmp);
1262
Item_ident::print(str, query_type);