2011-09-10 53 views
0

這是我第一次嘗試爲mysql創建一個udf。該文檔聲明my_func_init在執行主函數之前被調用,但在我的環境中,這似乎不會發生。my_udf_init不叫

long long charmatch(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) 
{ 
    return 42; 
} 

my_bool charmatch_init(UDF_INIT *initid, UDF_ARGS *args, char *message) 
{ 
    if (args->arg_count != 2) 
    { 
     strncpy(message, "charmatch() requires two arguments", 34); 
     return EXIT_FAILURE; 
     // was return EXIT_SUCCESS; 
    } 

    if(args->arg_type[0] != STRING_RESULT) 
    { 
     strncpy(message, "argument 1 must be a string", 27); 
     return EXIT_FAILURE; 
     // was return EXIT_SUCCESS; 
    } 

    if(args->arg_type[0] != STRING_RESULT) 
    { 
     strncpy(message, "argument 2 must be a string", 27); 
     return EXIT_FAILURE; 
     // was return EXIT_SUCCESS; 
    } 

    return EXIT_SUCCESS; 
} 

正如你所看到的,我正在檢查是否有兩個參數。理論上SELECT CHARMATCH()應該返回一條消息,說我必須設置兩個參數,但它不是:它返回42.

爲什麼它不返回消息?

編輯似乎問題是在我的返回值爲錯誤是0而不是1.我修正了它,現在調用SELECT CHARMATCH()與錯誤數量的參數返回一個空集。爲什麼沒有顯示錯誤?

回答

1

你總是在charmatch_init()返回EXIT_SUCCESS,但

「初始化函數應該返回0,如果沒有錯誤發生,否則爲1。如果出現錯誤,xxx_init()應該存儲空值終止的錯誤消息中的消息參數。「

http://dev.mysql.com/doc/refman/5.0/en/udf-return-values.html

我想這就是爲什麼你的錯誤消息被忽略。

+0

謝謝,那就是問題所在。我相應地更改了返回值,但不顯示錯誤消息。 – gilden

+0

我的第二個猜測是,它與strncpy()有關,使用此函數,如果源文件中的C字符串的長度小於傳遞的數字,則目標將僅以空值終止。你可以嘗試將strncpy()的長度設置爲MYSQL_ERRMSG_SIZE嗎? – istepura

+0

謝謝,它現在有效。 – gilden