20
20
Functions to create an item. Used by sql_yac.yy
23
#include <drizzled/server_includes.h>
24
24
#include <drizzled/item/create.h>
25
25
#include <drizzled/item/func.h>
26
26
#include <drizzled/error.h>
28
#include "drizzled/function_container.h"
30
28
#include <drizzled/function/str/binary.h>
31
29
#include <drizzled/function/str/concat.h>
32
30
#include <drizzled/function/str/conv.h>
31
#include <drizzled/function/str/elt.h>
33
32
#include <drizzled/function/str/export_set.h>
33
#include <drizzled/function/str/format.h>
34
#include <drizzled/function/str/hex.h>
34
35
#include <drizzled/function/str/load_file.h>
35
36
#include <drizzled/function/str/make_set.h>
36
37
#include <drizzled/function/str/pad.h>
37
38
#include <drizzled/function/str/repeat.h>
38
39
#include <drizzled/function/str/str_conv.h>
40
#include <drizzled/function/str/substr.h>
39
41
#include <drizzled/function/str/trim.h>
42
#include <drizzled/function/str/uuid.h>
41
44
#include <drizzled/function/time/date_format.h>
42
45
#include <drizzled/function/time/dayname.h>
61
64
/* Function declarations */
63
66
#include <drizzled/function/func.h>
67
#include <drizzled/function/math/abs.h>
68
#include <drizzled/function/math/acos.h>
64
69
#include <drizzled/function/additive_op.h>
70
#include <drizzled/function/math/asin.h>
71
#include <drizzled/function/math/atan.h>
72
#include <drizzled/function/math/ceiling.h>
73
#include <drizzled/function/coercibility.h>
74
#include <drizzled/function/math/cos.h>
65
75
#include <drizzled/function/math/dec.h>
66
76
#include <drizzled/function/math/decimal_typecast.h>
77
#include <drizzled/function/math//exp.h>
67
78
#include <drizzled/function/field.h>
68
79
#include <drizzled/function/find_in_set.h>
80
#include <drizzled/function/math/floor.h>
69
81
#include <drizzled/function/found_rows.h>
70
82
#include <drizzled/function/get_system_var.h>
71
83
#include <drizzled/function/math/int_val.h>
72
84
#include <drizzled/function/math/integer.h>
73
85
#include <drizzled/function/last_insert.h>
86
#include <drizzled/function/math/ln.h>
74
87
#include <drizzled/function/locate.h>
88
#include <drizzled/function/math/log.h>
75
89
#include <drizzled/function/min_max.h>
76
90
#include <drizzled/function/num1.h>
77
91
#include <drizzled/function/num_op.h>
78
92
#include <drizzled/function/numhybrid.h>
93
#include <drizzled/function/math/ord.h>
94
#include <drizzled/function/math/pow.h>
95
#include <drizzled/function/math/rand.h>
79
96
#include <drizzled/function/math/real.h>
80
97
#include <drizzled/function/row_count.h>
81
98
#include <drizzled/function/set_user_var.h>
82
99
#include <drizzled/function/sign.h>
100
#include <drizzled/function/signed.h>
101
#include <drizzled/function/math/sin.h>
102
#include <drizzled/function/math/sqrt.h>
103
#include <drizzled/function/str/quote.h>
83
104
#include <drizzled/function/math/tan.h>
84
105
#include <drizzled/function/units.h>
106
#include <drizzled/function/unsigned.h>
86
110
using namespace std;
111
using namespace drizzled;
240
262
it helps to compare code between versions, and helps with merges conflicts.
265
class Create_func_abs : public Create_func_arg1
268
using Create_func_arg1::create;
270
virtual Item *create(Session *session, Item *arg1);
272
static Create_func_abs s_singleton;
276
virtual ~Create_func_abs() {}
280
class Create_func_acos : public Create_func_arg1
283
using Create_func_arg1::create;
285
virtual Item *create(Session *session, Item *arg1);
287
static Create_func_acos s_singleton;
290
Create_func_acos() {}
291
virtual ~Create_func_acos() {}
294
class Create_func_asin : public Create_func_arg1
297
using Create_func_arg1::create;
299
virtual Item *create(Session *session, Item *arg1);
301
static Create_func_asin s_singleton;
304
Create_func_asin() {}
305
virtual ~Create_func_asin() {}
309
class Create_func_atan : public Create_native_func
312
virtual Item *create_native(Session *session, LEX_STRING name, List<Item> *item_list);
314
static Create_func_atan s_singleton;
317
Create_func_atan() {}
318
virtual ~Create_func_atan() {}
244
321
class Create_func_bin : public Create_func_arg1
255
332
virtual ~Create_func_bin() {}
336
class Create_func_ceiling : public Create_func_arg1
339
using Create_func_arg1::create;
341
virtual Item *create(Session *session, Item *arg1);
343
static Create_func_ceiling s_singleton;
346
Create_func_ceiling() {}
347
virtual ~Create_func_ceiling() {}
351
class Create_func_coercibility : public Create_func_arg1
354
using Create_func_arg1::create;
356
virtual Item *create(Session *session, Item *arg1);
358
static Create_func_coercibility s_singleton;
361
Create_func_coercibility() {}
362
virtual ~Create_func_coercibility() {}
258
366
class Create_func_concat : public Create_native_func
428
552
virtual ~Create_func_degrees() {}
556
class Create_func_elt : public Create_native_func
559
virtual Item *create_native(Session *session, LEX_STRING name, List<Item> *item_list);
561
static Create_func_elt s_singleton;
565
virtual ~Create_func_elt() {}
569
class Create_func_exp : public Create_func_arg1
572
using Create_func_arg1::create;
574
virtual Item *create(Session *session, Item *arg1);
576
static Create_func_exp s_singleton;
580
virtual ~Create_func_exp() {}
431
584
class Create_func_export_set : public Create_native_func
435
587
virtual Item *create_native(Session *session, LEX_STRING name, List<Item> *item_list);
469
621
virtual ~Create_func_find_in_set() {}
625
class Create_func_floor : public Create_func_arg1
628
using Create_func_arg1::create;
630
virtual Item *create(Session *session, Item *arg1);
632
static Create_func_floor s_singleton;
635
Create_func_floor() {}
636
virtual ~Create_func_floor() {}
640
class Create_func_format : public Create_func_arg2
643
using Create_func_arg2::create;
645
virtual Item *create(Session *session, Item *arg1, Item *arg2);
647
static Create_func_format s_singleton;
650
Create_func_format() {}
651
virtual ~Create_func_format() {}
472
655
class Create_func_found_rows : public Create_func_arg0
870
class Create_func_log : public Create_native_func
873
virtual Item *create_native(Session *session, LEX_STRING name, List<Item> *item_list);
875
static Create_func_log s_singleton;
879
virtual ~Create_func_log() {}
883
class Create_func_log10 : public Create_func_arg1
886
using Create_func_arg1::create;
888
virtual Item *create(Session *session, Item *arg1);
890
static Create_func_log10 s_singleton;
893
Create_func_log10() {}
894
virtual ~Create_func_log10() {}
898
class Create_func_log2 : public Create_func_arg1
901
using Create_func_arg1::create;
903
virtual Item *create(Session *session, Item *arg1);
905
static Create_func_log2 s_singleton;
908
Create_func_log2() {}
909
virtual ~Create_func_log2() {}
656
913
class Create_func_lpad : public Create_func_arg3
813
1086
virtual ~Create_func_pi() {}
1090
class Create_func_pow : public Create_func_arg2
1093
using Create_func_arg2::create;
1095
virtual Item *create(Session *session, Item *arg1, Item *arg2);
1097
static Create_func_pow s_singleton;
1100
Create_func_pow() {}
1101
virtual ~Create_func_pow() {}
1105
class Create_func_quote : public Create_func_arg1
1108
using Create_func_arg1::create;
1110
virtual Item *create(Session *session, Item *arg1);
1112
static Create_func_quote s_singleton;
1115
Create_func_quote() {}
1116
virtual ~Create_func_quote() {}
816
1120
class Create_func_radians : public Create_func_arg1
1210
1604
return create(session, param_1, param_2, param_3);
1608
Create_func_abs Create_func_abs::s_singleton;
1611
Create_func_abs::create(Session *session, Item *arg1)
1613
return new (session->mem_root) Item_func_abs(arg1);
1617
Create_func_acos Create_func_acos::s_singleton;
1620
Create_func_acos::create(Session *session, Item *arg1)
1622
return new (session->mem_root) Item_func_acos(arg1);
1625
Create_func_asin Create_func_asin::s_singleton;
1628
Create_func_asin::create(Session *session, Item *arg1)
1630
return new (session->mem_root) Item_func_asin(arg1);
1634
Create_func_atan Create_func_atan::s_singleton;
1637
Create_func_atan::create_native(Session *session, LEX_STRING name,
1638
List<Item> *item_list)
1643
if (item_list != NULL)
1644
arg_count= item_list->elements;
1646
switch (arg_count) {
1649
Item *param_1= item_list->pop();
1650
func= new (session->mem_root) Item_func_atan(param_1);
1655
Item *param_1= item_list->pop();
1656
Item *param_2= item_list->pop();
1657
func= new (session->mem_root) Item_func_atan(param_1, param_2);
1662
my_error(ER_WRONG_PARAMCOUNT_TO_FUNCTION, MYF(0), name.str);
1213
1670
Create_func_bin Create_func_bin::s_singleton;
1220
1677
return new (session->mem_root) Item_func_conv(arg1, i10, i2);
1681
Create_func_ceiling Create_func_ceiling::s_singleton;
1684
Create_func_ceiling::create(Session *session, Item *arg1)
1686
return new (session->mem_root) Item_func_ceiling(arg1);
1690
Create_func_coercibility Create_func_coercibility::s_singleton;
1693
Create_func_coercibility::create(Session *session, Item *arg1)
1695
return new (session->mem_root) Item_func_coercibility(arg1);
1223
1699
Create_func_concat Create_func_concat::s_singleton;
1347
1833
180/M_PI, 0.0);
1837
Create_func_elt Create_func_elt::s_singleton;
1840
Create_func_elt::create_native(Session *session, LEX_STRING name,
1841
List<Item> *item_list)
1845
if (item_list != NULL)
1846
arg_count= item_list->elements;
1850
my_error(ER_WRONG_PARAMCOUNT_TO_FUNCTION, MYF(0), name.str);
1854
return new (session->mem_root) Item_func_elt(*item_list);
1858
Create_func_exp Create_func_exp::s_singleton;
1861
Create_func_exp::create(Session *session, Item *arg1)
1863
return new (session->mem_root) Item_func_exp(arg1);
1350
1867
Create_func_export_set Create_func_export_set::s_singleton;
1429
1946
return new (session->mem_root) Item_func_find_in_set(arg1, arg2);
1950
Create_func_floor Create_func_floor::s_singleton;
1953
Create_func_floor::create(Session *session, Item *arg1)
1955
return new (session->mem_root) Item_func_floor(arg1);
1959
Create_func_format Create_func_format::s_singleton;
1962
Create_func_format::create(Session *session, Item *arg1, Item *arg2)
1964
return new (session->mem_root) Item_func_format(arg1, arg2);
1432
1968
Create_func_found_rows Create_func_found_rows::s_singleton;
1605
2151
return new (session->mem_root) Item_func_min(*item_list);
2155
Create_func_ln Create_func_ln::s_singleton;
2158
Create_func_ln::create(Session *session, Item *arg1)
2160
return new (session->mem_root) Item_func_ln(arg1);
1608
2164
Create_func_load_file Create_func_load_file::s_singleton;
1611
2167
Create_func_load_file::create(Session *session, Item *arg1)
1613
return new (session->mem_root) Item_load_file(*session, arg1);
2169
return new (session->mem_root) Item_load_file(arg1);
2214
Create_func_log Create_func_log::s_singleton;
2217
Create_func_log::create_native(Session *session, LEX_STRING name,
2218
List<Item> *item_list)
2223
if (item_list != NULL)
2224
arg_count= item_list->elements;
2226
switch (arg_count) {
2229
Item *param_1= item_list->pop();
2230
func= new (session->mem_root) Item_func_log(param_1);
2235
Item *param_1= item_list->pop();
2236
Item *param_2= item_list->pop();
2237
func= new (session->mem_root) Item_func_log(param_1, param_2);
2242
my_error(ER_WRONG_PARAMCOUNT_TO_FUNCTION, MYF(0), name.str);
2251
Create_func_log10 Create_func_log10::s_singleton;
2254
Create_func_log10::create(Session *session, Item *arg1)
2256
return new (session->mem_root) Item_func_log10(arg1);
2260
Create_func_log2 Create_func_log2::s_singleton;
2263
Create_func_log2::create(Session *session, Item *arg1)
2265
return new (session->mem_root) Item_func_log2(arg1);
1657
2269
Create_func_lpad Create_func_lpad::s_singleton;
1660
2272
Create_func_lpad::create(Session *session, Item *arg1, Item *arg2, Item *arg3)
1662
return new (session->mem_root) Item_func_lpad(*session, arg1, arg2, arg3);
2274
return new (session->mem_root) Item_func_lpad(arg1, arg2, arg3);
1757
2379
return new (session->mem_root) Item_static_float_func("pi()", M_PI, 6, 8);
2383
Create_func_pow Create_func_pow::s_singleton;
2386
Create_func_pow::create(Session *session, Item *arg1, Item *arg2)
2388
return new (session->mem_root) Item_func_pow(arg1, arg2);
2392
Create_func_quote Create_func_quote::s_singleton;
2395
Create_func_quote::create(Session *session, Item *arg1)
2397
return new (session->mem_root) Item_func_quote(arg1);
1760
2401
Create_func_radians Create_func_radians::s_singleton;
1766
2407
M_PI/180, 0.0);
2411
Create_func_rand Create_func_rand::s_singleton;
2414
Create_func_rand::create_native(Session *session, LEX_STRING name,
2415
List<Item> *item_list)
2420
if (item_list != NULL)
2421
arg_count= item_list->elements;
2423
switch (arg_count) {
2426
func= new (session->mem_root) Item_func_rand();
2431
Item *param_1= item_list->pop();
2432
func= new (session->mem_root) Item_func_rand(param_1);
2437
my_error(ER_WRONG_PARAMCOUNT_TO_FUNCTION, MYF(0), name.str);
1769
2446
Create_func_round Create_func_round::s_singleton;
1863
2550
sp= new (session->mem_root) Item_string(" ", 1, cs, DERIVATION_COERCIBLE);
1866
return new (session->mem_root) Item_func_repeat(*session, sp, arg1);
2553
return new (session->mem_root) Item_func_repeat(sp, arg1);
2557
Create_func_sqrt Create_func_sqrt::s_singleton;
2560
Create_func_sqrt::create(Session *session, Item *arg1)
2562
return new (session->mem_root) Item_func_sqrt(arg1);
1869
2566
Create_func_strcmp Create_func_strcmp::s_singleton;
1970
2694
static Native_func_registry func_array[] =
2696
{ { C_STRING_WITH_LEN("ABS") }, BUILDER(Create_func_abs)},
2697
{ { C_STRING_WITH_LEN("ACOS") }, BUILDER(Create_func_acos)},
2698
{ { C_STRING_WITH_LEN("ASIN") }, BUILDER(Create_func_asin)},
2699
{ { C_STRING_WITH_LEN("ATAN") }, BUILDER(Create_func_atan)},
2700
{ { C_STRING_WITH_LEN("ATAN2") }, BUILDER(Create_func_atan)},
1972
2701
{ { C_STRING_WITH_LEN("BIN") }, BUILDER(Create_func_bin)},
2702
{ { C_STRING_WITH_LEN("CEIL") }, BUILDER(Create_func_ceiling)},
2703
{ { C_STRING_WITH_LEN("CEILING") }, BUILDER(Create_func_ceiling)},
2704
{ { C_STRING_WITH_LEN("COERCIBILITY") }, BUILDER(Create_func_coercibility)},
1973
2705
{ { C_STRING_WITH_LEN("CONCAT") }, BUILDER(Create_func_concat)},
1974
2706
{ { C_STRING_WITH_LEN("CONCAT_WS") }, BUILDER(Create_func_concat_ws)},
1975
2707
{ { C_STRING_WITH_LEN("CONV") }, BUILDER(Create_func_conv)},
2708
{ { C_STRING_WITH_LEN("COS") }, BUILDER(Create_func_cos)},
1976
2709
{ { C_STRING_WITH_LEN("COT") }, BUILDER(Create_func_cot)},
1977
2710
{ { C_STRING_WITH_LEN("DATEDIFF") }, BUILDER(Create_func_datediff)},
1978
2711
{ { C_STRING_WITH_LEN("DATE_FORMAT") }, BUILDER(Create_func_date_format)},
1981
2714
{ { C_STRING_WITH_LEN("DAYOFWEEK") }, BUILDER(Create_func_dayofweek)},
1982
2715
{ { C_STRING_WITH_LEN("DAYOFYEAR") }, BUILDER(Create_func_dayofyear)},
1983
2716
{ { C_STRING_WITH_LEN("DEGREES") }, BUILDER(Create_func_degrees)},
2717
{ { C_STRING_WITH_LEN("ELT") }, BUILDER(Create_func_elt)},
2718
{ { C_STRING_WITH_LEN("EXP") }, BUILDER(Create_func_exp)},
1984
2719
{ { C_STRING_WITH_LEN("EXPORT_SET") }, BUILDER(Create_func_export_set)},
1985
2720
{ { C_STRING_WITH_LEN("FIELD") }, BUILDER(Create_func_field)},
1986
2721
{ { C_STRING_WITH_LEN("FIND_IN_SET") }, BUILDER(Create_func_find_in_set)},
2722
{ { C_STRING_WITH_LEN("FLOOR") }, BUILDER(Create_func_floor)},
2723
{ { C_STRING_WITH_LEN("FORMAT") }, BUILDER(Create_func_format)},
1987
2724
{ { C_STRING_WITH_LEN("FOUND_ROWS") }, BUILDER(Create_func_found_rows)},
1988
2725
{ { C_STRING_WITH_LEN("FROM_DAYS") }, BUILDER(Create_func_from_days)},
1989
2726
{ { C_STRING_WITH_LEN("FROM_UNIXTIME") }, BUILDER(Create_func_from_unixtime)},
1990
2727
{ { C_STRING_WITH_LEN("GREATEST") }, BUILDER(Create_func_greatest)},
2728
{ { C_STRING_WITH_LEN("HEX") }, BUILDER(Create_func_hex)},
1991
2729
{ { C_STRING_WITH_LEN("IFNULL") }, BUILDER(Create_func_ifnull)},
1992
2730
{ { C_STRING_WITH_LEN("INSTR") }, BUILDER(Create_func_instr)},
1993
2731
{ { C_STRING_WITH_LEN("ISNULL") }, BUILDER(Create_func_isnull)},
1995
2733
{ { C_STRING_WITH_LEN("LAST_INSERT_ID") }, BUILDER(Create_func_last_insert_id)},
1996
2734
{ { C_STRING_WITH_LEN("LCASE") }, BUILDER(Create_func_lcase)},
1997
2735
{ { C_STRING_WITH_LEN("LEAST") }, BUILDER(Create_func_least)},
2736
{ { C_STRING_WITH_LEN("LN") }, BUILDER(Create_func_ln)},
1998
2737
{ { C_STRING_WITH_LEN("LOAD_FILE") }, BUILDER(Create_func_load_file)},
1999
2738
{ { C_STRING_WITH_LEN("LOCATE") }, BUILDER(Create_func_locate)},
2739
{ { C_STRING_WITH_LEN("LOG") }, BUILDER(Create_func_log)},
2740
{ { C_STRING_WITH_LEN("LOG10") }, BUILDER(Create_func_log10)},
2741
{ { C_STRING_WITH_LEN("LOG2") }, BUILDER(Create_func_log2)},
2000
2742
{ { C_STRING_WITH_LEN("LOWER") }, BUILDER(Create_func_lcase)},
2001
2743
{ { C_STRING_WITH_LEN("LPAD") }, BUILDER(Create_func_lpad)},
2002
2744
{ { C_STRING_WITH_LEN("LTRIM") }, BUILDER(Create_func_ltrim)},
2005
2747
{ { C_STRING_WITH_LEN("MONTHNAME") }, BUILDER(Create_func_monthname)},
2006
2748
{ { C_STRING_WITH_LEN("NULLIF") }, BUILDER(Create_func_nullif)},
2007
2749
{ { C_STRING_WITH_LEN("OCT") }, BUILDER(Create_func_oct)},
2750
{ { C_STRING_WITH_LEN("ORD") }, BUILDER(Create_func_ord)},
2008
2751
{ { C_STRING_WITH_LEN("PERIOD_ADD") }, BUILDER(Create_func_period_add)},
2009
2752
{ { C_STRING_WITH_LEN("PERIOD_DIFF") }, BUILDER(Create_func_period_diff)},
2010
2753
{ { C_STRING_WITH_LEN("PI") }, BUILDER(Create_func_pi)},
2754
{ { C_STRING_WITH_LEN("POW") }, BUILDER(Create_func_pow)},
2755
{ { C_STRING_WITH_LEN("POWER") }, BUILDER(Create_func_pow)},
2756
{ { C_STRING_WITH_LEN("QUOTE") }, BUILDER(Create_func_quote)},
2011
2757
{ { C_STRING_WITH_LEN("RADIANS") }, BUILDER(Create_func_radians)},
2758
{ { C_STRING_WITH_LEN("RAND") }, BUILDER(Create_func_rand)},
2012
2759
{ { C_STRING_WITH_LEN("ROUND") }, BUILDER(Create_func_round)},
2013
2760
{ { C_STRING_WITH_LEN("ROW_COUNT") }, BUILDER(Create_func_row_count)},
2014
2761
{ { C_STRING_WITH_LEN("RPAD") }, BUILDER(Create_func_rpad)},
2015
2762
{ { C_STRING_WITH_LEN("RTRIM") }, BUILDER(Create_func_rtrim)},
2016
2763
{ { C_STRING_WITH_LEN("SIGN") }, BUILDER(Create_func_sign)},
2764
{ { C_STRING_WITH_LEN("SIN") }, BUILDER(Create_func_sin)},
2017
2765
{ { C_STRING_WITH_LEN("SPACE") }, BUILDER(Create_func_space)},
2766
{ { C_STRING_WITH_LEN("SQRT") }, BUILDER(Create_func_sqrt)},
2018
2767
{ { C_STRING_WITH_LEN("STRCMP") }, BUILDER(Create_func_strcmp)},
2768
{ { C_STRING_WITH_LEN("SUBSTRING_INDEX") }, BUILDER(Create_func_substr_index)},
2019
2769
{ { C_STRING_WITH_LEN("TAN") }, BUILDER(Create_func_tan)},
2020
2770
{ { C_STRING_WITH_LEN("TIME_FORMAT") }, BUILDER(Create_func_time_format)},
2021
2771
{ { C_STRING_WITH_LEN("TO_DAYS") }, BUILDER(Create_func_to_days)},
2022
2772
{ { C_STRING_WITH_LEN("UCASE") }, BUILDER(Create_func_ucase)},
2773
{ { C_STRING_WITH_LEN("UNHEX") }, BUILDER(Create_func_unhex)},
2023
2774
{ { C_STRING_WITH_LEN("UNIX_TIMESTAMP") }, BUILDER(Create_func_unix_timestamp)},
2024
2775
{ { C_STRING_WITH_LEN("UPPER") }, BUILDER(Create_func_ucase)},
2776
{ { C_STRING_WITH_LEN("UUID") }, BUILDER(Create_func_uuid)},
2025
2777
{ { C_STRING_WITH_LEN("WEEKDAY") }, BUILDER(Create_func_weekday)},
2027
2779
{ {0, 0}, NULL}
2782
static map<string, Native_func_registry *> native_functions_map;
2031
2785
Load the hash table for native functions.
2032
2786
Note: this code is not thread safe, and is intended to be used at server
2056
2811
Create_func *builder= NULL;
2058
2813
string func_name(name.str, name.length);
2060
NativeFunctionsMap::iterator func_iter=
2061
FunctionContainer::getMap().find(func_name);
2063
if (func_iter != FunctionContainer::getMap().end())
2814
transform(func_name.begin(), func_name.end(), func_name.begin(), ::tolower);
2816
map<string, Native_func_registry *>::iterator func_iter=
2817
native_functions_map.find(func_name);
2819
if (func_iter != native_functions_map.end())
2065
2821
func= (*func_iter).second;
2066
2822
builder= func->builder;