Commit 0fd78492 authored by unknown's avatar unknown
Browse files

Fixed BUG#16896: Stored function: unused AGGREGATE-clause in CREATE FUNCTION

  Check if AGGREGATE was given with a stored (non-UDF) function, and return
  error in that case.
  Also made udf_example/udf_test work again, by adding a missing *_init()
  function. (_init() functions required unless --allow_suspicious_udfs is
  given to the server, since March 2005 - it seems udf_example wasn't updated
  at the time.)


mysql-test/r/sp-error.result:
  Updated results for BUG#16896.
mysql-test/t/sp-error.test:
  Added test case for BUG#16896.
sql/share/errmsg.txt:
  New error message: ER_SP_NO_AGGREGATE
sql/sql_yacc.yy:
  Check if AGGREGATE was used when creating a stored function (i.e. not an UDF).
sql/udf_example.cc:
  Added myfunc_int_init() function to make it work when the server is running without
  --allow_suspicious_udfs.
parent 5ffc2dc2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1176,3 +1176,6 @@ end|
call bug15091();
ERROR 42S02: Unknown table 'c' in field list
drop procedure bug15091;
drop function if exists bug16896;
create aggregate function bug16896() returns int return 1;
ERROR 42000: AGGREGATE is not supported for stored functions
+12 −0
Original line number Diff line number Diff line
@@ -1703,6 +1703,17 @@ call bug15091();
drop procedure bug15091;


#
# BUG#16896: Stored function: unused AGGREGATE-clause in CREATE FUNCTION
#
--disable_warnings
drop function if exists bug16896;
--enable_warnings

--error ER_SP_NO_AGGREGATE
create aggregate function bug16896() returns int return 1;


#
# BUG#NNNN: New bug synopsis
#
@@ -1710,3 +1721,4 @@ drop procedure bug15091;
#drop procedure if exists bugNNNN|
#--enable_warnings
#create procedure bugNNNN...
+2 −0
Original line number Diff line number Diff line
@@ -5607,3 +5607,5 @@ ER_SP_PROC_TABLE_CORRUPT
	eng "Failed to load routine %s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)"
ER_SP_WRONG_NAME 42000
	eng "Incorrect routine name '%-.64s'"
ER_SP_NO_AGGREGATE 42000
	eng "AGGREGATE is not supported for stored functions"
+10 −0
Original line number Diff line number Diff line
@@ -1326,6 +1326,16 @@ create_function_tail:
	    LEX *lex= Lex;
	    sp_head *sp;

            /* 
              First check if AGGREGATE was used, in that case it's a
              syntax error.
            */
            if (lex->udf.type == UDFTYPE_AGGREGATE)
            {
              my_error(ER_SP_NO_AGGREGATE, MYF(0));
              YYABORT;
            }

	    if (lex->sphead)
	    {
	      my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "FUNCTION");
+9 −0
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ char *metaphon(UDF_INIT *initid, UDF_ARGS *args, char *result,
my_bool myfunc_double_init(UDF_INIT *, UDF_ARGS *args, char *message);
double myfunc_double(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
		     char *error);
my_bool myfunc_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
longlong myfunc_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
		    char *error);
my_bool sequence_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
@@ -597,6 +598,14 @@ longlong myfunc_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
  return val;
}

/*
  At least one of _init/_deinit is needed unless the server is started
  with --allow_suspicious_udfs.
*/
my_bool myfunc_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
  return 0;
}

/*
  Simple example of how to get a sequences starting from the first argument