/*
 * The contents of this file are subject to the Interbase Public
 * License Version 1.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy
 * of the License at http://www.Inprise.com/IPL.html
 *
 * Software distributed under the License is distributed on an
 * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code was created by Inprise Corporation
 * and its predecessors. Portions created by Inprise Corporation are
 * Copyright (C) Inprise Corporation.
 *
 * All Rights Reserved.
 * Contributor(s): ______________________________________.
 * Revision 1.2  2000/11/28 06:47:52  fsg
 * Changed declaration of ascii_char in ib_udf.sql
 * to get correct result as proposed by Claudio Valderrama
 * 2001.5.19 Claudio Valderrama, add the declaration of alternative
 * substrlen function to handle string,start,length instead.
 * 2004.9.1 Claudio Valderrama, changed some UDF's to be able to detect NULL
 * and renamed the resulting file as ib_udf2.sql.
 *
 */
/*****************************************
 *
 *	a b s
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the absolute value of a 
 * 	number.  
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION abs 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_abs' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a c o s
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arccosine of a number 
 *	between -1 and 1, if the number is
 *	out of bounds it returns NaN, as handled
 *	by the _matherr routine.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION acos 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_acos' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a s c i i _ c h a r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the ASCII character corresponding
 *	with the value passed in.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ascii_char
	INTEGER NULL
	RETURNS CSTRING(1) FREE_IT
	ENTRY_POINT 'IB_UDF_ascii_char' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a s c i i _ v a l
 *
 *****************************************
 *
 * Functional description:
 *	Returns the ascii value of the character
 * 	passed in.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ascii_val
	CHAR(1)
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_ascii_val' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a s i n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arcsin of a number between
 *	-1 and 1, if the number is out of
 *	range NaN is returned.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION asin 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_asin' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a t a n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arctangent of a number.
 *	
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION atan 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_atan' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	a t a n 2
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the arctangent of the
 *	first param / the second param.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION atan2 
	DOUBLE PRECISION, DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_atan2' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	b i n _ a n d
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary AND 
 *	operation performed on the two numbers.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION bin_and 
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_and' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	b i n _ o r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary OR 
 *	operation performed on the two numbers.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION bin_or 
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_or' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	b i n _ x o r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary XOR 
 *	operation performed on the two numbers.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION bin_xor 
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_xor' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	c e i l i n g
 *
 *****************************************
 *
 * Functional description:
 *	Returns a double value representing 
 *	the smallest integer that is greater 
 *	than or equal to the input value.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ceiling 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_ceiling' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	c o s
 *
 *****************************************
 *
 * Functional description:
 *	The cos function returns the cosine 
 *	of x. If x is greater than or equal 
 *	to 263, or less than or equal to -263, 
 *	a loss of significance in the result 
 *	of a call to cos occurs, in which case 
 *	the function generates a _TLOSS error 
 *	and returns an indefinite (same as a 
 *	quiet NaN).
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION cos 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cos' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	c o s h
 *
 *****************************************
 *
 * Functional description:
 *	The cosh function returns the hyperbolic cosine 
 *	of x. If x is greater than or equal 
 *	to 263, or less than or equal to -263, 
 *	a loss of significance in the result 
 *	of a call to cos occurs, in which case 
 *	the function generates a _TLOSS error 
 *	and returns an indefinite (same as a 
 *	quiet NaN).
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION cosh 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cosh' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	c o t
 *
 *****************************************
 *
 * Functional description:
 *	Returns 1 over the tangent of the
 *	input parameter.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION cot 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cot' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	d i v
 *
 *****************************************
 *
 * Functional description:
 *	Returns the quotient part of the division
 *	of the two input parameters.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION div 
	INTEGER, INTEGER
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_div' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	f l o o r
 *
 *****************************************
 *
 * Functional description:
 * 	Returns a floating-point value 
 * 	representing the largest integer that 
 *	is less than or equal to x	
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION floor 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_floor' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	f r a c
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the fractional part of the argument.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION frac
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_frac' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the natural log of a number.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ln 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_ln' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l o g
 *
 *****************************************
 *
 * Functional description:
 *	log (x,y) returns the logarithm 
 *	base x of y.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION log 
	DOUBLE PRECISION, DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_log' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l o g 1 0
 *
 *****************************************
 *
 * Functional description:
 *	Returns the logarithm base 10 of the
 *	input parameter.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION log10 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_log10' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l o w e r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the input string into lower 
 *	case characters.  Note: This function
 *	will not work with international and 
 *	non-ascii characters.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION "LOWER"
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l p a d
 *
 *****************************************
 *
 * Functional description:
 *	Appends the given character to beginning
 *	of the input string until length of the result
 *	string becomes equal to the given number.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION lpad 
	CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l t r i m
 *
 *****************************************
 *
 * Functional description:
 *	Removes leading spaces from the input
 *	string.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ltrim 
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	m o d
 *
 *****************************************
 *
 * Functional description:
 *	Returns the remainder part of the 
 *	division of the two input parameters.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION mod 
	INTEGER, INTEGER
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_mod' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	p i
 *
 *****************************************
 *
 * Functional description:
 *	Returns the value of pi = 3.1459...
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION pi 
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_pi' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	r a n d
 *
 *****************************************
 *
 * Functional description:
 *	Returns a random number between 0 
 *	and 1.  
 * 
 * Note: The rand() function was changed
 *  in Firebird 2.0 so that the seed value
 *  is not set by every call. This corrects
 *  a potential duplicate value problem and
 *  ensures that different values will
 *  always be returned.
 *
 *  To seed the random number generator or
 *  retain the old behaviour, use srand(). 
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION rand 
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_rand' MODULE_NAME 'ib_udf';


/*****************************************
 *
 *	r p a d
 *
 *****************************************
 *
 * Functional description:
 *	Appends the given character to end
 *	of the input string until length of the result
 *	string becomes equal to the given number.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION rpad 
	CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_rpad' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	r t r i m
 *
 *****************************************
 *
 * Functional description:
 *	Removes trailing spaces from the input
 *	string.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION rtrim 
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s i g n
 *
 *****************************************
 *
 * Functional description:
 *	Returns 1, 0, or -1 depending on whether
 * 	the input value is positive, zero or 
 *	negative, respectively.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION sign 
	DOUBLE PRECISION
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_sign' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s i n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the sine of x. If x is greater 
 *	than or equal to 263, or less than or 
 *	equal to -263, a loss of significance 
 *	in the result occurs, in which case the 
 *	function generates a _TLOSS error and 
 *	returns an indefinite (same as a quiet NaN).
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION sin 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sin' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s i n h
 *
 *****************************************
 *
 * Functional description:
 *	Returns the hyperbolic sine of x. If x is greater 
 *	than or equal to 263, or less than or 
 *	equal to -263, a loss of significance 
 *	in the result occurs, in which case the 
 *	function generates a _TLOSS error and 
 *	returns an indefinite (same as a quiet NaN).
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION sinh 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sinh' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s q r t
 *
 *****************************************
 *
 * Functional description:
 *	Returns the square root of a number.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION sqrt 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sqrt' MODULE_NAME 'ib_udf';


/*****************************************
 *
 *	s r a n d
 *
 *****************************************
 *
 * Functional description:
 *	Seeds the random number generator using
 *  the current time and returns the first
 *  pseudo-random number (between 0 and 1)
 *  in the new sequence.
 *
 * Note:
 *  Two srand() calls performed within a second
 *  will return the same value.
 * 
 *****************************************/
