Loading mysql-test/r/udf.result +24 −0 Original line number Diff line number Diff line Loading @@ -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. mysql-test/t/udf.test +36 −0 Original line number Diff line number Diff line Loading @@ -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. sql/item_func.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2924,7 +2924,8 @@ udf_handler::fix_fields(THD *thd, Item_result_field *func, 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: Loading sql/udf_example.c +35 −0 Original line number Diff line number Diff line Loading @@ -1106,4 +1106,39 @@ char * is_const(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)), } 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 */ sql/udf_example.def +2 −0 Original line number Diff line number Diff line Loading @@ -23,3 +23,5 @@ EXPORTS avgcost is_const is_const_init check_const_len check_const_len_init Loading
mysql-test/r/udf.result +24 −0 Original line number Diff line number Diff line Loading @@ -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.
mysql-test/t/udf.test +36 −0 Original line number Diff line number Diff line Loading @@ -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.
sql/item_func.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2924,7 +2924,8 @@ udf_handler::fix_fields(THD *thd, Item_result_field *func, 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: Loading
sql/udf_example.c +35 −0 Original line number Diff line number Diff line Loading @@ -1106,4 +1106,39 @@ char * is_const(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)), } 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 */
sql/udf_example.def +2 −0 Original line number Diff line number Diff line Loading @@ -23,3 +23,5 @@ EXPORTS avgcost is_const is_const_init check_const_len check_const_len_init