~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-2006 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
17
#ifdef USE_PRAGMA_IMPLEMENTATION
18
#pragma implementation				// gcc: Class implementation
19
#endif
20
#include "mysql_priv.h"
21
#include <m_ctype.h>
22
#include "my_dir.h"
23
#include "sql_select.h"
24
25
const String my_null_string("NULL", 4, default_charset_info);
26
27
/****************************************************************************/
28
29
/* Hybrid_type_traits {_real} */
30
31
void Hybrid_type_traits::fix_length_and_dec(Item *item, Item *arg) const
32
{
33
  item->decimals= NOT_FIXED_DEC;
34
  item->max_length= item->float_length(arg->decimals);
35
}
36
37
static const Hybrid_type_traits real_traits_instance;
38
39
const Hybrid_type_traits *Hybrid_type_traits::instance()
40
{
41
  return &real_traits_instance;
42
}
43
44
45
my_decimal *
77.1.15 by Monty Taylor
Bunch of warning cleanups.
46
Hybrid_type_traits::val_decimal(Hybrid_type *val,
47
                                my_decimal *to __attribute__((__unused__))) const
1 by brian
clean slate
48
{
49
  double2my_decimal(E_DEC_FATAL_ERROR, val->real, val->dec_buf);
50
  return val->dec_buf;
51
}
52
53
54
String *
55
Hybrid_type_traits::val_str(Hybrid_type *val, String *to, uint8 decimals) const
56
{
57
  to->set_real(val->real, decimals, &my_charset_bin);
58
  return to;
59
}
60
61
/* Hybrid_type_traits_decimal */
62
static const Hybrid_type_traits_decimal decimal_traits_instance;
63
64
const Hybrid_type_traits_decimal *Hybrid_type_traits_decimal::instance()
65
{
66
  return &decimal_traits_instance;
67
}
68
69
70
void
71
Hybrid_type_traits_decimal::fix_length_and_dec(Item *item, Item *arg) const
72
{
73
  item->decimals= arg->decimals;
74
  item->max_length= min(arg->max_length + DECIMAL_LONGLONG_DIGITS,
75
                        DECIMAL_MAX_STR_LENGTH);
76
}
77
78
79
void Hybrid_type_traits_decimal::set_zero(Hybrid_type *val) const
80
{
81
  my_decimal_set_zero(&val->dec_buf[0]);
82
  val->used_dec_buf_no= 0;
83
}
84
85
86
void Hybrid_type_traits_decimal::add(Hybrid_type *val, Field *f) const
87
{
88
  my_decimal_add(E_DEC_FATAL_ERROR,
89
                 &val->dec_buf[val->used_dec_buf_no ^ 1],
90
                 &val->dec_buf[val->used_dec_buf_no],
91
                 f->val_decimal(&val->dec_buf[2]));
92
  val->used_dec_buf_no^= 1;
93
}
94
95
96
/**
97
  @todo
98
  what is '4' for scale?
99
*/
151 by Brian Aker
Ulonglong to uint64_t
100
void Hybrid_type_traits_decimal::div(Hybrid_type *val, uint64_t u) const
1 by brian
clean slate
101
{
56 by brian
Next pass of true/false update.
102
  int2my_decimal(E_DEC_FATAL_ERROR, u, true, &val->dec_buf[2]);
1 by brian
clean slate
103
  /* XXX: what is '4' for scale? */
104
  my_decimal_div(E_DEC_FATAL_ERROR,
105
                 &val->dec_buf[val->used_dec_buf_no ^ 1],
106
                 &val->dec_buf[val->used_dec_buf_no],
107
                 &val->dec_buf[2], 4);
108
  val->used_dec_buf_no^= 1;
109
}
110
111
152 by Brian Aker
longlong replacement
112
int64_t
1 by brian
clean slate
113
Hybrid_type_traits_decimal::val_int(Hybrid_type *val, bool unsigned_flag) const
114
{
152 by Brian Aker
longlong replacement
115
  int64_t result;
1 by brian
clean slate
116
  my_decimal2int(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
117
                 unsigned_flag, &result);
118
  return result;
119
}
120
121
122
double
123
Hybrid_type_traits_decimal::val_real(Hybrid_type *val) const
124
{
125
  my_decimal2double(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
126
                    &val->real);
127
  return val->real;
128
}
129
130
131
String *
132
Hybrid_type_traits_decimal::val_str(Hybrid_type *val, String *to,
133
                                    uint8 decimals) const
134
{
135
  my_decimal_round(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
56 by brian
Next pass of true/false update.
136
                   decimals, false, &val->dec_buf[2]);
1 by brian
clean slate
137
  my_decimal2string(E_DEC_FATAL_ERROR, &val->dec_buf[2], 0, 0, 0, to);
138
  return to;
139
}
140
141
/* Hybrid_type_traits_integer */
142
static const Hybrid_type_traits_integer integer_traits_instance;
143
144
const Hybrid_type_traits_integer *Hybrid_type_traits_integer::instance()
145
{
146
  return &integer_traits_instance;
147
}
148
149
void
77.1.15 by Monty Taylor
Bunch of warning cleanups.
150
Hybrid_type_traits_integer::fix_length_and_dec(Item *item,
151
                                               Item *arg __attribute__((__unused__))) const
1 by brian
clean slate
152
{
153
  item->decimals= 0;
154
  item->max_length= MY_INT64_NUM_DECIMAL_DIGITS;
155
  item->unsigned_flag= 0;
156
}
157
158
/*****************************************************************************
159
** Item functions
160
*****************************************************************************/
161
162
/**
163
  Init all special items.
164
*/
165
166
void item_init(void)
167
{
168
}
169
170
171
/**
172
  @todo
173
    Make this functions class dependent
174
*/
175
176
bool Item::val_bool()
177
{
178
  switch(result_type()) {
179
  case INT_RESULT:
180
    return val_int() != 0;
181
  case DECIMAL_RESULT:
182
  {
183
    my_decimal decimal_value;
184
    my_decimal *val= val_decimal(&decimal_value);
185
    if (val)
186
      return !my_decimal_is_zero(val);
187
    return 0;
188
  }
189
  case REAL_RESULT:
190
  case STRING_RESULT:
191
    return val_real() != 0.0;
192
  case ROW_RESULT:
193
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
194
    assert(0);
1 by brian
clean slate
195
    return 0;                                   // Wrong (but safe)
196
  }
197
}
198
199
200
String *Item::val_string_from_real(String *str)
201
{
202
  double nr= val_real();
203
  if (null_value)
204
    return 0;					/* purecov: inspected */
205
  str->set_real(nr,decimals, &my_charset_bin);
206
  return str;
207
}
208
209
210
String *Item::val_string_from_int(String *str)
211
{
152 by Brian Aker
longlong replacement
212
  int64_t nr= val_int();
1 by brian
clean slate
213
  if (null_value)
214
    return 0;
215
  str->set_int(nr, unsigned_flag, &my_charset_bin);
216
  return str;
217
}
218
219
220
String *Item::val_string_from_decimal(String *str)
221
{
222
  my_decimal dec_buf, *dec= val_decimal(&dec_buf);
223
  if (null_value)
224
    return 0;
56 by brian
Next pass of true/false update.
225
  my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, false, &dec_buf);
1 by brian
clean slate
226
  my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, 0, str);
227
  return str;
228
}
229
230
231
my_decimal *Item::val_decimal_from_real(my_decimal *decimal_value)
232
{
233
  double nr= val_real();
234
  if (null_value)
235
    return 0;
236
  double2my_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
237
  return (decimal_value);
238
}
239
240
241
my_decimal *Item::val_decimal_from_int(my_decimal *decimal_value)
242
{
152 by Brian Aker
longlong replacement
243
  int64_t nr= val_int();
1 by brian
clean slate
244
  if (null_value)
245
    return 0;
246
  int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
247
  return decimal_value;
248
}
249
250
251
my_decimal *Item::val_decimal_from_string(my_decimal *decimal_value)
252
{
253
  String *res;
254
  char *end_ptr;
255
  if (!(res= val_str(&str_value)))
256
    return 0;                                   // NULL or EOM
257
258
  end_ptr= (char*) res->ptr()+ res->length();
259
  if (str2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
260
                     res->ptr(), res->length(), res->charset(),
261
                     decimal_value) & E_DEC_BAD_NUM)
262
  {
263
    push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
264
                        ER_TRUNCATED_WRONG_VALUE,
265
                        ER(ER_TRUNCATED_WRONG_VALUE), "DECIMAL",
266
                        str_value.c_ptr());
267
  }
268
  return decimal_value;
269
}
270
271
272
my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
273
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
274
  assert(fixed == 1);
1 by brian
clean slate
275
  MYSQL_TIME ltime;
276
  if (get_date(&ltime, TIME_FUZZY_DATE))
277
  {
278
    my_decimal_set_zero(decimal_value);
279
    null_value= 1;                               // set NULL, stop processing
280
    return 0;
281
  }
282
  return date2my_decimal(&ltime, decimal_value);
283
}
284
285
286
my_decimal *Item::val_decimal_from_time(my_decimal *decimal_value)
287
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
288
  assert(fixed == 1);
1 by brian
clean slate
289
  MYSQL_TIME ltime;
290
  if (get_time(&ltime))
291
  {
292
    my_decimal_set_zero(decimal_value);
293
    return 0;
294
  }
295
  return date2my_decimal(&ltime, decimal_value);
296
}
297
298
299
double Item::val_real_from_decimal()
300
{
301
  /* Note that fix_fields may not be called for Item_avg_field items */
302
  double result;
303
  my_decimal value_buff, *dec_val= val_decimal(&value_buff);
304
  if (null_value)
305
    return 0.0;
306
  my_decimal2double(E_DEC_FATAL_ERROR, dec_val, &result);
307
  return result;
308
}
309
310
152 by Brian Aker
longlong replacement
311
int64_t Item::val_int_from_decimal()
1 by brian
clean slate
312
{
313
  /* Note that fix_fields may not be called for Item_avg_field items */
152 by Brian Aker
longlong replacement
314
  int64_t result;
1 by brian
clean slate
315
  my_decimal value, *dec_val= val_decimal(&value);
316
  if (null_value)
317
    return 0;
318
  my_decimal2int(E_DEC_FATAL_ERROR, dec_val, unsigned_flag, &result);
319
  return result;
320
}
321
322
int Item::save_time_in_field(Field *field)
323
{
324
  MYSQL_TIME ltime;
325
  if (get_time(&ltime))
326
    return set_field_to_null(field);
327
  field->set_notnull();
328
  return field->store_time(&ltime, MYSQL_TIMESTAMP_TIME);
329
}
330
331
332
int Item::save_date_in_field(Field *field)
333
{
334
  MYSQL_TIME ltime;
335
  if (get_date(&ltime, TIME_FUZZY_DATE))
336
    return set_field_to_null(field);
337
  field->set_notnull();
338
  return field->store_time(&ltime, MYSQL_TIMESTAMP_DATETIME);
339
}
340
341
342
/*
343
  Store the string value in field directly
344
345
  SYNOPSIS
346
    Item::save_str_value_in_field()
347
    field   a pointer to field where to store
348
    result  the pointer to the string value to be stored
349
350
  DESCRIPTION
351
    The method is used by Item_*::save_in_field implementations
352
    when we don't need to calculate the value to store
353
    See Item_string::save_in_field() implementation for example
354
355
  IMPLEMENTATION
356
    Check if the Item is null and stores the NULL or the
357
    result value in the field accordingly.
358
359
  RETURN
360
    Nonzero value if error
361
*/
362
363
int Item::save_str_value_in_field(Field *field, String *result)
364
{
365
  if (null_value)
366
    return set_field_to_null(field);
367
  field->set_notnull();
368
  return field->store(result->ptr(), result->length(),
369
		      collation.collation);
370
}
371
372
373
Item::Item():
374
  is_expensive_cache(-1), rsize(0), name(0), orig_name(0), name_length(0),
56 by brian
Next pass of true/false update.
375
  fixed(0), is_autogenerated_name(true),
1 by brian
clean slate
376
  collation(&my_charset_bin, DERIVATION_COERCIBLE)
377
{
378
  marker= 0;
379
  maybe_null=null_value=with_sum_func=unsigned_flag=0;
380
  decimals= 0; max_length= 0;
381
  with_subselect= 0;
382
  cmp_context= (Item_result)-1;
383
384
  /* Put item in free list so that we can free all items at end */
385
  THD *thd= current_thd;
386
  next= thd->free_list;
387
  thd->free_list= this;
388
  /*
389
    Item constructor can be called during execution other then SQL_COM
390
    command => we should check thd->lex->current_select on zero (thd->lex
391
    can be uninitialised)
392
  */
393
  if (thd->lex->current_select)
394
  {
395
    enum_parsing_place place= 
396
      thd->lex->current_select->parsing_place;
397
    if (place == SELECT_LIST ||
398
	place == IN_HAVING)
399
      thd->lex->current_select->select_n_having_items++;
400
  }
401
}
402
403
/**
404
  Constructor used by Item_field, Item_ref & aggregate (sum)
405
  functions.
406
407
  Used for duplicating lists in processing queries with temporary
408
  tables.
409
*/
410
Item::Item(THD *thd, Item *item):
411
  is_expensive_cache(-1),
412
  rsize(0),
413
  str_value(item->str_value),
414
  name(item->name),
415
  orig_name(item->orig_name),
416
  max_length(item->max_length),
417
  marker(item->marker),
418
  decimals(item->decimals),
419
  maybe_null(item->maybe_null),
420
  null_value(item->null_value),
421
  unsigned_flag(item->unsigned_flag),
422
  with_sum_func(item->with_sum_func),
423
  fixed(item->fixed),
424
  collation(item->collation),
425
  cmp_context(item->cmp_context)
426
{
427
  next= thd->free_list;				// Put in free list
428
  thd->free_list= this;
429
}
430
431
432
uint Item::decimal_precision() const
433
{
434
  Item_result restype= result_type();
435
436
  if ((restype == DECIMAL_RESULT) || (restype == INT_RESULT))
437
    return min(my_decimal_length_to_precision(max_length, decimals, unsigned_flag),
438
               DECIMAL_MAX_PRECISION);
439
  return min(max_length, DECIMAL_MAX_PRECISION);
440
}
441
442
443
void Item::print_item_w_name(String *str, enum_query_type query_type)
444
{
445
  print(str, query_type);
446
447
  if (name)
448
  {
449
    THD *thd= current_thd;
450
    str->append(STRING_WITH_LEN(" AS "));
451
    append_identifier(thd, str, name, (uint) strlen(name));
452
  }
453
}
454
455
456
void Item::cleanup()
457
{
458
  fixed=0;
459
  marker= 0;
460
  if (orig_name)
461
    name= orig_name;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
462
  return;
1 by brian
clean slate
463
}
464
465
466
/**
467
  cleanup() item if it is 'fixed'.
468
469
  @param arg   a dummy parameter, is not used here
470
*/
471
77.1.15 by Monty Taylor
Bunch of warning cleanups.
472
bool Item::cleanup_processor(uchar *arg __attribute__((__unused__)))
1 by brian
clean slate
473
{
474
  if (fixed)
475
    cleanup();
56 by brian
Next pass of true/false update.
476
  return false;
1 by brian
clean slate
477
}
478
479
480
/**
481
  rename item (used for views, cleanup() return original name).
482
483
  @param new_name	new name of item;
484
*/
485
486
void Item::rename(char *new_name)
487
{
488
  /*
489
    we can compare pointers to names here, because if name was not changed,
490
    pointer will be same
491
  */
492
  if (!orig_name && new_name != name)
493
    orig_name= name;
494
  name= new_name;
495
}
496
497
498
/**
499
  Traverse item tree possibly transforming it (replacing items).
500
501
  This function is designed to ease transformation of Item trees.
502
  Re-execution note: every such transformation is registered for
503
  rollback by THD::change_item_tree() and is rolled back at the end
504
  of execution by THD::rollback_item_tree_changes().
505
506
  Therefore:
507
  - this function can not be used at prepared statement prepare
508
  (in particular, in fix_fields!), as only permanent
509
  transformation of Item trees are allowed at prepare.
510
  - the transformer function shall allocate new Items in execution
511
  memory root (thd->mem_root) and not anywhere else: allocated
512
  items will be gone in the end of execution.
513
514
  If you don't need to transform an item tree, but only traverse
515
  it, please use Item::walk() instead.
516
517
518
  @param transformer    functor that performs transformation of a subtree
519
  @param arg            opaque argument passed to the functor
520
521
  @return
522
    Returns pointer to the new subtree root.  THD::change_item_tree()
523
    should be called for it if transformation took place, i.e. if a
524
    pointer to newly allocated item is returned.
525
*/
526
527
Item* Item::transform(Item_transformer transformer, uchar *arg)
528
{
529
  return (this->*transformer)(arg);
530
}
531
532
533
Item_ident::Item_ident(Name_resolution_context *context_arg,
534
                       const char *db_name_arg,const char *table_name_arg,
535
		       const char *field_name_arg)
536
  :orig_db_name(db_name_arg), orig_table_name(table_name_arg),
537
   orig_field_name(field_name_arg), context(context_arg),
538
   db_name(db_name_arg), table_name(table_name_arg),
539
   field_name(field_name_arg),
56 by brian
Next pass of true/false update.
540
   alias_name_used(false), cached_field_index(NO_CACHED_FIELD_INDEX),
1 by brian
clean slate
541
   cached_table(0), depended_from(0)
542
{
543
  name = (char*) field_name_arg;
544
}
545
546
547
/**
548
  Constructor used by Item_field & Item_*_ref (see Item comment)
549
*/
550
551
Item_ident::Item_ident(THD *thd, Item_ident *item)
552
  :Item(thd, item),
553
   orig_db_name(item->orig_db_name),
554
   orig_table_name(item->orig_table_name), 
555
   orig_field_name(item->orig_field_name),
556
   context(item->context),
557
   db_name(item->db_name),
558
   table_name(item->table_name),
559
   field_name(item->field_name),
560
   alias_name_used(item->alias_name_used),
561
   cached_field_index(item->cached_field_index),
562
   cached_table(item->cached_table),
563
   depended_from(item->depended_from)
564
{}
565
566
void Item_ident::cleanup()
567
{
568
#ifdef CANT_BE_USED_AS_MEMORY_IS_FREED
569
		       db_name ? db_name : "(null)",
570
                       orig_db_name ? orig_db_name : "(null)",
571
		       table_name ? table_name : "(null)",
572
                       orig_table_name ? orig_table_name : "(null)",
573
		       field_name ? field_name : "(null)",
574
                       orig_field_name ? orig_field_name : "(null)"));
575
#endif
576
  Item::cleanup();
577
  db_name= orig_db_name; 
578
  table_name= orig_table_name;
579
  field_name= orig_field_name;
580
  depended_from= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
581
  return;
1 by brian
clean slate
582
}
583
584
bool Item_ident::remove_dependence_processor(uchar * arg)
585
{
586
  if (depended_from == (st_select_lex *) arg)
587
    depended_from= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
588
  return(0);
1 by brian
clean slate
589
}
590
591
592
/**
593
  Store the pointer to this item field into a list if not already there.
594
595
  The method is used by Item::walk to collect all unique Item_field objects
596
  from a tree of Items into a set of items represented as a list.
597
598
  Item_cond::walk() and Item_func::walk() stop the evaluation of the
599
  processor function for its arguments once the processor returns
600
  true.Therefore in order to force this method being called for all item
601
  arguments in a condition the method must return false.
602
603
  @param arg  pointer to a List<Item_field>
604
605
  @return
56 by brian
Next pass of true/false update.
606
    false to force the evaluation of collect_item_field_processor
1 by brian
clean slate
607
    for the subsequent items.
608
*/
609
610
bool Item_field::collect_item_field_processor(uchar *arg)
611
{
612
  List<Item_field> *item_list= (List<Item_field>*) arg;
613
  List_iterator<Item_field> item_list_it(*item_list);
614
  Item_field *curr_item;
615
  while ((curr_item= item_list_it++))
616
  {
617
    if (curr_item->eq(this, 1))
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
618
      return(false); /* Already in the set. */
1 by brian
clean slate
619
  }
620
  item_list->push_back(this);
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
621
  return(false);
1 by brian
clean slate
622
}
623
624
625
/**
626
  Check if an Item_field references some field from a list of fields.
627
628
  Check whether the Item_field represented by 'this' references any
629
  of the fields in the keyparts passed via 'arg'. Used with the
630
  method Item::walk() to test whether any keypart in a sequence of
631
  keyparts is referenced in an expression.
632
633
  @param arg   Field being compared, arg must be of type Field
634
635
  @retval
56 by brian
Next pass of true/false update.
636
    true  if 'this' references the field 'arg'
1 by brian
clean slate
637
  @retval
56 by brian
Next pass of true/false update.
638
    false otherwise
1 by brian
clean slate
639
*/
640
641
bool Item_field::find_item_in_field_list_processor(uchar *arg)
642
{
643
  KEY_PART_INFO *first_non_group_part= *((KEY_PART_INFO **) arg);
644
  KEY_PART_INFO *last_part= *(((KEY_PART_INFO **) arg) + 1);
645
  KEY_PART_INFO *cur_part;
646
647
  for (cur_part= first_non_group_part; cur_part != last_part; cur_part++)
648
  {
649
    if (field->eq(cur_part->field))
56 by brian
Next pass of true/false update.
650
      return true;
1 by brian
clean slate
651
  }
56 by brian
Next pass of true/false update.
652
  return false;
1 by brian
clean slate
653
}
654
655
656
/*
657
  Mark field in read_map
658
659
  NOTES
660
    This is used by filesort to register used fields in a a temporary
661
    column read set or to register used fields in a view
662
*/
663
664
bool Item_field::register_field_in_read_map(uchar *arg)
665
{
666
  TABLE *table= (TABLE *) arg;
667
  if (field->table == table || !table)
668
    bitmap_set_bit(field->table->read_set, field->field_index);
669
  return 0;
670
}
671
672
673
bool Item::check_cols(uint c)
674
{
675
  if (c != 1)
676
  {
677
    my_error(ER_OPERAND_COLUMNS, MYF(0), c);
678
    return 1;
679
  }
680
  return 0;
681
}
682
683
684
void Item::set_name(const char *str, uint length, CHARSET_INFO *cs)
685
{
686
  if (!length)
687
  {
688
    /* Empty string, used by AS or internal function like last_insert_id() */
689
    name= (char*) str;
690
    name_length= 0;
691
    return;
692
  }
693
  if (cs->ctype)
694
  {
695
    uint orig_len= length;
696
    /*
697
      This will probably need a better implementation in the future:
698
      a function in CHARSET_INFO structure.
699
    */
700
    while (length && !my_isgraph(cs,*str))
701
    {						// Fix problem with yacc
702
      length--;
703
      str++;
704
    }
705
    if (orig_len != length && !is_autogenerated_name)
706
    {
707
      if (length == 0)
708
        push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
709
                            ER_NAME_BECOMES_EMPTY, ER(ER_NAME_BECOMES_EMPTY),
710
                            str + length - orig_len);
711
      else
712
        push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
713
                            ER_REMOVED_SPACES, ER(ER_REMOVED_SPACES),
714
                            str + length - orig_len);
715
    }
716
  }
717
  if (!my_charset_same(cs, system_charset_info))
718
  {
719
    size_t res_length;
720
    name= sql_strmake_with_convert(str, name_length= length, cs,
721
				   MAX_ALIAS_NAME, system_charset_info,
722
				   &res_length);
723
  }
724
  else
725
    name= sql_strmake(str, (name_length= min(length,MAX_ALIAS_NAME)));
726
}
727
728
729
/**
730
  @details
731
  This function is called when:
732
  - Comparing items in the WHERE clause (when doing where optimization)
733
  - When trying to find an ORDER BY/GROUP BY item in the SELECT part
734
*/
735
77.1.15 by Monty Taylor
Bunch of warning cleanups.
736
bool Item::eq(const Item *item, bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
737
{
738
  /*
56 by brian
Next pass of true/false update.
739
    Note, that this is never true if item is a Item_param:
1 by brian
clean slate
740
    for all basic constants we have special checks, and Item_param's
741
    type() can be only among basic constant types.
742
  */
743
  return type() == item->type() && name && item->name &&
744
    !my_strcasecmp(system_charset_info,name,item->name);
745
}
746
747
748
Item *Item::safe_charset_converter(CHARSET_INFO *tocs)
749
{
750
  Item_func_conv_charset *conv= new Item_func_conv_charset(this, tocs, 1);
751
  return conv->safe ? conv : NULL;
752
}
753
754
755
/**
756
  @details
757
  Created mostly for mysql_prepare_table(). Important
758
  when a string ENUM/SET column is described with a numeric default value:
759
760
  CREATE TABLE t1(a SET('a') DEFAULT 1);
761
762
  We cannot use generic Item::safe_charset_converter(), because
763
  the latter returns a non-fixed Item, so val_str() crashes afterwards.
764
  Override Item_num method, to return a fixed item.
765
*/
77.1.15 by Monty Taylor
Bunch of warning cleanups.
766
Item *Item_num::safe_charset_converter(CHARSET_INFO *tocs __attribute__((__unused__)))
1 by brian
clean slate
767
{
768
  Item_string *conv;
769
  char buf[64];
770
  String *s, tmp(buf, sizeof(buf), &my_charset_bin);
771
  s= val_str(&tmp);
772
  if ((conv= new Item_string(s->ptr(), s->length(), s->charset())))
773
  {
774
    conv->str_value.copy();
775
    conv->str_value.mark_as_const();
776
  }
777
  return conv;
778
}
779
780
77.1.15 by Monty Taylor
Bunch of warning cleanups.
781
Item *Item_static_float_func::safe_charset_converter(CHARSET_INFO *tocs __attribute__((__unused__)))
1 by brian
clean slate
782
{
783
  Item_string *conv;
784
  char buf[64];
785
  String *s, tmp(buf, sizeof(buf), &my_charset_bin);
786
  s= val_str(&tmp);
787
  if ((conv= new Item_static_string_func(func_name, s->ptr(), s->length(),
788
                                         s->charset())))
789
  {
790
    conv->str_value.copy();
791
    conv->str_value.mark_as_const();
792
  }
793
  return conv;
794
}
795
796
797
Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs)
798
{
799
  Item_string *conv;
800
  uint conv_errors;
801
  char *ptr;
802
  String tmp, cstr, *ostr= val_str(&tmp);
803
  cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
804
  if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(),
805
                                             cstr.charset(),
806
                                             collation.derivation)))
807
  {
808
    /*
809
      Safe conversion is not possible (or EOM).
810
      We could not convert a string into the requested character set
811
      without data loss. The target charset does not cover all the
812
      characters from the string. Operation cannot be done correctly.
813
    */
814
    return NULL;
815
  }
816
  if (!(ptr= current_thd->strmake(cstr.ptr(), cstr.length())))
817
    return NULL;
818
  conv->str_value.set(ptr, cstr.length(), cstr.charset());
819
  /* Ensure that no one is going to change the result string */
820
  conv->str_value.mark_as_const();
821
  return conv;
822
}
823
824
825
Item *Item_param::safe_charset_converter(CHARSET_INFO *tocs)
826
{
827
  if (const_item())
828
  {
829
    uint cnv_errors;
830
    String *ostr= val_str(&cnvstr);
831
    cnvitem->str_value.copy(ostr->ptr(), ostr->length(),
832
                            ostr->charset(), tocs, &cnv_errors);
833
    if (cnv_errors)
834
       return NULL;
835
    cnvitem->str_value.mark_as_const();
836
    cnvitem->max_length= cnvitem->str_value.numchars() * tocs->mbmaxlen;
837
    return cnvitem;
838
  }
839
  return NULL;
840
}
841
842
843
Item *Item_static_string_func::safe_charset_converter(CHARSET_INFO *tocs)
844
{
845
  Item_string *conv;
846
  uint conv_errors;
847
  String tmp, cstr, *ostr= val_str(&tmp);
848
  cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
849
  if (conv_errors ||
850
      !(conv= new Item_static_string_func(func_name,
851
                                          cstr.ptr(), cstr.length(),
852
                                          cstr.charset(),
853
                                          collation.derivation)))
854
  {
855
    /*
856
      Safe conversion is not possible (or EOM).
857
      We could not convert a string into the requested character set
858
      without data loss. The target charset does not cover all the
859
      characters from the string. Operation cannot be done correctly.
860
    */
861
    return NULL;
862
  }
863
  conv->str_value.copy();
864
  /* Ensure that no one is going to change the result string */
865
  conv->str_value.mark_as_const();
866
  return conv;
867
}
868
869
870
bool Item_string::eq(const Item *item, bool binary_cmp) const
871
{
872
  if (type() == item->type() && item->basic_const_item())
873
  {
874
    if (binary_cmp)
875
      return !stringcmp(&str_value, &item->str_value);
876
    return (collation.collation == item->collation.collation &&
877
	    !sortcmp(&str_value, &item->str_value, collation.collation));
878
  }
879
  return 0;
880
}
881
882
883
/**
884
  Get the value of the function as a MYSQL_TIME structure.
885
  As a extra convenience the time structure is reset on error!
886
*/
887
888
bool Item::get_date(MYSQL_TIME *ltime,uint fuzzydate)
889
{
890
  if (result_type() == STRING_RESULT)
891
  {
892
    char buff[40];
893
    String tmp(buff,sizeof(buff), &my_charset_bin),*res;
894
    if (!(res=val_str(&tmp)) ||
895
        str_to_datetime_with_warn(res->ptr(), res->length(),
896
                                  ltime, fuzzydate) <= MYSQL_TIMESTAMP_ERROR)
897
      goto err;
898
  }
899
  else
900
  {
152 by Brian Aker
longlong replacement
901
    int64_t value= val_int();
1 by brian
clean slate
902
    int was_cut;
80.1.1 by Brian Aker
LL() cleanup
903
    if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == -1LL)
1 by brian
clean slate
904
    {
905
      char buff[22], *end;
152 by Brian Aker
longlong replacement
906
      end= int64_t10_to_str(value, buff, -10);
1 by brian
clean slate
907
      make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
908
                                   buff, (int) (end-buff), MYSQL_TIMESTAMP_NONE,
909
                                   NullS);
910
      goto err;
911
    }
