MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:konstantin Date:October 31 2007 9:32pm
Subject:bk commit into 5.1 tree (kostja:1.2608) BUG#32007
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of kostja. When kostja does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-11-01 00:31:57+03:00, kostja@bodhi.(none) +3 -0
  A fix for Bug#32007 select udf_function() doesn't return an error if error
  during udf initialization. The bug is spotted while working on Bug 12713.
  
  If a user-defined function was used in a SELECT statement, and an
  error would occur during UDF initialization, this error would not terminate
  execution of the SELECT, but rather would be converted to a warning.
  
  The fix is to use a stack buffer to store the message from udf_init instead
  of private my_error() buffer.

  mysql-test/r/udf.result@stripped, 2007-11-01 00:31:54+03:00, kostja@bodhi.(none) +6 -6
    Update the result to reflect the fix for Bug#32007 select udf_function() 
    doesn't return an error if error during udf initialization

  mysql-test/t/udf.test@stripped, 2007-11-01 00:31:54+03:00, kostja@bodhi.(none) +6 -6
    Update the test to reflect the fix for Bug #32007 select udf_function() 
    doesn't return an error if error during udf initialization

  sql/item_func.cc@stripped, 2007-11-01 00:31:54+03:00, kostja@bodhi.(none) +3 -2
    A fix for Bug#32007.
    
    net.last_error buffer was used to store the temporary message from udf_init.
    Then, when my_error() was called, net.last_error was not empty so 
    my_error() would conclude that there is already an error in the error stack, 
    and not "overwrite" it.
    However, thd->net.report_error was not set, so the the 
    SELECT was not aborted.
    
    The fix is to use a stack buffer instead of thd->net.last_error
    to store the message from udf_init. The message will end up in
    thd->net.last_error anyway after a call to my_error.

diff -Nrup a/mysql-test/r/udf.result b/mysql-test/r/udf.result
--- a/mysql-test/r/udf.result	2007-10-29 17:01:33 +03:00
+++ b/mysql-test/r/udf.result	2007-11-01 00:31:54 +03:00
@@ -11,7 +11,7 @@ RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
 CREATE AGGREGATE FUNCTION avgcost
 RETURNS REAL SONAME "UDF_EXAMPLE_LIB";
 select myfunc_double();
-ERROR HY000: myfunc_double must have at least one argument
+ERROR HY000: Can't initialize function 'myfunc_double'; myfunc_double must have at least one argument
 select myfunc_double(1);
 myfunc_double(1)
 49.00
@@ -24,26 +24,26 @@ select myfunc_int();
 myfunc_int()
 0
 select lookup();
-ERROR HY000: Wrong arguments to lookup;  Use the source
+ERROR HY000: Can't initialize function 'lookup'; Wrong arguments to lookup;  Use the source
 select lookup("127.0.0.1");
 lookup("127.0.0.1")
 127.0.0.1
 select lookup(127,0,0,1);
-ERROR HY000: Wrong arguments to lookup;  Use the source
+ERROR HY000: Can't initialize function 'lookup'; Wrong arguments to lookup;  Use the source
 select lookup("localhost");
 lookup("localhost")
 127.0.0.1
 select reverse_lookup();
-ERROR HY000: Wrong number of arguments to reverse_lookup;  Use the source
+ERROR HY000: Can't initialize function 'reverse_lookup'; Wrong number of arguments to reverse_lookup;  Use the source
 select reverse_lookup("127.0.0.1");
 select reverse_lookup(127,0,0,1);
 select reverse_lookup("localhost");
 reverse_lookup("localhost")
 NULL
 select avgcost();
-ERROR HY000: wrong number of arguments: AVGCOST() requires two arguments
+ERROR HY000: Can't initialize function 'avgcost'; wrong number of arguments: AVGCOST() requires two arguments
 select avgcost(100,23.76);
-ERROR HY000: wrong argument type: AVGCOST() requires an INT and a REAL
+ERROR HY000: Can't initialize function 'avgcost'; wrong argument type: AVGCOST() requires an INT and a REAL
 create table t1(sum int, price float(24));
 insert into t1 values(100, 50.00), (100, 100.00);
 select avgcost(sum, price) from t1;
diff -Nrup a/mysql-test/t/udf.test b/mysql-test/t/udf.test
--- a/mysql-test/t/udf.test	2007-10-29 17:01:33 +03:00
+++ b/mysql-test/t/udf.test	2007-11-01 00:31:54 +03:00
@@ -35,20 +35,20 @@ eval CREATE FUNCTION reverse_lookup
 eval CREATE AGGREGATE FUNCTION avgcost
         RETURNS REAL SONAME "$UDF_EXAMPLE_LIB";
 
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select myfunc_double();
 select myfunc_double(1);
 select myfunc_double(78654);
 --error 1305
 select myfunc_nonexist();
 select myfunc_int();
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select lookup();
 select lookup("127.0.0.1");
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select lookup(127,0,0,1);
 select lookup("localhost");
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select reverse_lookup();
 
 # These two functions should return "localhost", but it's
@@ -59,9 +59,9 @@ select reverse_lookup(127,0,0,1);
 --enable_result_log
 
 select reverse_lookup("localhost");
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select avgcost();
---error 0
+--error ER_CANT_INITIALIZE_UDF
 select avgcost(100,23.76);
 create table t1(sum int, price float(24));
 insert into t1 values(100, 50.00), (100, 100.00);
diff -Nrup a/sql/item_func.cc b/sql/item_func.cc
--- a/sql/item_func.cc	2007-10-30 20:08:11 +03:00
+++ b/sql/item_func.cc	2007-11-01 00:31:54 +03:00
@@ -2897,6 +2897,7 @@ udf_handler::fix_fields(THD *thd, Item_r
 
   if (u_d->func_init)
   {
+    char init_msg_buff[MYSQL_ERRMSG_SIZE];
     char *to=num_buffer;
     for (uint i=0; i < arg_count; i++)
     {
@@ -2949,10 +2950,10 @@ udf_handler::fix_fields(THD *thd, Item_r
     }
     thd->net.last_error[0]=0;
     Udf_func_init init= u_d->func_init;
-    if ((error=(uchar) init(&initid, &f_args, thd->net.last_error)))
+    if ((error=(uchar) init(&initid, &f_args, init_msg_buff)))
     {
       my_error(ER_CANT_INITIALIZE_UDF, MYF(0),
-               u_d->name.str, thd->net.last_error);
+               u_d->name.str, init_msg_buff);
       free_udf(u_d);
       DBUG_RETURN(TRUE);
     }
Thread
bk commit into 5.1 tree (kostja:1.2608) BUG#32007konstantin31 Oct