473,471 Members | 1,814 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Problem with a UDF

Hello,

I've been going through the DB2 application development manuals and
have no idea what I'm doing wrong with my UDF.

Basically, I created a C++ library that compares 2 strings and returns
their similarity as a double. I wanted to use this function inside DB2
so I created the following code:

similarity.cpp ---
#include "mcwpa.h"
#include <sqludf.h>

extern "C"
SQL_API_RC SQL_API_FN similarity ( SQLUDF_VARCHAR *in1,
SQLUDF_VARCHAR *in2,
SQLUDF_DOUBLE *sim,
SQLUDF_NULLIND *in1NullInd,
SQLUDF_NULLIND *in2NullInd,
SQLUDF_NULLIND *simNullInd,
SQLUDF_TRAIL_ARGS )
{
MCWPA algorithm(in1, in2);

*sim = algorithm.sim();

return 0;
}
--- end similarity.cpp

I compiled this into a shared object called libdb2_sim.so:

command output ---
truth@tiamat2:~/mcwpa/src> nm libdb2_sim.so
000042c0 d DW.ref.__gxx_personality_v0
0000480c A _DYNAMIC
00004904 A _GLOBAL_OFFSET_TABLE_
00002b8c t _GLOBAL__I__ZN5MCWPAC2EPKcS1_
w _Jv_RegisterClasses
U _Unwind_Resume@@GCC_3.0
00002b0e t _Z41__static_initialization_and_destruction_0ii
0000284c T _ZN5MCWPA3simEv
00001c52 T _ZN5MCWPAC1EPKcS1_
0000239a T _ZN5MCWPAC1EPKcS1_b
000019bc T _ZN5MCWPAC2EPKcS1_
00001ee8 T _ZN5MCWPAC2EPKcS1_b
00001970 W _ZN5MCWPAD1Ev
00002e8c T _ZN6Window12n_accessibleEv
00002f0a T _ZN6Window4markEv
00002f60 T _ZN6Window4nextEv
00002e80 T _ZN6Window4sizeEv
00002ed8 T _ZN6Window7patternEv
00002d52 T _ZN6WindowC1ESs
00002c24 T _ZN6WindowC2ESs
00002bec W _ZN9__gnu_cxx17__normal_iteratorIPcSsEC1ERKS1_
00002ba6 W _ZN9__gnu_cxx17__normal_iteratorIPcSsEppEi
00002be2 W _ZNK9__gnu_cxx17__normal_iteratorIPcSsEdeEv
U _ZNKSs4findEPKcj@@GLIBCPP_3.2
U _ZNKSs4findERKSsj@@GLIBCPP_3.2
U _ZNKSs4findEcj@@GLIBCPP_3.2
U _ZNKSs4sizeEv@@GLIBCPP_3.2
U _ZNKSs6lengthEv@@GLIBCPP_3.2
U _ZNKSs6substrEjj@@GLIBCPP_3.2
U _ZNSaIcEC1Ev@@GLIBCPP_3.2
U _ZNSaIcED1Ev@@GLIBCPP_3.2
U _ZNSolsEPFRSoS_E@@GLIBCPP_3.2
U _ZNSolsEi@@GLIBCPP_3.2
U _ZNSolsEj@@GLIBCPP_3.2
U _ZNSs5beginEv@@GLIBCPP_3.2
U _ZNSs5eraseEjj@@GLIBCPP_3.2
U _ZNSs7replaceEjjPKc@@GLIBCPP_3.2
U _ZNSs7replaceEjjRKSsjj@@GLIBCPP_3.2
U _ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2
U _ZNSsC1ERKSs@@GLIBCPP_3.2
U _ZNSsC1Ev@@GLIBCPP_3.2
U _ZNSsD1Ev@@GLIBCPP_3.2
U _ZNSsaSEPKc@@GLIBCPP_3.2
U _ZNSsaSERKSs@@GLIBCPP_3.2
U _ZNSsaSEc@@GLIBCPP_3.2
U _ZNSspLEc@@GLIBCPP_3.2
00003210 V _ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pb ack_sizeE
00003214 V _ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pb ack_sizeE
U _ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2
U _ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2
00002c1c W _ZNSt8iteratorISt26random_access_iterator_tagciPcR cEC2Ev
U _ZSt4cout@@GLIBCPP_3.2
U
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT _T0_ES6_@@GLIBCPP_3.2
000049f8 b _ZSt8__ioinit
U
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES 5_PKc@@GLIBCPP_3.2
U _ZdlPv@@GLIBCPP_3.2
U _Znwj@@GLIBCPP_3.2
000048f4 d __CTOR_END__
000048ec d __CTOR_LIST__
000048fc d __DTOR_END__
000048f8 d __DTOR_LIST__
00004660 r __FRAME_END__
00004900 d __JCR_END__
00004900 d __JCR_LIST__
000049f4 A __bss_start
U __cxa_atexit@@GLIBC_2.1.3
U __cxa_begin_catch@@CXXABI_1.2
U __cxa_end_catch@@CXXABI_1.2
w __cxa_finalize@@GLIBC_2.1.3
000031b0 t __do_global_ctors_aux
000016b0 t __do_global_dtors_aux
000042b8 d __dso_handle
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.2
00002b62 t __tcf_0
000049f4 A _edata
000049fc A _end
000031e4 T _fini
00001320 T _init
00001680 t call_gmon_start
000049f4 b completed.1
00001720 t frame_dummy
000042bc d p.0
U pow@@GLIBC_2.0
000017ea T similarity
U sqrt@@GLIBC_2.0
U strlen@@GLIBC_2.0
U toupper@@GLIBC_2.0
--- end command output