912
  }
913
  return 0;
914
915
err:
916
  bzero((char*) ltime,sizeof(*ltime));
917
  return 1;
918
}
919
920
/**
921
  Get time of first argument.\
922
923
  As a extra convenience the time structure is reset on error!
924
*/
925
926
bool Item::get_time(MYSQL_TIME *ltime)
927
{
928
  char buff[40];
929
  String tmp(buff,sizeof(buff),&my_charset_bin),*res;
930
  if (!(res=val_str(&tmp)) ||
931
      str_to_time_with_warn(res->ptr(), res->length(), ltime))
932
  {
933
    bzero((char*) ltime,sizeof(*ltime));
934
    return 1;
935
  }
936
  return 0;
937
}
938
939
CHARSET_INFO *Item::default_charset()
940
{
941
  return current_thd->variables.collation_connection;
942
}
943
944
945
/*
946
  Save value in field, but don't give any warnings
947
948
  NOTES
949
   This is used to temporary store and retrieve a value in a column,
950
   for example in opt_range to adjust the key value to fit the column.
951
*/
952
953
int Item::save_in_field_no_warnings(Field *field, bool no_conversions)
954
{
955
  int res;
956
  TABLE *table= field->table;
957
  THD *thd= table->in_use;
958
  enum_check_fields tmp= thd->count_cuted_fields;
959
  my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->write_set);
960
  ulong sql_mode= thd->variables.sql_mode;
961
  thd->variables.sql_mode&= ~(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE);
962
  thd->count_cuted_fields= CHECK_FIELD_IGNORE;
963
  res= save_in_field(field, no_conversions);
964
  thd->count_cuted_fields= tmp;
965
  dbug_tmp_restore_column_map(table->write_set, old_map);
966
  thd->variables.sql_mode= sql_mode;
967
  return res;
968
}
969
970
971
/*
972
 need a special class to adjust printing : references to aggregate functions 
973
 must not be printed as refs because the aggregate functions that are added to
974
 the front of select list are not printed as well.
975
*/
976
class Item_aggregate_ref : public Item_ref
977
{
978
public:
979
  Item_aggregate_ref(Name_resolution_context *context_arg, Item **item,
980
                  const char *table_name_arg, const char *field_name_arg)
981
    :Item_ref(context_arg, item, table_name_arg, field_name_arg) {}
982
983
  virtual inline void print (String *str, enum_query_type query_type)
984
  {
985
    if (ref)
986
      (*ref)->print(str, query_type);
987
    else
988
      Item_ident::print(str, query_type);
989
  }
990
};
991
992
993
/**
994
  Move SUM items out from item tree and replace with reference.
995
996
  @param thd			Thread handler
997
  @param ref_pointer_array	Pointer to array of reference fields
998
  @param fields		All fields in select
999
  @param ref			Pointer to item
1000
  @param skip_registered       <=> function be must skipped for registered
1001
                               SUM items
1002
1003
  @note
1004
    This is from split_sum_func2() for items that should be split
1005
1006
    All found SUM items are added FIRST in the fields list and
1007
    we replace the item with a reference.
1008
1009
    thd->fatal_error() may be called if we are out of memory
1010
*/
1011
1012
void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
1013
                           List<Item> &fields, Item **ref, 
1014
                           bool skip_registered)
1015
{
1016
  /* An item of type Item_sum  is registered <=> ref_by != 0 */ 
1017
  if (type() == SUM_FUNC_ITEM && skip_registered && 
1018
      ((Item_sum *) this)->ref_by)
1019
    return;                                                 
1020
  if ((type() != SUM_FUNC_ITEM && with_sum_func) ||
1021
      (type() == FUNC_ITEM &&
1022
       (((Item_func *) this)->functype() == Item_func::ISNOTNULLTEST_FUNC ||
1023
        ((Item_func *) this)->functype() == Item_func::TRIG_COND_FUNC)))
1024
  {
1025
    /* Will split complicated items and ignore simple ones */
1026
    split_sum_func(thd, ref_pointer_array, fields);
1027
  }
1028
  else if ((type() == SUM_FUNC_ITEM || (used_tables() & ~PARAM_TABLE_BIT)) &&
1029
           type() != SUBSELECT_ITEM &&
1030
           (type() != REF_ITEM ||
1031
           ((Item_ref*)this)->ref_type() == Item_ref::VIEW_REF))
1032
  {
1033
    /*
1034
      Replace item with a reference so that we can easily calculate
1035
      it (in case of sum functions) or copy it (in case of fields)
1036
1037
      The test above is to ensure we don't do a reference for things
1038
      that are constants (PARAM_TABLE_BIT is in effect a constant)
1039
      or already referenced (for example an item in HAVING)
1040
      Exception is Item_direct_view_ref which we need to convert to
1041
      Item_ref to allow fields from view being stored in tmp table.
1042
    */
1043
    Item_aggregate_ref *item_ref;
1044
    uint el= fields.elements;
1045
    Item *real_itm= real_item();
1046
1047
    ref_pointer_array[el]= real_itm;
1048
    if (!(item_ref= new Item_aggregate_ref(&thd->lex->current_select->context,
1049
                                           ref_pointer_array + el, 0, name)))
1050
      return;                                   // fatal_error is set
1051
    if (type() == SUM_FUNC_ITEM)
1052
      item_ref->depended_from= ((Item_sum *) this)->depended_from(); 
1053
    fields.push_front(real_itm);
1054
    thd->change_item_tree(ref, item_ref);
1055
  }
1056
}
1057
1058
1059
static bool
1060
left_is_superset(DTCollation *left, DTCollation *right)
1061
{
1062
  /* Allow convert to Unicode */
1063
  if (left->collation->state & MY_CS_UNICODE &&
1064
      (left->derivation < right->derivation ||
1065
       (left->derivation == right->derivation &&
1066
        !(right->collation->state & MY_CS_UNICODE))))
56 by brian
Next pass of true/false update.
1067
    return true;
1 by brian
clean slate
1068
  /* Allow convert from ASCII */
1069
  if (right->repertoire == MY_REPERTOIRE_ASCII &&
1070
      (left->derivation < right->derivation ||
1071
       (left->derivation == right->derivation &&
1072
        !(left->repertoire == MY_REPERTOIRE_ASCII))))
56 by brian
Next pass of true/false update.
1073
    return true;
1 by brian
clean slate
1074
  /* Disallow conversion otherwise */
56 by brian
Next pass of true/false update.
1075
  return false;
1 by brian
clean slate
1076
}
1077
1078
/**
1079
  Aggregate two collations together taking
1080
  into account their coercibility (aka derivation):.
1081
1082
  0 == DERIVATION_EXPLICIT  - an explicitly written COLLATE clause @n
1083
  1 == DERIVATION_NONE      - a mix of two different collations @n
1084
  2 == DERIVATION_IMPLICIT  - a column @n
1085
  3 == DERIVATION_COERCIBLE - a string constant.
1086
1087
  The most important rules are:
1088
  -# If collations are the same:
1089
  chose this collation, and the strongest derivation.
1090
  -# If collations are different:
1091
  - Character sets may differ, but only if conversion without
1092
  data loss is possible. The caller provides flags whether
1093
  character set conversion attempts should be done. If no
1094
  flags are substituted, then the character sets must be the same.
1095
  Currently processed flags are:
1096
  MY_COLL_ALLOW_SUPERSET_CONV  - allow conversion to a superset
1097
  MY_COLL_ALLOW_COERCIBLE_CONV - allow conversion of a coercible value
1098
  - two EXPLICIT collations produce an error, e.g. this is wrong:
1099
  CONCAT(expr1 collate latin1_swedish_ci, expr2 collate latin1_german_ci)
1100
  - the side with smaller derivation value wins,
1101
  i.e. a column is stronger than a string constant,
1102
  an explicit COLLATE clause is stronger than a column.
1103
  - if derivations are the same, we have DERIVATION_NONE,
1104
  we'll wait for an explicit COLLATE clause which possibly can
1105
  come from another argument later: for example, this is valid,
1106
  but we don't know yet when collecting the first two arguments:
1107
     @code
1108
       CONCAT(latin1_swedish_ci_column,
1109
              latin1_german1_ci_column,
1110
              expr COLLATE latin1_german2_ci)
1111
  @endcode
1112
*/
1113
1114
bool DTCollation::aggregate(DTCollation &dt, uint flags)
1115
{
1116
  if (!my_charset_same(collation, dt.collation))
1117
  {
1118
    /* 
1119
       We do allow to use binary strings (like BLOBS)
1120
       together with character strings.
1121
       Binaries have more precedence than a character
1122
       string of the same derivation.
1123
    */
1124
    if (collation == &my_charset_bin)
1125
    {
1126
      if (derivation <= dt.derivation)
1127
	; // Do nothing
1128
      else
1129
      {
1130
	set(dt); 
1131
      }
1132
    }
1133
    else if (dt.collation == &my_charset_bin)
1134
    {
1135
      if (dt.derivation <= derivation)
1136
      {
1137
        set(dt);
1138
      }
1139
      else
1140
      {
1141
        // Do nothing
1142
      }
1143
    }
1144
    else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) &&
1145
             left_is_superset(this, &dt))
1146
    {
1147
      // Do nothing
1148
    }
1149
    else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) &&
1150
             left_is_superset(&dt, this))
1151
    {
1152
      set(dt);
1153
    }
1154
    else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
1155
             derivation < dt.derivation &&
1156
             dt.derivation >= DERIVATION_SYSCONST)
1157
    {
1158
      // Do nothing;
1159
    }
1160
    else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
1161
             dt.derivation < derivation &&
1162
             derivation >= DERIVATION_SYSCONST)
1163
    {
1164
      set(dt);
1165
    }
1166
    else
1167
    {
1168
      // Cannot apply conversion
1169
      set(0, DERIVATION_NONE, 0);
1170
      return 1;
1171
    }
1172
  }
1173
  else if (derivation < dt.derivation)
1174
  {
1175
    // Do nothing
1176
  }
1177
  else if (dt.derivation < derivation)
1178
  {
1179
    set(dt);
1180
  }
1181
  else
1182
  { 
1183
    if (collation == dt.collation)
1184
    {
1185
      // Do nothing
1186
    }
1187
    else 
1188
    {
1189
      if (derivation == DERIVATION_EXPLICIT)
1190
      {
1191
        set(0, DERIVATION_NONE, 0);
1192
        return 1;
1193
      }
1194
      if (collation->state & MY_CS_BINSORT)
1195
        return 0;
1196
      if (dt.collation->state & MY_CS_BINSORT)
1197
      {
1198
        set(dt);
1199
        return 0;
1200
      }
1201
      CHARSET_INFO *bin= get_charset_by_csname(collation->csname, 
1202
                                               MY_CS_BINSORT,MYF(0));
1203
      set(bin, DERIVATION_NONE);
1204
    }
1205
  }
1206
  repertoire|= dt.repertoire;
1207
  return 0;
1208
}
1209
1210
/******************************/
1211
static
1212
void my_coll_agg_error(DTCollation &c1, DTCollation &c2, const char *fname)
1213
{
1214
  my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
1215
           c1.collation->name,c1.derivation_name(),
1216
           c2.collation->name,c2.derivation_name(),
1217
           fname);
1218
}
1219
1220
1221
static
1222
void my_coll_agg_error(DTCollation &c1, DTCollation &c2, DTCollation &c3,
1223
                       const char *fname)
1224
{
1225
  my_error(ER_CANT_AGGREGATE_3COLLATIONS,MYF(0),
1226
  	   c1.collation->name,c1.derivation_name(),
1227
	   c2.collation->name,c2.derivation_name(),
1228
	   c3.collation->name,c3.derivation_name(),
1229
	   fname);
1230
}
1231
1232
1233
static
1234
void my_coll_agg_error(Item** args, uint count, const char *fname,
1235
                       int item_sep)
1236
{
1237
  if (count == 2)
1238
    my_coll_agg_error(args[0]->collation, args[item_sep]->collation, fname);
1239
  else if (count == 3)
1240
    my_coll_agg_error(args[0]->collation, args[item_sep]->collation,
1241
                      args[2*item_sep]->collation, fname);
1242
  else
1243
    my_error(ER_CANT_AGGREGATE_NCOLLATIONS,MYF(0),fname);
1244
}
1245
1246
1247
bool agg_item_collations(DTCollation &c, const char *fname,
1248
                         Item **av, uint count, uint flags, int item_sep)
1249
{
1250
  uint i;
1251
  Item **arg;
1252
  c.set(av[0]->collation);
1253
  for (i= 1, arg= &av[item_sep]; i < count; i++, arg++)
1254
  {
1255
    if (c.aggregate((*arg)->collation, flags))
1256
    {
1257
      my_coll_agg_error(av, count, fname, item_sep);
56 by brian
Next pass of true/false update.
1258
      return true;
1 by brian
clean slate
1259
    }
1260
  }
1261
  if ((flags & MY_COLL_DISALLOW_NONE) &&
1262
      c.derivation == DERIVATION_NONE)
1263
  {
1264
    my_coll_agg_error(av, count, fname, item_sep);
56 by brian
Next pass of true/false update.
1265
    return true;
1 by brian
clean slate
1266
  }
56 by brian
Next pass of true/false update.
1267
  return false;
1 by brian
clean slate
1268
}
1269
1270
1271
bool agg_item_collations_for_comparison(DTCollation &c, const char *fname,
1272
                                        Item **av, uint count, uint flags)
1273
{
1274
  return (agg_item_collations(c, fname, av, count,
1275
                              flags | MY_COLL_DISALLOW_NONE, 1));
1276
}
1277
1278
1279
/**
1280
  Collect arguments' character sets together.
1281
1282
  We allow to apply automatic character set conversion in some cases.
1283
  The conditions when conversion is possible are:
1284
  - arguments A and B have different charsets
1285
  - A wins according to coercibility rules
1286
    (i.e. a column is stronger than a string constant,
1287
     an explicit COLLATE clause is stronger than a column)
1288
  - character set of A is either superset for character set of B,
1289
    or B is a string constant which can be converted into the
1290
    character set of A without data loss.
1291
    
1292
  If all of the above is true, then it's possible to convert
1293
  B into the character set of A, and then compare according
1294
  to the collation of A.
1295
  
1296
  For functions with more than two arguments:
1297
  @code
1298
    collect(A,B,C) ::= collect(collect(A,B),C)
1299
  @endcode
1300
  Since this function calls THD::change_item_tree() on the passed Item **
1301
  pointers, it is necessary to pass the original Item **'s, not copies.
1302
  Otherwise their values will not be properly restored (see BUG#20769).
1303
  If the items are not consecutive (eg. args[2] and args[5]), use the
1304
  item_sep argument, ie.
1305
  @code
1306
    agg_item_charsets(coll, fname, &args[2], 2, flags, 3)
1307
  @endcode
1308
*/
1309
1310
bool agg_item_charsets(DTCollation &coll, const char *fname,
1311
                       Item **args, uint nargs, uint flags, int item_sep)
1312
{
1313
  Item **arg, *safe_args[2];
1314
1315
  memset(safe_args, 0, sizeof(safe_args));
1316
1317
  if (agg_item_collations(coll, fname, args, nargs, flags, item_sep))
56 by brian
Next pass of true/false update.
1318
    return true;
1 by brian
clean slate
1319
1320
  /*
1321
    For better error reporting: save the first and the second argument.
1322
    We need this only if the the number of args is 3 or 2:
1323
    - for a longer argument list, "Illegal mix of collations"
1324
      doesn't display each argument's characteristics.
1325
    - if nargs is 1, then this error cannot happen.
1326
  */
1327
  if (nargs >=2 && nargs <= 3)
1328
  {
1329
    safe_args[0]= args[0];
1330
    safe_args[1]= args[item_sep];
1331
  }
1332
1333
  THD *thd= current_thd;
1334
  Query_arena *arena, backup;
56 by brian
Next pass of true/false update.
1335
  bool res= false;
1 by brian
clean slate
1336
  uint i;
1337
  /*
1338
    In case we're in statement prepare, create conversion item
1339
    in its memory: it will be reused on each execute.
1340
  */
1341
  arena= NULL;
1342
1343
  for (i= 0, arg= args; i < nargs; i++, arg+= item_sep)
1344
  {
1345
    Item* conv;
1346
    uint32 dummy_offset;
1347
    if (!String::needs_conversion(0, (*arg)->collation.collation,
1348
                                  coll.collation,
1349
                                  &dummy_offset))
1350
      continue;
1351
1352
    if (!(conv= (*arg)->safe_charset_converter(coll.collation)) &&
1353
        ((*arg)->collation.repertoire == MY_REPERTOIRE_ASCII))
1354
      conv= new Item_func_conv_charset(*arg, coll.collation, 1);
1355
1356
    if (!conv)
1357
    {
1358
      if (nargs >=2 && nargs <= 3)
1359
      {
1360
        /* restore the original arguments for better error message */
1361
        args[0]= safe_args[0];
1362
        args[item_sep]= safe_args[1];
1363
      }
1364
      my_coll_agg_error(args, nargs, fname, item_sep);
56 by brian
Next pass of true/false update.
1365
      res= true;
1 by brian
clean slate
1366
      break; // we cannot return here, we need to restore "arena".
1367
    }
1368
    if ((*arg)->type() == Item::FIELD_ITEM)
1369
      ((Item_field *)(*arg))->no_const_subst= 1;
1370
    /*
1371
      If in statement prepare, then we create a converter for two
1372
      constant items, do it once and then reuse it.
1373
      If we're in execution of a prepared statement, arena is NULL,
1374
      and the conv was created in runtime memory. This can be
1375
      the case only if the argument is a parameter marker ('?'),
1376
      because for all true constants the charset converter has already
1377
      been created in prepare. In this case register the change for
1378
      rollback.
1379
    */
1380
    thd->change_item_tree(arg, conv);
1381
    /*
1382
      We do not check conv->fixed, because Item_func_conv_charset which can
1383
      be return by safe_charset_converter can't be fixed at creation
1384
    */
1385
    conv->fix_fields(thd, arg);
1386
  }
1387
  if (arena)
1388
    thd->restore_active_arena(arena, &backup);
1389
  return res;
1390
}
1391
1392
1393
void Item_ident_for_show::make_field(Send_field *tmp_field)
1394
{
1395
  tmp_field->table_name= tmp_field->org_table_name= table_name;
1396
  tmp_field->db_name= db_name;
1397
  tmp_field->col_name= tmp_field->org_col_name= field->field_name;
1398
  tmp_field->charsetnr= field->charset()->number;
1399
  tmp_field->length=field->field_length;
1400
  tmp_field->type=field->type();
1401
  tmp_field->flags= field->table->maybe_null ? 
1402
    (field->flags & ~NOT_NULL_FLAG) : field->flags;
1403
  tmp_field->decimals= field->decimals();
1404
}
1405
1406
/**********************************************/
1407
1408
Item_field::Item_field(Field *f)
1409
  :Item_ident(0, NullS, *f->table_name, f->field_name),
1410
   item_equal(0), no_const_subst(0),
1411
   have_privileges(0), any_privileges(0)
1412
{
1413
  set_field(f);
1414
  /*
1415
    field_name and table_name should not point to garbage
1416
    if this item is to be reused
1417
  */
1418
  orig_table_name= orig_field_name= "";
1419
}
1420
1421
1422
/**
1423
  Constructor used inside setup_wild().
1424
1425
  Ensures that field, table, and database names will live as long as
1426
  Item_field (this is important in prepared statements).
1427
*/
1428
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1429
Item_field::Item_field(THD *thd __attribute__((__unused__)),
1430
                       Name_resolution_context *context_arg,
1 by brian
clean slate
1431
                       Field *f)
1432
  :Item_ident(context_arg, f->table->s->db.str, *f->table_name, f->field_name),
1433
   item_equal(0), no_const_subst(0),
1434
   have_privileges(0), any_privileges(0)
1435
{
1436
  set_field(f);
1437
}
1438
1439
1440
Item_field::Item_field(Name_resolution_context *context_arg,
1441
                       const char *db_arg,const char *table_name_arg,
1442
                       const char *field_name_arg)
1443
  :Item_ident(context_arg, db_arg,table_name_arg,field_name_arg),
1444
   field(0), result_field(0), item_equal(0), no_const_subst(0),
1445
   have_privileges(0), any_privileges(0)
1446
{
1447
  SELECT_LEX *select= current_thd->lex->current_select;
1448
  collation.set(DERIVATION_IMPLICIT);
1449
  if (select && select->parsing_place != IN_HAVING)
1450
      select->select_n_where_fields++;
1451
}
1452
1453
/**
1454
  Constructor need to process subselect with temporary tables (see Item)
1455
*/
1456
1457
Item_field::Item_field(THD *thd, Item_field *item)
1458
  :Item_ident(thd, item),
1459
   field(item->field),
1460
   result_field(item->result_field),
1461
   item_equal(item->item_equal),
1462
   no_const_subst(item->no_const_subst),
1463
   have_privileges(item->have_privileges),
1464
   any_privileges(item->any_privileges)
1465
{
1466
  collation.set(DERIVATION_IMPLICIT);
1467
}
1468
1469
void Item_field::set_field(Field *field_par)
1470
{
1471
  field=result_field=field_par;			// for easy coding with fields
1472
  maybe_null=field->maybe_null();
1473
  decimals= field->decimals();
1474
  max_length= field_par->max_display_length();
1475
  table_name= *field_par->table_name;
1476
  field_name= field_par->field_name;
1477
  db_name= field_par->table->s->db.str;
1478
  alias_name_used= field_par->table->alias_name_used;
1479
  unsigned_flag=test(field_par->flags & UNSIGNED_FLAG);
1480
  collation.set(field_par->charset(), field_par->derivation());
1481
  fixed= 1;
1482
  if (field->table->s->tmp_table == SYSTEM_TMP_TABLE)
1483
    any_privileges= 0;
1484
}
1485
1486
1487
/**
1488
  Reset this item to point to a field from the new temporary table.
1489
  This is used when we create a new temporary table for each execution
1490
  of prepared statement.
1491
*/
1492
1493
void Item_field::reset_field(Field *f)
1494
{
1495
  set_field(f);
1496
  /* 'name' is pointing at field->field_name of old field */
1497
  name= (char*) f->field_name;
1498
}
1499
1500
const char *Item_ident::full_name() const
1501
{
1502
  char *tmp;
1503
  if (!table_name || !field_name)
1504
    return field_name ? field_name : name ? name : "tmp_field";
1505
  if (db_name && db_name[0])
1506
  {
1507
    tmp=(char*) sql_alloc((uint) strlen(db_name)+(uint) strlen(table_name)+
1508
			  (uint) strlen(field_name)+3);
1509
    strxmov(tmp,db_name,".",table_name,".",field_name,NullS);
1510
  }
1511
  else
1512
  {
1513
    if (table_name[0])
1514
    {
1515
      tmp= (char*) sql_alloc((uint) strlen(table_name) +
1516
			     (uint) strlen(field_name) + 2);
1517
      strxmov(tmp, table_name, ".", field_name, NullS);
1518
    }
1519
    else
1520
      tmp= (char*) field_name;
1521
  }
1522
  return tmp;
1523
}
1524
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1525
void Item_ident::print(String *str,
1526
                       enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
1527
{
1528
  THD *thd= current_thd;
1529
  char d_name_buff[MAX_ALIAS_NAME], t_name_buff[MAX_ALIAS_NAME];
1530
  const char *d_name= db_name, *t_name= table_name;
1531
  if (lower_case_table_names== 1 ||
1532
      (lower_case_table_names == 2 && !alias_name_used))
1533
  {
1534
    if (table_name && table_name[0])
1535
    {
1536
      strmov(t_name_buff, table_name);
1537
      my_casedn_str(files_charset_info, t_name_buff);
1538
      t_name= t_name_buff;
1539
    }
1540
    if (db_name && db_name[0])
1541
    {
1542
      strmov(d_name_buff, db_name);
1543
      my_casedn_str(files_charset_info, d_name_buff);
1544
      d_name= d_name_buff;
1545
    }
1546
  }
1547
1548
  if (!table_name || !field_name || !field_name[0])
1549
  {
1550
    const char *nm= (field_name && field_name[0]) ?
1551
                      field_name : name ? name : "tmp_field";
1552
    append_identifier(thd, str, nm, (uint) strlen(nm));
1553
    return;
1554
  }
1555
  if (db_name && db_name[0] && !alias_name_used)
1556
  {
1557
    {
1558
      append_identifier(thd, str, d_name, (uint)strlen(d_name));
1559
      str->append('.');
1560
    }
1561
    append_identifier(thd, str, t_name, (uint)strlen(t_name));
1562
    str->append('.');
1563
    append_identifier(thd, str, field_name, (uint)strlen(field_name));
1564
  }
1565
  else
1566
  {
1567
    if (table_name[0])
1568
    {
1569
      append_identifier(thd, str, t_name, (uint) strlen(t_name));
1570
      str->append('.');
1571
      append_identifier(thd, str, field_name, (uint) strlen(field_name));
1572
    }
1573
    else
1574
      append_identifier(thd, str, field_name, (uint) strlen(field_name));
1575
  }
1576
}
1577
1578
/* ARGSUSED */
1579
String *Item_field::val_str(String *str)
1580
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1581
  assert(fixed == 1);
1 by brian
clean slate
1582
  if ((null_value=field->is_null()))
1583
    return 0;
1584
  str->set_charset(str_value.charset());
1585
  return field->val_str(str,&str_value);
1586
}
1587
1588
1589
double Item_field::val_real()
1590
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1591
  assert(fixed == 1);
1 by brian
clean slate
1592
  if ((null_value=field->is_null()))
1593
    return 0.0;
1594
  return field->val_real();
1595
}
1596
1597
152 by Brian Aker
longlong replacement
1598
int64_t Item_field::val_int()
1 by brian
clean slate
1599
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1600
  assert(fixed == 1);
1 by brian
clean slate
1601
  if ((null_value=field->is_null()))
1602
    return 0;
1603
  return field->val_int();
