1 /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23 /**
24 @file
25
26 @brief
27 This file defines all numerical functions
28 */
29
30 #include "item_func.h"
31
32 #include "my_bit.h" // my_count_bits
33 #include "auth_common.h" // check_password_strength
34 #include "binlog.h" // mysql_bin_log
35 #include "debug_sync.h" // DEBUG_SYNC
36 #include "item_cmpfunc.h" // get_datetime_value
37 #include "item_strfunc.h" // Item_func_geohash
38 #include <mysql/service_thd_wait.h>
39 #include "parse_tree_helpers.h" // PT_item_list
40 #include "rpl_mi.h" // Master_info
41 #include "rpl_msr.h" // channel_map
42 #include "rpl_rli.h" // Relay_log_info
43 #include "sp.h" // sp_find_routine
44 #include "sp_head.h" // sp_name
45 #include "sql_audit.h" // audit_global_variable
46 #include "sql_base.h" // Internal_error_handler_holder
47 #include "sql_class.h" // THD
48 #include "sql_optimizer.h" // JOIN
49 #include "sql_parse.h" // check_stack_overrun
50 #include "sql_show.h" // append_identifier
51 #include "sql_time.h" // TIME_from_longlong_packed
52 #include "strfunc.h" // find_type
53 #include "item_json_func.h" // Item_func_json_quote
54 #include <cfloat> // DBL_DIG
55
56 using std::min;
57 using std::max;
58
check_reserved_words(LEX_STRING * name)59 bool check_reserved_words(LEX_STRING *name)
60 {
61 if (!my_strcasecmp(system_charset_info, name->str, "GLOBAL") ||
62 !my_strcasecmp(system_charset_info, name->str, "LOCAL") ||
63 !my_strcasecmp(system_charset_info, name->str, "SESSION"))
64 return TRUE;
65 return FALSE;
66 }
67
68
69 /**
70 Evaluate a constant condition, represented by an Item tree
71
72 @param thd Thread handler
73 @param cond The constant condition to evaluate
74 @param[out] value Returned value, either true or false
75
76 @returns false if evaluation is successful, true otherwise
77 */
78
eval_const_cond(THD * thd,Item * cond,bool * value)79 bool eval_const_cond(THD *thd, Item *cond, bool *value)
80 {
81 DBUG_ASSERT(cond->const_item());
82 *value= cond->val_int();
83 return thd->is_error();
84 }
85
86
87 /**
88 Test if the sum of arguments overflows the ulonglong range.
89 */
test_if_sum_overflows_ull(ulonglong arg1,ulonglong arg2)90 static inline bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2)
91 {
92 return ULLONG_MAX - arg1 < arg2;
93 }
94
set_arguments(List<Item> & list,bool context_free)95 void Item_func::set_arguments(List<Item> &list, bool context_free)
96 {
97 allowed_arg_cols= 1;
98 arg_count=list.elements;
99 args= tmp_arg; // If 2 arguments
100 if (arg_count <= 2 || (args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
101 {
102 List_iterator_fast<Item> li(list);
103 Item *item;
104 Item **save_args= args;
105
106 while ((item=li++))
107 {
108 *(save_args++)= item;
109 if (!context_free)
110 with_sum_func|= item->with_sum_func;
111 }
112 }
113 else
114 arg_count= 0; // OOM
115 list.empty(); // Fields are used
116 }
117
Item_func(List<Item> & list)118 Item_func::Item_func(List<Item> &list)
119 :allowed_arg_cols(1)
120 {
121 set_arguments(list, false);
122 }
123
124
Item_func(const POS & pos,PT_item_list * opt_list)125 Item_func::Item_func(const POS &pos, PT_item_list *opt_list)
126 : super(pos), allowed_arg_cols(1)
127 {
128 if (opt_list == NULL)
129 {
130 args= tmp_arg;
131 arg_count= 0;
132 }
133 else
134 set_arguments(opt_list->value, true);
135 }
136
Item_func(THD * thd,Item_func * item)137 Item_func::Item_func(THD *thd, Item_func *item)
138 :Item_result_field(thd, item),
139 const_item_cache(0),
140 allowed_arg_cols(item->allowed_arg_cols),
141 used_tables_cache(item->used_tables_cache),
142 not_null_tables_cache(item->not_null_tables_cache),
143 arg_count(item->arg_count)
144 {
145 if (arg_count)
146 {
147 if (arg_count <=2)
148 args= tmp_arg;
149 else
150 {
151 if (!(args=(Item**) thd->alloc(sizeof(Item*)*arg_count)))
152 return;
153 }
154 memcpy((char*) args, (char*) item->args, sizeof(Item*)*arg_count);
155 }
156 }
157
158
itemize(Parse_context * pc,Item ** res)159 bool Item_func::itemize(Parse_context *pc, Item **res)
160 {
161 if (skip_itemize(res))
162 return false;
163 if (super::itemize(pc, res))
164 return true;
165 with_sum_func= 0;
166 const bool no_named_params= !may_have_named_parameters();
167 for (size_t i= 0; i < arg_count; i++)
168 {
169 with_sum_func|= args[i]->with_sum_func;
170 if (args[i]->itemize(pc, &args[i]))
171 return true;
172 if (no_named_params && !args[i]->item_name.is_autogenerated())
173 {
174 my_error(functype() == FUNC_SP ? ER_WRONG_PARAMETERS_TO_STORED_FCT
175 : ER_WRONG_PARAMETERS_TO_NATIVE_FCT,
176 MYF(0), func_name());
177 return true;
178 }
179 }
180 return false;
181 }
182
183
184 /*
185 Resolve references to table column for a function and its argument
186
187 SYNOPSIS:
188 fix_fields()
189 thd Thread object
190 ref Pointer to where this object is used. This reference
191 is used if we want to replace this object with another
192 one (for example in the summary functions).
193
194 DESCRIPTION
195 Call fix_fields() for all arguments to the function. The main intention
196 is to allow all Item_field() objects to setup pointers to the table fields.
197
198 Sets as a side effect the following class variables:
199 maybe_null Set if any argument may return NULL
200 with_sum_func Set if any of the arguments contains a sum function
201 used_tables_cache Set to union of the tables used by arguments
202
203 str_value.charset If this is a string function, set this to the
204 character set for the first argument.
205 If any argument is binary, this is set to binary
206
207 If for any item any of the defaults are wrong, then this can
208 be fixed in the fix_length_and_dec() function that is called
209 after this one or by writing a specialized fix_fields() for the
210 item.
211
212 RETURN VALUES
213 FALSE ok
214 TRUE Got error. Stored with my_error().
215 */
216
217 bool
fix_fields(THD * thd,Item ** ref)218 Item_func::fix_fields(THD *thd, Item **ref)
219 {
220 DBUG_ASSERT(fixed == 0 || basic_const_item());
221
222 Item **arg,**arg_end;
223 uchar buff[STACK_BUFF_ALLOC]; // Max argument in function
224
225 /*
226 Semi-join flattening should only be performed for top-level
227 predicates. Disable it for predicates that live under an
228 Item_func.
229 */
230 Disable_semijoin_flattening DSF(thd->lex->current_select(), true);
231
232 used_tables_cache= get_initial_pseudo_tables();
233 not_null_tables_cache= 0;
234 const_item_cache=1;
235
236 /*
237 Use stack limit of STACK_MIN_SIZE * 2 since
238 on some platforms a recursive call to fix_fields
239 requires more than STACK_MIN_SIZE bytes (e.g. for
240 MIPS, it takes about 22kB to make one recursive
241 call to Item_func::fix_fields())
242 */
243 if (check_stack_overrun(thd, STACK_MIN_SIZE * 2, buff))
244 return TRUE; // Fatal error if flag is set!
245 if (arg_count)
246 { // Print purify happy
247 for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
248 {
249 if (fix_func_arg(thd, arg))
250 return true;
251 }
252 }
253 fix_length_and_dec();
254 if (thd->is_error()) // An error inside fix_length_and_dec occured
255 return TRUE;
256 fixed= 1;
257 return FALSE;
258 }
259
260
fix_func_arg(THD * thd,Item ** arg)261 bool Item_func::fix_func_arg(THD *thd, Item **arg)
262 {
263 if ((!(*arg)->fixed && (*arg)->fix_fields(thd, arg)))
264 return true; /* purecov: inspected */
265 Item *item= *arg;
266
267 if (allowed_arg_cols)
268 {
269 if (item->check_cols(allowed_arg_cols))
270 return true;
271 }
272 else
273 {
274 /* we have to fetch allowed_arg_cols from first argument */
275 DBUG_ASSERT(arg == args); // it is first argument
276 allowed_arg_cols= item->cols();
277 DBUG_ASSERT(allowed_arg_cols); // Can't be 0 any more
278 }
279
280 maybe_null|= item->maybe_null;
281 with_sum_func|= item->with_sum_func;
282 used_tables_cache|= item->used_tables();
283 not_null_tables_cache|= item->not_null_tables();
284 const_item_cache&= item->const_item();
285 with_subselect|= item->has_subquery();
286 with_stored_program|= item->has_stored_program();
287 return false;
288 }
289
fix_after_pullout(st_select_lex * parent_select,st_select_lex * removed_select)290 void Item_func::fix_after_pullout(st_select_lex *parent_select,
291 st_select_lex *removed_select)
292 {
293 if (const_item())
294 {
295 /*
296 Pulling out a const item changes nothing to it. Moreover, some items may
297 have decided that they're const by some other logic than the generic
298 one below, and we must preserve that decision.
299 */
300 return;
301 }
302
303 Item **arg,**arg_end;
304
305 used_tables_cache= get_initial_pseudo_tables();
306 not_null_tables_cache= 0;
307 const_item_cache=1;
308
309 if (arg_count)
310 {
311 for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
312 {
313 Item *const item= *arg;
314 item->fix_after_pullout(parent_select, removed_select);
315
316 used_tables_cache|= item->used_tables();
317 not_null_tables_cache|= item->not_null_tables();
318 const_item_cache&= item->const_item();
319 }
320 }
321 }
322
323
walk(Item_processor processor,enum_walk walk,uchar * argument)324 bool Item_func::walk(Item_processor processor, enum_walk walk, uchar *argument)
325 {
326 if ((walk & WALK_PREFIX) && (this->*processor)(argument))
327 return true;
328
329 Item **arg, **arg_end;
330 for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
331 {
332 if ((*arg)->walk(processor, walk, argument))
333 return true;
334 }
335 return (walk & WALK_POSTFIX) && (this->*processor)(argument);
336 }
337
traverse_cond(Cond_traverser traverser,void * argument,traverse_order order)338 void Item_func::traverse_cond(Cond_traverser traverser,
339 void *argument, traverse_order order)
340 {
341 if (arg_count)
342 {
343 Item **arg,**arg_end;
344
345 switch (order) {
346 case(PREFIX):
347 (*traverser)(this, argument);
348 for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
349 {
350 (*arg)->traverse_cond(traverser, argument, order);
351 }
352 break;
353 case (POSTFIX):
354 for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
355 {
356 (*arg)->traverse_cond(traverser, argument, order);
357 }
358 (*traverser)(this, argument);
359 }
360 }
361 else
362 (*traverser)(this, argument);
363 }
364
365
366 /**
367 Transform an Item_func object with a transformer callback function.
368
369 The function recursively applies the transform method to each
370 argument of the Item_func node.
371 If the call of the method for an argument item returns a new item
372 the old item is substituted for a new one.
373 After this the transformer is applied to the root node
374 of the Item_func object.
375 @param transformer the transformer callback function to be applied to
376 the nodes of the tree of the object
377 @param argument parameter to be passed to the transformer
378
379 @return
380 Item returned as the result of transformation of the root node
381 */
382
transform(Item_transformer transformer,uchar * argument)383 Item *Item_func::transform(Item_transformer transformer, uchar *argument)
384 {
385 DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare());
386
387 if (arg_count)
388 {
389 Item **arg,**arg_end;
390 for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
391 {
392 Item *new_item= (*arg)->transform(transformer, argument);
393 if (!new_item)
394 return 0;
395
396 /*
397 THD::change_item_tree() should be called only if the tree was
398 really transformed, i.e. when a new item has been created.
399 Otherwise we'll be allocating a lot of unnecessary memory for
400 change records at each execution.
401 */
402 if (*arg != new_item)
403 current_thd->change_item_tree(arg, new_item);
404 }
405 }
406 return (this->*transformer)(argument);
407 }
408
409
410 /**
411 Compile Item_func object with a processor and a transformer
412 callback functions.
413
414 First the function applies the analyzer to the root node of
415 the Item_func object. Then if the analizer succeeeds (returns TRUE)
416 the function recursively applies the compile method to each argument
417 of the Item_func node.
418 If the call of the method for an argument item returns a new item
419 the old item is substituted for a new one.
420 After this the transformer is applied to the root node
421 of the Item_func object.
422
423 @param analyzer the analyzer callback function to be applied to the
424 nodes of the tree of the object
425 @param[in,out] arg_p parameter to be passed to the processor
426 @param transformer the transformer callback function to be applied to the
427 nodes of the tree of the object
428 @param arg_t parameter to be passed to the transformer
429
430 @return Item returned as result of transformation of the node,
431 the same item if no transformation applied, or NULL if
432 transformation caused an error.
433 */
434
compile(Item_analyzer analyzer,uchar ** arg_p,Item_transformer transformer,uchar * arg_t)435 Item *Item_func::compile(Item_analyzer analyzer, uchar **arg_p,
436 Item_transformer transformer, uchar *arg_t)
437 {
438 if (!(this->*analyzer)(arg_p))
439 return this;
440 if (arg_count)
441 {
442 Item **arg,**arg_end;
443 for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
444 {
445 /*
446 The same parameter value of arg_p must be passed
447 to analyze any argument of the condition formula.
448 */
449 uchar *arg_v= *arg_p;
450 Item *new_item= (*arg)->compile(analyzer, &arg_v, transformer, arg_t);
451 if (new_item == NULL)
452 return NULL;
453 if (*arg != new_item)
454 current_thd->change_item_tree(arg, new_item);
455 }
456 }
457 return (this->*transformer)(arg_t);
458 }
459
460 /**
461 See comments in Item_cmp_func::split_sum_func()
462 */
463
split_sum_func(THD * thd,Ref_ptr_array ref_pointer_array,List<Item> & fields)464 void Item_func::split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array,
465 List<Item> &fields)
466 {
467 Item **arg, **arg_end;
468 for (arg= args, arg_end= args+arg_count; arg != arg_end ; arg++)
469 (*arg)->split_sum_func2(thd, ref_pointer_array, fields, arg, TRUE);
470 }
471
472
update_used_tables()473 void Item_func::update_used_tables()
474 {
475 used_tables_cache= get_initial_pseudo_tables();
476 const_item_cache=1;
477 with_subselect= false;
478 with_stored_program= false;
479 for (uint i=0 ; i < arg_count ; i++)
480 {
481 args[i]->update_used_tables();
482 used_tables_cache|=args[i]->used_tables();
483 const_item_cache&=args[i]->const_item();
484 with_subselect|= args[i]->has_subquery();
485 with_stored_program|= args[i]->has_stored_program();
486 }
487 }
488
489
fix_after_pullout(SELECT_LEX * parent_select,SELECT_LEX * removed_select)490 void Item_func_sp::fix_after_pullout(SELECT_LEX *parent_select,
491 SELECT_LEX *removed_select)
492 {
493 Item_func::fix_after_pullout(parent_select, removed_select);
494
495 /*
496 Prevents function from being evaluated before it is locked.
497 @todo - make this dependent on READS SQL or MODIFIES SQL.
498 Due to a limitation in how functions are evaluated, we need to
499 ensure that we are in a prelocked mode even though the function
500 doesn't reference any tables.
501 */
502 used_tables_cache|= PARAM_TABLE_BIT;
503 }
504
505
used_tables() const506 table_map Item_func::used_tables() const
507 {
508 return used_tables_cache;
509 }
510
511
not_null_tables() const512 table_map Item_func::not_null_tables() const
513 {
514 return not_null_tables_cache;
515 }
516
517
print(String * str,enum_query_type query_type)518 void Item_func::print(String *str, enum_query_type query_type)
519 {
520 str->append(func_name());
521 str->append('(');
522 print_args(str, 0, query_type);
523 str->append(')');
524 }
525
526
print_args(String * str,uint from,enum_query_type query_type)527 void Item_func::print_args(String *str, uint from, enum_query_type query_type)
528 {
529 for (uint i=from ; i < arg_count ; i++)
530 {
531 if (i != from)
532 str->append(',');
533 args[i]->print(str, query_type);
534 }
535 }
536
537
print_op(String * str,enum_query_type query_type)538 void Item_func::print_op(String *str, enum_query_type query_type)
539 {
540 str->append('(');
541 for (uint i=0 ; i < arg_count-1 ; i++)
542 {
543 args[i]->print(str, query_type);
544 str->append(' ');
545 str->append(func_name());
546 str->append(' ');
547 }
548 args[arg_count-1]->print(str, query_type);
549 str->append(')');
550 }
551
552 /// @note Please keep in sync with Item_sum::eq().
eq(const Item * item,bool binary_cmp) const553 bool Item_func::eq(const Item *item, bool binary_cmp) const
554 {
555 /* Assume we don't have rtti */
556 if (this == item)
557 return 1;
558 if (item->type() != FUNC_ITEM)
559 return 0;
560 Item_func *item_func=(Item_func*) item;
561 Item_func::Functype func_type;
562 if ((func_type= functype()) != item_func->functype() ||
563 arg_count != item_func->arg_count ||
564 (func_type != Item_func::FUNC_SP &&
565 func_name() != item_func->func_name()) ||
566 (func_type == Item_func::FUNC_SP &&
567 my_strcasecmp(system_charset_info, func_name(), item_func->func_name())))
568 return 0;
569 for (uint i=0; i < arg_count ; i++)
570 if (!args[i]->eq(item_func->args[i], binary_cmp))
571 return 0;
572 return 1;
573 }
574
575
tmp_table_field(TABLE * table)576 Field *Item_func::tmp_table_field(TABLE *table)
577 {
578 Field *field= NULL;
579
580 switch (result_type()) {
581 case INT_RESULT:
582 if (max_char_length() > MY_INT32_NUM_DECIMAL_DIGITS)
583 field= new Field_longlong(max_char_length(), maybe_null, item_name.ptr(),
584 unsigned_flag);
585 else
586 field= new Field_long(max_char_length(), maybe_null, item_name.ptr(),
587 unsigned_flag);
588 break;
589 case REAL_RESULT:
590 field= new Field_double(max_char_length(), maybe_null, item_name.ptr(), decimals);
591 break;
592 case STRING_RESULT:
593 return make_string_field(table);
594 break;
595 case DECIMAL_RESULT:
596 field= Field_new_decimal::create_from_item(this);
597 break;
598 case ROW_RESULT:
599 default:
600 // This case should never be chosen
601 DBUG_ASSERT(0);
602 field= 0;
603 break;
604 }
605 if (field)
606 field->init(table);
607 return field;
608 }
609
610
val_decimal(my_decimal * decimal_value)611 my_decimal *Item_func::val_decimal(my_decimal *decimal_value)
612 {
613 DBUG_ASSERT(fixed);
614 longlong nr= val_int();
615 if (null_value)
616 return 0; /* purecov: inspected */
617 int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
618 return decimal_value;
619 }
620
621
save_possibly_as_json(Field * field,bool no_conversions)622 type_conversion_status Item_func::save_possibly_as_json(Field *field,
623 bool no_conversions)
624 {
625 if (field->type() == MYSQL_TYPE_JSON)
626 {
627 // Store the value in the JSON binary format.
628 Field_json *f= down_cast<Field_json *>(field);
629 Json_wrapper wr;
630 val_json(&wr);
631
632 if (null_value)
633 return set_field_to_null(field);
634
635 field->set_notnull();
636 return f->store_json(&wr);
637 }
638 else
639 {
640 // TODO Convert the JSON value to text.
641 return Item_func::save_in_field_inner(field, no_conversions);
642 }
643 }
644
val_str(String * str)645 String *Item_real_func::val_str(String *str)
646 {
647 DBUG_ASSERT(fixed == 1);
648 double nr= val_real();
649 if (null_value)
650 return 0; /* purecov: inspected */
651 str->set_real(nr, decimals, collation.collation);
652 return str;
653 }
654
655
val_decimal(my_decimal * decimal_value)656 my_decimal *Item_real_func::val_decimal(my_decimal *decimal_value)
657 {
658 DBUG_ASSERT(fixed);
659 double nr= val_real();
660 if (null_value)
661 return 0; /* purecov: inspected */
662 double2my_decimal(E_DEC_FATAL_ERROR, nr, decimal_value);
663 return decimal_value;
664 }
665
666
fix_num_length_and_dec()667 void Item_func::fix_num_length_and_dec()
668 {
669 uint fl_length= 0;
670 decimals=0;
671 for (uint i=0 ; i < arg_count ; i++)
672 {
673 set_if_bigger(decimals,args[i]->decimals);
674 set_if_bigger(fl_length, args[i]->max_length);
675 }
676 max_length=float_length(decimals);
677 if (fl_length > max_length)
678 {
679 decimals= NOT_FIXED_DEC;
680 max_length= float_length(NOT_FIXED_DEC);
681 }
682 }
683
684
fix_num_length_and_dec()685 void Item_func_numhybrid::fix_num_length_and_dec()
686 {}
687
688
689
690 /**
691 Count max_length and decimals for temporal functions.
692
693 @param item Argument array
694 @param nitems Number of arguments in the array.
695
696 @retval False on success, true on error.
697 */
count_datetime_length(Item ** item,uint nitems)698 void Item_func::count_datetime_length(Item **item, uint nitems)
699 {
700 unsigned_flag= 0;
701 decimals= 0;
702 if (field_type() != MYSQL_TYPE_DATE)
703 {
704 for (uint i= 0; i < nitems; i++)
705 set_if_bigger(decimals,
706 field_type() == MYSQL_TYPE_TIME ?
707 item[i]->time_precision() : item[i]->datetime_precision());
708 }
709 set_if_smaller(decimals, DATETIME_MAX_DECIMALS);
710 uint len= decimals ? (decimals + 1) : 0;
711 switch (field_type())
712 {
713 case MYSQL_TYPE_DATETIME:
714 case MYSQL_TYPE_TIMESTAMP:
715 len+= MAX_DATETIME_WIDTH;
716 break;
717 case MYSQL_TYPE_DATE:
718 case MYSQL_TYPE_NEWDATE:
719 len+= MAX_DATE_WIDTH;
720 break;
721 case MYSQL_TYPE_TIME:
722 len+= MAX_TIME_WIDTH;
723 break;
724 default:
725 DBUG_ASSERT(0);
726 }
727 fix_char_length(len);
728 }
729
730 /**
731 Set max_length/decimals of function if function is fixed point and
732 result length/precision depends on argument ones.
733
734 @param item Argument array.
735 @param nitems Number of arguments in the array.
736
737 This function doesn't set unsigned_flag. Call agg_result_type()
738 first to do that.
739 */
740
count_decimal_length(Item ** item,uint nitems)741 void Item_func::count_decimal_length(Item **item, uint nitems)
742 {
743 int max_int_part= 0;
744 decimals= 0;
745 for (uint i=0 ; i < nitems ; i++)
746 {
747 set_if_bigger(decimals, item[i]->decimals);
748 set_if_bigger(max_int_part, item[i]->decimal_int_part());
749 }
750 int precision= min(max_int_part + decimals, DECIMAL_MAX_PRECISION);
751 fix_char_length(my_decimal_precision_to_length_no_truncation(precision,
752 decimals,
753 unsigned_flag));
754 }
755
756 /**
757 Set char_length to the maximum number of characters required by any
758 of this function's arguments.
759
760 This function doesn't set unsigned_flag. Call agg_result_type()
761 first to do that.
762 */
763
count_only_length(Item ** item,uint nitems)764 void Item_func::count_only_length(Item **item, uint nitems)
765 {
766 uint32 char_length= 0;
767 for (uint i= 0; i < nitems; i++)
768 set_if_bigger(char_length, item[i]->max_char_length());
769 fix_char_length(char_length);
770 }
771
772 /**
773 Set max_length/decimals of function if function is floating point and
774 result length/precision depends on argument ones.
775
776 @param item Argument array.
777 @param nitems Number of arguments in the array.
778 */
779
count_real_length(Item ** item,uint nitems)780 void Item_func::count_real_length(Item **item, uint nitems)
781 {
782 uint32 length= 0;
783 decimals= 0;
784 max_length= 0;
785 for (uint i=0 ; i < nitems; i++)
786 {
787 if (decimals != NOT_FIXED_DEC)
788 {
789 set_if_bigger(decimals, item[i]->decimals);
790 set_if_bigger(length, (item[i]->max_length - item[i]->decimals));
791 }
792 set_if_bigger(max_length, item[i]->max_length);
793 }
794 if (decimals != NOT_FIXED_DEC)
795 {
796 max_length= length;
797 length+= decimals;
798 if (length < max_length) // If previous operation gave overflow
799 max_length= UINT_MAX32;
800 else
801 max_length= length;
802 }
803 }
804
805 /**
806 Calculate max_length and decimals for STRING_RESULT functions.
807
808 @param field_type Field type.
809 @param items Argument array.
810 @param nitems Number of arguments.
811
812 @retval False on success, true on error.
813 */
count_string_result_length(enum_field_types field_type,Item ** items,uint nitems)814 bool Item_func::count_string_result_length(enum_field_types field_type,
815 Item **items, uint nitems)
816 {
817 if (agg_arg_charsets_for_string_result(collation, items, nitems))
818 return true;
819 if (is_temporal_type(field_type))
820 count_datetime_length(items, nitems);
821 else
822 {
823 decimals= NOT_FIXED_DEC;
824 count_only_length(items, nitems);
825 }
826 return false;
827 }
828
829
signal_divide_by_null()830 void Item_func::signal_divide_by_null()
831 {
832 THD *thd= current_thd;
833 if (thd->variables.sql_mode & MODE_ERROR_FOR_DIVISION_BY_ZERO)
834 push_warning(thd, Sql_condition::SL_WARNING, ER_DIVISION_BY_ZERO,
835 ER(ER_DIVISION_BY_ZERO));
836 null_value= 1;
837 }
838
839
signal_invalid_argument_for_log()840 void Item_func::signal_invalid_argument_for_log()
841 {
842 THD *thd= current_thd;
843 push_warning(thd, Sql_condition::SL_WARNING,
844 ER_INVALID_ARGUMENT_FOR_LOGARITHM,
845 ER(ER_INVALID_ARGUMENT_FOR_LOGARITHM));
846 null_value= TRUE;
847 }
848
849
get_tmp_table_item(THD * thd)850 Item *Item_func::get_tmp_table_item(THD *thd)
851 {
852 if (!with_sum_func && !const_item())
853 return new Item_field(result_field);
854 return copy_or_same(thd);
855 }
856
857 const Item_field*
contributes_to_filter(table_map read_tables,table_map filter_for_table,const MY_BITMAP * fields_to_ignore) const858 Item_func::contributes_to_filter(table_map read_tables,
859 table_map filter_for_table,
860 const MY_BITMAP *fields_to_ignore) const
861 {
862 DBUG_ASSERT((read_tables & filter_for_table) == 0);
863 /*
864 Multiple equality (Item_equal) should not call this function
865 because it would reject valid comparisons.
866 */
867 DBUG_ASSERT(functype() != MULT_EQUAL_FUNC);
868
869 /*
870 To contribute to filering effect, the condition must refer to
871 exactly one unread table: the table filtering is currently
872 calculated for.
873 */
874 if ((used_tables() & ~read_tables) != filter_for_table)
875 return NULL;
876
877 /*
878 Whether or not this Item_func has an operand that is a field in
879 'filter_for_table' that is not in 'fields_to_ignore'.
880 */
881 Item_field* usable_field= NULL;
882
883 /*
884 Whether or not this Item_func has an operand that can be used as
885 available value. arg_count==1 for Items with implicit values like
886 "field IS NULL".
887 */
888 bool found_comparable= (arg_count == 1);
889
890 for (uint i= 0; i < arg_count; i++)
891 {
892 const Item::Type arg_type= args[i]->real_item()->type();
893
894 if (arg_type == Item::SUBSELECT_ITEM)
895 {
896 if (args[i]->const_item())
897 {
898 // Constant subquery, i.e., not a dependent subquery.
899 found_comparable= true;
900 continue;
901 }
902
903 /*
904 This is either "fld OP <dependent_subquery>" or "fld BETWEEN X
905 and Y" where either X or Y is a dependent subquery. Filtering
906 effect should not be calculated for this item because the cost
907 of evaluating the dependent subquery is currently not
908 calculated and its accompanying filtering effect is too
909 uncertain. See WL#7384.
910 */
911 return NULL;
912 } // ... if subquery.
913
914 const table_map used_tabs= args[i]->used_tables();
915
916 if (arg_type == Item::FIELD_ITEM && (used_tabs == filter_for_table))
917 {
918 /*
919 The qualifying table of args[i] is filter_for_table. args[i]
920 may be a field or a reference to a field, e.g. through a
921 view.
922 */
923 Item_field *fld= static_cast<Item_field*>(args[i]->real_item());
924
925 /*
926 Use args[i] as value if
927 1) this field shall be ignored, or
928 2) a usable field has already been found (meaning that
929 this is "filter_for_table.colX OP filter_for_table.colY").
930 */
931 if (bitmap_is_set(fields_to_ignore, fld->field->field_index) || // 1)
932 usable_field) // 2)
933 {
934 found_comparable= true;
935 continue;
936 }
937
938 /*
939 This field shall contribute to filtering effect if a
940 value is found for it
941 */
942 usable_field= fld;
943 } // if field.
944 else
945 {
946 /*
947 It's not a subquery. May be a function, a constant, an outer
948 reference, a field of another table...
949
950 Already checked that this predicate does not refer to tables
951 later in the join sequence. Verify it:
952 */
953 DBUG_ASSERT(!(used_tabs & (~read_tables & ~filter_for_table)));
954 found_comparable= true;
955 }
956 }
957 return (found_comparable ? usable_field : NULL);
958 }
959
960 /**
961 Return new Item_field if given expression matches GC
962
963 @see substitute_gc()
964
965 @param func Expression to be replaced
966 @param fld GCs field
967 @param type Result type to match with Field
968
969 @returns
970 item new Item_field for matched GC
971 NULL otherwise
972 */
973
get_gc_for_expr(Item_func ** func,Field * fld,Item_result type)974 Item_field *get_gc_for_expr(Item_func **func, Field *fld, Item_result type)
975 {
976 Item_func *expr= down_cast<Item_func*>(fld->gcol_info->expr_item);
977
978 /*
979 In the case where the generated column expression returns JSON and
980 the predicate compares the values as strings, it is not safe to
981 replace the expression with the generated column, since the
982 indexed string values will be double-quoted. The generated column
983 expression should use the JSON_UNQUOTE function to strip off the
984 double-quotes in order to get a usable index for looking up
985 strings. See also the comment below.
986 */
987 if (type == STRING_RESULT && expr->field_type() == MYSQL_TYPE_JSON)
988 return NULL;
989
990 /*
991 Skip unquoting function. This is needed to address JSON string
992 comparison issue. All JSON_* functions return quoted strings. In
993 order to create usable index, GC column expression has to include
994 JSON_UNQUOTE function, e.g JSON_UNQUOTE(JSON_EXTRACT(..)).
995 Hence, the unquoting function in column expression have to be
996 skipped in order to correctly match GC expr to expr in
997 WHERE condition. The exception is if user has explicitly used
998 JSON_UNQUOTE in WHERE condition.
999 */
1000 if (!strcmp(expr->func_name(),"json_unquote") &&
1001 strcmp((*func)->func_name(),"json_unquote"))
1002 {
1003 if (!expr->arguments()[0]->can_be_substituted_for_gc())
1004 return NULL;
1005 expr= down_cast<Item_func*>(expr->arguments()[0]);
1006 }
1007 DBUG_ASSERT(expr->can_be_substituted_for_gc());
1008
1009 if (type == fld->result_type() && (*func)->eq(expr, false))
1010 {
1011 Item_field *field= new Item_field(fld);
1012 // Mark field for read
1013 fld->table->mark_column_used(fld->table->in_use, fld, MARK_COLUMNS_READ);
1014 return field;
1015 }
1016 return NULL;
1017 }
1018
1019
1020 /**
1021 Transformer function for GC substitution.
1022
1023 @param arg List of indexed GC field
1024
1025 @return this item
1026
1027 @details This function transforms the WHERE condition. It doesn't change
1028 'this' item but rather changes its arguments. It takes list of GC fields
1029 and checks whether arguments of 'this' item matches them and index over
1030 the GC field isn't disabled with hints. If so, it replaces
1031 the argument with newly created Item_field which uses the matched GC
1032 field. Following functions' arguments could be transformed:
1033 - EQ_FUNC, LT_FUNC, LE_FUNC, GE_FUNC, GT_FUNC
1034 - Left _or_ right argument if the opposite argument is a constant.
1035 - IN_FUNC, BETWEEN
1036 - Left argument if all other arguments are constant and of the same type.
1037
1038 After transformation comparators are updated to take into account the new
1039 field.
1040 */
1041
gc_subst_transformer(uchar * arg)1042 Item *Item_func::gc_subst_transformer(uchar *arg)
1043 {
1044 switch(functype()) {
1045 case EQ_FUNC:
1046 case LT_FUNC:
1047 case LE_FUNC:
1048 case GE_FUNC:
1049 case GT_FUNC:
1050 {
1051 Item_func **func= NULL;
1052 Item **val= NULL;
1053 List<Field> *gc_fields= (List<Field> *)arg;
1054 List_iterator<Field> li(*gc_fields);
1055 // Check if we can substitute a function with a GC
1056 if (args[0]->can_be_substituted_for_gc() && args[1]->const_item())
1057 {
1058 func= (Item_func**)args;
1059 val= args + 1;
1060 }
1061 else if (args[1]->can_be_substituted_for_gc() && args[0]->const_item())
1062 {
1063 func= (Item_func**)args + 1;
1064 val= args;
1065 }
1066 if (func)
1067 {
1068 Field *fld;
1069 while((fld= li++))
1070 {
1071 // Check whether field has usable keys
1072 key_map tkm= fld->part_of_key;
1073 tkm.intersect(fld->table->keys_in_use_for_query);
1074 Item_field *field;
1075
1076 if (!tkm.is_clear_all() &&
1077 (field= get_gc_for_expr(func, fld, (*val)->result_type())))
1078 {
1079 // Matching expression is found, substutite arg with the new
1080 // field
1081 fld->table->in_use->change_item_tree(pointer_cast<Item**>(func),
1082 field);
1083 // Adjust comparator
1084 ((Item_bool_func2*)this)->set_cmp_func();
1085 break;
1086 }
1087 }
1088 }
1089 break;
1090 }
1091 case BETWEEN:
1092 case IN_FUNC:
1093 {
1094 List<Field> *gc_fields= (List<Field> *)arg;
1095 List_iterator<Field> li(*gc_fields);
1096 if (!args[0]->can_be_substituted_for_gc())
1097 break;
1098 Item_result type= args[1]->result_type();
1099 bool can_do_subst= args[1]->const_item();
1100 for (uint i= 2; i < arg_count && can_do_subst; i++)
1101 if (!args[i]->const_item() || args[i]->result_type() != type)
1102 {
1103 can_do_subst= false;
1104 break;
1105 }
1106 if (can_do_subst)
1107 {
1108 Field *fld;
1109 while ((fld= li++))
1110 {
1111 // Check whether field has usable keys
1112 key_map tkm= fld->part_of_key;
1113 tkm.intersect(fld->table->keys_in_use_for_query);
1114 Item_field *field;
1115
1116 if (!tkm.is_clear_all() &&
1117 (field= get_gc_for_expr(pointer_cast<Item_func**>(args), fld,
1118 type)))
1119 {
1120 // Matching expression is found, substutite arg[0] with the new
1121 // field
1122 fld->table->in_use->change_item_tree(pointer_cast<Item**>(args),
1123 field);
1124 // Adjust comparators
1125 if (functype() == IN_FUNC)
1126 ((Item_func_in*)this)->cleanup_arrays();
1127 fix_length_and_dec();
1128 break;
1129 }
1130 }
1131 }
1132 break;
1133 }
1134 default:
1135 break;
1136 }
1137 return this;
1138 }
1139
1140
replace_argument(THD * thd,Item ** oldpp,Item * newp)1141 void Item_func::replace_argument(THD *thd, Item **oldpp, Item *newp)
1142 {
1143 thd->change_item_tree(oldpp, newp);
1144 }
1145
1146
val_real()1147 double Item_int_func::val_real()
1148 {
1149 DBUG_ASSERT(fixed == 1);
1150
1151 return unsigned_flag ? (double) ((ulonglong) val_int()) : (double) val_int();
1152 }
1153
1154
val_str(String * str)1155 String *Item_int_func::val_str(String *str)
1156 {
1157 DBUG_ASSERT(fixed == 1);
1158 longlong nr=val_int();
1159 if (null_value)
1160 return 0;
1161 str->set_int(nr, unsigned_flag, collation.collation);
1162 return str;
1163 }
1164
1165
itemize(Parse_context * pc,Item ** res)1166 bool Item_func_connection_id::itemize(Parse_context *pc, Item **res)
1167 {
1168 if (skip_itemize(res))
1169 return false;
1170 if (super::itemize(pc, res))
1171 return true;
1172 pc->thd->lex->safe_to_cache_query= false;
1173 return false;
1174 }
1175
1176
fix_length_and_dec()1177 void Item_func_connection_id::fix_length_and_dec()
1178 {
1179 Item_int_func::fix_length_and_dec();
1180 unsigned_flag= 1;
1181 }
1182
1183
fix_fields(THD * thd,Item ** ref)1184 bool Item_func_connection_id::fix_fields(THD *thd, Item **ref)
1185 {
1186 if (Item_int_func::fix_fields(thd, ref))
1187 return TRUE;
1188 thd->thread_specific_used= TRUE;
1189 value= thd->variables.pseudo_thread_id;
1190 return FALSE;
1191 }
1192
1193
1194 /**
1195 Check arguments here to determine result's type for a numeric
1196 function of two arguments.
1197 */
1198
find_num_type(void)1199 void Item_num_op::find_num_type(void)
1200 {
1201 DBUG_ENTER("Item_num_op::find_num_type");
1202 DBUG_PRINT("info", ("name %s", func_name()));
1203 DBUG_ASSERT(arg_count == 2);
1204 Item_result r0= args[0]->numeric_context_result_type();
1205 Item_result r1= args[1]->numeric_context_result_type();
1206
1207 DBUG_ASSERT(r0 != STRING_RESULT && r1 != STRING_RESULT);
1208
1209 if (r0 == REAL_RESULT || r1 == REAL_RESULT)
1210 {
1211 /*
1212 Since DATE/TIME/DATETIME data types return INT_RESULT/DECIMAL_RESULT
1213 type codes, we should never get to here when both fields are temporal.
1214 */
1215 DBUG_ASSERT(!args[0]->is_temporal() || !args[1]->is_temporal());
1216 count_real_length(args, arg_count);
1217 max_length= float_length(decimals);
1218 hybrid_type= REAL_RESULT;
1219 }
1220 else if (r0 == DECIMAL_RESULT || r1 == DECIMAL_RESULT)
1221 {
1222 hybrid_type= DECIMAL_RESULT;
1223 result_precision();
1224 }
1225 else
1226 {
1227 DBUG_ASSERT(r0 == INT_RESULT && r1 == INT_RESULT);
1228 decimals= 0;
1229 hybrid_type=INT_RESULT;
1230 result_precision();
1231 }
1232 DBUG_PRINT("info", ("Type: %s",
1233 (hybrid_type == REAL_RESULT ? "REAL_RESULT" :
1234 hybrid_type == DECIMAL_RESULT ? "DECIMAL_RESULT" :
1235 hybrid_type == INT_RESULT ? "INT_RESULT" :
1236 "--ILLEGAL!!!--")));
1237 DBUG_VOID_RETURN;
1238 }
1239
1240
1241 /**
1242 Set result type for a numeric function of one argument
1243 (can be also used by a numeric function of many arguments, if the result
1244 type depends only on the first argument)
1245 */
1246
find_num_type()1247 void Item_func_num1::find_num_type()
1248 {
1249 DBUG_ENTER("Item_func_num1::find_num_type");
1250 DBUG_PRINT("info", ("name %s", func_name()));
1251 switch (hybrid_type= args[0]->result_type()) {
1252 case INT_RESULT:
1253 unsigned_flag= args[0]->unsigned_flag;
1254 break;
1255 case STRING_RESULT:
1256 case REAL_RESULT:
1257 hybrid_type= REAL_RESULT;
1258 max_length= float_length(decimals);
1259 break;
1260 case DECIMAL_RESULT:
1261 break;
1262 default:
1263 DBUG_ASSERT(0);
1264 }
1265 DBUG_PRINT("info", ("Type: %s",
1266 (hybrid_type == REAL_RESULT ? "REAL_RESULT" :
1267 hybrid_type == DECIMAL_RESULT ? "DECIMAL_RESULT" :
1268 hybrid_type == INT_RESULT ? "INT_RESULT" :
1269 "--ILLEGAL!!!--")));
1270 DBUG_VOID_RETURN;
1271 }
1272
1273
fix_num_length_and_dec()1274 void Item_func_num1::fix_num_length_and_dec()
1275 {
1276 decimals= args[0]->decimals;
1277 max_length= args[0]->max_length;
1278 }
1279
1280 /*
1281 Reject geometry arguments, should be called in fix_length_and_dec for
1282 SQL functions/operators where geometries are not suitable as operands.
1283 */
reject_geometry_args(uint arg_count,Item ** args,Item_result_field * me)1284 void reject_geometry_args(uint arg_count, Item **args, Item_result_field *me)
1285 {
1286 /*
1287 We want to make sure the operands are not GEOMETRY strings because
1288 it's meaningless for them to participate in arithmetic and/or numerical
1289 calculations.
1290
1291 When a variable holds a MySQL Geometry byte string, it is regarded as a
1292 string rather than a MYSQL_TYPE_GEOMETRY, so here we can't catch an illegal
1293 variable argument which was assigned with a geometry.
1294
1295 Item::field_type() requires the item not be of ROW_RESULT, since a row
1296 isn't a field.
1297 */
1298 for (uint i= 0; i < arg_count; i++)
1299 {
1300 if (args[i]->result_type() != ROW_RESULT &&
1301 args[i]->field_type() == MYSQL_TYPE_GEOMETRY)
1302 {
1303 my_error(ER_WRONG_ARGUMENTS, MYF(0), me->func_name());
1304 break;
1305 }
1306 }
1307
1308 return;
1309 }
1310
1311
1312 /**
1313 Go through the arguments of a function and check if any of them are
1314 JSON. If a JSON argument is found, raise a warning saying that this
1315 operation is not supported yet. This function is used to notify
1316 users that they are comparing JSON values using a mechanism that has
1317 not yet been updated to use the JSON comparator. JSON values are
1318 typically handled as strings in that case.
1319
1320 @param arg_count the number of arguments
1321 @param args the arguments to go through looking for JSON values
1322 @param msg the message that explains what is not supported
1323 */
unsupported_json_comparison(size_t arg_count,Item ** args,const char * msg)1324 void unsupported_json_comparison(size_t arg_count, Item **args, const char *msg)
1325 {
1326 for (size_t i= 0; i < arg_count; ++i)
1327 {
1328 if (args[i]->result_type() == STRING_RESULT &&
1329 args[i]->field_type() == MYSQL_TYPE_JSON)
1330 {
1331 push_warning_printf(current_thd, Sql_condition::SL_WARNING,
1332 ER_NOT_SUPPORTED_YET,
1333 ER_THD(current_thd, ER_NOT_SUPPORTED_YET),
1334 msg);
1335 break;
1336 }
1337 }
1338 }
1339
1340
fix_length_and_dec()1341 void Item_func_numhybrid::fix_length_and_dec()
1342 {
1343 fix_num_length_and_dec();
1344 find_num_type();
1345 reject_geometry_args(arg_count, args, this);
1346 }
1347
val_str(String * str)1348 String *Item_func_numhybrid::val_str(String *str)
1349 {
1350 DBUG_ASSERT(fixed == 1);
1351 switch (hybrid_type) {
1352 case DECIMAL_RESULT:
1353 {
1354 my_decimal decimal_value, *val;
1355 if (!(val= decimal_op(&decimal_value)))
1356 return 0; // null is set
1357 my_decimal_round(E_DEC_FATAL_ERROR, val, decimals, FALSE, val);
1358 str->set_charset(collation.collation);
1359 my_decimal2string(E_DEC_FATAL_ERROR, val, 0, 0, 0, str);
1360 break;
1361 }
1362 case INT_RESULT:
1363 {
1364 longlong nr= int_op();
1365 if (null_value)
1366 return 0; /* purecov: inspected */
1367 str->set_int(nr, unsigned_flag, collation.collation);
1368 break;
1369 }
1370 case REAL_RESULT:
1371 {
1372 double nr= real_op();
1373 if (null_value)
1374 return 0; /* purecov: inspected */
1375 str->set_real(nr, decimals, collation.collation);
1376 break;
1377 }
1378 case STRING_RESULT:
1379 switch (field_type()) {
1380 case MYSQL_TYPE_DATETIME:
1381 case MYSQL_TYPE_TIMESTAMP:
1382 return val_string_from_datetime(str);
1383 case MYSQL_TYPE_DATE:
1384 return val_string_from_date(str);
1385 case MYSQL_TYPE_TIME:
1386 return val_string_from_time(str);
1387 default:
1388 break;
1389 }
1390 return str_op(&str_value);
1391 default:
1392 DBUG_ASSERT(0);
1393 }
1394 return str;
1395 }
1396
1397
val_real()1398 double Item_func_numhybrid::val_real()
1399 {
1400 DBUG_ASSERT(fixed == 1);
1401 switch (hybrid_type) {
1402 case DECIMAL_RESULT:
1403 {
1404 my_decimal decimal_value, *val;
1405 double result;
1406 if (!(val= decimal_op(&decimal_value)))
1407 return 0.0; // null is set
1408 my_decimal2double(E_DEC_FATAL_ERROR, val, &result);
1409 return result;
1410 }
1411 case INT_RESULT:
1412 {
1413 longlong result= int_op();
1414 return unsigned_flag ? (double) ((ulonglong) result) : (double) result;
1415 }
1416 case REAL_RESULT:
1417 return real_op();
1418 case STRING_RESULT:
1419 {
1420 switch (field_type())
1421 {
1422 case MYSQL_TYPE_TIME:
1423 case MYSQL_TYPE_DATE:
1424 case MYSQL_TYPE_DATETIME:
1425 case MYSQL_TYPE_TIMESTAMP:
1426 return val_real_from_decimal();
1427 default:
1428 break;
1429 }
1430 char *end_not_used;
1431 int err_not_used;
1432 String *res= str_op(&str_value);
1433 return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1434 &end_not_used, &err_not_used) : 0.0);
1435 }
1436 default:
1437 DBUG_ASSERT(0);
1438 }
1439 return 0.0;
1440 }
1441
1442
val_int()1443 longlong Item_func_numhybrid::val_int()
1444 {
1445 DBUG_ASSERT(fixed == 1);
1446 switch (hybrid_type) {
1447 case DECIMAL_RESULT:
1448 {
1449 my_decimal decimal_value, *val;
1450 if (!(val= decimal_op(&decimal_value)))
1451 return 0; // null is set
1452 longlong result;
1453 my_decimal2int(E_DEC_FATAL_ERROR, val, unsigned_flag, &result);
1454 return result;
1455 }
1456 case INT_RESULT:
1457 return int_op();
1458 case REAL_RESULT:
1459 return (longlong) rint(real_op());
1460 case STRING_RESULT:
1461 {
1462 switch (field_type())
1463 {
1464 case MYSQL_TYPE_DATE:
1465 return val_int_from_date();
1466 case MYSQL_TYPE_DATETIME:
1467 case MYSQL_TYPE_TIMESTAMP:
1468 return val_int_from_datetime();
1469 case MYSQL_TYPE_TIME:
1470 return val_int_from_time();
1471 default:
1472 break;
1473 }
1474 int err_not_used;
1475 String *res;
1476 if (!(res= str_op(&str_value)))
1477 return 0;
1478
1479 char *end= (char*) res->ptr() + res->length();
1480 const CHARSET_INFO *cs= res->charset();
1481 return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used);
1482 }
1483 default:
1484 DBUG_ASSERT(0);
1485 }
1486 return 0;
1487 }
1488
1489
val_decimal(my_decimal * decimal_value)1490 my_decimal *Item_func_numhybrid::val_decimal(my_decimal *decimal_value)
1491 {
1492 my_decimal *val= decimal_value;
1493 DBUG_ASSERT(fixed == 1);
1494 switch (hybrid_type) {
1495 case DECIMAL_RESULT:
1496 val= decimal_op(decimal_value);
1497 break;
1498 case INT_RESULT:
1499 {
1500 longlong result= int_op();
1501 int2my_decimal(E_DEC_FATAL_ERROR, result, unsigned_flag, decimal_value);
1502 break;
1503 }
1504 case REAL_RESULT:
1505 {
1506 double result= real_op();
1507 double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
1508 break;
1509 }
1510 case STRING_RESULT:
1511 {
1512 switch (field_type())
1513 {
1514 case MYSQL_TYPE_DATE:
1515 case MYSQL_TYPE_DATETIME:
1516 case MYSQL_TYPE_TIMESTAMP:
1517 return val_decimal_from_date(decimal_value);
1518 case MYSQL_TYPE_TIME:
1519 return val_decimal_from_time(decimal_value);
1520 default:
1521 break;
1522 }
1523 String *res;
1524 if (!(res= str_op(&str_value)))
1525 return NULL;
1526
1527 str2my_decimal(E_DEC_FATAL_ERROR, (char*) res->ptr(),
1528 res->length(), res->charset(), decimal_value);
1529 break;
1530 }
1531 case ROW_RESULT:
1532 default:
1533 DBUG_ASSERT(0);
1534 }
1535 return val;
1536 }
1537
1538
get_date(MYSQL_TIME * ltime,my_time_flags_t fuzzydate)1539 bool Item_func_numhybrid::get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate)
1540 {
1541 DBUG_ASSERT(fixed == 1);
1542 switch (field_type())
1543 {
1544 case MYSQL_TYPE_DATE:
1545 case MYSQL_TYPE_DATETIME:
1546 case MYSQL_TYPE_TIMESTAMP:
1547 return date_op(ltime, fuzzydate);
1548 case MYSQL_TYPE_TIME:
1549 return get_date_from_time(ltime);
1550 default:
1551 return Item::get_date_from_non_temporal(ltime, fuzzydate);
1552 }
1553 }
1554
1555
get_time(MYSQL_TIME * ltime)1556 bool Item_func_numhybrid::get_time(MYSQL_TIME *ltime)
1557 {
1558 DBUG_ASSERT(fixed == 1);
1559 switch (field_type())
1560 {
1561 case MYSQL_TYPE_TIME:
1562 return time_op(ltime);
1563 case MYSQL_TYPE_DATE:
1564 return get_time_from_date(ltime);
1565 case MYSQL_TYPE_DATETIME:
1566 case MYSQL_TYPE_TIMESTAMP:
1567 return get_time_from_datetime(ltime);
1568 default:
1569 return Item::get_time_from_non_temporal(ltime);
1570 }
1571 }
1572
1573
print(String * str,enum_query_type query_type)1574 void Item_func_signed::print(String *str, enum_query_type query_type)
1575 {
1576 str->append(STRING_WITH_LEN("cast("));
1577 args[0]->print(str, query_type);
1578 str->append(STRING_WITH_LEN(" as signed)"));
1579
1580 }
1581
1582
fix_length_and_dec()1583 void Item_func_signed::fix_length_and_dec()
1584 {
1585 fix_char_length(std::min<uint32>(args[0]->max_char_length(),
1586 MY_INT64_NUM_DECIMAL_DIGITS));
1587 reject_geometry_args(arg_count, args, this);
1588 }
1589
1590
val_int_from_str(int * error)1591 longlong Item_func_signed::val_int_from_str(int *error)
1592 {
1593 char buff[MAX_FIELD_WIDTH], *end, *start;
1594 size_t length;
1595 String tmp(buff,sizeof(buff), &my_charset_bin), *res;
1596 longlong value;
1597 const CHARSET_INFO *cs;
1598
1599 /*
1600 For a string result, we must first get the string and then convert it
1601 to a longlong
1602 */
1603
1604 if (!(res= args[0]->val_str(&tmp)))
1605 {
1606 null_value= 1;
1607 *error= 0;
1608 return 0;
1609 }
1610 null_value= 0;
1611 start= (char *)res->ptr();
1612 length= res->length();
1613 cs= res->charset();
1614
1615 end= start + length;
1616 value= cs->cset->strtoll10(cs, start, &end, error);
1617 if (*error > 0 || end != start+ length)
1618 {
1619 ErrConvString err(res);
1620 push_warning_printf(current_thd, Sql_condition::SL_WARNING,
1621 ER_TRUNCATED_WRONG_VALUE,
1622 ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
1623 err.ptr());
1624 }
1625 return value;
1626 }
1627
1628
val_int()1629 longlong Item_func_signed::val_int()
1630 {
1631 longlong value;
1632 int error;
1633
1634 if (args[0]->cast_to_int_type() != STRING_RESULT ||
1635 args[0]->is_temporal())
1636 {
1637 value= args[0]->val_int();
1638 null_value= args[0]->null_value;
1639 return value;
1640 }
1641
1642 value= val_int_from_str(&error);
1643 if (value < 0 && error == 0)
1644 {
1645 push_warning(current_thd, Sql_condition::SL_WARNING, ER_UNKNOWN_ERROR,
1646 "Cast to signed converted positive out-of-range integer to "
1647 "it's negative complement");
1648 }
1649 return value;
1650 }
1651
1652
print(String * str,enum_query_type query_type)1653 void Item_func_unsigned::print(String *str, enum_query_type query_type)
1654 {
1655 str->append(STRING_WITH_LEN("cast("));
1656 args[0]->print(str, query_type);
1657 str->append(STRING_WITH_LEN(" as unsigned)"));
1658
1659 }
1660
1661
val_int()1662 longlong Item_func_unsigned::val_int()
1663 {
1664 longlong value;
1665 int error;
1666
1667 if (args[0]->cast_to_int_type() == DECIMAL_RESULT)
1668 {
1669 my_decimal tmp, *dec= args[0]->val_decimal(&tmp);
1670 if (!(null_value= args[0]->null_value))
1671 my_decimal2int(E_DEC_FATAL_ERROR, dec, 1, &value);
1672 else
1673 value= 0;
1674 return value;
1675 }
1676 else if (args[0]->cast_to_int_type() != STRING_RESULT ||
1677 args[0]->is_temporal())
1678 {
1679 value= args[0]->val_int();
1680 null_value= args[0]->null_value;
1681 return value;
1682 }
1683
1684 value= val_int_from_str(&error);
1685 if (error < 0)
1686 push_warning(current_thd, Sql_condition::SL_WARNING, ER_UNKNOWN_ERROR,
1687 "Cast to unsigned converted negative integer to it's "
1688 "positive complement");
1689 return value;
1690 }
1691
1692
val_str(String * str)1693 String *Item_decimal_typecast::val_str(String *str)
1694 {
1695 my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1696 if (null_value)
1697 return NULL;
1698 my_decimal2string(E_DEC_FATAL_ERROR, tmp, 0, 0, 0, str);
1699 return str;
1700 }
1701
1702
val_real()1703 double Item_decimal_typecast::val_real()
1704 {
1705 my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1706 double res;
1707 if (null_value)
1708 return 0.0;
1709 my_decimal2double(E_DEC_FATAL_ERROR, tmp, &res);
1710 return res;
1711 }
1712
1713
val_int()1714 longlong Item_decimal_typecast::val_int()
1715 {
1716 my_decimal tmp_buf, *tmp= val_decimal(&tmp_buf);
1717 longlong res;
1718 if (null_value)
1719 return 0;
1720 my_decimal2int(E_DEC_FATAL_ERROR, tmp, unsigned_flag, &res);
1721 return res;
1722 }
1723
1724
val_decimal(my_decimal * dec)1725 my_decimal *Item_decimal_typecast::val_decimal(my_decimal *dec)
1726 {
1727 my_decimal tmp_buf, *tmp= args[0]->val_decimal(&tmp_buf);
1728 bool sign;
1729 uint precision;
1730
1731 if ((null_value= args[0]->null_value))
1732 return NULL;
1733 my_decimal_round(E_DEC_FATAL_ERROR, tmp, decimals, FALSE, dec);
1734 sign= dec->sign();
1735 if (unsigned_flag)
1736 {
1737 if (sign)
1738 {
1739 my_decimal_set_zero(dec);
1740 goto err;
1741 }
1742 }
1743 precision= my_decimal_length_to_precision(max_length,
1744 decimals, unsigned_flag);
1745 if (precision - decimals < (uint) my_decimal_intg(dec))
1746 {
1747 max_my_decimal(dec, precision, decimals);
1748 dec->sign(sign);
1749 goto err;
1750 }
1751 return dec;
1752
1753 err:
1754 push_warning_printf(current_thd, Sql_condition::SL_WARNING,
1755 ER_WARN_DATA_OUT_OF_RANGE,
1756 ER(ER_WARN_DATA_OUT_OF_RANGE),
1757 item_name.ptr(), 1L);
1758 return dec;
1759 }
1760
1761
print(String * str,enum_query_type query_type)1762 void Item_decimal_typecast::print(String *str, enum_query_type query_type)
1763 {
1764 char len_buf[20*3 + 1];
1765 char *end;
1766
1767 uint precision= my_decimal_length_to_precision(max_length, decimals,
1768 unsigned_flag);
1769 str->append(STRING_WITH_LEN("cast("));
1770 args[0]->print(str, query_type);
1771 str->append(STRING_WITH_LEN(" as decimal("));
1772
1773 end=int10_to_str(precision, len_buf,10);
1774 str->append(len_buf, (uint32) (end - len_buf));
1775
1776 str->append(',');
1777
1778 end=int10_to_str(decimals, len_buf,10);
1779 str->append(len_buf, (uint32) (end - len_buf));
1780
1781 str->append(')');
1782 str->append(')');
1783 }
1784
1785
real_op()1786 double Item_func_plus::real_op()
1787 {
1788 double value= args[0]->val_real() + args[1]->val_real();
1789 if ((null_value=args[0]->null_value || args[1]->null_value))
1790 return 0.0;
1791 return check_float_overflow(value);
1792 }
1793
1794
int_op()1795 longlong Item_func_plus::int_op()
1796 {
1797 longlong val0= args[0]->val_int();
1798 longlong val1= args[1]->val_int();
1799 longlong res= val0 + val1;
1800 bool res_unsigned= FALSE;
1801
1802 if ((null_value= args[0]->null_value || args[1]->null_value))
1803 return 0;
1804
1805 /*
1806 First check whether the result can be represented as a
1807 (bool unsigned_flag, longlong value) pair, then check if it is compatible
1808 with this Item's unsigned_flag by calling check_integer_overflow().
1809 */
1810 if (args[0]->unsigned_flag)
1811 {
1812 if (args[1]->unsigned_flag || val1 >= 0)
1813 {
1814 if (test_if_sum_overflows_ull((ulonglong) val0, (ulonglong) val1))
1815 goto err;
1816 res_unsigned= TRUE;
1817 }
1818 else
1819 {
1820 /* val1 is negative */
1821 if ((ulonglong) val0 > (ulonglong) LLONG_MAX)
1822 res_unsigned= TRUE;
1823 }
1824 }
1825 else
1826 {
1827 if (args[1]->unsigned_flag)
1828 {
1829 if (val0 >= 0)
1830 {
1831 if (test_if_sum_overflows_ull((ulonglong) val0, (ulonglong) val1))
1832 goto err;
1833 res_unsigned= TRUE;
1834 }
1835 else
1836 {
1837 if ((ulonglong) val1 > (ulonglong) LLONG_MAX)
1838 res_unsigned= TRUE;
1839 }
1840 }
1841 else
1842 {
1843 if (val0 >=0 && val1 >= 0)
1844 res_unsigned= TRUE;
1845 else if (val0 < 0 && val1 < 0 && res >= 0)
1846 goto err;
1847 }
1848 }
1849 return check_integer_overflow(res, res_unsigned);
1850
1851 err:
1852 return raise_integer_overflow();
1853 }
1854
1855
1856 /**
1857 Calculate plus of two decimals.
1858
1859 @param decimal_value Buffer that can be used to store result
1860
1861 @retval
1862 0 Value was NULL; In this case null_value is set
1863 @retval
1864 \# Value of operation as a decimal
1865 */
1866
decimal_op(my_decimal * decimal_value)1867 my_decimal *Item_func_plus::decimal_op(my_decimal *decimal_value)
1868 {
1869 my_decimal value1, *val1;
1870 my_decimal value2, *val2;
1871 val1= args[0]->val_decimal(&value1);
1872 if ((null_value= args[0]->null_value))
1873 return 0;
1874 val2= args[1]->val_decimal(&value2);
1875 if (!(null_value= (args[1]->null_value ||
1876 check_decimal_overflow(my_decimal_add(E_DEC_FATAL_ERROR &
1877 ~E_DEC_OVERFLOW,
1878 decimal_value,
1879 val1, val2)) > 3)))
1880 return decimal_value;
1881 return 0;
1882 }
1883
1884 /**
1885 Set precision of results for additive operations (+ and -)
1886 */
result_precision()1887 void Item_func_additive_op::result_precision()
1888 {
1889 decimals= max(args[0]->decimals, args[1]->decimals);
1890 int arg1_int= args[0]->decimal_precision() - args[0]->decimals;
1891 int arg2_int= args[1]->decimal_precision() - args[1]->decimals;
1892 int precision= max(arg1_int, arg2_int) + 1 + decimals;
1893
1894 /* Integer operations keep unsigned_flag if one of arguments is unsigned */
1895 if (result_type() == INT_RESULT)
1896 unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
1897 else
1898 unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
1899 max_length= my_decimal_precision_to_length_no_truncation(precision, decimals,
1900 unsigned_flag);
1901 }
1902
1903
1904 /**
1905 The following function is here to allow the user to force
1906 subtraction of UNSIGNED BIGINT to return negative values.
1907 */
1908
fix_length_and_dec()1909 void Item_func_minus::fix_length_and_dec()
1910 {
1911 Item_num_op::fix_length_and_dec();
1912 if (unsigned_flag &&
1913 (current_thd->variables.sql_mode & MODE_NO_UNSIGNED_SUBTRACTION))
1914 unsigned_flag=0;
1915 }
1916
1917
real_op()1918 double Item_func_minus::real_op()
1919 {
1920 double value= args[0]->val_real() - args[1]->val_real();
1921 if ((null_value=args[0]->null_value || args[1]->null_value))
1922 return 0.0;
1923 return check_float_overflow(value);
1924 }
1925
1926
int_op()1927 longlong Item_func_minus::int_op()
1928 {
1929 longlong val0= args[0]->val_int();
1930 longlong val1= args[1]->val_int();
1931 longlong res= val0 - val1;
1932 bool res_unsigned= FALSE;
1933
1934 if ((null_value= args[0]->null_value || args[1]->null_value))
1935 return 0;
1936
1937 /*
1938 First check whether the result can be represented as a
1939 (bool unsigned_flag, longlong value) pair, then check if it is compatible
1940 with this Item's unsigned_flag by calling check_integer_overflow().
1941 */
1942 if (args[0]->unsigned_flag)
1943 {
1944 if (args[1]->unsigned_flag)
1945 {
1946 if ((ulonglong) val0 < (ulonglong) val1)
1947 {
1948 if (res >= 0)
1949 goto err;
1950 }
1951 else
1952 res_unsigned= TRUE;
1953 }
1954 else
1955 {
1956 if (val1 >= 0)
1957 {
1958 if ((ulonglong) val0 > (ulonglong) val1)
1959 res_unsigned= TRUE;
1960 }
1961 else
1962 {
1963 if (test_if_sum_overflows_ull((ulonglong) val0, (ulonglong) -val1))
1964 goto err;
1965 res_unsigned= TRUE;
1966 }
1967 }
1968 }
1969 else
1970 {
1971 if (args[1]->unsigned_flag)
1972 {
1973 if ((ulonglong) (val0 - LLONG_MIN) < (ulonglong) val1)
1974 goto err;
1975 }
1976 else
1977 {
1978 if (val0 > 0 && val1 < 0)
1979 res_unsigned= TRUE;
1980 else if (val0 < 0 && val1 > 0 && res >= 0)
1981 goto err;
1982 }
1983 }
1984 return check_integer_overflow(res, res_unsigned);
1985
1986 err:
1987 return raise_integer_overflow();
1988 }
1989
1990
1991 /**
1992 See Item_func_plus::decimal_op for comments.
1993 */
1994
decimal_op(my_decimal * decimal_value)1995 my_decimal *Item_func_minus::decimal_op(my_decimal *decimal_value)
1996 {
1997 my_decimal value1, *val1;
1998 my_decimal value2, *val2;
1999
2000 val1= args[0]->val_decimal(&value1);
2001 if ((null_value= args[0]->null_value))
2002 return 0;
2003 val2= args[1]->val_decimal(&value2);
2004 if (!(null_value= (args[1]->null_value ||
2005 (check_decimal_overflow(my_decimal_sub(E_DEC_FATAL_ERROR &
2006 ~E_DEC_OVERFLOW,
2007 decimal_value, val1,
2008 val2)) > 3))))
2009 return decimal_value;
2010 return 0;
2011 }
2012
2013
real_op()2014 double Item_func_mul::real_op()
2015 {
2016 DBUG_ASSERT(fixed == 1);
2017 double value= args[0]->val_real() * args[1]->val_real();
2018 if ((null_value=args[0]->null_value || args[1]->null_value))
2019 return 0.0;
2020 return check_float_overflow(value);
2021 }
2022
2023
int_op()2024 longlong Item_func_mul::int_op()
2025 {
2026 DBUG_ASSERT(fixed == 1);
2027 longlong a= args[0]->val_int();
2028 longlong b= args[1]->val_int();
2029 longlong res;
2030 ulonglong res0, res1;
2031 ulong a0, a1, b0, b1;
2032 bool res_unsigned= FALSE;
2033 bool a_negative= FALSE, b_negative= FALSE;
2034
2035 if ((null_value= args[0]->null_value || args[1]->null_value))
2036 return 0;
2037
2038 /*
2039 First check whether the result can be represented as a
2040 (bool unsigned_flag, longlong value) pair, then check if it is compatible
2041 with this Item's unsigned_flag by calling check_integer_overflow().
2042
2043 Let a = a1 * 2^32 + a0 and b = b1 * 2^32 + b0. Then
2044 a * b = (a1 * 2^32 + a0) * (b1 * 2^32 + b0) = a1 * b1 * 2^64 +
2045 + (a1 * b0 + a0 * b1) * 2^32 + a0 * b0;
2046 We can determine if the above sum overflows the ulonglong range by
2047 sequentially checking the following conditions:
2048 1. If both a1 and b1 are non-zero.
2049 2. Otherwise, if (a1 * b0 + a0 * b1) is greater than ULONG_MAX.
2050 3. Otherwise, if (a1 * b0 + a0 * b1) * 2^32 + a0 * b0 is greater than
2051 ULLONG_MAX.
2052
2053 Since we also have to take the unsigned_flag for a and b into account,
2054 it is easier to first work with absolute values and set the
2055 correct sign later.
2056 */
2057 if (!args[0]->unsigned_flag && a < 0)
2058 {
2059 a_negative= TRUE;
2060 a= -a;
2061 }
2062 if (!args[1]->unsigned_flag && b < 0)
2063 {
2064 b_negative= TRUE;
2065 b= -b;
2066 }
2067
2068 a0= 0xFFFFFFFFUL & a;
2069 a1= ((ulonglong) a) >> 32;
2070 b0= 0xFFFFFFFFUL & b;
2071 b1= ((ulonglong) b) >> 32;
2072
2073 if (a1 && b1)
2074 goto err;
2075
2076 res1= (ulonglong) a1 * b0 + (ulonglong) a0 * b1;
2077 if (res1 > 0xFFFFFFFFUL)
2078 goto err;
2079
2080 res1= res1 << 32;
2081 res0= (ulonglong) a0 * b0;
2082
2083 if (test_if_sum_overflows_ull(res1, res0))
2084 goto err;
2085 res= res1 + res0;
2086
2087 if (a_negative != b_negative)
2088 {
2089 if ((ulonglong) res > (ulonglong) LLONG_MIN + 1)
2090 goto err;
2091 res= -res;
2092 }
2093 else
2094 res_unsigned= TRUE;
2095
2096 return check_integer_overflow(res, res_unsigned);
2097
2098 err:
2099 return raise_integer_overflow();
2100 }
2101
2102
2103 /** See Item_func_plus::decimal_op for comments. */
2104
decimal_op(my_decimal * decimal_value)2105 my_decimal *Item_func_mul::decimal_op(my_decimal *decimal_value)
2106 {
2107 my_decimal value1, *val1;
2108 my_decimal value2, *val2;
2109 val1= args[0]->val_decimal(&value1);
2110 if ((null_value= args[0]->null_value))
2111 return 0;
2112 val2= args[1]->val_decimal(&value2);
2113 if (!(null_value= (args[1]->null_value ||
2114 (check_decimal_overflow(my_decimal_mul(E_DEC_FATAL_ERROR &
2115 ~E_DEC_OVERFLOW,
2116 decimal_value, val1,
2117 val2)) > 3))))
2118 return decimal_value;
2119 return 0;
2120 }
2121
2122
result_precision()2123 void Item_func_mul::result_precision()
2124 {
2125 /* Integer operations keep unsigned_flag if one of arguments is unsigned */
2126 if (result_type() == INT_RESULT)
2127 unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
2128 else
2129 unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
2130 decimals= min(args[0]->decimals + args[1]->decimals, DECIMAL_MAX_SCALE);
2131 uint est_prec = args[0]->decimal_precision() + args[1]->decimal_precision();
2132 uint precision= min<uint>(est_prec, DECIMAL_MAX_PRECISION);
2133 max_length= my_decimal_precision_to_length_no_truncation(precision, decimals,
2134 unsigned_flag);
2135 }
2136
2137
real_op()2138 double Item_func_div::real_op()
2139 {
2140 DBUG_ASSERT(fixed == 1);
2141 double value= args[0]->val_real();
2142 double val2= args[1]->val_real();
2143 if ((null_value= args[0]->null_value || args[1]->null_value))
2144 return 0.0;
2145 if (val2 == 0.0)
2146 {
2147 signal_divide_by_null();
2148 return 0.0;
2149 }
2150 return check_float_overflow(value/val2);
2151 }
2152
2153
decimal_op(my_decimal * decimal_value)2154 my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
2155 {
2156 my_decimal value1, *val1;
2157 my_decimal value2, *val2;
2158 int err;
2159
2160 val1= args[0]->val_decimal(&value1);
2161 if ((null_value= args[0]->null_value))
2162 return 0;
2163 val2= args[1]->val_decimal(&value2);
2164 if ((null_value= args[1]->null_value))
2165 return 0;
2166 if ((err= check_decimal_overflow(my_decimal_div(E_DEC_FATAL_ERROR &
2167 ~E_DEC_OVERFLOW &
2168 ~E_DEC_DIV_ZERO,
2169 decimal_value,
2170 val1, val2,
2171 prec_increment))) > 3)
2172 {
2173 if (err == E_DEC_DIV_ZERO)
2174 signal_divide_by_null();
2175 null_value= 1;
2176 return 0;
2177 }
2178 return decimal_value;
2179 }
2180
2181
result_precision()2182 void Item_func_div::result_precision()
2183 {
2184 uint precision= min<uint>(args[0]->decimal_precision() +
2185 args[1]->decimals + prec_increment,
2186 DECIMAL_MAX_PRECISION);
2187
2188 if (result_type() == DECIMAL_RESULT)
2189 DBUG_ASSERT(precision > 0);
2190
2191 /* Integer operations keep unsigned_flag if one of arguments is unsigned */
2192 if (result_type() == INT_RESULT)
2193 unsigned_flag= args[0]->unsigned_flag | args[1]->unsigned_flag;
2194 else
2195 unsigned_flag= args[0]->unsigned_flag & args[1]->unsigned_flag;
2196 decimals= min<uint>(args[0]->decimals + prec_increment, DECIMAL_MAX_SCALE);
2197 max_length= my_decimal_precision_to_length_no_truncation(precision, decimals,
2198 unsigned_flag);
2199 }
2200
2201
fix_length_and_dec()2202 void Item_func_div::fix_length_and_dec()
2203 {
2204 DBUG_ENTER("Item_func_div::fix_length_and_dec");
2205 prec_increment= current_thd->variables.div_precincrement;
2206 Item_num_op::fix_length_and_dec();
2207 switch(hybrid_type) {
2208 case REAL_RESULT:
2209 {
2210 decimals=max(args[0]->decimals,args[1]->decimals)+prec_increment;
2211 set_if_smaller(decimals, NOT_FIXED_DEC);
2212 uint tmp=float_length(decimals);
2213 if (decimals == NOT_FIXED_DEC)
2214 max_length= tmp;
2215 else
2216 {
2217 max_length=args[0]->max_length - args[0]->decimals + decimals;
2218 set_if_smaller(max_length,tmp);
2219 }
2220 break;
2221 }
2222 case INT_RESULT:
2223 hybrid_type= DECIMAL_RESULT;
2224 DBUG_PRINT("info", ("Type changed: DECIMAL_RESULT"));
2225 result_precision();
2226 break;
2227 case DECIMAL_RESULT:
2228 result_precision();
2229 break;
2230 default:
2231 DBUG_ASSERT(0);
2232 }
2233 maybe_null= 1; // devision by zero
2234 DBUG_VOID_RETURN;
2235 }
2236
2237
2238 /* Integer division */
val_int()2239 longlong Item_func_int_div::val_int()
2240 {
2241 DBUG_ASSERT(fixed == 1);
2242
2243 /*
2244 Perform division using DECIMAL math if either of the operands has a
2245 non-integer type
2246 */
2247 if (args[0]->result_type() != INT_RESULT ||
2248 args[1]->result_type() != INT_RESULT)
2249 {
2250 my_decimal tmp;
2251 my_decimal *val0p= args[0]->val_decimal(&tmp);
2252 if ((null_value= args[0]->null_value))
2253 return 0;
2254 my_decimal val0= *val0p;
2255
2256 my_decimal *val1p= args[1]->val_decimal(&tmp);
2257 if ((null_value= args[1]->null_value))
2258 return 0;
2259 my_decimal val1= *val1p;
2260
2261 int err;
2262 if ((err= my_decimal_div(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, &tmp,
2263 &val0, &val1, 0)) > 3)
2264 {
2265 if (err == E_DEC_DIV_ZERO)
2266 signal_divide_by_null();
2267 return 0;
2268 }
2269
2270 my_decimal truncated;
2271 const bool do_truncate= true;
2272 if (my_decimal_round(E_DEC_FATAL_ERROR, &tmp, 0, do_truncate, &truncated))
2273 DBUG_ASSERT(false);
2274
2275 longlong res;
2276 if (my_decimal2int(E_DEC_FATAL_ERROR, &truncated, unsigned_flag, &res) &
2277 E_DEC_OVERFLOW)
2278 raise_integer_overflow();
2279 return res;
2280 }
2281
2282 longlong val0=args[0]->val_int();
2283 longlong val1=args[1]->val_int();
2284 bool val0_negative, val1_negative, res_negative;
2285 ulonglong uval0, uval1, res;
2286 if ((null_value= (args[0]->null_value || args[1]->null_value)))
2287 return 0;
2288 if (val1 == 0)
2289 {
2290 signal_divide_by_null();
2291 return 0;
2292 }
2293
2294 val0_negative= !args[0]->unsigned_flag && val0 < 0;
2295 val1_negative= !args[1]->unsigned_flag && val1 < 0;
2296 res_negative= val0_negative != val1_negative;
2297 uval0= (ulonglong) (val0_negative ? -val0 : val0);
2298 uval1= (ulonglong) (val1_negative ? -val1 : val1);
2299 res= uval0 / uval1;
2300 if (res_negative)
2301 {
2302 if (res > (ulonglong) LLONG_MAX)
2303 return raise_integer_overflow();
2304 res= (ulonglong) (-(longlong) res);
2305 }
2306 return check_integer_overflow(res, !res_negative);
2307 }
2308
2309
fix_length_and_dec()2310 void Item_func_int_div::fix_length_and_dec()
2311 {
2312 Item_result argtype= args[0]->result_type();
2313 /* use precision ony for the data type it is applicable for and valid */
2314 uint32 char_length= args[0]->max_char_length() -
2315 (argtype == DECIMAL_RESULT || argtype == INT_RESULT ?
2316 args[0]->decimals : 0);
2317 fix_char_length(char_length > MY_INT64_NUM_DECIMAL_DIGITS ?
2318 MY_INT64_NUM_DECIMAL_DIGITS : char_length);
2319 maybe_null=1;
2320 unsigned_flag=args[0]->unsigned_flag | args[1]->unsigned_flag;
2321 reject_geometry_args(arg_count, args, this);
2322 }
2323
2324
int_op()2325 longlong Item_func_mod::int_op()
2326 {
2327 DBUG_ASSERT(fixed == 1);
2328 longlong val0= args[0]->val_int();
2329 longlong val1= args[1]->val_int();
2330 bool val0_negative, val1_negative;
2331 ulonglong uval0, uval1;
2332 ulonglong res;
2333
2334 if ((null_value= args[0]->null_value || args[1]->null_value))
2335 return 0; /* purecov: inspected */
2336 if (val1 == 0)
2337 {
2338 signal_divide_by_null();
2339 return 0;
2340 }
2341
2342 /*
2343 '%' is calculated by integer division internally. Since dividing
2344 LLONG_MIN by -1 generates SIGFPE, we calculate using unsigned values and
2345 then adjust the sign appropriately.
2346 */
2347 val0_negative= !args[0]->unsigned_flag && val0 < 0;
2348 val1_negative= !args[1]->unsigned_flag && val1 < 0;
2349 uval0= (ulonglong) (val0_negative ? -val0 : val0);
2350 uval1= (ulonglong) (val1_negative ? -val1 : val1);
2351 res= uval0 % uval1;
2352 return check_integer_overflow(val0_negative ? -(longlong) res : res,
2353 !val0_negative);
2354 }
2355
real_op()2356 double Item_func_mod::real_op()
2357 {
2358 DBUG_ASSERT(fixed == 1);
2359 double value= args[0]->val_real();
2360 double val2= args[1]->val_real();
2361 if ((null_value= args[0]->null_value || args[1]->null_value))
2362 return 0.0; /* purecov: inspected */
2363 if (val2 == 0.0)
2364 {
2365 signal_divide_by_null();
2366 return 0.0;
2367 }
2368 return fmod(value,val2);
2369 }
2370
2371
decimal_op(my_decimal * decimal_value)2372 my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value)
2373 {
2374 my_decimal value1, *val1;
2375 my_decimal value2, *val2;
2376
2377 val1= args[0]->val_decimal(&value1);
2378 if ((null_value= args[0]->null_value))
2379 return 0;
2380 val2= args[1]->val_decimal(&value2);
2381 if ((null_value= args[1]->null_value))
2382 return 0;
2383 switch (my_decimal_mod(E_DEC_FATAL_ERROR & ~E_DEC_DIV_ZERO, decimal_value,
2384 val1, val2)) {
2385 case E_DEC_TRUNCATED:
2386 case E_DEC_OK:
2387 return decimal_value;
2388 case E_DEC_DIV_ZERO:
2389 signal_divide_by_null();
2390 // Fall through.
2391 default:
2392 null_value= 1;
2393 return 0;
2394 }
2395 }
2396
2397
result_precision()2398 void Item_func_mod::result_precision()
2399 {
2400 decimals= max(args[0]->decimals, args[1]->decimals);
2401 max_length= max(args[0]->max_length, args[1]->max_length);
2402 // Increase max_length if we have: signed % unsigned(precision == scale)
2403 if (!args[0]->unsigned_flag && args[1]->unsigned_flag &&
2404 args[0]->max_length <= args[1]->max_length &&
2405 args[1]->decimals == args[1]->decimal_precision())
2406 {
2407 max_length+= 1;
2408 }
2409 }
2410
2411
fix_length_and_dec()2412 void Item_func_mod::fix_length_and_dec()
2413 {
2414 Item_num_op::fix_length_and_dec();
2415 maybe_null= 1;
2416 unsigned_flag= args[0]->unsigned_flag;
2417 }
2418
2419
real_op()2420 double Item_func_neg::real_op()
2421 {
2422 double value= args[0]->val_real();
2423 null_value= args[0]->null_value;
2424 return -value;
2425 }
2426
2427
int_op()2428 longlong Item_func_neg::int_op()
2429 {
2430 longlong value= args[0]->val_int();
2431 if ((null_value= args[0]->null_value))
2432 return 0;
2433 if (args[0]->unsigned_flag &&
2434 (ulonglong) value > (ulonglong) LLONG_MAX + 1ULL)
2435 return raise_integer_overflow();
2436 // For some platforms we need special handling of LLONG_MIN to
2437 // guarantee overflow.
2438 if (value == LLONG_MIN &&
2439 !args[0]->unsigned_flag &&
2440 !unsigned_flag)
2441 return raise_integer_overflow();
2442 return check_integer_overflow(-value, !args[0]->unsigned_flag && value < 0);
2443 }
2444
2445
decimal_op(my_decimal * decimal_value)2446 my_decimal *Item_func_neg::decimal_op(my_decimal *decimal_value)
2447 {
2448 my_decimal val, *value= args[0]->val_decimal(&val);
2449 if (!(null_value= args[0]->null_value))
2450 {
2451 my_decimal2decimal(value, decimal_value);
2452 my_decimal_neg(decimal_value);
2453 return decimal_value;
2454 }
2455 return 0;
2456 }
2457
2458
fix_num_length_and_dec()2459 void Item_func_neg::fix_num_length_and_dec()
2460 {
2461 decimals= args[0]->decimals;
2462 /* 1 add because sign can appear */
2463 max_length= args[0]->max_length + 1;
2464 }
2465
2466
fix_length_and_dec()2467 void Item_func_neg::fix_length_and_dec()
2468 {
2469 DBUG_ENTER("Item_func_neg::fix_length_and_dec");
2470 Item_func_num1::fix_length_and_dec();
2471
2472 /*
2473 If this is in integer context keep the context as integer if possible
2474 (This is how multiplication and other integer functions works)
2475 Use val() to get value as arg_type doesn't mean that item is
2476 Item_int or Item_real due to existence of Item_param.
2477 */
2478 if (hybrid_type == INT_RESULT && args[0]->const_item())
2479 {
2480 longlong val= args[0]->val_int();
2481 if ((ulonglong) val >= (ulonglong) LLONG_MIN &&
2482 ((ulonglong) val != (ulonglong) LLONG_MIN ||
2483 args[0]->type() != INT_ITEM))
2484 {
2485 /*
2486 Ensure that result is converted to DECIMAL, as longlong can't hold
2487 the negated number
2488 */
2489 hybrid_type= DECIMAL_RESULT;
2490 DBUG_PRINT("info", ("Type changed: DECIMAL_RESULT"));
2491 }
2492 }
2493 unsigned_flag= 0;
2494 DBUG_VOID_RETURN;
2495 }
2496
2497
real_op()2498 double Item_func_abs::real_op()
2499 {
2500 double value= args[0]->val_real();
2501 null_value= args[0]->null_value;
2502 return fabs(value);
2503 }
2504
2505
int_op()2506 longlong Item_func_abs::int_op()
2507 {
2508 longlong value= args[0]->val_int();
2509 if ((null_value= args[0]->null_value))
2510 return 0;
2511 if (unsigned_flag)
2512 return value;
2513 /* -LLONG_MIN = LLONG_MAX + 1 => outside of signed longlong range */
2514 if (value == LLONG_MIN)
2515 return raise_integer_overflow();
2516 return (value >= 0) ? value : -value;
2517 }
2518
2519
decimal_op(my_decimal * decimal_value)2520 my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
2521 {
2522 my_decimal val, *value= args[0]->val_decimal(&val);
2523 if (!(null_value= args[0]->null_value))
2524 {
2525 my_decimal2decimal(value, decimal_value);
2526 if (decimal_value->sign())
2527 my_decimal_neg(decimal_value);
2528 return decimal_value;
2529 }
2530 return 0;
2531 }
2532
2533
fix_length_and_dec()2534 void Item_func_abs::fix_length_and_dec()
2535 {
2536 Item_func_num1::fix_length_and_dec();
2537 unsigned_flag= args[0]->unsigned_flag;
2538 }
2539
2540
fix_length_and_dec()2541 void Item_func_latlongfromgeohash::fix_length_and_dec()
2542 {
2543 Item_real_func::fix_length_and_dec();
2544 unsigned_flag= FALSE;
2545 }
2546
2547
fix_fields(THD * thd,Item ** ref)2548 bool Item_func_latlongfromgeohash::fix_fields(THD *thd, Item **ref)
2549 {
2550 if (Item_real_func::fix_fields(thd, ref))
2551 return true;
2552
2553 maybe_null= args[0]->maybe_null;
2554
2555 if (!check_geohash_argument_valid_type(args[0]))
2556 {
2557 my_error(ER_INCORRECT_TYPE, MYF(0), "geohash", func_name());
2558 return true;
2559 }
2560
2561 return false;
2562 }
2563
2564
2565 /**
2566 Checks if geohash arguments is of valid type
2567
2568 We must enforce that input actually is text/char, since
2569 SELECT LongFromGeohash(0123) would give different (and wrong) result,
2570 as opposed to SELECT LongFromGeohash("0123").
2571
2572 @param item Item to validate.
2573
2574 @return false if validation failed. true if item is a valid type.
2575 */
2576 bool
check_geohash_argument_valid_type(Item * item)2577 Item_func_latlongfromgeohash::check_geohash_argument_valid_type(Item *item)
2578 {
2579 if (Item_func_geohash::is_item_null(item))
2580 return true;
2581
2582 /*
2583 If charset is not binary and field_type() is BLOB,
2584 we have a TEXT column (which is allowed).
2585 */
2586 bool is_binary_charset= (item->collation.collation == &my_charset_bin);
2587 bool is_parameter_marker= (item->type() == PARAM_ITEM);
2588
2589 switch (item->field_type())
2590 {
2591 case MYSQL_TYPE_VARCHAR:
2592 case MYSQL_TYPE_VAR_STRING:
2593 case MYSQL_TYPE_STRING:
2594 case MYSQL_TYPE_BLOB:
2595 case MYSQL_TYPE_TINY_BLOB:
2596 case MYSQL_TYPE_MEDIUM_BLOB:
2597 case MYSQL_TYPE_LONG_BLOB:
2598 return (!is_binary_charset || is_parameter_marker);
2599 default:
2600 return false;
2601 }
2602 }
2603
2604
2605 /**
2606 Decodes a geohash string into longitude and latitude.
2607
2608 The results are rounded, based on the length of input geohash. The function
2609 will stop evaluating when the error range, or "accuracy", has become 0.0 for
2610 both latitude and longitude since no more changes can happen after this.
2611
2612 @param geohash The geohash to decode.
2613 @param upper_latitude Upper limit of returned latitude (normally 90.0).
2614 @param upper_latitude Lower limit of returned latitude (normally -90.0).
2615 @param upper_latitude Upper limit of returned longitude (normally 180.0).
2616 @param upper_latitude Lower limit of returned longitude (normally -180.0).
2617 @param[out] result_latitude Calculated latitude.
2618 @param[out] result_longitude Calculated longitude.
2619
2620 @return false on success, true on failure (invalid geohash string).
2621 */
2622 bool
decode_geohash(String * geohash,double upper_latitude,double lower_latitude,double upper_longitude,double lower_longitude,double * result_latitude,double * result_longitude)2623 Item_func_latlongfromgeohash::decode_geohash(String *geohash,
2624 double upper_latitude,
2625 double lower_latitude,
2626 double upper_longitude,
2627 double lower_longitude,
2628 double *result_latitude,
2629 double *result_longitude)
2630 {
2631 double latitude_accuracy= (upper_latitude - lower_latitude) / 2.0;
2632 double longitude_accuracy= (upper_longitude - lower_longitude) / 2.0;
2633
2634 double latitude_value= (upper_latitude + lower_latitude) / 2.0;
2635 double longitude_value= (upper_longitude + lower_longitude) / 2.0;
2636
2637 uint number_of_bits_used= 0;
2638 uint input_length= geohash->length();
2639
2640 for (uint i= 0;
2641 i < input_length && latitude_accuracy > 0.0 && longitude_accuracy > 0.0;
2642 i++)
2643 {
2644 char input_character= my_tolower(&my_charset_latin1, (*geohash)[i]);
2645
2646 /*
2647 The following part will convert from character value to a
2648 contiguous value from 0 to 31, where "0" = 0, "1" = 1 ... "z" = 31.
2649 It will also detect characters that aren't allowed.
2650 */
2651 int converted_character;
2652 if (input_character >= '0' && input_character <= '9')
2653 {
2654 converted_character= input_character - '0';
2655 }
2656 else if (input_character >= 'b' && input_character <= 'z' &&
2657 input_character != 'i' &&
2658 input_character != 'l' &&
2659 input_character != 'o')
2660 {
2661 if (input_character > 'o')
2662 converted_character= input_character - ('b' - 10 + 3);
2663 else if (input_character > 'l')
2664 converted_character= input_character - ('b' - 10 + 2);
2665 else if (input_character > 'i')
2666 converted_character= input_character - ('b' - 10 + 1);
2667 else
2668 converted_character= input_character - ('b' - 10);
2669 }
2670 else
2671 {
2672 return true;
2673 }
2674
2675 DBUG_ASSERT(converted_character >= 0 && converted_character <= 31);
2676
2677 /*
2678 This loop decodes 5 bits of data. Every even bit (counting from 0) is
2679 used for longitude value, and odd bits are used for latitude value.
2680 */
2681 for (int bit_number= 4; bit_number >= 0; bit_number-= 1)
2682 {
2683 if (number_of_bits_used % 2 == 0)
2684 {
2685 longitude_accuracy/= 2.0;
2686
2687 if (converted_character & (1 << bit_number))
2688 longitude_value+= longitude_accuracy;
2689 else
2690 longitude_value-= longitude_accuracy;
2691 }
2692 else
2693 {
2694 latitude_accuracy/= 2.0;
2695
2696 if (converted_character & (1 << bit_number))
2697 latitude_value+= latitude_accuracy;
2698 else
2699 latitude_value-= latitude_accuracy;
2700 }
2701
2702 number_of_bits_used++;
2703
2704 DBUG_ASSERT(latitude_value >= lower_latitude &&
2705 latitude_value <= upper_latitude &&
2706 longitude_value >= lower_longitude &&
2707 longitude_value <= upper_longitude);
2708 }
2709 }
2710
2711 *result_latitude= round_latlongitude(latitude_value,
2712 latitude_accuracy * 2.0,
2713 latitude_value - latitude_accuracy,
2714 latitude_value + latitude_accuracy);
2715 *result_longitude= round_latlongitude(longitude_value,
2716 longitude_accuracy * 2.0,
2717 longitude_value - longitude_accuracy,
2718 longitude_value + longitude_accuracy);
2719
2720 /*
2721 Ensure that the rounded results are not ouside of the valid range. As
2722 written in the specification:
2723
2724 Final rounding should be done carefully in a way that
2725 min <= round(value) <= max
2726 */
2727 DBUG_ASSERT(latitude_value - latitude_accuracy <= *result_latitude);
2728 DBUG_ASSERT(*result_latitude <= latitude_value + latitude_accuracy);
2729
2730 DBUG_ASSERT(longitude_value - longitude_accuracy <= *result_longitude);
2731 DBUG_ASSERT(*result_longitude <= longitude_value + longitude_accuracy);
2732
2733 return false;
2734 }
2735
2736
2737 /**
2738 Rounds a latitude or longitude value.
2739
2740 This will round a latitude or longitude value, based on error_range.
2741 The error_range is the difference between upper and lower lat/longitude
2742 (e.g upper value of 45.0 and a lower value of 22.5, gives an error range of
2743 22.5).
2744
2745 The returned result will always be in the range [lower_limit, upper_limit]
2746
2747 @param latlongitude The latitude or longitude to round.
2748 @param error_range The total error range of the calculated laglongitude.
2749 @param lower_limit Lower limit of the returned result.
2750 @param upper_limit Upper limit of the returned result.
2751
2752 @return A rounded latitude or longitude.
2753 */
round_latlongitude(double latlongitude,double error_range,double lower_limit,double upper_limit)2754 double Item_func_latlongfromgeohash::round_latlongitude(double latlongitude,
2755 double error_range,
2756 double lower_limit,
2757 double upper_limit)
2758 {
2759 // Ensure that we don't start with an impossible case to solve.
2760 DBUG_ASSERT(lower_limit <= latlongitude);
2761 DBUG_ASSERT(upper_limit >= latlongitude);
2762
2763 if (error_range == 0.0)
2764 {
2765 return latlongitude;
2766 }
2767 else
2768 {
2769 uint number_of_decimals= 0;
2770 while (error_range <= 0.1 && number_of_decimals <= DBL_DIG)
2771 {
2772 number_of_decimals++;
2773 error_range*= 10.0;
2774 }
2775
2776 double return_value;
2777 do
2778 {
2779 return_value= my_double_round(latlongitude, number_of_decimals, false,
2780 false);
2781 number_of_decimals++;
2782 } while ((lower_limit > return_value || return_value > upper_limit) &&
2783 number_of_decimals <= DBL_DIG);
2784
2785 /*
2786 We may in some cases still be outside of the allowed range. If this is the
2787 case, return the input value (which we know for sure to be within the
2788 allowed range).
2789 */
2790 if (lower_limit > return_value || return_value > upper_limit)
2791 return_value= latlongitude;
2792
2793 // Avoid printing signed zero.
2794 return return_value + 0.0;
2795 }
2796 }
2797
2798
2799 /**
2800 Decodes a geohash into longitude if start_on_even_bit == true, or latitude if
2801 start_on_even_bit == false. The output will be rounded based on the length
2802 of the geohash.
2803 */
val_real()2804 double Item_func_latlongfromgeohash::val_real()
2805 {
2806 DBUG_ASSERT(fixed == TRUE);
2807
2808 String buf;
2809 String *input_value= args[0]->val_str_ascii(&buf);
2810
2811 if ((null_value= args[0]->null_value))
2812 return 0.0;
2813
2814 if (input_value->length() == 0)
2815 {
2816 my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), "geohash",
2817 input_value->c_ptr_safe(), func_name());
2818 return error_real();
2819 }
2820
2821 double latitude= 0.0;
2822 double longitude= 0.0;
2823 if (decode_geohash(input_value, upper_latitude, lower_latitude,
2824 upper_longitude, lower_longitude, &latitude, &longitude))
2825 {
2826 my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), "geohash",
2827 input_value->c_ptr_safe(), func_name());
2828 return error_real();
2829 }
2830
2831 // Return longitude if start_on_even_bit == true. Otherwise, return latitude.
2832 if (start_on_even_bit)
2833 return longitude;
2834 return latitude;
2835 }
2836
2837
fix_length_and_dec()2838 void Item_dec_func::fix_length_and_dec()
2839 {
2840 decimals= NOT_FIXED_DEC;
2841 max_length= float_length(decimals);
2842 maybe_null= 1;
2843 reject_geometry_args(arg_count, args, this);
2844 }
2845
2846
2847 /** Gateway to natural LOG function. */
val_real()2848 double Item_func_ln::val_real()
2849 {
2850 DBUG_ASSERT(fixed == 1);
2851 double value= args[0]->val_real();
2852 if ((null_value= args[0]->null_value))
2853 return 0.0;
2854 if (value <= 0.0)
2855 {
2856 signal_invalid_argument_for_log();
2857 return 0.0;
2858 }
2859 return log(value);
2860 }
2861
2862
2863 /**
2864 Extended but so slower LOG function.
2865
2866 We have to check if all values are > zero and first one is not one
2867 as these are the cases then result is not a number.
2868 */
val_real()2869 double Item_func_log::val_real()
2870 {
2871 DBUG_ASSERT(fixed == 1);
2872 double value= args[0]->val_real();
2873 if ((null_value= args[0]->null_value))
2874 return 0.0;
2875 if (value <= 0.0)
2876 {
2877 signal_invalid_argument_for_log();
2878 return 0.0;
2879 }
2880 if (arg_count == 2)
2881 {
2882 double value2= args[1]->val_real();
2883 if ((null_value= args[1]->null_value))
2884 return 0.0;
2885 if (value2 <= 0.0 || value == 1.0)
2886 {
2887 signal_invalid_argument_for_log();
2888 return 0.0;
2889 }
2890 return log(value2) / log(value);
2891 }
2892 return log(value);
2893 }
2894
val_real()2895 double Item_func_log2::val_real()
2896 {
2897 DBUG_ASSERT(fixed == 1);
2898 double value= args[0]->val_real();
2899
2900 if ((null_value=args[0]->null_value))
2901 return 0.0;
2902 if (value <= 0.0)
2903 {
2904 signal_invalid_argument_for_log();
2905 return 0.0;
2906 }
2907 return log(value) / M_LN2;
2908 }
2909
val_real()2910 double Item_func_log10::val_real()
2911 {
2912 DBUG_ASSERT(fixed == 1);
2913 double value= args[0]->val_real();
2914 if ((null_value= args[0]->null_value))
2915 return 0.0;
2916 if (value <= 0.0)
2917 {
2918 signal_invalid_argument_for_log();
2919 return 0.0;
2920 }
2921 return log10(value);
2922 }
2923
val_real()2924 double Item_func_exp::val_real()
2925 {
2926 DBUG_ASSERT(fixed == 1);
2927 double value= args[0]->val_real();
2928 if ((null_value=args[0]->null_value))
2929 return 0.0; /* purecov: inspected */
2930 return check_float_overflow(exp(value));
2931 }
2932
val_real()2933 double Item_func_sqrt::val_real()
2934 {
2935 DBUG_ASSERT(fixed == 1);
2936 double value= args[0]->val_real();
2937 if ((null_value=(args[0]->null_value || value < 0)))
2938 return 0.0; /* purecov: inspected */
2939 return sqrt(value);
2940 }
2941
val_real()2942 double Item_func_pow::val_real()
2943 {
2944 DBUG_ASSERT(fixed == 1);
2945 double value= args[0]->val_real();
2946 double val2= args[1]->val_real();
2947 if ((null_value=(args[0]->null_value || args[1]->null_value)))
2948 return 0.0; /* purecov: inspected */
2949 return check_float_overflow(pow(value,val2));
2950 }
2951
2952 // Trigonometric functions
2953
val_real()2954 double Item_func_acos::val_real()
2955 {
2956 DBUG_ASSERT(fixed == 1);
2957 /* One can use this to defer SELECT processing. */
2958 DEBUG_SYNC(current_thd, "before_acos_function");
2959 // the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
2960 volatile double value= args[0]->val_real();
2961 if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
2962 return 0.0;
2963 return acos(value);
2964 }
2965
val_real()2966 double Item_func_asin::val_real()
2967 {
2968 DBUG_ASSERT(fixed == 1);
2969 // the volatile's for BUG #2338 to calm optimizer down (because of gcc's bug)
2970 volatile double value= args[0]->val_real();
2971 if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
2972 return 0.0;
2973 return asin(value);
2974 }
2975
val_real()2976 double Item_func_atan::val_real()
2977 {
2978 DBUG_ASSERT(fixed == 1);
2979 double value= args[0]->val_real();
2980 if ((null_value=args[0]->null_value))
2981 return 0.0;
2982 if (arg_count == 2)
2983 {
2984 double val2= args[1]->val_real();
2985 if ((null_value=args[1]->null_value))
2986 return 0.0;
2987 return check_float_overflow(atan2(value,val2));
2988 }
2989 return atan(value);
2990 }
2991
val_real()2992 double Item_func_cos::val_real()
2993 {
2994 DBUG_ASSERT(fixed == 1);
2995 double value= args[0]->val_real();
2996 if ((null_value=args[0]->null_value))
2997 return 0.0;
2998 return cos(value);
2999 }
3000
val_real()3001 double Item_func_sin::val_real()
3002 {
3003 DBUG_ASSERT(fixed == 1);
3004 double value= args[0]->val_real();
3005 if ((null_value=args[0]->null_value))
3006 return 0.0;
3007 return sin(value);
3008 }
3009
val_real()3010 double Item_func_tan::val_real()
3011 {
3012 DBUG_ASSERT(fixed == 1);
3013 double value= args[0]->val_real();
3014 if ((null_value=args[0]->null_value))
3015 return 0.0;
3016 return check_float_overflow(tan(value));
3017 }
3018
3019
val_real()3020 double Item_func_cot::val_real()
3021 {
3022 DBUG_ASSERT(fixed == 1);
3023 double value= args[0]->val_real();
3024 if ((null_value=args[0]->null_value))
3025 return 0.0;
3026 return check_float_overflow(1.0 / tan(value));
3027 }
3028
3029
3030 // Shift-functions, same as << and >> in C/C++
3031
3032
val_int()3033 longlong Item_func_shift_left::val_int()
3034 {
3035 DBUG_ASSERT(fixed == 1);
3036 uint shift;
3037 ulonglong res= ((ulonglong) args[0]->val_int() <<
3038 (shift=(uint) args[1]->val_int()));
3039 if (args[0]->null_value || args[1]->null_value)
3040 {
3041 null_value=1;
3042 return 0;
3043 }
3044 null_value=0;
3045 return (shift < sizeof(longlong)*8 ? (longlong) res : 0LL);
3046 }
3047
val_int()3048 longlong Item_func_shift_right::val_int()
3049 {
3050 DBUG_ASSERT(fixed == 1);
3051 uint shift;
3052 ulonglong res= (ulonglong) args[0]->val_int() >>
3053 (shift=(uint) args[1]->val_int());
3054 if (args[0]->null_value || args[1]->null_value)
3055 {
3056 null_value=1;
3057 return 0;
3058 }
3059 null_value=0;
3060 return (shift < sizeof(longlong)*8 ? (longlong) res : 0LL);
3061 }
3062
3063
val_int()3064 longlong Item_func_bit_neg::val_int()
3065 {
3066 DBUG_ASSERT(fixed == 1);
3067 ulonglong res= (ulonglong) args[0]->val_int();
3068 if ((null_value=args[0]->null_value))
3069 return 0;
3070 return ~res;
3071 }
3072
3073
3074 // Conversion functions
3075
fix_length_and_dec()3076 void Item_func_integer::fix_length_and_dec()
3077 {
3078 max_length=args[0]->max_length - args[0]->decimals+1;
3079 uint tmp=float_length(decimals);
3080 set_if_smaller(max_length,tmp);
3081 decimals=0;
3082 reject_geometry_args(arg_count, args, this);
3083 }
3084
fix_num_length_and_dec()3085 void Item_func_int_val::fix_num_length_and_dec()
3086 {
3087 ulonglong tmp_max_length= (ulonglong ) args[0]->max_length -
3088 (args[0]->decimals ? args[0]->decimals + 1 : 0) + 2;
3089 max_length= tmp_max_length > (ulonglong) 4294967295U ?
3090 (uint32) 4294967295U : (uint32) tmp_max_length;
3091 uint tmp= float_length(decimals);
3092 set_if_smaller(max_length,tmp);
3093 decimals= 0;
3094 }
3095
3096
find_num_type()3097 void Item_func_int_val::find_num_type()
3098 {
3099 DBUG_ENTER("Item_func_int_val::find_num_type");
3100 DBUG_PRINT("info", ("name %s", func_name()));
3101 switch(hybrid_type= args[0]->result_type())
3102 {
3103 case STRING_RESULT:
3104 case REAL_RESULT:
3105 hybrid_type= REAL_RESULT;
3106 max_length= float_length(decimals);
3107 break;
3108 case INT_RESULT:
3109 case DECIMAL_RESULT:
3110 /*
3111 -2 because in most high position can't be used any digit for longlong
3112 and one position for increasing value during operation
3113 */
3114 if ((args[0]->max_length - args[0]->decimals) >=
3115 (DECIMAL_LONGLONG_DIGITS - 2))
3116 {
3117 hybrid_type= DECIMAL_RESULT;
3118 }
3119 else
3120 {
3121 unsigned_flag= args[0]->unsigned_flag;
3122 hybrid_type= INT_RESULT;
3123 }
3124 break;
3125 default:
3126 DBUG_ASSERT(0);
3127 }
3128 DBUG_PRINT("info", ("Type: %s",
3129 (hybrid_type == REAL_RESULT ? "REAL_RESULT" :
3130 hybrid_type == DECIMAL_RESULT ? "DECIMAL_RESULT" :
3131 hybrid_type == INT_RESULT ? "INT_RESULT" :
3132 "--ILLEGAL!!!--")));
3133
3134 DBUG_VOID_RETURN;
3135 }
3136
3137
int_op()3138 longlong Item_func_ceiling::int_op()
3139 {
3140 longlong result;
3141 switch (args[0]->result_type()) {
3142 case INT_RESULT:
3143 result= args[0]->val_int();
3144 null_value= args[0]->null_value;
3145 break;
3146 case DECIMAL_RESULT:
3147 {
3148 my_decimal dec_buf, *dec;
3149 if ((dec= Item_func_ceiling::decimal_op(&dec_buf)))
3150 my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
3151 else
3152 result= 0;
3153 break;
3154 }
3155 default:
3156 result= (longlong)Item_func_ceiling::real_op();
3157 };
3158 return result;
3159 }
3160
3161
real_op()3162 double Item_func_ceiling::real_op()
3163 {
3164 /*
3165 the volatile's for BUG #3051 to calm optimizer down (because of gcc's
3166 bug)
3167 */
3168 volatile double value= args[0]->val_real();
3169 null_value= args[0]->null_value;
3170 return ceil(value);
3171 }
3172
3173
decimal_op(my_decimal * decimal_value)3174 my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value)
3175 {
3176 my_decimal val, *value= args[0]->val_decimal(&val);
3177 if (!(null_value= (args[0]->null_value ||
3178 my_decimal_ceiling(E_DEC_FATAL_ERROR, value,
3179 decimal_value) > 1)))
3180 return decimal_value;
3181 return 0;
3182 }
3183
3184
int_op()3185 longlong Item_func_floor::int_op()
3186 {
3187 longlong result;
3188 switch (args[0]->result_type()) {
3189 case INT_RESULT:
3190 result= args[0]->val_int();
3191 null_value= args[0]->null_value;
3192 break;
3193 case DECIMAL_RESULT:
3194 {
3195 my_decimal dec_buf, *dec;
3196 if ((dec= Item_func_floor::decimal_op(&dec_buf)))
3197 my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
3198 else
3199 result= 0;
3200 break;
3201 }
3202 default:
3203 result= (longlong)Item_func_floor::real_op();
3204 };
3205 return result;
3206 }
3207
3208
real_op()3209 double Item_func_floor::real_op()
3210 {
3211 /*
3212 the volatile's for BUG #3051 to calm optimizer down (because of gcc's
3213 bug)
3214 */
3215 volatile double value= args[0]->val_real();
3216 null_value= args[0]->null_value;
3217 return floor(value);
3218 }
3219
3220
decimal_op(my_decimal * decimal_value)3221 my_decimal *Item_func_floor::decimal_op(my_decimal *decimal_value)
3222 {
3223 my_decimal val, *value= args[0]->val_decimal(&val);
3224 if (!(null_value= (args[0]->null_value ||
3225 my_decimal_floor(E_DEC_FATAL_ERROR, value,
3226 decimal_value) > 1)))
3227 return decimal_value;
3228 return 0;
3229 }
3230
3231
fix_length_and_dec()3232 void Item_func_round::fix_length_and_dec()
3233 {
3234 int decimals_to_set;
3235 longlong val1;
3236 bool val1_unsigned;
3237
3238 unsigned_flag= args[0]->unsigned_flag;
3239 reject_geometry_args(arg_count, args, this);
3240
3241 if (!args[1]->const_item())
3242 {
3243 decimals= args[0]->decimals;
3244 max_length= float_length(decimals);
3245 if (args[0]->result_type() == DECIMAL_RESULT)
3246 {
3247 max_length++;
3248 hybrid_type= DECIMAL_RESULT;
3249 }
3250 else
3251 hybrid_type= REAL_RESULT;
3252 return;
3253 }
3254
3255 val1= args[1]->val_int();
3256 if ((null_value= args[1]->is_null()))
3257 return;
3258
3259 val1_unsigned= args[1]->unsigned_flag;
3260 if (val1 < 0)
3261 decimals_to_set= val1_unsigned ? INT_MAX : 0;
3262 else
3263 decimals_to_set= (val1 > INT_MAX) ? INT_MAX : (int) val1;
3264
3265 if (args[0]->decimals == NOT_FIXED_DEC)
3266 {
3267 decimals= min(decimals_to_set, NOT_FIXED_DEC);
3268 max_length= float_length(decimals);
3269 hybrid_type= REAL_RESULT;
3270 return;
3271 }
3272
3273 switch (args[0]->result_type()) {
3274 case REAL_RESULT:
3275 case STRING_RESULT:
3276 hybrid_type= REAL_RESULT;
3277 decimals= min(decimals_to_set, NOT_FIXED_DEC);
3278 max_length= float_length(decimals);
3279 break;
3280 case INT_RESULT:
3281 if ((!decimals_to_set && truncate) || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))
3282 {
3283 int length_can_increase= MY_TEST(!truncate && (val1 < 0) && !val1_unsigned);
3284 max_length= args[0]->max_length + length_can_increase;
3285 /* Here we can keep INT_RESULT */
3286 hybrid_type= INT_RESULT;
3287 decimals= 0;
3288 break;
3289 }
3290 /* fall through */
3291 case DECIMAL_RESULT:
3292 {
3293 hybrid_type= DECIMAL_RESULT;
3294 decimals_to_set= min(DECIMAL_MAX_SCALE, decimals_to_set);
3295 int decimals_delta= args[0]->decimals - decimals_to_set;
3296 int precision= args[0]->decimal_precision();
3297 int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1;
3298
3299 precision-= decimals_delta - length_increase;
3300 decimals= min(decimals_to_set, DECIMAL_MAX_SCALE);
3301 max_length= my_decimal_precision_to_length_no_truncation(precision,
3302 decimals,
3303 unsigned_flag);
3304 break;
3305 }
3306 default:
3307 DBUG_ASSERT(0); /* This result type isn't handled */
3308 }
3309 }
3310
my_double_round(double value,longlong dec,bool dec_unsigned,bool truncate)3311 double my_double_round(double value, longlong dec, bool dec_unsigned,
3312 bool truncate)
3313 {
3314 double tmp;
3315 bool dec_negative= (dec < 0) && !dec_unsigned;
3316 ulonglong abs_dec= dec_negative ? -dec : dec;
3317 /*
3318 tmp2 is here to avoid return the value with 80 bit precision
3319 This will fix that the test round(0.1,1) = round(0.1,1) is true
3320 Tagging with volatile is no guarantee, it may still be optimized away...
3321 */
3322 volatile double tmp2;
3323
3324 tmp=(abs_dec < array_elements(log_10) ?
3325 log_10[abs_dec] : pow(10.0,(double) abs_dec));
3326
3327 // Pre-compute these, to avoid optimizing away e.g. 'floor(v/tmp) * tmp'.
3328 volatile double value_div_tmp= value / tmp;
3329 volatile double value_mul_tmp= value * tmp;
3330
3331 if (dec_negative && my_isinf(tmp))
3332 tmp2= 0.0;
3333 else if (!dec_negative &&
3334 (my_isinf(value_mul_tmp) || my_isnan(value_mul_tmp)))
3335 tmp2= value;
3336 else if (truncate)
3337 {
3338 if (value >= 0.0)
3339 tmp2= dec < 0 ? floor(value_div_tmp) * tmp : floor(value_mul_tmp) / tmp;
3340 else
3341 tmp2= dec < 0 ? ceil(value_div_tmp) * tmp : ceil(value_mul_tmp) / tmp;
3342 }
3343 else
3344 tmp2=dec < 0 ? rint(value_div_tmp) * tmp : rint(value_mul_tmp) / tmp;
3345
3346 return tmp2;
3347 }
3348
3349
real_op()3350 double Item_func_round::real_op()
3351 {
3352 const double value= args[0]->val_real();
3353 const longlong decimal_places= args[1]->val_int();
3354
3355 if (!(null_value= args[0]->null_value || args[1]->null_value))
3356 return my_double_round(value, decimal_places, args[1]->unsigned_flag,
3357 truncate);
3358
3359 return 0.0;
3360 }
3361
3362 /*
3363 Rounds a given value to a power of 10 specified as the 'to' argument,
3364 avoiding overflows when the value is close to the ulonglong range boundary.
3365 */
3366
my_unsigned_round(ulonglong value,ulonglong to)3367 static inline ulonglong my_unsigned_round(ulonglong value, ulonglong to)
3368 {
3369 ulonglong tmp= value / to * to;
3370 return (value - tmp < (to >> 1)) ? tmp : tmp + to;
3371 }
3372
3373
int_op()3374 longlong Item_func_round::int_op()
3375 {
3376 longlong value= args[0]->val_int();
3377 longlong dec= args[1]->val_int();
3378 decimals= 0;
3379 ulonglong abs_dec;
3380 if ((null_value= args[0]->null_value || args[1]->null_value))
3381 return 0;
3382 if ((dec >= 0) || args[1]->unsigned_flag)
3383 return value; // integer have not digits after point
3384
3385 abs_dec= -dec;
3386 longlong tmp;
3387
3388 if(abs_dec >= array_elements(log_10_int))
3389 return 0;
3390
3391 tmp= log_10_int[abs_dec];
3392
3393 if (truncate)
3394 value= (unsigned_flag) ?
3395 ((ulonglong) value / tmp) * tmp : (value / tmp) * tmp;
3396 else
3397 value= (unsigned_flag || value >= 0) ?
3398 my_unsigned_round((ulonglong) value, tmp) :
3399 -(longlong) my_unsigned_round((ulonglong) -value, tmp);
3400 return value;
3401 }
3402
3403
decimal_op(my_decimal * decimal_value)3404 my_decimal *Item_func_round::decimal_op(my_decimal *decimal_value)
3405 {
3406 my_decimal val, *value= args[0]->val_decimal(&val);
3407 longlong dec= args[1]->val_int();
3408 if (dec >= 0 || args[1]->unsigned_flag)
3409 dec= min<ulonglong>(dec, decimals);
3410 else if (dec < INT_MIN)
3411 dec= INT_MIN;
3412
3413 if (!(null_value= (args[0]->null_value || args[1]->null_value ||
3414 my_decimal_round(E_DEC_FATAL_ERROR, value, (int) dec,
3415 truncate, decimal_value) > 1)))
3416 return decimal_value;
3417 return 0;
3418 }
3419
3420
itemize(Parse_context * pc,Item ** res)3421 bool Item_func_rand::itemize(Parse_context *pc, Item **res)
3422 {
3423 if (skip_itemize(res))
3424 return false;
3425 if (super::itemize(pc, res))
3426 return true;
3427 /*
3428 When RAND() is binlogged, the seed is binlogged too. So the
3429 sequence of random numbers is the same on a replication slave as
3430 on the master. However, if several RAND() values are inserted
3431 into a table, the order in which the rows are modified may differ
3432 between master and slave, because the order is undefined. Hence,
3433 the statement is unsafe to log in statement format.
3434 */
3435 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
3436
3437 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_RAND);
3438 return false;
3439 }
3440
3441
seed_random(Item * arg)3442 void Item_func_rand::seed_random(Item *arg)
3443 {
3444 /*
3445 TODO: do not do reinit 'rand' for every execute of PS/SP if
3446 args[0] is a constant.
3447 */
3448 uint32 tmp= (uint32) arg->val_int();
3449 randominit(rand, (uint32) (tmp*0x10001L+55555555L),
3450 (uint32) (tmp*0x10000001L));
3451 }
3452
3453
fix_length_and_dec()3454 void Item_func_rand::fix_length_and_dec()
3455 {
3456 Item_real_func::fix_length_and_dec();
3457 reject_geometry_args(arg_count, args, this);
3458 }
3459
3460
fix_fields(THD * thd,Item ** ref)3461 bool Item_func_rand::fix_fields(THD *thd,Item **ref)
3462 {
3463 if (Item_real_func::fix_fields(thd, ref))
3464 return TRUE;
3465
3466 if (arg_count)
3467 { // Only use argument once in query
3468 /*
3469 Allocate rand structure once: we must use thd->stmt_arena
3470 to create rand in proper mem_root if it's a prepared statement or
3471 stored procedure.
3472
3473 No need to send a Rand log event if seed was given eg: RAND(seed),
3474 as it will be replicated in the query as such.
3475 */
3476 if (!rand && !(rand= (struct rand_struct*)
3477 thd->stmt_arena->alloc(sizeof(*rand))))
3478 return TRUE;
3479 }
3480 else
3481 {
3482 /*
3483 Save the seed only the first time RAND() is used in the query
3484 Once events are forwarded rather than recreated,
3485 the following can be skipped if inside the slave thread
3486 */
3487 if (!thd->rand_used)
3488 {
3489 thd->rand_used= 1;
3490 thd->rand_saved_seed1= thd->rand.seed1;
3491 thd->rand_saved_seed2= thd->rand.seed2;
3492 }
3493 rand= &thd->rand;
3494 }
3495 return FALSE;
3496 }
3497
3498
val_real()3499 double Item_func_rand::val_real()
3500 {
3501 DBUG_ASSERT(fixed == 1);
3502 if (arg_count)
3503 {
3504 if (!args[0]->const_item())
3505 seed_random(args[0]);
3506 else if (first_eval)
3507 {
3508 /*
3509 Constantness of args[0] may be set during JOIN::optimize(), if arg[0]
3510 is a field item of "constant" table. Thus, we have to evaluate
3511 seed_random() for constant arg there but not at the fix_fields method.
3512 */
3513 first_eval= FALSE;
3514 seed_random(args[0]);
3515 }
3516 }
3517 return my_rnd(rand);
3518 }
3519
3520
fix_length_and_dec()3521 void Item_func_sign::fix_length_and_dec()
3522 {
3523 Item_int_func::fix_length_and_dec();
3524 reject_geometry_args(arg_count, args, this);
3525 }
3526
3527
val_int()3528 longlong Item_func_sign::val_int()
3529 {
3530 DBUG_ASSERT(fixed == 1);
3531 double value= args[0]->val_real();
3532 null_value=args[0]->null_value;
3533 return value < 0.0 ? -1 : (value > 0 ? 1 : 0);
3534 }
3535
3536
fix_length_and_dec()3537 void Item_func_units::fix_length_and_dec()
3538 {
3539 decimals= NOT_FIXED_DEC;
3540 max_length= float_length(decimals);
3541 reject_geometry_args(arg_count, args, this);
3542 }
3543
3544
val_real()3545 double Item_func_units::val_real()
3546 {
3547 DBUG_ASSERT(fixed == 1);
3548 double value= args[0]->val_real();
3549 if ((null_value=args[0]->null_value))
3550 return 0;
3551 return check_float_overflow(value * mul + add);
3552 }
3553
3554
fix_length_and_dec()3555 void Item_func_min_max::fix_length_and_dec()
3556 {
3557 uint string_arg_count= 0;
3558 int max_int_part=0;
3559 bool datetime_found= FALSE;
3560 decimals=0;
3561 max_length=0;
3562 maybe_null=0;
3563 cmp_type= args[0]->temporal_with_date_as_number_result_type();
3564
3565 for (uint i=0 ; i < arg_count ; i++)
3566 {
3567 set_if_bigger(max_length, args[i]->max_length);
3568 set_if_bigger(decimals, args[i]->decimals);
3569 set_if_bigger(max_int_part, args[i]->decimal_int_part());
3570 if (args[i]->maybe_null)
3571 maybe_null=1;
3572 cmp_type= item_cmp_type(cmp_type,
3573 args[i]->temporal_with_date_as_number_result_type());
3574 if (args[i]->result_type() == STRING_RESULT)
3575 string_arg_count++;
3576 if (args[i]->result_type() != ROW_RESULT &&
3577 args[i]->is_temporal_with_date())
3578 {
3579 datetime_found= TRUE;
3580 if (!datetime_item || args[i]->field_type() == MYSQL_TYPE_DATETIME)
3581 datetime_item= args[i];
3582 }
3583 }
3584
3585 if (string_arg_count == arg_count)
3586 {
3587 // We compare as strings only if all arguments were strings.
3588 agg_arg_charsets_for_string_result_with_comparison(collation,
3589 args, arg_count);
3590 if (datetime_found)
3591 {
3592 compare_as_dates= TRUE;
3593 /*
3594 We should not do this:
3595 cached_field_type= datetime_item->field_type();
3596 count_datetime_length(args, arg_count);
3597 because compare_as_dates can be TRUE but
3598 result type can still be VARCHAR.
3599 */
3600 }
3601 }
3602 else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
3603 {
3604 collation.set_numeric();
3605 fix_char_length(my_decimal_precision_to_length_no_truncation(max_int_part +
3606 decimals,
3607 decimals,
3608 unsigned_flag));
3609 }
3610 else if (cmp_type == REAL_RESULT)
3611 fix_char_length(float_length(decimals));
3612 cached_field_type= agg_field_type(args, arg_count);
3613 /*
3614 LEAST and GREATEST convert JSON values to strings before they are
3615 compared, so their JSON nature is lost. Raise a warning to
3616 indicate to the users that the values are not compared using the
3617 JSON comparator, as they might expect. Also update the field type
3618 of the result to reflect that the result is a string.
3619 */
3620 unsupported_json_comparison(arg_count, args,
3621 "comparison of JSON in the "
3622 "LEAST and GREATEST operators");
3623 if (cached_field_type == MYSQL_TYPE_JSON)
3624 cached_field_type= MYSQL_TYPE_VARCHAR;
3625 reject_geometry_args(arg_count, args, this);
3626 }
3627
3628
3629 /*
3630 Compare item arguments in the DATETIME context.
3631
3632 SYNOPSIS
3633 cmp_datetimes()
3634 value [out] found least/greatest DATE/DATETIME value
3635
3636 DESCRIPTION
3637 Compare item arguments as DATETIME values and return the index of the
3638 least/greatest argument in the arguments array.
3639 The correct integer DATE/DATETIME value of the found argument is
3640 stored to the value pointer, if latter is provided.
3641
3642 RETURN
3643 0 If one of arguments is NULL or there was a execution error
3644 # index of the least/greatest argument
3645 */
3646
cmp_datetimes(longlong * value)3647 uint Item_func_min_max::cmp_datetimes(longlong *value)
3648 {
3649 longlong min_max= 0;
3650 uint min_max_idx= 0;
3651
3652 for (uint i=0; i < arg_count ; i++)
3653 {
3654 Item **arg= args + i;
3655 bool is_null;
3656 THD *thd= current_thd;
3657 longlong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
3658
3659 /* Check if we need to stop (because of error or KILL) and stop the loop */
3660 if (thd->is_error())
3661 {
3662 null_value= 1;
3663 return 0;
3664 }
3665
3666 if ((null_value= args[i]->null_value))
3667 return 0;
3668 if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
3669 {
3670 min_max= res;
3671 min_max_idx= i;
3672 }
3673 }
3674 if (value)
3675 *value= min_max;
3676 return min_max_idx;
3677 }
3678
3679
cmp_times(longlong * value)3680 uint Item_func_min_max::cmp_times(longlong *value)
3681 {
3682 longlong min_max= 0;
3683 uint min_max_idx= 0;
3684 for (uint i=0; i < arg_count ; i++)
3685 {
3686 longlong res= args[i]->val_time_temporal();
3687 if ((null_value= args[i]->null_value))
3688 return 0;
3689 if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
3690 {
3691 min_max= res;
3692 min_max_idx= i;
3693 }
3694 }
3695 if (value)
3696 *value= min_max;
3697 return min_max_idx;
3698 }
3699
3700
val_str(String * str)3701 String *Item_func_min_max::val_str(String *str)
3702 {
3703 DBUG_ASSERT(fixed == 1);
3704 if (compare_as_dates)
3705 {
3706 if (is_temporal())
3707 {
3708 /*
3709 In case of temporal data types, we always return
3710 string value according the format of the data type.
3711 For example, in case of LEAST(time_column, datetime_column)
3712 the result date type is DATETIME,
3713 so we return a 'YYYY-MM-DD hh:mm:ss' string even if time_column wins
3714 (conversion from TIME to DATETIME happens in this case).
3715 */
3716 longlong result;
3717 cmp_datetimes(&result);
3718 if (null_value)
3719 return 0;
3720 MYSQL_TIME ltime;
3721 TIME_from_longlong_packed(<ime, field_type(), result);
3722 return (null_value= my_TIME_to_str(<ime, str, decimals)) ?
3723 (String *) 0 : str;
3724 }
3725 else
3726 {
3727 /*
3728 In case of VARCHAR result type we just return val_str()
3729 value of the winning item AS IS, without conversion.
3730 */
3731 String *str_res;
3732 uint min_max_idx= cmp_datetimes(NULL);
3733 if (null_value)
3734 return 0;
3735 str_res= args[min_max_idx]->val_str(str);
3736 if (args[min_max_idx]->null_value)
3737 {
3738 // check if the call to val_str() above returns a NULL value
3739 null_value= 1;
3740 return NULL;
3741 }
3742 str_res->set_charset(collation.collation);
3743 return str_res;
3744 }
3745 }
3746
3747 switch (cmp_type) {
3748 case INT_RESULT:
3749 {
3750 longlong nr=val_int();
3751 if (null_value)
3752 return 0;
3753 str->set_int(nr, unsigned_flag, collation.collation);
3754 return str;
3755 }
3756 case DECIMAL_RESULT:
3757 {
3758 my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
3759 if (null_value)
3760 return 0;
3761 my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
3762 return str;
3763 }
3764 case REAL_RESULT:
3765 {
3766 double nr= val_real();
3767 if (null_value)
3768 return 0; /* purecov: inspected */
3769 str->set_real(nr, decimals, collation.collation);
3770 return str;
3771 }
3772 case STRING_RESULT:
3773 {
3774 String *res= NULL;
3775 for (uint i=0; i < arg_count ; i++)
3776 {
3777 if (i == 0)
3778 res=args[i]->val_str(str);
3779 else
3780 {
3781 String *res2;
3782 res2= args[i]->val_str(res == str ? &tmp_value : str);
3783 if (res2)
3784 {
3785 int cmp= sortcmp(res,res2,collation.collation);
3786 if ((cmp_sign < 0 ? cmp : -cmp) < 0)
3787 res=res2;
3788 }
3789 }
3790 if ((null_value= args[i]->null_value))
3791 return 0;
3792 }
3793 res->set_charset(collation.collation);
3794 return res;
3795 }
3796 case ROW_RESULT:
3797 default:
3798 // This case should never be chosen
3799 DBUG_ASSERT(0);
3800 return 0;
3801 }
3802 return 0; // Keep compiler happy
3803 }
3804
3805
get_date(MYSQL_TIME * ltime,my_time_flags_t fuzzydate)3806 bool Item_func_min_max::get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate)
3807 {
3808 DBUG_ASSERT(fixed == 1);
3809 if (compare_as_dates)
3810 {
3811 longlong result;
3812 cmp_datetimes(&result);
3813 if (null_value)
3814 return true;
3815 TIME_from_longlong_packed(ltime, datetime_item->field_type(), result);
3816 int warnings;
3817 return check_date(ltime, non_zero_date(ltime), fuzzydate, &warnings);
3818 }
3819
3820 switch (field_type())
3821 {
3822 case MYSQL_TYPE_TIME:
3823 return get_date_from_time(ltime);
3824 case MYSQL_TYPE_DATETIME:
3825 case MYSQL_TYPE_TIMESTAMP:
3826 case MYSQL_TYPE_DATE:
3827 DBUG_ASSERT(0); // Should have been processed in "compare_as_dates" block.
3828 default:
3829 return get_date_from_non_temporal(ltime, fuzzydate);
3830 }
3831 }
3832
3833
get_time(MYSQL_TIME * ltime)3834 bool Item_func_min_max::get_time(MYSQL_TIME *ltime)
3835 {
3836 DBUG_ASSERT(fixed == 1);
3837 if (compare_as_dates)
3838 {
3839 longlong result;
3840 cmp_datetimes(&result);
3841 if (null_value)
3842 return true;
3843 TIME_from_longlong_packed(ltime, datetime_item->field_type(), result);
3844 datetime_to_time(ltime);
3845 return false;
3846 }
3847
3848 switch (field_type())
3849 {
3850 case MYSQL_TYPE_TIME:
3851 {
3852 longlong result;
3853 cmp_times(&result);
3854 if (null_value)
3855 return true;
3856 TIME_from_longlong_time_packed(ltime, result);
3857 return false;
3858 }
3859 break;
3860 case MYSQL_TYPE_DATE:
3861 case MYSQL_TYPE_TIMESTAMP:
3862 case MYSQL_TYPE_DATETIME:
3863 DBUG_ASSERT(0); // Should have been processed in "compare_as_dates" block.
3864 default:
3865 return get_time_from_non_temporal(ltime);
3866 break;
3867 }
3868 }
3869
3870
val_real()3871 double Item_func_min_max::val_real()
3872 {
3873 DBUG_ASSERT(fixed == 1);
3874 double value=0.0;
3875 if (compare_as_dates)
3876 {
3877 longlong result= 0;
3878 (void)cmp_datetimes(&result);
3879 return double_from_datetime_packed(datetime_item->field_type(), result);
3880 }
3881 for (uint i=0; i < arg_count ; i++)
3882 {
3883 if (i == 0)
3884 value= args[i]->val_real();
3885 else
3886 {
3887 double tmp= args[i]->val_real();
3888 if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
3889 value=tmp;
3890 }
3891 if ((null_value= args[i]->null_value))
3892 break;
3893 }
3894 return value;
3895 }
3896
3897
val_int()3898 longlong Item_func_min_max::val_int()
3899 {
3900 DBUG_ASSERT(fixed == 1);
3901 longlong value=0;
3902 if (compare_as_dates)
3903 {
3904 longlong result= 0;
3905 (void)cmp_datetimes(&result);
3906 return longlong_from_datetime_packed(datetime_item->field_type(), result);
3907 }
3908 /*
3909 TS-TODO: val_str decides which type to use using cmp_type.
3910 val_int, val_decimal, val_real do not check cmp_type and
3911 decide data type according to the method type.
3912 This is probably not good:
3913
3914 mysql> select least('11', '2'), least('11', '2')+0, concat(least(11,2));
3915 +------------------+--------------------+---------------------+
3916 | least('11', '2') | least('11', '2')+0 | concat(least(11,2)) |
3917 +------------------+--------------------+---------------------+
3918 | 11 | 2 | 2 |
3919 +------------------+--------------------+---------------------+
3920 1 row in set (0.00 sec)
3921
3922 Should not the second column return 11?
3923 I.e. compare as strings and return '11', then convert to number.
3924 */
3925 for (uint i=0; i < arg_count ; i++)
3926 {
3927 if (i == 0)
3928 value=args[i]->val_int();
3929 else
3930 {
3931 longlong tmp=args[i]->val_int();
3932 if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
3933 value=tmp;
3934 }
3935 if ((null_value= args[i]->null_value))
3936 break;
3937 }
3938 return value;
3939 }
3940
3941
val_decimal(my_decimal * dec)3942 my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
3943 {
3944 DBUG_ASSERT(fixed == 1);
3945 my_decimal tmp_buf, *tmp, *res= NULL;
3946
3947 if (compare_as_dates)
3948 {
3949 longlong value= 0;
3950 (void)cmp_datetimes(&value);
3951 return my_decimal_from_datetime_packed(dec, datetime_item->field_type(),
3952 value);
3953 }
3954 for (uint i=0; i < arg_count ; i++)
3955 {
3956 if (i == 0)
3957 res= args[i]->val_decimal(dec);
3958 else
3959 {
3960 tmp= args[i]->val_decimal(&tmp_buf); // Zero if NULL
3961 if (tmp && (my_decimal_cmp(tmp, res) * cmp_sign) < 0)
3962 {
3963 if (tmp == &tmp_buf)
3964 {
3965 /* Move value out of tmp_buf as this will be reused on next loop */
3966 my_decimal2decimal(tmp, dec);
3967 res= dec;
3968 }
3969 else
3970 res= tmp;
3971 }
3972 }
3973 if ((null_value= args[i]->null_value))
3974 {
3975 res= 0;
3976 break;
3977 }
3978 }
3979
3980 if (res)
3981 {
3982 /*
3983 Need this to make val_str() always return fixed
3984 number of fractional digits, according to "decimals".
3985 */
3986 my_decimal_round(E_DEC_FATAL_ERROR, res, decimals, false, res);
3987 }
3988 return res;
3989 }
3990
val_real()3991 double Item_func_rollup_const::val_real()
3992 {
3993 DBUG_ASSERT(fixed == 1);
3994 double res= args[0]->val_real();
3995 if ((null_value= args[0]->null_value))
3996 return 0.0;
3997 return res;
3998 }
3999
val_int()4000 longlong Item_func_rollup_const::val_int()
4001 {
4002 DBUG_ASSERT(fixed == 1);
4003 longlong res= args[0]->val_int();
4004 if ((null_value= args[0]->null_value))
4005 return 0;
4006 return res;
4007 }
4008
val_str(String * str)4009 String *Item_func_rollup_const::val_str(String *str)
4010 {
4011 DBUG_ASSERT(fixed == 1);
4012 String *res= args[0]->val_str(str);
4013 if ((null_value= args[0]->null_value))
4014 return 0;
4015 return res;
4016 }
4017
val_decimal(my_decimal * dec)4018 my_decimal *Item_func_rollup_const::val_decimal(my_decimal *dec)
4019 {
4020 DBUG_ASSERT(fixed == 1);
4021 my_decimal *res= args[0]->val_decimal(dec);
4022 if ((null_value= args[0]->null_value))
4023 return 0;
4024 return res;
4025 }
4026
4027
val_json(Json_wrapper * result)4028 bool Item_func_rollup_const::val_json(Json_wrapper *result)
4029 {
4030 DBUG_ASSERT(fixed == 1);
4031 bool res= args[0]->val_json(result);
4032 null_value= args[0]->null_value;
4033 return res;
4034 }
4035
4036
val_int()4037 longlong Item_func_length::val_int()
4038 {
4039 DBUG_ASSERT(fixed == 1);
4040 String *res=args[0]->val_str(&value);
4041 if (!res)
4042 {
4043 null_value=1;
4044 return 0; /* purecov: inspected */
4045 }
4046 null_value=0;
4047 return (longlong) res->length();
4048 }
4049
4050
val_int()4051 longlong Item_func_char_length::val_int()
4052 {
4053 DBUG_ASSERT(fixed == 1);
4054 String *res=args[0]->val_str(&value);
4055 if (!res)
4056 {
4057 null_value=1;
4058 return 0; /* purecov: inspected */
4059 }
4060 null_value=0;
4061 return (longlong) res->numchars();
4062 }
4063
4064
val_int()4065 longlong Item_func_coercibility::val_int()
4066 {
4067 DBUG_ASSERT(fixed == 1);
4068 null_value= 0;
4069 return (longlong) args[0]->collation.derivation;
4070 }
4071
4072
fix_length_and_dec()4073 void Item_func_locate::fix_length_and_dec()
4074 {
4075 max_length= MY_INT32_NUM_DECIMAL_DIGITS;
4076 agg_arg_charsets_for_comparison(cmp_collation, args, 2);
4077 }
4078
4079
val_int()4080 longlong Item_func_locate::val_int()
4081 {
4082 DBUG_ASSERT(fixed == 1);
4083 String *a=args[0]->val_str(&value1);
4084 String *b=args[1]->val_str(&value2);
4085 if (!a || !b)
4086 {
4087 null_value=1;
4088 return 0; /* purecov: inspected */
4089 }
4090 null_value=0;
4091 /* must be longlong to avoid truncation */
4092 longlong start= 0;
4093 longlong start0= 0;
4094 my_match_t match;
4095
4096 if (arg_count == 3)
4097 {
4098 start0= start= args[2]->val_int() - 1;
4099
4100 if ((start < 0) || (start > static_cast<longlong>(a->length())))
4101 return 0;
4102
4103 /* start is now sufficiently valid to pass to charpos function */
4104 start= a->charpos((int) start);
4105
4106 if (start + b->length() > a->length())
4107 return 0;
4108 }
4109
4110 if (!b->length()) // Found empty string at start
4111 return start + 1;
4112
4113 if (!cmp_collation.collation->coll->instr(cmp_collation.collation,
4114 a->ptr()+start,
4115 (uint) (a->length()-start),
4116 b->ptr(), b->length(),
4117 &match, 1))
4118 return 0;
4119 return (longlong) match.mb_len + start0 + 1;
4120 }
4121
4122
print(String * str,enum_query_type query_type)4123 void Item_func_locate::print(String *str, enum_query_type query_type)
4124 {
4125 str->append(STRING_WITH_LEN("locate("));
4126 args[1]->print(str, query_type);
4127 str->append(',');
4128 args[0]->print(str, query_type);
4129 if (arg_count == 3)
4130 {
4131 str->append(',');
4132 args[2]->print(str, query_type);
4133 }
4134 str->append(')');
4135 }
4136
4137
val_int()4138 longlong Item_func_validate_password_strength::val_int()
4139 {
4140 char buff[STRING_BUFFER_USUAL_SIZE];
4141 String value(buff, sizeof(buff), system_charset_info);
4142 String *field= args[0]->val_str(&value);
4143 if ((null_value= args[0]->null_value) || field->length() == 0)
4144 return 0;
4145 return (my_calculate_password_strength(field->ptr(), field->length()));
4146 }
4147
4148
val_int()4149 longlong Item_func_field::val_int()
4150 {
4151 DBUG_ASSERT(fixed == 1);
4152
4153 if (cmp_type == STRING_RESULT)
4154 {
4155 String *field;
4156 if (!(field= args[0]->val_str(&value)))
4157 return 0;
4158 for (uint i=1 ; i < arg_count ; i++)
4159 {
4160 String *tmp_value=args[i]->val_str(&tmp);
4161 if (tmp_value && !sortcmp(field,tmp_value,cmp_collation.collation))
4162 return (longlong) (i);
4163 }
4164 }
4165 else if (cmp_type == INT_RESULT)
4166 {
4167 longlong val= args[0]->val_int();
4168 if (args[0]->null_value)
4169 return 0;
4170 for (uint i=1; i < arg_count ; i++)
4171 {
4172 if (val == args[i]->val_int() && !args[i]->null_value)
4173 return (longlong) (i);
4174 }
4175 }
4176 else if (cmp_type == DECIMAL_RESULT)
4177 {
4178 my_decimal dec_arg_buf, *dec_arg,
4179 dec_buf, *dec= args[0]->val_decimal(&dec_buf);
4180 if (args[0]->null_value)
4181 return 0;
4182 for (uint i=1; i < arg_count; i++)
4183 {
4184 dec_arg= args[i]->val_decimal(&dec_arg_buf);
4185 if (!args[i]->null_value && !my_decimal_cmp(dec_arg, dec))
4186 return (longlong) (i);
4187 }
4188 }
4189 else
4190 {
4191 double val= args[0]->val_real();
4192 if (args[0]->null_value)
4193 return 0;
4194 for (uint i=1; i < arg_count ; i++)
4195 {
4196 if (val == args[i]->val_real() && !args[i]->null_value)
4197 return (longlong) (i);
4198 }
4199 }
4200 return 0;
4201 }
4202
4203
fix_length_and_dec()4204 void Item_func_field::fix_length_and_dec()
4205 {
4206 maybe_null=0; max_length=3;
4207 cmp_type= args[0]->result_type();
4208 for (uint i=1; i < arg_count ; i++)
4209 cmp_type= item_cmp_type(cmp_type, args[i]->result_type());
4210 if (cmp_type == STRING_RESULT)
4211 agg_arg_charsets_for_comparison(cmp_collation, args, arg_count);
4212 }
4213
4214
val_int()4215 longlong Item_func_ascii::val_int()
4216 {
4217 DBUG_ASSERT(fixed == 1);
4218 String *res=args[0]->val_str(&value);
4219 if (!res)
4220 {
4221 null_value=1;
4222 return 0;
4223 }
4224 null_value=0;
4225 return (longlong) (res->length() ? (uchar) (*res)[0] : (uchar) 0);
4226 }
4227
val_int()4228 longlong Item_func_ord::val_int()
4229 {
4230 DBUG_ASSERT(fixed == 1);
4231 String *res=args[0]->val_str(&value);
4232 if (!res)
4233 {
4234 null_value=1;
4235 return 0;
4236 }
4237 null_value=0;
4238 if (!res->length()) return 0;
4239 if (use_mb(res->charset()))
4240 {
4241 const char *str=res->ptr();
4242 uint32 n=0, l=my_ismbchar(res->charset(),str,str+res->length());
4243 if (!l)
4244 return (longlong)((uchar) *str);
4245 while (l--)
4246 n=(n<<8)|(uint32)((uchar) *str++);
4247 return (longlong) n;
4248 }
4249 return (longlong) ((uchar) (*res)[0]);
4250 }
4251
4252 /* Search after a string in a string of strings separated by ',' */
4253 /* Returns number of found type >= 1 or 0 if not found */
4254 /* This optimizes searching in enums to bit testing! */
4255
fix_length_and_dec()4256 void Item_func_find_in_set::fix_length_and_dec()
4257 {
4258 decimals=0;
4259 max_length=3; // 1-999
4260 if (args[0]->const_item() && args[1]->type() == FIELD_ITEM)
4261 {
4262 Field *field= ((Item_field*) args[1])->field;
4263 if (field->real_type() == MYSQL_TYPE_SET)
4264 {
4265 String *find=args[0]->val_str(&value);
4266 if (find)
4267 {
4268 // find is not NULL pointer so args[0] is not a null-value
4269 DBUG_ASSERT(!args[0]->null_value);
4270 enum_value= find_type(((Field_enum*) field)->typelib,find->ptr(),
4271 find->length(), 0);
4272 enum_bit=0;
4273 if (enum_value)
4274 enum_bit= 1LL << (enum_value-1);
4275 }
4276 }
4277 }
4278 agg_arg_charsets_for_comparison(cmp_collation, args, 2);
4279 }
4280
4281 static const char separator=',';
4282
val_int()4283 longlong Item_func_find_in_set::val_int()
4284 {
4285 DBUG_ASSERT(fixed == 1);
4286 if (enum_value)
4287 {
4288 // enum_value is set iff args[0]->const_item() in fix_length_and_dec().
4289 DBUG_ASSERT(args[0]->const_item());
4290
4291 ulonglong tmp= (ulonglong) args[1]->val_int();
4292 null_value= args[1]->null_value;
4293 /*
4294 No need to check args[0]->null_value since enum_value is set iff
4295 args[0] is a non-null const item. Note: no DBUG_ASSERT on
4296 args[0]->null_value here because args[0] may have been replaced
4297 by an Item_cache on which val_int() has not been called. See
4298 BUG#11766317
4299 */
4300 if (!null_value)
4301 {
4302 if (tmp & enum_bit)
4303 return enum_value;
4304 }
4305 return 0L;
4306 }
4307
4308 String *find=args[0]->val_str(&value);
4309 String *buffer=args[1]->val_str(&value2);
4310 if (!find || !buffer)
4311 {
4312 null_value=1;
4313 return 0; /* purecov: inspected */
4314 }
4315 null_value=0;
4316
4317 if (buffer->length() >= find->length())
4318 {
4319 my_wc_t wc= 0;
4320 const CHARSET_INFO *cs= cmp_collation.collation;
4321 const char *str_begin= buffer->ptr();
4322 const char *str_end= buffer->ptr();
4323 const char *real_end= str_end+buffer->length();
4324 const uchar *find_str= (const uchar *) find->ptr();
4325 size_t find_str_len= find->length();
4326 int position= 0;
4327 while (1)
4328 {
4329 int symbol_len;
4330 if ((symbol_len= cs->cset->mb_wc(cs, &wc, (uchar*) str_end,
4331 (uchar*) real_end)) > 0)
4332 {
4333 const char *substr_end= str_end + symbol_len;
4334 bool is_last_item= (substr_end == real_end);
4335 bool is_separator= (wc == (my_wc_t) separator);
4336 if (is_separator || is_last_item)
4337 {
4338 position++;
4339 if (is_last_item && !is_separator)
4340 str_end= substr_end;
4341 if (!my_strnncoll(cs, (const uchar *) str_begin,
4342 (uint) (str_end - str_begin),
4343 find_str, find_str_len))
4344 return (longlong) position;
4345 else
4346 str_begin= substr_end;
4347 }
4348 str_end= substr_end;
4349 }
4350 else if (str_end - str_begin == 0 &&
4351 find_str_len == 0 &&
4352 wc == (my_wc_t) separator)
4353 return (longlong) ++position;
4354 else
4355 return 0LL;
4356 }
4357 }
4358 return 0;
4359 }
4360
val_int()4361 longlong Item_func_bit_count::val_int()
4362 {
4363 DBUG_ASSERT(fixed == 1);
4364 ulonglong value= (ulonglong) args[0]->val_int();
4365 if ((null_value= args[0]->null_value))
4366 return 0; /* purecov: inspected */
4367 return (longlong) my_count_bits(value);
4368 }
4369
4370
4371 /****************************************************************************
4372 ** Functions to handle dynamic loadable functions
4373 ** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
4374 ** Rewritten by monty.
4375 ****************************************************************************/
4376
4377 #ifdef HAVE_DLOPEN
4378
cleanup()4379 void udf_handler::cleanup()
4380 {
4381 if (!not_original)
4382 {
4383 if (initialized)
4384 {
4385 if (u_d->func_deinit != NULL)
4386 {
4387 Udf_func_deinit deinit= u_d->func_deinit;
4388 (*deinit)(&initid);
4389 }
4390 free_udf(u_d);
4391 initialized= FALSE;
4392 }
4393 if (buffers) // Because of bug in ecc
4394 delete [] buffers;
4395 buffers= 0;
4396 }
4397 }
4398
4399
4400 bool
fix_fields(THD * thd,Item_result_field * func,uint arg_count,Item ** arguments)4401 udf_handler::fix_fields(THD *thd, Item_result_field *func,
4402 uint arg_count, Item **arguments)
4403 {
4404 uchar buff[STACK_BUFF_ALLOC]; // Max argument in function
4405 DBUG_ENTER("Item_udf_func::fix_fields");
4406
4407 if (check_stack_overrun(thd, STACK_MIN_SIZE, buff))
4408 DBUG_RETURN(TRUE); // Fatal error flag is set!
4409
4410 udf_func *tmp_udf=find_udf(u_d->name.str,(uint) u_d->name.length,1);
4411
4412 if (!tmp_udf)
4413 {
4414 my_error(ER_CANT_FIND_UDF, MYF(0), u_d->name.str);
4415 DBUG_RETURN(TRUE);
4416 }
4417 u_d=tmp_udf;
4418 args=arguments;
4419
4420 /* Fix all arguments */
4421 func->maybe_null=0;
4422 used_tables_cache=0;
4423 const_item_cache=1;
4424
4425 if ((f_args.arg_count=arg_count))
4426 {
4427 if (!(f_args.arg_type= (Item_result*)
4428 sql_alloc(f_args.arg_count*sizeof(Item_result))))
4429
4430 {
4431 free_udf(u_d);
4432 DBUG_RETURN(TRUE);
4433 }
4434 uint i;
4435 Item **arg,**arg_end;
4436 for (i=0, arg=arguments, arg_end=arguments+arg_count;
4437 arg != arg_end ;
4438 arg++,i++)
4439 {
4440 if (!(*arg)->fixed &&
4441 (*arg)->fix_fields(thd, arg))
4442 DBUG_RETURN(1);
4443 // we can't assign 'item' before, because fix_fields() can change arg
4444 Item *item= *arg;
4445 if (item->check_cols(1))
4446 DBUG_RETURN(TRUE);
4447 /*
4448 TODO: We should think about this. It is not always
4449 right way just to set an UDF result to return my_charset_bin
4450 if one argument has binary sorting order.
4451 The result collation should be calculated according to arguments
4452 derivations in some cases and should not in other cases.
4453 Moreover, some arguments can represent a numeric input
4454 which doesn't effect the result character set and collation.
4455 There is no a general rule for UDF. Everything depends on
4456 the particular user defined function.
4457 */
4458 if (item->collation.collation->state & MY_CS_BINSORT)
4459 func->collation.set(&my_charset_bin);
4460 if (item->maybe_null)
4461 func->maybe_null=1;
4462 func->with_sum_func= func->with_sum_func || item->with_sum_func;
4463 used_tables_cache|=item->used_tables();
4464 const_item_cache&=item->const_item();
4465 f_args.arg_type[i]=item->result_type();
4466 }
4467 //TODO: why all following memory is not allocated with 1 call of sql_alloc?
4468 if (!(buffers=new String[arg_count]) ||
4469 !(f_args.args= (char**) sql_alloc(arg_count * sizeof(char *))) ||
4470 !(f_args.lengths= (ulong*) sql_alloc(arg_count * sizeof(long))) ||
4471 !(f_args.maybe_null= (char*) sql_alloc(arg_count * sizeof(char))) ||
4472 !(num_buffer= (char*) sql_alloc(arg_count *
4473 ALIGN_SIZE(sizeof(double)))) ||
4474 !(f_args.attributes= (char**) sql_alloc(arg_count * sizeof(char *))) ||
4475 !(f_args.attribute_lengths= (ulong*) sql_alloc(arg_count *
4476 sizeof(long))))
4477 {
4478 free_udf(u_d);
4479 DBUG_RETURN(TRUE);
4480 }
4481 }
4482 func->fix_length_and_dec();
4483 initid.max_length=func->max_length;
4484 initid.maybe_null=func->maybe_null;
4485 initid.const_item=const_item_cache;
4486 initid.decimals=func->decimals;
4487 initid.ptr=0;
4488
4489 if (u_d->func_init)
4490 {
4491 char init_msg_buff[MYSQL_ERRMSG_SIZE];
4492 char *to=num_buffer;
4493 for (uint i=0; i < arg_count; i++)
4494 {
4495 /*
4496 For a constant argument i, args->args[i] points to the argument value.
4497 For non-constant, args->args[i] is NULL.
4498 */
4499 f_args.args[i]= NULL; /* Non-const unless updated below. */
4500
4501 f_args.lengths[i]= arguments[i]->max_length;
4502 f_args.maybe_null[i]= arguments[i]->maybe_null;
4503 f_args.attributes[i]= (char*) arguments[i]->item_name.ptr();
4504 f_args.attribute_lengths[i]= arguments[i]->item_name.length();
4505
4506 if (arguments[i]->const_item())
4507 {
4508 switch (arguments[i]->result_type())
4509 {
4510 case STRING_RESULT:
4511 case DECIMAL_RESULT:
4512 {
4513 String *res= arguments[i]->val_str(&buffers[i]);
4514 if (arguments[i]->null_value)
4515 continue;
4516 f_args.args[i]= res->c_ptr_safe();
4517 f_args.lengths[i]= res->length();
4518 break;
4519 }
4520 case INT_RESULT:
4521 *((longlong*) to)= arguments[i]->val_int();
4522 if (arguments[i]->null_value)
4523 continue;
4524 f_args.args[i]= to;
4525 to+= ALIGN_SIZE(sizeof(longlong));
4526 break;
4527 case REAL_RESULT:
4528 *((double*) to)= arguments[i]->val_real();
4529 if (arguments[i]->null_value)
4530 continue;
4531 f_args.args[i]= to;
4532 to+= ALIGN_SIZE(sizeof(double));
4533 break;
4534 case ROW_RESULT:
4535 default:
4536 // This case should never be chosen
4537 DBUG_ASSERT(0);
4538 break;
4539 }
4540 }
4541 }
4542 Udf_func_init init= u_d->func_init;
4543 if ((error=(uchar) init(&initid, &f_args, init_msg_buff)))
4544 {
4545 my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
4546 u_d->name.str, init_msg_buff);
4547 free_udf(u_d);
4548 DBUG_RETURN(TRUE);
4549 }
4550 func->max_length= min<uint32>(initid.max_length, MAX_BLOB_WIDTH);
4551 func->maybe_null=initid.maybe_null;
4552 const_item_cache=initid.const_item;
4553 /*
4554 Keep used_tables_cache in sync with const_item_cache.
4555 See the comment in Item_udf_func::update_used tables.
4556 */
4557 if (!const_item_cache && !used_tables_cache)
4558 used_tables_cache= RAND_TABLE_BIT;
4559 func->decimals= min<uint>(initid.decimals, NOT_FIXED_DEC);
4560 }
4561 initialized=1;
4562 if (error)
4563 {
4564 my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
4565 u_d->name.str, ER(ER_UNKNOWN_ERROR));
4566 DBUG_RETURN(TRUE);
4567 }
4568 DBUG_RETURN(FALSE);
4569 }
4570
4571
get_arguments()4572 bool udf_handler::get_arguments()
4573 {
4574 if (error)
4575 return 1; // Got an error earlier
4576 char *to= num_buffer;
4577 uint str_count=0;
4578 for (uint i=0; i < f_args.arg_count; i++)
4579 {
4580 f_args.args[i]=0;
4581 switch (f_args.arg_type[i]) {
4582 case STRING_RESULT:
4583 case DECIMAL_RESULT:
4584 {
4585 String *res=args[i]->val_str(&buffers[str_count++]);
4586 if (!(args[i]->null_value))
4587 {
4588 f_args.args[i]= res->c_ptr_safe();
4589 f_args.lengths[i]= res->length();
4590 }
4591 else
4592 {
4593 f_args.lengths[i]= 0;
4594 }
4595 break;
4596 }
4597 case INT_RESULT:
4598 *((longlong*) to) = args[i]->val_int();
4599 if (!args[i]->null_value)
4600 {
4601 f_args.args[i]=to;
4602 to+= ALIGN_SIZE(sizeof(longlong));
4603 }
4604 break;
4605 case REAL_RESULT:
4606 *((double*) to)= args[i]->val_real();
4607 if (!args[i]->null_value)
4608 {
4609 f_args.args[i]=to;
4610 to+= ALIGN_SIZE(sizeof(double));
4611 }
4612 break;
4613 case ROW_RESULT:
4614 default:
4615 // This case should never be chosen
4616 DBUG_ASSERT(0);
4617 break;
4618 }
4619 }
4620 return 0;
4621 }
4622
4623 /**
4624 @return
4625 (String*)NULL in case of NULL values
4626 */
val_str(String * str,String * save_str)4627 String *udf_handler::val_str(String *str,String *save_str)
4628 {
4629 uchar is_null_tmp=0;
4630 ulong res_length;
4631 DBUG_ENTER("udf_handler::val_str");
4632
4633 if (get_arguments())
4634 DBUG_RETURN(0);
4635 char * (*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
4636 (char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
4637 u_d->func;
4638
4639 if ((res_length=str->alloced_length()) < MAX_FIELD_WIDTH)
4640 { // This happens VERY seldom
4641 if (str->alloc(MAX_FIELD_WIDTH))
4642 {
4643 error=1;
4644 DBUG_RETURN(0);
4645 }
4646 }
4647 char *res=func(&initid, &f_args, (char*) str->ptr(), &res_length,
4648 &is_null_tmp, &error);
4649 DBUG_PRINT("info", ("udf func returned, res_length: %lu", res_length));
4650 if (is_null_tmp || !res || error) // The !res is for safety
4651 {
4652 DBUG_PRINT("info", ("Null or error"));
4653 DBUG_RETURN(0);
4654 }
4655 if (res == str->ptr())
4656 {
4657 str->length(res_length);
4658 DBUG_PRINT("exit", ("str: %*.s", (int) str->length(), str->ptr()));
4659 DBUG_RETURN(str);
4660 }
4661 save_str->set(res, res_length, str->charset());
4662 DBUG_PRINT("exit", ("save_str: %s", save_str->ptr()));
4663 DBUG_RETURN(save_str);
4664 }
4665
4666
4667 /*
4668 For the moment, UDF functions are returning DECIMAL values as strings
4669 */
4670
val_decimal(my_bool * null_value,my_decimal * dec_buf)4671 my_decimal *udf_handler::val_decimal(my_bool *null_value, my_decimal *dec_buf)
4672 {
4673 char buf[DECIMAL_MAX_STR_LENGTH+1], *end;
4674 ulong res_length= DECIMAL_MAX_STR_LENGTH;
4675
4676 if (get_arguments())
4677 {
4678 *null_value=1;
4679 return 0;
4680 }
4681 char *(*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
4682 (char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
4683 u_d->func;
4684
4685 char *res= func(&initid, &f_args, buf, &res_length, &is_null, &error);
4686 if (is_null || error)
4687 {
4688 *null_value= 1;
4689 return 0;
4690 }
4691 end= res+ res_length;
4692 str2my_decimal(E_DEC_FATAL_ERROR, res, dec_buf, &end);
4693 return dec_buf;
4694 }
4695
4696
itemize(Parse_context * pc,Item ** res)4697 bool Item_udf_func::itemize(Parse_context *pc, Item **res)
4698 {
4699 if (skip_itemize(res))
4700 return false;
4701 if (super::itemize(pc, res))
4702 return true;
4703 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_UDF);
4704 pc->thd->lex->safe_to_cache_query= false;
4705 return false;
4706 }
4707
4708
cleanup()4709 void Item_udf_func::cleanup()
4710 {
4711 udf.cleanup();
4712 Item_func::cleanup();
4713 }
4714
4715
print(String * str,enum_query_type query_type)4716 void Item_udf_func::print(String *str, enum_query_type query_type)
4717 {
4718 str->append(func_name());
4719 str->append('(');
4720 for (uint i=0 ; i < arg_count ; i++)
4721 {
4722 if (i != 0)
4723 str->append(',');
4724 args[i]->print_item_w_name(str, query_type);
4725 }
4726 str->append(')');
4727 }
4728
4729
val_real()4730 double Item_func_udf_float::val_real()
4731 {
4732 DBUG_ASSERT(fixed == 1);
4733 DBUG_ENTER("Item_func_udf_float::val");
4734 DBUG_PRINT("info",("result_type: %d arg_count: %d",
4735 args[0]->result_type(), arg_count));
4736 DBUG_RETURN(udf.val(&null_value));
4737 }
4738
4739
val_str(String * str)4740 String *Item_func_udf_float::val_str(String *str)
4741 {
4742 DBUG_ASSERT(fixed == 1);
4743 double nr= val_real();
4744 if (null_value)
4745 return 0; /* purecov: inspected */
4746 str->set_real(nr,decimals,&my_charset_bin);
4747 return str;
4748 }
4749
4750
val_int()4751 longlong Item_func_udf_int::val_int()
4752 {
4753 DBUG_ASSERT(fixed == 1);
4754 DBUG_ENTER("Item_func_udf_int::val_int");
4755 DBUG_RETURN(udf.val_int(&null_value));
4756 }
4757
4758
val_str(String * str)4759 String *Item_func_udf_int::val_str(String *str)
4760 {
4761 DBUG_ASSERT(fixed == 1);
4762 longlong nr=val_int();
4763 if (null_value)
4764 return 0;
4765 str->set_int(nr, unsigned_flag, &my_charset_bin);
4766 return str;
4767 }
4768
4769
val_int()4770 longlong Item_func_udf_decimal::val_int()
4771 {
4772 my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
4773 longlong result;
4774 if (null_value)
4775 return 0;
4776 my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result);
4777 return result;
4778 }
4779
4780
val_real()4781 double Item_func_udf_decimal::val_real()
4782 {
4783 my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
4784 double result;
4785 if (null_value)
4786 return 0.0;
4787 my_decimal2double(E_DEC_FATAL_ERROR, dec, &result);
4788 return result;
4789 }
4790
4791
val_decimal(my_decimal * dec_buf)4792 my_decimal *Item_func_udf_decimal::val_decimal(my_decimal *dec_buf)
4793 {
4794 DBUG_ASSERT(fixed == 1);
4795 DBUG_ENTER("Item_func_udf_decimal::val_decimal");
4796 DBUG_PRINT("info",("result_type: %d arg_count: %d",
4797 args[0]->result_type(), arg_count));
4798
4799 DBUG_RETURN(udf.val_decimal(&null_value, dec_buf));
4800 }
4801
4802
val_str(String * str)4803 String *Item_func_udf_decimal::val_str(String *str)
4804 {
4805 my_decimal dec_buf, *dec= udf.val_decimal(&null_value, &dec_buf);
4806 if (null_value)
4807 return 0;
4808 if (str->length() < DECIMAL_MAX_STR_LENGTH)
4809 str->length(DECIMAL_MAX_STR_LENGTH);
4810 my_decimal_round(E_DEC_FATAL_ERROR, dec, decimals, FALSE, &dec_buf);
4811 my_decimal2string(E_DEC_FATAL_ERROR, &dec_buf, 0, 0, '0', str);
4812 return str;
4813 }
4814
4815
fix_length_and_dec()4816 void Item_func_udf_decimal::fix_length_and_dec()
4817 {
4818 fix_num_length_and_dec();
4819 }
4820
4821
4822 /* Default max_length is max argument length */
4823
fix_length_and_dec()4824 void Item_func_udf_str::fix_length_and_dec()
4825 {
4826 DBUG_ENTER("Item_func_udf_str::fix_length_and_dec");
4827 max_length=0;
4828 for (uint i = 0; i < arg_count; i++)
4829 set_if_bigger(max_length,args[i]->max_length);
4830 DBUG_VOID_RETURN;
4831 }
4832
val_str(String * str)4833 String *Item_func_udf_str::val_str(String *str)
4834 {
4835 DBUG_ASSERT(fixed == 1);
4836 String *res=udf.val_str(str,&str_value);
4837 null_value = !res;
4838 return res;
4839 }
4840
~udf_handler()4841 udf_handler::~udf_handler()
4842 {
4843 /* Everything should be properly cleaned up by this moment. */
4844 DBUG_ASSERT(not_original || !(initialized || buffers));
4845 }
4846
4847 #else
get_arguments()4848 bool udf_handler::get_arguments() { return 0; }
4849 #endif /* HAVE_DLOPEN */
4850
4851
itemize(Parse_context * pc,Item ** res)4852 bool Item_master_pos_wait::itemize(Parse_context *pc, Item **res)
4853 {
4854 if (skip_itemize(res))
4855 return false;
4856 if (super::itemize(pc, res))
4857 return true;
4858 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
4859 pc->thd->lex->safe_to_cache_query= false;
4860 return false;
4861 }
4862
4863
4864 /**
4865 Wait until we are at or past the given position in the master binlog
4866 on the slave.
4867 */
4868
val_int()4869 longlong Item_master_pos_wait::val_int()
4870 {
4871 DBUG_ASSERT(fixed == 1);
4872 THD* thd = current_thd;
4873 String *log_name = args[0]->val_str(&value);
4874 int event_count= 0;
4875
4876 null_value=0;
4877 if (thd->slave_thread || !log_name || !log_name->length())
4878 {
4879 null_value = 1;
4880 return 0;
4881 }
4882 #ifdef HAVE_REPLICATION
4883 Master_info *mi;
4884 longlong pos = (ulong)args[1]->val_int();
4885 double timeout = (arg_count >= 3) ? args[2]->val_real() : 0;
4886 if (timeout < 0)
4887 {
4888 if (thd->is_strict_mode())
4889 {
4890 my_error(ER_WRONG_ARGUMENTS, MYF(0), "MASTER_POS_WAIT.");
4891 }
4892 else
4893 {
4894 push_warning_printf(thd, Sql_condition::SL_WARNING,
4895 ER_WRONG_ARGUMENTS,
4896 ER(ER_WRONG_ARGUMENTS),
4897 "MASTER_POS_WAIT.");
4898 null_value= 1;
4899 }
4900 return 0;
4901 }
4902
4903 channel_map.rdlock();
4904
4905 if (arg_count == 4)
4906 {
4907 String *channel_str;
4908 if(!(channel_str= args[3]->val_str(&value)))
4909 {
4910 null_value= 1;
4911 return 0;
4912 }
4913
4914 mi= channel_map.get_mi(channel_str->ptr());
4915
4916 }
4917 else
4918 {
4919 if (channel_map.get_num_instances() > 1)
4920 {
4921 mi = NULL;
4922 my_error(ER_SLAVE_MULTIPLE_CHANNELS_CMD, MYF(0));
4923 }
4924 else
4925 mi= channel_map.get_default_channel_mi();
4926 }
4927
4928 if (mi != NULL)
4929 mi->inc_reference();
4930
4931 channel_map.unlock();
4932
4933 if (mi == NULL ||
4934 (event_count = mi->rli->wait_for_pos(thd, log_name, pos, timeout)) == -2)
4935 {
4936 null_value = 1;
4937 event_count=0;
4938 }
4939
4940 if (mi != NULL)
4941 mi->dec_reference();
4942 #endif
4943 return event_count;
4944 }
4945
itemize(Parse_context * pc,Item ** res)4946 bool Item_wait_for_executed_gtid_set::itemize(Parse_context *pc, Item **res)
4947 {
4948 if (skip_itemize(res))
4949 return false;
4950 if (super::itemize(pc, res))
4951 return true;
4952 /*
4953 It is unsafe because the return value depends on timing. If the timeout
4954 happens, the return value is different from the one in which the function
4955 returns with success.
4956 */
4957 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
4958 pc->thd->lex->safe_to_cache_query= false;
4959 return false;
4960 }
4961
4962 /**
4963 Wait until the given gtid_set is found in the executed gtid_set independent
4964 of the slave threads.
4965 */
val_int()4966 longlong Item_wait_for_executed_gtid_set::val_int()
4967 {
4968 DBUG_ENTER("Item_wait_for_executed_gtid_set::val_int");
4969 DBUG_ASSERT(fixed == 1);
4970 THD* thd= current_thd;
4971 String *gtid_text= args[0]->val_str(&value);
4972
4973 null_value= 0;
4974
4975 if (gtid_text == NULL)
4976 {
4977 my_error(ER_MALFORMED_GTID_SET_SPECIFICATION, MYF(0), "NULL");
4978 DBUG_RETURN(0);
4979 }
4980
4981 // Waiting for a GTID in a slave thread could cause the slave to
4982 // hang/deadlock.
4983 if (thd->slave_thread)
4984 {
4985 null_value= 1;
4986 DBUG_RETURN(0);
4987 }
4988
4989 Gtid_set wait_for_gtid_set(global_sid_map, NULL);
4990
4991 global_sid_lock->rdlock();
4992 if (get_gtid_mode(GTID_MODE_LOCK_SID) == GTID_MODE_OFF)
4993 {
4994 global_sid_lock->unlock();
4995 my_error(ER_GTID_MODE_OFF, MYF(0), "use WAIT_FOR_EXECUTED_GTID_SET");
4996 null_value= 1;
4997 DBUG_RETURN(0);
4998 }
4999
5000 if (wait_for_gtid_set.add_gtid_text(gtid_text->c_ptr_safe()) !=
5001 RETURN_STATUS_OK)
5002 {
5003 global_sid_lock->unlock();
5004 // Error has already been generated.
5005 DBUG_RETURN(1);
5006 }
5007
5008 // Cannot wait for a GTID that the thread owns since that would
5009 // immediately deadlock.
5010 if (thd->owned_gtid.sidno > 0 &&
5011 wait_for_gtid_set.contains_gtid(thd->owned_gtid))
5012 {
5013 char buf[Gtid::MAX_TEXT_LENGTH + 1];
5014 thd->owned_gtid.to_string(global_sid_map, buf);
5015 global_sid_lock->unlock();
5016 my_error(ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID, MYF(0),
5017 buf);
5018 DBUG_RETURN(0);
5019 }
5020
5021 gtid_state->begin_gtid_wait(GTID_MODE_LOCK_SID);
5022
5023 double timeout = (arg_count == 2) ? args[1]->val_real() : 0;
5024 if (timeout < 0)
5025 {
5026 if (thd->is_strict_mode())
5027 {
5028 my_error(ER_WRONG_ARGUMENTS, MYF(0), "WAIT_FOR_EXECUTED_GTID_SET.");
5029 }
5030 else
5031 {
5032 push_warning_printf(thd, Sql_condition::SL_WARNING,
5033 ER_WRONG_ARGUMENTS,
5034 ER(ER_WRONG_ARGUMENTS),
5035 "WAIT_FOR_EXECUTED_GTID_SET.");
5036 null_value= 1;
5037 }
5038 gtid_state->end_gtid_wait();
5039 global_sid_lock->unlock();
5040 DBUG_RETURN(0);
5041 }
5042
5043 bool result= gtid_state->wait_for_gtid_set(thd, &wait_for_gtid_set, timeout);
5044 global_sid_lock->unlock();
5045 gtid_state->end_gtid_wait();
5046
5047 DBUG_RETURN(result);
5048 }
5049
itemize(Parse_context * pc,Item ** res)5050 bool Item_master_gtid_set_wait::itemize(Parse_context *pc, Item **res)
5051 {
5052 if (skip_itemize(res))
5053 return false;
5054 if (super::itemize(pc, res))
5055 return true;
5056 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5057 pc->thd->lex->safe_to_cache_query= false;
5058 return false;
5059 }
5060
5061
val_int()5062 longlong Item_master_gtid_set_wait::val_int()
5063 {
5064 DBUG_ASSERT(fixed == 1);
5065 DBUG_ENTER("Item_master_gtid_set_wait::val_int");
5066 int event_count= 0;
5067
5068 null_value=0;
5069
5070 #if defined(HAVE_REPLICATION)
5071 String *gtid= args[0]->val_str(&value);
5072 THD* thd = current_thd;
5073 Master_info *mi= NULL;
5074 double timeout = (arg_count >= 2) ? args[1]->val_real() : 0;
5075 if (timeout < 0)
5076 {
5077 if (thd->is_strict_mode())
5078 {
5079 my_error(ER_WRONG_ARGUMENTS, MYF(0), "WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS.");
5080 }
5081 else
5082 {
5083 push_warning_printf(thd, Sql_condition::SL_WARNING,
5084 ER_WRONG_ARGUMENTS,
5085 ER(ER_WRONG_ARGUMENTS),
5086 "WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS.");
5087 null_value= 1;
5088 }
5089 DBUG_RETURN(0);
5090 }
5091
5092 if (thd->slave_thread || !gtid)
5093 {
5094 null_value = 1;
5095 DBUG_RETURN(0);
5096 }
5097
5098 channel_map.rdlock();
5099
5100 /* If replication channel is mentioned */
5101 if (arg_count == 3)
5102 {
5103 String *channel_str;
5104 if (!(channel_str= args[2]->val_str(&value)))
5105 {
5106 channel_map.unlock();
5107 null_value= 1;
5108 DBUG_RETURN(0);
5109 }
5110 mi= channel_map.get_mi(channel_str->ptr());
5111 }
5112 else
5113 {
5114 if (channel_map.get_num_instances() > 1)
5115 {
5116 channel_map.unlock();
5117 mi = NULL;
5118 my_error(ER_SLAVE_MULTIPLE_CHANNELS_CMD, MYF(0));
5119 DBUG_RETURN(0);
5120 }
5121 else
5122 mi= channel_map.get_default_channel_mi();
5123 }
5124
5125 if (get_gtid_mode(GTID_MODE_LOCK_CHANNEL_MAP) == GTID_MODE_OFF)
5126 {
5127 null_value= 1;
5128 channel_map.unlock();
5129 DBUG_RETURN(0);
5130 }
5131 gtid_state->begin_gtid_wait(GTID_MODE_LOCK_CHANNEL_MAP);
5132
5133 if (mi)
5134 mi->inc_reference();
5135
5136 channel_map.unlock();
5137
5138 if (mi && mi->rli)
5139 {
5140 event_count = mi->rli->wait_for_gtid_set(thd, gtid, timeout);
5141 if (event_count == -2)
5142 {
5143 null_value = 1;
5144 event_count=0;
5145 }
5146 }
5147 else
5148 /*
5149 Replication has not been set up, we should return NULL;
5150 */
5151 null_value = 1;
5152
5153 if (mi != NULL)
5154 mi->dec_reference();
5155 #endif
5156
5157 gtid_state->end_gtid_wait();
5158
5159 DBUG_RETURN(event_count);
5160 }
5161
5162 /**
5163 Return 1 if both arguments are Gtid_sets and the first is a subset
5164 of the second. Generate an error if any of the arguments is not a
5165 Gtid_set.
5166 */
val_int()5167 longlong Item_func_gtid_subset::val_int()
5168 {
5169 DBUG_ENTER("Item_func_gtid_subset::val_int()");
5170 if (args[0]->null_value || args[1]->null_value)
5171 {
5172 null_value= true;
5173 DBUG_RETURN(0);
5174 }
5175 String *string1, *string2;
5176 const char *charp1, *charp2;
5177 int ret= 1;
5178 enum_return_status status;
5179 // get strings without lock
5180 if ((string1= args[0]->val_str(&buf1)) != NULL &&
5181 (charp1= string1->c_ptr_safe()) != NULL &&
5182 (string2= args[1]->val_str(&buf2)) != NULL &&
5183 (charp2= string2->c_ptr_safe()) != NULL)
5184 {
5185 Sid_map sid_map(NULL/*no rwlock*/);
5186 // compute sets while holding locks
5187 const Gtid_set sub_set(&sid_map, charp1, &status);
5188 if (status == RETURN_STATUS_OK)
5189 {
5190 const Gtid_set super_set(&sid_map, charp2, &status);
5191 if (status == RETURN_STATUS_OK)
5192 ret= sub_set.is_subset(&super_set) ? 1 : 0;
5193 }
5194 }
5195 DBUG_RETURN(ret);
5196 }
5197
5198
5199 /**
5200 Enables a session to wait on a condition until a timeout or a network
5201 disconnect occurs.
5202
5203 @remark The connection is polled every m_interrupt_interval nanoseconds.
5204 */
5205
5206 class Interruptible_wait
5207 {
5208 THD *m_thd;
5209 struct timespec m_abs_timeout;
5210 static const ulonglong m_interrupt_interval;
5211
5212 public:
Interruptible_wait(THD * thd)5213 Interruptible_wait(THD *thd)
5214 : m_thd(thd) {}
5215
~Interruptible_wait()5216 ~Interruptible_wait() {}
5217
5218 public:
5219 /**
5220 Set the absolute timeout.
5221
5222 @param timeout The amount of time in nanoseconds to wait
5223 */
set_timeout(ulonglong timeout)5224 void set_timeout(ulonglong timeout)
5225 {
5226 /*
5227 Calculate the absolute system time at the start so it can
5228 be controlled in slices. It relies on the fact that once
5229 the absolute time passes, the timed wait call will fail
5230 automatically with a timeout error.
5231 */
5232 set_timespec_nsec(&m_abs_timeout, timeout);
5233 }
5234
5235 /** The timed wait. */
5236 int wait(mysql_cond_t *, mysql_mutex_t *);
5237 };
5238
5239
5240 /** Time to wait before polling the connection status. */
5241 const ulonglong Interruptible_wait::m_interrupt_interval= 5 * 1000000000ULL;
5242
5243
5244 /**
5245 Wait for a given condition to be signaled.
5246
5247 @param cond The condition variable to wait on.
5248 @param mutex The associated mutex.
5249
5250 @remark The absolute timeout is preserved across calls.
5251
5252 @retval return value from mysql_cond_timedwait
5253 */
5254
wait(mysql_cond_t * cond,mysql_mutex_t * mutex)5255 int Interruptible_wait::wait(mysql_cond_t *cond, mysql_mutex_t *mutex)
5256 {
5257 int error;
5258 struct timespec timeout;
5259
5260 while (1)
5261 {
5262 /* Wait for a fixed interval. */
5263 set_timespec_nsec(&timeout, m_interrupt_interval);
5264
5265 /* But only if not past the absolute timeout. */
5266 if (cmp_timespec(&timeout, &m_abs_timeout) > 0)
5267 timeout= m_abs_timeout;
5268
5269 error= mysql_cond_timedwait(cond, mutex, &timeout);
5270 if (error == ETIMEDOUT || error == ETIME)
5271 {
5272 /* Return error if timed out or connection is broken. */
5273 if (!cmp_timespec(&timeout, &m_abs_timeout) || !m_thd->is_connected())
5274 break;
5275 }
5276 /* Otherwise, propagate status to the caller. */
5277 else
5278 break;
5279 }
5280
5281 return error;
5282 }
5283
5284
5285 /*
5286 User-level locks implementation.
5287 */
5288
5289
5290 /**
5291 For locks with EXPLICIT duration, MDL returns a new ticket
5292 every time a lock is granted. This allows to implement recursive
5293 locks without extra allocation or additional data structures, such
5294 as below. However, if there are too many tickets in the same
5295 MDL_context, MDL_context::find_ticket() is getting too slow,
5296 since it's using a linear search.
5297 This is why a separate structure is allocated for a user
5298 level lock held by connection, and before requesting a new lock from MDL,
5299 GET_LOCK() checks thd->ull_hash if such lock is already granted,
5300 and if so, simply increments a reference counter.
5301 */
5302
5303 struct User_level_lock
5304 {
5305 MDL_ticket *ticket;
5306 uint refs;
5307 };
5308
5309
5310 /** Extract a hash key from User_level_lock. */
5311
ull_get_key(const uchar * ptr,size_t * length,my_bool not_used MY_ATTRIBUTE ((unused)))5312 uchar *ull_get_key(const uchar *ptr, size_t *length,
5313 my_bool not_used MY_ATTRIBUTE((unused)))
5314 {
5315 const User_level_lock *ull = reinterpret_cast<const User_level_lock*>(ptr);
5316 const MDL_key *key = ull->ticket->get_key();
5317 *length= key->length();
5318 return const_cast<uchar*>(key->ptr());
5319 }
5320
5321
5322 /**
5323 Release all user level locks for this THD.
5324 */
5325
mysql_ull_cleanup(THD * thd)5326 void mysql_ull_cleanup(THD *thd)
5327 {
5328 User_level_lock *ull;
5329 DBUG_ENTER("mysql_ull_cleanup");
5330
5331 for (ulong i= 0; i < thd->ull_hash.records; i++)
5332 {
5333 ull= reinterpret_cast<User_level_lock*>(my_hash_element(&thd->ull_hash, i));
5334 thd->mdl_context.release_lock(ull->ticket);
5335 my_free(ull);
5336 }
5337
5338 my_hash_free(&thd->ull_hash);
5339
5340 DBUG_VOID_RETURN;
5341 }
5342
5343
5344 /**
5345 Set explicit duration for metadata locks corresponding to
5346 user level locks to protect them from being released at the end
5347 of transaction.
5348 */
5349
mysql_ull_set_explicit_lock_duration(THD * thd)5350 void mysql_ull_set_explicit_lock_duration(THD *thd)
5351 {
5352 User_level_lock *ull;
5353 DBUG_ENTER("mysql_ull_set_explicit_lock_duration");
5354
5355 for (ulong i= 0; i < thd->ull_hash.records; i++)
5356 {
5357 ull= reinterpret_cast<User_level_lock*>(my_hash_element(&thd->ull_hash, i));
5358 thd->mdl_context.set_lock_duration(ull->ticket, MDL_EXPLICIT);
5359 }
5360 DBUG_VOID_RETURN;
5361 }
5362
5363
5364 /**
5365 When MDL detects a lock wait timeout, it pushes an error into the statement
5366 diagnostics area. For GET_LOCK(), lock wait timeout is not an error, but a
5367 special return value (0). NULL is returned in case of error. Capture and
5368 suppress lock wait timeout.
5369 We also convert ER_LOCK_DEADLOCK error to ER_USER_LOCK_DEADLOCK error.
5370 The former means that implicit rollback of transaction has occurred
5371 which doesn't (and should not) happen when we get deadlock while waiting
5372 for user-level lock.
5373 */
5374
5375 class User_level_lock_wait_error_handler: public Internal_error_handler
5376 {
5377 public:
User_level_lock_wait_error_handler()5378 User_level_lock_wait_error_handler()
5379 : m_lock_wait_timeout(false)
5380 { }
5381
got_timeout() const5382 bool got_timeout() const { return m_lock_wait_timeout; }
5383
handle_condition(THD * thd,uint sql_errno,const char * sqlstate,Sql_condition::enum_severity_level * level,const char * msg)5384 virtual bool handle_condition(THD *thd,
5385 uint sql_errno,
5386 const char *sqlstate,
5387 Sql_condition::enum_severity_level *level,
5388 const char *msg)
5389 {
5390 if (sql_errno == ER_LOCK_WAIT_TIMEOUT)
5391 {
5392 m_lock_wait_timeout= true;
5393 return true;
5394 }
5395 else if (sql_errno == ER_LOCK_DEADLOCK)
5396 {
5397 my_error(ER_USER_LOCK_DEADLOCK, MYF(0));
5398 return true;
5399 }
5400
5401 return false;
5402 }
5403
5404 private:
5405 bool m_lock_wait_timeout;
5406 };
5407
5408
5409 class MDL_lock_get_owner_thread_id_visitor : public MDL_context_visitor
5410 {
5411 public:
MDL_lock_get_owner_thread_id_visitor()5412 MDL_lock_get_owner_thread_id_visitor()
5413 : m_owner_id(0)
5414 { }
5415
visit_context(const MDL_context * ctx)5416 void visit_context(const MDL_context *ctx)
5417 {
5418 m_owner_id= ctx->get_owner()->get_thd()->thread_id();
5419 }
5420
get_owner_id() const5421 my_thread_id get_owner_id() const { return m_owner_id; }
5422
5423 private:
5424 my_thread_id m_owner_id;
5425 };
5426
5427
5428 /**
5429 Helper function which checks if user-level lock name is acceptable
5430 and converts it to system charset (utf8). Error is emitted if name
5431 is not acceptable. Name is also lowercased to ensure that user-level
5432 lock names are treated in case-insensitive fashion even though MDL
5433 subsystem which used by implementation does binary comparison of keys.
5434
5435 @param buff Buffer for lowercased name in system charset of
5436 NAME_LEN + 1 bytes length.
5437 @param org_name Original string passed as name parameter to
5438 user-level lock function.
5439
5440 @return True in case of error, false on success.
5441 */
5442
check_and_convert_ull_name(char * buff,String * org_name)5443 static bool check_and_convert_ull_name(char *buff, String *org_name)
5444 {
5445 if (!org_name || !org_name->length())
5446 {
5447 my_error(ER_USER_LOCK_WRONG_NAME, MYF(0), (org_name ? "" : "NULL"));
5448 return true;
5449 }
5450
5451 const char *well_formed_error_pos;
5452 const char *cannot_convert_error_pos;
5453 const char *from_end_pos;
5454 size_t bytes_copied;
5455
5456 bytes_copied= well_formed_copy_nchars(system_charset_info,
5457 buff, NAME_LEN,
5458 org_name->charset(),
5459 org_name->ptr(), org_name->length(),
5460 NAME_CHAR_LEN,
5461 &well_formed_error_pos,
5462 &cannot_convert_error_pos,
5463 &from_end_pos);
5464
5465 if (well_formed_error_pos || cannot_convert_error_pos ||
5466 from_end_pos < org_name->ptr() + org_name->length())
5467 {
5468 ErrConvString err(org_name);
5469 my_error(ER_USER_LOCK_WRONG_NAME, MYF(0), err.ptr());
5470 return true;
5471 }
5472
5473 buff[bytes_copied]= '\0';
5474
5475 my_casedn_str(system_charset_info, buff);
5476
5477 return false;
5478 }
5479
5480
itemize(Parse_context * pc,Item ** res)5481 bool Item_func_get_lock::itemize(Parse_context *pc, Item **res)
5482 {
5483 if (skip_itemize(res))
5484 return false;
5485 if (super::itemize(pc, res))
5486 return true;
5487 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5488 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5489 return false;
5490 }
5491
5492
5493 /**
5494 Get a user level lock.
5495
5496 @note Sets null_value to TRUE on error.
5497
5498 @note This means that SQL-function GET_LOCK() returns:
5499 1 - if lock was acquired.
5500 0 - if lock was not acquired due to timeout.
5501 NULL - in case of error such as bad lock name, deadlock,
5502 thread being killed (also error is emitted).
5503
5504 @retval
5505 1 : Got lock
5506 @retval
5507 0 : Timeout, error.
5508 */
5509
val_int()5510 longlong Item_func_get_lock::val_int()
5511 {
5512 DBUG_ASSERT(fixed == 1);
5513 String *res= args[0]->val_str(&value);
5514 ulonglong timeout= args[1]->val_int();
5515 char name[NAME_LEN + 1];
5516 THD *thd= current_thd;
5517 User_level_lock *ull;
5518 DBUG_ENTER("Item_func_get_lock::val_int");
5519
5520 null_value= TRUE;
5521 /*
5522 In slave thread no need to get locks, everything is serialized. Anyway
5523 there is no way to make GET_LOCK() work on slave like it did on master
5524 (i.e. make it return exactly the same value) because we don't have the
5525 same other concurrent threads environment. No matter what we return here,
5526 it's not guaranteed to be same as on master. So we always return 1.
5527 */
5528 if (thd->slave_thread)
5529 {
5530 null_value= FALSE;
5531 DBUG_RETURN(1);
5532 }
5533
5534 if (check_and_convert_ull_name(name, res))
5535 DBUG_RETURN(0);
5536
5537 DBUG_PRINT("info", ("lock %s, thd=%lu", name, (ulong) thd->real_id));
5538
5539 /*
5540 Convert too big and negative timeout values to INT_MAX32.
5541 This gives robust, "infinite" wait on all platforms.
5542 */
5543 if (timeout > INT_MAX32)
5544 timeout= INT_MAX32;
5545
5546 /* HASH entries are of type User_level_lock. */
5547 if (! my_hash_inited(&thd->ull_hash) &&
5548 my_hash_init(&thd->ull_hash, &my_charset_bin,
5549 16 /* small hash */, 0, 0, ull_get_key, NULL, 0,
5550 key_memory_User_level_lock))
5551 {
5552 DBUG_RETURN(0);
5553 }
5554
5555 MDL_request ull_request;
5556 MDL_REQUEST_INIT(&ull_request, MDL_key::USER_LEVEL_LOCK, "",
5557 name, MDL_EXCLUSIVE, MDL_EXPLICIT);
5558 MDL_key *ull_key= &ull_request.key;
5559
5560 if ((ull= reinterpret_cast<User_level_lock*>
5561 (my_hash_search(&thd->ull_hash, ull_key->ptr(), ull_key->length()))))
5562 {
5563 /* Recursive lock. */
5564 ull->refs++;
5565 null_value= FALSE;
5566 DBUG_RETURN(1);
5567 }
5568
5569 User_level_lock_wait_error_handler error_handler;
5570
5571 thd->push_internal_handler(&error_handler);
5572 bool error= thd->mdl_context.acquire_lock(&ull_request,
5573 static_cast<ulong>(timeout));
5574 (void) thd->pop_internal_handler();
5575
5576 if (error)
5577 {
5578 /*
5579 Return 0 in case of timeout and NULL in case of deadlock/other
5580 errors. In the latter case error (e.g. ER_USER_LOCK_DEADLOCK)
5581 will be reported as well.
5582 */
5583 if (error_handler.got_timeout())
5584 null_value= FALSE;
5585 DBUG_RETURN(0);
5586 }
5587
5588 ull= reinterpret_cast<User_level_lock*>(my_malloc(key_memory_User_level_lock,
5589 sizeof(User_level_lock),
5590 MYF(0)));
5591
5592 if (ull == NULL)
5593 {
5594 thd->mdl_context.release_lock(ull_request.ticket);
5595 DBUG_RETURN(0);
5596 }
5597
5598 ull->ticket= ull_request.ticket;
5599 ull->refs= 1;
5600
5601 if (my_hash_insert(&thd->ull_hash, reinterpret_cast<uchar*>(ull)))
5602 {
5603 thd->mdl_context.release_lock(ull_request.ticket);
5604 my_free(ull);
5605 DBUG_RETURN(0);
5606 }
5607
5608 null_value= FALSE;
5609
5610 DBUG_RETURN(1);
5611 }
5612
5613
itemize(Parse_context * pc,Item ** res)5614 bool Item_func_release_lock::itemize(Parse_context *pc, Item **res)
5615 {
5616 if (skip_itemize(res))
5617 return false;
5618 if (super::itemize(pc, res))
5619 return true;
5620 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5621 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5622 return false;
5623 }
5624
5625
5626 /**
5627 Release a user level lock.
5628
5629 @note Sets null_value to TRUE on error/if no connection holds such lock.
5630
5631 @note This means that SQL-function RELEASE_LOCK() returns:
5632 1 - if lock was held by this connection and was released.
5633 0 - if lock was held by some other connection (and was not released).
5634 NULL - if name of lock is bad or if it was not held by any connection
5635 (in the former case also error will be emitted),
5636
5637 @return
5638 - 1 if lock released
5639 - 0 if lock wasn't held/error.
5640 */
5641
val_int()5642 longlong Item_func_release_lock::val_int()
5643 {
5644 DBUG_ASSERT(fixed == 1);
5645 String *res= args[0]->val_str(&value);
5646 char name[NAME_LEN + 1];
5647 THD *thd= current_thd;
5648 DBUG_ENTER("Item_func_release_lock::val_int");
5649
5650 null_value= TRUE;
5651
5652 if (check_and_convert_ull_name(name, res))
5653 DBUG_RETURN(0);
5654
5655 DBUG_PRINT("info", ("lock %s", name));
5656
5657 MDL_key ull_key;
5658 ull_key.mdl_key_init(MDL_key::USER_LEVEL_LOCK, "", name);
5659
5660 User_level_lock *ull;
5661
5662 if (!(ull= reinterpret_cast<User_level_lock*>
5663 (my_hash_search(&thd->ull_hash, ull_key.ptr(), ull_key.length()))))
5664 {
5665 /*
5666 When RELEASE_LOCK() is called for lock which is not owned by the
5667 connection it should return 0 or NULL depending on whether lock
5668 is owned by any other connection or not.
5669 */
5670 MDL_lock_get_owner_thread_id_visitor get_owner_visitor;
5671
5672 if (thd->mdl_context.find_lock_owner(&ull_key, &get_owner_visitor))
5673 DBUG_RETURN(0);
5674
5675 null_value= get_owner_visitor.get_owner_id() == 0;
5676
5677 DBUG_RETURN(0);
5678 }
5679 null_value= FALSE;
5680 if (--ull->refs == 0)
5681 {
5682 my_hash_delete(&thd->ull_hash, reinterpret_cast<uchar*>(ull));
5683 thd->mdl_context.release_lock(ull->ticket);
5684 my_free(ull);
5685 }
5686 DBUG_RETURN(1);
5687 }
5688
5689
itemize(Parse_context * pc,Item ** res)5690 bool Item_func_release_all_locks::itemize(Parse_context *pc, Item **res)
5691 {
5692 if (skip_itemize(res))
5693 return false;
5694 if (super::itemize(pc, res))
5695 return true;
5696 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5697 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5698 return false;
5699 }
5700
5701
5702 /**
5703 Release all user level lock held by connection.
5704
5705 @return Number of locks released including recursive lock count.
5706 */
5707
val_int()5708 longlong Item_func_release_all_locks::val_int()
5709 {
5710 DBUG_ASSERT(fixed == 1);
5711 THD *thd= current_thd;
5712 uint result= 0;
5713 User_level_lock *ull;
5714 DBUG_ENTER("Item_func_release_all_locks::val_int");
5715
5716 if (my_hash_inited(&thd->ull_hash))
5717 {
5718 for (ulong i= 0; i < thd->ull_hash.records; i++)
5719 {
5720 ull= reinterpret_cast<User_level_lock*>(my_hash_element(&thd->ull_hash,
5721 i));
5722 thd->mdl_context.release_lock(ull->ticket);
5723 result+= ull->refs;
5724 my_free(ull);
5725 }
5726 my_hash_reset(&thd->ull_hash);
5727 }
5728
5729 DBUG_RETURN(result);
5730 }
5731
5732
itemize(Parse_context * pc,Item ** res)5733 bool Item_func_is_free_lock::itemize(Parse_context *pc, Item **res)
5734 {
5735 if (skip_itemize(res))
5736 return false;
5737 if (super::itemize(pc, res))
5738 return true;
5739 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5740 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5741 return false;
5742 }
5743
5744
5745 /**
5746 Check if user level lock is free.
5747
5748 @note Sets null_value=TRUE on error.
5749
5750 @note As result SQL-function IS_FREE_LOCK() returns:
5751 1 - if lock is free,
5752 0 - if lock is in use
5753 NULL - if lock name is bad or OOM (also error is emitted).
5754
5755 @retval
5756 1 Available
5757 @retval
5758 0 Already taken, or error
5759 */
5760
val_int()5761 longlong Item_func_is_free_lock::val_int()
5762 {
5763 DBUG_ASSERT(fixed == 1);
5764 String *res= args[0]->val_str(&value);
5765 char name[NAME_LEN + 1];
5766 THD *thd= current_thd;
5767
5768 null_value= TRUE;
5769
5770 if (check_and_convert_ull_name(name, res))
5771 return 0;
5772
5773 MDL_key ull_key;
5774 ull_key.mdl_key_init(MDL_key::USER_LEVEL_LOCK, "", name);
5775
5776 MDL_lock_get_owner_thread_id_visitor get_owner_visitor;
5777
5778 if (thd->mdl_context.find_lock_owner(&ull_key, &get_owner_visitor))
5779 return 0;
5780
5781 null_value= FALSE;
5782 return MY_TEST(get_owner_visitor.get_owner_id() == 0);
5783 }
5784
5785
itemize(Parse_context * pc,Item ** res)5786 bool Item_func_is_used_lock::itemize(Parse_context *pc, Item **res)
5787 {
5788 if (skip_itemize(res))
5789 return false;
5790 if (super::itemize(pc, res))
5791 return true;
5792 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
5793 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5794 return false;
5795 }
5796
5797
5798 /**
5799 Check if user level lock is used and return connection id of owner.
5800
5801 @note Sets null_value=TRUE if lock is free/on error.
5802
5803 @note SQL-function IS_USED_LOCK() returns:
5804 # - connection id of lock owner if lock is acquired.
5805 NULL - if lock is free or on error (in the latter case
5806 also error is emitted).
5807
5808 @return Connection id of lock owner, 0 if lock is free/on error.
5809 */
5810
val_int()5811 longlong Item_func_is_used_lock::val_int()
5812 {
5813 DBUG_ASSERT(fixed == 1);
5814 String *res= args[0]->val_str(&value);
5815 char name[NAME_LEN + 1];
5816 THD *thd= current_thd;
5817
5818 null_value= TRUE;
5819
5820 if (check_and_convert_ull_name(name, res))
5821 return 0;
5822
5823 MDL_key ull_key;
5824 ull_key.mdl_key_init(MDL_key::USER_LEVEL_LOCK, "", name);
5825
5826 MDL_lock_get_owner_thread_id_visitor get_owner_visitor;
5827
5828 if (thd->mdl_context.find_lock_owner(&ull_key, &get_owner_visitor))
5829 return 0;
5830
5831 my_thread_id thread_id= get_owner_visitor.get_owner_id();
5832 if (thread_id == 0)
5833 return 0;
5834
5835 null_value= FALSE;
5836 return thread_id;
5837 }
5838
5839
itemize(Parse_context * pc,Item ** res)5840 bool Item_func_last_insert_id::itemize(Parse_context *pc, Item **res)
5841 {
5842 if (skip_itemize(res))
5843 return false;
5844 if (super::itemize(pc, res))
5845 return true;
5846 pc->thd->lex->safe_to_cache_query= false;
5847 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5848 return false;
5849 }
5850
5851
val_int()5852 longlong Item_func_last_insert_id::val_int()
5853 {
5854 THD *thd= current_thd;
5855 DBUG_ASSERT(fixed == 1);
5856 if (arg_count)
5857 {
5858 longlong value= args[0]->val_int();
5859 null_value= args[0]->null_value;
5860 /*
5861 LAST_INSERT_ID(X) must affect the client's mysql_insert_id() as
5862 documented in the manual. We don't want to touch
5863 first_successful_insert_id_in_cur_stmt because it would make
5864 LAST_INSERT_ID(X) take precedence over an generated auto_increment
5865 value for this row.
5866 */
5867 thd->arg_of_last_insert_id_function= TRUE;
5868 thd->first_successful_insert_id_in_prev_stmt= value;
5869 return value;
5870 }
5871 return
5872 static_cast<longlong>(thd->read_first_successful_insert_id_in_prev_stmt());
5873 }
5874
5875
itemize(Parse_context * pc,Item ** res)5876 bool Item_func_benchmark::itemize(Parse_context *pc, Item **res)
5877 {
5878 if (skip_itemize(res))
5879 return false;
5880 if (super::itemize(pc, res))
5881 return true;
5882 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
5883 return false;
5884 }
5885
5886
5887 /* This function is just used to test speed of different functions */
5888
val_int()5889 longlong Item_func_benchmark::val_int()
5890 {
5891 DBUG_ASSERT(fixed == 1);
5892 char buff[MAX_FIELD_WIDTH];
5893 String tmp(buff,sizeof(buff), &my_charset_bin);
5894 my_decimal tmp_decimal;
5895 THD *thd=current_thd;
5896 ulonglong loop_count;
5897
5898 loop_count= (ulonglong) args[0]->val_int();
5899
5900 if (args[0]->null_value ||
5901 (!args[0]->unsigned_flag && (((longlong) loop_count) < 0)))
5902 {
5903 if (!args[0]->null_value)
5904 {
5905 char buff[22];
5906 llstr(((longlong) loop_count), buff);
5907 push_warning_printf(current_thd, Sql_condition::SL_WARNING,
5908 ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE),
5909 "count", buff, "benchmark");
5910 }
5911
5912 null_value= 1;
5913 return 0;
5914 }
5915
5916 null_value=0;
5917 for (ulonglong loop=0 ; loop < loop_count && !thd->killed; loop++)
5918 {
5919 switch (args[1]->result_type()) {
5920 case REAL_RESULT:
5921 (void) args[1]->val_real();
5922 break;
5923 case INT_RESULT:
5924 (void) args[1]->val_int();
5925 break;
5926 case STRING_RESULT:
5927 (void) args[1]->val_str(&tmp);
5928 break;
5929 case DECIMAL_RESULT:
5930 (void) args[1]->val_decimal(&tmp_decimal);
5931 break;
5932 case ROW_RESULT:
5933 default:
5934 // This case should never be chosen
5935 DBUG_ASSERT(0);
5936 return 0;
5937 }
5938 }
5939 return 0;
5940 }
5941
5942
print(String * str,enum_query_type query_type)5943 void Item_func_benchmark::print(String *str, enum_query_type query_type)
5944 {
5945 str->append(STRING_WITH_LEN("benchmark("));
5946 args[0]->print(str, query_type);
5947 str->append(',');
5948 args[1]->print(str, query_type);
5949 str->append(')');
5950 }
5951
5952
5953 /**
5954 Lock which is used to implement interruptible wait for SLEEP() function.
5955 */
5956
5957 mysql_mutex_t LOCK_item_func_sleep;
5958
5959
5960 #ifdef HAVE_PSI_INTERFACE
5961 static PSI_mutex_key key_LOCK_item_func_sleep;
5962
5963
5964 static PSI_mutex_info item_func_sleep_mutexes[]=
5965 {
5966 { &key_LOCK_item_func_sleep, "LOCK_item_func_sleep", PSI_FLAG_GLOBAL}
5967 };
5968
5969
init_item_func_sleep_psi_keys()5970 static void init_item_func_sleep_psi_keys()
5971 {
5972 int count;
5973
5974 count= array_elements(item_func_sleep_mutexes);
5975 mysql_mutex_register("sql", item_func_sleep_mutexes, count);
5976 }
5977 #endif
5978
5979
5980 static bool item_func_sleep_inited= false;
5981
5982
item_func_sleep_init()5983 void item_func_sleep_init()
5984 {
5985 #ifdef HAVE_PSI_INTERFACE
5986 init_item_func_sleep_psi_keys();
5987 #endif
5988
5989 mysql_mutex_init(key_LOCK_item_func_sleep, &LOCK_item_func_sleep, MY_MUTEX_INIT_SLOW);
5990 item_func_sleep_inited= true;
5991 }
5992
5993
item_func_sleep_free()5994 void item_func_sleep_free()
5995 {
5996 if (item_func_sleep_inited)
5997 {
5998 item_func_sleep_inited= false;
5999 mysql_mutex_destroy(&LOCK_item_func_sleep);
6000 }
6001 }
6002
6003
itemize(Parse_context * pc,Item ** res)6004 bool Item_func_sleep::itemize(Parse_context *pc, Item **res)
6005 {
6006 if (skip_itemize(res))
6007 return false;
6008 if (super::itemize(pc, res))
6009 return true;
6010 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
6011 pc->thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
6012 return false;
6013 }
6014
6015
6016 /** This function is just used to create tests with time gaps. */
6017
val_int()6018 longlong Item_func_sleep::val_int()
6019 {
6020 THD *thd= current_thd;
6021 Interruptible_wait timed_cond(thd);
6022 mysql_cond_t cond;
6023 double timeout;
6024 int error;
6025
6026 DBUG_ASSERT(fixed == 1);
6027
6028 timeout= args[0]->val_real();
6029
6030 /*
6031 Report error or warning depending on the value of SQL_MODE.
6032 If SQL is STRICT then report error, else report warning and continue
6033 execution.
6034 */
6035
6036 if (args[0]->null_value || timeout < 0)
6037 {
6038 if (!thd->lex->is_ignore() && thd->is_strict_mode())
6039 {
6040 my_error(ER_WRONG_ARGUMENTS, MYF(0), "sleep.");
6041 return 0;
6042 }
6043 else
6044 push_warning_printf(thd, Sql_condition::SL_WARNING, ER_WRONG_ARGUMENTS,
6045 ER(ER_WRONG_ARGUMENTS), "sleep.");
6046 }
6047 /*
6048 On 64-bit OSX mysql_cond_timedwait() waits forever
6049 if passed abstime time has already been exceeded by
6050 the system time.
6051 When given a very short timeout (< 10 mcs) just return
6052 immediately.
6053 We assume that the lines between this test and the call
6054 to mysql_cond_timedwait() will be executed in less than 0.00001 sec.
6055 */
6056 if (timeout < 0.00001)
6057 return 0;
6058
6059 timed_cond.set_timeout((ulonglong) (timeout * 1000000000.0));
6060
6061 mysql_cond_init(key_item_func_sleep_cond, &cond);
6062 mysql_mutex_lock(&LOCK_item_func_sleep);
6063
6064 thd->ENTER_COND(&cond, &LOCK_item_func_sleep, &stage_user_sleep, NULL);
6065
6066 error= 0;
6067 thd_wait_begin(thd, THD_WAIT_SLEEP);
6068 while (!thd->killed)
6069 {
6070 error= timed_cond.wait(&cond, &LOCK_item_func_sleep);
6071 if (error == ETIMEDOUT || error == ETIME)
6072 break;
6073 error= 0;
6074 }
6075 thd_wait_end(thd);
6076 mysql_mutex_unlock(&LOCK_item_func_sleep);
6077 thd->EXIT_COND(NULL);
6078
6079 mysql_cond_destroy(&cond);
6080
6081 return MY_TEST(!error); // Return 1 killed
6082 }
6083
6084 /*
6085 @param cs character set; IF we are creating the user_var_entry,
6086 we give it this character set.
6087 */
get_variable(THD * thd,const Name_string & name,const CHARSET_INFO * cs)6088 static user_var_entry *get_variable(THD *thd, const Name_string &name,
6089 const CHARSET_INFO *cs)
6090 {
6091 user_var_entry *entry;
6092 HASH *hash= & thd->user_vars;
6093
6094 /* Protects thd->user_vars. */
6095 mysql_mutex_assert_owner(&thd->LOCK_thd_data);
6096
6097 if (!(entry= (user_var_entry*) my_hash_search(hash, (uchar*) name.ptr(),
6098 name.length())) &&
6099 cs != NULL)
6100 {
6101 if (!my_hash_inited(hash))
6102 return 0;
6103 if (!(entry= user_var_entry::create(thd, name, cs)))
6104 return 0;
6105 if (my_hash_insert(hash,(uchar*) entry))
6106 {
6107 my_free(entry);
6108 return 0;
6109 }
6110 }
6111 return entry;
6112 }
6113
6114
cleanup()6115 void Item_func_set_user_var::cleanup()
6116 {
6117 Item_func::cleanup();
6118 entry= NULL;
6119 }
6120
6121
set_entry(THD * thd,bool create_if_not_exists)6122 bool Item_func_set_user_var::set_entry(THD *thd, bool create_if_not_exists)
6123 {
6124 if (entry && thd->thread_id() == entry_thread_id)
6125 {} // update entry->update_query_id for PS
6126 else
6127 {
6128 const CHARSET_INFO *cs= create_if_not_exists ?
6129 (args[0]->collation.derivation == DERIVATION_NUMERIC ?
6130 default_charset() : args[0]->collation.collation) : NULL;
6131
6132 /* Protects thd->user_vars. */
6133 mysql_mutex_lock(&thd->LOCK_thd_data);
6134 entry= get_variable(thd, name, cs);
6135 mysql_mutex_unlock(&thd->LOCK_thd_data);
6136
6137 if (entry == NULL)
6138 {
6139 entry_thread_id= 0;
6140 return TRUE;
6141 }
6142 entry_thread_id= thd->thread_id();
6143 }
6144 /*
6145 Remember the last query which updated it, this way a query can later know
6146 if this variable is a constant item in the query (it is if update_query_id
6147 is different from query_id).
6148
6149 If this object has delayed setting of non-constness, we delay this
6150 until Item_func_set-user_var::save_item_result().
6151 */
6152 if (!delayed_non_constness)
6153 entry->update_query_id= thd->query_id;
6154 return FALSE;
6155 }
6156
6157
6158 /*
6159 When a user variable is updated (in a SET command or a query like
6160 SELECT @a:= ).
6161 */
6162
fix_fields(THD * thd,Item ** ref)6163 bool Item_func_set_user_var::fix_fields(THD *thd, Item **ref)
6164 {
6165 DBUG_ASSERT(fixed == 0);
6166 /* fix_fields will call Item_func_set_user_var::fix_length_and_dec */
6167 if (Item_func::fix_fields(thd, ref) || set_entry(thd, TRUE))
6168 return TRUE;
6169
6170 null_item= (args[0]->type() == NULL_ITEM);
6171
6172 cached_result_type= args[0]->result_type();
6173 return FALSE;
6174 }
6175
6176
6177 void
fix_length_and_dec()6178 Item_func_set_user_var::fix_length_and_dec()
6179 {
6180 maybe_null=args[0]->maybe_null;
6181 decimals=args[0]->decimals;
6182 collation.set(DERIVATION_IMPLICIT);
6183 /*
6184 this sets the character set of the item immediately; rules for the
6185 character set of the variable ("entry" object) are different: if "entry"
6186 did not exist previously, set_entry () has created it and has set its
6187 character set; but if it existed previously, it keeps its previous
6188 character set, which may change only when we are sure that the assignment
6189 is to be executed, i.e. in user_var_entry::store ().
6190 */
6191 if (args[0]->collation.derivation == DERIVATION_NUMERIC)
6192 fix_length_and_charset(args[0]->max_char_length(), default_charset());
6193 else
6194 {
6195 fix_length_and_charset(args[0]->max_char_length(),
6196 args[0]->collation.collation);
6197 }
6198 unsigned_flag= args[0]->unsigned_flag;
6199 }
6200
6201
mem_realloc(size_t length)6202 bool user_var_entry::mem_realloc(size_t length)
6203 {
6204 if (length <= extra_size)
6205 {
6206 /* Enough space to store value in value struct */
6207 free_value();
6208 m_ptr= internal_buffer_ptr();
6209 }
6210 else
6211 {
6212 /* Allocate an external buffer */
6213 if (m_length != length)
6214 {
6215 if (m_ptr == internal_buffer_ptr())
6216 m_ptr= 0;
6217 if (!(m_ptr= (char*) my_realloc(key_memory_user_var_entry_value,
6218 m_ptr, length,
6219 MYF(MY_ALLOW_ZERO_PTR | MY_WME |
6220 ME_FATALERROR))))
6221 return true;
6222 }
6223 }
6224 return false;
6225 }
6226
6227
6228 /**
6229 Set value to user variable.
6230 @param ptr pointer to buffer with new value
6231 @param length length of new value
6232 @param type type of new value
6233
6234 @retval false on success
6235 @retval true on allocation error
6236
6237 */
store(const void * from,size_t length,Item_result type)6238 bool user_var_entry::store(const void *from, size_t length, Item_result type)
6239 {
6240 assert_locked();
6241
6242 // Store strings with end \0
6243 if (mem_realloc(length + MY_TEST(type == STRING_RESULT)))
6244 return true;
6245 if (type == STRING_RESULT)
6246 m_ptr[length]= 0; // Store end \0
6247
6248 // Avoid memcpy of a my_decimal object, use copy CTOR instead.
6249 if (type == DECIMAL_RESULT)
6250 {
6251 DBUG_ASSERT(length == sizeof(my_decimal));
6252 const my_decimal* dec= static_cast<const my_decimal*>(from);
6253 dec->sanity_check();
6254 new (m_ptr) my_decimal(*dec);
6255 }
6256 else
6257 memcpy(m_ptr, from, length);
6258
6259 m_length= length;
6260 m_type= type;
6261 return false;
6262 }
6263
6264
6265 /**
6266 Set value to user variable.
6267
6268 @param ptr pointer to buffer with new value
6269 @param length length of new value
6270 @param type type of new value
6271 @param cs charset info for new value
6272 @param dv derivation for new value
6273 @param unsigned_arg indiates if a value of type INT_RESULT is unsigned
6274
6275 @note Sets error and fatal error if allocation fails.
6276
6277 @retval
6278 false success
6279 @retval
6280 true failure
6281 */
6282
store(const void * ptr,size_t length,Item_result type,const CHARSET_INFO * cs,Derivation dv,bool unsigned_arg)6283 bool user_var_entry::store(const void *ptr, size_t length, Item_result type,
6284 const CHARSET_INFO *cs, Derivation dv,
6285 bool unsigned_arg)
6286 {
6287 assert_locked();
6288
6289 if (store(ptr, length, type))
6290 return true;
6291 collation.set(cs, dv);
6292 unsigned_flag= unsigned_arg;
6293 return false;
6294 }
6295
lock()6296 void user_var_entry::lock()
6297 {
6298 DBUG_ASSERT(m_owner != NULL);
6299 mysql_mutex_lock(&m_owner->LOCK_thd_data);
6300 }
6301
unlock()6302 void user_var_entry::unlock()
6303 {
6304 DBUG_ASSERT(m_owner != NULL);
6305 mysql_mutex_unlock(&m_owner->LOCK_thd_data);
6306 }
6307
6308 bool
update_hash(const void * ptr,uint length,Item_result res_type,const CHARSET_INFO * cs,Derivation dv,bool unsigned_arg)6309 Item_func_set_user_var::update_hash(const void *ptr, uint length,
6310 Item_result res_type,
6311 const CHARSET_INFO *cs, Derivation dv,
6312 bool unsigned_arg)
6313 {
6314 entry->lock();
6315
6316 /*
6317 If we set a variable explicitely to NULL then keep the old
6318 result type of the variable
6319 */
6320 // args[0]->null_value could be outdated
6321 if (args[0]->type() == Item::FIELD_ITEM)
6322 null_value= ((Item_field*)args[0])->field->is_null();
6323 else
6324 null_value= args[0]->null_value;
6325
6326 if (ptr == NULL)
6327 {
6328 DBUG_ASSERT(length == 0);
6329 null_value= true;
6330 }
6331
6332 if (null_value && null_item)
6333 res_type= entry->type(); // Don't change type of item
6334
6335 if (null_value)
6336 entry->set_null_value(res_type);
6337 else if (entry->store(ptr, length, res_type, cs, dv, unsigned_arg))
6338 {
6339 entry->unlock();
6340 null_value= 1;
6341 return 1;
6342 }
6343 entry->unlock();
6344 return 0;
6345 }
6346
6347
6348 /** Get the value of a variable as a double. */
6349
val_real(my_bool * null_value) const6350 double user_var_entry::val_real(my_bool *null_value) const
6351 {
6352 if ((*null_value= (m_ptr == 0)))
6353 return 0.0;
6354
6355 switch (m_type) {
6356 case REAL_RESULT:
6357 return *(double*) m_ptr;
6358 case INT_RESULT:
6359 return (double) *(longlong*) m_ptr;
6360 case DECIMAL_RESULT:
6361 {
6362 double result;
6363 my_decimal2double(E_DEC_FATAL_ERROR, (my_decimal *) m_ptr, &result);
6364 return result;
6365 }
6366 case STRING_RESULT:
6367 return my_atof(m_ptr); // This is null terminated
6368 case ROW_RESULT:
6369 DBUG_ASSERT(1); // Impossible
6370 break;
6371 }
6372 return 0.0; // Impossible
6373 }
6374
6375
6376 /** Get the value of a variable as an integer. */
6377
val_int(my_bool * null_value) const6378 longlong user_var_entry::val_int(my_bool *null_value) const
6379 {
6380 if ((*null_value= (m_ptr == 0)))
6381 return 0LL;
6382
6383 switch (m_type) {
6384 case REAL_RESULT:
6385 return (longlong) *(double*) m_ptr;
6386 case INT_RESULT:
6387 return *(longlong*) m_ptr;
6388 case DECIMAL_RESULT:
6389 {
6390 longlong result;
6391 my_decimal2int(E_DEC_FATAL_ERROR, (my_decimal *) m_ptr, 0, &result);
6392 return result;
6393 }
6394 case STRING_RESULT:
6395 {
6396 int error;
6397 return my_strtoll10(m_ptr, (char**) 0, &error);// String is null terminated
6398 }
6399 case ROW_RESULT:
6400 DBUG_ASSERT(1); // Impossible
6401 break;
6402 }
6403 return 0LL; // Impossible
6404 }
6405
6406
6407 /** Get the value of a variable as a string. */
6408
val_str(my_bool * null_value,String * str,uint decimals) const6409 String *user_var_entry::val_str(my_bool *null_value, String *str,
6410 uint decimals) const
6411 {
6412 if ((*null_value= (m_ptr == 0)))
6413 return (String*) 0;
6414
6415 switch (m_type) {
6416 case REAL_RESULT:
6417 str->set_real(*(double*) m_ptr, decimals, collation.collation);
6418 break;
6419 case INT_RESULT:
6420 if (!unsigned_flag)
6421 str->set(*(longlong*) m_ptr, collation.collation);
6422 else
6423 str->set(*(ulonglong*) m_ptr, collation.collation);
6424 break;
6425 case DECIMAL_RESULT:
6426 str_set_decimal((my_decimal *) m_ptr, str, collation.collation);
6427 break;
6428 case STRING_RESULT:
6429 if (str->copy(m_ptr, m_length, collation.collation))
6430 str= 0; // EOM error
6431 break;
6432 case ROW_RESULT:
6433 DBUG_ASSERT(1); // Impossible
6434 break;
6435 }
6436 return(str);
6437 }
6438
6439 /** Get the value of a variable as a decimal. */
6440
val_decimal(my_bool * null_value,my_decimal * val) const6441 my_decimal *user_var_entry::val_decimal(my_bool *null_value, my_decimal *val) const
6442 {
6443 if ((*null_value= (m_ptr == 0)))
6444 return 0;
6445
6446 switch (m_type) {
6447 case REAL_RESULT:
6448 double2my_decimal(E_DEC_FATAL_ERROR, *(double*) m_ptr, val);
6449 break;
6450 case INT_RESULT:
6451 int2my_decimal(E_DEC_FATAL_ERROR, *(longlong*) m_ptr, 0, val);
6452 break;
6453 case DECIMAL_RESULT:
6454 my_decimal2decimal((my_decimal *) m_ptr, val);
6455 break;
6456 case STRING_RESULT:
6457 str2my_decimal(E_DEC_FATAL_ERROR, m_ptr, m_length,
6458 collation.collation, val);
6459 break;
6460 case ROW_RESULT:
6461 DBUG_ASSERT(1); // Impossible
6462 break;
6463 }
6464 return(val);
6465 }
6466
6467 /**
6468 This functions is invoked on SET \@variable or
6469 \@variable:= expression.
6470
6471 Evaluate (and check expression), store results.
6472
6473 @note
6474 For now it always return OK. All problem with value evaluating
6475 will be caught by thd->is_error() check in sql_set_variables().
6476
6477 @retval
6478 FALSE OK.
6479 */
6480
6481 bool
check(bool use_result_field)6482 Item_func_set_user_var::check(bool use_result_field)
6483 {
6484 DBUG_ENTER("Item_func_set_user_var::check");
6485 if (use_result_field && !result_field)
6486 use_result_field= FALSE;
6487
6488 switch (cached_result_type) {
6489 case REAL_RESULT:
6490 {
6491 save_result.vreal= use_result_field ? result_field->val_real() :
6492 args[0]->val_real();
6493 break;
6494 }
6495 case INT_RESULT:
6496 {
6497 save_result.vint= use_result_field ? result_field->val_int() :
6498 args[0]->val_int();
6499 unsigned_flag= use_result_field ? ((Field_num*)result_field)->unsigned_flag:
6500 args[0]->unsigned_flag;
6501 break;
6502 }
6503 case STRING_RESULT:
6504 {
6505 save_result.vstr= use_result_field ? result_field->val_str(&value) :
6506 args[0]->val_str(&value);
6507 break;
6508 }
6509 case DECIMAL_RESULT:
6510 {
6511 save_result.vdec= use_result_field ?
6512 result_field->val_decimal(&decimal_buff) :
6513 args[0]->val_decimal(&decimal_buff);
6514 break;
6515 }
6516 case ROW_RESULT:
6517 default:
6518 // This case should never be chosen
6519 DBUG_ASSERT(0);
6520 break;
6521 }
6522 DBUG_RETURN(FALSE);
6523 }
6524
6525
6526 /**
6527 @brief Evaluate and store item's result.
6528 This function is invoked on "SELECT ... INTO @var ...".
6529
6530 @param item An item to get value from.
6531 */
6532
save_item_result(Item * item)6533 void Item_func_set_user_var::save_item_result(Item *item)
6534 {
6535 DBUG_ENTER("Item_func_set_user_var::save_item_result");
6536
6537 switch (cached_result_type) {
6538 case REAL_RESULT:
6539 save_result.vreal= item->val_result();
6540 break;
6541 case INT_RESULT:
6542 save_result.vint= item->val_int_result();
6543 unsigned_flag= item->unsigned_flag;
6544 break;
6545 case STRING_RESULT:
6546 save_result.vstr= item->str_result(&value);
6547 break;
6548 case DECIMAL_RESULT:
6549 save_result.vdec= item->val_decimal_result(&decimal_buff);
6550 break;
6551 case ROW_RESULT:
6552 default:
6553 // Should never happen
6554 DBUG_ASSERT(0);
6555 break;
6556 }
6557 /*
6558 Set the ID of the query that last updated this variable. This is
6559 usually set by Item_func_set_user_var::set_entry(), but if this
6560 item has delayed setting of non-constness, we must do it now.
6561 */
6562 if (delayed_non_constness)
6563 entry->update_query_id= current_thd->query_id;
6564 DBUG_VOID_RETURN;
6565 }
6566
6567
6568 /**
6569 This functions is invoked on
6570 SET \@variable or \@variable:= expression.
6571
6572 @note
6573 We have to store the expression as such in the variable, independent of
6574 the value method used by the user
6575
6576 @retval
6577 0 OK
6578 @retval
6579 1 EOM Error
6580
6581 */
6582
6583 bool
update()6584 Item_func_set_user_var::update()
6585 {
6586 bool res= 0;
6587 DBUG_ENTER("Item_func_set_user_var::update");
6588
6589 switch (cached_result_type) {
6590 case REAL_RESULT:
6591 {
6592 res= update_hash(&save_result.vreal,sizeof(save_result.vreal),
6593 REAL_RESULT, default_charset(), DERIVATION_IMPLICIT, 0);
6594 break;
6595 }
6596 case INT_RESULT:
6597 {
6598 res= update_hash(&save_result.vint, sizeof(save_result.vint),
6599 INT_RESULT, default_charset(), DERIVATION_IMPLICIT,
6600 unsigned_flag);
6601 break;
6602 }
6603 case STRING_RESULT:
6604 {
6605 if (!save_result.vstr) // Null value
6606 res= update_hash(NULL, 0, STRING_RESULT, &my_charset_bin,
6607 DERIVATION_IMPLICIT, 0);
6608 else
6609 res= update_hash(save_result.vstr->ptr(),
6610 save_result.vstr->length(), STRING_RESULT,
6611 save_result.vstr->charset(),
6612 DERIVATION_IMPLICIT, 0);
6613 break;
6614 }
6615 case DECIMAL_RESULT:
6616 {
6617 if (!save_result.vdec) // Null value
6618 res= update_hash(NULL, 0, DECIMAL_RESULT, &my_charset_bin,
6619 DERIVATION_IMPLICIT, false);
6620 else
6621 res= update_hash(save_result.vdec,
6622 sizeof(my_decimal), DECIMAL_RESULT,
6623 default_charset(), DERIVATION_IMPLICIT, 0);
6624 break;
6625 }
6626 case ROW_RESULT:
6627 default:
6628 // This case should never be chosen
6629 DBUG_ASSERT(0);
6630 break;
6631 }
6632 DBUG_RETURN(res);
6633 }
6634
6635
val_real()6636 double Item_func_set_user_var::val_real()
6637 {
6638 DBUG_ASSERT(fixed == 1);
6639 check(0);
6640 update(); // Store expression
6641 return entry->val_real(&null_value);
6642 }
6643
val_int()6644 longlong Item_func_set_user_var::val_int()
6645 {
6646 DBUG_ASSERT(fixed == 1);
6647 check(0);
6648 update(); // Store expression
6649 return entry->val_int(&null_value);
6650 }
6651
val_str(String * str)6652 String *Item_func_set_user_var::val_str(String *str)
6653 {
6654 DBUG_ASSERT(fixed == 1);
6655 check(0);
6656 update(); // Store expression
6657 return entry->val_str(&null_value, str, decimals);
6658 }
6659
6660
val_decimal(my_decimal * val)6661 my_decimal *Item_func_set_user_var::val_decimal(my_decimal *val)
6662 {
6663 DBUG_ASSERT(fixed == 1);
6664 check(0);
6665 update(); // Store expression
6666 return entry->val_decimal(&null_value, val);
6667 }
6668
6669
val_result()6670 double Item_func_set_user_var::val_result()
6671 {
6672 DBUG_ASSERT(fixed == 1);
6673 check(TRUE);
6674 update(); // Store expression
6675 return entry->val_real(&null_value);
6676 }
6677
val_int_result()6678 longlong Item_func_set_user_var::val_int_result()
6679 {
6680 DBUG_ASSERT(fixed == 1);
6681 check(TRUE);
6682 update(); // Store expression
6683 return entry->val_int(&null_value);
6684 }
6685
val_bool_result()6686 bool Item_func_set_user_var::val_bool_result()
6687 {
6688 DBUG_ASSERT(fixed == 1);
6689 check(TRUE);
6690 update(); // Store expression
6691 return entry->val_int(&null_value) != 0;
6692 }
6693
str_result(String * str)6694 String *Item_func_set_user_var::str_result(String *str)
6695 {
6696 DBUG_ASSERT(fixed == 1);
6697 check(TRUE);
6698 update(); // Store expression
6699 return entry->val_str(&null_value, str, decimals);
6700 }
6701
6702
val_decimal_result(my_decimal * val)6703 my_decimal *Item_func_set_user_var::val_decimal_result(my_decimal *val)
6704 {
6705 DBUG_ASSERT(fixed == 1);
6706 check(TRUE);
6707 update(); // Store expression
6708 return entry->val_decimal(&null_value, val);
6709 }
6710
6711
is_null_result()6712 bool Item_func_set_user_var::is_null_result()
6713 {
6714 DBUG_ASSERT(fixed == 1);
6715 check(TRUE);
6716 update(); // Store expression
6717 return is_null();
6718 }
6719
6720 // just the assignment, for use in "SET @a:=5" type self-prints
print_assignment(String * str,enum_query_type query_type)6721 void Item_func_set_user_var::print_assignment(String *str,
6722 enum_query_type query_type)
6723 {
6724 str->append(STRING_WITH_LEN("@"));
6725 str->append(name);
6726 str->append(STRING_WITH_LEN(":="));
6727 args[0]->print(str, query_type);
6728 }
6729
6730 // parenthesize assignment for use in "EXPLAIN EXTENDED SELECT (@e:=80)+5"
print(String * str,enum_query_type query_type)6731 void Item_func_set_user_var::print(String *str, enum_query_type query_type)
6732 {
6733 str->append(STRING_WITH_LEN("("));
6734 print_assignment(str, query_type);
6735 str->append(STRING_WITH_LEN(")"));
6736 }
6737
send(Protocol * protocol,String * str_arg)6738 bool Item_func_set_user_var::send(Protocol *protocol, String *str_arg)
6739 {
6740 if (result_field)
6741 {
6742 check(1);
6743 update();
6744 /*
6745 Workaround for metadata check in Protocol_text. Legacy Protocol_text
6746 is so well designed that it sends fields in text format, and functions'
6747 results in binary format. When this func tries to send its data as a
6748 field it breaks metadata asserts in the P_text.
6749 TODO This func have to be changed to avoid sending data as a field.
6750 */
6751 return result_field->send_binary(protocol);
6752 }
6753 return Item::send(protocol, str_arg);
6754 }
6755
make_field(Send_field * tmp_field)6756 void Item_func_set_user_var::make_field(Send_field *tmp_field)
6757 {
6758 if (result_field)
6759 {
6760 result_field->make_field(tmp_field);
6761 DBUG_ASSERT(tmp_field->table_name != 0);
6762 if (Item::item_name.is_set())
6763 tmp_field->col_name=Item::item_name.ptr(); // Use user supplied name
6764 }
6765 else
6766 Item::make_field(tmp_field);
6767 }
6768
6769
6770 /*
6771 Save the value of a user variable into a field
6772
6773 SYNOPSIS
6774 save_in_field()
6775 field target field to save the value to
6776 no_conversion flag indicating whether conversions are allowed
6777
6778 DESCRIPTION
6779 Save the function value into a field and update the user variable
6780 accordingly. If a result field is defined and the target field doesn't
6781 coincide with it then the value from the result field will be used as
6782 the new value of the user variable.
6783
6784 The reason to have this method rather than simply using the result
6785 field in the val_xxx() methods is that the value from the result field
6786 not always can be used when the result field is defined.
6787 Let's consider the following cases:
6788 1) when filling a tmp table the result field is defined but the value of it
6789 is undefined because it has to be produced yet. Thus we can't use it.
6790 2) on execution of an INSERT ... SELECT statement the save_in_field()
6791 function will be called to fill the data in the new record. If the SELECT
6792 part uses a tmp table then the result field is defined and should be
6793 used in order to get the correct result.
6794
6795 The difference between the SET_USER_VAR function and regular functions
6796 like CONCAT is that the Item_func objects for the regular functions are
6797 replaced by Item_field objects after the values of these functions have
6798 been stored in a tmp table. Yet an object of the Item_field class cannot
6799 be used to update a user variable.
6800 Due to this we have to handle the result field in a special way here and
6801 in the Item_func_set_user_var::send() function.
6802
6803 RETURN VALUES
6804 FALSE Ok
6805 TRUE Error
6806 */
6807
6808 type_conversion_status
save_in_field(Field * field,bool no_conversions,bool can_use_result_field)6809 Item_func_set_user_var::save_in_field(Field *field, bool no_conversions,
6810 bool can_use_result_field)
6811 {
6812 bool use_result_field= (!can_use_result_field ? 0 :
6813 (result_field && result_field != field));
6814 type_conversion_status error;
6815
6816 /* Update the value of the user variable */
6817 check(use_result_field);
6818 update();
6819
6820 if (result_type() == STRING_RESULT ||
6821 (result_type() == REAL_RESULT &&
6822 field->result_type() == STRING_RESULT))
6823 {
6824 String *result;
6825 const CHARSET_INFO *cs= collation.collation;
6826 char buff[MAX_FIELD_WIDTH]; // Alloc buffer for small columns
6827 str_value.set_quick(buff, sizeof(buff), cs);
6828 result= entry->val_str(&null_value, &str_value, decimals);
6829
6830 if (null_value)
6831 {
6832 str_value.set_quick(0, 0, cs);
6833 return set_field_to_null_with_conversions(field, no_conversions);
6834 }
6835
6836 /* NOTE: If null_value == FALSE, "result" must be not NULL. */
6837
6838 field->set_notnull();
6839 error=field->store(result->ptr(),result->length(),cs);
6840 str_value.set_quick(0, 0, cs);
6841 }
6842 else if (result_type() == REAL_RESULT)
6843 {
6844 double nr= entry->val_real(&null_value);
6845 if (null_value)
6846 return set_field_to_null(field);
6847 field->set_notnull();
6848 error=field->store(nr);
6849 }
6850 else if (result_type() == DECIMAL_RESULT)
6851 {
6852 my_decimal decimal_value;
6853 my_decimal *val= entry->val_decimal(&null_value, &decimal_value);
6854 if (null_value)
6855 return set_field_to_null(field);
6856 field->set_notnull();
6857 error=field->store_decimal(val);
6858 }
6859 else
6860 {
6861 longlong nr= entry->val_int(&null_value);
6862 if (null_value)
6863 return set_field_to_null_with_conversions(field, no_conversions);
6864 field->set_notnull();
6865 error=field->store(nr, unsigned_flag);
6866 }
6867 return error;
6868 }
6869
6870
6871 String *
val_str(String * str)6872 Item_func_get_user_var::val_str(String *str)
6873 {
6874 DBUG_ASSERT(fixed == 1);
6875 DBUG_ENTER("Item_func_get_user_var::val_str");
6876 if (!var_entry)
6877 DBUG_RETURN((String*) 0); // No such variable
6878 String *res= var_entry->val_str(&null_value, str, decimals);
6879 DBUG_RETURN(res);
6880 }
6881
6882
val_real()6883 double Item_func_get_user_var::val_real()
6884 {
6885 DBUG_ASSERT(fixed == 1);
6886 if (!var_entry)
6887 return 0.0; // No such variable
6888 return (var_entry->val_real(&null_value));
6889 }
6890
6891
val_decimal(my_decimal * dec)6892 my_decimal *Item_func_get_user_var::val_decimal(my_decimal *dec)
6893 {
6894 DBUG_ASSERT(fixed == 1);
6895 if (!var_entry)
6896 return 0;
6897 return var_entry->val_decimal(&null_value, dec);
6898 }
6899
6900
val_int()6901 longlong Item_func_get_user_var::val_int()
6902 {
6903 DBUG_ASSERT(fixed == 1);
6904 if (!var_entry)
6905 return 0LL; // No such variable
6906 return (var_entry->val_int(&null_value));
6907 }
6908
6909
6910 /**
6911 Get variable by name and, if necessary, put the record of variable
6912 use into the binary log.
6913
6914 When a user variable is invoked from an update query (INSERT, UPDATE etc),
6915 stores this variable and its value in thd->user_var_events, so that it can be
6916 written to the binlog (will be written just before the query is written, see
6917 log.cc).
6918
6919 @param thd Current thread
6920 @param name Variable name
6921 @param[out] out_entry variable structure or NULL. The pointer is set
6922 regardless of whether function succeeded or not.
6923
6924 @retval
6925 0 OK
6926 @retval
6927 1 Failed to put appropriate record into binary log
6928
6929 */
6930
6931 static int
get_var_with_binlog(THD * thd,enum_sql_command sql_command,Name_string & name,user_var_entry ** out_entry)6932 get_var_with_binlog(THD *thd, enum_sql_command sql_command,
6933 Name_string &name, user_var_entry **out_entry)
6934 {
6935 BINLOG_USER_VAR_EVENT *user_var_event;
6936 user_var_entry *var_entry;
6937
6938 /* Protects thd->user_vars. */
6939 mysql_mutex_lock(&thd->LOCK_thd_data);
6940 var_entry= get_variable(thd, name, NULL);
6941 mysql_mutex_unlock(&thd->LOCK_thd_data);
6942
6943 /*
6944 Any reference to user-defined variable which is done from stored
6945 function or trigger affects their execution and the execution of the
6946 calling statement. We must log all such variables even if they are
6947 not involved in table-updating statements.
6948 */
6949 if (!(opt_bin_log &&
6950 (is_update_query(sql_command) || thd->in_sub_stmt)))
6951 {
6952 *out_entry= var_entry;
6953 return 0;
6954 }
6955
6956 if (!var_entry)
6957 {
6958 /*
6959 If the variable does not exist, it's NULL, but we want to create it so
6960 that it gets into the binlog (if it didn't, the slave could be
6961 influenced by a variable of the same name previously set by another
6962 thread).
6963 We create it like if it had been explicitly set with SET before.
6964 The 'new' mimics what sql_yacc.yy does when 'SET @a=10;'.
6965 sql_set_variables() is what is called from 'case SQLCOM_SET_OPTION'
6966 in dispatch_command()). Instead of building a one-element list to pass to
6967 sql_set_variables(), we could instead manually call check() and update();
6968 this would save memory and time; but calling sql_set_variables() makes
6969 one unique place to maintain (sql_set_variables()).
6970
6971 Manipulation with lex is necessary since free_underlaid_joins
6972 is going to release memory belonging to the main query.
6973 */
6974
6975 List<set_var_base> tmp_var_list;
6976 LEX *sav_lex= thd->lex, lex_tmp;
6977 thd->lex= &lex_tmp;
6978 lex_start(thd);
6979 tmp_var_list.push_back(new set_var_user(new Item_func_set_user_var(name,
6980 new Item_null(),
6981 false)));
6982 /* Create the variable */
6983 if (sql_set_variables(thd, &tmp_var_list))
6984 {
6985 thd->lex= sav_lex;
6986 goto err;
6987 }
6988 thd->lex= sav_lex;
6989 mysql_mutex_lock(&thd->LOCK_thd_data);
6990 var_entry= get_variable(thd, name, NULL);
6991 mysql_mutex_unlock(&thd->LOCK_thd_data);
6992
6993 if (var_entry == NULL)
6994 goto err;
6995 }
6996 else if (var_entry->used_query_id == thd->query_id ||
6997 mysql_bin_log.is_query_in_union(thd, var_entry->used_query_id))
6998 {
6999 /*
7000 If this variable was already stored in user_var_events by this query
7001 (because it's used in more than one place in the query), don't store
7002 it.
7003 */
7004 *out_entry= var_entry;
7005 return 0;
7006 }
7007
7008 size_t size;
7009 /*
7010 First we need to store value of var_entry, when the next situation
7011 appears:
7012 > set @a:=1;
7013 > insert into t1 values (@a), (@a:=@a+1), (@a:=@a+1);
7014 We have to write to binlog value @a= 1.
7015
7016 We allocate the user_var_event on user_var_events_alloc pool, not on
7017 the this-statement-execution pool because in SPs user_var_event objects
7018 may need to be valid after current [SP] statement execution pool is
7019 destroyed.
7020 */
7021 size= ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)) + var_entry->length();
7022 if (!(user_var_event= (BINLOG_USER_VAR_EVENT *)
7023 alloc_root(thd->user_var_events_alloc, size)))
7024 goto err;
7025
7026 user_var_event->value= (char*) user_var_event +
7027 ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT));
7028 user_var_event->user_var_event= var_entry;
7029 user_var_event->type= var_entry->type();
7030 user_var_event->charset_number= var_entry->collation.collation->number;
7031 user_var_event->unsigned_flag= var_entry->unsigned_flag;
7032 if (!var_entry->ptr())
7033 {
7034 /* NULL value*/
7035 user_var_event->length= 0;
7036 user_var_event->value= 0;
7037 }
7038 else
7039 {
7040 // Avoid memcpy of a my_decimal object, use copy CTOR instead.
7041 user_var_event->length= var_entry->length();
7042 if (user_var_event->type == DECIMAL_RESULT)
7043 {
7044 DBUG_ASSERT(var_entry->length() == sizeof(my_decimal));
7045 const my_decimal* dec=
7046 static_cast<const my_decimal*>
7047 (static_cast<const void*>(var_entry->ptr()));
7048 dec->sanity_check();
7049 new (user_var_event->value) my_decimal(*dec);
7050 }
7051 else
7052 memcpy(user_var_event->value, var_entry->ptr(),
7053 var_entry->length());
7054 }
7055 /* Mark that this variable has been used by this query */
7056 var_entry->used_query_id= thd->query_id;
7057 if (thd->user_var_events.push_back(user_var_event))
7058 goto err;
7059
7060 *out_entry= var_entry;
7061 return 0;
7062
7063 err:
7064 *out_entry= var_entry;
7065 return 1;
7066 }
7067
fix_length_and_dec()7068 void Item_func_get_user_var::fix_length_and_dec()
7069 {
7070 THD *thd=current_thd;
7071 int error;
7072 maybe_null=1;
7073 decimals=NOT_FIXED_DEC;
7074 max_length=MAX_BLOB_WIDTH;
7075
7076 error= get_var_with_binlog(thd, thd->lex->sql_command, name, &var_entry);
7077
7078 /*
7079 If the variable didn't exist it has been created as a STRING-type.
7080 'var_entry' is NULL only if there occurred an error during the call to
7081 get_var_with_binlog.
7082 */
7083 if (!error && var_entry)
7084 {
7085 m_cached_result_type= var_entry->type();
7086 unsigned_flag= var_entry->unsigned_flag;
7087 max_length= var_entry->length();
7088
7089 collation.set(var_entry->collation);
7090 switch(m_cached_result_type) {
7091 case REAL_RESULT:
7092 fix_char_length(DBL_DIG + 8);
7093 break;
7094 case INT_RESULT:
7095 fix_char_length(MAX_BIGINT_WIDTH);
7096 decimals=0;
7097 break;
7098 case STRING_RESULT:
7099 max_length= MAX_BLOB_WIDTH - 1;
7100 break;
7101 case DECIMAL_RESULT:
7102 fix_char_length(DECIMAL_MAX_STR_LENGTH);
7103 decimals= DECIMAL_MAX_SCALE;
7104 break;
7105 case ROW_RESULT: // Keep compiler happy
7106 default:
7107 DBUG_ASSERT(0);
7108 break;
7109 }
7110 }
7111 else
7112 {
7113 collation.set(&my_charset_bin, DERIVATION_IMPLICIT);
7114 null_value= 1;
7115 m_cached_result_type= STRING_RESULT;
7116 max_length= MAX_BLOB_WIDTH;
7117 }
7118 }
7119
7120
const_item() const7121 bool Item_func_get_user_var::const_item() const
7122 {
7123 return (!var_entry || current_thd->query_id != var_entry->update_query_id);
7124 }
7125
7126
result_type() const7127 enum Item_result Item_func_get_user_var::result_type() const
7128 {
7129 return m_cached_result_type;
7130 }
7131
7132
print(String * str,enum_query_type query_type)7133 void Item_func_get_user_var::print(String *str, enum_query_type query_type)
7134 {
7135 str->append(STRING_WITH_LEN("(@"));
7136 append_identifier(current_thd, str, name);
7137 str->append(')');
7138 }
7139
7140
eq(const Item * item,bool binary_cmp) const7141 bool Item_func_get_user_var::eq(const Item *item, bool binary_cmp) const
7142 {
7143 /* Assume we don't have rtti */
7144 if (this == item)
7145 return 1; // Same item is same.
7146 /* Check if other type is also a get_user_var() object */
7147 if (item->type() != FUNC_ITEM ||
7148 ((Item_func*) item)->functype() != functype())
7149 return 0;
7150 Item_func_get_user_var *other=(Item_func_get_user_var*) item;
7151 return name.eq_bin(other->name);
7152 }
7153
7154
set_value(THD * thd,sp_rcontext *,Item ** it)7155 bool Item_func_get_user_var::set_value(THD *thd,
7156 sp_rcontext * /*ctx*/, Item **it)
7157 {
7158 Item_func_set_user_var *suv= new Item_func_set_user_var(name, *it, false);
7159 /*
7160 Item_func_set_user_var is not fixed after construction, call
7161 fix_fields().
7162 */
7163 return (!suv || suv->fix_fields(thd, it) || suv->check(0) || suv->update());
7164 }
7165
7166
fix_fields(THD * thd,Item ** ref)7167 bool Item_user_var_as_out_param::fix_fields(THD *thd, Item **ref)
7168 {
7169 DBUG_ASSERT(fixed == 0);
7170 DBUG_ASSERT(thd->lex->exchange);
7171 /*
7172 Let us set the same collation which is used for loading
7173 of fields in LOAD DATA INFILE.
7174 (Since Item_user_var_as_out_param is used only there).
7175 */
7176 const CHARSET_INFO *cs= thd->lex->exchange->cs ?
7177 thd->lex->exchange->cs : thd->variables.collation_database;
7178
7179 if (Item::fix_fields(thd, ref))
7180 return true;
7181
7182 /* Protects thd->user_vars. */
7183 mysql_mutex_lock(&thd->LOCK_thd_data);
7184 entry= get_variable(thd, name, cs);
7185 if (entry != NULL)
7186 {
7187 entry->set_type(STRING_RESULT);
7188 entry->update_query_id= thd->query_id;
7189 }
7190 mysql_mutex_unlock(&thd->LOCK_thd_data);
7191
7192 if (entry == NULL)
7193 return true;
7194
7195 return false;
7196 }
7197
7198
set_null_value(const CHARSET_INFO * cs)7199 void Item_user_var_as_out_param::set_null_value(const CHARSET_INFO* cs)
7200 {
7201 entry->lock();
7202 entry->set_null_value(STRING_RESULT);
7203 entry->unlock();
7204 }
7205
7206
set_value(const char * str,size_t length,const CHARSET_INFO * cs)7207 void Item_user_var_as_out_param::set_value(const char *str, size_t length,
7208 const CHARSET_INFO* cs)
7209 {
7210 entry->lock();
7211 entry->store((void*) str, length, STRING_RESULT, cs,
7212 DERIVATION_IMPLICIT, 0 /* unsigned_arg */);
7213 entry->unlock();
7214 }
7215
7216
val_real()7217 double Item_user_var_as_out_param::val_real()
7218 {
7219 DBUG_ASSERT(0);
7220 return 0.0;
7221 }
7222
7223
val_int()7224 longlong Item_user_var_as_out_param::val_int()
7225 {
7226 DBUG_ASSERT(0);
7227 return 0;
7228 }
7229
7230
val_str(String * str)7231 String* Item_user_var_as_out_param::val_str(String *str)
7232 {
7233 DBUG_ASSERT(0);
7234 return 0;
7235 }
7236
7237
val_decimal(my_decimal * decimal_buffer)7238 my_decimal* Item_user_var_as_out_param::val_decimal(my_decimal *decimal_buffer)
7239 {
7240 DBUG_ASSERT(0);
7241 return 0;
7242 }
7243
7244
print(String * str,enum_query_type query_type)7245 void Item_user_var_as_out_param::print(String *str, enum_query_type query_type)
7246 {
7247 str->append('@');
7248 append_identifier(current_thd, str, name);
7249 }
7250
7251
7252 Item_func_get_system_var::
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)7253 Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
7254 LEX_STRING *component_arg, const char *name_arg,
7255 size_t name_len_arg)
7256 :var(var_arg), var_type(var_type_arg), orig_var_type(var_type_arg),
7257 component(*component_arg), cache_present(0)
7258 {
7259 /* copy() will allocate the name */
7260 item_name.copy(name_arg, (uint) name_len_arg);
7261 }
7262
7263
is_written_to_binlog()7264 bool Item_func_get_system_var::is_written_to_binlog()
7265 {
7266 return var->is_written_to_binlog(var_type);
7267 }
7268
7269
update_null_value()7270 void Item_func_get_system_var::update_null_value()
7271 {
7272 THD *thd= current_thd;
7273 int save_no_errors= thd->no_errors;
7274 thd->no_errors= TRUE;
7275 Item::update_null_value();
7276 thd->no_errors= save_no_errors;
7277 }
7278
7279
fix_length_and_dec()7280 void Item_func_get_system_var::fix_length_and_dec()
7281 {
7282 char *cptr;
7283 maybe_null= TRUE;
7284 max_length= 0;
7285
7286 if (!var->check_scope(var_type))
7287 {
7288 if (var_type != OPT_DEFAULT)
7289 {
7290 my_error(ER_INCORRECT_GLOBAL_LOCAL_VAR, MYF(0),
7291 var->name.str, var_type == OPT_GLOBAL ? "SESSION" : "GLOBAL");
7292 return;
7293 }
7294 /* As there was no local variable, return the global value */
7295 var_type= OPT_GLOBAL;
7296 }
7297
7298 switch (var->show_type())
7299 {
7300 case SHOW_LONG:
7301 case SHOW_INT:
7302 case SHOW_HA_ROWS:
7303 case SHOW_LONGLONG:
7304 unsigned_flag= TRUE;
7305 collation.set_numeric();
7306 fix_char_length(MY_INT64_NUM_DECIMAL_DIGITS);
7307 decimals=0;
7308 break;
7309 case SHOW_SIGNED_LONG:
7310 unsigned_flag= FALSE;
7311 collation.set_numeric();
7312 fix_char_length(MY_INT64_NUM_DECIMAL_DIGITS);
7313 decimals=0;
7314 break;
7315 case SHOW_CHAR:
7316 case SHOW_CHAR_PTR:
7317 mysql_mutex_lock(&LOCK_global_system_variables);
7318 cptr= var->show_type() == SHOW_CHAR ?
7319 (char*) var->value_ptr(current_thd, var_type, &component) :
7320 *(char**) var->value_ptr(current_thd, var_type, &component);
7321 if (cptr)
7322 max_length= system_charset_info->cset->numchars(system_charset_info,
7323 cptr,
7324 cptr + strlen(cptr));
7325 mysql_mutex_unlock(&LOCK_global_system_variables);
7326 collation.set(system_charset_info, DERIVATION_SYSCONST);
7327 max_length*= system_charset_info->mbmaxlen;
7328 decimals=NOT_FIXED_DEC;
7329 break;
7330 case SHOW_LEX_STRING:
7331 {
7332 mysql_mutex_lock(&LOCK_global_system_variables);
7333 LEX_STRING *ls= ((LEX_STRING*)var->value_ptr(current_thd, var_type, &component));
7334 max_length= system_charset_info->cset->numchars(system_charset_info,
7335 ls->str,
7336 ls->str + ls->length);
7337 mysql_mutex_unlock(&LOCK_global_system_variables);
7338 collation.set(system_charset_info, DERIVATION_SYSCONST);
7339 max_length*= system_charset_info->mbmaxlen;
7340 decimals=NOT_FIXED_DEC;
7341 }
7342 break;
7343 case SHOW_BOOL:
7344 case SHOW_MY_BOOL:
7345 unsigned_flag= FALSE;
7346 collation.set_numeric();
7347 fix_char_length(1);
7348 decimals=0;
7349 break;
7350 case SHOW_DOUBLE:
7351 unsigned_flag= FALSE;
7352 decimals= 6;
7353 collation.set_numeric();
7354 fix_char_length(DBL_DIG + 6);
7355 break;
7356 default:
7357 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7358 break;
7359 }
7360 }
7361
7362
print(String * str,enum_query_type query_type)7363 void Item_func_get_system_var::print(String *str, enum_query_type query_type)
7364 {
7365 str->append(item_name);
7366 }
7367
7368
result_type() const7369 enum Item_result Item_func_get_system_var::result_type() const
7370 {
7371 switch (var->show_type())
7372 {
7373 case SHOW_BOOL:
7374 case SHOW_MY_BOOL:
7375 case SHOW_INT:
7376 case SHOW_LONG:
7377 case SHOW_SIGNED_LONG:
7378 case SHOW_LONGLONG:
7379 case SHOW_HA_ROWS:
7380 return INT_RESULT;
7381 case SHOW_CHAR:
7382 case SHOW_CHAR_PTR:
7383 case SHOW_LEX_STRING:
7384 return STRING_RESULT;
7385 case SHOW_DOUBLE:
7386 return REAL_RESULT;
7387 default:
7388 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7389 return STRING_RESULT; // keep the compiler happy
7390 }
7391 }
7392
7393
field_type() const7394 enum_field_types Item_func_get_system_var::field_type() const
7395 {
7396 switch (var->show_type())
7397 {
7398 case SHOW_BOOL:
7399 case SHOW_MY_BOOL:
7400 case SHOW_INT:
7401 case SHOW_LONG:
7402 case SHOW_SIGNED_LONG:
7403 case SHOW_LONGLONG:
7404 case SHOW_HA_ROWS:
7405 return MYSQL_TYPE_LONGLONG;
7406 case SHOW_CHAR:
7407 case SHOW_CHAR_PTR:
7408 case SHOW_LEX_STRING:
7409 return MYSQL_TYPE_VARCHAR;
7410 case SHOW_DOUBLE:
7411 return MYSQL_TYPE_DOUBLE;
7412 default:
7413 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7414 return MYSQL_TYPE_VARCHAR; // keep the compiler happy
7415 }
7416 }
7417
7418
7419 /*
7420 Uses var, var_type, component, cache_present, used_query_id, thd,
7421 cached_llval, null_value, cached_null_value
7422 */
7423 #define get_sys_var_safe(type) \
7424 do { \
7425 type value; \
7426 mysql_mutex_lock(&LOCK_global_system_variables); \
7427 value= *(type*) var->value_ptr(thd, var_type, &component); \
7428 mysql_mutex_unlock(&LOCK_global_system_variables); \
7429 cache_present |= GET_SYS_VAR_CACHE_LONG; \
7430 used_query_id= thd->query_id; \
7431 cached_llval= null_value ? 0 : (longlong) value; \
7432 cached_null_value= null_value; \
7433 return cached_llval; \
7434 } while (0)
7435
7436
val_int()7437 longlong Item_func_get_system_var::val_int()
7438 {
7439 THD *thd= current_thd;
7440
7441 if (cache_present && thd->query_id == used_query_id)
7442 {
7443 if (cache_present & GET_SYS_VAR_CACHE_LONG)
7444 {
7445 null_value= cached_null_value;
7446 return cached_llval;
7447 }
7448 else if (cache_present & GET_SYS_VAR_CACHE_DOUBLE)
7449 {
7450 null_value= cached_null_value;
7451 cached_llval= (longlong) cached_dval;
7452 cache_present|= GET_SYS_VAR_CACHE_LONG;
7453 return cached_llval;
7454 }
7455 else if (cache_present & GET_SYS_VAR_CACHE_STRING)
7456 {
7457 null_value= cached_null_value;
7458 if (!null_value)
7459 cached_llval= longlong_from_string_with_check (cached_strval.charset(),
7460 cached_strval.c_ptr(),
7461 cached_strval.c_ptr() +
7462 cached_strval.length());
7463 else
7464 cached_llval= 0;
7465 cache_present|= GET_SYS_VAR_CACHE_LONG;
7466 return cached_llval;
7467 }
7468 }
7469
7470 switch (var->show_type())
7471 {
7472 case SHOW_INT: get_sys_var_safe (uint);
7473 case SHOW_LONG: get_sys_var_safe (ulong);
7474 case SHOW_SIGNED_LONG: get_sys_var_safe (long);
7475 case SHOW_LONGLONG: get_sys_var_safe (ulonglong);
7476 case SHOW_HA_ROWS: get_sys_var_safe (ha_rows);
7477 case SHOW_BOOL: get_sys_var_safe (bool);
7478 case SHOW_MY_BOOL: get_sys_var_safe (my_bool);
7479 case SHOW_DOUBLE:
7480 {
7481 double dval= val_real();
7482
7483 used_query_id= thd->query_id;
7484 cached_llval= (longlong) dval;
7485 cache_present|= GET_SYS_VAR_CACHE_LONG;
7486 return cached_llval;
7487 }
7488 case SHOW_CHAR:
7489 case SHOW_CHAR_PTR:
7490 case SHOW_LEX_STRING:
7491 {
7492 String *str_val= val_str(NULL);
7493 // Treat empty strings as NULL, like val_real() does.
7494 if (str_val && str_val->length())
7495 cached_llval= longlong_from_string_with_check (system_charset_info,
7496 str_val->c_ptr(),
7497 str_val->c_ptr() +
7498 str_val->length());
7499 else
7500 {
7501 null_value= TRUE;
7502 cached_llval= 0;
7503 }
7504
7505 cache_present|= GET_SYS_VAR_CACHE_LONG;
7506 return cached_llval;
7507 }
7508
7509 default:
7510 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7511 return 0; // keep the compiler happy
7512 }
7513 }
7514
7515
val_str(String * str)7516 String* Item_func_get_system_var::val_str(String* str)
7517 {
7518 THD *thd= current_thd;
7519
7520 if (cache_present && thd->query_id == used_query_id)
7521 {
7522 if (cache_present & GET_SYS_VAR_CACHE_STRING)
7523 {
7524 null_value= cached_null_value;
7525 return null_value ? NULL : &cached_strval;
7526 }
7527 else if (cache_present & GET_SYS_VAR_CACHE_LONG)
7528 {
7529 null_value= cached_null_value;
7530 if (!null_value)
7531 cached_strval.set (cached_llval, collation.collation);
7532 cache_present|= GET_SYS_VAR_CACHE_STRING;
7533 return null_value ? NULL : &cached_strval;
7534 }
7535 else if (cache_present & GET_SYS_VAR_CACHE_DOUBLE)
7536 {
7537 null_value= cached_null_value;
7538 if (!null_value)
7539 cached_strval.set_real (cached_dval, decimals, collation.collation);
7540 cache_present|= GET_SYS_VAR_CACHE_STRING;
7541 return null_value ? NULL : &cached_strval;
7542 }
7543 }
7544
7545 str= &cached_strval;
7546 null_value= FALSE;
7547 switch (var->show_type())
7548 {
7549 case SHOW_CHAR:
7550 case SHOW_CHAR_PTR:
7551 case SHOW_LEX_STRING:
7552 {
7553 mysql_mutex_lock(&LOCK_global_system_variables);
7554 char *cptr= var->show_type() == SHOW_CHAR ?
7555 (char*) var->value_ptr(thd, var_type, &component) :
7556 *(char**) var->value_ptr(thd, var_type, &component);
7557 if (cptr)
7558 {
7559 size_t len= var->show_type() == SHOW_LEX_STRING ?
7560 ((LEX_STRING*)(var->value_ptr(thd, var_type, &component)))->length :
7561 strlen(cptr);
7562 if (str->copy(cptr, len, collation.collation))
7563 {
7564 null_value= TRUE;
7565 str= NULL;
7566 }
7567 }
7568 else
7569 {
7570 null_value= TRUE;
7571 str= NULL;
7572 }
7573 mysql_mutex_unlock(&LOCK_global_system_variables);
7574 break;
7575 }
7576
7577 case SHOW_INT:
7578 case SHOW_LONG:
7579 case SHOW_SIGNED_LONG:
7580 case SHOW_LONGLONG:
7581 case SHOW_HA_ROWS:
7582 case SHOW_BOOL:
7583 case SHOW_MY_BOOL:
7584 str->set (val_int(), collation.collation);
7585 break;
7586 case SHOW_DOUBLE:
7587 str->set_real (val_real(), decimals, collation.collation);
7588 break;
7589
7590 default:
7591 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7592 str= error_str();
7593 break;
7594 }
7595
7596 cache_present|= GET_SYS_VAR_CACHE_STRING;
7597 used_query_id= thd->query_id;
7598 cached_null_value= null_value;
7599 return str;
7600 }
7601
7602
val_real()7603 double Item_func_get_system_var::val_real()
7604 {
7605 THD *thd= current_thd;
7606
7607 if (cache_present && thd->query_id == used_query_id)
7608 {
7609 if (cache_present & GET_SYS_VAR_CACHE_DOUBLE)
7610 {
7611 null_value= cached_null_value;
7612 return cached_dval;
7613 }
7614 else if (cache_present & GET_SYS_VAR_CACHE_LONG)
7615 {
7616 null_value= cached_null_value;
7617 cached_dval= (double)cached_llval;
7618 cache_present|= GET_SYS_VAR_CACHE_DOUBLE;
7619 return cached_dval;
7620 }
7621 else if (cache_present & GET_SYS_VAR_CACHE_STRING)
7622 {
7623 null_value= cached_null_value;
7624 if (!null_value)
7625 cached_dval= double_from_string_with_check (cached_strval.charset(),
7626 cached_strval.c_ptr(),
7627 cached_strval.c_ptr() +
7628 cached_strval.length());
7629 else
7630 cached_dval= 0;
7631 cache_present|= GET_SYS_VAR_CACHE_DOUBLE;
7632 return cached_dval;
7633 }
7634 }
7635
7636 switch (var->show_type())
7637 {
7638 case SHOW_DOUBLE:
7639 mysql_mutex_lock(&LOCK_global_system_variables);
7640 cached_dval= *(double*) var->value_ptr(thd, var_type, &component);
7641 mysql_mutex_unlock(&LOCK_global_system_variables);
7642 used_query_id= thd->query_id;
7643 cached_null_value= null_value;
7644 if (null_value)
7645 cached_dval= 0;
7646 cache_present|= GET_SYS_VAR_CACHE_DOUBLE;
7647 return cached_dval;
7648 case SHOW_CHAR:
7649 case SHOW_LEX_STRING:
7650 case SHOW_CHAR_PTR:
7651 {
7652 mysql_mutex_lock(&LOCK_global_system_variables);
7653 char *cptr= var->show_type() == SHOW_CHAR ?
7654 (char*) var->value_ptr(thd, var_type, &component) :
7655 *(char**) var->value_ptr(thd, var_type, &component);
7656 // Treat empty strings as NULL, like val_int() does.
7657 if (cptr && *cptr)
7658 cached_dval= double_from_string_with_check (system_charset_info,
7659 cptr, cptr + strlen (cptr));
7660 else
7661 {
7662 null_value= TRUE;
7663 cached_dval= 0;
7664 }
7665 mysql_mutex_unlock(&LOCK_global_system_variables);
7666 used_query_id= thd->query_id;
7667 cached_null_value= null_value;
7668 cache_present|= GET_SYS_VAR_CACHE_DOUBLE;
7669 return cached_dval;
7670 }
7671 case SHOW_INT:
7672 case SHOW_LONG:
7673 case SHOW_SIGNED_LONG:
7674 case SHOW_LONGLONG:
7675 case SHOW_HA_ROWS:
7676 case SHOW_BOOL:
7677 case SHOW_MY_BOOL:
7678 cached_dval= (double) val_int();
7679 cache_present|= GET_SYS_VAR_CACHE_DOUBLE;
7680 used_query_id= thd->query_id;
7681 cached_null_value= null_value;
7682 return cached_dval;
7683 default:
7684 my_error(ER_VAR_CANT_BE_READ, MYF(0), var->name.str);
7685 return 0;
7686 }
7687 }
7688
7689
eq(const Item * item,bool binary_cmp) const7690 bool Item_func_get_system_var::eq(const Item *item, bool binary_cmp) const
7691 {
7692 /* Assume we don't have rtti */
7693 if (this == item)
7694 return 1; // Same item is same.
7695 /* Check if other type is also a get_user_var() object */
7696 if (item->type() != FUNC_ITEM ||
7697 ((Item_func*) item)->functype() != functype())
7698 return 0;
7699 Item_func_get_system_var *other=(Item_func_get_system_var*) item;
7700 return (var == other->var && var_type == other->var_type);
7701 }
7702
7703
cleanup()7704 void Item_func_get_system_var::cleanup()
7705 {
7706 Item_func::cleanup();
7707 cache_present= 0;
7708 var_type= orig_var_type;
7709 cached_strval.mem_free();
7710 }
7711
7712
itemize(Parse_context * pc,Item ** res)7713 bool Item_func_match::itemize(Parse_context *pc, Item **res)
7714 {
7715 if (skip_itemize(res))
7716 return false;
7717 if (super::itemize(pc, res) || against->itemize(pc, &against))
7718 return true;
7719 with_sum_func|= against->with_sum_func;
7720
7721 pc->select->add_ftfunc_to_list(this);
7722 pc->thd->lex->set_using_match();
7723
7724 switch (pc->select->parsing_place)
7725 {
7726 case CTX_WHERE:
7727 case CTX_ON:
7728 used_in_where_only= true;
7729 break;
7730 default:
7731 used_in_where_only= false;
7732 }
7733
7734 return false;
7735 }
7736
7737
7738 /**
7739 Initialize searching within full-text index.
7740
7741 @param thd Thread handler
7742
7743 @returns false if success, true if error
7744 */
7745
init_search(THD * thd)7746 bool Item_func_match::init_search(THD *thd)
7747 {
7748 DBUG_ENTER("Item_func_match::init_search");
7749
7750 /*
7751 We will skip execution if the item is not fixed
7752 with fix_field
7753 */
7754 if (!fixed)
7755 DBUG_RETURN(false);
7756
7757 TABLE *const table= table_ref->table;
7758 /* Check if init_search() has been called before */
7759 if (ft_handler && !master)
7760 {
7761 /*
7762 We should reset ft_handler as it is cleaned up
7763 on destruction of FT_SELECT object
7764 (necessary in case of re-execution of subquery).
7765 TODO: FT_SELECT should not clean up ft_handler.
7766 */
7767 if (join_key)
7768 table->file->ft_handler= ft_handler;
7769 DBUG_RETURN(false);
7770 }
7771
7772 if (key == NO_SUCH_KEY)
7773 {
7774 List<Item> fields;
7775 if (fields.push_back(new Item_string(" ",1, cmp_collation.collation)))
7776 DBUG_RETURN(true);
7777 for (uint i= 0; i < arg_count; i++)
7778 fields.push_back(args[i]);
7779 concat_ws=new Item_func_concat_ws(fields);
7780 if (concat_ws == NULL)
7781 DBUG_RETURN(true);
7782 /*
7783 Above function used only to get value and do not need fix_fields for it:
7784 Item_string - basic constant
7785 fields - fix_fields() was already called for this arguments
7786 Item_func_concat_ws - do not need fix_fields() to produce value
7787 */
7788 concat_ws->quick_fix_field();
7789 }
7790
7791 if (master)
7792 {
7793 if (master->init_search(thd))
7794 DBUG_RETURN(true);
7795
7796 ft_handler=master->ft_handler;
7797 DBUG_RETURN(false);
7798 }
7799
7800 String *ft_tmp= 0;
7801
7802 // MATCH ... AGAINST (NULL) is meaningless, but possible
7803 if (!(ft_tmp=key_item()->val_str(&value)))
7804 {
7805 ft_tmp= &value;
7806 value.set("",0,cmp_collation.collation);
7807 }
7808
7809 if (ft_tmp->charset() != cmp_collation.collation)
7810 {
7811 uint dummy_errors;
7812 search_value.copy(ft_tmp->ptr(), ft_tmp->length(), ft_tmp->charset(),
7813 cmp_collation.collation, &dummy_errors);
7814 ft_tmp= &search_value;
7815 }
7816
7817 if (!table->is_created())
7818 {
7819 my_error(ER_NO_FT_MATERIALIZED_SUBQUERY, MYF(0));
7820 DBUG_RETURN(true);
7821 }
7822
7823 DBUG_ASSERT(master == NULL);
7824 ft_handler= table->file->ft_init_ext_with_hints(key, ft_tmp, get_hints());
7825 if (thd->is_error())
7826 DBUG_RETURN(true);
7827
7828 if (join_key)
7829 table->file->ft_handler=ft_handler;
7830
7831 DBUG_RETURN(false);
7832 }
7833
7834
get_filtering_effect(table_map filter_for_table,table_map read_tables,const MY_BITMAP * fields_to_ignore,double rows_in_table)7835 float Item_func_match::get_filtering_effect(table_map filter_for_table,
7836 table_map read_tables,
7837 const MY_BITMAP *fields_to_ignore,
7838 double rows_in_table)
7839 {
7840 const Item_field* fld=
7841 contributes_to_filter(read_tables, filter_for_table, fields_to_ignore);
7842 if (!fld)
7843 return COND_FILTER_ALLPASS;
7844
7845 /*
7846 MATCH () ... AGAINST" is similar to "LIKE '...'" which has the
7847 same selectivity as "col BETWEEN ...".
7848 */
7849 return fld->get_cond_filter_default_probability(rows_in_table,
7850 COND_FILTER_BETWEEN);
7851 }
7852
7853
7854 /**
7855 Add field into table read set.
7856
7857 @param field field to be added to the table read set.
7858 */
update_table_read_set(Field * field)7859 static void update_table_read_set(Field *field)
7860 {
7861 TABLE *table= field->table;
7862
7863 if (!bitmap_fast_test_and_set(table->read_set, field->field_index))
7864 table->covering_keys.intersect(field->part_of_key);
7865 }
7866
7867
fix_fields(THD * thd,Item ** ref)7868 bool Item_func_match::fix_fields(THD *thd, Item **ref)
7869 {
7870 DBUG_ASSERT(fixed == 0);
7871 DBUG_ASSERT(arg_count > 0);
7872 Item *item= NULL; // Safe as arg_count is > 1
7873
7874 maybe_null=1;
7875 join_key=0;
7876
7877 /*
7878 const_item is assumed in quite a bit of places, so it would be difficult
7879 to remove; If it would ever to be removed, this should include
7880 modifications to find_best and auto_close as complement to auto_init code
7881 above.
7882 */
7883 enum_mark_columns save_mark_used_columns= thd->mark_used_columns;
7884 /*
7885 Since different engines require different columns for FTS index lookup
7886 we prevent updating of table read_set in argument's ::fix_fields().
7887 */
7888 thd->mark_used_columns= MARK_COLUMNS_NONE;
7889 if (Item_func::fix_fields(thd, ref) ||
7890 fix_func_arg(thd, &against) || !against->const_during_execution())
7891 {
7892 thd->mark_used_columns= save_mark_used_columns;
7893 my_error(ER_WRONG_ARGUMENTS,MYF(0),"AGAINST");
7894 return TRUE;
7895 }
7896 thd->mark_used_columns= save_mark_used_columns;
7897
7898 bool allows_multi_table_search= true;
7899 const_item_cache=0;
7900 for (uint i= 0 ; i < arg_count ; i++)
7901 {
7902 item= args[i]= args[i]->real_item();
7903 if (item->type() != Item::FIELD_ITEM ||
7904 /* Cannot use FTS index with outer table field */
7905 (item->used_tables() & OUTER_REF_TABLE_BIT))
7906 {
7907 my_error(ER_WRONG_ARGUMENTS, MYF(0), "MATCH");
7908 return TRUE;
7909 }
7910 allows_multi_table_search &=
7911 allows_search_on_non_indexed_columns(((Item_field *)item)->field->table);
7912 }
7913
7914 /*
7915 Check that all columns come from the same table.
7916 We've already checked that columns in MATCH are fields so
7917 PARAM_TABLE_BIT can only appear from AGAINST argument.
7918 */
7919 if ((used_tables_cache & ~PARAM_TABLE_BIT) != item->used_tables())
7920 key=NO_SUCH_KEY;
7921
7922 if (key == NO_SUCH_KEY && !allows_multi_table_search)
7923 {
7924 my_error(ER_WRONG_ARGUMENTS,MYF(0),"MATCH");
7925 return TRUE;
7926 }
7927 table_ref= ((Item_field *)item)->table_ref;
7928
7929 /*
7930 Here we make an assumption that if the engine supports
7931 fulltext extension(HA_CAN_FULLTEXT_EXT flag) then table
7932 can have FTS_DOC_ID column. Atm this is the only way
7933 to distinguish MyISAM and InnoDB engines.
7934 Generally table_ref should be available, but in case of
7935 a generated column's generation expression it's not. Thus
7936 we use field's table, at this moment it's already available.
7937 */
7938 TABLE *const table= table_ref ?
7939 table_ref->table :
7940 ((Item_field *)item)->field->table;
7941
7942 if (!(table->file->ha_table_flags() & HA_CAN_FULLTEXT))
7943 {
7944 my_error(ER_TABLE_CANT_HANDLE_FT, MYF(0));
7945 return 1;
7946 }
7947
7948 if ((table->file->ha_table_flags() & HA_CAN_FULLTEXT_EXT))
7949 {
7950 Field *doc_id_field= table->fts_doc_id_field;
7951 /*
7952 Update read set with FTS_DOC_ID column so that indexes that have
7953 FTS_DOC_ID part can be considered as a covering index.
7954 */
7955 if (doc_id_field)
7956 update_table_read_set(doc_id_field);
7957 else
7958 {
7959 /* read_set needs to be updated for MATCH arguments */
7960 for (uint i= 0; i < arg_count; i++)
7961 update_table_read_set(((Item_field*)args[i])->field);
7962 /*
7963 Prevent index only accces by non-FTS index if table does not have
7964 FTS_DOC_ID column, find_relevance does not work properly without
7965 FTS_DOC_ID value. Decision for FTS index about index only access
7966 is made later by JOIN::fts_index_access() function.
7967 */
7968 table->covering_keys.clear_all();
7969 }
7970
7971 }
7972 else
7973 {
7974 /*
7975 Since read_set is not updated for MATCH arguments
7976 it's necessary to update it here for MyISAM.
7977 */
7978 for (uint i= 0; i < arg_count; i++)
7979 update_table_read_set(((Item_field*)args[i])->field);
7980 }
7981
7982 table->fulltext_searched=1;
7983
7984 if (!master)
7985 {
7986 Prepared_stmt_arena_holder ps_arena_holder(thd);
7987 hints= new Ft_hints(flags);
7988 if (!hints)
7989 {
7990 my_error(ER_TABLE_CANT_HANDLE_FT, MYF(0));
7991 return true;
7992 }
7993 }
7994 return agg_item_collations_for_comparison(cmp_collation, func_name(),
7995 args, arg_count, 0);
7996 }
7997
fix_index()7998 bool Item_func_match::fix_index()
7999 {
8000 Item_field *item;
8001 TABLE *table;
8002 uint ft_to_key[MAX_KEY], ft_cnt[MAX_KEY], fts=0, keynr;
8003 uint max_cnt=0, mkeys=0, i;
8004
8005 if (!table_ref)
8006 goto err;
8007
8008 /*
8009 We will skip execution if the item is not fixed
8010 with fix_field
8011 */
8012 if (!fixed)
8013 {
8014 if (allows_search_on_non_indexed_columns(table_ref->table))
8015 key= NO_SUCH_KEY;
8016
8017 return false;
8018 }
8019 if (key == NO_SUCH_KEY)
8020 return 0;
8021
8022 table= table_ref->table;
8023 for (keynr=0 ; keynr < table->s->keys ; keynr++)
8024 {
8025 if ((table->key_info[keynr].flags & HA_FULLTEXT) &&
8026 (flags & FT_BOOL ? table->keys_in_use_for_query.is_set(keynr) :
8027 table->s->keys_in_use.is_set(keynr)))
8028
8029 {
8030 ft_to_key[fts]=keynr;
8031 ft_cnt[fts]=0;
8032 fts++;
8033 }
8034 }
8035
8036 if (!fts)
8037 goto err;
8038
8039 for (i= 0; i < arg_count; i++)
8040 {
8041 item=(Item_field*)args[i];
8042 for (keynr=0 ; keynr < fts ; keynr++)
8043 {
8044 KEY *ft_key=&table->key_info[ft_to_key[keynr]];
8045 uint key_parts=ft_key->user_defined_key_parts;
8046
8047 for (uint part=0 ; part < key_parts ; part++)
8048 {
8049 if (item->field->eq(ft_key->key_part[part].field))
8050 ft_cnt[keynr]++;
8051 }
8052 }
8053 }
8054
8055 for (keynr=0 ; keynr < fts ; keynr++)
8056 {
8057 if (ft_cnt[keynr] > max_cnt)
8058 {
8059 mkeys=0;
8060 max_cnt=ft_cnt[mkeys]=ft_cnt[keynr];
8061 ft_to_key[mkeys]=ft_to_key[keynr];
8062 continue;
8063 }
8064 if (max_cnt && ft_cnt[keynr] == max_cnt)
8065 {
8066 mkeys++;
8067 ft_cnt[mkeys]=ft_cnt[keynr];
8068 ft_to_key[mkeys]=ft_to_key[keynr];
8069 continue;
8070 }
8071 }
8072
8073 for (keynr=0 ; keynr <= mkeys ; keynr++)
8074 {
8075 // partial keys doesn't work
8076 if (max_cnt < arg_count ||
8077 max_cnt < table->key_info[ft_to_key[keynr]].user_defined_key_parts)
8078 continue;
8079
8080 key=ft_to_key[keynr];
8081
8082 return 0;
8083 }
8084
8085 err:
8086 if (table_ref != 0 && allows_search_on_non_indexed_columns(table_ref->table))
8087 {
8088 key=NO_SUCH_KEY;
8089 return 0;
8090 }
8091 my_message(ER_FT_MATCHING_KEY_NOT_FOUND,
8092 ER(ER_FT_MATCHING_KEY_NOT_FOUND), MYF(0));
8093 return 1;
8094 }
8095
8096
eq(const Item * item,bool binary_cmp) const8097 bool Item_func_match::eq(const Item *item, bool binary_cmp) const
8098 {
8099 /* We ignore FT_SORTED flag when checking for equality since result is
8100 equvialent regardless of sorting */
8101 if (item->type() != FUNC_ITEM ||
8102 ((Item_func*)item)->functype() != FT_FUNC ||
8103 (flags | FT_SORTED) != (((Item_func_match*)item)->flags | FT_SORTED))
8104 return 0;
8105
8106 Item_func_match *ifm=(Item_func_match*) item;
8107
8108 if (key == ifm->key && table_ref == ifm->table_ref &&
8109 key_item()->eq(ifm->key_item(), binary_cmp))
8110 return 1;
8111
8112 return 0;
8113 }
8114
8115
val_real()8116 double Item_func_match::val_real()
8117 {
8118 DBUG_ASSERT(fixed == 1);
8119 DBUG_ENTER("Item_func_match::val");
8120 if (ft_handler == NULL)
8121 DBUG_RETURN(-1.0);
8122
8123 TABLE *const table= table_ref->table;
8124 if (key != NO_SUCH_KEY && table->has_null_row()) // NULL row from outer join
8125 DBUG_RETURN(0.0);
8126
8127 if (get_master()->join_key)
8128 {
8129 if (table->file->ft_handler)
8130 DBUG_RETURN(ft_handler->please->get_relevance(ft_handler));
8131 get_master()->join_key= 0;
8132 }
8133
8134 if (key == NO_SUCH_KEY)
8135 {
8136 String *a= concat_ws->val_str(&value);
8137 if ((null_value= (a == 0)) || !a->length())
8138 DBUG_RETURN(0);
8139 DBUG_RETURN(ft_handler->please->find_relevance(ft_handler,
8140 (uchar *)a->ptr(), a->length()));
8141 }
8142 DBUG_RETURN(ft_handler->please->find_relevance(ft_handler,
8143 table->record[0], 0));
8144 }
8145
print(String * str,enum_query_type query_type)8146 void Item_func_match::print(String *str, enum_query_type query_type)
8147 {
8148 str->append(STRING_WITH_LEN("(match "));
8149 print_args(str, 0, query_type);
8150 str->append(STRING_WITH_LEN(" against ("));
8151 against->print(str, query_type);
8152 if (flags & FT_BOOL)
8153 str->append(STRING_WITH_LEN(" in boolean mode"));
8154 else if (flags & FT_EXPAND)
8155 str->append(STRING_WITH_LEN(" with query expansion"));
8156 str->append(STRING_WITH_LEN("))"));
8157 }
8158
8159
8160 /**
8161 Function sets FT hints(LIMIT, flags) depending on
8162 various join conditions.
8163
8164 @param join Pointer to JOIN object.
8165 @param ft_flag FT flag value.
8166 @param ft_limit Limit value.
8167 @param no_cond true if MATCH is not used in WHERE condition.
8168 */
8169
set_hints(JOIN * join,uint ft_flag,ha_rows ft_limit,bool no_cond)8170 void Item_func_match::set_hints(JOIN *join, uint ft_flag,
8171 ha_rows ft_limit, bool no_cond)
8172 {
8173 DBUG_ASSERT(!master);
8174
8175 if (!join) // used for count() optimization
8176 {
8177 hints->set_hint_flag(ft_flag);
8178 return;
8179 }
8180
8181 /* skip hints setting if there are aggregates(except of FT_NO_RANKING) */
8182 if (join->implicit_grouping || join->group_list || join->select_distinct)
8183 {
8184 /* 'No ranking' is possibe even if aggregates are present */
8185 if ((ft_flag & FT_NO_RANKING))
8186 hints->set_hint_flag(FT_NO_RANKING);
8187 return;
8188 }
8189
8190 hints->set_hint_flag(ft_flag);
8191
8192 /**
8193 Only one table is used, there is no aggregates,
8194 WHERE condition is a single MATCH expression
8195 (WHERE MATCH(..) or WHERE MATCH(..) [>=,>] value) or
8196 there is no WHERE condition.
8197 */
8198 if (join->primary_tables == 1 && (no_cond || is_simple_expression()))
8199 hints->set_hint_limit(ft_limit);
8200 }
8201
8202
val_int()8203 longlong Item_func_bit_xor::val_int()
8204 {
8205 DBUG_ASSERT(fixed == 1);
8206 ulonglong arg1= (ulonglong) args[0]->val_int();
8207 ulonglong arg2= (ulonglong) args[1]->val_int();
8208 if ((null_value= (args[0]->null_value || args[1]->null_value)))
8209 return 0;
8210 return (longlong) (arg1 ^ arg2);
8211 }
8212
8213
8214 /***************************************************************************
8215 System variables
8216 ****************************************************************************/
8217
8218 /**
8219 @class Silence_deprecation_warnings
8220
8221 @brief Disable deprecation warnings handler class
8222 */
8223 class Silence_deprecation_warnings : public Internal_error_handler
8224 {
8225 public:
handle_condition(THD * thd,uint sql_errno,const char * sqlstate,Sql_condition::enum_severity_level * level,const char * msg)8226 virtual bool handle_condition(THD *thd,
8227 uint sql_errno,
8228 const char* sqlstate,
8229 Sql_condition::enum_severity_level *level,
8230 const char* msg)
8231 {
8232 return sql_errno == ER_WARN_DEPRECATED_SYNTAX;
8233 }
8234 };
8235
8236 /**
8237 Return value of an system variable base[.name] as a constant item.
8238
8239 @param pc Current parse context
8240 @param var_type global / session
8241 @param name Name of base or system variable
8242 @param component Component.
8243
8244 @note
8245 If component.str = 0 then the variable name is in 'name'
8246
8247 @return
8248 - 0 : error
8249 - # : constant item
8250 */
8251
8252
get_system_var(Parse_context * pc,enum_var_type var_type,LEX_STRING name,LEX_STRING component)8253 Item *get_system_var(Parse_context *pc,
8254 enum_var_type var_type, LEX_STRING name,
8255 LEX_STRING component)
8256 {
8257 THD *thd= pc->thd;
8258 sys_var *var;
8259 LEX_STRING *base_name, *component_name;
8260
8261 if (component.str)
8262 {
8263 base_name= &component;
8264 component_name= &name;
8265 }
8266 else
8267 {
8268 base_name= &name;
8269 component_name= &component; // Empty string
8270 }
8271
8272 if (!(var= find_sys_var(thd, base_name->str, base_name->length)))
8273 return 0;
8274 if (component.str)
8275 {
8276 if (!var->is_struct())
8277 {
8278 my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), base_name->str);
8279 return 0;
8280 }
8281 }
8282 thd->lex->set_uncacheable(pc->select, UNCACHEABLE_SIDEEFFECT);
8283
8284 set_if_smaller(component_name->length, MAX_SYS_VAR_LENGTH);
8285
8286 var->do_deprecated_warning(thd);
8287
8288 Item_func_get_system_var *item= new Item_func_get_system_var(var, var_type,
8289 component_name,
8290 NULL, 0);
8291 #ifndef EMBEDDED_LIBRARY
8292 if (var_type == OPT_GLOBAL && var->check_scope(OPT_GLOBAL))
8293 {
8294 String str;
8295 String *outStr;
8296 /* This object is just created for variable to string conversion.
8297 item object cannot be used after the conversion of the variable
8298 to string. It caches the data. */
8299 Item_func_get_system_var *si= new Item_func_get_system_var(var, var_type,
8300 component_name,
8301 NULL, 0);
8302
8303 /* Disable deprecation warning during var to string conversion. */
8304 Silence_deprecation_warnings silencer;
8305 thd->push_internal_handler(&silencer);
8306
8307 outStr= si ? si->val_str(&str) : &str;
8308
8309 thd->pop_internal_handler();
8310
8311 if (mysql_audit_notify(thd, AUDIT_EVENT(MYSQL_AUDIT_GLOBAL_VARIABLE_GET),
8312 var->name.str,
8313 outStr ? outStr->ptr() : NULL,
8314 outStr ? outStr->length() : 0))
8315 {
8316 return 0;
8317 }
8318 }
8319 #endif
8320
8321 return item;
8322 }
8323
8324
itemize(Parse_context * pc,Item ** res)8325 bool Item_func_row_count::itemize(Parse_context *pc, Item **res)
8326 {
8327 if (skip_itemize(res))
8328 return false;
8329 if (super::itemize(pc, res))
8330 return true;
8331
8332 LEX *lex= pc->thd->lex;
8333 lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
8334 lex->safe_to_cache_query= 0;
8335 return false;
8336 }
8337
val_int()8338 longlong Item_func_row_count::val_int()
8339 {
8340 DBUG_ASSERT(fixed == 1);
8341 THD *thd= current_thd;
8342
8343 return thd->get_row_count_func();
8344 }
8345
8346
Item_func_sp(const POS & pos,const LEX_STRING & db_name,const LEX_STRING & fn_name,bool use_explicit_name,PT_item_list * opt_list)8347 Item_func_sp::Item_func_sp(const POS &pos,
8348 const LEX_STRING &db_name,
8349 const LEX_STRING &fn_name,
8350 bool use_explicit_name,
8351 PT_item_list *opt_list)
8352 : Item_func(pos, opt_list), m_sp(NULL), dummy_table(NULL), sp_result_field(NULL)
8353 {
8354 maybe_null= 1;
8355 with_stored_program= true;
8356 THD *thd= current_thd;
8357 m_name= new (thd->mem_root) sp_name(to_lex_cstring(db_name), fn_name,
8358 use_explicit_name);
8359 }
8360
8361
itemize(Parse_context * pc,Item ** res)8362 bool Item_func_sp::itemize(Parse_context *pc, Item **res)
8363 {
8364 if (skip_itemize(res))
8365 return false;
8366 if (super::itemize(pc, res))
8367 return true;
8368 if (m_name == NULL)
8369 return true; // OOM
8370
8371 THD *thd= pc->thd;
8372 LEX *lex= thd->lex;
8373
8374 context= lex->current_context();
8375 lex->safe_to_cache_query= false;
8376
8377 if (m_name->m_db.str == NULL)
8378 {
8379 /* Cannot match the function since no database is selected */
8380 my_error(ER_NO_DB_ERROR, MYF(0));
8381 return true;
8382 }
8383
8384 m_name->init_qname(thd);
8385 sp_add_used_routine(lex, thd, m_name, SP_TYPE_FUNCTION);
8386
8387 dummy_table= (TABLE*) sql_calloc(sizeof(TABLE)+ sizeof(TABLE_SHARE));
8388 if (dummy_table == NULL)
8389 return true;
8390 dummy_table->s= (TABLE_SHARE*) (dummy_table+1);
8391
8392 return false;
8393 }
8394
8395
8396 void
cleanup()8397 Item_func_sp::cleanup()
8398 {
8399 if (sp_result_field)
8400 {
8401 delete sp_result_field;
8402 sp_result_field= NULL;
8403 }
8404 m_sp= NULL;
8405 if (dummy_table != NULL)
8406 dummy_table->alias= NULL;
8407 Item_func::cleanup();
8408 tables_locked_cache= false;
8409 with_stored_program= true;
8410 }
8411
8412 const char *
func_name() const8413 Item_func_sp::func_name() const
8414 {
8415 THD *thd= current_thd;
8416 /* Calculate length to avoid reallocation of string for sure */
8417 size_t len= (((m_name->m_explicit_name ? m_name->m_db.length : 0) +
8418 m_name->m_name.length)*2 + //characters*quoting
8419 2 + // ` and `
8420 (m_name->m_explicit_name ?
8421 3 : 0) + // '`', '`' and '.' for the db
8422 1 + // end of string
8423 ALIGN_SIZE(1)); // to avoid String reallocation
8424 String qname((char *)alloc_root(thd->mem_root, len), len,
8425 system_charset_info);
8426
8427 qname.length(0);
8428 if (m_name->m_explicit_name)
8429 {
8430 append_identifier(thd, &qname, m_name->m_db.str, m_name->m_db.length);
8431 qname.append('.');
8432 }
8433 append_identifier(thd, &qname, m_name->m_name.str, m_name->m_name.length);
8434 return qname.ptr();
8435 }
8436
8437
get_initial_pseudo_tables() const8438 table_map Item_func_sp::get_initial_pseudo_tables() const
8439 {
8440 return m_sp->m_chistics->detistic ? 0 : RAND_TABLE_BIT;
8441 }
8442
8443
my_missing_function_error(const LEX_STRING & token,const char * func_name)8444 void my_missing_function_error(const LEX_STRING &token, const char *func_name)
8445 {
8446 if (token.length && is_lex_native_function (&token))
8447 my_error(ER_FUNC_INEXISTENT_NAME_COLLISION, MYF(0), func_name);
8448 else
8449 my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "FUNCTION", func_name);
8450 }
8451
8452
8453 /**
8454 @brief Initialize the result field by creating a temporary dummy table
8455 and assign it to a newly created field object. Meta data used to
8456 create the field is fetched from the sp_head belonging to the stored
8457 proceedure found in the stored procedure functon cache.
8458
8459 @note This function should be called from fix_fields to init the result
8460 field. It is some what related to Item_field.
8461
8462 @see Item_field
8463
8464 @param thd A pointer to the session and thread context.
8465
8466 @return Function return error status.
8467 @retval TRUE is returned on an error
8468 @retval FALSE is returned on success.
8469 */
8470
8471 bool
init_result_field(THD * thd)8472 Item_func_sp::init_result_field(THD *thd)
8473 {
8474 LEX_STRING empty_name= { C_STRING_WITH_LEN("") };
8475 TABLE_SHARE *share;
8476 DBUG_ENTER("Item_func_sp::init_result_field");
8477
8478 DBUG_ASSERT(m_sp == NULL);
8479 DBUG_ASSERT(sp_result_field == NULL);
8480
8481 Internal_error_handler_holder<View_error_handler, TABLE_LIST>
8482 view_handler(thd, context->view_error_handler,
8483 context->view_error_handler_arg);
8484 if (!(m_sp= sp_find_routine(thd, SP_TYPE_FUNCTION, m_name,
8485 &thd->sp_func_cache, TRUE)))
8486 {
8487 my_missing_function_error (m_name->m_name, m_name->m_qname.str);
8488 DBUG_RETURN(TRUE);
8489 }
8490
8491 /*
8492 A Field need to be attached to a Table.
8493 Below we "create" a dummy table by initializing
8494 the needed pointers.
8495 */
8496
8497 share= dummy_table->s;
8498 dummy_table->alias = "";
8499 if (maybe_null)
8500 dummy_table->set_nullable();
8501 dummy_table->in_use= thd;
8502 dummy_table->copy_blobs= TRUE;
8503 share->table_cache_key = empty_name;
8504 share->table_name = empty_name;
8505
8506 if (!(sp_result_field= m_sp->create_result_field(max_length, item_name.ptr(),
8507 dummy_table)))
8508 {
8509 DBUG_RETURN(TRUE);
8510 }
8511
8512 if (sp_result_field->pack_length() > sizeof(result_buf))
8513 {
8514 void *tmp;
8515 if (!(tmp= sql_alloc(sp_result_field->pack_length())))
8516 DBUG_RETURN(TRUE);
8517 sp_result_field->move_field((uchar*) tmp);
8518 }
8519 else
8520 sp_result_field->move_field(result_buf);
8521
8522 sp_result_field->set_null_ptr((uchar *) &null_value, 1);
8523 DBUG_RETURN(FALSE);
8524 }
8525
8526
8527 /**
8528 @brief Initialize local members with values from the Field interface.
8529
8530 @note called from Item::fix_fields.
8531 */
8532
fix_length_and_dec()8533 void Item_func_sp::fix_length_and_dec()
8534 {
8535 DBUG_ENTER("Item_func_sp::fix_length_and_dec");
8536
8537 DBUG_ASSERT(sp_result_field);
8538 decimals= sp_result_field->decimals();
8539 max_length= sp_result_field->field_length;
8540 collation.set(sp_result_field->charset());
8541 maybe_null= 1;
8542 unsigned_flag= MY_TEST(sp_result_field->flags & UNSIGNED_FLAG);
8543
8544 DBUG_VOID_RETURN;
8545 }
8546
8547
val_json(Json_wrapper * result)8548 bool Item_func_sp::val_json(Json_wrapper *result)
8549 {
8550 if (sp_result_field->type() == MYSQL_TYPE_JSON)
8551 {
8552 if (execute())
8553 {
8554 return true;
8555 }
8556
8557 Field_json *json_value= down_cast<Field_json *>(sp_result_field);
8558 return json_value->val_json(result);
8559 }
8560
8561 /* purecov: begin deadcode */
8562 DBUG_ABORT();
8563 my_error(ER_INVALID_CAST_TO_JSON, MYF(0));
8564 return error_json();
8565 /* purecov: end */
8566 }
8567
8568
8569 type_conversion_status
save_in_field_inner(Field * field,bool no_conversions)8570 Item_func_sp::save_in_field_inner(Field *field, bool no_conversions)
8571 {
8572 return save_possibly_as_json(field, no_conversions);
8573 }
8574
8575
update_null_value()8576 void Item_func_sp::update_null_value()
8577 {
8578 /*
8579 This method is called when we try to check if the item value is NULL.
8580 We call Item_func_sp::execute() to get value of null_value attribute
8581 as a side effect of its execution.
8582 We ignore any error since update_null_value() doesn't return value.
8583 We used to delegate nullability check to Item::update_null_value as
8584 a result of a chain of function calls:
8585 Item_func_isnull::val_int --> Item_func::is_null -->
8586 Item::update_null_value -->Item_func_sp::val_int -->
8587 Field_varstring::val_int
8588 Such approach resulted in a call of push_warning_printf() in case
8589 if a stored program value couldn't be cast to integer (the case when
8590 for example there was a stored function that declared as returning
8591 varchar(1) and a function's implementation returned "Y" from its body).
8592 */
8593 execute();
8594 }
8595
8596
8597 /**
8598 @brief Execute function & store value in field.
8599
8600 @return Function returns error status.
8601 @retval FALSE on success.
8602 @retval TRUE if an error occurred.
8603 */
8604
8605 bool
execute()8606 Item_func_sp::execute()
8607 {
8608 THD *thd= current_thd;
8609
8610 Internal_error_handler_holder<View_error_handler, TABLE_LIST>
8611 view_handler(thd, context->view_error_handler,
8612 context->view_error_handler_arg);
8613 /* Execute function and store the return value in the field. */
8614
8615 if (execute_impl(thd))
8616 {
8617 null_value= 1;
8618 if (thd->killed)
8619 thd->send_kill_message();
8620 return TRUE;
8621 }
8622
8623 /* Check that the field (the value) is not NULL. */
8624
8625 null_value= sp_result_field->is_null();
8626
8627 return null_value;
8628 }
8629
8630
8631 /**
8632 @brief Execute function and store the return value in the field.
8633
8634 @note This function was intended to be the concrete implementation of
8635 the interface function execute. This was never realized.
8636
8637 @return The error state.
8638 @retval FALSE on success
8639 @retval TRUE if an error occurred.
8640 */
8641 bool
execute_impl(THD * thd)8642 Item_func_sp::execute_impl(THD *thd)
8643 {
8644 bool err_status= TRUE;
8645 Sub_statement_state statement_state;
8646 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8647 Security_context *save_security_ctx= thd->security_context();
8648 #endif
8649 enum enum_sp_data_access access=
8650 (m_sp->m_chistics->daccess == SP_DEFAULT_ACCESS) ?
8651 SP_DEFAULT_ACCESS_MAPPING : m_sp->m_chistics->daccess;
8652
8653 DBUG_ENTER("Item_func_sp::execute_impl");
8654
8655 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8656 if (context->security_ctx)
8657 {
8658 /* Set view definer security context */
8659 thd->set_security_context(context->security_ctx);
8660 }
8661 #endif
8662 if (sp_check_access(thd))
8663 goto error;
8664
8665 /*
8666 Throw an error if a non-deterministic function is called while
8667 statement-based replication (SBR) is active.
8668 */
8669
8670 if (!m_sp->m_chistics->detistic && !trust_function_creators &&
8671 (access == SP_CONTAINS_SQL || access == SP_MODIFIES_SQL_DATA) &&
8672 (mysql_bin_log.is_open() &&
8673 thd->variables.binlog_format == BINLOG_FORMAT_STMT))
8674 {
8675 my_error(ER_BINLOG_UNSAFE_ROUTINE, MYF(0));
8676 goto error;
8677 }
8678 /*
8679 Disable the binlogging if this is not a SELECT statement. If this is a
8680 SELECT, leave binlogging on, so execute_function() code writes the
8681 function call into binlog.
8682 */
8683 thd->reset_sub_statement_state(&statement_state, SUB_STMT_FUNCTION);
8684 err_status= m_sp->execute_function(thd, args, arg_count, sp_result_field);
8685 thd->restore_sub_statement_state(&statement_state);
8686
8687 error:
8688 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8689 thd->set_security_context(save_security_ctx);
8690 #endif
8691
8692 DBUG_RETURN(err_status);
8693 }
8694
8695
8696 void
make_field(Send_field * tmp_field)8697 Item_func_sp::make_field(Send_field *tmp_field)
8698 {
8699 DBUG_ENTER("Item_func_sp::make_field");
8700 DBUG_ASSERT(sp_result_field);
8701 sp_result_field->make_field(tmp_field);
8702 if (item_name.is_set())
8703 tmp_field->col_name= item_name.ptr();
8704 DBUG_VOID_RETURN;
8705 }
8706
8707
8708 enum enum_field_types
field_type() const8709 Item_func_sp::field_type() const
8710 {
8711 DBUG_ENTER("Item_func_sp::field_type");
8712 DBUG_ASSERT(sp_result_field);
8713 DBUG_RETURN(sp_result_field->type());
8714 }
8715
8716 Item_result
result_type() const8717 Item_func_sp::result_type() const
8718 {
8719 DBUG_ENTER("Item_func_sp::result_type");
8720 DBUG_PRINT("info", ("m_sp = %p", (void *) m_sp));
8721 DBUG_ASSERT(sp_result_field);
8722 DBUG_RETURN(sp_result_field->result_type());
8723 }
8724
8725
itemize(Parse_context * pc,Item ** res)8726 bool Item_func_found_rows::itemize(Parse_context *pc, Item **res)
8727 {
8728 if (skip_itemize(res))
8729 return false;
8730 if (super::itemize(pc, res))
8731 return true;
8732 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
8733 pc->thd->lex->safe_to_cache_query= false;
8734 return false;
8735 }
8736
8737
val_int()8738 longlong Item_func_found_rows::val_int()
8739 {
8740 DBUG_ASSERT(fixed == 1);
8741 return current_thd->found_rows();
8742 }
8743
8744
8745 Field *
tmp_table_field(TABLE * t_arg)8746 Item_func_sp::tmp_table_field(TABLE *t_arg)
8747 {
8748 DBUG_ENTER("Item_func_sp::tmp_table_field");
8749
8750 DBUG_ASSERT(sp_result_field);
8751 DBUG_RETURN(sp_result_field);
8752 }
8753
8754
8755 /**
8756 @brief Checks if requested access to function can be granted to user.
8757 If function isn't found yet, it searches function first.
8758 If function can't be found or user don't have requested access
8759 error is raised.
8760
8761 @param thd thread handler
8762
8763 @return Indication if the access was granted or not.
8764 @retval FALSE Access is granted.
8765 @retval TRUE Requested access can't be granted or function doesn't exists.
8766
8767 */
8768
8769 bool
sp_check_access(THD * thd)8770 Item_func_sp::sp_check_access(THD *thd)
8771 {
8772 DBUG_ENTER("Item_func_sp::sp_check_access");
8773 DBUG_ASSERT(m_sp);
8774 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8775 if (check_routine_access(thd, EXECUTE_ACL,
8776 m_sp->m_db.str, m_sp->m_name.str, 0, FALSE))
8777 DBUG_RETURN(TRUE);
8778 #endif
8779
8780 DBUG_RETURN(FALSE);
8781 }
8782
8783
8784 bool
fix_fields(THD * thd,Item ** ref)8785 Item_func_sp::fix_fields(THD *thd, Item **ref)
8786 {
8787 bool res;
8788 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8789 Security_context *save_security_ctx= thd->security_context();
8790 #endif
8791
8792 DBUG_ENTER("Item_func_sp::fix_fields");
8793 DBUG_ASSERT(fixed == 0);
8794
8795 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8796 /*
8797 Checking privileges to execute the function while creating view and
8798 executing the function of select.
8799 */
8800 if (!(thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) ||
8801 (thd->lex->sql_command == SQLCOM_CREATE_VIEW))
8802 {
8803 if (context->security_ctx)
8804 {
8805 /* Set view definer security context */
8806 thd->set_security_context(context->security_ctx);
8807 }
8808
8809 /*
8810 Check whether user has execute privilege or not
8811 */
8812
8813 Internal_error_handler_holder<View_error_handler, TABLE_LIST>
8814 view_handler(thd, context->view_error_handler,
8815 context->view_error_handler_arg);
8816
8817 res= check_routine_access(thd, EXECUTE_ACL, m_name->m_db.str,
8818 m_name->m_name.str, 0, FALSE);
8819 thd->set_security_context(save_security_ctx);
8820
8821 if (res)
8822 {
8823 DBUG_RETURN(res);
8824 }
8825 }
8826 #endif
8827
8828 /*
8829 We must call init_result_field before Item_func::fix_fields()
8830 to make m_sp and result_field members available to fix_length_and_dec(),
8831 which is called from Item_func::fix_fields().
8832 */
8833 res= init_result_field(thd);
8834
8835 if (res)
8836 DBUG_RETURN(res);
8837
8838 res= Item_func::fix_fields(thd, ref);
8839
8840 /* These is reset/set by Item_func::fix_fields. */
8841 with_stored_program= true;
8842
8843 if (res)
8844 DBUG_RETURN(res);
8845
8846 if (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW)
8847 {
8848 /*
8849 Here we check privileges of the stored routine only during view
8850 creation, in order to validate the view. A runtime check is
8851 perfomed in Item_func_sp::execute(), and this method is not
8852 called during context analysis. Notice, that during view
8853 creation we do not infer into stored routine bodies and do not
8854 check privileges of its statements, which would probably be a
8855 good idea especially if the view has SQL SECURITY DEFINER and
8856 the used stored procedure has SQL SECURITY DEFINER.
8857 */
8858 res= sp_check_access(thd);
8859 #ifndef NO_EMBEDDED_ACCESS_CHECKS
8860 /*
8861 Try to set and restore the security context to see whether it's valid
8862 */
8863 Security_context *save_secutiry_ctx;
8864 res= m_sp->set_security_ctx(thd, &save_secutiry_ctx);
8865 if (!res)
8866 m_sp->m_security_ctx.restore_security_context(thd, save_secutiry_ctx);
8867
8868 #endif /* ! NO_EMBEDDED_ACCESS_CHECKS */
8869 }
8870
8871 DBUG_RETURN(res);
8872 }
8873
8874
update_used_tables()8875 void Item_func_sp::update_used_tables()
8876 {
8877 Item_func::update_used_tables();
8878
8879 /* This is reset by Item_func::update_used_tables(). */
8880 with_stored_program= true;
8881 }
8882
8883
8884 /*
8885 uuid_short handling.
8886
8887 The short uuid is defined as a longlong that contains the following bytes:
8888
8889 Bytes Comment
8890 1 Server_id & 255
8891 4 Startup time of server in seconds
8892 3 Incrementor
8893
8894 This means that an uuid is guaranteed to be unique
8895 even in a replication environment if the following holds:
8896
8897 - The last byte of the server id is unique
8898 - If you between two shutdown of the server don't get more than
8899 an average of 2^24 = 16M calls to uuid_short() per second.
8900 */
8901
8902 ulonglong uuid_value;
8903
uuid_short_init()8904 void uuid_short_init()
8905 {
8906 uuid_value= ((((ulonglong) server_id) << 56) +
8907 (((ulonglong) server_start_time) << 24));
8908 }
8909
8910
itemize(Parse_context * pc,Item ** res)8911 bool Item_func_uuid_short::itemize(Parse_context *pc, Item **res)
8912 {
8913 if (skip_itemize(res))
8914 return false;
8915 if (super::itemize(pc, res))
8916 return true;
8917 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
8918 pc->thd->lex->safe_to_cache_query= false;
8919 return false;
8920 }
8921
8922
val_int()8923 longlong Item_func_uuid_short::val_int()
8924 {
8925 ulonglong val;
8926 mysql_mutex_lock(&LOCK_uuid_generator);
8927 val= uuid_value++;
8928 mysql_mutex_unlock(&LOCK_uuid_generator);
8929 return (longlong) val;
8930 }
8931
8932
itemize(Parse_context * pc,Item ** res)8933 bool Item_func_version::itemize(Parse_context *pc, Item **res)
8934 {
8935 if (skip_itemize(res))
8936 return false;
8937 if (super::itemize(pc, res))
8938 return true;
8939 pc->thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
8940 return false;
8941 }
8942
8943