Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

bk commit into 5.0 tree (dkatz:1.2502) BUG#29804

From: <damien(at)mysql.com>
Date: Wed Sep 05 2007 - 15:06:16 EDT


Below is the list of changes that have just been committed into a local 5.0 repository of dkatz. When dkatz 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.2502, 2007-09-05 15:06:10-04:00, dkatz@damien-katzs-computer.local +5 -0   Bug #29804 UDF parameters don't contain correct string length     

  Previously, UDF *_init functions were passed constant strings with erroneous lengths.   The length came from the containing variable's size, not the length of the value itself.     

  Now the *_init functions get the constant as a null terminated string with the correct   length supplied too.

  mysql-test/r/udf.result@1.14, 2007-09-05 15:06:06-04:00, dkatz@damien-katzs-computer.local +24 -0     Test case to check constants passed UDFs.

  mysql-test/t/udf.test@1.14, 2007-09-05 15:06:06-04:00, dkatz@damien-katzs-computer.local +36 -0     Test case to check constants passed UDFs.

  sql/item_func.cc@1.355, 2007-09-05 15:06:06-04:00, dkatz@damien-katzs-computer.local +2 -1     UDF _init functions are now passed the length of the constants, rather than the max     length of the var containing the constant.

  sql/udf_example.c@1.36, 2007-09-05 15:06:07-04:00, dkatz@damien-katzs-computer.local +35 -0     Added check_const_len functions. The check_const_len_init functions checks that the     lengths of constants are correctly passed.

Do you need help?X

  sql/udf_example.def@1.4, 2007-09-05 15:06:07-04:00, dkatz@damien-katzs-computer.local +2 -0     Add new example functions to windows dll export list.

diff -Nrup a/mysql-test/r/udf.result b/mysql-test/r/udf.result

--- a/mysql-test/r/udf.result	2007-06-18 17:55:07 -04:00

+++ b/mysql-test/r/udf.result 2007-09-05 15:06:06 -04:00
@@ -296,4 +296,28 @@ Qcache_queries_in_cache 0
 drop table t1;
 drop function metaphon;
 set GLOBAL query_cache_size=default;
+CREATE TABLE const_len_bug (
+str_const varchar(4000),
+result1 varchar(4000),
+result2 varchar(4000)
+);
+CREATE TRIGGER check_const_len_trigger BEFORE INSERT ON const_len_bug FOR EACH ROW BEGIN
+set NEW.str_const = 'bar';
+set NEW.result2 = check_const_len(NEW.str_const);
+END |
+CREATE PROCEDURE check_const_len_sp (IN str_const VARCHAR(4000))
+BEGIN
+DECLARE result VARCHAR(4000);
+SET result = check_const_len(str_const);
+insert into const_len_bug values(str_const, result, "");
+END |
+CREATE FUNCTION check_const_len RETURNS string SONAME "UDF_EXAMPLE_LIB";
+CALL check_const_len_sp("foo");
+SELECT * from const_len_bug;
+str_const result1 result2
+bar Correct length Correct length
+DROP FUNCTION check_const_len;
+DROP PROCEDURE check_const_len_sp;
+DROP TRIGGER check_const_len_trigger;
+DROP TABLE const_len_bug;

 End of 5.0 tests.
diff -Nrup a/mysql-test/t/udf.test b/mysql-test/t/udf.test
--- a/mysql-test/t/udf.test	2007-06-18 17:55:07 -04:00

+++ b/mysql-test/t/udf.test 2007-09-05 15:06:06 -04:00
@@ -312,4 +312,40 @@ drop function metaphon;  set GLOBAL query_cache_size=default;    

+#
+# Bug #29804 UDF parameters don't contain correct string length
+#
+
+CREATE TABLE const_len_bug (
+ str_const varchar(4000),
+ result1 varchar(4000),
+ result2 varchar(4000)
+);
+
+DELIMITER |;
+CREATE TRIGGER check_const_len_trigger BEFORE INSERT ON const_len_bug FOR EACH ROW BEGIN
+ set NEW.str_const = 'bar';
+ set NEW.result2 = check_const_len(NEW.str_const);
+END |
+
+CREATE PROCEDURE check_const_len_sp (IN str_const VARCHAR(4000))
+BEGIN
+DECLARE result VARCHAR(4000);
+SET result = check_const_len(str_const);
+insert into const_len_bug values(str_const, result, "");
+END |
+DELIMITER ;|
+
+--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
+eval CREATE FUNCTION check_const_len RETURNS string SONAME "$UDF_EXAMPLE_LIB";
+
+CALL check_const_len_sp("foo");
+
+SELECT * from const_len_bug;
+
+DROP FUNCTION check_const_len;
+DROP PROCEDURE check_const_len_sp;
+DROP TRIGGER check_const_len_trigger;
+DROP TABLE const_len_bug;
+

 --echo End of 5.0 tests.
diff -Nrup a/sql/item_func.cc b/sql/item_func.cc

--- a/sql/item_func.cc	2007-08-02 05:51:00 -04:00

+++ b/sql/item_func.cc 2007-09-05 15:06:06 -04:00
@@ -2924,7 +2924,8 @@ udf_handler::fix_fields(THD *thd, Item_r String *res= arguments[i]->val_str(&buffers[i]); if (arguments[i]->null_value) continue; - f_args.args[i]= (char*) res->ptr();
+ f_args.args[i]= (char*) res->c_ptr();
+ f_args.lengths[i]= res->length();
break; } case INT_RESULT: diff -Nrup a/sql/udf_example.c b/sql/udf_example.c --- a/sql/udf_example.c 2007-05-31 08:22:19 -04:00
+++ b/sql/udf_example.c 2007-09-05 15:06:07 -04:00
@@ -1106,4 +1106,39 @@ char * is_const(UDF_INIT *initid, UDF_AR  }    

+
+my_bool check_const_len_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
+{
+ if (args->arg_count != 1)
+ {
+ strmov(message, "CHECK_CONST_LEN accepts only one argument");
+ return 1;
+ }
+ if (args->args[0] == 0)
+ {
+ initid->ptr= (char*)"Not constant";
+ }
+ else if(strlen(args->args[0]) == args->lengths[0])
+ {
+ initid->ptr= (char*)"Correct length";
+ }
+ else
+ {
+ initid->ptr= (char*)"Wrong length";
+ }
+ initid->max_length = 100;
+ return 0;
+}
+
+char * check_const_len(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)),
+ char *result, unsigned long *length,
+ char *is_null, char *error __attribute__((unused)))
+{
+ strmov(result, initid->ptr);
+ *length= strlen(result);
+ *is_null= 0;
+ return result;
+}
+
+

 #endif /* HAVE_DLOPEN */
diff -Nrup a/sql/udf_example.def b/sql/udf_example.def

--- a/sql/udf_example.def	2007-02-22 09:59:55 -05:00

+++ b/sql/udf_example.def 2007-09-05 15:06:07 -04:00
@@ -23,3 +23,5 @@ EXPORTS
   avgcost
   is_const
   is_const_init
+ check_const_len
+ check_const_len_init
-- 
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 Sep 5 15:06:49 2007

This archive was generated by hypermail 2.1.8 : Sun Oct 07 2007 - 09:09:05 EDT


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