diff options
Diffstat (limited to 'sql/item_create.cc')
-rw-r--r-- | sql/item_create.cc | 327 |
1 files changed, 299 insertions, 28 deletions
diff --git a/sql/item_create.cc b/sql/item_create.cc index 877e63047d6..4b313d49466 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +/* Copyright (C) 2000-2003 MySQL AB 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 @@ -34,14 +34,14 @@ Item *create_func_acos(Item* a) Item *create_func_aes_encrypt(Item* a, Item* b) { - return new Item_func_aes_encrypt(a, b); + return new Item_func_aes_encrypt(a, b); } - + Item *create_func_aes_decrypt(Item* a, Item* b) { return new Item_func_aes_decrypt(a, b); } - + Item *create_func_ascii(Item* a) { return new Item_func_ascii(a); @@ -76,9 +76,13 @@ Item *create_func_ceiling(Item* a) Item *create_func_connection_id(void) { THD *thd=current_thd; - thd->safe_to_cache_query=0; - return new Item_int(NullS,(longlong) thd->thread_id,10); -} + thd->lex->safe_to_cache_query= 0; + return new Item_int(NullS,(longlong) + ((thd->slave_thread) ? + thd->variables.pseudo_thread_id : + thd->thread_id), + 10); +} Item *create_func_conv(Item* a, Item *b, Item *c) { @@ -144,8 +148,8 @@ Item *create_func_floor(Item* a) Item *create_func_found_rows(void) { THD *thd=current_thd; - thd->safe_to_cache_query=0; - return new Item_int(NullS,(longlong) thd->found_rows(),21); + thd->lex->safe_to_cache_query= 0; + return new Item_func_found_rows(); } Item *create_func_from_days(Item* a) @@ -155,7 +159,7 @@ Item *create_func_from_days(Item* a) Item *create_func_get_lock(Item* a, Item *b) { - current_thd->safe_to_cache_query=0; + current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new Item_func_get_lock(a, b); } @@ -215,6 +219,11 @@ Item *create_func_bit_length(Item* a) return new Item_func_bit_length(a); } +Item *create_func_coercibility(Item* a) +{ + return new Item_func_coercibility(a); +} + Item *create_func_char_length(Item* a) { return new Item_func_char_length(a); @@ -242,7 +251,7 @@ Item *create_func_lpad(Item* a, Item *b, Item *c) Item *create_func_ltrim(Item* a) { - return new Item_func_ltrim(a,new Item_string(" ",1)); + return new Item_func_ltrim(a); } Item *create_func_md5(Item* a) @@ -283,7 +292,7 @@ Item *create_func_period_diff(Item* a, Item *b) Item *create_func_pi(void) { - return new Item_real(NullS,M_PI,6,8); + return new Item_real("pi()",M_PI,6,8); } Item *create_func_pow(Item* a, Item *b) @@ -300,7 +309,8 @@ Item *create_func_current_user() thd->safe_to_cache_query= 0; length= (uint) (strxmov(buff, thd->priv_user, "@", thd->priv_host, NullS) - buff); - return new Item_string(NullS, thd->memdup(buff, length), length); + return new Item_string(NullS, thd->memdup(buff, length), length, + system_charset_info); } Item *create_func_quarter(Item* a) @@ -308,11 +318,6 @@ Item *create_func_quarter(Item* a) return new Item_func_quarter(a); } -Item *create_func_password(Item* a) -{ - return new Item_func_password(a); -} - Item *create_func_radians(Item *a) { return new Item_func_units((char*) "radians",a,M_PI/180,0.0); @@ -320,7 +325,7 @@ Item *create_func_radians(Item *a) Item *create_func_release_lock(Item* a) { - current_thd->safe_to_cache_query=0; + current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new Item_func_release_lock(a); } @@ -341,7 +346,7 @@ Item *create_func_rpad(Item* a, Item *b, Item *c) Item *create_func_rtrim(Item* a) { - return new Item_func_rtrim(a,new Item_string(" ",1)); + return new Item_func_rtrim(a); } Item *create_func_sec_to_time(Item* a) @@ -361,12 +366,26 @@ Item *create_func_sin(Item* a) Item *create_func_sha(Item* a) { - return new Item_func_sha(a); + return new Item_func_sha(a); } - + Item *create_func_space(Item *a) { - return new Item_func_repeat(new Item_string(" ",1),a); + CHARSET_INFO *cs= current_thd->variables.collation_connection; + Item *sp; + + if (cs->mbminlen > 1) + { + uint dummy_errors; + sp= new Item_string("",0,cs); + if (sp) + sp->str_value.copy(" ", 1, &my_charset_latin1, cs, &dummy_errors); + } + else + { + sp= new Item_string(" ",1,cs); + } + return sp ? new Item_func_repeat(sp, a) : 0; } Item *create_func_soundex(Item* a) @@ -409,9 +428,21 @@ Item *create_func_ucase(Item* a) return new Item_func_ucase(a); } +Item *create_func_unhex(Item* a) +{ + return new Item_func_unhex(a); +} + +Item *create_func_uuid(void) +{ + return new Item_func_uuid(); +} + Item *create_func_version(void) { - return new Item_string(NullS,server_version, strlen(server_version)); + return new Item_string(NullS,server_version, + (uint) strlen(server_version), + system_charset_info, DERIVATION_SYSCONST); } Item *create_func_weekday(Item* a) @@ -426,33 +457,273 @@ Item *create_func_year(Item* a) Item *create_load_file(Item* a) { - current_thd->safe_to_cache_query=0; + current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new Item_load_file(a); } -Item *create_func_cast(Item *a, Item_cast cast_type) + +Item *create_func_cast(Item *a, Cast_target cast_type, int len, + CHARSET_INFO *cs) { Item *res; LINT_INIT(res); + switch (cast_type) { case ITEM_CAST_BINARY: res= new Item_func_binary(a); break; - case ITEM_CAST_CHAR: res= new Item_char_typecast(a); break; case ITEM_CAST_SIGNED_INT: res= new Item_func_signed(a); break; case ITEM_CAST_UNSIGNED_INT: res= new Item_func_unsigned(a); break; case ITEM_CAST_DATE: res= new Item_date_typecast(a); break; case ITEM_CAST_TIME: res= new Item_time_typecast(a); break; case ITEM_CAST_DATETIME: res= new Item_datetime_typecast(a); break; + case ITEM_CAST_CHAR: + res= new Item_char_typecast(a, len, cs ? cs : + current_thd->variables.collation_connection); + break; } return res; } Item *create_func_is_free_lock(Item* a) { - current_thd->safe_to_cache_query=0; + current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new Item_func_is_free_lock(a); } +Item *create_func_is_used_lock(Item* a) +{ + current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + return new Item_func_is_used_lock(a); +} + Item *create_func_quote(Item* a) { return new Item_func_quote(a); } + +#ifdef HAVE_SPATIAL +Item *create_func_as_wkt(Item *a) +{ + return new Item_func_as_wkt(a); +} + +Item *create_func_as_wkb(Item *a) +{ + return new Item_func_as_wkb(a); +} + +Item *create_func_srid(Item *a) +{ + return new Item_func_srid(a); +} + +Item *create_func_startpoint(Item *a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_STARTPOINT); +} + +Item *create_func_endpoint(Item *a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_ENDPOINT); +} + +Item *create_func_exteriorring(Item *a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_EXTERIORRING); +} + +Item *create_func_pointn(Item *a, Item *b) +{ + return new Item_func_spatial_decomp_n(a, b, Item_func::SP_POINTN); +} + +Item *create_func_interiorringn(Item *a, Item *b) +{ + return new Item_func_spatial_decomp_n(a, b, Item_func::SP_INTERIORRINGN); +} + +Item *create_func_geometryn(Item *a, Item *b) +{ + return new Item_func_spatial_decomp_n(a, b, Item_func::SP_GEOMETRYN); +} + +Item *create_func_centroid(Item *a) +{ + return new Item_func_centroid(a); +} + +Item *create_func_envelope(Item *a) +{ + return new Item_func_envelope(a); +} + +Item *create_func_equals(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_EQUALS_FUNC); +} + +Item *create_func_disjoint(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_DISJOINT_FUNC); +} + +Item *create_func_intersects(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_INTERSECTS_FUNC); +} + +Item *create_func_touches(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_TOUCHES_FUNC); +} + +Item *create_func_crosses(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_CROSSES_FUNC); +} + +Item *create_func_within(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_WITHIN_FUNC); +} + +Item *create_func_contains(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_CONTAINS_FUNC); +} + +Item *create_func_overlaps(Item *a, Item *b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_OVERLAPS_FUNC); +} + +Item *create_func_isempty(Item *a) +{ + return new Item_func_isempty(a); +} + +Item *create_func_issimple(Item *a) +{ + return new Item_func_issimple(a); +} + +Item *create_func_isclosed(Item *a) +{ + return new Item_func_isclosed(a); +} + +Item *create_func_geometry_type(Item *a) +{ + return new Item_func_geometry_type(a); +} + +Item *create_func_dimension(Item *a) +{ + return new Item_func_dimension(a); +} + +Item *create_func_x(Item *a) +{ + return new Item_func_x(a); +} + +Item *create_func_y(Item *a) +{ + return new Item_func_y(a); +} + +Item *create_func_numpoints(Item *a) +{ + return new Item_func_numpoints(a); +} + +Item *create_func_numinteriorring(Item *a) +{ + return new Item_func_numinteriorring(a); +} + +Item *create_func_numgeometries(Item *a) +{ + return new Item_func_numgeometries(a); +} + +Item *create_func_area(Item *a) +{ + return new Item_func_area(a); +} + +Item *create_func_glength(Item *a) +{ + return new Item_func_glength(a); +} + +Item *create_func_point(Item *a, Item *b) +{ + return new Item_func_point(a, b); +} +#endif /*HAVE_SPATIAL*/ + +Item *create_func_crc32(Item* a) +{ + return new Item_func_crc32(a); +} + +Item *create_func_compress(Item* a) +{ + return new Item_func_compress(a); +} + +Item *create_func_uncompress(Item* a) +{ + return new Item_func_uncompress(a); +} + +Item *create_func_uncompressed_length(Item* a) +{ + return new Item_func_uncompressed_length(a); +} + +Item *create_func_datediff(Item *a, Item *b) +{ + return new Item_func_minus(new Item_func_to_days(a), + new Item_func_to_days(b)); +} + +Item *create_func_weekofyear(Item *a) +{ + return new Item_func_week(a, new Item_int((char*) "0", 3, 1)); +} + +Item *create_func_makedate(Item* a,Item* b) +{ + return new Item_func_makedate(a, b); +} + +Item *create_func_addtime(Item* a,Item* b) +{ + return new Item_func_add_time(a, b, 0, 0); +} + +Item *create_func_subtime(Item* a,Item* b) +{ + return new Item_func_add_time(a, b, 0, 1); +} + +Item *create_func_timediff(Item* a,Item* b) +{ + return new Item_func_timediff(a, b); +} + +Item *create_func_maketime(Item* a,Item* b,Item* c) +{ + return new Item_func_maketime(a, b, c); +} + +Item *create_func_str_to_date(Item* a,Item* b) +{ + return new Item_func_str_to_date(a, b); +} + +Item *create_func_last_day(Item *a) +{ + return new Item_func_last_day(a); +} |