1604
}
1605
1606
1607
my_decimal *Item_field::val_decimal(my_decimal *decimal_value)
1608
{
1609
  if ((null_value= field->is_null()))
1610
    return 0;
1611
  return field->val_decimal(decimal_value);
1612
}
1613
1614
1615
String *Item_field::str_result(String *str)
1616
{
1617
  if ((null_value=result_field->is_null()))
1618
    return 0;
1619
  str->set_charset(str_value.charset());
1620
  return result_field->val_str(str,&str_value);
1621
}
1622
1623
bool Item_field::get_date(MYSQL_TIME *ltime,uint fuzzydate)
1624
{
1625
  if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
1626
  {
1627
    bzero((char*) ltime,sizeof(*ltime));
1628
    return 1;
1629
  }
1630
  return 0;
1631
}
1632
1633
bool Item_field::get_date_result(MYSQL_TIME *ltime,uint fuzzydate)
1634
{
1635
  if ((null_value=result_field->is_null()) ||
1636
      result_field->get_date(ltime,fuzzydate))
1637
  {
1638
    bzero((char*) ltime,sizeof(*ltime));
1639
    return 1;
1640
  }
1641
  return 0;
1642
}
1643
1644
bool Item_field::get_time(MYSQL_TIME *ltime)
1645
{
1646
  if ((null_value=field->is_null()) || field->get_time(ltime))
1647
  {
1648
    bzero((char*) ltime,sizeof(*ltime));
1649
    return 1;
1650
  }
1651
  return 0;
1652
}
1653
1654
double Item_field::val_result()
1655
{
1656
  if ((null_value=result_field->is_null()))
1657
    return 0.0;
1658
  return result_field->val_real();
1659
}
1660
152 by Brian Aker
longlong replacement
1661
int64_t Item_field::val_int_result()
1 by brian
clean slate
1662
{
1663
  if ((null_value=result_field->is_null()))
1664
    return 0;
1665
  return result_field->val_int();
1666
}
1667
1668
1669
my_decimal *Item_field::val_decimal_result(my_decimal *decimal_value)
1670
{
1671
  if ((null_value= result_field->is_null()))
1672
    return 0;
1673
  return result_field->val_decimal(decimal_value);
1674
}
1675
1676
1677
bool Item_field::val_bool_result()
1678
{
1679
  if ((null_value= result_field->is_null()))
56 by brian
Next pass of true/false update.
1680
    return false;
1 by brian
clean slate
1681
  switch (result_field->result_type()) {
1682
  case INT_RESULT:
1683
    return result_field->val_int() != 0;
1684
  case DECIMAL_RESULT:
1685
  {
1686
    my_decimal decimal_value;
1687
    my_decimal *val= result_field->val_decimal(&decimal_value);
1688
    if (val)
1689
      return !my_decimal_is_zero(val);
1690
    return 0;
1691
  }
1692
  case REAL_RESULT:
1693
  case STRING_RESULT:
1694
    return result_field->val_real() != 0.0;
1695
  case ROW_RESULT:
1696
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1697
    assert(0);
1 by brian
clean slate
1698
    return 0;                                   // Shut up compiler
1699
  }
1700
}
1701
1702
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1703
bool Item_field::eq(const Item *item,
1704
                    bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
1705
{
1706
  Item *real_item= ((Item *) item)->real_item();
1707
  if (real_item->type() != FIELD_ITEM)
1708
    return 0;
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1709
1 by brian
clean slate
1710
  Item_field *item_field= (Item_field*) real_item;
1711
  if (item_field->field && field)
1712
    return item_field->field == field;
1713
  /*
1714
    We may come here when we are trying to find a function in a GROUP BY
1715
    clause from the select list.
1716
    In this case the '100 % correct' way to do this would be to first
1717
    run fix_fields() on the GROUP BY item and then retry this function, but
1718
    I think it's better to relax the checking a bit as we will in
1719
    most cases do the correct thing by just checking the field name.
1720
    (In cases where we would choose wrong we would have to generate a
1721
    ER_NON_UNIQ_ERROR).
1722
  */
1723
  return (!my_strcasecmp(system_charset_info, item_field->name,
1724
			 field_name) &&
1725
	  (!item_field->table_name || !table_name ||
1726
	   (!my_strcasecmp(table_alias_charset, item_field->table_name,
1727
			   table_name) &&
1728
	    (!item_field->db_name || !db_name ||
1729
	     (item_field->db_name && !strcmp(item_field->db_name,
1730
					     db_name))))));
1731
}
1732
1733
1734
table_map Item_field::used_tables() const
1735
{
1736
  if (field->table->const_table)
1737
    return 0;					// const item
1738
  return (depended_from ? OUTER_REF_TABLE_BIT : field->table->map);
1739
}
1740
1741
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1742
void Item_field::fix_after_pullout(st_select_lex *new_parent,
1743
                                   Item **ref __attribute__((__unused__)))
1 by brian
clean slate
1744
{
1745
  if (new_parent == depended_from)
1746
    depended_from= NULL;
1747
  Name_resolution_context *ctx= new Name_resolution_context();
1748
  ctx->outer_context= NULL; // We don't build a complete name resolver
1749
  ctx->select_lex= new_parent;
1750
  ctx->first_name_resolution_table= context->first_name_resolution_table;
1751
  ctx->last_name_resolution_table=  context->last_name_resolution_table;
1752
  this->context=ctx;
1753
}
1754
1755
1756
Item *Item_field::get_tmp_table_item(THD *thd)
1757
{
1758
  Item_field *new_item= new Item_field(thd, this);
1759
  if (new_item)
1760
    new_item->field= new_item->result_field;
1761
  return new_item;
1762
}
1763
152 by Brian Aker
longlong replacement
1764
int64_t Item_field::val_int_endpoint(bool left_endp __attribute__((__unused__)),
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1765
                                      bool *incl_endp __attribute__((__unused__)))
1 by brian
clean slate
1766
{
152 by Brian Aker
longlong replacement
1767
  int64_t res= val_int();
1 by brian
clean slate
1768
  return null_value? LONGLONG_MIN : res;
1769
}
1770
1771
/**
152 by Brian Aker
longlong replacement
1772
  Create an item from a string we KNOW points to a valid int64_t
1 by brian
clean slate
1773
  end \\0 terminated number string.
1774
  This is always 'signed'. Unsigned values are created with Item_uint()
1775
*/
1776
1777
Item_int::Item_int(const char *str_arg, uint length)
1778
{
1779
  char *end_ptr= (char*) str_arg + length;
1780
  int error;
1781
  value= my_strtoll10(str_arg, &end_ptr, &error);
1782
  max_length= (uint) (end_ptr - str_arg);
1783
  name= (char*) str_arg;
1784
  fixed= 1;
1785
}
1786
1787
1788
my_decimal *Item_int::val_decimal(my_decimal *decimal_value)
1789
{
1790
  int2my_decimal(E_DEC_FATAL_ERROR, value, unsigned_flag, decimal_value);
1791
  return decimal_value;
1792
}
1793
1794
String *Item_int::val_str(String *str)
1795
{
1796
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1797
  assert(fixed == 1);
1 by brian
clean slate
1798
  str->set(value, &my_charset_bin);
1799
  return str;
1800
}
1801
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1802
void Item_int::print(String *str,
1803
                     enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
1804
{
1805
  // my_charset_bin is good enough for numbers
1806
  str_value.set(value, &my_charset_bin);
1807
  str->append(str_value);
1808
}
1809
1810
1811
Item_uint::Item_uint(const char *str_arg, uint length):
1812
  Item_int(str_arg, length)
1813
{
1814
  unsigned_flag= 1;
1815
}
1816
1817
152 by Brian Aker
longlong replacement
1818
Item_uint::Item_uint(const char *str_arg, int64_t i, uint length):
1 by brian
clean slate
1819
  Item_int(str_arg, i, length)
1820
{
1821
  unsigned_flag= 1;
1822
}
1823
1824
1825
String *Item_uint::val_str(String *str)
1826
{
1827
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1828
  assert(fixed == 1);
151 by Brian Aker
Ulonglong to uint64_t
1829
  str->set((uint64_t) value, &my_charset_bin);
1 by brian
clean slate
1830
  return str;
1831
}
1832
1833
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1834
void Item_uint::print(String *str,
1835
                      enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
1836
{
1837
  // latin1 is good enough for numbers
151 by Brian Aker
Ulonglong to uint64_t
1838
  str_value.set((uint64_t) value, default_charset());
1 by brian
clean slate
1839
  str->append(str_value);
1840
}
1841
1842
1843
Item_decimal::Item_decimal(const char *str_arg, uint length,
1844
                           CHARSET_INFO *charset)
1845
{
1846
  str2my_decimal(E_DEC_FATAL_ERROR, str_arg, length, charset, &decimal_value);
1847
  name= (char*) str_arg;
1848
  decimals= (uint8) decimal_value.frac;
1849
  fixed= 1;
1850
  max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1851
                                             decimals, unsigned_flag);
1852
}
1853
152 by Brian Aker
longlong replacement
1854
Item_decimal::Item_decimal(int64_t val, bool unsig)
1 by brian
clean slate
1855
{
1856
  int2my_decimal(E_DEC_FATAL_ERROR, val, unsig, &decimal_value);
1857
  decimals= (uint8) decimal_value.frac;
1858
  fixed= 1;
1859
  max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1860
                                             decimals, unsigned_flag);
1861
}
1862
1863
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1864
Item_decimal::Item_decimal(double val,
1865
                           int precision __attribute__((__unused__)),
1866
                           int scale __attribute__((__unused__)))
1 by brian
clean slate
1867
{
1868
  double2my_decimal(E_DEC_FATAL_ERROR, val, &decimal_value);
1869
  decimals= (uint8) decimal_value.frac;
1870
  fixed= 1;
1871
  max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1872
                                             decimals, unsigned_flag);
1873
}
1874
1875
1876
Item_decimal::Item_decimal(const char *str, const my_decimal *val_arg,
1877
                           uint decimal_par, uint length)
1878
{
1879
  my_decimal2decimal(val_arg, &decimal_value);
1880
  name= (char*) str;
1881
  decimals= (uint8) decimal_par;
1882
  max_length= length;
1883
  fixed= 1;
1884
}
1885
1886
1887
Item_decimal::Item_decimal(my_decimal *value_par)
1888
{
1889
  my_decimal2decimal(value_par, &decimal_value);
1890
  decimals= (uint8) decimal_value.frac;
1891
  fixed= 1;
1892
  max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1893
                                             decimals, unsigned_flag);
1894
}
1895
1896
1897
Item_decimal::Item_decimal(const uchar *bin, int precision, int scale)
1898
{
1899
  binary2my_decimal(E_DEC_FATAL_ERROR, bin,
1900
                    &decimal_value, precision, scale);
1901
  decimals= (uint8) decimal_value.frac;
1902
  fixed= 1;
1903
  max_length= my_decimal_precision_to_length(precision, decimals,
1904
                                             unsigned_flag);
1905
}
1906
1907
152 by Brian Aker
longlong replacement
1908
int64_t Item_decimal::val_int()
1 by brian
clean slate
1909
{
152 by Brian Aker
longlong replacement
1910
  int64_t result;
1 by brian
clean slate
1911
  my_decimal2int(E_DEC_FATAL_ERROR, &decimal_value, unsigned_flag, &result);
1912
  return result;
1913
}
1914
1915
double Item_decimal::val_real()
1916
{
1917
  double result;
1918
  my_decimal2double(E_DEC_FATAL_ERROR, &decimal_value, &result);
1919
  return result;
1920
}
1921
1922
String *Item_decimal::val_str(String *result)
1923
{
1924
  result->set_charset(&my_charset_bin);
1925
  my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value, 0, 0, 0, result);
1926
  return result;
1927
}
1928
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1929
void Item_decimal::print(String *str,
1930
                         enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
1931
{
1932
  my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value, 0, 0, 0, &str_value);
1933
  str->append(str_value);
1934
}
1935
1936
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1937
bool Item_decimal::eq(const Item *item,
1938
                      bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
1939
{
1940
  if (type() == item->type() && item->basic_const_item())
1941
  {
1942
    /*
1943
      We need to cast off const to call val_decimal(). This should
1944
      be OK for a basic constant. Additionally, we can pass 0 as
1945
      a true decimal constant will return its internal decimal
1946
      storage and ignore the argument.
1947
    */
1948
    Item *arg= (Item*) item;
1949
    my_decimal *value= arg->val_decimal(0);
1950
    return !my_decimal_cmp(&decimal_value, value);
1951
  }
1952
  return 0;
1953
}
1954
1955
1956
void Item_decimal::set_decimal_value(my_decimal *value_par)
1957
{
1958
  my_decimal2decimal(value_par, &decimal_value);
1959
  decimals= (uint8) decimal_value.frac;
1960
  unsigned_flag= !decimal_value.sign();
1961
  max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
1962
                                             decimals, unsigned_flag);
1963
}
1964
1965
1966
String *Item_float::val_str(String *str)
1967
{
1968
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1969
  assert(fixed == 1);
1 by brian
clean slate
1970
  str->set_real(value,decimals,&my_charset_bin);
1971
  return str;
1972
}
1973
1974
1975
my_decimal *Item_float::val_decimal(my_decimal *decimal_value)
1976
{
1977
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
1978
  assert(fixed == 1);
1 by brian
clean slate
1979
  double2my_decimal(E_DEC_FATAL_ERROR, value, decimal_value);
1980
  return (decimal_value);
1981
}
1982
1983
1984
void Item_string::print(String *str, enum_query_type query_type)
1985
{
1986
  if (query_type == QT_ORDINARY && is_cs_specified())
1987
  {
1988
    str->append('_');
1989
    str->append(collation.collation->csname);
1990
  }
1991
1992
  str->append('\'');
1993
1994
  if (query_type == QT_ORDINARY ||
1995
      my_charset_same(str_value.charset(), system_charset_info))
1996
  {
1997
    str_value.print(str);
1998
  }
1999
  else
2000
  {
2001
    THD *thd= current_thd;
2002
    LEX_STRING utf8_lex_str;
2003
2004
    thd->convert_string(&utf8_lex_str,
2005
                        system_charset_info,
2006
                        str_value.c_ptr_safe(),
2007
                        str_value.length(),
2008
                        str_value.charset());
2009
2010
    String utf8_str(utf8_lex_str.str,
2011
                    utf8_lex_str.length,
2012
                    system_charset_info);
2013
2014
    utf8_str.print(str);
2015
  }
2016
2017
  str->append('\'');
2018
}
2019
2020
2021
double Item_string::val_real()
2022
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2023
  assert(fixed == 1);
1 by brian
clean slate
2024
  int error;
2025
  char *end, *org_end;
2026
  double tmp;
2027
  CHARSET_INFO *cs= str_value.charset();
2028
2029
  org_end= (char*) str_value.ptr() + str_value.length();
2030
  tmp= my_strntod(cs, (char*) str_value.ptr(), str_value.length(), &end,
2031
                  &error);
2032
  if (error || (end != org_end && !check_if_only_end_space(cs, end, org_end)))
2033
  {
2034
    /*
2035
      We can use str_value.ptr() here as Item_string is gurantee to put an
2036
      end \0 here.
2037
    */
2038
    push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
2039
                        ER_TRUNCATED_WRONG_VALUE,
2040
                        ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE",
2041
                        str_value.ptr());
2042
  }
2043
  return tmp;
2044
}
2045
2046
2047
/**
2048
  @todo
2049
  Give error if we wanted a signed integer and we got an unsigned one
2050
*/
152 by Brian Aker
longlong replacement
2051
int64_t Item_string::val_int()
1 by brian
clean slate
2052
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2053
  assert(fixed == 1);
1 by brian
clean slate
2054
  int err;
152 by Brian Aker
longlong replacement
2055
  int64_t tmp;
1 by brian
clean slate
2056
  char *end= (char*) str_value.ptr()+ str_value.length();
2057
  char *org_end= end;
2058
  CHARSET_INFO *cs= str_value.charset();
2059
2060
  tmp= (*(cs->cset->strtoll10))(cs, str_value.ptr(), &end, &err);
2061
  /*
2062
    TODO: Give error if we wanted a signed integer and we got an unsigned
2063
    one
2064
  */
2065
  if (err > 0 ||
2066
      (end != org_end && !check_if_only_end_space(cs, end, org_end)))
2067
  {
2068
    push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
2069
                        ER_TRUNCATED_WRONG_VALUE,
2070
                        ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
2071
                        str_value.ptr());
2072
  }
2073
  return tmp;
2074
}
2075
2076
2077
my_decimal *Item_string::val_decimal(my_decimal *decimal_value)
2078
{
2079
  return val_decimal_from_string(decimal_value);
2080
}
2081
2082
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2083
bool Item_null::eq(const Item *item,
2084
                   bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
2085
{ return item->type() == type(); }
2086
2087
2088
double Item_null::val_real()
2089
{
2090
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2091
  assert(fixed == 1);
1 by brian
clean slate
2092
  null_value=1;
2093
  return 0.0;
2094
}
152 by Brian Aker
longlong replacement
2095
int64_t Item_null::val_int()
1 by brian
clean slate
2096
{
2097
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2098
  assert(fixed == 1);
1 by brian
clean slate
2099
  null_value=1;
2100
  return 0;
2101
}
2102
/* ARGSUSED */
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2103
String *Item_null::val_str(String *str __attribute__((__unused__)))
1 by brian
clean slate
2104
{
2105
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2106
  assert(fixed == 1);
1 by brian
clean slate
2107
  null_value=1;
2108
  return 0;
2109
}
2110
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2111
my_decimal *Item_null::val_decimal(my_decimal *decimal_value __attribute__((__unused__)))
1 by brian
clean slate
2112
{
2113
  return 0;
2114
}
2115
2116
2117
Item *Item_null::safe_charset_converter(CHARSET_INFO *tocs)
2118
{
2119
  collation.set(tocs);
2120
  return this;
2121
}
2122
2123
/*********************** Item_param related ******************************/
2124
2125
/** 
2126
  Default function of Item_param::set_param_func, so in case
2127
  of malformed packet the server won't SIGSEGV.
2128
*/
2129
2130
static void
2131
default_set_param_func(Item_param *param,
2132
                       uchar **pos __attribute__((unused)),
2133
                       ulong len __attribute__((unused)))
2134
{
2135
  param->set_null();
2136
}
2137
2138
2139
Item_param::Item_param(uint pos_in_query_arg) :
2140
  state(NO_VALUE),
2141
  item_result_type(STRING_RESULT),
2142
  /* Don't pretend to be a literal unless value for this item is set. */
2143
  item_type(PARAM_ITEM),
2144
  param_type(MYSQL_TYPE_VARCHAR),
2145
  pos_in_query(pos_in_query_arg),
2146
  set_param_func(default_set_param_func),
56 by brian
Next pass of true/false update.
2147
  limit_clause_param(false)
1 by brian
clean slate
2148
{
2149
  name= (char*) "?";
2150
  /* 
2151
    Since we can't say whenever this item can be NULL or cannot be NULL
2152
    before mysql_stmt_execute(), so we assuming that it can be NULL until
2153
    value is set.
2154
  */
2155
  maybe_null= 1;
2156
  cnvitem= new Item_string("", 0, &my_charset_bin, DERIVATION_COERCIBLE);
2157
  cnvstr.set(cnvbuf, sizeof(cnvbuf), &my_charset_bin);
2158
}
2159
2160
2161
void Item_param::set_null()
2162
{
2163
  /* These are cleared after each execution by reset() method */
2164
  null_value= 1;
2165
  /* 
2166
    Because of NULL and string values we need to set max_length for each new
2167
    placeholder value: user can submit NULL for any placeholder type, and 
2168
    string length can be different in each execution.
2169
  */
2170
  max_length= 0;
2171
  decimals= 0;
2172
  state= NULL_VALUE;
2173
  item_type= Item::NULL_ITEM;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2174
  return;
1 by brian
clean slate
2175
}
2176
152 by Brian Aker
longlong replacement
2177
void Item_param::set_int(int64_t i, uint32 max_length_arg)
1 by brian
clean slate
2178
{
152 by Brian Aker
longlong replacement
2179
  value.integer= (int64_t) i;
1 by brian
clean slate
2180
  state= INT_VALUE;
2181
  max_length= max_length_arg;
2182
  decimals= 0;
2183
  maybe_null= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2184
  return;
1 by brian
clean slate
2185
}
2186
2187
void Item_param::set_double(double d)
2188
{
2189
  value.real= d;
2190
  state= REAL_VALUE;
2191
  max_length= DBL_DIG + 8;
2192
  decimals= NOT_FIXED_DEC;
2193
  maybe_null= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2194
  return;
1 by brian
clean slate
2195
}
2196
2197
2198
/**
2199
  Set decimal parameter value from string.
2200
2201
  @param str      character string
2202
  @param length   string length
2203
2204
  @note
2205
    As we use character strings to send decimal values in
2206
    binary protocol, we use str2my_decimal to convert it to
2207
    internal decimal value.
2208
*/
2209
2210
void Item_param::set_decimal(const char *str, ulong length)
2211
{
2212
  char *end;
2213
2214
  end= (char*) str+length;
2215
  str2my_decimal(E_DEC_FATAL_ERROR, str, &decimal_value, &end);
2216
  state= DECIMAL_VALUE;
2217
  decimals= decimal_value.frac;
2218
  max_length= my_decimal_precision_to_length(decimal_value.precision(),
2219
                                             decimals, unsigned_flag);
2220
  maybe_null= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2221
  return;
1 by brian
clean slate
2222
}
2223
2224
2225
/**
2226
  Set parameter value from MYSQL_TIME value.
2227
2228
  @param tm              datetime value to set (time_type is ignored)
2229
  @param type            type of datetime value
2230
  @param max_length_arg  max length of datetime value as string
2231
2232
  @note
2233
    If we value to be stored is not normalized, zero value will be stored
2234
    instead and proper warning will be produced. This function relies on
2235
    the fact that even wrong value sent over binary protocol fits into
2236
    MAX_DATE_STRING_REP_LENGTH buffer.
2237
*/
2238
void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type,
2239
                          uint32 max_length_arg)
2240
{ 
2241
  value.time= *tm;
2242
  value.time.time_type= time_type;
2243
2244
  if (value.time.year > 9999 || value.time.month > 12 ||
2245
      value.time.day > 31 ||
2246
      ((time_type != MYSQL_TIMESTAMP_TIME) && value.time.hour > 23) ||
2247
      value.time.minute > 59 || value.time.second > 59)
2248
  {
2249
    char buff[MAX_DATE_STRING_REP_LENGTH];
2250
    uint length= my_TIME_to_str(&value.time, buff);
2251
    make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
2252
                                 buff, length, time_type, 0);
2253
    set_zero_time(&value.time, MYSQL_TIMESTAMP_ERROR);
2254
  }
2255
2256
  state= TIME_VALUE;
2257
  maybe_null= 0;
2258
  max_length= max_length_arg;
2259
  decimals= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2260
  return;
1 by brian
clean slate
2261
}
2262
2263
2264
bool Item_param::set_str(const char *str, ulong length)
2265
{
2266
  /*
2267
    Assign string with no conversion: data is converted only after it's
2268
    been written to the binary log.
2269
  */
2270
  uint dummy_errors;
2271
  if (str_value.copy(str, length, &my_charset_bin, &my_charset_bin,
2272
                     &dummy_errors))
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2273
    return(true);
1 by brian
clean slate
2274
  state= STRING_VALUE;
2275
  max_length= length;
2276
  maybe_null= 0;
2277
  /* max_length and decimals are set after charset conversion */
51.1.82 by Jay Pipes
Removed final DBUG references
2278
  /* sic: str may be not null-terminated */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2279
  return(false);
1 by brian
clean slate
2280
}
2281
2282
2283
bool Item_param::set_longdata(const char *str, ulong length)
2284
{
2285
  /*
2286
    If client character set is multibyte, end of long data packet
2287
    may hit at the middle of a multibyte character.  Additionally,
2288
    if binary log is open we must write long data value to the
2289
    binary log in character set of client. This is why we can't
2290
    convert long data to connection character set as it comes
2291
    (here), and first have to concatenate all pieces together,
2292
    write query to the binary log and only then perform conversion.
2293
  */
2294
  if (str_value.append(str, length, &my_charset_bin))
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2295
    return(true);
1 by brian
clean slate
2296
  state= LONG_DATA_VALUE;
2297
  maybe_null= 0;
2298
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2299
  return(false);
1 by brian
clean slate
2300
}
2301
2302
2303
/**
2304
  Set parameter value from user variable value.
2305
2306
  @param thd   Current thread
2307
  @param entry User variable structure (NULL means use NULL value)
2308
2309
  @retval
2310
    0 OK
2311
  @retval
2312
    1 Out of memory
2313
*/
2314
2315
bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
2316
{
2317
  if (entry && entry->value)
2318
  {
2319
    item_result_type= entry->type;
2320
    unsigned_flag= entry->unsigned_flag;
2321
    if (limit_clause_param)
2322
    {
2323
      my_bool unused;
2324
      set_int(entry->val_int(&unused), MY_INT64_NUM_DECIMAL_DIGITS);
2325
      item_type= Item::INT_ITEM;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2326
      return(!unsigned_flag && value.integer < 0 ? 1 : 0);
1 by brian
clean slate
2327
    }
2328
    switch (item_result_type) {
2329
    case REAL_RESULT:
2330
      set_double(*(double*)entry->value);
2331
      item_type= Item::REAL_ITEM;
2332
      break;
2333
    case INT_RESULT:
152 by Brian Aker
longlong replacement
2334
      set_int(*(int64_t*)entry->value, MY_INT64_NUM_DECIMAL_DIGITS);
1 by brian
clean slate
2335
      item_type= Item::INT_ITEM;
2336
      break;
2337
    case STRING_RESULT:
2338
    {
2339
      CHARSET_INFO *fromcs= entry->collation.collation;
2340
      CHARSET_INFO *tocs= thd->variables.collation_connection;
2341
      uint32 dummy_offset;
2342
2343
      value.cs_info.character_set_of_placeholder= 
2344
        value.cs_info.character_set_client= fromcs;
2345
      /*
2346
        Setup source and destination character sets so that they
2347
        are different only if conversion is necessary: this will
2348
        make later checks easier.
2349
      */
2350
      value.cs_info.final_character_set_of_str_value=
2351
        String::needs_conversion(0, fromcs, tocs, &dummy_offset) ?
2352
        tocs : fromcs;
2353
      /*
2354
        Exact value of max_length is not known unless data is converted to
2355
        charset of connection, so we have to set it later.
2356
      */
2357
      item_type= Item::STRING_ITEM;
2358
2359
      if (set_str((const char *)entry->value, entry->length))
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2360
        return(1);
1 by brian
clean slate
2361
      break;
2362
    }
2363
    case DECIMAL_RESULT:
2364
    {
2365
      const my_decimal *ent_value= (const my_decimal *)entry->value;
2366
      my_decimal2decimal(ent_value, &decimal_value);
2367
      state= DECIMAL_VALUE;
2368
      decimals= ent_value->frac;
2369
      max_length= my_decimal_precision_to_length(ent_value->precision(),
2370
                                                 decimals, unsigned_flag);
2371
      item_type= Item::DECIMAL_ITEM;
2372
      break;
2373
    }
2374
    default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2375
      assert(0);
1 by brian
clean slate
2376
      set_null();
2377
    }
2378
  }
2379
  else
2380
    set_null();
2381
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2382
  return(0);
1 by brian
clean slate
2383
}
2384
2385
/**
2386
  Resets parameter after execution.
2387
2388
  @note
2389
    We clear null_value here instead of setting it in set_* methods,
2390
    because we want more easily handle case for long data.
2391
*/
2392
2393
void Item_param::reset()
2394
{
2395
  /* Shrink string buffer if it's bigger than max possible CHAR column */
2396
  if (str_value.alloced_length() > MAX_CHAR_WIDTH)
2397
    str_value.free();
2398
  else
2399
    str_value.length(0);
2400
  str_value_ptr.length(0);
2401
  /*
2402
    We must prevent all charset conversions until data has been written
2403
    to the binary log.
2404
  */
2405
  str_value.set_charset(&my_charset_bin);
2406
  collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
2407
  state= NO_VALUE;
2408
  maybe_null= 1;
2409
  null_value= 0;
2410
  /*
2411
    Don't reset item_type to PARAM_ITEM: it's only needed to guard
2412
    us from item optimizations at prepare stage, when item doesn't yet
2413
    contain a literal of some kind.
2414
    In all other cases when this object is accessed its value is
2415
    set (this assumption is guarded by 'state' and
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2416
    assertS(state != NO_VALUE) in all Item_param::get_*
1 by brian
clean slate
2417
    methods).
2418
  */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2419
  return;
1 by brian
clean slate
2420
}
2421
2422
2423
int Item_param::save_in_field(Field *field, bool no_conversions)
2424
{
2425
  field->set_notnull();
2426
2427
  switch (state) {
2428
  case INT_VALUE:
2429
    return field->store(value.integer, unsigned_flag);
2430
  case REAL_VALUE:
2431
    return field->store(value.real);
2432
  case DECIMAL_VALUE:
2433
    return field->store_decimal(&decimal_value);
2434
  case TIME_VALUE:
2435
    field->store_time(&value.time, value.time.time_type);
2436
    return 0;
2437
  case STRING_VALUE:
2438
  case LONG_DATA_VALUE:
2439
    return field->store(str_value.ptr(), str_value.length(),
2440
                        str_value.charset());
2441
  case NULL_VALUE:
2442
    return set_field_to_null_with_conversions(field, no_conversions);
2443
  case NO_VALUE:
2444
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2445
    assert(0);
1 by brian
clean slate
2446
  }
2447
  return 1;
2448
}
2449
2450
2451
bool Item_param::get_time(MYSQL_TIME *res)
2452
{
2453
  if (state == TIME_VALUE)
2454
  {
2455
    *res= value.time;
2456
    return 0;
2457
  }
2458
  /*
2459
    If parameter value isn't supplied assertion will fire in val_str()
2460
    which is called from Item::get_time().
2461
  */
2462
  return Item::get_time(res);
2463
}
2464
2465
2466
bool Item_param::get_date(MYSQL_TIME *res, uint fuzzydate)
2467
{
2468
  if (state == TIME_VALUE)
2469
  {
2470
    *res= value.time;
2471
    return 0;
2472
  }
2473
  return Item::get_date(res, fuzzydate);
2474
}
2475
2476
2477
double Item_param::val_real()
2478
{
2479
  switch (state) {
2480
  case REAL_VALUE:
2481
    return value.real;
2482
  case INT_VALUE:
2483
    return (double) value.integer;
2484
  case DECIMAL_VALUE:
2485
  {
2486
    double result;
2487
    my_decimal2double(E_DEC_FATAL_ERROR, &decimal_value, &result);
2488
    return result;
2489
  }
2490
  case STRING_VALUE:
2491
  case LONG_DATA_VALUE:
2492
  {
2493
    int dummy_err;
2494
    char *end_not_used;
2495
    return my_strntod(str_value.charset(), (char*) str_value.ptr(),
2496
                      str_value.length(), &end_not_used, &dummy_err);
2497
  }
2498
  case TIME_VALUE:
2499
    /*
2500
      This works for example when user says SELECT ?+0.0 and supplies
2501
      time value for the placeholder.
2502
    */
151 by Brian Aker
Ulonglong to uint64_t
2503
    return uint64_t2double(TIME_to_uint64_t(&value.time));
1 by brian
clean slate
2504
  case NULL_VALUE:
2505
    return 0.0;
2506
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2507
    assert(0);
1 by brian
clean slate
2508
  }
2509
  return 0.0;
2510
} 
2511
2512
152 by Brian Aker
longlong replacement
2513
int64_t Item_param::val_int() 
1 by brian
clean slate
2514
{ 
2515
  switch (state) {
2516
  case REAL_VALUE:
152 by Brian Aker
longlong replacement
2517
    return (int64_t) rint(value.real);
1 by brian
clean slate
2518
  case INT_VALUE:
2519
    return value.integer;
2520
  case DECIMAL_VALUE:
2521
  {
152 by Brian Aker
longlong replacement
2522
    int64_t i;
1 by brian
clean slate
2523
    my_decimal2int(E_DEC_FATAL_ERROR, &decimal_value, unsigned_flag, &i);
2524
    return i;
2525
  }
2526
  case STRING_VALUE:
2527
  case LONG_DATA_VALUE:
2528
    {
2529
      int dummy_err;
2530
      return my_strntoll(str_value.charset(), str_value.ptr(),
2531
                         str_value.length(), 10, (char**) 0, &dummy_err);
2532
    }
2533
  case TIME_VALUE:
152 by Brian Aker
longlong replacement
2534
    return (int64_t) TIME_to_uint64_t(&value.time);
1 by brian
clean slate
2535
  case NULL_VALUE:
2536
    return 0; 
2537
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2538
    assert(0);
1 by brian
clean slate
2539
  }
2540
  return 0;
2541
}
2542
2543
2544
my_decimal *Item_param::val_decimal(my_decimal *dec)
2545
{
2546
  switch (state) {
2547
  case DECIMAL_VALUE:
2548
    return &decimal_value;
2549
  case REAL_VALUE:
2550
    double2my_decimal(E_DEC_FATAL_ERROR, value.real, dec);
2551
    return dec;
2552
  case INT_VALUE:
2553
    int2my_decimal(E_DEC_FATAL_ERROR, value.integer, unsigned_flag, dec);
2554
    return dec;
2555
  case STRING_VALUE:
2556
  case LONG_DATA_VALUE:
2557
    string2my_decimal(E_DEC_FATAL_ERROR, &str_value, dec);
2558
    return dec;
2559
  case TIME_VALUE:
2560
  {
152 by Brian Aker
longlong replacement
2561
    int64_t i= (int64_t) TIME_to_uint64_t(&value.time);
1 by brian
clean slate
2562
    int2my_decimal(E_DEC_FATAL_ERROR, i, 0, dec);
2563
    return dec;
2564
  }
2565
  case NULL_VALUE:
2566
    return 0; 
2567
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2568
    assert(0);
1 by brian
clean slate
2569
  }
2570
  return 0;
2571
}
2572
2573
2574
String *Item_param::val_str(String* str) 
2575
{ 
2576
  switch (state) {
2577
  case STRING_VALUE:
2578
  case LONG_DATA_VALUE:
2579
    return &str_value_ptr;
2580
  case REAL_VALUE:
2581
    str->set_real(value.real, NOT_FIXED_DEC, &my_charset_bin);
2582
    return str;
2583
  case INT_VALUE:
2584
    str->set(value.integer, &my_charset_bin);
2585
    return str;
2586
  case DECIMAL_VALUE:
2587
    if (my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value,
2588
                          0, 0, 0, str) <= 1)
2589
      return str;
2590
    return NULL;
2591
  case TIME_VALUE:
2592
  {
2593
    if (str->reserve(MAX_DATE_STRING_REP_LENGTH))
2594
      break;
2595
    str->length((uint) my_TIME_to_str(&value.time, (char*) str->ptr()));
2596
    str->set_charset(&my_charset_bin);
2597
    return str;
2598
  }
2599
  case NULL_VALUE:
2600
    return NULL; 
2601
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2602
    assert(0);
1 by brian
clean slate
2603
  }
