Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

bk commit into 5.1 tree (kostja:1.2608) BUG#32007

From: <konstantin(at)mysql.com>
Date: Wed Oct 31 2007 - 17:32:02 EDT


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@1.2608, 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@1.27, 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@1.25, 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@1.426, 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.     

Do you need help?X

    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); }

--

MySQL Code Commits Mailing List
For list archives: http://lists.mysql.com/commits To unsubscribe: http://lists.mysql.com/commits?unsub=lists@pantek.com Received on Wed Oct 31 17:32:09 2007

This archive was generated by hypermail 2.1.8 : Thu Jul 03 2008 - 11:15:06 EDT

Do you need more help?X

Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library