1 /* Copyright (c) 2000, 2010, 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 as published by 5 the Free Software Foundation; version 2 of the License. 6 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 GNU General Public License for more details. 11 12 You should have received a copy of the GNU General Public License 13 along with this program; if not, write to the Free Software 14 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ 15 16 17 /* Procedures (functions with changes output of select) */ 18 19 #ifdef USE_PRAGMA_IMPLEMENTATION 20 #pragma implementation // gcc: Class implementation 21 #endif 22 23 #include "mariadb.h" 24 #include "sql_priv.h" 25 #include "procedure.h" 26 #include "sql_analyse.h" // Includes procedure 27 #ifdef USE_PROC_RANGE 28 #include "proc_range.h" 29 #endif 30 31 static struct st_procedure_def { 32 const char *name; 33 Procedure *(*init)(THD *thd,ORDER *param,select_result *result, 34 List<Item> &field_list); 35 } sql_procs[] = { 36 #ifdef USE_PROC_RANGE 37 { "split_sum",proc_sum_range_init }, // Internal procedure at TCX 38 { "split_count",proc_count_range_init }, // Internal procedure at TCX 39 { "matris_ranges",proc_matris_range_init }, // Internal procedure at TCX 40 #endif 41 { "analyse",proc_analyse_init } // Analyse a result 42 }; 43 44 45 my_decimal *Item_proc_string::val_decimal(my_decimal *decimal_value) 46 { 47 if (null_value) 48 return 0; 49 string2my_decimal(E_DEC_FATAL_ERROR, &str_value, decimal_value); 50 return (decimal_value); 51 } 52 53 54 my_decimal *Item_proc_int::val_decimal(my_decimal *decimal_value) 55 { 56 if (null_value) 57 return 0; 58 int2my_decimal(E_DEC_FATAL_ERROR, value, unsigned_flag, decimal_value); 59 return (decimal_value); 60 } 61 62 63 my_decimal *Item_proc_real::val_decimal(my_decimal *decimal_value) 64 { 65 if (null_value) 66 return 0; 67 double2my_decimal(E_DEC_FATAL_ERROR, value, decimal_value); 68 return (decimal_value); 69 } 70 71 72 /** 73 Setup handling of procedure. 74 75 @return 76 Return 0 if everything is ok 77 */ 78 79 80 Procedure * 81 setup_procedure(THD *thd,ORDER *param,select_result *result, 82 List<Item> &field_list,int *error) 83 { 84 uint i; 85 DBUG_ENTER("setup_procedure"); 86 *error=0; 87 if (!param) 88 DBUG_RETURN(0); 89 for (i=0 ; i < array_elements(sql_procs) ; i++) 90 { 91 if (!my_strcasecmp(system_charset_info, 92 (*param->item)->name.str, sql_procs[i].name)) 93 { 94 Procedure *proc=(*sql_procs[i].init)(thd,param,result,field_list); 95 *error= !proc; 96 DBUG_RETURN(proc); 97 } 98 } 99 my_error(ER_UNKNOWN_PROCEDURE, MYF(0), (*param->item)->name.str); 100 *error=1; 101 DBUG_RETURN(0); 102 } 103