item_func.h 41.8 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000-2006 MySQL AB
2

unknown's avatar
unknown committed
3 4
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
unknown's avatar
unknown committed
5
   the Free Software Foundation; version 2 of the License.
6

unknown's avatar
unknown committed
7 8 9 10
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
11

unknown's avatar
unknown committed
12 13 14 15 16 17 18
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


/* Function items used by mysql */

19
#ifdef USE_PRAGMA_INTERFACE
unknown's avatar
unknown committed
20 21 22 23 24 25 26 27 28 29 30 31 32
#pragma interface			/* gcc class implementation */
#endif

#ifdef HAVE_IEEEFP_H
extern "C"				/* Bug in BSDI include file */
{
#include <ieeefp.h>
}
#endif

class Item_func :public Item_result_field
{
protected:
33
  Item **args, *tmp_arg[2];
34 35 36 37
  /*
    Allowed numbers of columns in result (usually 1, which means scalar value)
    0 means get this number from first argument
  */
unknown's avatar
unknown committed
38
  uint allowed_arg_cols;
unknown's avatar
unknown committed
39 40
public:
  uint arg_count;
41
  table_map used_tables_cache, not_null_tables_cache;
unknown's avatar
unknown committed
42 43 44
  bool const_item_cache;
  enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
		  GE_FUNC,GT_FUNC,FT_FUNC,
45
		  LIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
46 47
		  COND_AND_FUNC, COND_OR_FUNC, COND_XOR_FUNC,
                  BETWEEN, IN_FUNC, MULT_EQUAL_FUNC,
48
		  INTERVAL_FUNC, ISNOTNULLTEST_FUNC,
unknown's avatar
unknown committed
49 50 51 52
		  SP_EQUALS_FUNC, SP_DISJOINT_FUNC,SP_INTERSECTS_FUNC,
		  SP_TOUCHES_FUNC,SP_CROSSES_FUNC,SP_WITHIN_FUNC,
		  SP_CONTAINS_FUNC,SP_OVERLAPS_FUNC,
		  SP_STARTPOINT,SP_ENDPOINT,SP_EXTERIORRING,
53
		  SP_POINTN,SP_GEOMETRYN,SP_INTERIORRINGN,
unknown's avatar
unknown committed
54 55
                  NOT_FUNC, NOT_ALL_FUNC,
                  NOW_FUNC, TRIG_COND_FUNC,
56
                  SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC,
57
                  EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC };
58 59
  enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL,
                       OPTIMIZE_EQUAL };
unknown's avatar
unknown committed
60 61
  enum Type type() const { return FUNC_ITEM; }
  virtual enum Functype functype() const   { return UNKNOWN_FUNC; }
unknown's avatar
unknown committed
62 63
  Item_func(void):
    allowed_arg_cols(1), arg_count(0)
unknown's avatar
unknown committed
64
  {
65
    with_sum_func= 0;
unknown's avatar
unknown committed
66
  }
unknown's avatar
unknown committed
67 68
  Item_func(Item *a):
    allowed_arg_cols(1), arg_count(1)
unknown's avatar
unknown committed
69
  {
70
    args= tmp_arg;
71 72
    args[0]= a;
    with_sum_func= a->with_sum_func;
unknown's avatar
unknown committed
73
  }
unknown's avatar
unknown committed
74 75
  Item_func(Item *a,Item *b):
    allowed_arg_cols(1), arg_count(2)
unknown's avatar
unknown committed
76
  {
77
    args= tmp_arg;
78 79
    args[0]= a; args[1]= b;
    with_sum_func= a->with_sum_func || b->with_sum_func;
unknown's avatar
unknown committed
80
  }
unknown's avatar
unknown committed
81 82
  Item_func(Item *a,Item *b,Item *c):
    allowed_arg_cols(1)
unknown's avatar
unknown committed
83
  {
84 85
    arg_count= 0;
    if ((args= (Item**) sql_alloc(sizeof(Item*)*3)))
unknown's avatar
unknown committed
86
    {
87 88 89
      arg_count= 3;
      args[0]= a; args[1]= b; args[2]= c;
      with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func;
unknown's avatar
unknown committed
90 91
    }
  }
unknown's avatar
unknown committed
92 93
  Item_func(Item *a,Item *b,Item *c,Item *d):
    allowed_arg_cols(1)
unknown's avatar
unknown committed
94
  {
95 96
    arg_count= 0;
    if ((args= (Item**) sql_alloc(sizeof(Item*)*4)))
unknown's avatar
unknown committed
97
    {
98 99 100 101
      arg_count= 4;
      args[0]= a; args[1]= b; args[2]= c; args[3]= d;
      with_sum_func= a->with_sum_func || b->with_sum_func ||
	c->with_sum_func || d->with_sum_func;
unknown's avatar
unknown committed
102 103
    }
  }
unknown's avatar
unknown committed
104 105
  Item_func(Item *a,Item *b,Item *c,Item *d,Item* e):
    allowed_arg_cols(1)
unknown's avatar
unknown committed
106
  {
107 108
    arg_count= 5;
    if ((args= (Item**) sql_alloc(sizeof(Item*)*5)))
unknown's avatar
unknown committed
109
    {
110 111 112
      args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e;
      with_sum_func= a->with_sum_func || b->with_sum_func ||
	c->with_sum_func || d->with_sum_func || e->with_sum_func ;
unknown's avatar
unknown committed
113 114 115
    }
  }
  Item_func(List<Item> &list);
116
  // Constructor used for Item_cond_and/or (see Item comment)
117
  Item_func(THD *thd, Item_func *item);
118
  bool fix_fields(THD *, Item **ref);
unknown's avatar
unknown committed
119
  table_map used_tables() const;
120
  table_map not_null_tables() const;
unknown's avatar
unknown committed
121
  void update_used_tables();
122
  bool eq(const Item *item, bool binary_cmp) const;
unknown's avatar
unknown committed
123 124 125
  virtual optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  virtual bool have_rev_func() const { return 0; }
  virtual Item *key_item() const { return args[0]; }
126 127 128 129 130 131 132 133 134 135 136
  /*
    This method is used for debug purposes to print the name of an
    item to the debug log. The second use of this method is as
    a helper function of print(), where it is applicable.
    To suit both goals it should return a meaningful,
    distinguishable and sintactically correct string.  This method
    should not be used for runtime type identification, use enum
    {Sum}Functype and Item_func::functype()/Item_sum::sum_func()
    instead.
  */
  virtual const char *func_name() const= 0;
unknown's avatar
unknown committed
137 138
  virtual bool const_item() const { return const_item_cache; }
  inline Item **arguments() const { return args; }
139
  void set_arguments(List<Item> &list);
unknown's avatar
unknown committed
140 141
  inline uint argument_count() const { return arg_count; }
  inline void remove_arguments() { arg_count=0; }
142
  void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
unknown's avatar
unknown committed
143 144
  void print(String *str);
  void print_op(String *str);
unknown's avatar
unknown committed
145
  void print_args(String *str, uint from);
unknown's avatar
unknown committed
146 147 148 149
  virtual void fix_num_length_and_dec();
  void count_only_length();
  void count_real_length();
  void count_decimal_length();
150
  inline bool get_arg0_date(TIME *ltime, uint fuzzy_date)
unknown's avatar
unknown committed
151
  {
152
    return (null_value=args[0]->get_date(ltime, fuzzy_date));
unknown's avatar
unknown committed
153 154 155 156 157
  }
  inline bool get_arg0_time(TIME *ltime)
  {
    return (null_value=args[0]->get_time(ltime));
  }
158
  bool is_null() { 
159
    update_null_value();
160 161
    return null_value; 
  }
unknown's avatar
unknown committed
162
  void signal_divide_by_null();
unknown's avatar
unknown committed
163
  friend class udf_handler;
164
  Field *tmp_table_field() { return result_field; }