I have a DB2 instance running at /u01/mercuryd, and placed the file in
that directory. My fenced user "mdfenc" has read access to this
directory. I also created a symlink:

lrwxrwxrwx 1 mercuryd merciadm 27 2005-08-19 15:02
/u01/mercuryd/sqllib/function/libdb2_sim -> /u01/mercuryd/libdb2_sim.so

I then registered my UDF with the following command:
db2 "create function similarity (v1 VARCHAR(255), v2 VARCHAR(255))
returns DOUBLE EXTERNAL NAME 'libdb2_sim!similarity' LANGUAGE C
PARAMETER STYLE SQL DETERMINISTIC FENCED THREADSAFE RETURNS NULL ON
NULL INPUT NO SQL "
DB20000I The SQL command completed successfully.
Now my problem. Executing this SQL results in error, and I don't know
why:
truth@tiamat2:~/mcwpa/src> db2 "select clients.clinum,
clients.cliname1, ofac.name, similarity(varchar(clients.cliname1, 255),
varchar(ofac.name,255)) as sim from clients, ofac"
SQL0440N No authorized routine named "SIMILARITY" of type "FUNCTION"
having
compatible arguments was found. SQLSTATE=42884

truth@tiamat2:~/mcwpa/src> db2 describe table clients

Column Type Type
name schema name Length
Scale Nulls
------------------------------ --------- ------------------ --------
----- ------
CLINUM SYSIBM CHARACTER 12
0 Yes
CLIREPNUM SYSIBM CHARACTER 10
0 Yes
CLINAME1 SYSIBM CHARACTER 30
0 Yes
....

truth@tiamat2:~/mcwpa/src> db2 describe table ofac

Column Type Type
name schema name Length
Scale Nulls
------------------------------ --------- ------------------ --------
----- ------
ID SYSIBM BIGINT 8
0 No
NAME SYSIBM VARCHAR 255
0 No
....

I've also tried the SQL without converting the types to VARCHAR (the
manual stated that everything would be promoted to VARCHAR
automatically) with the same results.

Does anybody know what is happening?

Thanks,

Tom

Nov 12 '05 #1
1 1993
Snick wrote:
Hello,

I've been going through the DB2 application development manuals and
have no idea what I'm doing wrong with my UDF.

Basically, I created a C++ library that compares 2 strings and returns
their similarity as a double. I wanted to use this function inside DB2
so I created the following code:

similarity.cpp ---
#include "mcwpa.h"
#include <sqludf.h>

extern "C"
SQL_API_RC SQL_API_FN similarity ( SQLUDF_VARCHAR *in1,
SQLUDF_VARCHAR *in2,
SQLUDF_DOUBLE *sim,
SQLUDF_NULLIND *in1NullInd,
SQLUDF_NULLIND *in2NullInd,
SQLUDF_NULLIND *simNullInd,
SQLUDF_TRAIL_ARGS )
{
MCWPA algorithm(in1, in2);
You don't handle errors here, do you?
*sim = algorithm.sim();
You also might want to set the output null indicator here:

*simNullInd = 0;
return 0;
}
--- end similarity.cpp

I compiled this into a shared object called libdb2_sim.so:

command output ---
truth@tiamat2:~/mcwpa/src> nm libdb2_sim.so [...] --- end command output

I have a DB2 instance running at /u01/mercuryd, and placed the file in
that directory. My fenced user "mdfenc" has read access to this
directory. I also created a symlink:

lrwxrwxrwx 1 mercuryd merciadm 27 2005-08-19 15:02
/u01/mercuryd/sqllib/function/libdb2_sim -> /u01/mercuryd/libdb2_sim.so
So the lib is accessible from the sqllib/function/ directory - that's good.
I then registered my UDF with the following command:
db2 "create function similarity (v1 VARCHAR(255), v2 VARCHAR(255))
returns DOUBLE EXTERNAL NAME 'libdb2_sim!similarity' LANGUAGE C
PARAMETER STYLE SQL DETERMINISTIC FENCED THREADSAFE RETURNS NULL ON
NULL INPUT NO SQL "
DB20000I The SQL command completed successfully.
Now my problem. Executing this SQL results in error, and I don't know
why:
truth@tiamat2:~/mcwpa/src> db2 "select clients.clinum,
clients.cliname1, ofac.name, similarity(varchar(clients.cliname1, 255),
varchar(ofac.name,255)) as sim from clients, ofac"
SQL0440N No authorized routine named "SIMILARITY" of type "FUNCTION"
having
compatible arguments was found. SQLSTATE=42884
Do you execute the SELECT statement as the same user who also run the CREATE
FUNCTION statement? I have some doubts there because you said your
instance is named "mercuryd" and the user running the SELECT is named
"truth".

You have to remember that each object in DB2 (tables, triggers, procedures,
functions, ...) is always in a schema. (A schema is something like a
namespace.) Once you connected to a database, you can query the CURRENT
SCHEMA special register to see what the current schema will be for objects
that are created without an explicit schema name. So you might want to
check the schema name of your function:

SELECT routineschema FROM syscat.routines WHERE routinename = 'SIMILARITY'

Once you know that, you can either qualify your function name in the SELECT
statement with the schema name:

SELECT clients.clinum, clients.cliname1, ofac.name,
<schema>.similarity(clients.cliname1, ofac.name) AS sim
FROM clients, ofac

or you set the list of schemas that will be searched by DB2 to find an
appropriate function. Then you can call the function by its unqualified
name. This list is in the CURRENT FUNCTION PATH special register:

SET CURRENT FUNCTION PATH = CURRENT FUNCTION PATH, <schema>

SELECT clients.clinum, clients.cliname1, ofac.name,
similarity(clients.cliname1, ofac.name) AS sim
FROM clients, ofac

Personally, I always prefer the first appreach because it avoids
misunderstandings and you can't run into trouble if the user changes
his/her function path somewhere else.
truth@tiamat2:~/mcwpa/src> db2 describe table clients

Column Type Type
name schema name Length
Scale Nulls
------------------------------ --------- ------------------ --------
----- ------
CLINUM SYSIBM CHARACTER 12
0 Yes
CLIREPNUM SYSIBM CHARACTER 10
0 Yes
CLINAME1 SYSIBM CHARACTER 30
0 Yes
...

truth@tiamat2:~/mcwpa/src> db2 describe table ofac

Column Type Type
name schema name Length
Scale Nulls
------------------------------ --------- ------------------ --------
----- ------
ID SYSIBM BIGINT 8
0 No
NAME SYSIBM VARCHAR 255
0 No
...

I've also tried the SQL without converting the types to VARCHAR (the
manual stated that everything would be promoted to VARCHAR
automatically) with the same results.


Right, you shouldn't need the casts. I would leave them out because it
actually makes the query harder to understand.

--
Knut Stolze
Information Integration Development
IBM Germany / University of Jena
Nov 12 '05 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

11
by: Kostatus | last post by:
I have a virtual function in a base class, which is then overwritten by a function of the same name in a publically derived class. When I call the function using a pointer to the derived class...
117
by: Peter Olcott | last post by:
www.halting-problem.com
18
by: Ian Stanley | last post by:
Hi, Continuing my strcat segmentation fault posting- I have a problem which occurs when appending two sting literals using strcat. I have tried to fix it by writing my own function that does the...
28
by: Jon Davis | last post by:
If I have a class with a virtual method, and a child class that overrides the virtual method, and then I create an instance of the child class AS A base class... BaseClass bc = new ChildClass();...
6
by: Ammar | last post by:
Dear All, I'm facing a small problem. I have a portal web site, that contains articles, for each article, the end user can send a comment about the article. The problem is: I the comment length...
16
by: Dany | last post by:
Our web service was working fine until we installed .net Framework 1.1 service pack 1. Uninstalling SP1 is not an option because our largest customer says service packs marked as "critical" by...
2
by: Mike Collins | last post by:
I cannot get the correct drop down list value from a drop down I have on my web form. I get the initial value that was loaded in the list. It was asked by someone else what the autopostback was...
0
by: =?Utf-8?B?am8uZWw=?= | last post by:
Hello All, I am developing an Input Methop (IM) for PocketPC / Windows Mobile (PPC/WM). On some devices the IM will not start. The IM appears in the IM-List but when it is selected from the...
1
by: sherifbk | last post by:
Problem description ============== - I have 4 clients and 1 server (SQL server) - 3 clients are Monitoring console 1 client is operation console - Monitoring console collects some data from...
9
by: AceKnocks | last post by:
I am working on a framework design problem in which I have to design a C++ based framework capable of solving three puzzles for now but actually it should work with a general puzzle of any kind and I...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
1
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.