2604
  return str;
2605
}
2606
2607
/**
2608
  Return Param item values in string format, for generating the dynamic 
2609
  query used in update/binary logs.
2610
2611
  @todo
2612
    - Change interface and implementation to fill log data in place
2613
    and avoid one more memcpy/alloc between str and log string.
2614
    - In case of error we need to notify replication
2615
    that binary log contains wrong statement 
2616
*/
2617
2618
const String *Item_param::query_val_str(String* str) const
2619
{
2620
  switch (state) {
2621
  case INT_VALUE:
2622
    str->set_int(value.integer, unsigned_flag, &my_charset_bin);
2623
    break;
2624
  case REAL_VALUE:
2625
    str->set_real(value.real, NOT_FIXED_DEC, &my_charset_bin);
2626
    break;
2627
  case DECIMAL_VALUE:
2628
    if (my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value,
2629
                          0, 0, 0, str) > 1)
2630
      return &my_null_string;
2631
    break;
2632
  case TIME_VALUE:
2633
    {
2634
      char *buf, *ptr;
2635
      str->length(0);
2636
      /*
2637
        TODO: in case of error we need to notify replication
2638
        that binary log contains wrong statement 
2639
      */
2640
      if (str->reserve(MAX_DATE_STRING_REP_LENGTH+3))
2641
        break; 
2642
2643
      /* Create date string inplace */
2644
      buf= str->c_ptr_quick();
2645
      ptr= buf;
2646
      *ptr++= '\'';
2647
      ptr+= (uint) my_TIME_to_str(&value.time, ptr);
2648
      *ptr++= '\'';
2649
      str->length((uint32) (ptr - buf));
2650
      break;
2651
    }
2652
  case STRING_VALUE:
2653
  case LONG_DATA_VALUE:
2654
    {
2655
      str->length(0);
2656
      append_query_string(value.cs_info.character_set_client, &str_value, str);
2657
      break;
2658
    }
2659
  case NULL_VALUE:
2660
    return &my_null_string;
2661
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2662
    assert(0);
1 by brian
clean slate
2663
  }
2664
  return str;
2665
}
2666
2667
2668
/**
2669
  Convert string from client character set to the character set of
2670
  connection.
2671
*/
2672
2673
bool Item_param::convert_str_value(THD *thd)
2674
{
56 by brian
Next pass of true/false update.
2675
  bool rc= false;
1 by brian
clean slate
2676
  if (state == STRING_VALUE || state == LONG_DATA_VALUE)
2677
  {
2678
    /*
2679
      Check is so simple because all charsets were set up properly
2680
      in setup_one_conversion_function, where typecode of
2681
      placeholder was also taken into account: the variables are different
2682
      here only if conversion is really necessary.
2683
    */
2684
    if (value.cs_info.final_character_set_of_str_value !=
2685
        value.cs_info.character_set_of_placeholder)
2686
    {
2687
      rc= thd->convert_string(&str_value,
2688
                              value.cs_info.character_set_of_placeholder,
2689
                              value.cs_info.final_character_set_of_str_value);
2690
    }
2691
    else
2692
      str_value.set_charset(value.cs_info.final_character_set_of_str_value);
2693
    /* Here str_value is guaranteed to be in final_character_set_of_str_value */
2694
2695
    max_length= str_value.length();
2696
    decimals= 0;
2697
    /*
2698
      str_value_ptr is returned from val_str(). It must be not alloced
2699
      to prevent it's modification by val_str() invoker.
2700
    */
2701
    str_value_ptr.set(str_value.ptr(), str_value.length(),
2702
                      str_value.charset());
2703
    /* Synchronize item charset with value charset */
2704
    collation.set(str_value.charset(), DERIVATION_COERCIBLE);
2705
  }
2706
  return rc;
2707
}
2708
2709
2710
bool Item_param::basic_const_item() const
2711
{
2712
  if (state == NO_VALUE || state == TIME_VALUE)
56 by brian
Next pass of true/false update.
2713
    return false;
2714
  return true;
1 by brian
clean slate
2715
}
2716
2717
2718
Item *
2719
Item_param::clone_item()
2720
{
2721
  /* see comments in the header file */
2722
  switch (state) {
2723
  case NULL_VALUE:
2724
    return new Item_null(name);
2725
  case INT_VALUE:
2726
    return (unsigned_flag ?
2727
            new Item_uint(name, value.integer, max_length) :
2728
            new Item_int(name, value.integer, max_length));
2729
  case REAL_VALUE:
2730
    return new Item_float(name, value.real, decimals, max_length);
2731
  case STRING_VALUE:
2732
  case LONG_DATA_VALUE:
2733
    return new Item_string(name, str_value.c_ptr_quick(), str_value.length(),
2734
                           str_value.charset());
2735
  case TIME_VALUE:
2736
    break;
2737
  case NO_VALUE:
2738
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2739
    assert(0);
1 by brian
clean slate
2740
  };
2741
  return 0;
2742
}
2743
2744
2745
bool
2746
Item_param::eq(const Item *arg, bool binary_cmp) const
2747
{
2748
  Item *item;
2749
  if (!basic_const_item() || !arg->basic_const_item() || arg->type() != type())
56 by brian
Next pass of true/false update.
2750
    return false;
1 by brian
clean slate
2751
  /*
2752
    We need to cast off const to call val_int(). This should be OK for
2753
    a basic constant.
2754
  */
2755
  item= (Item*) arg;
2756
2757
  switch (state) {
2758
  case NULL_VALUE:
56 by brian
Next pass of true/false update.
2759
    return true;
1 by brian
clean slate
2760
  case INT_VALUE:
2761
    return value.integer == item->val_int() &&
2762
           unsigned_flag == item->unsigned_flag;
2763
  case REAL_VALUE:
2764
    return value.real == item->val_real();
2765
  case STRING_VALUE:
2766
  case LONG_DATA_VALUE:
2767
    if (binary_cmp)
2768
      return !stringcmp(&str_value, &item->str_value);
2769
    return !sortcmp(&str_value, &item->str_value, collation.collation);
2770
  default:
2771
    break;
2772
  }
56 by brian
Next pass of true/false update.
2773
  return false;
1 by brian
clean slate
2774
}
2775
2776
/* End of Item_param related */
2777
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2778
void Item_param::print(String *str,
2779
                       enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
2780
{
2781
  if (state == NO_VALUE)
2782
  {
2783
    str->append('?');
2784
  }
2785
  else
2786
  {
2787
    char buffer[STRING_BUFFER_USUAL_SIZE];
2788
    String tmp(buffer, sizeof(buffer), &my_charset_bin);
2789
    const String *res;
2790
    res= query_val_str(&tmp);
2791
    str->append(*res);
2792
  }
2793
}
2794
2795
2796
/****************************************************************************
2797
  Item_copy_string
2798
****************************************************************************/
2799
2800
void Item_copy_string::copy()
2801
{
2802
  String *res=item->val_str(&str_value);
2803
  if (res && res != &str_value)
2804
    str_value.copy(*res);
2805
  null_value=item->null_value;
2806
}
2807
2808
/* ARGSUSED */
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2809
String *Item_copy_string::val_str(String *str __attribute__((__unused__)))
1 by brian
clean slate
2810
{
2811
  // Item_copy_string is used without fix_fields call
2812
  if (null_value)
2813
    return (String*) 0;
2814
  return &str_value;
2815
}
2816
2817
2818
my_decimal *Item_copy_string::val_decimal(my_decimal *decimal_value)
2819
{
2820
  // Item_copy_string is used without fix_fields call
2821
  if (null_value)
2822
    return 0;
2823
  string2my_decimal(E_DEC_FATAL_ERROR, &str_value, decimal_value);
2824
  return (decimal_value);
2825
}
2826
2827
2828
/*
2829
  Functions to convert item to field (for send_fields)
2830
*/
2831
2832
/* ARGSUSED */
77.1.15 by Monty Taylor
Bunch of warning cleanups.
2833
bool Item::fix_fields(THD *thd __attribute__((__unused__)),
2834
                      Item **ref __attribute__((__unused__)))
1 by brian
clean slate
2835
{
2836
2837
  // We do not check fields which are fixed during construction
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2838
  assert(fixed == 0 || basic_const_item());
1 by brian
clean slate
2839
  fixed= 1;
56 by brian
Next pass of true/false update.
2840
  return false;
1 by brian
clean slate
2841
}
2842
2843
double Item_ref_null_helper::val_real()
2844
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2845
  assert(fixed == 1);
1 by brian
clean slate
2846
  double tmp= (*ref)->val_result();
2847
  owner->was_null|= null_value= (*ref)->null_value;
2848
  return tmp;
2849
}
2850
2851
152 by Brian Aker
longlong replacement
2852
int64_t Item_ref_null_helper::val_int()
1 by brian
clean slate
2853
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2854
  assert(fixed == 1);
152 by Brian Aker
longlong replacement
2855
  int64_t tmp= (*ref)->val_int_result();
1 by brian
clean slate
2856
  owner->was_null|= null_value= (*ref)->null_value;
2857
  return tmp;
2858
}
2859
2860
2861
my_decimal *Item_ref_null_helper::val_decimal(my_decimal *decimal_value)
2862
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2863
  assert(fixed == 1);
1 by brian
clean slate
2864
  my_decimal *val= (*ref)->val_decimal_result(decimal_value);
2865
  owner->was_null|= null_value= (*ref)->null_value;
2866
  return val;
2867
}
2868
2869
2870
bool Item_ref_null_helper::val_bool()
2871
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2872
  assert(fixed == 1);
1 by brian
clean slate
2873
  bool val= (*ref)->val_bool_result();
2874
  owner->was_null|= null_value= (*ref)->null_value;
2875
  return val;
2876
}
2877
2878
2879
String* Item_ref_null_helper::val_str(String* s)
2880
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
2881
  assert(fixed == 1);
1 by brian
clean slate
2882
  String* tmp= (*ref)->str_result(s);
2883
  owner->was_null|= null_value= (*ref)->null_value;
2884
  return tmp;
2885
}
2886
2887
2888
bool Item_ref_null_helper::get_date(MYSQL_TIME *ltime, uint fuzzydate)
2889
{  
2890
  return (owner->was_null|= null_value= (*ref)->get_date(ltime, fuzzydate));
2891
}
2892
2893
2894
/**
2895
  Mark item and SELECT_LEXs as dependent if item was resolved in
2896
  outer SELECT.
2897
2898
  @param thd             thread handler
2899
  @param last            select from which current item depend
2900
  @param current         current select
2901
  @param resolved_item   item which was resolved in outer SELECT(for warning)
2902
  @param mark_item       item which should be marked (can be differ in case of
2903
                         substitution)
2904
*/
2905
2906
static void mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current,
2907
                              Item_ident *resolved_item,
2908
                              Item_ident *mark_item)
2909
{
2910
  const char *db_name= (resolved_item->db_name ?
2911
                        resolved_item->db_name : "");
2912
  const char *table_name= (resolved_item->table_name ?
2913
                           resolved_item->table_name : "");
2914
  /* store pointer on SELECT_LEX from which item is dependent */
2915
  if (mark_item)
2916
    mark_item->depended_from= last;
2917
  current->mark_as_dependent(last);
2918
  if (thd->lex->describe & DESCRIBE_EXTENDED)
2919
  {
2920
    char warn_buff[MYSQL_ERRMSG_SIZE];
2921
    sprintf(warn_buff, ER(ER_WARN_FIELD_RESOLVED),
2922
            db_name, (db_name[0] ? "." : ""),
2923
            table_name, (table_name [0] ? "." : ""),
2924
            resolved_item->field_name,
2925
	    current->select_number, last->select_number);
2926
    push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
2927
		 ER_WARN_FIELD_RESOLVED, warn_buff);
2928
  }
2929
}
2930
2931
2932
/**
2933
  Mark range of selects and resolved identifier (field/reference)
2934
  item as dependent.
2935
2936
  @param thd             thread handler
2937
  @param last_select     select where resolved_item was resolved
2938
  @param current_sel     current select (select where resolved_item was placed)
2939
  @param found_field     field which was found during resolving
2940
  @param found_item      Item which was found during resolving (if resolved
2941
                         identifier belongs to VIEW)
2942
  @param resolved_item   Identifier which was resolved
2943
2944
  @note
2945
    We have to mark all items between current_sel (including) and
2946
    last_select (excluding) as dependend (select before last_select should
2947
    be marked with actual table mask used by resolved item, all other with
2948
    OUTER_REF_TABLE_BIT) and also write dependence information to Item of
2949
    resolved identifier.
2950
*/
2951
2952
void mark_select_range_as_dependent(THD *thd,
2953
                                    SELECT_LEX *last_select,
2954
                                    SELECT_LEX *current_sel,
2955
                                    Field *found_field, Item *found_item,
2956
                                    Item_ident *resolved_item)
2957
{
2958
  /*
2959
    Go from current SELECT to SELECT where field was resolved (it
2960
    have to be reachable from current SELECT, because it was already
2961
    done once when we resolved this field and cached result of
2962
    resolving)
2963
  */
2964
  SELECT_LEX *previous_select= current_sel;
2965
  for (; previous_select->outer_select() != last_select;
2966
       previous_select= previous_select->outer_select())
2967
  {
2968
    Item_subselect *prev_subselect_item=
2969
      previous_select->master_unit()->item;
2970
    prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
2971
    prev_subselect_item->const_item_cache= 0;
2972
  }
2973
  {
2974
    Item_subselect *prev_subselect_item=
2975
      previous_select->master_unit()->item;
2976
    Item_ident *dependent= resolved_item;
2977
    if (found_field == view_ref_found)
2978
    {
2979
      Item::Type type= found_item->type();
2980
      prev_subselect_item->used_tables_cache|=
2981
        found_item->used_tables();
2982
      dependent= ((type == Item::REF_ITEM || type == Item::FIELD_ITEM) ?
2983
                  (Item_ident*) found_item :
2984
                  0);
2985
    }
2986
    else
2987
      prev_subselect_item->used_tables_cache|=
2988
        found_field->table->map;
2989
    prev_subselect_item->const_item_cache= 0;
2990
    mark_as_dependent(thd, last_select, current_sel, resolved_item,
2991
                      dependent);
2992
  }
2993
}
2994
2995
2996
/**
2997
  Search a GROUP BY clause for a field with a certain name.
2998
2999
  Search the GROUP BY list for a column named as find_item. When searching
3000
  preference is given to columns that are qualified with the same table (and
3001
  database) name as the one being searched for.
3002
3003
  @param find_item     the item being searched for
3004
  @param group_list    GROUP BY clause
3005
3006
  @return
3007
    - the found item on success
3008
    - NULL if find_item is not in group_list
3009
*/
3010
3011
static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
3012
{
3013
  const char *db_name;
3014
  const char *table_name;
3015
  const char *field_name;
3016
  ORDER      *found_group= NULL;
3017
  int         found_match_degree= 0;
3018
  Item_ident *cur_field;
3019
  int         cur_match_degree= 0;
3020
  char        name_buff[NAME_LEN+1];
3021
3022
  if (find_item->type() == Item::FIELD_ITEM ||
3023
      find_item->type() == Item::REF_ITEM)
3024
  {
3025
    db_name=    ((Item_ident*) find_item)->db_name;
3026
    table_name= ((Item_ident*) find_item)->table_name;
3027
    field_name= ((Item_ident*) find_item)->field_name;
3028
  }
3029
  else
3030
    return NULL;
3031
3032
  if (db_name && lower_case_table_names)
3033
  {
3034
    /* Convert database to lower case for comparison */
3035
    strmake(name_buff, db_name, sizeof(name_buff)-1);
3036
    my_casedn_str(files_charset_info, name_buff);
3037
    db_name= name_buff;
3038
  }
3039
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3040
  assert(field_name != 0);
1 by brian
clean slate
3041
3042
  for (ORDER *cur_group= group_list ; cur_group ; cur_group= cur_group->next)
3043
  {
3044
    if ((*(cur_group->item))->real_item()->type() == Item::FIELD_ITEM)
3045
    {
3046
      cur_field= (Item_ident*) *cur_group->item;
3047
      cur_match_degree= 0;
3048
      
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3049
      assert(cur_field->field_name != 0);
1 by brian
clean slate
3050
3051
      if (!my_strcasecmp(system_charset_info,
3052
                         cur_field->field_name, field_name))
3053
        ++cur_match_degree;
3054
      else
3055
        continue;
3056
3057
      if (cur_field->table_name && table_name)
3058
      {
3059
        /* If field_name is qualified by a table name. */
3060
        if (my_strcasecmp(table_alias_charset, cur_field->table_name, table_name))
3061
          /* Same field names, different tables. */
3062
          return NULL;
3063
3064
        ++cur_match_degree;
3065
        if (cur_field->db_name && db_name)
3066
        {
3067
          /* If field_name is also qualified by a database name. */
3068
          if (strcmp(cur_field->db_name, db_name))
3069
            /* Same field names, different databases. */
3070
            return NULL;
3071
          ++cur_match_degree;
3072
        }
3073
      }
3074
3075
      if (cur_match_degree > found_match_degree)
3076
      {
3077
        found_match_degree= cur_match_degree;
3078
        found_group= cur_group;
3079
      }
3080
      else if (found_group && (cur_match_degree == found_match_degree) &&
3081
               ! (*(found_group->item))->eq(cur_field, 0))
3082
      {
3083
        /*
3084
          If the current resolve candidate matches equally well as the current
3085
          best match, they must reference the same column, otherwise the field
3086
          is ambiguous.
3087
        */
3088
        my_error(ER_NON_UNIQ_ERROR, MYF(0),
3089
                 find_item->full_name(), current_thd->where);
3090
        return NULL;
3091
      }
3092
    }
3093
  }
3094
3095
  if (found_group)
3096
    return found_group->item;
3097
  else
3098
    return NULL;
3099
}
3100
3101
3102
/**
3103
  Resolve a column reference in a sub-select.
3104
3105
  Resolve a column reference (usually inside a HAVING clause) against the
3106
  SELECT and GROUP BY clauses of the query described by 'select'. The name
3107
  resolution algorithm searches both the SELECT and GROUP BY clauses, and in
3108
  case of a name conflict prefers GROUP BY column names over SELECT names. If
3109
  both clauses contain different fields with the same names, a warning is
3110
  issued that name of 'ref' is ambiguous. We extend ANSI SQL in that when no
3111
  GROUP BY column is found, then a HAVING name is resolved as a possibly
3112
  derived SELECT column. This extension is allowed only if the
3113
  MODE_ONLY_FULL_GROUP_BY sql mode isn't enabled.
3114
3115
  @param thd     current thread
3116
  @param ref     column reference being resolved
3117
  @param select  the select that ref is resolved against
3118
3119
  @note
3120
    The resolution procedure is:
3121
    - Search for a column or derived column named col_ref_i [in table T_j]
3122
    in the SELECT clause of Q.
3123
    - Search for a column named col_ref_i [in table T_j]
3124
    in the GROUP BY clause of Q.
3125
    - If found different columns with the same name in GROUP BY and SELECT
3126
    - issue a warning and return the GROUP BY column,
3127
    - otherwise
3128
    - if the MODE_ONLY_FULL_GROUP_BY mode is enabled return error
3129
    - else return the found SELECT column.
3130
3131
3132
  @return
3133
    - NULL - there was an error, and the error was already reported
3134
    - not_found_item - the item was not resolved, no error was reported
3135
    - resolved item - if the item was resolved
3136
*/
3137
3138
static Item**
3139
resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select)
3140
{
3141
  Item **group_by_ref= NULL;
3142
  Item **select_ref= NULL;
3143
  ORDER *group_list= (ORDER*) select->group_list.first;
56 by brian
Next pass of true/false update.
3144
  bool ambiguous_fields= false;
1 by brian
clean slate
3145
  uint counter;
3146
  enum_resolution_type resolution;
3147
3148
  /*
3149
    Search for a column or derived column named as 'ref' in the SELECT
3150
    clause of the current select.
3151
  */
3152
  if (!(select_ref= find_item_in_list(ref, *(select->get_item_list()),
3153
                                      &counter, REPORT_EXCEPT_NOT_FOUND,
3154
                                      &resolution)))
3155
    return NULL; /* Some error occurred. */
3156
  if (resolution == RESOLVED_AGAINST_ALIAS)
56 by brian
Next pass of true/false update.
3157
    ref->alias_name_used= true;
1 by brian
clean slate
3158
3159
  /* If this is a non-aggregated field inside HAVING, search in GROUP BY. */
3160
  if (select->having_fix_field && !ref->with_sum_func && group_list)
3161
  {
3162
    group_by_ref= find_field_in_group_list(ref, group_list);
3163
    
3164
    /* Check if the fields found in SELECT and GROUP BY are the same field. */
3165
    if (group_by_ref && (select_ref != not_found_item) &&
3166
        !((*group_by_ref)->eq(*select_ref, 0)))
3167
    {
56 by brian
Next pass of true/false update.
3168
      ambiguous_fields= true;
1 by brian
clean slate
3169
      push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_NON_UNIQ_ERROR,
3170
                          ER(ER_NON_UNIQ_ERROR), ref->full_name(),
3171
                          current_thd->where);
3172
3173
    }
3174
  }
3175
3176
  if (select_ref != not_found_item || group_by_ref)
3177
  {
3178
    if (select_ref != not_found_item && !ambiguous_fields)
3179
    {
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3180
      assert(*select_ref != 0);
1 by brian
clean slate
3181
      if (!select->ref_pointer_array[counter])
3182
      {
3183
        my_error(ER_ILLEGAL_REFERENCE, MYF(0),
3184
                 ref->name, "forward reference in item list");
3185
        return NULL;
3186
      }
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3187
      assert((*select_ref)->fixed);
1 by brian
clean slate
3188
      return (select->ref_pointer_array + counter);
3189
    }
3190
    if (group_by_ref)
3191
      return group_by_ref;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3192
    assert(false);
1 by brian
clean slate
3193
    return NULL; /* So there is no compiler warning. */
3194
  }
3195
3196
  return (Item**) not_found_item;
3197
}
3198
3199
3200
/**
3201
  Resolve the name of an outer select column reference.
3202
3203
  The method resolves the column reference represented by 'this' as a column
3204
  present in outer selects that contain current select.
3205
3206
  In prepared statements, because of cache, find_field_in_tables()
3207
  can resolve fields even if they don't belong to current context.
3208
  In this case this method only finds appropriate context and marks
3209
  current select as dependent. The found reference of field should be
3210
  provided in 'from_field'.
3211
3212
  @param[in] thd             current thread
3213
  @param[in,out] from_field  found field reference or (Field*)not_found_field
3214
  @param[in,out] reference   view column if this item was resolved to a
3215
    view column
3216
3217
  @note
3218
    This is the inner loop of Item_field::fix_fields:
3219
  @code
3220
        for each outer query Q_k beginning from the inner-most one
3221
        {
3222
          search for a column or derived column named col_ref_i
3223
          [in table T_j] in the FROM clause of Q_k;
3224
3225
          if such a column is not found
3226
            Search for a column or derived column named col_ref_i
3227
            [in table T_j] in the SELECT and GROUP clauses of Q_k.
3228
        }
3229
  @endcode
3230
3231
  @retval
3232
    1   column succefully resolved and fix_fields() should continue.
3233
  @retval
56 by brian
Next pass of true/false update.
3234
    0   column fully fixed and fix_fields() should return false
1 by brian
clean slate
3235
  @retval
3236
    -1  error occured
3237
*/
3238
3239
int
3240
Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
3241
{
3242
  enum_parsing_place place= NO_MATTER;
3243
  bool field_found= (*from_field != not_found_field);
56 by brian
Next pass of true/false update.
3244
  bool upward_lookup= false;
1 by brian
clean slate
3245
3246
  /*
3247
    If there are outer contexts (outer selects, but current select is
3248
    not derived table or view) try to resolve this reference in the
3249
    outer contexts.
3250
3251
    We treat each subselect as a separate namespace, so that different
3252
    subselects may contain columns with the same names. The subselects
3253
    are searched starting from the innermost.
3254
  */
3255
  Name_resolution_context *last_checked_context= context;
3256
  Item **ref= (Item **) not_found_item;
3257
  SELECT_LEX *current_sel= (SELECT_LEX *) thd->lex->current_select;
3258
  Name_resolution_context *outer_context= 0;
3259
  SELECT_LEX *select= 0;
3260
  /* Currently derived tables cannot be correlated */
3261
  if (current_sel->master_unit()->first_select()->linkage !=
3262
      DERIVED_TABLE_TYPE)
3263
    outer_context= context->outer_context;
3264
  for (;
3265
       outer_context;
3266
       outer_context= outer_context->outer_context)
3267
  {
3268
    select= outer_context->select_lex;
3269
    Item_subselect *prev_subselect_item=
3270
      last_checked_context->select_lex->master_unit()->item;
3271
    last_checked_context= outer_context;
56 by brian
Next pass of true/false update.
3272
    upward_lookup= true;
1 by brian
clean slate
3273
3274
    place= prev_subselect_item->parsing_place;
3275
    /*
3276
      If outer_field is set, field was already found by first call
3277
      to find_field_in_tables(). Only need to find appropriate context.
3278
    */
3279
    if (field_found && outer_context->select_lex !=
3280
        cached_table->select_lex)
3281
      continue;
3282
    /*
3283
      In case of a view, find_field_in_tables() writes the pointer to
3284
      the found view field into '*reference', in other words, it
3285
      substitutes this Item_field with the found expression.
3286
    */
3287
    if (field_found || (*from_field= find_field_in_tables(thd, this,
3288
                                          outer_context->
3289
                                            first_name_resolution_table,
3290
                                          outer_context->
3291
                                            last_name_resolution_table,
3292
                                          reference,
3293
                                          IGNORE_EXCEPT_NON_UNIQUE,
56 by brian
Next pass of true/false update.
3294
                                          true, true)) !=
1 by brian
clean slate
3295
        not_found_field)
3296
    {
3297
      if (*from_field)
3298
      {
3299
        if (*from_field != view_ref_found)
3300
        {
3301
          prev_subselect_item->used_tables_cache|= (*from_field)->table->map;
3302
          prev_subselect_item->const_item_cache= 0;
3303
          set_field(*from_field);
3304
          if (!last_checked_context->select_lex->having_fix_field &&
3305
              select->group_list.elements &&
3306
              (place == SELECT_LIST || place == IN_HAVING))
3307
          {
3308
            Item_outer_ref *rf;
3309
            /*
3310
              If an outer field is resolved in a grouping select then it
3311
              is replaced for an Item_outer_ref object. Otherwise an
3312
              Item_field object is used.
3313
              The new Item_outer_ref object is saved in the inner_refs_list of
3314
              the outer select. Here it is only created. It can be fixed only
3315
              after the original field has been fixed and this is done in the
3316
              fix_inner_refs() function.
3317
            */
3318
            ;
3319
            if (!(rf= new Item_outer_ref(context, this)))
3320
              return -1;
3321
            thd->change_item_tree(reference, rf);
3322
            select->inner_refs_list.push_back(rf);
3323
            rf->in_sum_func= thd->lex->in_sum_func;
3324
          }
3325
          /*
3326
            A reference is resolved to a nest level that's outer or the same as
3327
            the nest level of the enclosing set function : adjust the value of
3328
            max_arg_level for the function if it's needed.
3329
          */
3330
          if (thd->lex->in_sum_func &&
3331
              thd->lex->in_sum_func->nest_level >= select->nest_level)
3332
          {
3333
            Item::Type ref_type= (*reference)->type();
3334
            set_if_bigger(thd->lex->in_sum_func->max_arg_level,
3335
                          select->nest_level);
3336
            set_field(*from_field);
3337
            fixed= 1;
3338
            mark_as_dependent(thd, last_checked_context->select_lex,
3339
                              context->select_lex, this,
3340
                              ((ref_type == REF_ITEM ||
3341
                                ref_type == FIELD_ITEM) ?
3342
                               (Item_ident*) (*reference) : 0));
3343
            return 0;
3344
          }
3345
        }
3346
        else
3347
        {
3348
          Item::Type ref_type= (*reference)->type();
3349
          prev_subselect_item->used_tables_cache|=
3350
            (*reference)->used_tables();
3351
          prev_subselect_item->const_item_cache&=
3352
            (*reference)->const_item();
3353
          mark_as_dependent(thd, last_checked_context->select_lex,
3354
                            context->select_lex, this,
3355
                            ((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
3356
                             (Item_ident*) (*reference) :
3357
                             0));
3358
          /*
3359
            A reference to a view field had been found and we
3360
            substituted it instead of this Item (find_field_in_tables
3361
            does it by assigning the new value to *reference), so now
3362
            we can return from this function.
3363
          */
3364
          return 0;
3365
        }
3366
      }
3367
      break;
3368
    }
3369
3370
    /* Search in SELECT and GROUP lists of the outer select. */
3371
    if (place != IN_WHERE && place != IN_ON)
3372
    {
3373
      if (!(ref= resolve_ref_in_select_and_group(thd, this, select)))
3374
        return -1; /* Some error occurred (e.g. ambiguous names). */
3375
      if (ref != not_found_item)
3376
      {
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3377
        assert(*ref && (*ref)->fixed);
1 by brian
clean slate
3378
        prev_subselect_item->used_tables_cache|= (*ref)->used_tables();
3379
        prev_subselect_item->const_item_cache&= (*ref)->const_item();
3380
        break;
3381
      }
3382
    }
3383
3384
    /*
3385
      Reference is not found in this select => this subquery depend on
3386
      outer select (or we just trying to find wrong identifier, in this
3387
      case it does not matter which used tables bits we set)
3388
    */
3389
    prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
3390
    prev_subselect_item->const_item_cache= 0;
3391
  }
3392
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3393
  assert(ref != 0);
1 by brian
clean slate
3394
  if (!*from_field)
3395
    return -1;
3396
  if (ref == not_found_item && *from_field == not_found_field)
3397
  {
3398
    if (upward_lookup)
3399
    {
3400
      // We can't say exactly what absent table or field
3401
      my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), thd->where);
3402
    }
3403
    else
3404
    {
3405
      /* Call find_field_in_tables only to report the error */
3406
      find_field_in_tables(thd, this,
3407
                           context->first_name_resolution_table,
3408
                           context->last_name_resolution_table,
3409
                           reference, REPORT_ALL_ERRORS,
3410
                           !any_privileges &&
56 by brian
Next pass of true/false update.
3411
                           true, true);
1 by brian
clean slate
3412
    }
3413
    return -1;
3414
  }
