* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.72 2000/07/03 03:57:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.73 2000/07/29 03:26:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
strcat(args, "\\000");
}
values[Anum_pg_trigger_tgnargs - 1] = Int16GetDatum(nargs);
- values[Anum_pg_trigger_tgargs - 1] = PointerGetDatum(byteain(args));
+ values[Anum_pg_trigger_tgargs - 1] = DirectFunctionCall1(byteain,
+ CStringGetDatum(args));
}
else
{
values[Anum_pg_trigger_tgnargs - 1] = Int16GetDatum(0);
- values[Anum_pg_trigger_tgargs - 1] = PointerGetDatum(byteain(""));
+ values[Anum_pg_trigger_tgargs - 1] = DirectFunctionCall1(byteain,
+ CStringGetDatum(""));
}
MemSet(tgattr, 0, FUNC_MAX_ARGS * sizeof(int16));
values[Anum_pg_trigger_tgattr - 1] = PointerGetDatum(tgattr);
/* -----------------------------------------------------------------------
* formatting.c
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.19 2000/07/05 23:11:35 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.20 2000/07/29 03:26:41 tgl Exp $
*
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
x = DatumGetNumeric(DirectFunctionCall2(numeric_round,
NumericGetDatum(value),
Int32GetDatum(0)));
- numstr = orgnum = int_to_roman(numeric_int4(x));
+ numstr = orgnum =
+ int_to_roman(DatumGetInt32(DirectFunctionCall1(numeric_int4,
+ NumericGetDatum(x))));
pfree(x);
}
else
Numeric b = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
Int32GetDatum(Num.multi)));
- x = numeric_power(a, b);
- val = numeric_mul(value, x);
+ x = DatumGetNumeric(DirectFunctionCall2(numeric_power,
+ NumericGetDatum(a),
+ NumericGetDatum(b)));
+ val = DatumGetNumeric(DirectFunctionCall2(numeric_mul,
+ NumericGetDatum(value),
+ NumericGetDatum(x)));
pfree(x);
pfree(a);
pfree(b);
*
* 1998 Jan Wieck
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.32 2000/07/17 03:05:18 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.33 2000/07/29 03:26:41 tgl Exp $
*
* ----------
*/
* ----------------------------------------------------------------------
*/
-
-Numeric
-numeric_abs(Numeric num)
+Datum
+numeric_abs(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Do it the easy way directly on the packed format
res->n_sign_dscale = NUMERIC_POS | NUMERIC_DSCALE(num);
- return res;
+ PG_RETURN_NUMERIC(res);
}
-Numeric
-numeric_uminus(Numeric num)
+Datum
+numeric_uminus(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Do it the easy way directly on the packed format
res->n_sign_dscale = NUMERIC_POS | NUMERIC_DSCALE(num);
}
- return res;
+ PG_RETURN_NUMERIC(res);
}
-Numeric
-numeric_sign(Numeric num)
+Datum
+numeric_sign(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar result;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
init_var(&result);
res = make_result(&result);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Return the smallest integer greater than or equal to the argument
* ----------
*/
-Numeric
-numeric_ceil(Numeric num)
+Datum
+numeric_ceil(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar result;
- if (num == NULL)
- return NULL;
-
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
init_var(&result);
res = make_result(&result);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Return the largest integer equal to or less than the argument
* ----------
*/
-Numeric
-numeric_floor(Numeric num)
+Datum
+numeric_floor(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar result;
- if (num == NULL)
- return NULL;
-
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
init_var(&result);
res = make_result(&result);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
*
* Comparison functions
*
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
* ----------------------------------------------------------------------
*/
-int32
-numeric_cmp(Numeric num1, Numeric num2)
+Datum
+numeric_cmp(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return (int32) 0;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return (int32) 0;
+ result = 0;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2);
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
+
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
- return (int32) ((result == 0) ? 0 : ((result < 0) ? -1 : 1));
+ PG_RETURN_INT32(result);
}
-bool
-numeric_eq(Numeric num1, Numeric num2)
+Datum
+numeric_eq(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) == 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result == 0);
-}
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+ PG_RETURN_BOOL(result);
+}
-bool
-numeric_ne(Numeric num1, Numeric num2)
+Datum
+numeric_ne(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) != 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result != 0);
-}
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+ PG_RETURN_BOOL(result);
+}
-bool
-numeric_gt(Numeric num1, Numeric num2)
+Datum
+numeric_gt(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) > 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result > 0);
-}
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+ PG_RETURN_BOOL(result);
+}
-bool
-numeric_ge(Numeric num1, Numeric num2)
+Datum
+numeric_ge(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) >= 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result >= 0);
-}
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+ PG_RETURN_BOOL(result);
+}
-bool
-numeric_lt(Numeric num1, Numeric num2)
+Datum
+numeric_lt(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) < 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result < 0);
-}
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+ PG_RETURN_BOOL(result);
+}
-bool
-numeric_le(Numeric num1, Numeric num2)
+Datum
+numeric_le(PG_FUNCTION_ARGS)
{
- int result;
- NumericVar arg1;
- NumericVar arg2;
-
- if (num1 == NULL || num2 == NULL)
- return FALSE;
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
+ bool result;
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return FALSE;
+ result = false;
+ else
+ {
+ NumericVar arg1;
+ NumericVar arg2;
- init_var(&arg1);
- init_var(&arg2);
+ init_var(&arg1);
+ init_var(&arg2);
- set_var_from_num(num1, &arg1);
- set_var_from_num(num2, &arg2);
+ set_var_from_num(num1, &arg1);
+ set_var_from_num(num2, &arg2);
- result = cmp_var(&arg1, &arg2);
+ result = cmp_var(&arg1, &arg2) <= 0;
- free_var(&arg1);
- free_var(&arg2);
+ free_var(&arg1);
+ free_var(&arg2);
+ }
- return (result <= 0);
+ PG_FREE_IF_COPY(num1, 0);
+ PG_FREE_IF_COPY(num2, 1);
+
+ PG_RETURN_BOOL(result);
}
* Add two numerics
* ----------
*/
-Numeric
-numeric_add(Numeric num1, Numeric num2)
+Datum
+numeric_add(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
NumericVar result;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the values, let add_var() compute the result
free_var(&arg2);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Subtract one numeric from another
* ----------
*/
-Numeric
-numeric_sub(Numeric num1, Numeric num2)
+Datum
+numeric_sub(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
NumericVar result;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the two arguments, let sub_var() compute the
free_var(&arg2);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Calculate the product of two numerics
* ----------
*/
-Numeric
-numeric_mul(Numeric num1, Numeric num2)
+Datum
+numeric_mul(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
NumericVar result;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the arguments, let mul_var() compute the result
free_var(&arg2);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Divide one numeric into another
* ----------
*/
-Numeric
-numeric_div(Numeric num1, Numeric num2)
+Datum
+numeric_div(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
NumericVar result;
Numeric res;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the arguments
free_var(&arg2);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Calculate the modulo of two numerics
* ----------
*/
-Numeric
-numeric_mod(Numeric num1, Numeric num2)
+Datum
+numeric_mod(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
Numeric res;
NumericVar arg1;
NumericVar arg2;
NumericVar result;
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
init_var(&arg1);
init_var(&arg2);
free_var(&arg2);
free_var(&arg1);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Increment a number by one
* ----------
*/
-Numeric
-numeric_inc(Numeric num)
+Datum
+numeric_inc(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
NumericVar arg;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Compute the result and return it
free_var(&arg);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Return the smaller of two numbers
* ----------
*/
-Numeric
-numeric_smaller(Numeric num1, Numeric num2)
+Datum
+numeric_smaller(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the values, and decide which is the smaller one
free_var(&arg1);
free_var(&arg2);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Return the larger of two numbers
* ----------
*/
-Numeric
-numeric_larger(Numeric num1, Numeric num2)
+Datum
+numeric_larger(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
NumericVar arg1;
NumericVar arg2;
Numeric res;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the values, and decide which is the larger one
free_var(&arg1);
free_var(&arg2);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Compute the square root of a numeric.
* ----------
*/
-Numeric
-numeric_sqrt(Numeric num)
+Datum
+numeric_sqrt(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar arg;
NumericVar result;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Unpack the argument, determine the scales like for divide,
free_var(&result);
free_var(&arg);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Raise e to the power of x
* ----------
*/
-Numeric
-numeric_exp(Numeric num)
+Datum
+numeric_exp(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar arg;
NumericVar result;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Same procedure like for sqrt().
free_var(&result);
free_var(&arg);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Compute the natural logarithm of x
* ----------
*/
-Numeric
-numeric_ln(Numeric num)
+Datum
+numeric_ln(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
Numeric res;
NumericVar arg;
NumericVar result;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Same procedure like for sqrt()
free_var(&result);
free_var(&arg);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Compute the logarithm of x in a given base
* ----------
*/
-Numeric
-numeric_log(Numeric num1, Numeric num2)
+Datum
+numeric_log(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
Numeric res;
NumericVar arg1;
NumericVar arg2;
NumericVar result;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Initialize things and calculate scales
free_var(&arg2);
free_var(&arg1);
- return res;
+ PG_RETURN_NUMERIC(res);
}
* Raise m to the power of x
* ----------
*/
-Numeric
-numeric_power(Numeric num1, Numeric num2)
+Datum
+numeric_power(PG_FUNCTION_ARGS)
{
+ Numeric num1 = PG_GETARG_NUMERIC(0);
+ Numeric num2 = PG_GETARG_NUMERIC(1);
Numeric res;
NumericVar arg1;
NumericVar arg2;
NumericVar result;
int res_dscale;
- /* ----------
- * Handle NULL
- * ----------
- */
- if (num1 == NULL || num2 == NULL)
- return NULL;
-
/* ----------
* Handle NaN
* ----------
*/
if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2))
- return make_result(&const_nan);
+ PG_RETURN_NUMERIC(make_result(&const_nan));
/* ----------
* Initialize things and calculate scales
free_var(&arg2);
free_var(&arg1);
- return res;
+ PG_RETURN_NUMERIC(res);
}
}
-int32
-numeric_int4(Numeric num)
+Datum
+numeric_int4(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
NumericVar x;
char *str;
Datum result;
- if (num == NULL)
- return 0;
-
+ /* XXX would it be better to return NULL? */
if (NUMERIC_IS_NAN(num))
elog(ERROR, "Cannot convert NaN to int4");
result = DirectFunctionCall1(int4in, CStringGetDatum(str));
pfree(str);
- return result;
+ PG_RETURN_DATUM(result);
}
}
-int64 *
-numeric_int8(Numeric num)
+Datum
+numeric_int8(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
NumericVar x;
char *str;
Datum result;
- if (num == NULL)
- return NULL;
-
+ /* XXX would it be better to return NULL? */
if (NUMERIC_IS_NAN(num))
elog(ERROR, "Cannot convert NaN to int8");
free_var(&x);
result = DirectFunctionCall1(int8in, CStringGetDatum(str));
-
pfree(str);
- return (int64 *) (result);
+ PG_RETURN_DATUM(result);
}
}
-Numeric
-float8_numeric(float64 val)
+Datum
+float8_numeric(PG_FUNCTION_ARGS)
{
+ float8 val = PG_GETARG_FLOAT8(0);
Numeric res;
NumericVar result;
char buf[DBL_DIG + 100];
- if (val == NULL)
- return NULL;
-
- if (isnan(*val))
- return make_result(&const_nan);
+ if (isnan(val))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
- sprintf(buf, "%.*g", DBL_DIG, *val);
+ sprintf(buf, "%.*g", DBL_DIG, val);
init_var(&result);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
-float64
-numeric_float8(Numeric num)
+Datum
+numeric_float8(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
char *tmp;
float64 result;
- if (num == NULL)
- return NULL;
-
if (NUMERIC_IS_NAN(num))
- {
- result = (float64) palloc(sizeof(float64data));
- *result = NAN;
- return result;
- }
+ PG_RETURN_FLOAT8(NAN);
tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
result = float8in(tmp);
pfree(tmp);
- return result;
+ PG_RETURN_POINTER(result);
}
-Numeric
-float4_numeric(float32 val)
+Datum
+float4_numeric(PG_FUNCTION_ARGS)
{
+ float4 val = PG_GETARG_FLOAT4(0);
Numeric res;
NumericVar result;
char buf[FLT_DIG + 100];
- if (val == NULL)
- return NULL;
-
- if (isnan(*val))
- return make_result(&const_nan);
+ if (isnan(val))
+ PG_RETURN_NUMERIC(make_result(&const_nan));
- sprintf(buf, "%.*g", FLT_DIG, *val);
+ sprintf(buf, "%.*g", FLT_DIG, val);
init_var(&result);
free_var(&result);
- return res;
+ PG_RETURN_NUMERIC(res);
}
-float32
-numeric_float4(Numeric num)
+Datum
+numeric_float4(PG_FUNCTION_ARGS)
{
+ Numeric num = PG_GETARG_NUMERIC(0);
char *tmp;
float32 result;
- if (num == NULL)
- return NULL;
-
if (NUMERIC_IS_NAN(num))
- {
- result = (float32) palloc(sizeof(float32data));
- *result = NAN;
- return result;
- }
+ PG_RETURN_FLOAT4(NAN);
tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
result = float4in(tmp);
pfree(tmp);
- return result;
+ PG_RETURN_POINTER(result);
}
{
Datum *transdatums;
int ndatums;
- Numeric N,
+ Datum N,
sumX,
sumX2;
ArrayType *result;
&transdatums, &ndatums);
if (ndatums != 3)
elog(ERROR, "do_numeric_accum: expected 3-element numeric array");
- N = DatumGetNumeric(transdatums[0]);
- sumX = DatumGetNumeric(transdatums[1]);
- sumX2 = DatumGetNumeric(transdatums[2]);
-
- N = numeric_inc(N);
- sumX = numeric_add(sumX, newval);
- sumX2 = numeric_add(sumX2, numeric_mul(newval, newval));
-
- transdatums[0] = NumericGetDatum(N);
- transdatums[1] = NumericGetDatum(sumX);
- transdatums[2] = NumericGetDatum(sumX2);
+ N = transdatums[0];
+ sumX = transdatums[1];
+ sumX2 = transdatums[2];
+
+ N = DirectFunctionCall1(numeric_inc, N);
+ sumX = DirectFunctionCall2(numeric_add, sumX,
+ NumericGetDatum(newval));
+ sumX2 = DirectFunctionCall2(numeric_add, sumX2,
+ DirectFunctionCall2(numeric_mul,
+ NumericGetDatum(newval),
+ NumericGetDatum(newval)));
+
+ transdatums[0] = N;
+ transdatums[1] = sumX;
+ transdatums[2] = sumX2;
result = construct_array(transdatums, 3,
false, -1, 'i');
if (N->varlen == NUMERIC_HDRSZ)
PG_RETURN_NULL();
- PG_RETURN_NUMERIC(numeric_div(sumX, N));
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_div,
+ NumericGetDatum(sumX),
+ NumericGetDatum(N)));
}
Datum
Datum
int2_sum(PG_FUNCTION_ARGS)
{
- Numeric oldsum,
- newval;
+ Numeric oldsum;
+ Datum newval;
if (PG_ARGISNULL(0))
{
if (PG_ARGISNULL(1))
PG_RETURN_NULL(); /* still no non-null */
/* This is the first non-null input. */
- newval = DatumGetNumeric(DirectFunctionCall1(int2_numeric,
- PG_GETARG_DATUM(1)));
- PG_RETURN_NUMERIC(newval);
+ newval = DirectFunctionCall1(int2_numeric, PG_GETARG_DATUM(1));
+ PG_RETURN_DATUM(newval);
}
oldsum = PG_GETARG_NUMERIC(0);
PG_RETURN_NUMERIC(oldsum);
/* OK to do the addition. */
- newval = DatumGetNumeric(DirectFunctionCall1(int2_numeric,
- PG_GETARG_DATUM(1)));
+ newval = DirectFunctionCall1(int2_numeric, PG_GETARG_DATUM(1));
- PG_RETURN_NUMERIC(numeric_add(oldsum, newval));
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_add,
+ NumericGetDatum(oldsum), newval));
}
Datum
int4_sum(PG_FUNCTION_ARGS)
{
- Numeric oldsum,
- newval;
+ Numeric oldsum;
+ Datum newval;
if (PG_ARGISNULL(0))
{
if (PG_ARGISNULL(1))
PG_RETURN_NULL(); /* still no non-null */
/* This is the first non-null input. */
- newval = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
- PG_GETARG_DATUM(1)));
- PG_RETURN_NUMERIC(newval);
+ newval = DirectFunctionCall1(int4_numeric, PG_GETARG_DATUM(1));
+ PG_RETURN_DATUM(newval);
}
oldsum = PG_GETARG_NUMERIC(0);
PG_RETURN_NUMERIC(oldsum);
/* OK to do the addition. */
- newval = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
- PG_GETARG_DATUM(1)));
+ newval = DirectFunctionCall1(int4_numeric, PG_GETARG_DATUM(1));
- PG_RETURN_NUMERIC(numeric_add(oldsum, newval));
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_add,
+ NumericGetDatum(oldsum), newval));
}
Datum
int8_sum(PG_FUNCTION_ARGS)
{
- Numeric oldsum,
- newval;
+ Numeric oldsum;
+ Datum newval;
if (PG_ARGISNULL(0))
{
if (PG_ARGISNULL(1))
PG_RETURN_NULL(); /* still no non-null */
/* This is the first non-null input. */
- newval = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
- PG_GETARG_DATUM(1)));
- PG_RETURN_NUMERIC(newval);
+ newval = DirectFunctionCall1(int8_numeric, PG_GETARG_DATUM(1));
+ PG_RETURN_DATUM(newval);
}
oldsum = PG_GETARG_NUMERIC(0);
PG_RETURN_NUMERIC(oldsum);
/* OK to do the addition. */
- newval = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
- PG_GETARG_DATUM(1)));
+ newval = DirectFunctionCall1(int8_numeric, PG_GETARG_DATUM(1));
- PG_RETURN_NUMERIC(numeric_add(oldsum, newval));
+ PG_RETURN_DATUM(DirectFunctionCall2(numeric_add,
+ NumericGetDatum(oldsum), newval));
}
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.75 2000/07/06 05:48:11 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.76 2000/07/29 03:26:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
case FLOAT8OID:
return (double) DatumGetFloat8(value);
case NUMERICOID:
- return (double) (*numeric_float8((Numeric) DatumGetPointer(value)));
+ return (double) DatumGetFloat8(DirectFunctionCall1(numeric_float8,
+ value));
case OIDOID:
case REGPROCOID:
/* we can treat OIDs as integers... */
break;
case BPCHAROID:
- result = bpcharlt((char *) datum1, (char *) datum2);
+ result = DatumGetBool(DirectFunctionCall2(bpcharlt,
+ datum1, datum2));
break;
case VARCHAROID:
- result = varcharlt((char *) datum1, (char *) datum2);
+ result = DatumGetBool(DirectFunctionCall2(varcharlt,
+ datum1, datum2));
break;
case NAMEOID:
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.68 2000/07/07 21:12:50 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.69 2000/07/29 03:26:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/* bpchar_name()
* Converts a bpchar() type to a NameData type.
*/
-NameData *
-bpchar_name(char *s)
+Datum
+bpchar_name(PG_FUNCTION_ARGS)
{
- NameData *result;
+ BpChar *s = PG_GETARG_BPCHAR_P(0);
+ Name result;
int len;
- if (s == NULL)
- return NULL;
-
len = VARSIZE(s) - VARHDRSZ;
+
+ /* Truncate to max length for a Name */
if (len >= NAMEDATALEN)
len = NAMEDATALEN-1;
+ /* Remove trailing blanks */
while (len > 0)
{
if (*(VARDATA(s) + len - 1) != ' ')
len--;
}
-#ifdef STRINGDEBUG
- printf("bpchar- convert string length %d (%d) ->%d\n",
- VARSIZE(s) - VARHDRSZ, VARSIZE(s), len);
-#endif
-
result = (NameData *) palloc(NAMEDATALEN);
memcpy(NameStr(*result), VARDATA(s), len);
- /* now null pad to full length... */
+ /* Now null pad to full length... */
while (len < NAMEDATALEN)
{
*(NameStr(*result) + len) = '\0';
len++;
}
- return result;
-} /* bpchar_name() */
+ PG_RETURN_NAME(result);
+}
/* name_bpchar()
* Converts a NameData type to a bpchar type.
*/
-char *
-name_bpchar(NameData *s)
+Datum
+name_bpchar(PG_FUNCTION_ARGS)
{
- char *result;
+ Name s = PG_GETARG_NAME(0);
+ BpChar *result;
int len;
- if (s == NULL)
- return NULL;
-
len = strlen(NameStr(*s));
-
-#ifdef STRINGDEBUG
- printf("bpchar- convert string length %d (%d) ->%d\n",
- VARSIZE(s) - VARHDRSZ, VARSIZE(s), len);
-#endif
-
- result = (char *) palloc(VARHDRSZ + len);
+ result = (BpChar *) palloc(VARHDRSZ + len);
memcpy(VARDATA(result), NameStr(*s), len);
VARATT_SIZEP(result) = len + VARHDRSZ;
- return result;
-} /* name_bpchar() */
+ PG_RETURN_BPCHAR_P(result);
+}
/*****************************************************************************
return array_map(&locfcinfo, VARCHAROID, VARCHAROID);
}
-
-/*****************************************************************************
- * Comparison Functions used for bpchar
- *****************************************************************************/
-
+/* "True" length (not counting trailing blanks) of a BpChar */
static int
-bcTruelen(char *arg)
+bcTruelen(BpChar *arg)
{
char *s = VARDATA(arg);
int i;
return i + 1;
}
-int32
-bpcharlen(char *arg)
+Datum
+bpcharlen(PG_FUNCTION_ARGS)
{
+ BpChar *arg = PG_GETARG_BPCHAR_P(0);
#ifdef MULTIBYTE
unsigned char *s;
int len,
l,
wl;
-#endif
- if (!PointerIsValid(arg))
- elog(ERROR, "Bad (null) char() external representation");
-#ifdef MULTIBYTE
l = VARSIZE(arg) - VARHDRSZ;
len = 0;
s = VARDATA(arg);
s += wl;
len++;
}
- return (len);
+ PG_RETURN_INT32(len);
#else
- return (VARSIZE(arg) - VARHDRSZ);
+ PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
#endif
}
-int32
-bpcharoctetlen(char *arg)
+Datum
+bpcharoctetlen(PG_FUNCTION_ARGS)
{
- if (!PointerIsValid(arg))
- elog(ERROR, "Bad (null) char() external representation");
+ BpChar *arg = PG_GETARG_BPCHAR_P(0);
- return (VARSIZE(arg) - VARHDRSZ);
+ PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
}
-bool
-bpchareq(char *arg1, char *arg2)
+
+/*****************************************************************************
+ * Comparison Functions used for bpchar
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ *****************************************************************************/
+
+Datum
+bpchareq(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
+ bool result;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
if (len1 != len2)
- return 0;
+ result = false;
+ else
+ result = (strncmp(VARDATA(arg1), VARDATA(arg2), len1) == 0);
- return strncmp(VARDATA(arg1), VARDATA(arg2), len1) == 0;
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
}
-bool
-bpcharne(char *arg1, char *arg2)
+Datum
+bpcharne(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
+ bool result;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
if (len1 != len2)
- return 1;
+ result = true;
+ else
+ result = (strncmp(VARDATA(arg1), VARDATA(arg2), len1) != 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
- return strncmp(VARDATA(arg1), VARDATA(arg2), len1) != 0;
+ PG_RETURN_BOOL(result);
}
-bool
-bpcharlt(char *arg1, char *arg2)
+Datum
+bpcharlt(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (cmp == 0)
- return len1 < len2;
- else
- return cmp < 0;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp < 0);
}
-bool
-bpcharle(char *arg1, char *arg2)
+Datum
+bpcharle(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (0 == cmp)
- return (bool) (len1 <= len2 ? 1 : 0);
- else
- return (bool) (cmp <= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp <= 0);
}
-bool
-bpchargt(char *arg1, char *arg2)
+Datum
+bpchargt(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (cmp == 0)
- return len1 > len2;
- else
- return cmp > 0;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp > 0);
}
-bool
-bpcharge(char *arg1, char *arg2)
+Datum
+bpcharge(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (0 == cmp)
- return (bool) (len1 >= len2 ? 1 : 0);
- else
- return (bool) (cmp >= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp >= 0);
}
-int32
-bpcharcmp(char *arg1, char *arg2)
+Datum
+bpcharcmp(PG_FUNCTION_ARGS)
{
+ BpChar *arg1 = PG_GETARG_BPCHAR_P(0);
+ BpChar *arg2 = PG_GETARG_BPCHAR_P(1);
int len1,
len2;
int cmp;
len2 = bcTruelen(arg2);
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if ((0 == cmp) && (len1 != len2))
- return (int32) (len1 < len2 ? -1 : 1);
- else
- return cmp;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_INT32(cmp);
}
+
+/*
+ * bpchar needs a specialized hash function because we want to ignore
+ * trailing blanks in comparisons. (varchar can use plain hashvarlena.)
+ */
+Datum
+hashbpchar(PG_FUNCTION_ARGS)
+{
+ BpChar *key = PG_GETARG_BPCHAR_P(0);
+ char *keydata;
+ int keylen;
+
+ keydata = VARDATA(key);
+ keylen = bcTruelen(key);
+
+ return hash_any(keydata, keylen);
+}
+
+
/*****************************************************************************
- * Comparison Functions used for varchar
+ * Functions used for varchar
*****************************************************************************/
-int32
-varcharlen(char *arg)
+Datum
+varcharlen(PG_FUNCTION_ARGS)
{
+ VarChar *arg = PG_GETARG_VARCHAR_P(0);
#ifdef MULTIBYTE
unsigned char *s;
int len,
l,
wl;
-#endif
- if (!PointerIsValid(arg))
- elog(ERROR, "Bad (null) varchar() external representation");
-
-#ifdef MULTIBYTE
len = 0;
s = VARDATA(arg);
l = VARSIZE(arg) - VARHDRSZ;
s += wl;
len++;
}
- return (len);
+ PG_RETURN_INT32(len);
#else
- return VARSIZE(arg) - VARHDRSZ;
+ PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
#endif
}
-int32
-varcharoctetlen(char *arg)
+Datum
+varcharoctetlen(PG_FUNCTION_ARGS)
{
- if (!PointerIsValid(arg))
- elog(ERROR, "Bad (null) varchar() external representation");
- return VARSIZE(arg) - VARHDRSZ;
+ VarChar *arg = PG_GETARG_VARCHAR_P(0);
+
+ PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
}
-bool
-varchareq(char *arg1, char *arg2)
+
+/*****************************************************************************
+ * Comparison Functions used for varchar
+ *
+ * Note: btree indexes need these routines not to leak memory; therefore,
+ * be careful to free working copies of toasted datums. Most places don't
+ * need to be so careful.
+ *****************************************************************************/
+
+Datum
+varchareq(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
-
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
+ bool result;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
if (len1 != len2)
- return 0;
+ result = false;
+ else
+ result = (strncmp(VARDATA(arg1), VARDATA(arg2), len1) == 0);
- return strncmp(VARDATA(arg1), VARDATA(arg2), len1) == 0;
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(result);
}
-bool
-varcharne(char *arg1, char *arg2)
+Datum
+varcharne(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
+ bool result;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
if (len1 != len2)
- return 1;
+ result = true;
+ else
+ result = (strncmp(VARDATA(arg1), VARDATA(arg2), len1) != 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
- return strncmp(VARDATA(arg1), VARDATA(arg2), len1) != 0;
+ PG_RETURN_BOOL(result);
}
-bool
-varcharlt(char *arg1, char *arg2)
+Datum
+varcharlt(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (cmp == 0)
- return len1 < len2;
- else
- return cmp < 0;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp < 0);
}
-bool
-varcharle(char *arg1, char *arg2)
+Datum
+varcharle(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (0 == cmp)
- return (bool) (len1 <= len2 ? 1 : 0);
- else
- return (bool) (cmp <= 0);
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp <= 0);
}
-bool
-varchargt(char *arg1, char *arg2)
+Datum
+varchargt(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (cmp == 0)
- return len1 > len2;
- else
- return cmp > 0;
+
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp > 0);
}
-bool
-varcharge(char *arg1, char *arg2)
+Datum
+varcharge(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
int cmp;
- if (arg1 == NULL || arg2 == NULL)
- return (bool) 0;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if (0 == cmp)
- return (bool) (len1 >= len2 ? 1 : 0);
- else
- return (bool) (cmp >= 0);
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
+
+ PG_RETURN_BOOL(cmp >= 0);
}
-int32
-varcharcmp(char *arg1, char *arg2)
+Datum
+varcharcmp(PG_FUNCTION_ARGS)
{
+ VarChar *arg1 = PG_GETARG_VARCHAR_P(0);
+ VarChar *arg2 = PG_GETARG_VARCHAR_P(1);
int len1,
len2;
int cmp;
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- if ((0 == cmp) && (len1 != len2))
- return (int32) (len1 < len2 ? -1 : 1);
- else
- return (int32) (cmp);
-}
-/*
- * bpchar needs a specialized hash function because we want to ignore
- * trailing blanks in comparisons. (varchar can use plain hashvarlena.)
- */
-Datum
-hashbpchar(PG_FUNCTION_ARGS)
-{
- BpChar *key = PG_GETARG_BPCHAR_P(0);
- char *keydata;
- int keylen;
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
- keydata = VARDATA(key);
- keylen = bcTruelen((char *) key);
+ PG_FREE_IF_COPY(arg1, 0);
+ PG_FREE_IF_COPY(arg2, 1);
- return hash_any(keydata, keylen);
+ PG_RETURN_INT32(cmp);
}
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.64 2000/07/12 02:37:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.65 2000/07/29 03:26:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* The input is scaned twice.
* The error checking of input is minimal.
*/
-bytea *
-byteain(char *inputText)
+Datum
+byteain(PG_FUNCTION_ARGS)
{
+ char *inputText = PG_GETARG_CSTRING(0);
char *tp;
char *rp;
int byte;
bytea *result;
- if (inputText == NULL)
- elog(ERROR, "Bad input string for type bytea");
-
for (byte = 0, tp = inputText; *tp != '\0'; byte++)
+ {
if (*tp++ == '\\')
{
if (*tp == '\\')
!isdigit((int) *tp++))
elog(ERROR, "Bad input string for type bytea");
}
- tp = inputText;
+ }
+
byte += VARHDRSZ;
result = (bytea *) palloc(byte);
- result->vl_len = byte; /* varlena? */
+ result->vl_len = byte; /* set varlena length */
+
+ tp = inputText;
rp = result->vl_dat;
while (*tp != '\0')
+ {
if (*tp != '\\' || *++tp == '\\')
*rp++ = *tp++;
else
byte <<= 3;
*rp++ = byte + VAL(*tp++);
}
- return result;
+ }
+
+ PG_RETURN_BYTEA_P(result);
}
/*
*
* NULL vlena should be an error--returning string with NULL for now.
*/
-char *
-byteaout(bytea *vlena)
+Datum
+byteaout(PG_FUNCTION_ARGS)
{
+ bytea *vlena = PG_GETARG_BYTEA_P(0);
char *result;
char *vp;
char *rp;
int i;
int len;
- if (vlena == NULL)
- {
- result = (char *) palloc(2);
- result[0] = '-';
- result[1] = '\0';
- return result;
- }
- vp = vlena->vl_dat;
len = 1; /* empty string has 1 char */
+ vp = vlena->vl_dat;
for (i = vlena->vl_len - VARHDRSZ; i != 0; i--, vp++)
+ {
if (*vp == '\\')
len += 2;
else if (isascii((int) *vp) && isprint((int) *vp))
len++;
else
- len += VARHDRSZ;
+ len += 4;
+ }
rp = result = (char *) palloc(len);
vp = vlena->vl_dat;
- for (i = vlena->vl_len - VARHDRSZ; i != 0; i--)
+ for (i = vlena->vl_len - VARHDRSZ; i != 0; i--, vp++)
+ {
if (*vp == '\\')
{
- vp++;
*rp++ = '\\';
*rp++ = '\\';
}
else if (isascii((int) *vp) && isprint((int) *vp))
- *rp++ = *vp++;
+ *rp++ = *vp;
else
{
- val = *vp++;
- *rp = '\\';
- rp += 3;
- *rp-- = DIG(val & 07);
+ val = *vp;
+ rp[0] = '\\';
+ rp[3] = DIG(val & 07);
val >>= 3;
- *rp-- = DIG(val & 07);
+ rp[2] = DIG(val & 07);
val >>= 3;
- *rp = DIG(val & 03);
- rp += 3;
+ rp[1] = DIG(val & 03);
+ rp += 4;
}
+ }
*rp = '\0';
- return result;
+ PG_RETURN_CSTRING(result);
}
* get the number of bytes contained in an instance of type 'bytea'
*-------------------------------------------------------------
*/
-int32
-byteaoctetlen(bytea *v)
+Datum
+byteaoctetlen(PG_FUNCTION_ARGS)
{
- if (!PointerIsValid(v))
- return 0;
+ bytea *v = PG_GETARG_BYTEA_P(0);
- return VARSIZE(v) - VARHDRSZ;
+ PG_RETURN_INT32(VARSIZE(v) - VARHDRSZ);
}
/*-------------------------------------------------------------
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_proc.h,v 1.149 2000/07/28 05:07:42 tgl Exp $
+ * $Id: pg_proc.h,v 1.150 2000/07/29 03:26:43 tgl Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
DESCR("(internal)");
DATA(insert OID = 1243 ( boolout PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 boolout - ));
DESCR("(internal)");
-DATA(insert OID = 1244 ( byteain PGUID 11 f t t t 1 f 17 "0" 100 0 0 100 byteain - ));
+DATA(insert OID = 1244 ( byteain PGUID 12 f t t t 1 f 17 "0" 100 0 0 100 byteain - ));
DESCR("(internal)");
-DATA(insert OID = 31 ( byteaout PGUID 11 f t t t 1 f 23 "0" 100 0 0 100 byteaout - ));
+DATA(insert OID = 31 ( byteaout PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 byteaout - ));
DESCR("(internal)");
DATA(insert OID = 1245 ( charin PGUID 12 f t t t 1 f 18 "0" 100 0 0 100 charin - ));
DESCR("(internal)");
DESCR("convert name to text");
DATA(insert OID = 407 ( name PGUID 12 f t t t 1 f 19 "25" 100 0 0 100 text_name - ));
DESCR("convert text to name");
-DATA(insert OID = 408 ( bpchar PGUID 11 f t t t 1 f 1042 "19" 100 0 0 100 name_bpchar - ));
+DATA(insert OID = 408 ( bpchar PGUID 12 f t t t 1 f 1042 "19" 100 0 0 100 name_bpchar - ));
DESCR("convert name to char()");
-DATA(insert OID = 409 ( name PGUID 11 f t t t 1 f 19 "1042" 100 0 0 100 bpchar_name - ));
+DATA(insert OID = 409 ( name PGUID 12 f t t t 1 f 19 "1042" 100 0 0 100 bpchar_name - ));
DESCR("convert char() to name");
DATA(insert OID = 438 ( hashcostestimate PGUID 12 f t f t 7 f 0 "0 0 0 0 0 0 0" 100 0 0 100 hashcostestimate - ));
DATA(insert OID = 717 ( int4eqoid PGUID 12 f t t t 2 f 16 "23 26" 100 0 0 100 int4eqoid - ));
DESCR("equal");
-DATA(insert OID = 720 ( octet_length PGUID 11 f t t t 1 f 23 "17" 100 0 0 100 byteaoctetlen - ));
+DATA(insert OID = 720 ( octet_length PGUID 12 f t t t 1 f 23 "17" 100 0 0 100 byteaoctetlen - ));
DESCR("");
DATA(insert OID = 721 ( get_byte PGUID 12 f t t t 2 f 23 "17 23" 100 0 0 100 byteaGetByte - ));
DESCR("");
DESCR("(internal)");
DATA(insert OID = 1047 ( varcharout PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 varcharout - ));
DESCR("(internal)");
-DATA(insert OID = 1048 ( bpchareq PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpchareq - ));
+DATA(insert OID = 1048 ( bpchareq PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpchareq - ));
DESCR("equal");
-DATA(insert OID = 1049 ( bpcharlt PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharlt - ));
+DATA(insert OID = 1049 ( bpcharlt PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharlt - ));
DESCR("less-than");
-DATA(insert OID = 1050 ( bpcharle PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharle - ));
+DATA(insert OID = 1050 ( bpcharle PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharle - ));
DESCR("less-than-or-equal");
-DATA(insert OID = 1051 ( bpchargt PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpchargt - ));
+DATA(insert OID = 1051 ( bpchargt PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpchargt - ));
DESCR("greater-than");
-DATA(insert OID = 1052 ( bpcharge PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharge - ));
+DATA(insert OID = 1052 ( bpcharge PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharge - ));
DESCR("greater-than-or-equal");
-DATA(insert OID = 1053 ( bpcharne PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharne - ));
+DATA(insert OID = 1053 ( bpcharne PGUID 12 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpcharne - ));
DESCR("not equal");
-DATA(insert OID = 1070 ( varchareq PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varchareq - ));
+DATA(insert OID = 1070 ( varchareq PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varchareq - ));
DESCR("equal");
-DATA(insert OID = 1071 ( varcharlt PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharlt - ));
+DATA(insert OID = 1071 ( varcharlt PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharlt - ));
DESCR("less-than");
-DATA(insert OID = 1072 ( varcharle PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharle - ));
+DATA(insert OID = 1072 ( varcharle PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharle - ));
DESCR("less-than-or-equal");
-DATA(insert OID = 1073 ( varchargt PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varchargt - ));
+DATA(insert OID = 1073 ( varchargt PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varchargt - ));
DESCR("greater-than");
-DATA(insert OID = 1074 ( varcharge PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharge - ));
+DATA(insert OID = 1074 ( varcharge PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharge - ));
DESCR("greater-than-or-equal");
-DATA(insert OID = 1075 ( varcharne PGUID 11 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharne - ));
+DATA(insert OID = 1075 ( varcharne PGUID 12 f t t t 2 f 16 "1043 1043" 100 0 0 100 varcharne - ));
DESCR("not equal");
-DATA(insert OID = 1078 ( bpcharcmp PGUID 11 f t t t 2 f 23 "1042 1042" 100 0 0 100 bpcharcmp - ));
+DATA(insert OID = 1078 ( bpcharcmp PGUID 12 f t t t 2 f 23 "1042 1042" 100 0 0 100 bpcharcmp - ));
DESCR("less-equal-greater");
-DATA(insert OID = 1079 ( varcharcmp PGUID 11 f t t t 2 f 23 "1043 1043" 100 0 0 100 varcharcmp - ));
+DATA(insert OID = 1079 ( varcharcmp PGUID 12 f t t t 2 f 23 "1043 1043" 100 0 0 100 varcharcmp - ));
DESCR("less-equal-greater");
DATA(insert OID = 1080 ( hashbpchar PGUID 12 f t t t 1 f 23 "1042" 100 0 0 100 hashbpchar - ));
DESCR("hash");
DATA(insert OID = 1317 ( length PGUID 12 f t t t 1 f 23 "25" 100 0 1 0 textlen - ));
DESCR("length");
-DATA(insert OID = 1318 ( length PGUID 11 f t t t 1 f 23 "1042" 100 0 0 100 bpcharlen - ));
+DATA(insert OID = 1318 ( length PGUID 12 f t t t 1 f 23 "1042" 100 0 0 100 bpcharlen - ));
DESCR("character length");
-DATA(insert OID = 1319 ( length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - ));
+DATA(insert OID = 1319 ( length PGUID 12 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - ));
DESCR("character length");
DATA(insert OID = 1326 ( interval_div PGUID 12 f t f t 2 f 1186 "1186 701" 100 0 0 100 interval_div - ));
DESCR("convert time to interval");
DATA(insert OID = 1371 ( date PGUID 14 f t t t 1 f 1082 "1082" 100 0 0 100 "select $1" - ));
DESCR("convert (noop)");
-DATA(insert OID = 1372 ( char_length PGUID 11 f t t t 1 f 23 "1042" 100 0 0 100 bpcharlen - ));
+DATA(insert OID = 1372 ( char_length PGUID 12 f t t t 1 f 23 "1042" 100 0 0 100 bpcharlen - ));
DESCR("character length");
-DATA(insert OID = 1373 ( char_length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - ));
+DATA(insert OID = 1373 ( char_length PGUID 12 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - ));
DESCR("character length");
DATA(insert OID = 1374 ( octet_length PGUID 12 f t t t 1 f 23 "25" 100 0 0 100 textoctetlen - ));
DESCR("octet length");
-DATA(insert OID = 1375 ( octet_length PGUID 11 f t t t 1 f 23 "1042" 100 0 0 100 bpcharoctetlen - ));
+DATA(insert OID = 1375 ( octet_length PGUID 12 f t t t 1 f 23 "1042" 100 0 0 100 bpcharoctetlen - ));
DESCR("octet length");
-DATA(insert OID = 1376 ( octet_length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharoctetlen - ));
+DATA(insert OID = 1376 ( octet_length PGUID 12 f t t t 1 f 23 "1043" 100 0 0 100 varcharoctetlen - ));
DESCR("octet length");
DATA(insert OID = 1377 ( time_larger PGUID 12 f t t t 2 f 1083 "1083 1083" 100 0 0 100 time_larger - ));
DESCR("(internal)");
DATA(insert OID = 1703 ( numeric PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric - ));
DESCR("adjust numeric to typmod precision/scale");
-DATA(insert OID = 1704 ( numeric_abs PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - ));
+DATA(insert OID = 1704 ( numeric_abs PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - ));
DESCR("absolute value");
-DATA(insert OID = 1705 ( abs PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - ));
+DATA(insert OID = 1705 ( abs PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - ));
DESCR("absolute value");
-DATA(insert OID = 1706 ( sign PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sign - ));
+DATA(insert OID = 1706 ( sign PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sign - ));
DESCR("sign of value");
DATA(insert OID = 1707 ( round PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric_round - ));
DESCR("value rounded to 'scale'");
DESCR("value truncated to 'scale'");
DATA(insert OID = 1710 ( trunc PGUID 14 f t t t 1 f 1700 "1700" 100 0 0 100 "select trunc($1,0)" - ));
DESCR("value truncated to 'scale' of zero");
-DATA(insert OID = 1711 ( ceil PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ceil - ));
+DATA(insert OID = 1711 ( ceil PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ceil - ));
DESCR("smallest integer >= value");
-DATA(insert OID = 1712 ( floor PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_floor - ));
+DATA(insert OID = 1712 ( floor PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_floor - ));
DESCR("largest integer <= value");
-DATA(insert OID = 1718 ( numeric_eq PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_eq - ));
+DATA(insert OID = 1718 ( numeric_eq PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_eq - ));
DESCR("equal");
-DATA(insert OID = 1719 ( numeric_ne PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_ne - ));
+DATA(insert OID = 1719 ( numeric_ne PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_ne - ));
DESCR("not equal");
-DATA(insert OID = 1720 ( numeric_gt PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_gt - ));
+DATA(insert OID = 1720 ( numeric_gt PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_gt - ));
DESCR("greater-than");
-DATA(insert OID = 1721 ( numeric_ge PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_ge - ));
+DATA(insert OID = 1721 ( numeric_ge PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_ge - ));
DESCR("greater-than-or-equal");
-DATA(insert OID = 1722 ( numeric_lt PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_lt - ));
+DATA(insert OID = 1722 ( numeric_lt PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_lt - ));
DESCR("lower-than");
-DATA(insert OID = 1723 ( numeric_le PGUID 11 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_le - ));
+DATA(insert OID = 1723 ( numeric_le PGUID 12 f t t t 2 f 16 "1700 1700" 100 0 0 100 numeric_le - ));
DESCR("lower-than-or-equal");
-DATA(insert OID = 1724 ( numeric_add PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_add - ));
+DATA(insert OID = 1724 ( numeric_add PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_add - ));
DESCR("addition");
-DATA(insert OID = 1725 ( numeric_sub PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_sub - ));
+DATA(insert OID = 1725 ( numeric_sub PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_sub - ));
DESCR("subtract");
-DATA(insert OID = 1726 ( numeric_mul PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mul - ));
+DATA(insert OID = 1726 ( numeric_mul PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mul - ));
DESCR("multiply");
-DATA(insert OID = 1727 ( numeric_div PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_div - ));
+DATA(insert OID = 1727 ( numeric_div PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_div - ));
DESCR("divide");
-DATA(insert OID = 1728 ( mod PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mod - ));
+DATA(insert OID = 1728 ( mod PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mod - ));
DESCR("modulus");
-DATA(insert OID = 1729 ( numeric_mod PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mod - ));
+DATA(insert OID = 1729 ( numeric_mod PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_mod - ));
DESCR("modulus");
-DATA(insert OID = 1730 ( sqrt PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sqrt - ));
+DATA(insert OID = 1730 ( sqrt PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sqrt - ));
DESCR("square root");
-DATA(insert OID = 1731 ( numeric_sqrt PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sqrt - ));
+DATA(insert OID = 1731 ( numeric_sqrt PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sqrt - ));
DESCR("square root");
-DATA(insert OID = 1732 ( exp PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_exp - ));
+DATA(insert OID = 1732 ( exp PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_exp - ));
DESCR("e raised to the power of n");
-DATA(insert OID = 1733 ( numeric_exp PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_exp - ));
+DATA(insert OID = 1733 ( numeric_exp PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_exp - ));
DESCR("e raised to the power of n");
-DATA(insert OID = 1734 ( ln PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ln - ));
+DATA(insert OID = 1734 ( ln PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ln - ));
DESCR("natural logarithm of n");
-DATA(insert OID = 1735 ( numeric_ln PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ln - ));
+DATA(insert OID = 1735 ( numeric_ln PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_ln - ));
DESCR("natural logarithm of n");
-DATA(insert OID = 1736 ( log PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_log - ));
+DATA(insert OID = 1736 ( log PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_log - ));
DESCR("logarithm base m of n");
-DATA(insert OID = 1737 ( numeric_log PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_log - ));
+DATA(insert OID = 1737 ( numeric_log PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_log - ));
DESCR("logarithm base m of n");
-DATA(insert OID = 1738 ( pow PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_power - ));
+DATA(insert OID = 1738 ( pow PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_power - ));
DESCR("m raised to the power of n");
-DATA(insert OID = 1739 ( numeric_power PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_power - ));
+DATA(insert OID = 1739 ( numeric_power PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_power - ));
DESCR("m raised to the power of n");
DATA(insert OID = 1740 ( numeric PGUID 12 f t t t 1 f 1700 "23" 100 0 0 100 int4_numeric - ));
DESCR("(internal)");
DATA(insert OID = 1741 ( log PGUID 14 f t t t 1 f 1700 "1700" 100 0 0 100 "select log(10, $1)" - ));
DESCR("logarithm base 10 of n");
-DATA(insert OID = 1742 ( numeric PGUID 11 f t t t 1 f 1700 "700" 100 0 0 100 float4_numeric - ));
+DATA(insert OID = 1742 ( numeric PGUID 12 f t t t 1 f 1700 "700" 100 0 0 100 float4_numeric - ));
DESCR("(internal)");
-DATA(insert OID = 1743 ( numeric PGUID 11 f t t t 1 f 1700 "701" 100 0 0 100 float8_numeric - ));
+DATA(insert OID = 1743 ( numeric PGUID 12 f t t t 1 f 1700 "701" 100 0 0 100 float8_numeric - ));
DESCR("(internal)");
-DATA(insert OID = 1744 ( int4 PGUID 11 f t t t 1 f 23 "1700" 100 0 0 100 numeric_int4 - ));
+DATA(insert OID = 1744 ( int4 PGUID 12 f t t t 1 f 23 "1700" 100 0 0 100 numeric_int4 - ));
DESCR("(internal)");
-DATA(insert OID = 1745 ( float4 PGUID 11 f t t t 1 f 700 "1700" 100 0 0 100 numeric_float4 - ));
+DATA(insert OID = 1745 ( float4 PGUID 12 f t t t 1 f 700 "1700" 100 0 0 100 numeric_float4 - ));
DESCR("(internal)");
-DATA(insert OID = 1746 ( float8 PGUID 11 f t t t 1 f 701 "1700" 100 0 0 100 numeric_float8 - ));
+DATA(insert OID = 1746 ( float8 PGUID 12 f t t t 1 f 701 "1700" 100 0 0 100 numeric_float8 - ));
DESCR("(internal)");
-DATA(insert OID = 1764 ( numeric_inc PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_inc - ));
+DATA(insert OID = 1764 ( numeric_inc PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_inc - ));
DESCR("increment by one");
-DATA(insert OID = 1766 ( numeric_smaller PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_smaller - ));
+DATA(insert OID = 1766 ( numeric_smaller PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_smaller - ));
DESCR("smaller of two numbers");
-DATA(insert OID = 1767 ( numeric_larger PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_larger - ));
+DATA(insert OID = 1767 ( numeric_larger PGUID 12 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_larger - ));
DESCR("larger of two numbers");
-DATA(insert OID = 1769 ( numeric_cmp PGUID 11 f t t t 2 f 23 "1700 1700" 100 0 0 100 numeric_cmp - ));
+DATA(insert OID = 1769 ( numeric_cmp PGUID 12 f t t t 2 f 23 "1700 1700" 100 0 0 100 numeric_cmp - ));
DESCR("compare two numbers");
-DATA(insert OID = 1771 ( numeric_uminus PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_uminus - ));
+DATA(insert OID = 1771 ( numeric_uminus PGUID 12 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_uminus - ));
DESCR("negate");
-DATA(insert OID = 1779 ( int8 PGUID 11 f t t t 1 f 20 "1700" 100 0 0 100 numeric_int8 - ));
+DATA(insert OID = 1779 ( int8 PGUID 12 f t t t 1 f 20 "1700" 100 0 0 100 numeric_int8 - ));
DESCR("(internal)");
DATA(insert OID = 1781 ( numeric PGUID 12 f t t t 1 f 1700 "20" 100 0 0 100 int8_numeric - ));
DESCR("(internal)");
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_type.h,v 1.93 2000/07/22 03:34:28 tgl Exp $
+ * $Id: pg_type.h,v 1.94 2000/07/29 03:26:43 tgl Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
DESCR("boolean, 'true'/'false'");
#define BOOLOID 16
-DATA(insert OID = 17 ( bytea PGUID -1 -1 f b t \054 0 0 byteain byteaout byteain byteaout i p _null_ ));
+DATA(insert OID = 17 ( bytea PGUID -1 -1 f b t \054 0 0 byteain byteaout byteain byteaout i x _null_ ));
DESCR("variable-length string, binary values escaped");
#define BYTEAOID 17
DATA(insert OID = 1040 ( _macaddr PGUID -1 -1 f b t \054 0 829 array_in array_out array_in array_out i x _null_ ));
DATA(insert OID = 1041 ( _inet PGUID -1 -1 f b t \054 0 869 array_in array_out array_in array_out i x _null_ ));
DATA(insert OID = 651 ( _cidr PGUID -1 -1 f b t \054 0 650 array_in array_out array_in array_out i x _null_ ));
-DATA(insert OID = 1042 ( bpchar PGUID -1 -1 f b t \054 0 0 bpcharin bpcharout bpcharin bpcharout i p _null_ ));
+DATA(insert OID = 1042 ( bpchar PGUID -1 -1 f b t \054 0 0 bpcharin bpcharout bpcharin bpcharout i x _null_ ));
DESCR("char(length), blank-padded string, fixed storage length");
#define BPCHAROID 1042
-DATA(insert OID = 1043 ( varchar PGUID -1 -1 f b t \054 0 0 varcharin varcharout varcharin varcharout i p _null_ ));
+DATA(insert OID = 1043 ( varchar PGUID -1 -1 f b t \054 0 0 varcharin varcharout varcharin varcharout i x _null_ ));
DESCR("varchar(length), non-blank-padded string, variable storage length");
#define VARCHAROID 1043
#define LZTEXTOID 1625
/* OIDS 1700 - 1799 */
-DATA(insert OID = 1700 ( numeric PGUID -1 -1 f b t \054 0 0 numeric_in numeric_out numeric_in numeric_out i p _null_ ));
+DATA(insert OID = 1700 ( numeric PGUID -1 -1 f b t \054 0 0 numeric_in numeric_out numeric_in numeric_out i m _null_ ));
DESCR("numeric(precision, decimal), arbitrary precision number");
#define NUMERICOID 1700
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: fmgr.h,v 1.8 2000/07/12 02:37:25 tgl Exp $
+ * $Id: fmgr.h,v 1.9 2000/07/29 03:26:47 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/* Macros for returning results of standard types */
+#define PG_RETURN_DATUM(x) return (x)
#define PG_RETURN_INT32(x) return Int32GetDatum(x)
#define PG_RETURN_UINT32(x) return UInt32GetDatum(x)
#define PG_RETURN_INT16(x) return Int16GetDatum(x)
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.124 2000/07/17 03:05:32 tgl Exp $
+ * $Id: builtins.h,v 1.125 2000/07/29 03:26:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
extern Datum _bpchar(PG_FUNCTION_ARGS);
extern Datum char_bpchar(PG_FUNCTION_ARGS);
extern Datum bpchar_char(PG_FUNCTION_ARGS);
-extern char *name_bpchar(NameData *s);
-extern NameData *bpchar_name(char *s);
-extern bool bpchareq(char *arg1, char *arg2);
-extern bool bpcharne(char *arg1, char *arg2);
-extern bool bpcharlt(char *arg1, char *arg2);
-extern bool bpcharle(char *arg1, char *arg2);
-extern bool bpchargt(char *arg1, char *arg2);
-extern bool bpcharge(char *arg1, char *arg2);
-extern int32 bpcharcmp(char *arg1, char *arg2);
-extern int32 bpcharlen(char *arg);
-extern int32 bpcharoctetlen(char *arg);
+extern Datum name_bpchar(PG_FUNCTION_ARGS);
+extern Datum bpchar_name(PG_FUNCTION_ARGS);
+extern Datum bpchareq(PG_FUNCTION_ARGS);
+extern Datum bpcharne(PG_FUNCTION_ARGS);
+extern Datum bpcharlt(PG_FUNCTION_ARGS);
+extern Datum bpcharle(PG_FUNCTION_ARGS);
+extern Datum bpchargt(PG_FUNCTION_ARGS);
+extern Datum bpcharge(PG_FUNCTION_ARGS);
+extern Datum bpcharcmp(PG_FUNCTION_ARGS);
+extern Datum bpcharlen(PG_FUNCTION_ARGS);
+extern Datum bpcharoctetlen(PG_FUNCTION_ARGS);
extern Datum hashbpchar(PG_FUNCTION_ARGS);
extern Datum varcharin(PG_FUNCTION_ARGS);
extern Datum varcharout(PG_FUNCTION_ARGS);
extern Datum varchar(PG_FUNCTION_ARGS);
extern Datum _varchar(PG_FUNCTION_ARGS);
-extern bool varchareq(char *arg1, char *arg2);
-extern bool varcharne(char *arg1, char *arg2);
-extern bool varcharlt(char *arg1, char *arg2);
-extern bool varcharle(char *arg1, char *arg2);
-extern bool varchargt(char *arg1, char *arg2);
-extern bool varcharge(char *arg1, char *arg2);
-extern int32 varcharcmp(char *arg1, char *arg2);
-extern int32 varcharlen(char *arg);
-extern int32 varcharoctetlen(char *arg);
+extern Datum varchareq(PG_FUNCTION_ARGS);
+extern Datum varcharne(PG_FUNCTION_ARGS);
+extern Datum varcharlt(PG_FUNCTION_ARGS);
+extern Datum varcharle(PG_FUNCTION_ARGS);
+extern Datum varchargt(PG_FUNCTION_ARGS);
+extern Datum varcharge(PG_FUNCTION_ARGS);
+extern Datum varcharcmp(PG_FUNCTION_ARGS);
+extern Datum varcharlen(PG_FUNCTION_ARGS);
+extern Datum varcharoctetlen(PG_FUNCTION_ARGS);
/* varlena.c */
extern Datum textin(PG_FUNCTION_ARGS);
extern Datum text_name(PG_FUNCTION_ARGS);
extern int varstr_cmp(char *arg1, int len1, char *arg2, int len2);
-extern bytea *byteain(char *inputText);
-extern char *byteaout(bytea *vlena);
-extern int32 byteaoctetlen(bytea *v);
+extern Datum byteain(PG_FUNCTION_ARGS);
+extern Datum byteaout(PG_FUNCTION_ARGS);
+extern Datum byteaoctetlen(PG_FUNCTION_ARGS);
extern Datum byteaGetByte(PG_FUNCTION_ARGS);
extern Datum byteaGetBit(PG_FUNCTION_ARGS);
extern Datum byteaSetByte(PG_FUNCTION_ARGS);
extern Datum numeric_in(PG_FUNCTION_ARGS);
extern Datum numeric_out(PG_FUNCTION_ARGS);
extern Datum numeric(PG_FUNCTION_ARGS);
-extern Numeric numeric_abs(Numeric num);
-extern Numeric numeric_uminus(Numeric num);
-extern Numeric numeric_sign(Numeric num);
+extern Datum numeric_abs(PG_FUNCTION_ARGS);
+extern Datum numeric_uminus(PG_FUNCTION_ARGS);
+extern Datum numeric_sign(PG_FUNCTION_ARGS);
extern Datum numeric_round(PG_FUNCTION_ARGS);
extern Datum numeric_trunc(PG_FUNCTION_ARGS);
-extern Numeric numeric_ceil(Numeric num);
-extern Numeric numeric_floor(Numeric num);
-extern int32 numeric_cmp(Numeric num1, Numeric num2);
-extern bool numeric_eq(Numeric num1, Numeric num2);
-extern bool numeric_ne(Numeric num1, Numeric num2);
-extern bool numeric_gt(Numeric num1, Numeric num2);
-extern bool numeric_ge(Numeric num1, Numeric num2);
-extern bool numeric_lt(Numeric num1, Numeric num2);
-extern bool numeric_le(Numeric num1, Numeric num2);
-extern Numeric numeric_add(Numeric num1, Numeric num2);
-extern Numeric numeric_sub(Numeric num1, Numeric num2);
-extern Numeric numeric_mul(Numeric num1, Numeric num2);
-extern Numeric numeric_div(Numeric num1, Numeric num2);
-extern Numeric numeric_mod(Numeric num1, Numeric num2);
-extern Numeric numeric_inc(Numeric num);
-extern Numeric numeric_smaller(Numeric num1, Numeric num2);
-extern Numeric numeric_larger(Numeric num1, Numeric num2);
-extern Numeric numeric_sqrt(Numeric num);
-extern Numeric numeric_exp(Numeric num);
-extern Numeric numeric_ln(Numeric num);
-extern Numeric numeric_log(Numeric num1, Numeric num2);
-extern Numeric numeric_power(Numeric num1, Numeric num2);
+extern Datum numeric_ceil(PG_FUNCTION_ARGS);
+extern Datum numeric_floor(PG_FUNCTION_ARGS);
+extern Datum numeric_cmp(PG_FUNCTION_ARGS);
+extern Datum numeric_eq(PG_FUNCTION_ARGS);
+extern Datum numeric_ne(PG_FUNCTION_ARGS);
+extern Datum numeric_gt(PG_FUNCTION_ARGS);
+extern Datum numeric_ge(PG_FUNCTION_ARGS);
+extern Datum numeric_lt(PG_FUNCTION_ARGS);
+extern Datum numeric_le(PG_FUNCTION_ARGS);
+extern Datum numeric_add(PG_FUNCTION_ARGS);
+extern Datum numeric_sub(PG_FUNCTION_ARGS);
+extern Datum numeric_mul(PG_FUNCTION_ARGS);
+extern Datum numeric_div(PG_FUNCTION_ARGS);
+extern Datum numeric_mod(PG_FUNCTION_ARGS);
+extern Datum numeric_inc(PG_FUNCTION_ARGS);
+extern Datum numeric_smaller(PG_FUNCTION_ARGS);
+extern Datum numeric_larger(PG_FUNCTION_ARGS);
+extern Datum numeric_sqrt(PG_FUNCTION_ARGS);
+extern Datum numeric_exp(PG_FUNCTION_ARGS);
+extern Datum numeric_ln(PG_FUNCTION_ARGS);
+extern Datum numeric_log(PG_FUNCTION_ARGS);
+extern Datum numeric_power(PG_FUNCTION_ARGS);
extern Datum int4_numeric(PG_FUNCTION_ARGS);
-extern int32 numeric_int4(Numeric num);
+extern Datum numeric_int4(PG_FUNCTION_ARGS);
extern Datum int8_numeric(PG_FUNCTION_ARGS);
-extern int64 *numeric_int8(Numeric num);
+extern Datum numeric_int8(PG_FUNCTION_ARGS);
extern Datum int2_numeric(PG_FUNCTION_ARGS);
extern Datum numeric_int2(PG_FUNCTION_ARGS);
-extern Numeric float8_numeric(float64 val);
-extern float64 numeric_float8(Numeric num);
-extern Numeric float4_numeric(float32 val);
-extern float32 numeric_float4(Numeric num);
+extern Datum float8_numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_float8(PG_FUNCTION_ARGS);
+extern Datum float4_numeric(PG_FUNCTION_ARGS);
+extern Datum numeric_float4(PG_FUNCTION_ARGS);
extern Datum numeric_accum(PG_FUNCTION_ARGS);
extern Datum int2_accum(PG_FUNCTION_ARGS);
extern Datum int4_accum(PG_FUNCTION_ARGS);