Hey Renato,
Apparently the arguments start with 2 (i.e. arg2, arg3, etc…). The unnamed outputs are named output0, output1, output2… (This is a result of an off-by-one error in the naming and it never being tested in pure MAL). The following code works for me:
g:= bat.new(:int);
bat.append(g,5);
(r:bat[:int],s:bat[:int]) := batcapi.eval(nil:ptr, false:bit, "{\n#include
On 4 Nov 2018, at 18:16, Renato Marroquín Mogrovejo
wrote: Hey Mark,
Thanks for the reply, however I am still having trouble with it. So I am trying to replicate the example of creating C UDF from [https://www.monetdb.org/blog/JIT_C_C%252B%252B_UDFs_in_MonetDB https://www.monetdb.org/blog/JIT_C_C%252B%252B_UDFs_in_MonetDB], the one that returns a table. My MAL function is as follows:
function user.s8_1():void; X_5:int := sql.mvc(); (X_8:bat[:int], X_12:bat[:dbl]) := capi.eval(nil:ptr, false:bit, "{\n#include
\n size_t j;\n size_t count = arg1.data[0];\n\n i->initialize(i, count);\n d->initialize(d, count);\n for(j = 0; j < count; j++) {\n i->data[j] = j;\n d->data[j] = round(j > 0 ? 42.0 / j : 42.0);\n }\n};", 5); barrier X_87:bit := language.dataflow(); X_14:bat[:str] := bat.new(nil:str); X_20:bat[:int] := bat.new(nil:int); X_18:bat[:int] := bat.new(nil:int); X_17:bat[:str] := bat.new(nil:str); X_16:bat[:str] := bat.new(nil:str); X_21:bat[:str] := bat.append(X_14, ".L2"); X_23:bat[:str] := bat.append(X_16, "i"); X_25:bat[:str] := bat.append(X_17, "int"); X_27:bat[:int] := bat.append(X_18, 32); X_29:bat[:int] := bat.append(X_20, 0); X_31:bat[:str] := bat.append(X_21, ".L2"); X_32:bat[:str] := bat.append(X_23, "d"); X_34:bat[:str] := bat.append(X_25, "double"); X_36:bat[:int] := bat.append(X_27, 53); X_38:bat[:int] := bat.append(X_29, 0); exit X_87:bit; sql.resultSet(X_31, X_32, X_34, X_36, X_38, X_8, X_12); end user.s8_1; But I still get: error: ‘arg1’ undeclared (first use in this function) Other related question is regarding output parameters names? In the C code, they are named <i> and <d> and this also throws an undeclared error. Btw, is there a way to get the UDF definition, i.e., the pointer as expected? I maybe that would be an easier solution? Thanks again!
Best,
Renato M.
El dom., 4 nov. 2018 a las 15:42, Mark Raasveldt (
mailto:m.raasveldt@cwi.nl>) escribió: Hey Renato, Just like the pyapi and rapi functions, the first argument is a pointer to the SQL function definition. This pointer is used to retrieve the argument names that were defined in the SQL layer. On the MAL layer you can simply pass the argument "nil:ptr”. This will result in the variables being called “arg1”, “arg2”, etc… See the pyapi MAL tests for more information (sql/backends/monet5/UDF/pyapi/Tests/*.malC).
Regards,
Mark
On 4 Nov 2018, at 11:53, Renato Marroquín Mogrovejo
mailto:renatoj.marroquin@gmail.com> wrote: Hi all,
I am trying to use the following patten from MAL[1]
pattern eval(fptr:ptr,cpp:bit,expr:str,arg:any...):any...
However, I am not sure how I should create the first parameter fptr:ptr from MAL. I am just trying to be able to call a C-UDF from MAL. From capi.c, it would seem that it is the client's context but I don't know how to get a handle of that. Any pointers are highly appreciated.
Thanks!
Renato M. [1] https://github.com/MonetDB/MonetDB/blob/2310e49a349ebcb8ff5b5c585928c8f4bd19... https://github.com/MonetDB/MonetDB/blob/2310e49a349ebcb8ff5b5c585928c8f4bd19..._______________________________________________ users-list mailing list users-list@monetdb.org mailto:users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list https://www.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org mailto:users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list https://www.monetdb.org/mailman/listinfo/users-list _______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list