3415
  else if (ref != not_found_item)
3416
  {
3417
    Item *save;
3418
    Item_ref *rf;
3419
3420
    /* Should have been checked in resolve_ref_in_select_and_group(). */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3421
    assert(*ref && (*ref)->fixed);
1 by brian
clean slate
3422
    /*
3423
      Here, a subset of actions performed by Item_ref::set_properties
3424
      is not enough. So we pass ptr to NULL into Item_[direct]_ref
3425
      constructor, so no initialization is performed, and call 
3426
      fix_fields() below.
3427
    */
3428
    save= *ref;
3429
    *ref= NULL;                             // Don't call set_properties()
3430
    rf= (place == IN_HAVING ?
3431
         new Item_ref(context, ref, (char*) table_name,
3432
                      (char*) field_name, alias_name_used) :
3433
         (!select->group_list.elements ?
3434
         new Item_direct_ref(context, ref, (char*) table_name,
3435
                             (char*) field_name, alias_name_used) :
3436
         new Item_outer_ref(context, ref, (char*) table_name,
3437
                            (char*) field_name, alias_name_used)));
3438
    *ref= save;
3439
    if (!rf)
3440
      return -1;
3441
3442
    if (place != IN_HAVING && select->group_list.elements)
3443
    {
3444
      outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf);
3445
      ((Item_outer_ref*)rf)->in_sum_func= thd->lex->in_sum_func;
3446
    }
3447
    thd->change_item_tree(reference, rf);
3448
    /*
3449
      rf is Item_ref => never substitute other items (in this case)
3450
      during fix_fields() => we can use rf after fix_fields()
3451
    */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3452
    assert(!rf->fixed);                // Assured by Item_ref()
1 by brian
clean slate
3453
    if (rf->fix_fields(thd, reference) || rf->check_cols(1))
3454
      return -1;
3455
3456
    mark_as_dependent(thd, last_checked_context->select_lex,
3457
                      context->select_lex, this,
3458
                      rf);
3459
    return 0;
3460
  }
3461
  else
3462
  {
3463
    mark_as_dependent(thd, last_checked_context->select_lex,
3464
                      context->select_lex,
3465
                      this, (Item_ident*)*reference);
3466
    if (last_checked_context->select_lex->having_fix_field)
3467
    {
3468
      Item_ref *rf;
3469
      rf= new Item_ref(context,
3470
                       (cached_table->db[0] ? cached_table->db : 0),
3471
                       (char*) cached_table->alias, (char*) field_name);
3472
      if (!rf)
3473
        return -1;
3474
      thd->change_item_tree(reference, rf);
3475
      /*
3476
        rf is Item_ref => never substitute other items (in this case)
3477
        during fix_fields() => we can use rf after fix_fields()
3478
      */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3479
      assert(!rf->fixed);                // Assured by Item_ref()
1 by brian
clean slate
3480
      if (rf->fix_fields(thd, reference) || rf->check_cols(1))
3481
        return -1;
3482
      return 0;
3483
    }
3484
  }
3485
  return 1;
3486
}
3487
3488
3489
/**
3490
  Resolve the name of a column reference.
3491
3492
  The method resolves the column reference represented by 'this' as a column
3493
  present in one of: FROM clause, SELECT clause, GROUP BY clause of a query
3494
  Q, or in outer queries that contain Q.
3495
3496
  The name resolution algorithm used is (where [T_j] is an optional table
3497
  name that qualifies the column name):
3498
3499
  @code
3500
    resolve_column_reference([T_j].col_ref_i)
3501
    {
3502
      search for a column or derived column named col_ref_i
3503
      [in table T_j] in the FROM clause of Q;
3504
3505
      if such a column is NOT found AND    // Lookup in outer queries.
3506
         there are outer queries
3507
      {
3508
        for each outer query Q_k beginning from the inner-most one
3509
        {
3510
          search for a column or derived column named col_ref_i
3511
          [in table T_j] in the FROM clause of Q_k;
3512
3513
          if such a column is not found
3514
            Search for a column or derived column named col_ref_i
3515
            [in table T_j] in the SELECT and GROUP clauses of Q_k.
3516
        }
3517
      }
3518
    }
3519
  @endcode
3520
3521
    Notice that compared to Item_ref::fix_fields, here we first search the FROM
3522
    clause, and then we search the SELECT and GROUP BY clauses.
3523
3524
  @param[in]     thd        current thread
3525
  @param[in,out] reference  view column if this item was resolved to a
3526
    view column
3527
3528
  @retval
56 by brian
Next pass of true/false update.
3529
    true  if error
1 by brian
clean slate
3530
  @retval
56 by brian
Next pass of true/false update.
3531
    false on success
1 by brian
clean slate
3532
*/
3533
3534
bool Item_field::fix_fields(THD *thd, Item **reference)
3535
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3536
  assert(fixed == 0);
1 by brian
clean slate
3537
  Field *from_field= (Field *)not_found_field;
3538
  bool outer_fixed= false;
3539
3540
  if (!field)					// If field is not checked
3541
  {
3542
    /*
3543
      In case of view, find_field_in_tables() write pointer to view field
3544
      expression to 'reference', i.e. it substitute that expression instead
3545
      of this Item_field
3546
    */
3547
    if ((from_field= find_field_in_tables(thd, this,
3548
                                          context->first_name_resolution_table,
3549
                                          context->last_name_resolution_table,
3550
                                          reference,
3551
                                          thd->lex->use_only_table_context ?
3552
                                            REPORT_ALL_ERRORS : 
3553
                                            IGNORE_EXCEPT_NON_UNIQUE,
3554
                                          !any_privileges,
56 by brian
Next pass of true/false update.
3555
                                          true)) ==
1 by brian
clean slate
3556
	not_found_field)
3557
    {
3558
      int ret;
3559
      /* Look up in current select's item_list to find aliased fields */
3560
      if (thd->lex->current_select->is_item_list_lookup)
3561
      {
3562
        uint counter;
3563
        enum_resolution_type resolution;
3564
        Item** res= find_item_in_list(this, thd->lex->current_select->item_list,
3565
                                      &counter, REPORT_EXCEPT_NOT_FOUND,
3566
                                      &resolution);
3567
        if (!res)
3568
          return 1;
3569
        if (resolution == RESOLVED_AGAINST_ALIAS)
56 by brian
Next pass of true/false update.
3570
          alias_name_used= true;
1 by brian
clean slate
3571
        if (res != (Item **)not_found_item)
3572
        {
3573
          if ((*res)->type() == Item::FIELD_ITEM)
3574
          {
3575
            /*
3576
              It's an Item_field referencing another Item_field in the select
3577
              list.
3578
              Use the field from the Item_field in the select list and leave
3579
              the Item_field instance in place.
3580
            */
3581
3582
            Field *new_field= (*((Item_field**)res))->field;
3583
3584
            if (new_field == NULL)
3585
            {
3586
              /* The column to which we link isn't valid. */
3587
              my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name, 
3588
                       current_thd->where);
3589
              return(1);
3590
            }
3591
3592
            set_field(new_field);
3593
            return 0;
3594
          }
3595
          else
3596
          {
3597
            /*
3598
              It's not an Item_field in the select list so we must make a new
3599
              Item_ref to point to the Item in the select list and replace the
3600
              Item_field created by the parser with the new Item_ref.
3601
            */
3602
            Item_ref *rf= new Item_ref(context, db_name,table_name,field_name);
3603
            if (!rf)
3604
              return 1;
3605
            thd->change_item_tree(reference, rf);
3606
            /*
3607
              Because Item_ref never substitutes itself with other items 
3608
              in Item_ref::fix_fields(), we can safely use the original 
3609
              pointer to it even after fix_fields()
3610
             */
3611
            return rf->fix_fields(thd, reference) ||  rf->check_cols(1);
3612
          }
3613
        }
3614
      }
3615
      if ((ret= fix_outer_field(thd, &from_field, reference)) < 0)
3616
        goto error;
56 by brian
Next pass of true/false update.
3617
      outer_fixed= true;
1 by brian
clean slate
3618
      if (!ret)
3619
        goto mark_non_agg_field;
3620
    }
3621
    else if (!from_field)
3622
      goto error;
3623
3624
    if (!outer_fixed && cached_table && cached_table->select_lex &&
3625
        context->select_lex &&
3626
        cached_table->select_lex != context->select_lex)
3627
    {
3628
      int ret;
3629
      if ((ret= fix_outer_field(thd, &from_field, reference)) < 0)
3630
        goto error;
3631
      outer_fixed= 1;
3632
      if (!ret)
3633
        goto mark_non_agg_field;
3634
    }
3635
3636
    /*
3637
      if it is not expression from merged VIEW we will set this field.
3638
3639
      We can leave expression substituted from view for next PS/SP rexecution
3640
      (i.e. do not register this substitution for reverting on cleanup()
3641
      (register_item_tree_changing())), because this subtree will be
3642
      fix_field'ed during setup_tables()->setup_underlying() (i.e. before
3643
      all other expressions of query, and references on tables which do
3644
      not present in query will not make problems.
3645
3646
      Also we suppose that view can't be changed during PS/SP life.
3647
    */
3648
    if (from_field == view_ref_found)
56 by brian
Next pass of true/false update.
3649
      return false;
1 by brian
clean slate
3650
3651
    set_field(from_field);
3652
    if (thd->lex->in_sum_func &&
3653
        thd->lex->in_sum_func->nest_level == 
3654
        thd->lex->current_select->nest_level)
3655
      set_if_bigger(thd->lex->in_sum_func->max_arg_level,
3656
                    thd->lex->current_select->nest_level);
3657
  }
3658
  else if (thd->mark_used_columns != MARK_COLUMNS_NONE)
3659
  {
3660
    TABLE *table= field->table;
3661
    MY_BITMAP *current_bitmap, *other_bitmap;
3662
    if (thd->mark_used_columns == MARK_COLUMNS_READ)
3663
    {
3664
      current_bitmap= table->read_set;
3665
      other_bitmap=   table->write_set;
3666
    }
3667
    else
3668
    {
3669
      current_bitmap= table->write_set;
3670
      other_bitmap=   table->read_set;
3671
    }
3672
    if (!bitmap_fast_test_and_set(current_bitmap, field->field_index))
3673
    {
3674
      if (!bitmap_is_set(other_bitmap, field->field_index))
3675
      {
3676
        /* First usage of column */
3677
        table->used_fields++;                     // Used to optimize loops
3678
        /* purecov: begin inspected */
3679
        table->covering_keys.intersect(field->part_of_key);
3680
        /* purecov: end */
3681
      }
3682
    }
3683
  }
3684
  fixed= 1;
3685
mark_non_agg_field:
56 by brian
Next pass of true/false update.
3686
  return false;
1 by brian
clean slate
3687
3688
error:
3689
  context->process_error(thd);
56 by brian
Next pass of true/false update.
3690
  return true;
1 by brian
clean slate
3691
}
3692
3693
Item *Item_field::safe_charset_converter(CHARSET_INFO *tocs)
3694
{
3695
  no_const_subst= 1;
3696
  return Item::safe_charset_converter(tocs);
3697
}
3698
3699
3700
void Item_field::cleanup()
3701
{
3702
  Item_ident::cleanup();
3703
  /*
3704
    Even if this object was created by direct link to field in setup_wild()
3705
    it will be linked correctly next time by name of field and table alias.
3706
    I.e. we can drop 'field'.
3707
   */
3708
  field= result_field= 0;
56 by brian
Next pass of true/false update.
3709
  null_value= false;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3710
  return;
1 by brian
clean slate
3711
}
3712
3713
/**
3714
  Find a field among specified multiple equalities.
3715
3716
  The function first searches the field among multiple equalities
3717
  of the current level (in the cond_equal->current_level list).
3718
  If it fails, it continues searching in upper levels accessed
3719
  through a pointer cond_equal->upper_levels.
3720
  The search terminates as soon as a multiple equality containing 
3721
  the field is found. 
3722
3723
  @param cond_equal   reference to list of multiple equalities where
3724
                      the field (this object) is to be looked for
3725
3726
  @return
3727
    - First Item_equal containing the field, if success
3728
    - 0, otherwise
3729
*/
3730
3731
Item_equal *Item_field::find_item_equal(COND_EQUAL *cond_equal)
3732
{
3733
  Item_equal *item= 0;
3734
  while (cond_equal)
3735
  {
3736
    List_iterator_fast<Item_equal> li(cond_equal->current_level);
3737
    while ((item= li++))
3738
    {
3739
      if (item->contains(field))
3740
        return item;
3741
    }
3742
    /* 
3743
      The field is not found in any of the multiple equalities
3744
      of the current level. Look for it in upper levels
3745
    */
3746
    cond_equal= cond_equal->upper_levels;
3747
  }
3748
  return 0;
3749
}
3750
3751
3752
/**
3753
  Check whether a field can be substituted by an equal item.
3754
3755
  The function checks whether a substitution of the field
3756
  occurrence for an equal item is valid.
3757
3758
  @param arg   *arg != NULL <-> the field is in the context where
3759
               substitution for an equal item is valid
3760
3761
  @note
3762
    The following statement is not always true:
3763
  @n
3764
    x=y => F(x)=F(x/y).
3765
  @n
3766
    This means substitution of an item for an equal item not always
3767
    yields an equavalent condition. Here's an example:
3768
    @code
3769
    'a'='a '
3770
    (LENGTH('a')=1) != (LENGTH('a ')=2)
3771
  @endcode
3772
    Such a substitution is surely valid if either the substituted
3773
    field is not of a STRING type or if it is an argument of
3774
    a comparison predicate.
3775
3776
  @retval
56 by brian
Next pass of true/false update.
3777
    true   substitution is valid
1 by brian
clean slate
3778
  @retval
56 by brian
Next pass of true/false update.
3779
    false  otherwise
1 by brian
clean slate
3780
*/
3781
3782
bool Item_field::subst_argument_checker(uchar **arg)
3783
{
3784
  return (result_type() != STRING_RESULT) || (*arg);
3785
}
3786
3787
3788
/**
3789
  Convert a numeric value to a zero-filled string
3790
3791
  @param[in,out]  item   the item to operate on
3792
  @param          field  The field that this value is equated to
3793
3794
  This function converts a numeric value to a string. In this conversion
3795
  the zero-fill flag of the field is taken into account.
3796
  This is required so the resulting string value can be used instead of
3797
  the field reference when propagating equalities.
3798
*/
3799
3800
static void convert_zerofill_number_to_string(Item **item, Field_num *field)
3801
{
3802
  char buff[MAX_FIELD_WIDTH],*pos;
3803
  String tmp(buff,sizeof(buff), field->charset()), *res;
3804
3805
  res= (*item)->val_str(&tmp);
3806
  field->prepend_zeros(res);
3807
  pos= (char *) sql_strmake (res->ptr(), res->length());
3808
  *item= new Item_string(pos, res->length(), field->charset());
3809
}
3810
3811
3812
/**
3813
  Set a pointer to the multiple equality the field reference belongs to
3814
  (if any).
3815
3816
  The function looks for a multiple equality containing the field item
3817
  among those referenced by arg.
3818
  In the case such equality exists the function does the following.
3819
  If the found multiple equality contains a constant, then the field
3820
  reference is substituted for this constant, otherwise it sets a pointer
3821
  to the multiple equality in the field item.
3822
3823
3824
  @param arg    reference to list of multiple equalities where
3825
                the field (this object) is to be looked for
3826
3827
  @note
3828
    This function is supposed to be called as a callback parameter in calls
3829
    of the compile method.
3830
3831
  @return
3832
    - pointer to the replacing constant item, if the field item was substituted
3833
    - pointer to the field item, otherwise.
3834
*/
3835
3836
Item *Item_field::equal_fields_propagator(uchar *arg)
3837
{
3838
  if (no_const_subst)
3839
    return this;
3840
  item_equal= find_item_equal((COND_EQUAL *) arg);
3841
  Item *item= 0;
3842
  if (item_equal)
3843
    item= item_equal->get_const();
3844
  /*
3845
    Disable const propagation for items used in different comparison contexts.
3846
    This must be done because, for example, Item_hex_string->val_int() is not
3847
    the same as (Item_hex_string->val_str() in BINARY column)->val_int().
3848
    We cannot simply disable the replacement in a particular context (
3849
    e.g. <bin_col> = <int_col> AND <bin_col> = <hex_string>) since
3850
    Items don't know the context they are in and there are functions like 
3851
    IF (<hex_string>, 'yes', 'no').
3852
    The same problem occurs when comparing a DATE/TIME field with a
3853
    DATE/TIME represented as an int and as a string.
3854
  */
3855
  if (!item ||
3856
      (cmp_context != (Item_result)-1 && item->cmp_context != cmp_context))
3857
    item= this;
3858
  else if (field && (field->flags & ZEROFILL_FLAG) && IS_NUM(field->type()))
3859
  {
3860
    if (item && cmp_context != INT_RESULT)
3861
      convert_zerofill_number_to_string(&item, (Field_num *)field);
3862
    else
3863
      item= this;
3864
  }
3865
  return item;
3866
}
3867
3868
3869
/**
3870
  Mark the item to not be part of substitution if it's not a binary item.
3871
3872
  See comments in Arg_comparator::set_compare_func() for details.
3873
*/
3874
77.1.15 by Monty Taylor
Bunch of warning cleanups.
3875
bool Item_field::set_no_const_sub(uchar *arg __attribute__((__unused__)))
1 by brian
clean slate
3876
{
3877
  if (field->charset() != &my_charset_bin)
3878
    no_const_subst=1;
56 by brian
Next pass of true/false update.
3879
  return false;
1 by brian
clean slate
3880
}
3881
3882
3883
/**
3884
  Replace an Item_field for an equal Item_field that evaluated earlier
3885
  (if any).
3886
3887
  The function returns a pointer to an item that is taken from
3888
  the very beginning of the item_equal list which the Item_field
3889
  object refers to (belongs to) unless item_equal contains  a constant
3890
  item. In this case the function returns this constant item, 
3891
  (if the substitution does not require conversion).   
3892
  If the Item_field object does not refer any Item_equal object
3893
  'this' is returned .
3894
3895
  @param arg   a dummy parameter, is not used here
3896
3897
3898
  @note
3899
    This function is supposed to be called as a callback parameter in calls
3900
    of the thransformer method.
3901
3902
  @return
3903
    - pointer to a replacement Item_field if there is a better equal item or
3904
      a pointer to a constant equal item;
3905
    - this - otherwise.
3906
*/
3907
77.1.15 by Monty Taylor
Bunch of warning cleanups.
3908
Item *Item_field::replace_equal_field(uchar *arg __attribute__((__unused__)))
1 by brian
clean slate
3909
{
3910
  if (item_equal)
3911
  {
3912
    Item *const_item= item_equal->get_const();
3913
    if (const_item)
3914
    {
3915
      if (cmp_context != (Item_result)-1 &&
3916
          const_item->cmp_context != cmp_context)
3917
        return this;
3918
      return const_item;
3919
    }
3920
    Item_field *subst= item_equal->get_first();
3921
    if (subst && !field->eq(subst->field))
3922
      return subst;
3923
  }
3924
  return this;
3925
}
3926
3927
3928
void Item::init_make_field(Send_field *tmp_field,
3929
			   enum enum_field_types field_type_arg)
3930
{
3931
  char *empty_name= (char*) "";
3932
  tmp_field->db_name=		empty_name;
3933
  tmp_field->org_table_name=	empty_name;
3934
  tmp_field->org_col_name=	empty_name;
3935
  tmp_field->table_name=	empty_name;
3936
  tmp_field->col_name=		name;
3937
  tmp_field->charsetnr=         collation.collation->number;
3938
  tmp_field->flags=             (maybe_null ? 0 : NOT_NULL_FLAG) | 
3939
                                (my_binary_compare(collation.collation) ?
3940
                                 BINARY_FLAG : 0);
3941
  tmp_field->type=              field_type_arg;
3942
  tmp_field->length=max_length;
3943
  tmp_field->decimals=decimals;
3944
  if (unsigned_flag)
3945
    tmp_field->flags |= UNSIGNED_FLAG;
3946
}
3947
3948
void Item::make_field(Send_field *tmp_field)
3949
{
3950
  init_make_field(tmp_field, field_type());
3951
}
3952
3953
3954
enum_field_types Item::string_field_type() const
3955
{
3956
  enum_field_types f_type= MYSQL_TYPE_VAR_STRING;
113 by Brian Aker
First pass on removing blob internals.
3957
  if (max_length >= 65536)
3958
    f_type= MYSQL_TYPE_BLOB;
1 by brian
clean slate
3959
  return f_type;
3960
}
3961
3962
3963
void Item_empty_string::make_field(Send_field *tmp_field)
3964
{
3965
  init_make_field(tmp_field, string_field_type());
3966
}
3967
3968
3969
enum_field_types Item::field_type() const
3970
{
3971
  switch (result_type()) {
3972
  case STRING_RESULT:  return string_field_type();
3973
  case INT_RESULT:     return MYSQL_TYPE_LONGLONG;
3974
  case DECIMAL_RESULT: return MYSQL_TYPE_NEWDECIMAL;
3975
  case REAL_RESULT:    return MYSQL_TYPE_DOUBLE;
3976
  case ROW_RESULT:
3977
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
3978
    assert(0);
1 by brian
clean slate
3979
    return MYSQL_TYPE_VARCHAR;
3980
  }
3981
}
3982
3983
3984
bool Item::is_datetime()
3985
{
3986
  switch (field_type())
3987
  {
97 by Brian Aker
DATE cleanup.
3988
    case MYSQL_TYPE_NEWDATE:
1 by brian
clean slate
3989
    case MYSQL_TYPE_DATETIME:
3990
    case MYSQL_TYPE_TIMESTAMP:
56 by brian
Next pass of true/false update.
3991
      return true;
1 by brian
clean slate
3992
    default:
3993
      break;
3994
  }
56 by brian
Next pass of true/false update.
3995
  return false;
1 by brian
clean slate
3996
}
3997
3998
3999
String *Item::check_well_formed_result(String *str, bool send_error)
4000
{
4001
  /* Check whether we got a well-formed string */
4002
  CHARSET_INFO *cs= str->charset();
4003
  int well_formed_error;
4004
  uint wlen= cs->cset->well_formed_len(cs,
4005
                                       str->ptr(), str->ptr() + str->length(),
4006
                                       str->length(), &well_formed_error);
4007
  if (wlen < str->length())
4008
  {
4009
    THD *thd= current_thd;
4010
    char hexbuf[7];
4011
    enum MYSQL_ERROR::enum_warning_level level;
4012
    uint diff= str->length() - wlen;
4013
    set_if_smaller(diff, 3);
4014
    octet2hex(hexbuf, str->ptr() + wlen, diff);
4015
    if (send_error)
4016
    {
4017
      my_error(ER_INVALID_CHARACTER_STRING, MYF(0),
4018
               cs->csname,  hexbuf);
4019
      return 0;
4020
    }
4021
    {
4022
      level= MYSQL_ERROR::WARN_LEVEL_ERROR;
4023
      null_value= 1;
4024
      str= 0;
4025
    }
4026
    push_warning_printf(thd, level, ER_INVALID_CHARACTER_STRING,
4027
                        ER(ER_INVALID_CHARACTER_STRING), cs->csname, hexbuf);
4028
  }
4029
  return str;
4030
}
4031
4032
/*
4033
  Compare two items using a given collation
4034
  
4035
  SYNOPSIS
4036
    eq_by_collation()
4037
    item               item to compare with
56 by brian
Next pass of true/false update.
4038
    binary_cmp         true <-> compare as binaries
1 by brian
clean slate
4039
    cs                 collation to use when comparing strings
4040
4041
  DESCRIPTION
4042
    This method works exactly as Item::eq if the collation cs coincides with
4043
    the collation of the compared objects. Otherwise, first the collations that
4044
    differ from cs are replaced for cs and then the items are compared by
4045
    Item::eq. After the comparison the original collations of items are
4046
    restored.
4047
4048
  RETURN
4049
    1    compared items has been detected as equal   
4050
    0    otherwise
4051
*/
4052
4053
bool Item::eq_by_collation(Item *item, bool binary_cmp, CHARSET_INFO *cs)
4054
{
4055
  CHARSET_INFO *save_cs= 0;
4056
  CHARSET_INFO *save_item_cs= 0;
4057
  if (collation.collation != cs)
4058
  {
4059
    save_cs= collation.collation;
4060
    collation.collation= cs;
4061
  }
4062
  if (item->collation.collation != cs)
4063
  {
4064
    save_item_cs= item->collation.collation;
4065
    item->collation.collation= cs;
4066
  }
4067
  bool res= eq(item, binary_cmp);
4068
  if (save_cs)
4069
    collation.collation= save_cs;
4070
  if (save_item_cs)
4071
    item->collation.collation= save_item_cs;
4072
  return res;
4073
}  
4074
4075
4076
/**
4077
  Create a field to hold a string value from an item.
4078
4079
  If max_length > CONVERT_IF_BIGGER_TO_BLOB create a blob @n
4080
  If max_length > 0 create a varchar @n
4081
  If max_length == 0 create a CHAR(0) 
4082
4083
  @param table		Table for which the field is created
4084
*/
4085
4086
Field *Item::make_string_field(TABLE *table)
4087
{
4088
  Field *field;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4089
  assert(collation.collation);
1 by brian
clean slate
4090
  if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB)
4091
    field= new Field_blob(max_length, maybe_null, name,
4092
                          collation.collation);
4093
  /* Item_type_holder holds the exact type, do not change it */
4094
  else if (max_length > 0 &&
4095
      (type() != Item::TYPE_HOLDER || field_type() != MYSQL_TYPE_STRING))
4096
    field= new Field_varstring(max_length, maybe_null, name, table->s,
4097
                               collation.collation);
4098
  else
4099
    field= new Field_string(max_length, maybe_null, name,
4100
                            collation.collation);
4101
  if (field)
4102
    field->init(table);
4103
  return field;
