The user state of a C UDR provides the following information about routine arguments:
Table 61 lists the DataBlade API accessor functions that obtain and set information about routine arguments in an MI_FPARAM structure.
With the MI_FPARAM structure, you can write UDRs that operate over a type hierarchy, rather than on a single type. At runtime, the routine can examine the MI_FPARAM structure to determine what data types were passed to the current invocation of the routine.
The MI_FPARAM structure stores the information about each UDR argument in several parallel arrays.
| Argument Array | Contents |
|---|---|
| Argument-type array | Each element is a pointer to a type identifier (MI_TYPEID) that indicates the data type of the argument. |
| Argument-length array | Each element is the integer length of the data type for each argument. |
| Argument-scale array | Each element is the integer scale in
the fixed-point argument.
The default value of the scale elements is zero (0). Therefore, any arguments that do not have a fixed-point data type have a scale value of zero (0). |
| Argument-precision array | Each element is the integer precision
in the fixed-point or floating-point argument.
The default value of the precision elements is zero (0). Therefore, any arguments that have neither fixed-point nor floating-point data types have a precision value of zero (0). |
| Parameter-null array | Each element is either MI_FALSE or MI_TRUE:
For more information, see Handling NULL Arguments with MI_FPARAM. |
Use the appropriate MI_FPARAM accessor function in Table 61 to access the desired argument array.
All the argument arrays in the MI_FPARAM structure have zero-based indexes. To access information for the nth argument, provide an index value of n-1 to the appropriate accessor function, as Table 61 shows. Figure 45 shows how the information at index position 1 of these arrays holds the argument information for the second argument of the UDR.

The following calls to the mi_fp_argtype( ) and mi_fp_arglen( ) functions obtain the type identifier (arg_type) and length (arg_len) for the second argument from an MI_FPARAM structure that fparam_ptr identifies:
mi_integer my_func(arg0, arg1, arg2, fparam_ptr)
MI_DATUM arg0;
MI_DATUM arg1;
MI_DATUM arg2;
MI_FPARAM *fparam_ptr;
{
MI_TYPEID *arg_type;
mi_integer arg_len;
...
arg_type = mi_fp_argtype(fparam_ptr, 1);
arg_len = mi_fp_arglen(fparam_ptr, 1);
To obtain the number of arguments passed to the UDR (which is also the number of elements in the argument arrays), use the mi_fp_nargs( ) function. For the argument arrays of the MI_FPARAM structure in the preceding code fragment, mi_fp_nargs( ) would return a value of 3. The mi_fp_setnargs( ) function stores the number of routine arguments in the MI_FPARAM structure.
By default, C UDRs do not handle SQL NULL values. A UDR is not executed if any of its arguments is NULL; the routine automatically returns a NULL value. If you want your UDR to be invoked when it receives NULL values as arguments, take the following steps:
For more information on how to register a UDR, see Registering a C UDR.
The mi_fp_argisnull( ) function obtains an mi_boolean value from an element in the null-argument array of the MI_FPARAM structure. If mi_fp_argisnull( ) returns MI_TRUE, your UDR can take the appropriate action, such as supplying a default value or exiting gracefully from the routine. The code in Figure 46 implements the add_one( ) function that returns a NULL value if the argument is NULL.
mi_integer add_one(i, fParam)
mi_integer i;
MI_FPARAM *fParam;
{
/* determine if the first argument is NULL */
if ( mi_fp_argisnull(fParam, 0) == MI_TRUE )
{
mi_db_error_raise(NULL, MI_MESSAGE,
"Addition to a NULL value is undefined.\n");
/* return an SQL NULL value */
mi_fp_setreturnisnull(fParam, 0, MI_TRUE);
/* the argument to this "return" statement is ignored by the
* database server because the previous call to the
* mi_fp_setreturnisnull( ) function has set the return value
* to NULL
*/
return 0;
}
else
return(i+1);
}The following CREATE FUNCTION statement registers a function named add_one( ) in the database:
CREATE FUNCTION add_one(i INTEGER) RETURNS INTEGER WITH (HANDLESNULLS) EXTERNAL NAME '/usr/lib/db_funcs/add.so(add_one)' LANGUAGE C;
This CREATE FUNCTION statement omits the MI_FPARAM parameter of the add_one( ) user-defined function from the definition of the SQL add_one( ) UDR.
Home | [ Top of Page | Previous Page | Next Page | Contents | Index ]