165
  Field *tmp_table_field(TABLE *t_arg);
166
  Item *get_tmp_table_item(THD *thd);
unknown's avatar
unknown committed
167 168 169

  my_decimal *val_decimal(my_decimal *);

170
  bool agg_arg_collations(DTCollation &c, Item **items, uint nitems,
171
                          uint flags)
172
  {
173
    return agg_item_collations(c, func_name(), items, nitems, flags, 1);
174
  }
175 176
  bool agg_arg_collations_for_comparison(DTCollation &c,
                                         Item **items, uint nitems,
177
                                         uint flags)
178 179 180 181
  {
    return agg_item_collations_for_comparison(c, func_name(),
                                              items, nitems, flags);
  }
unknown's avatar
unknown committed
182
  bool agg_arg_charsets(DTCollation &c, Item **items, uint nitems,
183
                        uint flags, int item_sep)
184
  {
185
    return agg_item_charsets(c, func_name(), items, nitems, flags, item_sep);
186
  }
187
  bool walk(Item_processor processor, bool walk_subquery, byte *arg);
unknown's avatar
unknown committed
188
  Item *transform(Item_transformer transformer, byte *arg);
189 190
  Item* compile(Item_analyzer analyzer, byte **arg_p,
                Item_transformer transformer, byte *arg_t);
191 192
  void traverse_cond(Cond_traverser traverser,
                     void * arg, traverse_order order);
193 194
  bool is_expensive_processor(byte *arg);
  virtual bool is_expensive() { return 0; }
unknown's avatar
unknown committed
195 196 197 198 199 200 201 202 203 204 205
};