4104
}
4105
4106
4107
/**
4108
  Create a field based on field_type of argument.
4109
4110
  For now, this is only used to create a field for
4111
  IFNULL(x,something) and time functions
4112
4113
  @retval
4114
    NULL  error
4115
  @retval
4116
    \#    Created field
4117
*/
4118
4119
Field *Item::tmp_table_field_from_field_type(TABLE *table, bool fixed_length)
4120
{
4121
  /*
4122
    The field functions defines a field to be not null if null_ptr is not 0
4123
  */
4124
  uchar *null_ptr= maybe_null ? (uchar*) "" : 0;
4125
  Field *field;
4126
4127
  switch (field_type()) {
4128
  case MYSQL_TYPE_NEWDECIMAL:
4129
    field= new Field_new_decimal((uchar*) 0, max_length, null_ptr, 0,
4130
                                 Field::NONE, name, decimals, 0,
4131
                                 unsigned_flag);
4132
    break;
4133
  case MYSQL_TYPE_TINY:
4134
    field= new Field_tiny((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4135
			  name, 0, unsigned_flag);
4136
    break;
4137
  case MYSQL_TYPE_SHORT:
4138
    field= new Field_short((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4139
			   name, 0, unsigned_flag);
4140
    break;
4141
  case MYSQL_TYPE_LONG:
4142
    field= new Field_long((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4143
			  name, 0, unsigned_flag);
4144
    break;
4145
  case MYSQL_TYPE_LONGLONG:
152 by Brian Aker
longlong replacement
4146
    field= new Field_int64_t((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
1 by brian
clean slate
4147
			      name, 0, unsigned_flag);
4148
    break;
4149
  case MYSQL_TYPE_FLOAT:
4150
    field= new Field_float((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4151
			   name, decimals, 0, unsigned_flag);
4152
    break;
4153
  case MYSQL_TYPE_DOUBLE:
4154
    field= new Field_double((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4155
			    name, decimals, 0, unsigned_flag);
4156
    break;
4157
  case MYSQL_TYPE_NULL:
4158
    field= new Field_null((uchar*) 0, max_length, Field::NONE,
4159
			  name, &my_charset_bin);
4160
    break;
4161
  case MYSQL_TYPE_NEWDATE:
4162
    field= new Field_newdate(maybe_null, name, &my_charset_bin);
4163
    break;
4164
  case MYSQL_TYPE_TIME:
4165
    field= new Field_time(maybe_null, name, &my_charset_bin);
4166
    break;
4167
  case MYSQL_TYPE_TIMESTAMP:
4168
    field= new Field_timestamp(maybe_null, name, &my_charset_bin);
4169
    break;
4170
  case MYSQL_TYPE_DATETIME:
4171
    field= new Field_datetime(maybe_null, name, &my_charset_bin);
4172
    break;
4173
  case MYSQL_TYPE_YEAR:
4174
    field= new Field_year((uchar*) 0, max_length, null_ptr, 0, Field::NONE,
4175
			  name);
4176
    break;
4177
  default:
4178
    /* This case should never be chosen */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4179
    assert(0);
1 by brian
clean slate
4180
    /* If something goes awfully wrong, it's better to get a string than die */
4181
  case MYSQL_TYPE_STRING:
4182
    if (fixed_length && max_length < CONVERT_IF_BIGGER_TO_BLOB)
4183
    {
4184
      field= new Field_string(max_length, maybe_null, name,
4185
                              collation.collation);
4186
      break;
4187
    }
4188
    /* Fall through to make_string_field() */
4189
  case MYSQL_TYPE_ENUM:
4190
  case MYSQL_TYPE_SET:
4191
  case MYSQL_TYPE_VAR_STRING:
4192
  case MYSQL_TYPE_VARCHAR:
4193
    return make_string_field(table);
4194
  case MYSQL_TYPE_BLOB:
4195
    if (this->type() == Item::TYPE_HOLDER)
4196
      field= new Field_blob(max_length, maybe_null, name, collation.collation,
4197
                            1);
4198
    else
4199
      field= new Field_blob(max_length, maybe_null, name, collation.collation);
4200
    break;					// Blob handled outside of case
4201
  }
4202
  if (field)
4203
    field->init(table);
4204
  return field;
4205
}
4206
4207
4208
/* ARGSUSED */
4209
void Item_field::make_field(Send_field *tmp_field)
4210
{
4211
  field->make_field(tmp_field);
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4212
  assert(tmp_field->table_name != 0);
1 by brian
clean slate
4213
  if (name)
4214
    tmp_field->col_name=name;			// Use user supplied name
4215
  if (table_name)
4216
    tmp_field->table_name= table_name;
4217
  if (db_name)
4218
    tmp_field->db_name= db_name;
4219
}
4220
4221
4222
/**
4223
  Set a field's value from a item.
4224
*/
4225
4226
void Item_field::save_org_in_field(Field *to)
4227
{
4228
  if (field->is_null())
4229
  {
4230
    null_value=1;
4231
    set_field_to_null_with_conversions(to, 1);
4232
  }
4233
  else
4234
  {
4235
    to->set_notnull();
4236
    field_conv(to,field);
4237
    null_value=0;
4238
  }
4239
}
4240
4241
int Item_field::save_in_field(Field *to, bool no_conversions)
4242
{
4243
  int res;
4244
  if (result_field->is_null())
4245
  {
4246
    null_value=1;
4247
    res= set_field_to_null_with_conversions(to, no_conversions);
4248
  }
4249
  else
4250
  {
4251
    to->set_notnull();
4252
    res= field_conv(to,result_field);
4253
    null_value=0;
4254
  }
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4255
  return(res);
1 by brian
clean slate
4256
}
4257
4258
4259
/**
4260
  Store null in field.
4261
4262
  This is used on INSERT.
4263
  Allow NULL to be inserted in timestamp and auto_increment values.
4264
4265
  @param field		Field where we want to store NULL
4266
4267
  @retval
4268
    0   ok
4269
  @retval
4270
    1   Field doesn't support NULL values and can't handle 'field = NULL'
4271
*/
4272
4273
int Item_null::save_in_field(Field *field, bool no_conversions)
4274
{
4275
  return set_field_to_null_with_conversions(field, no_conversions);
4276
}
4277
4278
4279
/**
4280
  Store null in field.
4281
4282
  @param field		Field where we want to store NULL
4283
4284
  @retval
4285
    0	 OK
4286
  @retval
4287
    1	 Field doesn't support NULL values
4288
*/
4289
4290
int Item_null::save_safe_in_field(Field *field)
4291
{
4292
  return set_field_to_null(field);
4293
}
4294
4295
4296
/*
4297
  This implementation can lose str_value content, so if the
4298
  Item uses str_value to store something, it should
4299
  reimplement it's ::save_in_field() as Item_string, for example, does
4300
*/
4301
4302
int Item::save_in_field(Field *field, bool no_conversions)
4303
{
4304
  int error;
4305
  if (result_type() == STRING_RESULT)
4306
  {
4307
    String *result;
4308
    CHARSET_INFO *cs= collation.collation;
4309
    char buff[MAX_FIELD_WIDTH];		// Alloc buffer for small columns
4310
    str_value.set_quick(buff, sizeof(buff), cs);
4311
    result=val_str(&str_value);
4312
    if (null_value)
4313
    {
4314
      str_value.set_quick(0, 0, cs);
4315
      return set_field_to_null_with_conversions(field, no_conversions);
4316
    }
4317
56 by brian
Next pass of true/false update.
4318
    /* NOTE: If null_value == false, "result" must be not NULL.  */
1 by brian
clean slate
4319
4320
    field->set_notnull();
4321
    error=field->store(result->ptr(),result->length(),cs);
4322
    str_value.set_quick(0, 0, cs);
4323
  }
4324
  else if (result_type() == REAL_RESULT &&
4325
           field->result_type() == STRING_RESULT)
4326
  {
4327
    double nr= val_real();
4328
    if (null_value)
4329
      return set_field_to_null_with_conversions(field, no_conversions);
4330
    field->set_notnull();
4331
    error= field->store(nr);
4332
  }
4333
  else if (result_type() == REAL_RESULT)
4334
  {
4335
    double nr= val_real();
4336
    if (null_value)
4337
      return set_field_to_null(field);
4338
    field->set_notnull();
4339
    error=field->store(nr);
4340
  }
4341
  else if (result_type() == DECIMAL_RESULT)
4342
  {
4343
    my_decimal decimal_value;
4344
    my_decimal *value= val_decimal(&decimal_value);
4345
    if (null_value)
4346
      return set_field_to_null_with_conversions(field, no_conversions);
4347
    field->set_notnull();
4348
    error=field->store_decimal(value);
4349
  }
4350
  else
4351
  {
152 by Brian Aker
longlong replacement
4352
    int64_t nr=val_int();
1 by brian
clean slate
4353
    if (null_value)
4354
      return set_field_to_null_with_conversions(field, no_conversions);
4355
    field->set_notnull();
4356
    error=field->store(nr, unsigned_flag);
4357
  }
4358
  return error;
4359
}
4360
4361
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4362
int Item_string::save_in_field(Field *field,
4363
                               bool no_conversions __attribute__((__unused__)))
1 by brian
clean slate
4364
{
4365
  String *result;
4366
  result=val_str(&str_value);
4367
  return save_str_value_in_field(field, result);
4368
}
4369
4370
4371
int Item_uint::save_in_field(Field *field, bool no_conversions)
4372
{
4373
  /* Item_int::save_in_field handles both signed and unsigned. */
4374
  return Item_int::save_in_field(field, no_conversions);
4375
}
4376
4377
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4378
int Item_int::save_in_field(Field *field,
4379
                            bool no_conversions __attribute__((__unused__)))
1 by brian
clean slate
4380
{
152 by Brian Aker
longlong replacement
4381
  int64_t nr=val_int();
1 by brian
clean slate
4382
  if (null_value)
4383
    return set_field_to_null(field);
4384
  field->set_notnull();
4385
  return field->store(nr, unsigned_flag);
4386
}
4387
4388
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4389
int Item_decimal::save_in_field(Field *field,
4390
                                bool no_conversions __attribute__((__unused__)))
1 by brian
clean slate
4391
{
4392
  field->set_notnull();
4393
  return field->store_decimal(&decimal_value);
4394
}
4395
4396
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4397
bool Item_int::eq(const Item *arg,
4398
                  bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
4399
{
4400
  /* No need to check for null value as basic constant can't be NULL */
4401
  if (arg->basic_const_item() && arg->type() == type())
4402
  {
4403
    /*
4404
      We need to cast off const to call val_int(). This should be OK for
4405
      a basic constant.
4406
    */
4407
    Item *item= (Item*) arg;
4408
    return item->val_int() == value && item->unsigned_flag == unsigned_flag;
4409
  }
56 by brian
Next pass of true/false update.
4410
  return false;
1 by brian
clean slate
4411
}
4412
4413
4414
Item *Item_int_with_ref::clone_item()
4415
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4416
  assert(ref->const_item());
1 by brian
clean slate
4417
  /*
4418
    We need to evaluate the constant to make sure it works with
4419
    parameter markers.
4420
  */
4421
  return (ref->unsigned_flag ?
4422
          new Item_uint(ref->name, ref->val_int(), ref->max_length) :
4423
          new Item_int(ref->name, ref->val_int(), ref->max_length));
4424
}
4425
4426
4427
Item_num *Item_uint::neg()
4428
{
4429
  Item_decimal *item= new Item_decimal(value, 1);
4430
  return item->neg();
4431
}
4432
4433
4434
static uint nr_of_decimals(const char *str, const char *end)
4435
{
4436
  const char *decimal_point;
4437
4438
  /* Find position for '.' */
4439
  for (;;)
4440
  {
4441
    if (str == end)
4442
      return 0;
4443
    if (*str == 'e' || *str == 'E')
4444
      return NOT_FIXED_DEC;    
4445
    if (*str++ == '.')
4446
      break;
4447
  }
4448
  decimal_point= str;
4449
  for (; my_isdigit(system_charset_info, *str) ; str++)
4450
    ;
4451
  if (*str == 'e' || *str == 'E')
4452
    return NOT_FIXED_DEC;
4453
  return (uint) (str - decimal_point);
4454
}
4455
4456
4457
/**
4458
  This function is only called during parsing. We will signal an error if
4459
  value is not a true double value (overflow)
4460
*/
4461
4462
Item_float::Item_float(const char *str_arg, uint length)
4463
{
4464
  int error;
4465
  char *end_not_used;
4466
  value= my_strntod(&my_charset_bin, (char*) str_arg, length, &end_not_used,
4467
                    &error);
4468
  if (error)
4469
  {
4470
    /*
4471
      Note that we depend on that str_arg is null terminated, which is true
4472
      when we are in the parser
4473
    */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4474
    assert(str_arg[length] == 0);
1 by brian
clean slate
4475
    my_error(ER_ILLEGAL_VALUE_FOR_TYPE, MYF(0), "double", (char*) str_arg);
4476
  }
4477
  presentation= name=(char*) str_arg;
4478
  decimals=(uint8) nr_of_decimals(str_arg, str_arg+length);
4479
  max_length=length;
4480
  fixed= 1;
4481
}
4482
4483
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4484
int Item_float::save_in_field(Field *field,
4485
                              bool no_conversions __attribute__((__unused__)))
1 by brian
clean slate
4486
{
4487
  double nr= val_real();
4488
  if (null_value)
4489
    return set_field_to_null(field);
4490
  field->set_notnull();
4491
  return field->store(nr);
4492
}
4493
4494
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4495
void Item_float::print(String *str,
4496
                       enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
4497
{
4498
  if (presentation)
4499
  {
4500
    str->append(presentation);
4501
    return;
4502
  }
4503
  char buffer[20];
4504
  String num(buffer, sizeof(buffer), &my_charset_bin);
4505
  num.set_real(value, decimals, &my_charset_bin);
4506
  str->append(num);
4507
}
4508
4509
4510
/*
4511
  hex item
4512
  In string context this is a binary string.
152 by Brian Aker
longlong replacement
4513
  In number context this is a int64_t value.
1 by brian
clean slate
4514
*/
4515
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4516
bool Item_float::eq(const Item *arg,
4517
                    bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
4518
{
4519
  if (arg->basic_const_item() && arg->type() == type())
4520
  {
4521
    /*
4522
      We need to cast off const to call val_int(). This should be OK for
4523
      a basic constant.
4524
    */
4525
    Item *item= (Item*) arg;
4526
    return item->val_real() == value;
4527
  }
56 by brian
Next pass of true/false update.
4528
  return false;
1 by brian
clean slate
4529
}
4530
4531
4532
inline uint char_val(char X)
4533
{
4534
  return (uint) (X >= '0' && X <= '9' ? X-'0' :
4535
		 X >= 'A' && X <= 'Z' ? X-'A'+10 :
4536
		 X-'a'+10);
4537
}
4538
4539
4540
Item_hex_string::Item_hex_string(const char *str, uint str_length)
4541
{
4542
  max_length=(str_length+1)/2;
4543
  char *ptr=(char*) sql_alloc(max_length+1);
4544
  if (!ptr)
4545
    return;
4546
  str_value.set(ptr,max_length,&my_charset_bin);
4547
  char *end=ptr+max_length;
4548
  if (max_length*2 != str_length)
4549
    *ptr++=char_val(*str++);			// Not even, assume 0 prefix
4550
  while (ptr != end)
4551
  {
4552
    *ptr++= (char) (char_val(str[0])*16+char_val(str[1]));
4553
    str+=2;
4554
  }
4555
  *ptr=0;					// Keep purify happy
4556
  collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
4557
  fixed= 1;
4558
  unsigned_flag= 1;
4559
}
4560
152 by Brian Aker
longlong replacement
4561
int64_t Item_hex_string::val_int()
1 by brian
clean slate
4562
{
4563
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4564
  assert(fixed == 1);
1 by brian
clean slate
4565
  char *end=(char*) str_value.ptr()+str_value.length(),
152 by Brian Aker
longlong replacement
4566
       *ptr=end-min(str_value.length(),sizeof(int64_t));
1 by brian
clean slate
4567
151 by Brian Aker
Ulonglong to uint64_t
4568
  uint64_t value=0;
1 by brian
clean slate
4569
  for (; ptr != end ; ptr++)
151 by Brian Aker
Ulonglong to uint64_t
4570
    value=(value << 8)+ (uint64_t) (uchar) *ptr;
152 by Brian Aker
longlong replacement
4571
  return (int64_t) value;
1 by brian
clean slate
4572
}
4573
4574
4575
my_decimal *Item_hex_string::val_decimal(my_decimal *decimal_value)
4576
{
4577
  // following assert is redundant, because fixed=1 assigned in constructor
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4578
  assert(fixed == 1);
151 by Brian Aker
Ulonglong to uint64_t
4579
  uint64_t value= (uint64_t)val_int();
56 by brian
Next pass of true/false update.
4580
  int2my_decimal(E_DEC_FATAL_ERROR, value, true, decimal_value);
1 by brian
clean slate
4581
  return (decimal_value);
4582
}
4583
4584
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4585
int Item_hex_string::save_in_field(Field *field,
4586
                                   bool no_conversions __attribute__((__unused__)))
1 by brian
clean slate
4587
{
4588
  field->set_notnull();
4589
  if (field->result_type() == STRING_RESULT)
4590
    return field->store(str_value.ptr(), str_value.length(), 
4591
                        collation.collation);
4592
151 by Brian Aker
Ulonglong to uint64_t
4593
  uint64_t nr;
1 by brian
clean slate
4594
  uint32 length= str_value.length();
4595
  if (length > 8)
4596
  {
4597
    nr= field->flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX;
4598
    goto warn;
4599
  }
151 by Brian Aker
Ulonglong to uint64_t
4600
  nr= (uint64_t) val_int();
1 by brian
clean slate
4601
  if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX))
4602
  {
4603
    nr= LONGLONG_MAX;
4604
    goto warn;
4605
  }
152 by Brian Aker
longlong replacement
4606
  return field->store((int64_t) nr, true);  // Assume hex numbers are unsigned
1 by brian
clean slate
4607
4608
warn:
152 by Brian Aker
longlong replacement
4609
  if (!field->store((int64_t) nr, true))
1 by brian
clean slate
4610
    field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE,
4611
                       1);
4612
  return 1;
4613
}
4614
4615
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4616
void Item_hex_string::print(String *str,
4617
                            enum_query_type query_type __attribute__((__unused__)))
1 by brian
clean slate
4618
{
4619
  char *end= (char*) str_value.ptr() + str_value.length(),
152 by Brian Aker
longlong replacement
4620
       *ptr= end - min(str_value.length(), sizeof(int64_t));
1 by brian
clean slate
4621
  str->append("0x");
4622
  for (; ptr != end ; ptr++)
4623
  {
4624
    str->append(_dig_vec_lower[((uchar) *ptr) >> 4]);
4625
    str->append(_dig_vec_lower[((uchar) *ptr) & 0x0F]);
4626
  }
4627
}
4628
4629
4630
bool Item_hex_string::eq(const Item *arg, bool binary_cmp) const
4631
{
4632
  if (arg->basic_const_item() && arg->type() == type())
4633
  {
4634
    if (binary_cmp)
4635
      return !stringcmp(&str_value, &arg->str_value);
4636
    return !sortcmp(&str_value, &arg->str_value, collation.collation);
4637
  }
56 by brian
Next pass of true/false update.
4638
  return false;
1 by brian
clean slate
4639
}
4640
4641
4642
Item *Item_hex_string::safe_charset_converter(CHARSET_INFO *tocs)
4643
{
4644
  Item_string *conv;
4645
  String tmp, *str= val_str(&tmp);
4646
4647
  if (!(conv= new Item_string(str->ptr(), str->length(), tocs)))
4648
    return NULL;
4649
  conv->str_value.copy();
4650
  conv->str_value.mark_as_const();
4651
  return conv;
4652
}
4653
4654
4655
/*
4656
  bin item.
4657
  In string context this is a binary string.
152 by Brian Aker
longlong replacement
4658
  In number context this is a int64_t value.
1 by brian
clean slate
4659
*/
4660
  
4661
Item_bin_string::Item_bin_string(const char *str, uint str_length)
4662
{
4663
  const char *end= str + str_length - 1;
4664
  uchar bits= 0;
4665
  uint power= 1;
4666
4667
  max_length= (str_length + 7) >> 3;
4668
  char *ptr= (char*) sql_alloc(max_length + 1);
4669
  if (!ptr)
4670
    return;
4671
  str_value.set(ptr, max_length, &my_charset_bin);
4672
  ptr+= max_length - 1;
4673
  ptr[1]= 0;                     // Set end null for string
4674
  for (; end >= str; end--)
4675
  {
4676
    if (power == 256)
4677
    {
4678
      power= 1;
4679
      *ptr--= bits;
4680
      bits= 0;     
4681
    }
4682
    if (*end == '1')
4683
      bits|= power; 
4684
    power<<= 1;
4685
  }
4686
  *ptr= (char) bits;
4687
  collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
4688
  fixed= 1;
4689
}
4690
4691
4692
/**
4693
  Pack data in buffer for sending.
4694
*/
4695
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4696
bool Item_null::send(Protocol *protocol,
4697
                     String *packet __attribute__((__unused__)))
1 by brian
clean slate
4698
{
4699
  return protocol->store_null();
4700
}
4701
4702
/**
4703
  This is only called from items that is not of type item_field.
4704
*/
4705
4706
bool Item::send(Protocol *protocol, String *buffer)
4707
{
4708
  bool result= false;
4709
  enum_field_types f_type;
4710
4711
  switch ((f_type=field_type())) {
4712
  default:
4713
  case MYSQL_TYPE_NULL:
4714
  case MYSQL_TYPE_ENUM:
4715
  case MYSQL_TYPE_SET:
4716
  case MYSQL_TYPE_BLOB:
4717
  case MYSQL_TYPE_STRING:
4718
  case MYSQL_TYPE_VAR_STRING:
4719
  case MYSQL_TYPE_VARCHAR:
4720
  case MYSQL_TYPE_NEWDECIMAL:
4721
  {
4722
    String *res;
4723
    if ((res=val_str(buffer)))
4724
      result= protocol->store(res->ptr(),res->length(),res->charset());
4725
    break;
4726
  }
4727
  case MYSQL_TYPE_TINY:
4728
  {
152 by Brian Aker
longlong replacement
4729
    int64_t nr;
1 by brian
clean slate
4730
    nr= val_int();
4731
    if (!null_value)
4732
      result= protocol->store_tiny(nr);
4733
    break;
4734
  }
4735
  case MYSQL_TYPE_SHORT:
4736
  case MYSQL_TYPE_YEAR:
4737
  {
152 by Brian Aker
longlong replacement
4738
    int64_t nr;
1 by brian
clean slate
4739
    nr= val_int();
4740
    if (!null_value)
4741
      result= protocol->store_short(nr);
4742
    break;
4743
  }
4744
  case MYSQL_TYPE_LONG:
4745
  {
152 by Brian Aker
longlong replacement
4746
    int64_t nr;
1 by brian
clean slate
4747
    nr= val_int();
4748
    if (!null_value)
4749
      result= protocol->store_long(nr);
4750
    break;
4751
  }
4752
  case MYSQL_TYPE_LONGLONG:
4753
  {
152 by Brian Aker
longlong replacement
4754
    int64_t nr;
1 by brian
clean slate
4755
    nr= val_int();
4756
    if (!null_value)
152 by Brian Aker
longlong replacement
4757
      result= protocol->store_int64_t(nr, unsigned_flag);
1 by brian
clean slate
4758
    break;
4759
  }
4760
  case MYSQL_TYPE_FLOAT:
4761
  {
4762
    float nr;
4763
    nr= (float) val_real();
4764
    if (!null_value)
4765
      result= protocol->store(nr, decimals, buffer);
4766
    break;
4767
  }
4768
  case MYSQL_TYPE_DOUBLE:
4769
  {
4770
    double nr= val_real();
4771
    if (!null_value)
4772
      result= protocol->store(nr, decimals, buffer);
4773
    break;
4774
  }
4775
  case MYSQL_TYPE_DATETIME:
4776
  case MYSQL_TYPE_TIMESTAMP:
4777
  {
4778
    MYSQL_TIME tm;
4779
    get_date(&tm, TIME_FUZZY_DATE);
4780
    if (!null_value)
4781
    {
97 by Brian Aker
DATE cleanup.
4782
      if (f_type == MYSQL_TYPE_NEWDATE)
1 by brian
clean slate
4783
	return protocol->store_date(&tm);
4784
      else
4785
	result= protocol->store(&tm);
4786
    }
4787
    break;
4788
  }
4789
  case MYSQL_TYPE_TIME:
4790
  {
4791
    MYSQL_TIME tm;
4792
    get_time(&tm);
4793
    if (!null_value)
4794
      result= protocol->store_time(&tm);
4795
    break;
4796
  }
4797
  }
4798
  if (null_value)
4799
    result= protocol->store_null();
4800
  return result;
4801
}
4802
4803
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4804
bool Item_field::send(Protocol *protocol,
4805
                      String *buffer __attribute__((__unused__)))
1 by brian
clean slate
4806
{
4807
  return protocol->store(result_field);
4808
}
4809
4810
77.1.15 by Monty Taylor
Bunch of warning cleanups.
4811
void Item_field::update_null_value()
4812
{
4813
  /*
4814
    need to set no_errors to prevent warnings about type conversion
1 by brian
clean slate
4815
    popping up.
4816
  */
4817
  THD *thd= field->table->in_use;
4818
  int no_errors;
4819
4820
  no_errors= thd->no_errors;
4821
  thd->no_errors= 1;
4822
  Item::update_null_value();
4823
  thd->no_errors= no_errors;
4824
}
4825
4826
4827
/*
4828
  Add the field to the select list and substitute it for the reference to
4829
  the field.
4830
4831
  SYNOPSIS
4832
    Item_field::update_value_transformer()
4833
    select_arg      current select
4834
4835
  DESCRIPTION
4836
    If the field doesn't belong to the table being inserted into then it is
4837
    added to the select list, pointer to it is stored in the ref_pointer_array
4838
    of the select and the field itself is substituted for the Item_ref object.
4839
    This is done in order to get correct values from update fields that
4840
    belongs to the SELECT part in the INSERT .. SELECT .. ON DUPLICATE KEY
4841
    UPDATE statement.
4842
4843
  RETURN
4844
    0             if error occured
4845
    ref           if all conditions are met
4846
    this field    otherwise
4847
*/
4848
4849
Item *Item_field::update_value_transformer(uchar *select_arg)
4850
{
4851
  SELECT_LEX *select= (SELECT_LEX*)select_arg;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4852
  assert(fixed);
1 by brian
clean slate
4853
4854
  if (field->table != select->context.table_list->table &&
4855
      type() != Item::TRIGGER_FIELD_ITEM)
4856
  {
4857
    List<Item> *all_fields= &select->join->all_fields;
4858
    Item **ref_pointer_array= select->ref_pointer_array;
4859
    int el= all_fields->elements;
4860
    Item_ref *ref;
4861
4862
    ref_pointer_array[el]= (Item*)this;
4863
    all_fields->push_front((Item*)this);
4864
    ref= new Item_ref(&select->context, ref_pointer_array + el,
4865
                      table_name, field_name);
4866
    return ref;
4867
  }
4868
  return this;
4869
}
4870
4871
4872
void Item_field::print(String *str, enum_query_type query_type)
4873
{
4874
  if (field && field->table->const_table)
4875
  {
4876
    char buff[MAX_FIELD_WIDTH];
4877
    String tmp(buff,sizeof(buff),str->charset());
4878
    field->val_str(&tmp);
4879
    str->append('\'');
4880
    str->append(tmp);
4881
    str->append('\'');
4882
    return;
4883
  }
4884
  Item_ident::print(str, query_type);
4885
}
4886
4887
4888
Item_ref::Item_ref(Name_resolution_context *context_arg,
4889
                   Item **item, const char *table_name_arg,
4890
                   const char *field_name_arg,
4891
                   bool alias_name_used_arg)
4892
  :Item_ident(context_arg, NullS, table_name_arg, field_name_arg),
4893
   result_field(0), ref(item)
4894
{
4895
  alias_name_used= alias_name_used_arg;
4896
  /*
4897
    This constructor used to create some internals references over fixed items
4898
  */
4899
  if (ref && *ref && (*ref)->fixed)
4900
    set_properties();
4901
}
4902
4903
4904
/**
4905
  Resolve the name of a reference to a column reference.
4906
4907
  The method resolves the column reference represented by 'this' as a column
4908
  present in one of: GROUP BY clause, SELECT clause, outer queries. It is
4909
  used typically for columns in the HAVING clause which are not under
4910
  aggregate functions.
4911
4912
  POSTCONDITION @n
4913
  Item_ref::ref is 0 or points to a valid item.
4914
4915
  @note
4916
    The name resolution algorithm used is (where [T_j] is an optional table
4917
    name that qualifies the column name):
4918
4919
  @code
4920
        resolve_extended([T_j].col_ref_i)
4921
        {
4922
          Search for a column or derived column named col_ref_i [in table T_j]
4923
          in the SELECT and GROUP clauses of Q.
4924
4925
          if such a column is NOT found AND    // Lookup in outer queries.
4926
             there are outer queries
4927
          {
4928
            for each outer query Q_k beginning from the inner-most one
4929
           {
4930
              Search for a column or derived column named col_ref_i
4931
              [in table T_j] in the SELECT and GROUP clauses of Q_k.
4932
4933
              if such a column is not found AND
4934
                 - Q_k is not a group query AND
4935
                 - Q_k is not inside an aggregate function
4936
                 OR
4937
                 - Q_(k-1) is not in a HAVING or SELECT clause of Q_k
4938
              {
4939
                search for a column or derived column named col_ref_i
4940
                [in table T_j] in the FROM clause of Q_k;
4941
              }
4942
            }
4943
          }
4944
        }
4945
  @endcode
4946
  @n
4947
    This procedure treats GROUP BY and SELECT clauses as one namespace for
4948
    column references in HAVING. Notice that compared to
4949
    Item_field::fix_fields, here we first search the SELECT and GROUP BY
4950
    clauses, and then we search the FROM clause.
4951
4952
  @param[in]     thd        current thread
4953
  @param[in,out] reference  view column if this item was resolved to a
4954
    view column
4955
4956
  @todo
4957
    Here we could first find the field anyway, and then test this
4958
    condition, so that we can give a better error message -
4959
    ER_WRONG_FIELD_WITH_GROUP, instead of the less informative
4960
    ER_BAD_FIELD_ERROR which we produce now.
4961
4962
  @retval
56 by brian
Next pass of true/false update.
4963
    true  if error
1 by brian
clean slate
4964
  @retval
56 by brian
Next pass of true/false update.
4965
    false on success
1 by brian
clean slate
4966
*/
4967
4968
bool Item_ref::fix_fields(THD *thd, Item **reference)
4969
{
4970
  enum_parsing_place place= NO_MATTER;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
4971
  assert(fixed == 0);
1 by brian
clean slate
4972
  SELECT_LEX *current_sel= thd->lex->current_select;
4973
4974
  if (!ref || ref == not_found_item)
4975
  {
4976
    if (!(ref= resolve_ref_in_select_and_group(thd, this,
4977
                                               context->select_lex)))
4978
      goto error;             /* Some error occurred (e.g. ambiguous names). */
4979
4980
    if (ref == not_found_item) /* This reference was not resolved. */
4981
    {
4982
      Name_resolution_context *last_checked_context= context;
4983
      Name_resolution_context *outer_context= context->outer_context;
4984
      Field *from_field;
4985
      ref= 0;
4986
4987
      if (!outer_context)
4988
      {
4989
        /* The current reference cannot be resolved in this query. */
4990
        my_error(ER_BAD_FIELD_ERROR,MYF(0),
4991
                 this->full_name(), current_thd->where);
4992
        goto error;
4993
      }
4994
4995
      /*
4996
        If there is an outer context (select), and it is not a derived table
4997
        (which do not support the use of outer fields for now), try to
4998
        resolve this reference in the outer select(s).
4999
5000
        We treat each subselect as a separate namespace, so that different
5001
        subselects may contain columns with the same names. The subselects are
5002
        searched starting from the innermost.
5003
      */
5004
      from_field= (Field*) not_found_field;
5005
5006
      do
5007
      {
5008
        SELECT_LEX *select= outer_context->select_lex;
5009
        Item_subselect *prev_subselect_item=
5010
          last_checked_context->select_lex->master_unit()->item;
5011
        last_checked_context= outer_context;
5012
5013
        /* Search in the SELECT and GROUP lists of the outer select. */
5014
        if (outer_context->resolve_in_select_list)
5015
        {
5016
          if (!(ref= resolve_ref_in_select_and_group(thd, this, select)))
5017
            goto error; /* Some error occurred (e.g. ambiguous names). */
5018
          if (ref != not_found_item)
5019
          {
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5020
            assert(*ref && (*ref)->fixed);
1 by brian
clean slate
5021
            prev_subselect_item->used_tables_cache|= (*ref)->used_tables();
5022
            prev_subselect_item->const_item_cache&= (*ref)->const_item();
5023
            break;
5024
          }
5025
          /*
5026
            Set ref to 0 to ensure that we get an error in case we replaced
5027
            this item with another item and still use this item in some
5028
            other place of the parse tree.
5029
          */
5030
          ref= 0;
5031
        }
5032
5033
        place= prev_subselect_item->parsing_place;
5034
        /*
5035
          Check table fields only if the subquery is used somewhere out of
5036
          HAVING or the outer SELECT does not use grouping (i.e. tables are
5037
          accessible).
5038
          TODO:
5039
          Here we could first find the field anyway, and then test this
5040
          condition, so that we can give a better error message -
5041
          ER_WRONG_FIELD_WITH_GROUP, instead of the less informative
5042
          ER_BAD_FIELD_ERROR which we produce now.
5043
        */
5044
        if ((place != IN_HAVING ||
5045
             (!select->with_sum_func &&
5046
              select->group_list.elements == 0)))
5047
        {
5048
          /*
5049
            In case of view, find_field_in_tables() write pointer to view
5050
            field expression to 'reference', i.e. it substitute that
5051
            expression instead of this Item_ref
5052
          */
5053
          from_field= find_field_in_tables(thd, this,
5054
                                           outer_context->
5055
                                             first_name_resolution_table,
5056
                                           outer_context->
5057
                                             last_name_resolution_table,
5058
                                           reference,
5059
                                           IGNORE_EXCEPT_NON_UNIQUE,
56 by brian
Next pass of true/false update.
5060
                                           true, true);
1 by brian
clean slate
5061
          if (! from_field)
5062
            goto error;
5063
          if (from_field == view_ref_found)
5064
          {
5065
            Item::Type refer_type= (*reference)->type();
5066
            prev_subselect_item->used_tables_cache|=
5067
              (*reference)->used_tables();
5068
            prev_subselect_item->const_item_cache&=
5069
              (*reference)->const_item();
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5070
            assert((*reference)->type() == REF_ITEM);
1 by brian
clean slate
5071
            mark_as_dependent(thd, last_checked_context->select_lex,
5072
                              context->select_lex, this,
5073
                              ((refer_type == REF_ITEM ||
5074
                                refer_type == FIELD_ITEM) ?
5075
                               (Item_ident*) (*reference) :
5076
                               0));
5077
            /*
5078
              view reference found, we substituted it instead of this
5079
              Item, so can quit
5080
            */
56 by brian
Next pass of true/false update.
5081
            return false;
1 by brian
clean slate
5082
          }
5083
          if (from_field != not_found_field)
5084
          {
5085
            if (cached_table && cached_table->select_lex &&
5086
                outer_context->select_lex &&
5087
                cached_table->select_lex != outer_context->select_lex)
5088
            {
5089
              /*
5090
                Due to cache, find_field_in_tables() can return field which
5091
                doesn't belong to provided outer_context. In this case we have
5092
                to find proper field context in order to fix field correcly.
5093
              */
5094
              do
5095
              {
5096
                outer_context= outer_context->outer_context;
5097
                select= outer_context->select_lex;
5098
                prev_subselect_item=
5099
                  last_checked_context->select_lex->master_unit()->item;
5100
                last_checked_context= outer_context;
5101
              } while (outer_context && outer_context->select_lex &&
5102
                       cached_table->select_lex != outer_context->select_lex);
5103
            }
5104
            prev_subselect_item->used_tables_cache|= from_field->table->map;
5105
            prev_subselect_item->const_item_cache= 0;
5106
            break;
5107
          }
5108
        }
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5109
        assert(from_field == not_found_field);
1 by brian
clean slate
5110
5111
        /* Reference is not found => depend on outer (or just error). */
5112
        prev_subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT;
5113
        prev_subselect_item->const_item_cache= 0;
5114
5115
        outer_context= outer_context->outer_context;
5116
      } while (outer_context);
5117
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5118
      assert(from_field != 0 && from_field != view_ref_found);
1 by brian
clean slate
5119
      if (from_field != not_found_field)
5120
      {
5121
        Item_field* fld;
5122
        if (!(fld= new Item_field(from_field)))
5123
          goto error;
5124
        thd->change_item_tree(reference, fld);
5125
        mark_as_dependent(thd, last_checked_context->select_lex,
5126
                          thd->lex->current_select, this, fld);
5127
        /*
5128
          A reference is resolved to a nest level that's outer or the same as
5129
          the nest level of the enclosing set function : adjust the value of
5130
          max_arg_level for the function if it's needed.
5131
        */
5132
        if (thd->lex->in_sum_func &&
5133
            thd->lex->in_sum_func->nest_level >= 
5134
            last_checked_context->select_lex->nest_level)
5135
          set_if_bigger(thd->lex->in_sum_func->max_arg_level,
5136
                        last_checked_context->select_lex->nest_level);
56 by brian
Next pass of true/false update.
5137
        return false;
1 by brian
clean slate
5138
      }
5139
      if (ref == 0)
5140
      {
5141
        /* The item was not a table field and not a reference */
5142
        my_error(ER_BAD_FIELD_ERROR, MYF(0),
5143
                 this->full_name(), current_thd->where);
5144
        goto error;
5145
      }
5146
      /* Should be checked in resolve_ref_in_select_and_group(). */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5147
      assert(*ref && (*ref)->fixed);
1 by brian
clean slate
5148
      mark_as_dependent(thd, last_checked_context->select_lex,
5149
                        context->select_lex, this, this);
5150
      /*
5151
        A reference is resolved to a nest level that's outer or the same as
5152
        the nest level of the enclosing set function : adjust the value of
5153
        max_arg_level for the function if it's needed.
5154
      */
5155
      if (thd->lex->in_sum_func &&
5156
          thd->lex->in_sum_func->nest_level >= 
5157
          last_checked_context->select_lex->nest_level)
5158
        set_if_bigger(thd->lex->in_sum_func->max_arg_level,
5159
                      last_checked_context->select_lex->nest_level);
5160
    }
5161
  }
5162
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5163
  assert(*ref);
1 by brian
clean slate
5164
  /*
5165
    Check if this is an incorrect reference in a group function or forward
5166
    reference. Do not issue an error if this is:
5167
      1. outer reference (will be fixed later by the fix_inner_refs function);
5168
      2. an unnamed reference inside an aggregate function.
5169
  */
5170
  if (!((*ref)->type() == REF_ITEM &&
5171
       ((Item_ref *)(*ref))->ref_type() == OUTER_REF) &&
5172
      (((*ref)->with_sum_func && name &&
5173
        !(current_sel->linkage != GLOBAL_OPTIONS_TYPE &&
5174
          current_sel->having_fix_field)) ||
5175
       !(*ref)->fixed))
5176
  {
5177
    my_error(ER_ILLEGAL_REFERENCE, MYF(0),
5178
             name, ((*ref)->with_sum_func?
5179
                    "reference to group function":
5180
                    "forward reference in item list"));
5181
    goto error;
5182
  }
5183
5184
  set_properties();
5185
5186
  if ((*ref)->check_cols(1))
5187
    goto error;
56 by brian
Next pass of true/false update.
5188
  return false;
1 by brian
clean slate
5189
5190
error:
5191
  context->process_error(thd);
56 by brian
Next pass of true/false update.
5192
  return true;
1 by brian
clean slate
5193
}
5194
5195
5196
void Item_ref::set_properties()
5197
{
5198
  max_length= (*ref)->max_length;
5199
  maybe_null= (*ref)->maybe_null;
5200
  decimals=   (*ref)->decimals;
5201
  collation.set((*ref)->collation);
5202
  /*
5203
    We have to remember if we refer to a sum function, to ensure that
5204
    split_sum_func() doesn't try to change the reference.
5205
  */
5206
  with_sum_func= (*ref)->with_sum_func;
5207
  unsigned_flag= (*ref)->unsigned_flag;
5208
  fixed= 1;
5209
  if (alias_name_used)
5210
    return;
5211
  if ((*ref)->type() == FIELD_ITEM)
5212
    alias_name_used= ((Item_ident *) (*ref))->alias_name_used;
5213
  else
56 by brian
Next pass of true/false update.
5214
    alias_name_used= true; // it is not field, so it is was resolved by alias
1 by brian
clean slate
5215
}
5216
5217
5218
void Item_ref::cleanup()
5219
{
5220
  Item_ident::cleanup();
5221
  result_field= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5222
  return;
1 by brian
clean slate
5223
}
5224
5225
5226
void Item_ref::print(String *str, enum_query_type query_type)
5227
{
5228
  if (ref)
5229
  {
5230
    if ((*ref)->type() != Item::CACHE_ITEM && ref_type() != VIEW_REF &&
5231
        !table_name && name && alias_name_used)
5232
    {
5233
      THD *thd= current_thd;
5234
      append_identifier(thd, str, name, (uint) strlen(name));
5235
    }
5236
    else
5237
      (*ref)->print(str, query_type);
5238
  }
5239
  else
5240
    Item_ident::print(str, query_type);
5241
}
5242
5243
5244
bool Item_ref::send(Protocol *prot, String *tmp)
5245
{
5246
  if (result_field)
5247
    return prot->store(result_field);
5248
  return (*ref)->send(prot, tmp);
5249
}
5250
5251
5252
double Item_ref::val_result()
5253
{
5254
  if (result_field)
5255
  {
5256
    if ((null_value= result_field->is_null()))
5257
      return 0.0;
5258
    return result_field->val_real();
5259
  }
5260
  return val_real();
5261
}
5262
5263
152 by Brian Aker
longlong replacement
5264
int64_t Item_ref::val_int_result()
1 by brian
clean slate
5265
{
5266
  if (result_field)
5267
  {
5268
    if ((null_value= result_field->is_null()))
5269
      return 0;
5270
    return result_field->val_int();
5271
  }
5272
  return val_int();
5273
}
5274
5275
5276
String *Item_ref::str_result(String* str)
5277
{
5278
  if (result_field)
5279
  {
5280
    if ((null_value= result_field->is_null()))
5281
      return 0;
5282
    str->set_charset(str_value.charset());
5283
    return result_field->val_str(str, &str_value);
5284
  }
5285
  return val_str(str);
5286
}
5287
5288
5289
my_decimal *Item_ref::val_decimal_result(my_decimal *decimal_value)
5290
{
5291
  if (result_field)
5292
  {
5293
    if ((null_value= result_field->is_null()))
5294
      return 0;
5295
    return result_field->val_decimal(decimal_value);
5296
  }
5297
  return val_decimal(decimal_value);
5298
}
5299
5300
5301
bool Item_ref::val_bool_result()
5302
{
5303
  if (result_field)
5304
  {
5305
    if ((null_value= result_field->is_null()))
5306
      return 0;
5307
    switch (result_field->result_type()) {
5308
    case INT_RESULT:
5309
      return result_field->val_int() != 0;
5310
    case DECIMAL_RESULT:
5311
    {
5312
      my_decimal decimal_value;
5313
      my_decimal *val= result_field->val_decimal(&decimal_value);
5314
      if (val)
5315
        return !my_decimal_is_zero(val);
5316
      return 0;
5317
    }
5318
    case REAL_RESULT:
5319
    case STRING_RESULT:
5320
      return result_field->val_real() != 0.0;
5321
    case ROW_RESULT:
5322
    default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5323
      assert(0);
1 by brian
clean slate
5324
    }
5325
  }
5326
  return val_bool();
5327
}
5328
5329
5330
double Item_ref::val_real()
5331
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5332
  assert(fixed);
1 by brian
clean slate
5333
  double tmp=(*ref)->val_result();
5334
  null_value=(*ref)->null_value;
5335
  return tmp;
5336
}
5337
5338
152 by Brian Aker
longlong replacement
5339
int64_t Item_ref::val_int()
1 by brian
clean slate
5340
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5341
  assert(fixed);
152 by Brian Aker
longlong replacement
5342
  int64_t tmp=(*ref)->val_int_result();
1 by brian
clean slate
5343
  null_value=(*ref)->null_value;
5344
  return tmp;
5345
}
5346
5347
5348
bool Item_ref::val_bool()
5349
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5350
  assert(fixed);
1 by brian
clean slate
5351
  bool tmp= (*ref)->val_bool_result();
5352
  null_value= (*ref)->null_value;
5353
  return tmp;
5354
}
5355
5356
5357
String *Item_ref::val_str(String* tmp)
5358
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5359
  assert(fixed);
1 by brian
clean slate
5360
  tmp=(*ref)->str_result(tmp);
5361
  null_value=(*ref)->null_value;
5362
  return tmp;
5363
}
5364
5365
5366
bool Item_ref::is_null()
5367
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5368
  assert(fixed);
1 by brian
clean slate
5369
  return (*ref)->is_null();
5370
}
5371
5372
5373
bool Item_ref::get_date(MYSQL_TIME *ltime,uint fuzzydate)
5374
{
5375
  return (null_value=(*ref)->get_date_result(ltime,fuzzydate));
5376
}
5377
5378
5379
my_decimal *Item_ref::val_decimal(my_decimal *decimal_value)
5380
{
5381
  my_decimal *val= (*ref)->val_decimal_result(decimal_value);
5382
  null_value= (*ref)->null_value;
5383
  return val;
5384
}
5385
5386
int Item_ref::save_in_field(Field *to, bool no_conversions)
5387
{
5388
  int res;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5389
  assert(!result_field);
1 by brian
clean slate
5390
  res= (*ref)->save_in_field(to, no_conversions);
5391
  null_value= (*ref)->null_value;
5392
  return res;
5393
}
5394
5395
5396
void Item_ref::save_org_in_field(Field *field)
5397
{
5398
  (*ref)->save_org_in_field(field);
5399
}
5400
5401
5402
void Item_ref::make_field(Send_field *field)
5403
{
5404
  (*ref)->make_field(field);
5405
  /* Non-zero in case of a view */
5406
  if (name)
5407
    field->col_name= name;
5408
  if (table_name)
5409
    field->table_name= table_name;
5410
  if (db_name)
5411
    field->db_name= db_name;
5412
}
5413
5414
5415
Item *Item_ref::get_tmp_table_item(THD *thd)
5416
{
5417
  if (!result_field)
5418
    return (*ref)->get_tmp_table_item(thd);
5419
5420
  Item_field *item= new Item_field(result_field);
5421
  if (item)
5422
  {
5423
    item->table_name= table_name;
5424
    item->db_name= db_name;
5425
  }
5426
  return item;
5427
}
5428
5429
5430
void Item_ref_null_helper::print(String *str, enum_query_type query_type)
5431
{
5432
  str->append(STRING_WITH_LEN("<ref_null_helper>("));
5433
  if (ref)
5434
    (*ref)->print(str, query_type);
5435
  else
5436
    str->append('?');
5437
  str->append(')');
5438
}
5439
5440
5441
double Item_direct_ref::val_real()
5442
{
5443
  double tmp=(*ref)->val_real();
5444
  null_value=(*ref)->null_value;
5445
  return tmp;
5446
}
5447
5448
152 by Brian Aker
longlong replacement
5449
int64_t Item_direct_ref::val_int()
1 by brian
clean slate
5450
{
152 by Brian Aker
longlong replacement
5451
  int64_t tmp=(*ref)->val_int();
1 by brian
clean slate
5452
  null_value=(*ref)->null_value;
5453
  return tmp;
5454
}
5455
5456
5457
String *Item_direct_ref::val_str(String* tmp)
5458
{
5459
  tmp=(*ref)->val_str(tmp);
5460
  null_value=(*ref)->null_value;
5461
  return tmp;
5462
}
5463
5464
5465
my_decimal *Item_direct_ref::val_decimal(my_decimal *decimal_value)
5466
{
5467
  my_decimal *tmp= (*ref)->val_decimal(decimal_value);
5468
  null_value=(*ref)->null_value;
5469
  return tmp;
5470
}
5471
5472
5473
bool Item_direct_ref::val_bool()
5474
{
5475
  bool tmp= (*ref)->val_bool();
5476
  null_value=(*ref)->null_value;
5477
  return tmp;
5478
}
5479
5480
5481
bool Item_direct_ref::is_null()
5482
{
5483
  return (*ref)->is_null();
5484
}
5485
5486
5487
bool Item_direct_ref::get_date(MYSQL_TIME *ltime,uint fuzzydate)
5488
{
5489
  return (null_value=(*ref)->get_date(ltime,fuzzydate));
5490
}
5491
5492
5493
/**
5494
  Prepare referenced field then call usual Item_direct_ref::fix_fields .
5495
5496
  @param thd         thread handler
5497
  @param reference   reference on reference where this item stored
5498
5499
  @retval
56 by brian
Next pass of true/false update.
5500
    false   OK
1 by brian
clean slate
5501
  @retval
56 by brian
Next pass of true/false update.
5502
    true    Error
1 by brian
clean slate
5503
*/
5504
5505
bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference)
5506
{
5507
  /* view fild reference must be defined */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5508
  assert(*ref);
1 by brian
clean slate
5509
  /* (*ref)->check_cols() will be made in Item_direct_ref::fix_fields */
5510
  if (!(*ref)->fixed &&
5511
      ((*ref)->fix_fields(thd, ref)))
56 by brian
Next pass of true/false update.
5512
    return true;
1 by brian
clean slate
5513
  return Item_direct_ref::fix_fields(thd, reference);
5514
}
5515
5516
/*
5517
  Prepare referenced outer field then call usual Item_direct_ref::fix_fields
5518
5519
  SYNOPSIS
5520
    Item_outer_ref::fix_fields()
5521
    thd         thread handler
5522
    reference   reference on reference where this item stored
5523
5524
  RETURN
56 by brian
Next pass of true/false update.
5525
    false   OK
5526
    true    Error
1 by brian
clean slate
5527
*/
5528
5529
bool Item_outer_ref::fix_fields(THD *thd, Item **reference)
5530
{
5531
  bool err;
5532
  /* outer_ref->check_cols() will be made in Item_direct_ref::fix_fields */
5533
  if ((*ref) && !(*ref)->fixed && ((*ref)->fix_fields(thd, reference)))
56 by brian
Next pass of true/false update.
5534
    return true;
1 by brian
clean slate
5535
  err= Item_direct_ref::fix_fields(thd, reference);
5536
  if (!outer_ref)
5537
    outer_ref= *ref;
5538
  if ((*ref)->type() == Item::FIELD_ITEM)
5539
    table_name= ((Item_field*)outer_ref)->table_name;
5540
  return err;
5541
}
5542
5543
void Item_outer_ref::fix_after_pullout(st_select_lex *new_parent, Item **ref)
5544
{
5545
  if (depended_from == new_parent)
5546
  {
5547
    *ref= outer_ref;
5548
    outer_ref->fix_after_pullout(new_parent, ref);
5549
  }
5550
}
5551
77.1.15 by Monty Taylor
Bunch of warning cleanups.
5552
void Item_ref::fix_after_pullout(st_select_lex *new_parent,
5553
                                 Item **refptr __attribute__((__unused__)))
