Commit 9fead4bd authored by dkatz@damien-katzs-computer.local's avatar dkatz@damien-katzs-computer.local
Browse files

Merge damien-katzs-computer.local:/Users/dkatz/mysql50

into  damien-katzs-computer.local:/Users/dkatz/50_udf_const
parents f672f5dc d8e67d45
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -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.
+36 −0
Original line number Diff line number Diff line
@@ -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.
+2 −1
Original line number Diff line number Diff line
@@ -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:
+35 −0
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -23,3 +23,5 @@ EXPORTS
  avgcost
  is_const
  is_const_init
  check_const_len
  check_const_len_init