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