1 by brian
clean slate
5554
{
5555
  if (depended_from == new_parent)
5556
  {
5557
    (*ref)->fix_after_pullout(new_parent, ref);
5558
    depended_from= NULL;
5559
  }
5560
}
5561
5562
/**
5563
  Compare two view column references for equality.
5564
5565
  A view column reference is considered equal to another column
5566
  reference if the second one is a view column and if both column
5567
  references resolve to the same item. It is assumed that both
5568
  items are of the same type.
5569
5570
  @param item        item to compare with
5571
  @param binary_cmp  make binary comparison
5572
5573
  @retval
56 by brian
Next pass of true/false update.
5574
    true    Referenced item is equal to given item
1 by brian
clean slate
5575
  @retval
56 by brian
Next pass of true/false update.
5576
    false   otherwise
1 by brian
clean slate
5577
*/
5578
77.1.15 by Monty Taylor
Bunch of warning cleanups.
5579
bool Item_direct_view_ref::eq(const Item *item,
5580
                              bool binary_cmp __attribute__((__unused__))) const
1 by brian
clean slate
5581
{
5582
  if (item->type() == REF_ITEM)
5583
  {
5584
    Item_ref *item_ref= (Item_ref*) item;
5585
    if (item_ref->ref_type() == VIEW_REF)
5586
    {
5587
      Item *item_ref_ref= *(item_ref->ref);
5588
      return ((*ref)->real_item() == item_ref_ref->real_item());
5589
    }
5590
  }
56 by brian
Next pass of true/false update.
5591
  return false;
1 by brian
clean slate
5592
}
5593
5594
bool Item_default_value::eq(const Item *item, bool binary_cmp) const
5595
{
77.1.15 by Monty Taylor
Bunch of warning cleanups.
5596
  return item->type() == DEFAULT_VALUE_ITEM &&
1 by brian
clean slate
5597
    ((Item_default_value *)item)->arg->eq(arg, binary_cmp);
5598
}
5599
5600
77.1.15 by Monty Taylor
Bunch of warning cleanups.
5601
bool Item_default_value::fix_fields(THD *thd,
5602
                                    Item **items __attribute__((__unused__)))
1 by brian
clean slate
5603
{
5604
  Item *real_arg;
5605
  Item_field *field_arg;
5606
  Field *def_field;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5607
  assert(fixed == 0);
1 by brian
clean slate
5608
5609
  if (!arg)
5610
  {
5611
    fixed= 1;
56 by brian
Next pass of true/false update.
5612
    return false;
1 by brian
clean slate
5613
  }
5614
  if (!arg->fixed && arg->fix_fields(thd, &arg))
5615
    goto error;
5616
5617
5618
  real_arg= arg->real_item();
5619
  if (real_arg->type() != FIELD_ITEM)
5620
  {
5621
    my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name);
5622
    goto error;
5623
  }
5624
5625
  field_arg= (Item_field *)real_arg;
5626
  if (field_arg->field->flags & NO_DEFAULT_VALUE_FLAG)
5627
  {
5628
    my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), field_arg->field->field_name);
5629
    goto error;
5630
  }
5631
  if (!(def_field= (Field*) sql_alloc(field_arg->field->size_of())))
5632
    goto error;
5633
  memcpy(def_field, field_arg->field, field_arg->field->size_of());
5634
  def_field->move_field_offset((my_ptrdiff_t)
5635
                               (def_field->table->s->default_values -
5636
                                def_field->table->record[0]));
5637
  set_field(def_field);
56 by brian
Next pass of true/false update.
5638
  return false;
1 by brian
clean slate
5639
5640
error:
5641
  context->process_error(thd);
56 by brian
Next pass of true/false update.
5642
  return true;
1 by brian
clean slate
5643
}
5644
5645
5646
void Item_default_value::print(String *str, enum_query_type query_type)
5647
{
5648
  if (!arg)
5649
  {
5650
    str->append(STRING_WITH_LEN("default"));
5651
    return;
5652
  }
5653
  str->append(STRING_WITH_LEN("default("));
5654
  arg->print(str, query_type);
5655
  str->append(')');
5656
}
5657
5658
5659
int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
5660
{
5661
  if (!arg)
5662
  {
5663
    if (field_arg->flags & NO_DEFAULT_VALUE_FLAG)
5664
    {
5665
      if (field_arg->reset())
5666
      {
5667
        my_message(ER_CANT_CREATE_GEOMETRY_OBJECT,
5668
                   ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0));
5669
        return -1;
5670
      }
5671
5672
      {
5673
        push_warning_printf(field_arg->table->in_use,
5674
                            MYSQL_ERROR::WARN_LEVEL_WARN,
5675
                            ER_NO_DEFAULT_FOR_FIELD,
5676
                            ER(ER_NO_DEFAULT_FOR_FIELD),
5677
                            field_arg->field_name);
5678
      }
5679
      return 1;
5680
    }
5681
    field_arg->set_default();
5682
    return 0;
5683
  }
5684
  return Item_field::save_in_field(field_arg, no_conversions);
5685
}
5686
5687
5688
/**
5689
  This method like the walk method traverses the item tree, but at the
5690
  same time it can replace some nodes in the tree.
5691
*/ 
5692
5693
Item *Item_default_value::transform(Item_transformer transformer, uchar *args)
5694
{
5695
  Item *new_item= arg->transform(transformer, args);
5696
  if (!new_item)
5697
    return 0;
5698
5699
  /*
5700
    THD::change_item_tree() should be called only if the tree was
5701
    really transformed, i.e. when a new item has been created.
5702
    Otherwise we'll be allocating a lot of unnecessary memory for
5703
    change records at each execution.
5704
  */
5705
  if (arg != new_item)
5706
    current_thd->change_item_tree(&arg, new_item);
5707
  return (this->*transformer)(args);
5708
}
5709
5710
5711
bool Item_insert_value::eq(const Item *item, bool binary_cmp) const
5712
{
5713
  return item->type() == INSERT_VALUE_ITEM &&
5714
    ((Item_default_value *)item)->arg->eq(arg, binary_cmp);
5715
}
5716
5717
77.1.15 by Monty Taylor
Bunch of warning cleanups.
5718
bool Item_insert_value::fix_fields(THD *thd,
5719
                                   Item **items __attribute__((__unused__)))
1 by brian
clean slate
5720
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5721
  assert(fixed == 0);
1 by brian
clean slate
5722
  /* We should only check that arg is in first table */
5723
  if (!arg->fixed)
5724
  {
5725
    bool res;
5726
    TABLE_LIST *orig_next_table= context->last_name_resolution_table;
5727
    context->last_name_resolution_table= context->first_name_resolution_table;
5728
    res= arg->fix_fields(thd, &arg);
5729
    context->last_name_resolution_table= orig_next_table;
5730
    if (res)
56 by brian
Next pass of true/false update.
5731
      return true;
1 by brian
clean slate
5732
  }
5733
5734
  if (arg->type() == REF_ITEM)
5735
  {
5736
    Item_ref *ref= (Item_ref *)arg;
5737
    if (ref->ref[0]->type() != FIELD_ITEM)
5738
    {
5739
      my_error(ER_BAD_FIELD_ERROR, MYF(0), "", "VALUES() function");
56 by brian
Next pass of true/false update.
5740
      return true;
1 by brian
clean slate
5741
    }
5742
    arg= ref->ref[0];
5743
  }
5744
  /*
5745
    According to our SQL grammar, VALUES() function can reference
5746
    only to a column.
5747
  */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5748
  assert(arg->type() == FIELD_ITEM);
1 by brian
clean slate
5749
5750
  Item_field *field_arg= (Item_field *)arg;
5751
5752
  if (field_arg->field->table->insert_values)
5753
  {
5754
    Field *def_field= (Field*) sql_alloc(field_arg->field->size_of());
5755
    if (!def_field)
56 by brian
Next pass of true/false update.
5756
      return true;
1 by brian
clean slate
5757
    memcpy(def_field, field_arg->field, field_arg->field->size_of());
5758
    def_field->move_field_offset((my_ptrdiff_t)
5759
                                 (def_field->table->insert_values -
5760
                                  def_field->table->record[0]));
5761
    set_field(def_field);
5762
  }
5763
  else
5764
  {
5765
    Field *tmp_field= field_arg->field;
5766
    /* charset doesn't matter here, it's to avoid sigsegv only */
5767
    tmp_field= new Field_null(0, 0, Field::NONE, field_arg->field->field_name,
5768
                          &my_charset_bin);
5769
    if (tmp_field)
5770
    {
5771
      tmp_field->init(field_arg->field->table);
5772
      set_field(tmp_field);
5773
    }
5774
  }
56 by brian
Next pass of true/false update.
5775
  return false;
