The definition for the my_plus example.
Because this UDF needs no initialization or shutdown function, those values within the descriptor structure are set to 0. The descriptor function name matches the EXTERNAL NAME used in the declaration. The evaluate method does not check the data type for arguments, because they are declared as INT.
#include "extfnapiv3.h" #include <stdlib.h> // A simple deterministic scalar UDF that just adds // two integer arguments and then returns the result. // // Corresponding SQL declaration: // // CREATE FUNCTION my_plus(IN arg1 INT, IN arg2 INT) // RETURNS INT // DETERMINISTIC // IGNORE NULL VALUES // EXTERNAL NAME 'my_plus@libudfex' // #if defined __cplusplus extern "C" { #endif static void my_plus_evaluate(a_v3_extfn_scalar_context *cntxt, void *arg_handle) { an_extfn_value arg; an_extfn_value outval; a_sql_int32 arg1, arg2, result; // Get first argument (void) cntxt->get_value( arg_handle, 1, &arg ); if (arg.data == NULL) { return; } arg1 = *((a_sql_int32 *)arg.data); // Get second argument (void) cntxt->get_value( arg_handle, 2, &arg ); if (arg.data == NULL) { return; } arg2 = *((a_sql_int32 *)arg.data); // Set the result value outval.type = DT_INT; outval.piece_len = sizeof(a_sql_int32); result = arg1 + arg2; outval.data = &result; cntxt->set_value( arg_handle, &outval, 0 ); } static a_v3_extfn_scalar my_plus_descriptor = { 0, 0, &my_plus_evaluate, 0, // Reserved - initialize to NULL 0, // Reserved - initialize to NULL 0, // Reserved - initialize to NULL 0, // Reserved - initialize to NULL 0, // Reserved - initialize to NULL NULL // _for_server_internal_use }; a_v3_extfn_scalar *my_plus() { return &my_plus_descriptor; } #if defined __cplusplus } #endif