DECLARE EXTERNAL FUNCTION srand 
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_srand' MODULE_NAME 'ib_udf';


/*****************************************
 *
 *	s u b s t r
 *
 *****************************************
 *
 * Functional description:
 *	substr(s,m,n) returns the substring 
 *	of s which starts at position m and
 *	ending at position n.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *      Change by Claudio Valderrama: when n>length(s),
 *      the result will be the original string instead
 *      of NULL as it was originally designed.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION substr 
	CSTRING(255) NULL, SMALLINT, SMALLINT
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s u b s t r l e n
 *
 *****************************************
 *
 * Functional description:
 *	substr(s,i,l) returns the substring 
 *	of s which starts at position i and
 *	ends at position i+l-1, being l the length.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767 
 * 	characters which is the limit on an 
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION substrlen 
	CSTRING(255) NULL, SMALLINT, SMALLINT
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_substrlen' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s t r l e n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the length of a given string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION strlen 
	CSTRING(32767) CHARACTER SET NONE
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	t a n
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the tangent of x. If x is 
 *	greater than or equal to 263, or less 
 *	than or equal to -263, a loss of 
 *	significance in the result occurs, in 
 *	which case the function generates a 
 *	_TLOSS error and returns an indefinite 
 *	(same as a quiet NaN).
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION tan 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_tan' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	t a n h
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the tangent of x. If x is 
 *	greater than or equal to 263, or less 
 *	than or equal to -263, a loss of 
 *	significance in the result occurs, in 
 *	which case the function generates a 
 *	_TLOSS error and returns an indefinite 
 *	(same as a quiet NaN).
 *	
 *****************************************/
DECLARE EXTERNAL FUNCTION tanh 
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_tanh' MODULE_NAME 'ib_udf';