1 by brian
clean slate
5776
}
5777
5778
void Item_insert_value::print(String *str, enum_query_type query_type)
5779
{
5780
  str->append(STRING_WITH_LEN("values("));
5781
  arg->print(str, query_type);
5782
  str->append(')');
5783
}
5784
5785
5786
Item_result item_cmp_type(Item_result a,Item_result b)
5787
{
5788
  if (a == STRING_RESULT && b == STRING_RESULT)
5789
    return STRING_RESULT;
5790
  if (a == INT_RESULT && b == INT_RESULT)
5791
    return INT_RESULT;
5792
  else if (a == ROW_RESULT || b == ROW_RESULT)
5793
    return ROW_RESULT;
5794
  if ((a == INT_RESULT || a == DECIMAL_RESULT) &&
5795
      (b == INT_RESULT || b == DECIMAL_RESULT))
5796
    return DECIMAL_RESULT;
5797
  return REAL_RESULT;
5798
}
5799
5800
5801
void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
5802
{
5803
  Item *item= *ref;
5804
  Item *new_item= NULL;
5805
  if (item->basic_const_item())
5806
    return;                                     // Can't be better
5807
  Item_result res_type=item_cmp_type(comp_item->result_type(),
5808
				     item->result_type());
5809
  char *name=item->name;			// Alloced by sql_alloc
5810
5811
  switch (res_type) {
5812
  case STRING_RESULT:
5813
  {
5814
    char buff[MAX_FIELD_WIDTH];
5815
    String tmp(buff,sizeof(buff),&my_charset_bin),*result;
5816
    result=item->val_str(&tmp);
5817
    if (item->null_value)
5818
      new_item= new Item_null(name);
5819
    else
5820
    {
5821
      uint length= result->length();
5822
      char *tmp_str= sql_strmake(result->ptr(), length);
5823
      new_item= new Item_string(name, tmp_str, length, result->charset());
5824
    }
5825
    break;
5826
  }
5827
  case INT_RESULT:
5828
  {
152 by Brian Aker
longlong replacement
5829
    int64_t result=item->val_int();
1 by brian
clean slate
5830
    uint length=item->max_length;
5831
    bool null_value=item->null_value;
5832
    new_item= (null_value ? (Item*) new Item_null(name) :
5833
               (Item*) new Item_int(name, result, length));
5834
    break;
5835
  }
5836
  case ROW_RESULT:
5837
  if (item->type() == Item::ROW_ITEM && comp_item->type() == Item::ROW_ITEM)
5838
  {
5839
    /*
5840
      Substitute constants only in Item_rows. Don't affect other Items
5841
      with ROW_RESULT (eg Item_singlerow_subselect).
5842
5843
      For such Items more optimal is to detect if it is constant and replace
5844
      it with Item_row. This would optimize queries like this:
5845
      SELECT * FROM t1 WHERE (a,b) = (SELECT a,b FROM t2 LIMIT 1);
5846
    */
5847
    Item_row *item_row= (Item_row*) item;
5848
    Item_row *comp_item_row= (Item_row*) comp_item;
5849
    uint col;
5850
    new_item= 0;
5851
    /*
5852
      If item and comp_item are both Item_rows and have same number of cols
5853
      then process items in Item_row one by one.
5854
      We can't ignore NULL values here as this item may be used with <=>, in
5855
      which case NULL's are significant.
5856
    */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5857
    assert(item->result_type() == comp_item->result_type());
5858
    assert(item_row->cols() == comp_item_row->cols());
1 by brian
clean slate
5859
    col= item_row->cols();
5860
    while (col-- > 0)
5861
      resolve_const_item(thd, item_row->addr(col),
5862
                         comp_item_row->element_index(col));
5863
    break;
5864
  }
5865
  /* Fallthrough */
5866
  case REAL_RESULT:
5867
  {						// It must REAL_RESULT
5868
    double result= item->val_real();
5869
    uint length=item->max_length,decimals=item->decimals;
5870
    bool null_value=item->null_value;
5871
    new_item= (null_value ? (Item*) new Item_null(name) : (Item*)
5872
               new Item_float(name, result, decimals, length));
5873
    break;
5874
  }
5875
  case DECIMAL_RESULT:
5876
  {
5877
    my_decimal decimal_value;
5878
    my_decimal *result= item->val_decimal(&decimal_value);
5879
    uint length= item->max_length, decimals= item->decimals;
5880
    bool null_value= item->null_value;
5881
    new_item= (null_value ?
5882
               (Item*) new Item_null(name) :
5883
               (Item*) new Item_decimal(name, result, length, decimals));
5884
    break;
5885
  }
5886
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5887
    assert(0);
1 by brian
clean slate
5888
  }
5889
  if (new_item)
5890
    thd->change_item_tree(ref, new_item);
5891
}
5892
5893
/**
5894
  Return true if the value stored in the field is equal to the const
5895
  item.
5896
5897
  We need to use this on the range optimizer because in some cases
5898
  we can't store the value in the field without some precision/character loss.
5899
*/
5900
5901
bool field_is_equal_to_item(Field *field,Item *item)
5902
{
5903
5904
  Item_result res_type=item_cmp_type(field->result_type(),
5905
				     item->result_type());
5906
  if (res_type == STRING_RESULT)
5907
  {
5908
    char item_buff[MAX_FIELD_WIDTH];
5909
    char field_buff[MAX_FIELD_WIDTH];
5910
    String item_tmp(item_buff,sizeof(item_buff),&my_charset_bin),*item_result;
5911
    String field_tmp(field_buff,sizeof(field_buff),&my_charset_bin);
5912
    item_result=item->val_str(&item_tmp);
5913
    if (item->null_value)
5914
      return 1;					// This must be true
5915
    field->val_str(&field_tmp);
5916
    return !stringcmp(&field_tmp,item_result);
5917
  }
5918
  if (res_type == INT_RESULT)
5919
    return 1;					// Both where of type int
5920
  if (res_type == DECIMAL_RESULT)
5921
  {
5922
    my_decimal item_buf, *item_val,
5923
               field_buf, *field_val;
5924
    item_val= item->val_decimal(&item_buf);
5925
    if (item->null_value)
5926
      return 1;					// This must be true
5927
    field_val= field->val_decimal(&field_buf);
5928
    return !my_decimal_cmp(item_val, field_val);
5929
  }
5930
  double result= item->val_real();
5931
  if (item->null_value)
5932
    return 1;
5933
  return result == field->val_real();
5934
}
5935
5936
Item_cache* Item_cache::get_cache(const Item *item)
5937
{
5938
  switch (item->result_type()) {
5939
  case INT_RESULT:
5940
    return new Item_cache_int();
5941
  case REAL_RESULT:
5942
    return new Item_cache_real();
5943
  case DECIMAL_RESULT:
5944
    return new Item_cache_decimal();
5945
  case STRING_RESULT:
5946
    return new Item_cache_str(item);
5947
  case ROW_RESULT:
5948
    return new Item_cache_row();
5949
  default:
5950
    // should never be in real life
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5951
    assert(0);
1 by brian
clean slate
5952
    return 0;
5953
  }
5954
}
5955
5956
5957
void Item_cache::print(String *str, enum_query_type query_type)
5958
{
5959
  str->append(STRING_WITH_LEN("<cache>("));
5960
  if (example)
5961
    example->print(str, query_type);
5962
  else
5963
    Item::print(str, query_type);
5964
  str->append(')');
5965
}
5966
5967
5968
void Item_cache_int::store(Item *item)
5969
{
5970
  value= item->val_int_result();
5971
  null_value= item->null_value;
5972
  unsigned_flag= item->unsigned_flag;
5973
}
5974
5975
152 by Brian Aker
longlong replacement
5976
void Item_cache_int::store(Item *item, int64_t val_arg)
1 by brian
clean slate
5977
{
5978
  value= val_arg;
5979
  null_value= item->null_value;
5980
  unsigned_flag= item->unsigned_flag;
5981
}
5982
5983
5984
String *Item_cache_int::val_str(String *str)
5985
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5986
  assert(fixed == 1);
1 by brian
clean slate
5987
  str->set(value, default_charset());
5988
  return str;
5989
}
5990
5991
5992
my_decimal *Item_cache_int::val_decimal(my_decimal *decimal_val)
5993
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
5994
  assert(fixed == 1);
1 by brian
clean slate
5995
  int2my_decimal(E_DEC_FATAL_ERROR, value, unsigned_flag, decimal_val);
5996
  return decimal_val;
5997
}
5998
5999
6000
void Item_cache_real::store(Item *item)
6001
{
6002
  value= item->val_result();
6003
  null_value= item->null_value;
6004
}
6005
6006
152 by Brian Aker
longlong replacement
6007
int64_t Item_cache_real::val_int()
1 by brian
clean slate
6008
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6009
  assert(fixed == 1);
152 by Brian Aker
longlong replacement
6010
  return (int64_t) rint(value);
1 by brian
clean slate
6011
}
6012
6013
6014
String* Item_cache_real::val_str(String *str)
6015
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6016
  assert(fixed == 1);
1 by brian
clean slate
6017
  str->set_real(value, decimals, default_charset());
6018
  return str;
6019
}
6020
6021
6022
my_decimal *Item_cache_real::val_decimal(my_decimal *decimal_val)
6023
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6024
  assert(fixed == 1);
1 by brian
clean slate
6025
  double2my_decimal(E_DEC_FATAL_ERROR, value, decimal_val);
6026
  return decimal_val;
6027
}
6028
6029
6030
void Item_cache_decimal::store(Item *item)
6031
{
6032
  my_decimal *val= item->val_decimal_result(&decimal_value);
6033
  if (!(null_value= item->null_value) && val != &decimal_value)
6034
    my_decimal2decimal(val, &decimal_value);
6035
}
6036
6037
double Item_cache_decimal::val_real()
6038
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6039
  assert(fixed);
1 by brian
clean slate
6040
  double res;
6041
  my_decimal2double(E_DEC_FATAL_ERROR, &decimal_value, &res);
6042
  return res;
6043
}
6044
152 by Brian Aker
longlong replacement
6045
int64_t Item_cache_decimal::val_int()
1 by brian
clean slate
6046
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6047
  assert(fixed);
152 by Brian Aker
longlong replacement
6048
  int64_t res;
1 by brian
clean slate
6049
  my_decimal2int(E_DEC_FATAL_ERROR, &decimal_value, unsigned_flag, &res);
6050
  return res;
6051
}
6052
6053
String* Item_cache_decimal::val_str(String *str)
6054
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6055
  assert(fixed);
56 by brian
Next pass of true/false update.
6056
  my_decimal_round(E_DEC_FATAL_ERROR, &decimal_value, decimals, false,
1 by brian
clean slate
6057
                   &decimal_value);
6058
  my_decimal2string(E_DEC_FATAL_ERROR, &decimal_value, 0, 0, 0, str);
6059
  return str;
6060
}
6061
77.1.15 by Monty Taylor
Bunch of warning cleanups.
6062
my_decimal *Item_cache_decimal::val_decimal(my_decimal *val __attribute__((__unused__)))
1 by brian
clean slate
6063
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6064
  assert(fixed);
1 by brian
clean slate
6065
  return &decimal_value;
6066
}
6067
6068
6069
void Item_cache_str::store(Item *item)
6070
{
6071
  value_buff.set(buffer, sizeof(buffer), item->collation.collation);
6072
  value= item->str_result(&value_buff);
6073
  if ((null_value= item->null_value))
6074
    value= 0;
6075
  else if (value != &value_buff)
6076
  {
6077
    /*
6078
      We copy string value to avoid changing value if 'item' is table field
6079
      in queries like following (where t1.c is varchar):
6080
      select a, 
6081
             (select a,b,c from t1 where t1.a=t2.a) = ROW(a,2,'a'),
6082
             (select c from t1 where a=t2.a)
6083
        from t2;
6084
    */
6085
    value_buff.copy(*value);
6086
    value= &value_buff;
6087
  }
6088
}
6089
6090
double Item_cache_str::val_real()
6091
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6092
  assert(fixed == 1);
1 by brian
clean slate
6093
  int err_not_used;
6094
  char *end_not_used;
6095
  if (value)
6096
    return my_strntod(value->charset(), (char*) value->ptr(),
6097
		      value->length(), &end_not_used, &err_not_used);
6098
  return (double) 0;
6099
}
6100
6101
152 by Brian Aker
longlong replacement
6102
int64_t Item_cache_str::val_int()
1 by brian
clean slate
6103
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6104
  assert(fixed == 1);
1 by brian
clean slate
6105
  int err;
6106
  if (value)
6107
    return my_strntoll(value->charset(), value->ptr(),
6108
		       value->length(), 10, (char**) 0, &err);
6109
  else
152 by Brian Aker
longlong replacement
6110
    return (int64_t)0;
1 by brian
clean slate
6111
}
6112
6113
my_decimal *Item_cache_str::val_decimal(my_decimal *decimal_val)
6114
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6115
  assert(fixed == 1);
1 by brian
clean slate
6116
  if (value)
6117
    string2my_decimal(E_DEC_FATAL_ERROR, value, decimal_val);
6118
  else
6119
    decimal_val= 0;
6120
  return decimal_val;
6121
}
6122
6123
6124
int Item_cache_str::save_in_field(Field *field, bool no_conversions)
6125
{
6126
  int res= Item_cache::save_in_field(field, no_conversions);
6127
  return (is_varbinary && field->type() == MYSQL_TYPE_STRING &&
6128
          value->length() < field->field_length) ? 1 : res;
6129
}
6130
6131
6132
bool Item_cache_row::allocate(uint num)
6133
{
6134
  item_count= num;
6135
  THD *thd= current_thd;
6136
  return (!(values= 
6137
	    (Item_cache **) thd->calloc(sizeof(Item_cache *)*item_count)));
6138
}
6139
6140
6141
bool Item_cache_row::setup(Item * item)
6142
{
6143
  example= item;
6144
  if (!values && allocate(item->cols()))
6145
    return 1;
6146
  for (uint i= 0; i < item_count; i++)
6147
  {
6148
    Item *el= item->element_index(i);
6149
    Item_cache *tmp;
6150
    if (!(tmp= values[i]= Item_cache::get_cache(el)))
6151
      return 1;
6152
    tmp->setup(el);
6153
  }
6154
  return 0;
6155
}
6156
6157
6158
void Item_cache_row::store(Item * item)
6159
{
6160
  null_value= 0;
6161
  item->bring_value();
6162
  for (uint i= 0; i < item_count; i++)
6163
  {
6164
    values[i]->store(item->element_index(i));
6165
    null_value|= values[i]->null_value;
6166
  }
6167
}
6168
6169
77.1.15 by Monty Taylor
Bunch of warning cleanups.
6170
void Item_cache_row::illegal_method_call(const char *method __attribute__((__unused__)))
1 by brian
clean slate
6171
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6172
  assert(0);
1 by brian
clean slate
6173
  my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6174
  return;
1 by brian
clean slate
6175
}
6176
6177
6178
bool Item_cache_row::check_cols(uint c)
6179
{
6180
  if (c != item_count)
6181
  {
6182
    my_error(ER_OPERAND_COLUMNS, MYF(0), c);
6183
    return 1;
6184
  }
6185
  return 0;
6186
}
6187
6188
6189
bool Item_cache_row::null_inside()
6190
{
6191
  for (uint i= 0; i < item_count; i++)
6192
  {
6193
    if (values[i]->cols() > 1)
6194
    {
6195
      if (values[i]->null_inside())
6196
	return 1;
6197
    }
6198
    else
6199
    {
6200
      values[i]->update_null_value();
6201
      if (values[i]->null_value)
6202
	return 1;
6203
    }
6204
  }
6205
  return 0;
6206
}
6207
6208
6209
void Item_cache_row::bring_value()
6210
{
6211
  for (uint i= 0; i < item_count; i++)
6212
    values[i]->bring_value();
6213
  return;
6214
}
6215
6216
6217
Item_type_holder::Item_type_holder(THD *thd, Item *item)
6218
  :Item(thd, item), enum_set_typelib(0), fld_type(get_real_type(item))
6219
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6220
  assert(item->fixed);
1 by brian
clean slate
6221
  maybe_null= item->maybe_null;
6222
  collation.set(item->collation);
6223
  get_full_info(item);
6224
  /* fix variable decimals which always is NOT_FIXED_DEC */
6225
  if (Field::result_merge_type(fld_type) == INT_RESULT)
6226
    decimals= 0;
6227
  prev_decimal_int_part= item->decimal_int_part();
6228
}
6229
6230
6231
/**
6232
  Return expression type of Item_type_holder.
6233
6234
  @return
6235
    Item_result (type of internal MySQL expression result)
6236
*/
6237
6238
Item_result Item_type_holder::result_type() const
6239
{
6240
  return Field::result_merge_type(fld_type);
6241
}
6242
6243
6244
/**
6245
  Find real field type of item.
6246
6247
  @return
6248
    type of field which should be created to store item value
6249
*/
6250
6251
enum_field_types Item_type_holder::get_real_type(Item *item)
6252
{
6253
  switch(item->type())
6254
  {
6255
  case FIELD_ITEM:
6256
  {
6257
    /*
6258
      Item_fields::field_type ask Field_type() but sometimes field return
6259
      a different type, like for enum/set, so we need to ask real type.
6260
    */
6261
    Field *field= ((Item_field *) item)->field;
6262
    enum_field_types type= field->real_type();
6263
    if (field->is_created_from_null_item)
6264
      return MYSQL_TYPE_NULL;
6265
    /* work around about varchar type field detection */
6266
    if (type == MYSQL_TYPE_STRING && field->type() == MYSQL_TYPE_VAR_STRING)
6267
      return MYSQL_TYPE_VAR_STRING;
6268
    return type;
6269
  }
6270
  case SUM_FUNC_ITEM:
6271
  {
6272
    /*
6273
      Argument of aggregate function sometimes should be asked about field
6274
      type
6275
    */
6276
    Item_sum *item_sum= (Item_sum *) item;
6277
    if (item_sum->keep_field_type())
6278
      return get_real_type(item_sum->args[0]);
6279
    break;
6280
  }
6281
  case FUNC_ITEM:
6282
    if (((Item_func *) item)->functype() == Item_func::GUSERVAR_FUNC)
6283
    {
6284
      /*
6285
        There are work around of problem with changing variable type on the
6286
        fly and variable always report "string" as field type to get
6287
        acceptable information for client in send_field, so we make field
6288
        type from expression type.
6289
      */
6290
      switch (item->result_type()) {
6291
      case STRING_RESULT:
6292
        return MYSQL_TYPE_VAR_STRING;
6293
      case INT_RESULT:
6294
        return MYSQL_TYPE_LONGLONG;
6295
      case REAL_RESULT:
6296
        return MYSQL_TYPE_DOUBLE;
6297
      case DECIMAL_RESULT:
6298
        return MYSQL_TYPE_NEWDECIMAL;
6299
      case ROW_RESULT:
6300
      default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6301
        assert(0);
1 by brian
clean slate
6302
        return MYSQL_TYPE_VAR_STRING;
6303
      }
6304
    }
6305
    break;
6306
  default:
6307
    break;
6308
  }
6309
  return item->field_type();
6310
}
6311
6312
/**
6313
  Find field type which can carry current Item_type_holder type and
6314
  type of given Item.
6315
6316
  @param thd     thread handler
6317
  @param item    given item to join its parameters with this item ones
6318
6319
  @retval
56 by brian
Next pass of true/false update.
6320
    true   error - types are incompatible
1 by brian
clean slate
6321
  @retval
56 by brian
Next pass of true/false update.
6322
    false  OK
1 by brian
clean slate
6323
*/
6324
77.1.15 by Monty Taylor
Bunch of warning cleanups.
6325
bool Item_type_holder::join_types(THD *thd __attribute__((__unused__)),
6326
                                  Item *item)
1 by brian
clean slate
6327
{
6328
  uint max_length_orig= max_length;
6329
  uint decimals_orig= decimals;
6330
  fld_type= Field::field_type_merge(fld_type, get_real_type(item));
6331
  {
6332
    int item_decimals= item->decimals;
6333
    /* fix variable decimals which always is NOT_FIXED_DEC */
6334
    if (Field::result_merge_type(fld_type) == INT_RESULT)
6335
      item_decimals= 0;
6336
    decimals= max(decimals, item_decimals);
6337
  }
6338
  if (Field::result_merge_type(fld_type) == DECIMAL_RESULT)
6339
  {
6340
    decimals= min(max(decimals, item->decimals), DECIMAL_MAX_SCALE);
6341
    int precision= min(max(prev_decimal_int_part, item->decimal_int_part())
6342
                       + decimals, DECIMAL_MAX_PRECISION);
6343
    unsigned_flag&= item->unsigned_flag;
6344
    max_length= my_decimal_precision_to_length(precision, decimals,
6345
                                               unsigned_flag);
6346
  }
6347
6348
  switch (Field::result_merge_type(fld_type))
6349
  {
6350
  case STRING_RESULT:
6351
  {
6352
    const char *old_cs, *old_derivation;
6353
    uint32 old_max_chars= max_length / collation.collation->mbmaxlen;
6354
    old_cs= collation.collation->name;
6355
    old_derivation= collation.derivation_name();
6356
    if (collation.aggregate(item->collation, MY_COLL_ALLOW_CONV))
6357
    {
6358
      my_error(ER_CANT_AGGREGATE_2COLLATIONS, MYF(0),
6359
	       old_cs, old_derivation,
6360
	       item->collation.collation->name,
6361
	       item->collation.derivation_name(),
6362
	       "UNION");
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6363
      return(true);
1 by brian
clean slate
6364
    }
6365
    /*
6366
      To figure out max_length, we have to take into account possible
6367
      expansion of the size of the values because of character set
6368
      conversions.
6369
     */
6370
    if (collation.collation != &my_charset_bin)
6371
    {
6372
      max_length= max(old_max_chars * collation.collation->mbmaxlen,
6373
                      display_length(item) /
6374
                      item->collation.collation->mbmaxlen *
6375
                      collation.collation->mbmaxlen);
6376
    }
6377
    else
6378
      set_if_bigger(max_length, display_length(item));
6379
    break;
6380
  }
6381
  case REAL_RESULT:
6382
  {
6383
    if (decimals != NOT_FIXED_DEC)
6384
    {
6385
      int delta1= max_length_orig - decimals_orig;
6386
      int delta2= item->max_length - item->decimals;
6387
      max_length= max(delta1, delta2) + decimals;
6388
      if (fld_type == MYSQL_TYPE_FLOAT && max_length > FLT_DIG + 2) 
6389
      {
6390
        max_length= FLT_DIG + 6;
6391
        decimals= NOT_FIXED_DEC;
6392
      } 
6393
      if (fld_type == MYSQL_TYPE_DOUBLE && max_length > DBL_DIG + 2) 
6394
      {
6395
        max_length= DBL_DIG + 7;
6396
        decimals= NOT_FIXED_DEC;
6397
      }
6398
    }
6399
    else
6400
      max_length= (fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7;
6401
    break;
6402
  }
6403
  default:
6404
    max_length= max(max_length, display_length(item));
6405
  };
6406
  maybe_null|= item->maybe_null;
6407
  get_full_info(item);
6408
6409
  /* Remember decimal integer part to be used in DECIMAL_RESULT handleng */
6410
  prev_decimal_int_part= decimal_int_part();
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6411
  return(false);
1 by brian
clean slate
6412
}
6413
6414
/**
6415
  Calculate lenth for merging result for given Item type.
6416
6417
  @param item  Item for length detection
6418
6419
  @return
6420
    length
6421
*/
6422
6423
uint32 Item_type_holder::display_length(Item *item)
6424
{
6425
  if (item->type() == Item::FIELD_ITEM)
6426
    return ((Item_field *)item)->max_disp_length();
6427
6428
  switch (item->field_type())
6429
  {
6430
  case MYSQL_TYPE_TIMESTAMP:
6431
  case MYSQL_TYPE_TIME:
6432
  case MYSQL_TYPE_DATETIME:
6433
  case MYSQL_TYPE_YEAR:
6434
  case MYSQL_TYPE_NEWDATE:
6435
  case MYSQL_TYPE_VARCHAR:
6436
  case MYSQL_TYPE_NEWDECIMAL:
6437
  case MYSQL_TYPE_ENUM:
6438
  case MYSQL_TYPE_SET:
6439
  case MYSQL_TYPE_BLOB:
6440
  case MYSQL_TYPE_VAR_STRING:
6441
  case MYSQL_TYPE_STRING:
6442
  case MYSQL_TYPE_TINY:
6443
    return 4;
6444
  case MYSQL_TYPE_SHORT:
6445
    return 6;
6446
  case MYSQL_TYPE_LONG:
6447
    return MY_INT32_NUM_DECIMAL_DIGITS;
6448
  case MYSQL_TYPE_FLOAT:
6449
    return 25;
6450
  case MYSQL_TYPE_DOUBLE:
6451
    return 53;
6452
  case MYSQL_TYPE_NULL:
6453
    return 0;
6454
  case MYSQL_TYPE_LONGLONG:
6455
    return 20;
6456
  default:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6457
    assert(0); // we should never go there
1 by brian
clean slate
6458
    return 0;
6459
  }
6460
}
6461
6462
6463
/**
6464
  Make temporary table field according collected information about type
6465
  of UNION result.
6466
6467
  @param table  temporary table for which we create fields
6468
6469
  @return
6470
    created field
6471
*/
6472
6473
Field *Item_type_holder::make_field_by_type(TABLE *table)
6474
{
6475
  /*
6476
    The field functions defines a field to be not null if null_ptr is not 0
6477
  */
6478
  uchar *null_ptr= maybe_null ? (uchar*) "" : 0;
6479
  Field *field;
6480
6481
  switch (fld_type) {
6482
  case MYSQL_TYPE_ENUM:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6483
    assert(enum_set_typelib);
1 by brian
clean slate
6484
    field= new Field_enum((uchar *) 0, max_length, null_ptr, 0,
6485
                          Field::NONE, name,
6486
                          get_enum_pack_length(enum_set_typelib->count),
6487
                          enum_set_typelib, collation.collation);
6488
    if (field)
6489
      field->init(table);
6490
    return field;
6491
  case MYSQL_TYPE_SET:
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6492
    assert(enum_set_typelib);
1 by brian
clean slate
6493
    field= new Field_set((uchar *) 0, max_length, null_ptr, 0,
6494
                         Field::NONE, name,
6495
                         get_set_pack_length(enum_set_typelib->count),
6496
                         enum_set_typelib, collation.collation);
6497
    if (field)
6498
      field->init(table);
6499
    return field;
6500
  case MYSQL_TYPE_NULL:
6501
    return make_string_field(table);
6502
  default:
6503
    break;
6504
  }
6505
  return tmp_table_field_from_field_type(table, 0);
6506
}
6507
6508
6509
/**
6510
  Get full information from Item about enum/set fields to be able to create
6511
  them later.
6512
6513
  @param item    Item for information collection
6514
*/
6515
void Item_type_holder::get_full_info(Item *item)
6516
{
6517
  if (fld_type == MYSQL_TYPE_ENUM ||
6518
      fld_type == MYSQL_TYPE_SET)
6519
  {
6520
    if (item->type() == Item::SUM_FUNC_ITEM &&
6521
        (((Item_sum*)item)->sum_func() == Item_sum::MAX_FUNC ||
6522
         ((Item_sum*)item)->sum_func() == Item_sum::MIN_FUNC))
6523
      item = ((Item_sum*)item)->args[0];
6524
    /*
6525
      We can have enum/set type after merging only if we have one enum|set
6526
      field (or MIN|MAX(enum|set field)) and number of NULL fields
6527
    */
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6528
    assert((enum_set_typelib &&
1 by brian
clean slate
6529
                 get_real_type(item) == MYSQL_TYPE_NULL) ||
6530
                (!enum_set_typelib &&
6531
                 item->type() == Item::FIELD_ITEM &&
6532
                 (get_real_type(item) == MYSQL_TYPE_ENUM ||
6533
                  get_real_type(item) == MYSQL_TYPE_SET) &&
6534
                 ((Field_enum*)((Item_field *) item)->field)->typelib));
6535
    if (!enum_set_typelib)
6536
    {
6537
      enum_set_typelib= ((Field_enum*)((Item_field *) item)->field)->typelib;
6538
    }
6539
  }
6540
}
6541
6542
6543
double Item_type_holder::val_real()
6544
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6545
  assert(0); // should never be called
1 by brian
clean slate
6546
  return 0.0;
6547
}
6548
6549
152 by Brian Aker
longlong replacement
6550
int64_t Item_type_holder::val_int()
1 by brian
clean slate
6551
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6552
  assert(0); // should never be called
1 by brian
clean slate
6553
  return 0;
6554
}
6555
6556
my_decimal *Item_type_holder::val_decimal(my_decimal *)
6557
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6558
  assert(0); // should never be called
1 by brian
clean slate
6559
  return 0;
6560
}
6561
6562
String *Item_type_holder::val_str(String*)
6563
{
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6564
  assert(0); // should never be called
1 by brian
clean slate
6565
  return 0;
6566
}
6567
6568
void Item_result_field::cleanup()
6569
{
6570
  Item::cleanup();
6571
  result_field= 0;
51.1.55 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE - 1st clean pass on item.h/cc
6572
  return;
1 by brian
clean slate
6573
}
6574
6575
/**
6576
  Dummy error processor used by default by Name_resolution_context.
6577
6578
  @note
6579
    do nothing
6580
*/
6581
77.1.15 by Monty Taylor
Bunch of warning cleanups.
6582
void dummy_error_processor(THD *thd __attribute__((__unused__)),
6583
                           void *data __attribute__((__unused__)))
1 by brian
clean slate
6584
{}
6585
6586
/**
6587
  Wrapper of hide_view_error call for Name_resolution_context error
6588
  processor.
6589
6590
  @note
6591
    hide view underlying tables details in error messages
6592
*/
6593
6594
/*****************************************************************************
6595
** Instantiate templates
6596
*****************************************************************************/
6597
6598
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
6599
template class List<Item>;
6600
template class List_iterator<Item>;
6601
template class List_iterator_fast<Item>;
6602
template class List_iterator_fast<Item_field>;
6603
template class List<List_item>;
6604
#endif