Thanks, it's working, I am so excited, thank you all
Best regards!
Meng
------------------ Original ------------------
From: "Martin Kersten"
try on your mal definition toinstead of the keyword pattern, to use the keyword command. Patterns have a different signature if i remember correctly.
On Wed, Jul 10, 2013 at 10:28 AM, integrity <357416268@qq.com> wrote:
Thanks very much for your instant reply,Lefteris!
I wrote a simple test UDF, but it doesnt work.
myudf.c #include "monetdb_config.h" #include "myudf.h"
str addint(int *ret,int *one) {
*ret=(*one)+10;
return MAL_SUCCEED;
} ------------------------------------------------------------------------------------------------------------ myudf.h /* In your own module, replace "UDF" & "udf" by your module's name */
#ifndef _SQL_MYUDF_H_ #define _SQL_MYUDF_H_ #include "sql.h" #include
/* This is required as-is (except from renaming "UDF" & "udf" as suggested * above) for all modules for correctly exporting function on Unix-like and * Windows systems. */
#ifdef WIN32 #ifndef LIBMYUDF #define myudf_export extern __declspec(dllimport) #else #define myudf_export extern __declspec(dllexport) #endif #else #define myudf_export extern #endif
/* export MAL wrapper functions */
myudf_export str addint(int *ret, int *one); #endif /* _SQL_MYUDF_H_ */ ----------------------------------------------------------------------------------------------------- myudf.mal # scalar MAL signatures module myudf;
pattern addint(one:int):int address addint comment "add one and two"; ----------------------------------------------------------------------------------------------------- 82_myudf.sql create function addint(one INT) returns int external name myudf.addint; ----------------------------------------------------------------------------------------------------- when i execute in sql: sql>select addint(76777); +---------------------+ | addint_single_value | +=====================+ | 0 | +---------------------+ 1 tuple (1.364ms) sql> sql>select addint(100); +---------------------+ | addint_single_value | +=====================+ | 0 | +---------------------+ 1 tuple (0.295ms) sql> sql> sql> sql>select addint(101); +---------------------+ | addint_single_value | +=====================+ | 0 | +---------------------+ 1 tuple (0.289ms) sql>select addint(1010000000000); overflow in conversion of 1010000000000 to int. sql> sql>select addint(1010000); +---------------------+ | addint_single_value | +=====================+ | 0 | +---------------------+ 1 tuple (1.087ms) sql>
i checked every format of above files many times, i cannot find what's wrong with my program... it seems that the parameter didn't got passed to MAL....
Thanks again for your help!
Sincerely,
Meng ------------------ Original ------------------ From: "Lefteris"
; Date: Wed, Jul 10, 2013 04:13 PM To: "Communication channel for MonetDB users" ; Subject: Re: Fw:how are user defined function arguments passed ? The str *ret is you return value as described in the MAL signature reverse(ra1:str):str
the ra1 is the name of a str variable in MAL, which is mapped to the str *src variable of the UDF. Naming here plays no role, just the types and the order of definition. Similarly, the :str end of the mal signature reverse(ra1:str):str means that it returns a str type, which in turn is mapped to the str *ret variable of the UDF signature. Naming plays no role again, just that the first variable of the signature in the udf is the return variable. Ofcourse it does not need to be always a str, it depends on the definition of the mal signature.
On Wed, Jul 10, 2013 at 9:59 AM, integrity <357416268@qq.com> wrote:
Could anyone explain this question to me, please?
I am still wondering on it....
Thanks!
Meng ------------------ Original ------------------ From: "integrity"<357416268@qq.com>; Date: Fri, Jul 5, 2013 03:42 PM To: "users-list"
; Subject: how are user defined function arguments passed ? Hi everyone,
In
http://www.monetdb.org/Documentation/Cookbooks/SQLrecipes/UserDefinedFunctio... In thesection about how to extend SQL with a simple scalar function to reverse a string
step 3. Extension starts with a definitin of the MAL signatures. See the example given, or browse through the files in monetdb5/modules/mal/*.mal to get a glimpse on how to write them. The MonetDB kernel documentation provides more details. The file contains the MAL snippet: command reverse(ra1:str):str address UDFreverse comment "Reverse a string";
step 4. The signature says that it expects a command body implementation under the name UDFreverse, shown below. The C-signature is a direct mapping, where arguments are passed by reference and the return value(s) references are the first in the arguments list. The body should return a (malloced) string to denote an exception being raised or MAL_SUCCEED upon access. #include "udf.h"
static str reverse(const char *src) { size_t len; str ret, new;
/* The scalar function returns the new space */ len = strlen(src); ret = new = GDKmalloc(len + 1); if (new == NULL) return NULL; new[len] = 0; while (len > 0) *new++ = src[--len]; return ret; }
str UDFreverse(str *ret, str *src) { if (*src == 0 || strcmp(*src, str_nil) == 0) *ret = GDKstrdup(str_nil); else *ret = reverse(*src); return MAL_SUCCEED; }
I don't know why the argument name of "command reverse(ra1:str):str" different from function definition UDFreverse(str *ret, str *src)?
how does ret come from? is it according to the naming rules that the first argument is the result, must it be a string type?
Thanks!
Meng
_______________________________________________ users-list mailing list users-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/users-list .
_______________________________________________ users-list mailing list users-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/users-list .