class Item_real_func :public Item_func
{
public:
  Item_real_func() :Item_func() {}
  Item_real_func(Item *a) :Item_func(a) {}
  Item_real_func(Item *a,Item *b) :Item_func(a,b) {}
  Item_real_func(List<Item> &list) :Item_func(list) {}
  String *val_str(String*str);
206
  my_decimal *val_decimal(my_decimal *decimal_value);
207
  longlong val_int()
208
    { DBUG_ASSERT(fixed == 1); return (longlong) rint(val_real()); }
unknown's avatar
unknown committed
209
  enum Item_result result_type () const { return REAL_RESULT; }
unknown's avatar
unknown committed
210 211
  void fix_length_and_dec()
  { decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
unknown's avatar
unknown committed
212 213
};

214

unknown's avatar
unknown committed
215
class Item_func_numhybrid: public Item_func
unknown's avatar
unknown committed
216
{
unknown's avatar
unknown committed
217
protected:
unknown's avatar
unknown committed
218 219
  Item_result hybrid_type;
public:
unknown's avatar
unknown committed
220
  Item_func_numhybrid(Item *a) :Item_func(a), hybrid_type(REAL_RESULT)
unknown's avatar
unknown committed
221 222
  {}
  Item_func_numhybrid(Item *a,Item *b)
unknown's avatar
unknown committed
223
    :Item_func(a,b), hybrid_type(REAL_RESULT)
unknown's avatar
unknown committed
224
  {}
unknown's avatar
unknown committed
225
  Item_func_numhybrid(List<Item> &list)
unknown's avatar
unknown committed
226
    :Item_func(list), hybrid_type(REAL_RESULT)
unknown's avatar
unknown committed
227
  {}
unknown's avatar
unknown committed
228

unknown's avatar
unknown committed
229
  enum Item_result result_type () const { return hybrid_type; }
unknown's avatar
unknown committed
230 231 232 233 234 235 236 237 238 239 240 241
  void fix_length_and_dec();
  void fix_num_length_and_dec();
  virtual void find_num_type()= 0; /* To be called from fix_length_and_dec */

  double val_real();
  longlong val_int();
  my_decimal *val_decimal(my_decimal *);
  String *val_str(String*str);

  virtual longlong int_op()= 0;
  virtual double real_op()= 0;
  virtual my_decimal *decimal_op(my_decimal *)= 0;
unknown's avatar
unknown committed
242
  virtual String *str_op(String *)= 0;
243
  bool is_null() { update_null_value(); return null_value; }
unknown's avatar
unknown committed
244 245
};

unknown's avatar
unknown committed
246 247 248 249 250 251
/* function where type of result detected by first argument */
class Item_func_num1: public Item_func_numhybrid
{
public:
  Item_func_num1(Item *a) :Item_func_numhybrid(a) {}
  Item_func_num1(Item *a, Item *b) :Item_func_numhybrid(a, b) {}
unknown's avatar
unknown committed
252

unknown's avatar
unknown committed
253 254
  void fix_num_length_and_dec();
  void find_num_type();
unknown's avatar
unknown committed
255
  String *str_op(String *str) { DBUG_ASSERT(0); return 0; }
unknown's avatar
unknown committed
256
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
257
};
unknown's avatar
unknown committed
258

unknown's avatar
unknown committed
259 260 261

/* Base class for operations like '+', '-', '*' */
class Item_num_op :public Item_func_numhybrid
unknown's avatar
unknown committed
262 263
{
 public:
unknown's avatar
unknown committed
264 265
  Item_num_op(Item *a,Item *b) :Item_func_numhybrid(a, b) {}
  virtual void result_precision()= 0;
unknown's avatar
unknown committed
266
  void print(String *str) { print_op(str); }
unknown's avatar
unknown committed
267
  void find_num_type();
unknown's avatar
unknown committed
268
  String *str_op(String *str) { DBUG_ASSERT(0); return 0; }
unknown's avatar
unknown committed
269
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
270 271 272 273 274 275
};


class Item_int_func :public Item_func
{
public:
unknown's avatar
unknown committed
276 277 278 279 280 281
  Item_int_func() :Item_func() { max_length= 21; }
  Item_int_func(Item *a) :Item_func(a) { max_length= 21; }
  Item_int_func(Item *a,Item *b) :Item_func(a,b) { max_length= 21; }
  Item_int_func(Item *a,Item *b,Item *c) :Item_func(a,b,c)
  { max_length= 21; }
  Item_int_func(List<Item> &list) :Item_func(list) { max_length= 21; }
282
  Item_int_func(THD *thd, Item_int_func *item) :Item_func(thd, item) {}
283
  double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
unknown's avatar
unknown committed
284 285
  String *val_str(String*str);
  enum Item_result result_type () const { return INT_RESULT; }
unknown's avatar
unknown committed
286
  void fix_length_and_dec() {}
unknown's avatar
unknown committed
287 288
};

289

290 291 292 293 294
class Item_func_connection_id :public Item_int_func
{
  longlong value;

public:
295
  Item_func_connection_id() {}
296 297 298 299 300 301 302
  const char *func_name() const { return "connection_id"; }
  void fix_length_and_dec();
  bool fix_fields(THD *thd, Item **ref);
  longlong val_int() { DBUG_ASSERT(fixed == 1); return value; }
};


303 304 305 306
class Item_func_signed :public Item_int_func
{
public:
  Item_func_signed(Item *a) :Item_int_func(a) {}
307
  const char *func_name() const { return "cast_as_signed"; }
308
  double val_real()
unknown's avatar
unknown committed
309
  {
310
    double tmp= args[0]->val_real();
unknown's avatar
unknown committed
311 312 313
    null_value= args[0]->null_value;
    return tmp;
  }
314 315
  longlong val_int();
  longlong val_int_from_str(int *error);
316
  void fix_length_and_dec()
unknown's avatar
unknown committed
317
  { max_length=args[0]->max_length; unsigned_flag=0; }
318
  void print(String *str);
unknown's avatar
unknown committed
319
  uint decimal_precision() const { return args[0]->decimal_precision(); }
unknown's avatar
unknown committed
320
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
321 322
};

323

unknown's avatar
unknown committed
324
class Item_func_unsigned :public Item_func_signed
325 326
{
public:
unknown's avatar
unknown committed
327
  Item_func_unsigned(Item *a) :Item_func_signed(a) {}
328
  const char *func_name() const { return "cast_as_unsigned"; }
329
  void fix_length_and_dec()
unknown's avatar
unknown committed
330
  { max_length=args[0]->max_length; unsigned_flag=1; }
331
  longlong val_int();
332
  void print(String *str);
333 334 335
};


unknown's avatar
unknown committed
336
class Item_decimal_typecast :public Item_func
unknown's avatar
unknown committed
337
{
unknown's avatar
unknown committed
338
  my_decimal decimal_value;
unknown's avatar
unknown committed
339
public:
unknown's avatar
unknown committed
340 341 342 343 344 345
  Item_decimal_typecast(Item *a, int len, int dec) :Item_func(a)
  {
    max_length= len + 2;
    decimals= dec;
  }
  String *val_str(String *str);
346
  double val_real();
unknown's avatar
unknown committed
347
  longlong val_int();
unknown's avatar
unknown committed
348 349
  my_decimal *val_decimal(my_decimal*);
  enum Item_result result_type () const { return DECIMAL_RESULT; }
unknown's avatar
unknown committed
350
  enum_field_types field_type() const { return MYSQL_TYPE_NEWDECIMAL; }
unknown's avatar
unknown committed
351
  void fix_length_and_dec() {};
352 353
  const char *func_name() const { return "decimal_typecast"; }
  void print(String *);
unknown's avatar
unknown committed
354
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
};


class Item_func_additive_op :public Item_num_op
{
public:
  Item_func_additive_op(Item *a,Item *b) :Item_num_op(a,b) {}
  void result_precision();
};


class Item_func_plus :public Item_func_additive_op
{
public:
  Item_func_plus(Item *a,Item *b) :Item_func_additive_op(a,b) {}
  const char *func_name() const { return "+"; }
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
374 375
};

unknown's avatar
unknown committed
376
class Item_func_minus :public Item_func_additive_op
unknown's avatar
unknown committed
377 378
{
public:
unknown's avatar
unknown committed
379
  Item_func_minus(Item *a,Item *b) :Item_func_additive_op(a,b) {}
unknown's avatar
unknown committed
380
  const char *func_name() const { return "-"; }
unknown's avatar
unknown committed
381 382 383
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
384
  void fix_length_and_dec();
unknown's avatar
unknown committed
385 386
};

387

unknown's avatar
unknown committed
388 389 390 391 392
class Item_func_mul :public Item_num_op
{
public:
  Item_func_mul(Item *a,Item *b) :Item_num_op(a,b) {}
  const char *func_name() const { return "*"; }
unknown's avatar
unknown committed
393 394 395 396
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
  void result_precision();
unknown's avatar
unknown committed
397 398 399 400 401 402
};


class Item_func_div :public Item_num_op
{
public:
unknown's avatar
unknown committed
403
  uint prec_increment;
unknown's avatar
unknown committed
404
  Item_func_div(Item *a,Item *b) :Item_num_op(a,b) {}
405
  longlong int_op() { DBUG_ASSERT(0); return 0; }
unknown's avatar
unknown committed
406 407
  double real_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
408 409
  const char *func_name() const { return "/"; }
  void fix_length_and_dec();
unknown's avatar
unknown committed
410
  void result_precision();
unknown's avatar
unknown committed
411 412 413
};


414
class Item_func_int_div :public Item_int_func
415 416
{
public:
417
  Item_func_int_div(Item *a,Item *b) :Item_int_func(a,b)
unknown's avatar
unknown committed
418
  {}
419 420 421
  longlong val_int();
  const char *func_name() const { return "DIV"; }
  void fix_length_and_dec();
unknown's avatar
unknown committed
422
  void print(String *str) { print_op(str); }
unknown's avatar
unknown committed
423
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
424 425 426
};


unknown's avatar
unknown committed
427 428 429 430
class Item_func_mod :public Item_num_op
{
public:
  Item_func_mod(Item *a,Item *b) :Item_num_op(a,b) {}
unknown's avatar
unknown committed
431 432 433
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
434
  const char *func_name() const { return "%"; }
unknown's avatar
unknown committed
435
  void result_precision();
unknown's avatar
unknown committed
436
  void fix_length_and_dec();
unknown's avatar
unknown committed
437 438 439
};


440
class Item_func_neg :public Item_func_num1
unknown's avatar
unknown committed
441 442
{
public:
443
  Item_func_neg(Item *a) :Item_func_num1(a) {}
unknown's avatar
unknown committed
444 445 446
  double real_op();
  longlong int_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
447
  const char *func_name() const { return "-"; }
448
  void fix_length_and_dec();
unknown's avatar
unknown committed
449
  void fix_num_length_and_dec();
unknown's avatar
unknown committed
450
  uint decimal_precision() const { return args[0]->decimal_precision(); }
unknown's avatar
unknown committed
451 452 453
};


unknown's avatar
unknown committed
454
class Item_func_abs :public Item_func_num1
unknown's avatar
unknown committed
455 456
{
public:
unknown's avatar
unknown committed
457 458 459 460
  Item_func_abs(Item *a) :Item_func_num1(a) {}
  double real_op();
  longlong int_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
461 462 463 464
  const char *func_name() const { return "abs"; }
  void fix_length_and_dec();
};

unknown's avatar
unknown committed
465
// A class to handle logarithmic and trigonometric functions
unknown's avatar
unknown committed
466 467 468 469 470 471 472 473

class Item_dec_func :public Item_real_func
{
 public:
  Item_dec_func(Item *a) :Item_real_func(a) {}
  Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
  void fix_length_and_dec()
  {
474
    decimals=NOT_FIXED_DEC; max_length=float_length(decimals);
unknown's avatar
unknown committed
475 476 477 478 479 480 481
    maybe_null=1;
  }
  inline double fix_result(double value)
  {
#ifndef HAVE_FINITE
    return value;
#else
482
    /* The following should be safe, even if we compare doubles */
unknown's avatar
unknown committed
483 484 485 486 487 488 489 490 491 492 493 494
    if (finite(value) && value != POSTFIX_ERROR)
      return value;
    null_value=1;
    return 0.0;
#endif
  }
};

class Item_func_exp :public Item_dec_func
{
public:
  Item_func_exp(Item *a) :Item_dec_func(a) {}
495
  double val_real();
unknown's avatar
unknown committed
496
  const char *func_name() const { return "exp"; }
unknown's avatar
unknown committed
497
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
498 499
};

500 501 502 503 504

class Item_func_ln :public Item_dec_func
{
public:
  Item_func_ln(Item *a) :Item_dec_func(a) {}
505
  double val_real();
506
  const char *func_name() const { return "ln"; }
unknown's avatar
unknown committed
507
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
508 509 510
};


unknown's avatar
unknown committed
511 512 513 514
class Item_func_log :public Item_dec_func
{
public:
  Item_func_log(Item *a) :Item_dec_func(a) {}
515
  Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {}
516
  double val_real();
unknown's avatar
unknown committed
517
  const char *func_name() const { return "log"; }
unknown's avatar
unknown committed
518
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
519 520 521
};


522 523 524 525
class Item_func_log2 :public Item_dec_func
{
public:
  Item_func_log2(Item *a) :Item_dec_func(a) {}
526
  double val_real();
527
  const char *func_name() const { return "log2"; }
unknown's avatar
unknown committed
528
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
529 530 531
};


unknown's avatar
unknown committed
532 533 534 535
class Item_func_log10 :public Item_dec_func
{
public:
  Item_func_log10(Item *a) :Item_dec_func(a) {}
536
  double val_real();
unknown's avatar
unknown committed
537
  const char *func_name() const { return "log10"; }
unknown's avatar
unknown committed
538
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
539 540 541 542 543 544 545
};


class Item_func_sqrt :public Item_dec_func
{
public:
  Item_func_sqrt(Item *a) :Item_dec_func(a) {}
546
  double val_real();
unknown's avatar
unknown committed
547
  const char *func_name() const { return "sqrt"; }
unknown's avatar
unknown committed
548
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
549 550 551 552 553 554 555
};


class Item_func_pow :public Item_dec_func
{
public:
  Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
556
  double val_real();
unknown's avatar
unknown committed
557
  const char *func_name() const { return "pow"; }
unknown's avatar
unknown committed
558
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
559 560 561 562 563
};


class Item_func_acos :public Item_dec_func
{
564
public:
unknown's avatar
unknown committed
565
  Item_func_acos(Item *a) :Item_dec_func(a) {}
566
  double val_real();
unknown's avatar
unknown committed
567
  const char *func_name() const { return "acos"; }
unknown's avatar
unknown committed
568
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
569 570 571 572
};

class Item_func_asin :public Item_dec_func
{
573
public:
unknown's avatar
unknown committed
574
  Item_func_asin(Item *a) :Item_dec_func(a) {}
575
  double val_real();
unknown's avatar
unknown committed
576
  const char *func_name() const { return "asin"; }
unknown's avatar
unknown committed
577
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
578 579 580 581
};

class Item_func_atan :public Item_dec_func
{
582
public:
unknown's avatar
unknown committed
583 584
  Item_func_atan(Item *a) :Item_dec_func(a) {}
  Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
585
  double val_real();
unknown's avatar
unknown committed
586
  const char *func_name() const { return "atan"; }
unknown's avatar
unknown committed
587
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
588 589 590 591
};

class Item_func_cos :public Item_dec_func
{
592
public:
unknown's avatar
unknown committed
593
  Item_func_cos(Item *a) :Item_dec_func(a) {}
594
  double val_real();
unknown's avatar
unknown committed
595
  const char *func_name() const { return "cos"; }
unknown's avatar
unknown committed
596
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
597 598 599 600
};

class Item_func_sin :public Item_dec_func
{
601
public:
unknown's avatar
unknown committed
602
  Item_func_sin(Item *a) :Item_dec_func(a) {}
603
  double val_real();
unknown's avatar
unknown committed
604
  const char *func_name() const { return "sin"; }
unknown's avatar
unknown committed
605
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
606 607 608 609
};

class Item_func_tan :public Item_dec_func
{
610
public:
unknown's avatar
unknown committed
611
  Item_func_tan(Item *a) :Item_dec_func(a) {}
612
  double val_real();
unknown's avatar
unknown committed
613
  const char *func_name() const { return "tan"; }
unknown's avatar
unknown committed
614
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
615 616 617 618 619 620 621 622 623 624
};

class Item_func_integer :public Item_int_func
{
public:
  inline Item_func_integer(Item *a) :Item_int_func(a) {}
  void fix_length_and_dec();
};


unknown's avatar
unknown committed
625 626 627 628 629 630 631 632 633 634
class Item_func_int_val :public Item_func_num1
{
public:
  Item_func_int_val(Item *a) :Item_func_num1(a) {}
  void fix_num_length_and_dec();
  void find_num_type();
};


class Item_func_ceiling :public Item_func_int_val
unknown's avatar
unknown committed
635 636
{
public:
unknown's avatar
unknown committed
637
  Item_func_ceiling(Item *a) :Item_func_int_val(a) {}
unknown's avatar
unknown committed
638
  const char *func_name() const { return "ceiling"; }
unknown's avatar
unknown committed
639 640 641
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
642 643
};

unknown's avatar
unknown committed
644 645

class Item_func_floor :public Item_func_int_val
unknown's avatar
unknown committed
646 647
{
public:
unknown's avatar
unknown committed
648
  Item_func_floor(Item *a) :Item_func_int_val(a) {}
unknown's avatar
unknown committed
649
  const char *func_name() const { return "floor"; }
unknown's avatar
unknown committed
650 651 652
  longlong int_op();
  double real_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
653 654 655 656
};

/* This handles round and truncate */

unknown's avatar
unknown committed
657
class Item_func_round :public Item_func_num1
unknown's avatar
unknown committed
658 659 660
{
  bool truncate;
public:
unknown's avatar
unknown committed
661 662
  Item_func_round(Item *a, Item *b, bool trunc_arg)
    :Item_func_num1(a,b), truncate(trunc_arg) {}
unknown's avatar
unknown committed
663
  const char *func_name() const { return truncate ? "truncate" : "round"; }
unknown's avatar
unknown committed
664 665 666
  double real_op();
  longlong int_op();
  my_decimal *decimal_op(my_decimal *);
unknown's avatar
unknown committed
667
  void fix_length_and_dec();
unknown's avatar
unknown committed
668 669 670 671 672
};


class Item_func_rand :public Item_real_func
{
673
  struct rand_struct *rand;
unknown's avatar
unknown committed
674
public:
675 676
  Item_func_rand(Item *a) :Item_real_func(a), rand(0) {}
  Item_func_rand()	  :Item_real_func() {}
677
  double val_real();
unknown's avatar
unknown committed
678 679
  const char *func_name() const { return "rand"; }
  bool const_item() const { return 0; }
unknown's avatar
unknown committed
680
  void update_used_tables();
681
  bool fix_fields(THD *thd, Item **ref);
682 683
private:
  void seed_random (Item * val);  
unknown's avatar
unknown committed
684 685 686 687 688 689 690 691 692
};


class Item_func_sign :public Item_int_func
{
public:
  Item_func_sign(Item *a) :Item_int_func(a) {}
  const char *func_name() const { return "sign"; }
  longlong val_int();
unknown's avatar
unknown committed
693
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
694 695 696 697 698 699 700
};


class Item_func_units :public Item_real_func
{
  char *name;
  double mul,add;
701
public:
unknown's avatar
unknown committed
702 703
  Item_func_units(char *name_arg,Item *a,double mul_arg,double add_arg)
    :Item_real_func(a),name(name_arg),mul(mul_arg),add(add_arg) {}
704
  double val_real();
unknown's avatar
unknown committed
705
  const char *func_name() const { return name; }
unknown's avatar
unknown committed
706 707
  void fix_length_and_dec()
  { decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
unknown's avatar
unknown committed
708
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
709 710 711 712 713 714 715 716 717 718
};


class Item_func_min_max :public Item_func
{
  Item_result cmp_type;
  String tmp_value;
  int cmp_sign;
public:
  Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list),
719
    cmp_type(INT_RESULT), cmp_sign(cmp_sign_arg) {}
720
  double val_real();
unknown's avatar
unknown committed
721 722
  longlong val_int();
  String *val_str(String *);
unknown's avatar
unknown committed
723
  my_decimal *val_decimal(my_decimal *);
unknown's avatar
unknown committed
724 725
  void fix_length_and_dec();
  enum Item_result result_type () const { return cmp_type; }
unknown's avatar
unknown committed
726
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
};

class Item_func_min :public Item_func_min_max
{
public:
  Item_func_min(List<Item> &list) :Item_func_min_max(list,1) {}
  const char *func_name() const { return "least"; }
};

class Item_func_max :public Item_func_min_max
{
public:
  Item_func_max(List<Item> &list) :Item_func_min_max(list,-1) {}
  const char *func_name() const { return "greatest"; }
};

unknown's avatar
unknown committed
743

unknown's avatar
unknown committed
744 745 746 747 748 749 750 751
class Item_func_length :public Item_int_func
{
  String value;
public:
  Item_func_length(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "length"; }
  void fix_length_and_dec() { max_length=10; }
unknown's avatar
unknown committed
752
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
753 754
};

unknown's avatar
unknown committed
755 756 757 758
class Item_func_bit_length :public Item_func_length
{
public:
  Item_func_bit_length(Item *a) :Item_func_length(a) {}
759 760
  longlong val_int()
    { DBUG_ASSERT(fixed == 1); return Item_func_length::val_int()*8; }
unknown's avatar
unknown committed
761 762 763
  const char *func_name() const { return "bit_length"; }
};

unknown's avatar
unknown committed
764 765 766 767 768 769 770 771
class Item_func_char_length :public Item_int_func
{
  String value;
public:
  Item_func_char_length(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "char_length"; }
  void fix_length_and_dec() { max_length=10; }
unknown's avatar
unknown committed
772
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
773 774
};

unknown's avatar
unknown committed
775 776 777 778 779 780
class Item_func_coercibility :public Item_int_func
{
public:
  Item_func_coercibility(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "coercibility"; }
781 782
  void fix_length_and_dec() { max_length=10; maybe_null= 0; }
  table_map not_null_tables() const { return 0; }
unknown's avatar
unknown committed
783 784
};

unknown's avatar
unknown committed
785 786 787
class Item_func_locate :public Item_int_func
{
  String value1,value2;
788
  DTCollation cmp_collation;
unknown's avatar
unknown committed
789 790 791 792 793
public:
  Item_func_locate(Item *a,Item *b) :Item_int_func(a,b) {}
  Item_func_locate(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
  const char *func_name() const { return "locate"; }
  longlong val_int();
794
  void fix_length_and_dec();
795
  void print(String *str);
unknown's avatar
unknown committed
796
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
797 798 799 800 801 802
};


class Item_func_field :public Item_int_func
{
  String value,tmp;
803 804
  Item_result cmp_type;
  DTCollation cmp_collation;
unknown's avatar
unknown committed
805
public:
806
  Item_func_field(List<Item> &list) :Item_int_func(list) {}
unknown's avatar
unknown committed
807 808
  longlong val_int();
  const char *func_name() const { return "field"; }
809
  void fix_length_and_dec();
unknown's avatar
unknown committed
810 811 812 813 814 815 816 817 818 819 820
};


class Item_func_ascii :public Item_int_func
{
  String value;
public:
  Item_func_ascii(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "ascii"; }
  void fix_length_and_dec() { max_length=3; }
unknown's avatar
unknown committed
821
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
822 823 824 825 826 827 828 829 830
};

class Item_func_ord :public Item_int_func
{
  String value;
public:
  Item_func_ord(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "ord"; }
unknown's avatar
unknown committed
831
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
832 833 834 835 836 837 838
};

class Item_func_find_in_set :public Item_int_func
{
  String value,value2;
  uint enum_value;
  ulonglong enum_bit;
839
  DTCollation cmp_collation;
unknown's avatar
unknown committed
840 841 842 843 844
public:
  Item_func_find_in_set(Item *a,Item *b) :Item_int_func(a,b),enum_value(0) {}
  longlong val_int();
  const char *func_name() const { return "find_in_set"; }
  void fix_length_and_dec();
unknown's avatar
unknown committed
845
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
846 847
};

848
/* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
unknown's avatar
unknown committed
849

850
class Item_func_bit: public Item_int_func
unknown's avatar
unknown committed
851 852
{
public:
853 854 855
  Item_func_bit(Item *a, Item *b) :Item_int_func(a, b) {}
  Item_func_bit(Item *a) :Item_int_func(a) {}
  void fix_length_and_dec() { unsigned_flag= 1; }
unknown's avatar
unknown committed
856
  void print(String *str) { print_op(str); }
unknown's avatar
unknown committed
857
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
858 859 860 861 862 863
};

class Item_func_bit_or :public Item_func_bit
{
public:
  Item_func_bit_or(Item *a, Item *b) :Item_func_bit(a, b) {}
unknown's avatar
unknown committed
864 865 866 867
  longlong val_int();
  const char *func_name() const { return "|"; }
};

868
class Item_func_bit_and :public Item_func_bit
unknown's avatar
unknown committed
869 870
{
public:
871
  Item_func_bit_and(Item *a, Item *b) :Item_func_bit(a, b) {}
unknown's avatar
unknown committed
872 873 874 875 876 877 878 879 880 881
  longlong val_int();
  const char *func_name() const { return "&"; }
};

class Item_func_bit_count :public Item_int_func
{
public:
  Item_func_bit_count(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "bit_count"; }
unknown's avatar
unknown committed
882
  void fix_length_and_dec() { max_length=2; }
unknown's avatar
unknown committed
883
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
884 885
};

886
class Item_func_shift_left :public Item_func_bit
unknown's avatar
unknown committed
887 888
{
public:
889
  Item_func_shift_left(Item *a, Item *b) :Item_func_bit(a, b) {}
unknown's avatar
unknown committed
890 891 892 893
  longlong val_int();
  const char *func_name() const { return "<<"; }
};

894
class Item_func_shift_right :public Item_func_bit
unknown's avatar
unknown committed
895 896
{
public:
897
  Item_func_shift_right(Item *a, Item *b) :Item_func_bit(a, b) {}
unknown's avatar
unknown committed
898 899 900 901
  longlong val_int();
  const char *func_name() const { return ">>"; }
};

902
class Item_func_bit_neg :public Item_func_bit
unknown's avatar
unknown committed
903 904
{
public:
905
  Item_func_bit_neg(Item *a) :Item_func_bit(a) {}
unknown's avatar
unknown committed
906 907
  longlong val_int();
  const char *func_name() const { return "~"; }
unknown's avatar
unknown committed
908
  void print(String *str) { Item_func::print(str); }
unknown's avatar
unknown committed
909 910
};

unknown's avatar
unknown committed
911

912
class Item_func_last_insert_id :public Item_int_func
unknown's avatar
unknown committed
913 914
{
public:
915 916
  Item_func_last_insert_id() :Item_int_func() {}
  Item_func_last_insert_id(Item *a) :Item_int_func(a) {}
unknown's avatar
unknown committed
917 918
  longlong val_int();
  const char *func_name() const { return "last_insert_id"; }
unknown's avatar
unknown committed
919 920 921 922 923
  void fix_length_and_dec()
  {
    if (arg_count)
      max_length= args[0]->max_length;
  }
unknown's avatar
unknown committed
924 925
};

926

unknown's avatar
unknown committed
927 928
class Item_func_benchmark :public Item_int_func
{
929
public:
930 931
  Item_func_benchmark(Item *count_expr, Item *expr)
    :Item_int_func(count_expr, expr)
unknown's avatar
unknown committed
932 933 934
  {}
  longlong val_int();
  const char *func_name() const { return "benchmark"; }
unknown's avatar
unknown committed
935
  void fix_length_and_dec() { max_length=1; maybe_null=0; }
936
  void print(String *str);
unknown's avatar
unknown committed
937 938 939
};


940 941 942 943
class Item_func_sleep :public Item_int_func
{
public:
  Item_func_sleep(Item *a) :Item_int_func(a) {}
944
  bool const_item() const { return 0; }
945
  const char *func_name() const { return "sleep"; }
946 947 948 949 950
  void update_used_tables()
  {
    Item_int_func::update_used_tables();
    used_tables_cache|= RAND_TABLE_BIT;
  }
951 952 953 954 955
  longlong val_int();
};



unknown's avatar
unknown committed
956 957 958 959
#ifdef HAVE_DLOPEN

class Item_udf_func :public Item_func
{
960
protected:
unknown's avatar
unknown committed
961 962 963
  udf_handler udf;

public:
964 965
  Item_udf_func(udf_func *udf_arg)
    :Item_func(), udf(udf_arg) {}
unknown's avatar
unknown committed
966 967 968
  Item_udf_func(udf_func *udf_arg, List<Item> &list)
    :Item_func(list), udf(udf_arg) {}
  const char *func_name() const { return udf.name(); }
969
  enum Functype functype() const   { return UDF_FUNC; }
970
  bool fix_fields(THD *thd, Item **ref)
unknown's avatar
unknown committed
971
  {
972
    DBUG_ASSERT(fixed == 0);
973
    bool res= udf.fix_fields(thd, this, arg_count, args);
unknown's avatar
unknown committed
974 975
    used_tables_cache= udf.used_tables_cache;
    const_item_cache= udf.const_item_cache;
976
    fixed= 1;
unknown's avatar
unknown committed
977 978
    return res;
  }
979
  void cleanup();
unknown's avatar
unknown committed
980
  Item_result result_type () const { return udf.result_type(); }
981
  table_map not_null_tables() const { return 0; }
982
  bool is_expensive() { return 1; }
983
  void print(String *str);
unknown's avatar
unknown committed
984 985 986 987 988 989
};


class Item_func_udf_float :public Item_udf_func
{
 public:
990 991 992 993 994
  Item_func_udf_float(udf_func *udf_arg)
    :Item_udf_func(udf_arg) {}
  Item_func_udf_float(udf_func *udf_arg,
                      List<Item> &list)
    :Item_udf_func(udf_arg, list) {}
995
  longlong val_int()
996 997
  {
    DBUG_ASSERT(fixed == 1);
998
    return (longlong) rint(Item_func_udf_float::val_real());
999
  }
unknown's avatar
unknown committed
1000 1001 1002 1003 1004 1005 1006 1007
  my_decimal *val_decimal(my_decimal *dec_buf)
  {
    double res=val_real();
    if (null_value)
      return NULL;
    double2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf);
    return dec_buf;
  }
1008
  double val_real();
unknown's avatar
unknown committed
1009 1010 1011 1012 1013 1014 1015 1016
  String *val_str(String *str);
  void fix_length_and_dec() { fix_num_length_and_dec(); }
};


class Item_func_udf_int :public Item_udf_func
{
public:
1017 1018 1019 1020 1021
  Item_func_udf_int(udf_func *udf_arg)
    :Item_udf_func(udf_arg) {}
  Item_func_udf_int(udf_func *udf_arg,
                    List<Item> &list)
    :Item_udf_func(udf_arg, list) {}
unknown's avatar
unknown committed
1022
  longlong val_int();
1023
  double val_real() { return (double) Item_func_udf_int::val_int(); }
unknown's avatar
unknown committed
1024 1025
  String *val_str(String *str);
  enum Item_result result_type () const { return INT_RESULT; }
unknown's avatar
unknown committed
1026 1027 1028 1029 1030 1031 1032
  void fix_length_and_dec() { decimals= 0; max_length= 21; }
};


class Item_func_udf_decimal :public Item_udf_func
{
public:
1033 1034
  Item_func_udf_decimal(udf_func *udf_arg)
    :Item_udf_func(udf_arg) {}
unknown's avatar
unknown committed
1035
  Item_func_udf_decimal(udf_func *udf_arg, List<Item> &list)
1036
    :Item_udf_func(udf_arg, list) {}
unknown's avatar
unknown committed
1037 1038 1039 1040 1041 1042
  longlong val_int();
  double val_real();
  my_decimal *val_decimal(my_decimal *);
  String *val_str(String *str);
  enum Item_result result_type () const { return DECIMAL_RESULT; }
  void fix_length_and_dec();
unknown's avatar
unknown committed
1043 1044 1045 1046 1047 1048
};


class Item_func_udf_str :public Item_udf_func
{
public:
1049 1050
  Item_func_udf_str(udf_func *udf_arg)
    :Item_udf_func(udf_arg) {}
unknown's avatar
unknown committed
1051
  Item_func_udf_str(udf_func *udf_arg, List<Item> &list)
1052
    :Item_udf_func(udf_arg, list) {}
unknown's avatar
unknown committed
1053
  String *val_str(String *);
1054
  double val_real()
unknown's avatar
unknown committed
1055
  {
unknown's avatar
unknown committed
1056 1057 1058 1059 1060 1061
    int err_not_used;
    char *end_not_used;
    String *res;
    res= val_str(&str_value);
    return res ? my_strntod(res->charset(),(char*) res->ptr(), 
                            res->length(), &end_not_used, &err_not_used) : 0.0;
unknown's avatar
unknown committed
1062 1063 1064
  }
  longlong val_int()
  {
unknown's avatar
unknown committed
1065
    int err_not_used;
unknown's avatar
unknown committed
1066
    String *res;  res=val_str(&str_value);
unknown's avatar
unknown committed
1067 1068
    return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,
                             (char**) 0, &err_not_used) : (longlong) 0;
unknown's avatar
unknown committed
1069
  }
unknown's avatar
unknown committed
1070 1071 1072 1073 1074 1075 1076 1077
  my_decimal *val_decimal(my_decimal *dec_buf)
  {
    String *res=val_str(&str_value);
    if (!res)
      return NULL;
    string2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf);
    return dec_buf;
  }
unknown's avatar
unknown committed
1078 1079 1080 1081 1082 1083 1084 1085 1086
  enum Item_result result_type () const { return STRING_RESULT; }
  void fix_length_and_dec();
};

#else /* Dummy functions to get sql_yacc.cc compiled */

class Item_func_udf_float :public Item_real_func
{
 public:
1087 1088 1089 1090
  Item_func_udf_float(udf_func *udf_arg)
    :Item_real_func() {}
  Item_func_udf_float(udf_func *udf_arg, List<Item> &list)
    :Item_real_func(list) {}
1091
  double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; }
unknown's avatar
unknown committed
1092 1093 1094 1095 1096 1097
};


class Item_func_udf_int :public Item_int_func
{
public:
1098 1099 1100 1101
  Item_func_udf_int(udf_func *udf_arg)
    :Item_int_func() {}
  Item_func_udf_int(udf_func *udf_arg, List<Item> &list)
    :Item_int_func(list) {}
1102
  longlong val_int() { DBUG_ASSERT(fixed == 1); return 0; }
unknown's avatar
unknown committed
1103 1104 1105
};


unknown's avatar
unknown committed
1106 1107 1108
class Item_func_udf_decimal :public Item_int_func
{
public:
1109 1110 1111 1112
  Item_func_udf_decimal(udf_func *udf_arg)
    :Item_int_func() {}
  Item_func_udf_decimal(udf_func *udf_arg, List<Item> &list)
    :Item_int_func(list) {}
unknown's avatar
unknown committed
1113 1114 1115 1116
  my_decimal *val_decimal(my_decimal *) { DBUG_ASSERT(fixed == 1); return 0; }
};


unknown's avatar
unknown committed
1117 1118 1119
class Item_func_udf_str :public Item_func
{
public:
1120 1121 1122 1123
  Item_func_udf_str(udf_func *udf_arg)
    :Item_func() {}
  Item_func_udf_str(udf_func *udf_arg, List<Item> &list)
    :Item_func(list) {}
1124 1125
  String *val_str(String *)
    { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
1126
  double val_real() { DBUG_ASSERT(fixed == 1); null_value= 1; return 0.0; }
1127
  longlong val_int() { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
unknown's avatar
unknown committed
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
  enum Item_result result_type () const { return STRING_RESULT; }
  void fix_length_and_dec() { maybe_null=1; max_length=0; }
};

#endif /* HAVE_DLOPEN */

/*
** User level locks
*/

1138
class User_level_lock;
unknown's avatar
unknown committed
1139
void item_user_lock_init(void);
1140
void item_user_lock_release(User_level_lock *ull);
unknown's avatar
unknown committed
1141 1142 1143 1144 1145 1146 1147 1148 1149
void item_user_lock_free(void);

class Item_func_get_lock :public Item_int_func
{
  String value;
 public:
  Item_func_get_lock(Item *a,Item *b) :Item_int_func(a,b) {}
  longlong val_int();
  const char *func_name() const { return "get_lock"; }
unknown's avatar
unknown committed
1150
  void fix_length_and_dec() { max_length=1; maybe_null=1;}
unknown's avatar
unknown committed
1151 1152 1153 1154 1155
};

class Item_func_release_lock :public Item_int_func
{
  String value;
1156
public:
unknown's avatar
unknown committed
1157 1158 1159
  Item_func_release_lock(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "release_lock"; }
unknown's avatar
unknown committed
1160
  void fix_length_and_dec() { max_length=1; maybe_null=1;}
unknown's avatar
unknown committed
1161 1162
};

unknown's avatar
unknown committed
1163 1164 1165 1166 1167
/* replication functions */

class Item_master_pos_wait :public Item_int_func
{
  String value;
1168
public:
unknown's avatar
unknown committed
1169
  Item_master_pos_wait(Item *a,Item *b) :Item_int_func(a,b) {}
1170
  Item_master_pos_wait(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
unknown's avatar
unknown committed
1171 1172
  longlong val_int();
  const char *func_name() const { return "master_pos_wait"; }
1173
  void fix_length_and_dec() { max_length=21; maybe_null=1;}
unknown's avatar
unknown committed
1174 1175
};

unknown's avatar
unknown committed
1176

unknown's avatar
unknown committed
1177
/* Handling of user definable variables */
unknown's avatar
unknown committed
1178 1179 1180 1181 1182 1183 1184

class user_var_entry;

class Item_func_set_user_var :public Item_func
{
  enum Item_result cached_result_type;
  user_var_entry *entry;
1185 1186
  char buffer[MAX_FIELD_WIDTH];
  String value;
unknown's avatar
unknown committed
1187
  my_decimal decimal_buff;
1188
  bool null_item;
1189 1190 1191 1192 1193
  union
  {
    longlong vint;
    double vreal;
    String *vstr;
unknown's avatar
unknown committed
1194
    my_decimal *vdec;
1195
  } save_result;
unknown's avatar
unknown committed
1196 1197

public:
1198
  LEX_STRING name; // keep it public
unknown's avatar
unknown committed
1199 1200 1201
  Item_func_set_user_var(LEX_STRING a,Item *b)
    :Item_func(b), cached_result_type(INT_RESULT), name(a)
  {}
1202
  enum Functype functype() const { return SUSERVAR_FUNC; }
1203
  double val_real();
unknown's avatar
unknown committed
1204 1205
  longlong val_int();
  String *val_str(String *str);
unknown's avatar
unknown committed
1206
  my_decimal *val_decimal(my_decimal *);
1207
  bool update_hash(void *ptr, uint length, enum Item_result type,
unknown's avatar
unknown committed
1208
  		   CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
1209
  bool send(Protocol *protocol, String *str_arg);
unknown's avatar
unknown committed
1210
  void make_field(Send_field *tmp_field);
1211
  bool check(bool use_result_field);
unknown's avatar
unknown committed
1212 1213
  bool update();
  enum Item_result result_type () const { return cached_result_type; }
1214
  bool fix_fields(THD *thd, Item **ref);
unknown's avatar
unknown committed
1215
  void fix_length_and_dec();
unknown's avatar
unknown committed
1216
  void print(String *str);
1217
  void print_as_stmt(String *str);
unknown's avatar
unknown committed
1218
  const char *func_name() const { return "set_user_var"; }
1219
  int save_in_field(Field *field, bool no_conversions);
unknown's avatar
unknown committed
1220 1221 1222
};


1223 1224
class Item_func_get_user_var :public Item_func,
                              private Settable_routine_parameter
unknown's avatar
unknown committed
1225
{
1226
  user_var_entry *var_entry;
unknown's avatar
unknown committed
1227 1228

public:
1229
  LEX_STRING name; // keep it public
1230
  Item_func_get_user_var(LEX_STRING a):
1231
    Item_func(), name(a) {}
1232 1233
  enum Functype functype() const { return GUSERVAR_FUNC; }
  LEX_STRING get_name() { return name; }
1234
  double val_real();
unknown's avatar
unknown committed
1235
  longlong val_int();
unknown's avatar
unknown committed
1236
  my_decimal *val_decimal(my_decimal*);
unknown's avatar
unknown committed
1237 1238
  String *val_str(String* str);
  void fix_length_and_dec();
unknown's avatar
unknown committed
1239
  void print(String *str);
unknown's avatar
unknown committed
1240
  enum Item_result result_type() const;
1241 1242 1243 1244
  /*
    We must always return variables as strings to guard against selects of type
    select @t1:=1,@t1,@t:="hello",@t from foo where (@t1:= t2.b)
  */
1245
  enum_field_types field_type() const  { return MYSQL_TYPE_VARCHAR; }
unknown's avatar
unknown committed
1246
  const char *func_name() const { return "get_user_var"; }
1247
  bool const_item() const;
1248
  table_map used_tables() const
1249
  { return const_item() ? 0 : RAND_TABLE_BIT; }
1250
  bool eq(const Item *item, bool binary_cmp) const;
1251 1252

private:
1253
  bool set_value(THD *thd, sp_rcontext *ctx, Item **it);
1254 1255 1256 1257 1258 1259

public:
  Settable_routine_parameter *get_settable_routine_parameter()
  {
    return this;
  }
1260
};
unknown's avatar
unknown committed
1261

unknown's avatar
unknown committed
1262

unknown's avatar
unknown committed
1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
/*
  This item represents user variable used as out parameter (e.g in LOAD DATA),
  and it is supposed to be used only for this purprose. So it is simplified
  a lot. Actually you should never obtain its value.

  The only two reasons for this thing being an Item is possibility to store it
  in List<Item> and desire to place this code somewhere near other functions
  working with user variables.
*/
class Item_user_var_as_out_param :public Item
{
  LEX_STRING name;
  user_var_entry *entry;
public:
  Item_user_var_as_out_param(LEX_STRING a) : name(a) {}
  /* We should return something different from FIELD_ITEM here */
  enum Type type() const { return STRING_ITEM;}
  double val_real();
  longlong val_int();
  String *val_str(String *str);
  my_decimal *val_decimal(my_decimal *decimal_buffer);
  /* fix_fields() binds variable name with its entry structure */
1285
  bool fix_fields(THD *thd, Item **ref);
unknown's avatar
unknown committed
1286 1287 1288 1289 1290 1291
  void print(String *str);
  void set_null_value(CHARSET_INFO* cs);
  void set_value(const char *str, uint length, CHARSET_INFO* cs);
};


1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
/* A system variable */

class Item_func_get_system_var :public Item_func
{
  sys_var *var;
  enum_var_type var_type;
  LEX_STRING component;
public:
  Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
                           LEX_STRING *component_arg, const char *name_arg,
                           size_t name_len_arg);
unknown's avatar
unknown committed
1303
  bool fix_fields(THD *thd, Item **ref);
1304 1305 1306 1307
  /*
    Stubs for pure virtual methods. Should never be called: this
    item is always substituted with a constant in fix_fields().
  */
unknown's avatar
unknown committed
1308
  double val_real()         { DBUG_ASSERT(0); return 0.0; }
1309 1310 1311
  longlong val_int()        { DBUG_ASSERT(0); return 0; }
  String* val_str(String*)  { DBUG_ASSERT(0); return 0; }
  void fix_length_and_dec() { DBUG_ASSERT(0); }
unknown's avatar
unknown committed
1312 1313
  /* TODO: fix to support views */
  const char *func_name() const { return "get_system_var"; }
1314 1315 1316
};


unknown's avatar
unknown committed
1317 1318 1319
class Item_func_inet_aton : public Item_int_func
{
public:
1320 1321 1322 1323
  Item_func_inet_aton(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "inet_aton"; }
  void fix_length_and_dec() { decimals= 0; max_length= 21; maybe_null= 1; unsigned_flag= 1;}
unknown's avatar
unknown committed
1324
  bool check_partition_func_processor(byte *int_arg) {return FALSE;}
unknown's avatar
unknown committed
1325 1326 1327
};


1328
/* for fulltext search */
1329
#include <ft_global.h>
unknown's avatar
unknown committed
1330 1331 1332 1333

class Item_func_match :public Item_real_func
{
public:
1334
  uint key, flags;
unknown's avatar
unknown committed
1335
  bool join_key;
1336 1337 1338 1339 1340 1341 1342
  DTCollation cmp_collation;
  FT_INFO *ft_handler;
  TABLE *table;
  Item_func_match *master;   // for master-slave optimization
  Item *concat;              // Item_func_concat_ws
  String value;              // value of concat
  String search_value;       // key_item()'s value converted to cmp_collation
unknown's avatar
unknown committed
1343

unknown's avatar
unknown committed
1344 1345
  Item_func_match(List<Item> &a, uint b): Item_real_func(a), key(0), flags(b),
       join_key(0), ft_handler(0), table(0), master(0), concat(0) { }
unknown's avatar
unknown committed
1346
  void cleanup()
1347
  {
unknown's avatar
unknown committed
1348
    DBUG_ENTER("Item_func_match");
1349
    Item_real_func::cleanup();
1350
    if (!master && ft_handler)
unknown's avatar
unknown committed
1351
      ft_handler->please->close_search(ft_handler);
1352
    ft_handler= 0;
unknown's avatar
unknown committed
1353
    concat= 0;
unknown's avatar
unknown committed
1354
    DBUG_VOID_RETURN;
1355
  }
unknown's avatar
unknown committed
1356
  enum Functype functype() const { return FT_FUNC; }
1357
  const char *func_name() const { return "match"; }
unknown's avatar
unknown committed
1358
  void update_used_tables() {}
1359
  table_map not_null_tables() const { return 0; }
1360
  bool fix_fields(THD *thd, Item **ref);
1361
  bool eq(const Item *, bool binary_cmp) const;
1362
  /* The following should be safe, even if we compare doubles */
1363 1364
  longlong val_int() { DBUG_ASSERT(fixed == 1); return val_real() != 0.0; }
  double val_real();
1365
  void print(String *str);
1366 1367

  bool fix_index();
unknown's avatar
unknown committed
1368
  void init_search(bool no_order);
1369
};
unknown's avatar
unknown committed
1370

unknown's avatar
unknown committed
1371

1372
class Item_func_bit_xor : public Item_func_bit
unknown's avatar
unknown committed
1373 1374
{
public:
1375
  Item_func_bit_xor(Item *a, Item *b) :Item_func_bit(a, b) {}
unknown's avatar
unknown committed
1376 1377 1378 1379
  longlong val_int();
  const char *func_name() const { return "^"; }
};

1380
class Item_func_is_free_lock :public Item_int_func
unknown's avatar
unknown committed
1381 1382 1383
{
  String value;
public:
1384
  Item_func_is_free_lock(Item *a) :Item_int_func(a) {}
unknown's avatar
unknown committed
1385
  longlong val_int();
1386
  const char *func_name() const { return "is_free_lock"; }
unknown's avatar
unknown committed
1387
  void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
unknown's avatar
unknown committed
1388 1389
};

unknown's avatar
SCRUM  
unknown committed
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
class Item_func_is_used_lock :public Item_int_func
{
  String value;
public:
  Item_func_is_used_lock(Item *a) :Item_int_func(a) {}
  longlong val_int();
  const char *func_name() const { return "is_used_lock"; }
  void fix_length_and_dec() { decimals=0; max_length=10; maybe_null=1;}
};

unknown's avatar
unknown committed
1400 1401
/* For type casts */

1402
enum Cast_target
unknown's avatar
unknown committed
1403 1404
{
  ITEM_CAST_BINARY, ITEM_CAST_SIGNED_INT, ITEM_CAST_UNSIGNED_INT,
unknown's avatar
unknown committed
1405 1406
  ITEM_CAST_DATE, ITEM_CAST_TIME, ITEM_CAST_DATETIME, ITEM_CAST_CHAR,
  ITEM_CAST_DECIMAL
unknown's avatar
unknown committed
1407
};
1408 1409


1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
class Item_func_row_count :public Item_int_func
{
public:
  Item_func_row_count() :Item_int_func() {}
  longlong val_int();
  const char *func_name() const { return "row_count"; }
  void fix_length_and_dec() { decimals= 0; maybe_null=0; }
};


1420 1421 1422 1423 1424 1425 1426
/*
 *
 * Stored FUNCTIONs
 *
 */

class sp_head;
1427
class sp_name;
1428
struct st_sp_security_context;
1429 1430 1431 1432

class Item_func_sp :public Item_func
{
private:
1433
  Name_resolution_context *context;
1434
  sp_name *m_name;
1435
  mutable sp_head *m_sp;
unknown's avatar
unknown committed
1436
  TABLE *dummy_table;
1437
  char result_buf[64];
1438 1439 1440 1441
  /*
     The result field of the concrete stored function.
  */
  Field *sp_result_field;
1442

1443 1444 1445
  bool execute();
  bool execute_impl(THD *thd);
  bool init_result_field(THD *thd);
1446 1447 1448

public:

1449
  Item_func_sp(Name_resolution_context *context_arg, sp_name *name);
1450

1451 1452
  Item_func_sp(Name_resolution_context *context_arg,
               sp_name *name, List<Item> &list);
1453 1454 1455 1456

  virtual ~Item_func_sp()
  {}

1457
  void cleanup();
1458

1459
  const char *func_name() const;
1460

1461 1462
  enum enum_field_types field_type() const;

unknown's avatar
unknown committed
1463 1464 1465 1466
  Field *tmp_table_field(TABLE *t_arg);

  void make_field(Send_field *tmp_field);

1467 1468 1469 1470
  Item_result result_type() const;

  longlong val_int()
  {
1471
    if (execute())
unknown's avatar
unknown committed
1472
      return (longlong) 0;
1473
    return sp_result_field->val_int();
1474 1475
  }

1476
  double val_real()
1477
  {
1478
    if (execute())
1479
      return 0.0;
1480
    return sp_result_field->val_real();
1481 1482
  }

unknown's avatar
unknown committed
1483 1484
  my_decimal *val_decimal(my_decimal *dec_buf)
  {
1485
    if (execute())
unknown's avatar
unknown committed
1486
      return NULL;
1487
    return sp_result_field->val_decimal(dec_buf);
unknown's avatar
unknown committed
1488 1489
  }

1490 1491
  String *val_str(String *str)
  {
1492 1493 1494 1495
    String buf;
    char buff[20];
    buf.set(buff, 20, str->charset());
    buf.length(0);
1496
    if (execute())
1497
      return NULL;
1498 1499 1500 1501 1502 1503
    /*
      result_field will set buf pointing to internal buffer
      of the resul_field. Due to this it will change any time
      when SP is executed. In order to prevent occasional
      corruption of returned value, we make here a copy.
    */
1504
    sp_result_field->val_str(&buf);
1505 1506
    str->copy(buf);
    return str;
1507 1508
  }

1509 1510 1511
  virtual bool change_context_processor(byte *cntx)
    { context= (Name_resolution_context *)cntx; return FALSE; }

1512
  bool sp_check_access(THD * thd);
1513
  virtual enum Functype functype() const { return FUNC_SP; }
1514

1515
  bool fix_fields(THD *thd, Item **ref);
1516
  void fix_length_and_dec(void);
1517
  bool is_expensive() { return 1; }
1518
};
unknown's avatar
unknown committed
1519 1520


1521 1522 1523 1524 1525 1526 1527 1528
class Item_func_found_rows :public Item_int_func
{
public:
  Item_func_found_rows() :Item_int_func() {}
  longlong val_int();
  const char *func_name() const { return "found_rows"; }
  void fix_length_and_dec() { decimals= 0; maybe_null=0; }
};