Please read error messages carefully and (try to) understand them: You define a SQL function that return a SQL typ "FLOAT", which is according to the SQL standard a 64-bit floating point type; but you (try to) implement that function using a MAL function that return type :flt, which is defined and implemented as a standard C type "float", 32-bit which is a 32-bit floating point type. Hence, your MAL function signature does not match your SQL function signature, and the SQL parser (correctly) "complains" that there is no matching MAL function signature for your C function. SQL types "FLOAT" & "DOUBLE" map to MAL type ":dbl", which is C type "double". SQL type "REAL" maps to MAL type ":flt", which is C type "float". Please consider familiarizing yourself with standard C & SQL types using your favorite sources of respective documentation. As for the MonetDB type system, please see https://www.monetdb.org/wiki/MonetDB_type_system For detailed documentation and examples how to extend MonetDB/SQL with user-defined functions implemented in C, please see code & documentation at https://dev.monetdb.org/hg/MonetDB/file/tip/sql/backends/monet5/UDF https://www.monetdb.org/Documentation/Cookbooks/SQLrecipes/UserDefinedFuncti... Best, Stefan PS: With your approach of representing bits a digits or charaters "0" & "1", i.e., using a whole byte for each bit, you should not expect to be able to achieve any performance (or scalability) that matches an implementation that represents each bit as a bit (e.g., packed into a 1-/2-/4-/8-/16-byte integer type). ----- On Mar 22, 2016, at 5:40 PM, Shmagi Kavtaradze kavtaradze.s@gmail.com wrote:
But how to pass the cell to the C function in order to convert it to character array for my function? I fixed that and now receive :
sql> select BitAnd(101231231, 10000000); TypeException:user.s4_1[6]:'udf.bitand' undefined in: X_13:dbl := udf.bitand(X_6:str,X_12:str); program contains errors
I am new to C and no idea how I can fix this error.
On Tue, Mar 22, 2016 at 5:36 PM, Stefan Manegold < Stefan.Manegold@cwi.nl > wrote:
the '[]' in " create function BitAnd(Cell1[] char, Cell2[] char) returns float external name udf.BitAnd; " are not valid SQL syntax.
----- On Mar 22, 2016, at 5:20 PM, Shmagi Kavtaradze kavtaradze.s@gmail.com wrote:
Thanks for answer. I used:
command BitAnd(Cell1:str,Cell2:str):flt address UDFBitAnd comment "Compare bag of words";
and it did not give me any errors, but when I launch monetdb "mclient -u monetdb -d voc", I get this error:
ParseException:SQLparser:!42000!syntax error, unexpected '[' in: "-- This Source Code Form is subject to the terms of the Mozilla Public -- Licens"
I looked into license.txt and README, but there are no "[" there. Any ideas?
On Tue, Mar 22, 2016 at 5:08 PM, Stefan Manegold < Stefan.Manegold@cwi.nl > wrote:
As the error message says, instead of "chr", the MAL parser expects a valid MAL type.
As opposed to the (wrong) documentation at https://monetdb.org/Documentation/Manuals/MonetDB/MAL/Types , MAL (and all of MonetDB for that matter) does not support any "chr" (or single-byte single-character) type.
See also (new) bug report #3959: https://www.monetdb.org/bugzilla/show_bug.cgi?id=3959
SQL type "CHAR[ACTER] '(' length ')'" (just like SQL types "VARCHAR '(' length ')' | CHARACTER VARYING '(' length ')'" and "TEXT | STRING | CLOB | CHARACTER LARGE OBJECT") all map to MAL type ":str", which in turn maps to (MonetDB) C type "str", which in turn is defined as "char *".
Hope this helps.
Stefan
----- On Mar 22, 2016, at 4:50 PM, Shmagi Kavtaradze kavtaradze.s@gmail.com wrote:
I am trying to write a C User Defined Function. It works in Neatbeans. What I want is, to take value from cells, insert them in text or char array and compare each corresponding array position to each other. As values I will have "1"s and "0s". E.g "101010100011". THe code I wrote in udf.c:
/* Comparing bag of words */
char BitAnd(char Cell1[], char Cell2[]) { Cell1[10000]; Cell2[10000]; int counter; float result; int strlen = sizeof(Cell1)/sizeof(Cell1[0])-1; int i; for (i=0; i < strlen; i++) { if (Cell1[i] == Cell2[i]) { counter++; } }
result = (float)counter / strlen;
}
/* MAL wrapper */ char UDFBitAnd(char Cell1[], char Cell2[]) { /* assert calling sanity */ assert(Cell1[] != NULL && Cell2[] != NULL); return MAL_SUCCEED;
}
In udf.mal I have:
command BitAnd(Cell1:chr,Cell2:chr):flt address UDFBitAnd comment "Compare bag of words";
In 80_udf.sql:
-- Comparing bag of words create function BitAnd(Cell1[] char, Cell2[] char) returns float external name udf.BitAnd;
I compiled Monetdb, but when I try to connect with "monetdb" to db it gives me error. In the log file I found:
MSG voc[18857]: !SyntaxException:parseError:command BitAnd(Cell1:chr,Cell2:chr):flt MSG voc[18857]: !SyntaxException:parseError: ^Type identifier expected MSG voc[18857]: !SyntaxException:parseError:command BitAnd(Cell1:chr,Cell2:chr):flt MSG voc[18857]: !SyntaxException:parseError: ^',' expected MSG merovingian[8780]: database 'voc' (18857) has exited with exit status 0 MSG merovingian[8780]: database 'voc' has shut down ERR merovingian[8780]: client error: database 'voc' started up, but failed to open up a communication channel
_______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
-- | Stefan.Manegold@CWI.nl | DB Architectures (DA) | | www.CWI.nl/~manegold/ | Science Park 123 (L321) | | +31 (0)20 592-4212 | 1098 XG Amsterdam (NL) | _______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
-- | Stefan.Manegold@CWI.nl | DB Architectures (DA) | | www.CWI.nl/~manegold/ | Science Park 123 (L321) | | +31 (0)20 592-4212 | 1098 XG Amsterdam (NL) | _______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
-- | Stefan.Manegold@CWI.nl | DB Architectures (DA) | | www.CWI.nl/~manegold/ | Science Park 123 (L321) | | +31 (0)20 592-4212 | 1098 XG Amsterdam (NL) |