bpchar, varchar, bytea, numeric are toastable --- if you initdb, which
authorTom Lane
Sat, 29 Jul 2000 03:26:51 +0000 (03:26 +0000)
committerTom Lane
Sat, 29 Jul 2000 03:26:51 +0000 (03:26 +0000)
I did not force.  I marked numeric as compressable-but-not-move-off-able,
partly to test that storage mode and partly because I've got doubts
that numerics are large enough to need external storage.

src/backend/commands/trigger.c
src/backend/utils/adt/formatting.c
src/backend/utils/adt/numeric.c
src/backend/utils/adt/selfuncs.c
src/backend/utils/adt/varchar.c
src/backend/utils/adt/varlena.c
src/include/catalog/pg_proc.h
src/include/catalog/pg_type.h
src/include/fmgr.h
src/include/utils/builtins.h

index 36b2019bd9931fcf13707df57356d99d6f7220b1..8abd930b1b93b6fa32f33a69f63599348e00b904 100644 (file)
@@ -7,7 +7,7 @@
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -240,12 +240,14 @@ CreateTrigger(CreateTrigStmt *stmt)
            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);
index 3df0fe3557952dabc9053e199f3d05e55b2eeb7b..864c3867ba5329bfabcc6febb292d01f80c77a94 100644 (file)
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------
  * 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
@@ -4066,7 +4066,9 @@ numeric_to_char(PG_FUNCTION_ARGS)
        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
@@ -4080,8 +4082,12 @@ numeric_to_char(PG_FUNCTION_ARGS)
            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);
index 437bb69b832a6a66c2825f155a6c8dbbff800f58..bc9a6fe6b31ec1e0ac159923ef89bcfd3b65f0f8 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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 $
  *
  * ----------
  */
@@ -351,25 +351,18 @@ numeric(PG_FUNCTION_ARGS)
  * ----------------------------------------------------------------------
  */
 
-
-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
@@ -380,28 +373,22 @@ numeric_abs(Numeric num)
 
    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
@@ -425,29 +412,23 @@ numeric_uminus(Numeric num)
            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);
 
@@ -473,7 +454,7 @@ numeric_sign(Numeric num)
    res = make_result(&result);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -633,17 +614,15 @@ numeric_trunc(PG_FUNCTION_ARGS)
  * 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);
 
@@ -655,7 +634,7 @@ numeric_ceil(Numeric num)
    res = make_result(&result);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -665,17 +644,15 @@ numeric_ceil(Numeric num)
  * 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);
 
@@ -687,7 +664,7 @@ numeric_floor(Numeric num)
    res = make_result(&result);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -695,203 +672,236 @@ numeric_floor(Numeric num)
  *
  * 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);
 }
 
 
@@ -909,27 +919,22 @@ numeric_le(Numeric num1, Numeric num2)
  * 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
@@ -951,7 +956,7 @@ numeric_add(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -961,27 +966,22 @@ numeric_add(Numeric num1, Numeric num2)
  * 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
@@ -1002,7 +1002,7 @@ numeric_sub(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1012,27 +1012,22 @@ numeric_sub(Numeric num1, Numeric num2)
  * 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
@@ -1063,7 +1058,7 @@ numeric_mul(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1073,28 +1068,23 @@ numeric_mul(Numeric num1, Numeric num2)
  * 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
@@ -1144,7 +1134,7 @@ numeric_div(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&result);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1154,19 +1144,18 @@ numeric_div(Numeric num1, Numeric num2)
  * 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);
@@ -1184,7 +1173,7 @@ numeric_mod(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&arg1);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1194,25 +1183,19 @@ numeric_mod(Numeric num1, Numeric num2)
  * 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
@@ -1227,7 +1210,7 @@ numeric_inc(Numeric num)
 
    free_var(&arg);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1237,26 +1220,21 @@ numeric_inc(Numeric num)
  * 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
@@ -1276,7 +1254,7 @@ numeric_smaller(Numeric num1, Numeric num2)
    free_var(&arg1);
    free_var(&arg2);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1286,26 +1264,21 @@ numeric_smaller(Numeric num1, Numeric num2)
  * 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
@@ -1325,7 +1298,7 @@ numeric_larger(Numeric num1, Numeric num2)
    free_var(&arg1);
    free_var(&arg2);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1343,27 +1316,21 @@ numeric_larger(Numeric num1, Numeric num2)
  * 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,
@@ -1390,7 +1357,7 @@ numeric_sqrt(Numeric num)
    free_var(&result);
    free_var(&arg);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1400,27 +1367,21 @@ numeric_sqrt(Numeric num)
  * 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().
@@ -1445,7 +1406,7 @@ numeric_exp(Numeric num)
    free_var(&result);
    free_var(&arg);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1455,27 +1416,21 @@ numeric_exp(Numeric num)
  * 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()
@@ -1500,7 +1455,7 @@ numeric_ln(Numeric num)
    free_var(&result);
    free_var(&arg);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1510,28 +1465,23 @@ numeric_ln(Numeric num)
  * 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
@@ -1563,7 +1513,7 @@ numeric_log(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&arg1);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1573,28 +1523,23 @@ numeric_log(Numeric num1, Numeric num2)
  * 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
@@ -1626,7 +1571,7 @@ numeric_power(Numeric num1, Numeric num2)
    free_var(&arg2);
    free_var(&arg1);
 
-   return res;
+   PG_RETURN_NUMERIC(res);
 }
 
 
@@ -1660,16 +1605,15 @@ int4_numeric(PG_FUNCTION_ARGS)
 }
 
 
-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");
 
@@ -1687,7 +1631,7 @@ numeric_int4(Numeric num)
    result = DirectFunctionCall1(int4in, CStringGetDatum(str));
    pfree(str);
 
-   return result;
+   PG_RETURN_DATUM(result);
 }
 
 
@@ -1712,16 +1656,15 @@ int8_numeric(PG_FUNCTION_ARGS)
 }
 
 
-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");
 
@@ -1737,10 +1680,9 @@ numeric_int8(Numeric num)
    free_var(&x);
 
    result = DirectFunctionCall1(int8in, CStringGetDatum(str));
-
    pfree(str);
 
-   return (int64 *) (result);
+   PG_RETURN_DATUM(result);
 }
 
 
@@ -1795,20 +1737,18 @@ numeric_int2(PG_FUNCTION_ARGS)
 }
 
 
-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);
 
@@ -1817,49 +1757,41 @@ float8_numeric(float64 val)
 
    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);
 
@@ -1868,32 +1800,26 @@ float4_numeric(float32 val)
 
    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);
 }
 
 
@@ -1915,7 +1841,7 @@ do_numeric_accum(ArrayType *transarray, Numeric newval)
 {
    Datum      *transdatums;
    int         ndatums;
-   Numeric     N,
+   Datum       N,
                sumX,
                sumX2;
    ArrayType  *result;
@@ -1926,17 +1852,21 @@ do_numeric_accum(ArrayType *transarray, Numeric newval)
                      &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');
@@ -2018,7 +1948,9 @@ numeric_avg(PG_FUNCTION_ARGS)
    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
@@ -2172,8 +2104,8 @@ numeric_stddev(PG_FUNCTION_ARGS)
 Datum
 int2_sum(PG_FUNCTION_ARGS)
 {
-   Numeric     oldsum,
-               newval;
+   Numeric     oldsum;
+   Datum       newval;
 
    if (PG_ARGISNULL(0))
    {
@@ -2181,9 +2113,8 @@ int2_sum(PG_FUNCTION_ARGS)
        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);
@@ -2193,17 +2124,17 @@ int2_sum(PG_FUNCTION_ARGS)
        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))
    {
@@ -2211,9 +2142,8 @@ int4_sum(PG_FUNCTION_ARGS)
        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);
@@ -2223,17 +2153,17 @@ int4_sum(PG_FUNCTION_ARGS)
        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))
    {
@@ -2241,9 +2171,8 @@ int8_sum(PG_FUNCTION_ARGS)
        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);
@@ -2253,10 +2182,10 @@ int8_sum(PG_FUNCTION_ARGS)
        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));
 }
 
 
index 3d82487f7e7e2708bcaddb58a32890b5ac09b96f..04d9d9f6a9e77c8e52a50383266b340aebc6a45f 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -818,7 +818,8 @@ convert_numeric_to_scalar(Datum value, Oid typid)
        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... */
@@ -1825,11 +1826,13 @@ string_lessthan(const char *str1, const char *str2, Oid datatype)
            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:
index 58b24f339e185209d632ed174db6f3d106780d34..804ab8c5caa556176b1e6098431266e106a9fc7f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -260,19 +260,20 @@ char_bpchar(PG_FUNCTION_ARGS)
 /* 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) != ' ')
@@ -280,49 +281,36 @@ bpchar_name(char *s)
        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);
+}
 
 
 /*****************************************************************************
@@ -446,13 +434,9 @@ _varchar(PG_FUNCTION_ARGS)
    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;
@@ -467,19 +451,16 @@ bcTruelen(char *arg)
    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);
@@ -490,134 +471,160 @@ bpcharlen(char *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;
@@ -626,30 +633,46 @@ bpcharcmp(char *arg1, char *arg2)
    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;
@@ -660,161 +683,171 @@ varcharlen(char *arg)
        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);
 }
index b5380a8c52a56e27fa75d8ae452cd7776d9238f8..b075bf91112f0cc205808d13b79c775a71414cdc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -41,18 +41,17 @@ static int  text_cmp(text *arg1, text *arg2);
  *             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 == '\\')
@@ -62,12 +61,16 @@ byteain(char *inputText)
                     !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
@@ -78,7 +81,9 @@ byteain(char *inputText)
            byte <<= 3;
            *rp++ = byte + VAL(*tp++);
        }
-   return result;
+   }
+
+   PG_RETURN_BYTEA_P(result);
 }
 
 /*
@@ -89,9 +94,10 @@ byteain(char *inputText)
  *
  *     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;
@@ -99,47 +105,42 @@ byteaout(bytea *vlena)
    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);
 }
 
 
@@ -663,13 +664,12 @@ text_smaller(PG_FUNCTION_ARGS)
  * 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);
 }
 
 /*-------------------------------------------------------------
index 56654c9f3294666f7d8fdb11adff65c500926c4e..9f4ed9f87bba69feabdde7947475f089ac12d104 100644 (file)
@@ -7,7 +7,7 @@
  * 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
@@ -101,9 +101,9 @@ DATA(insert OID = 1242 (  boolin           PGUID 12 f t t t 1 f 16 "0" 100 0 0  100  b
 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)");
@@ -786,9 +786,9 @@ DATA(insert OID =  406 (  text             PGUID 12 f t t t 1 f 25 "19" 100 0 0 100 nam
 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 - ));
@@ -943,7 +943,7 @@ DESCR("equal");
 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("");
@@ -1293,33 +1293,33 @@ DATA(insert OID = 1046 (  varcharin        PGUID 12 f t t t 3 f 1043 "0 26 23" 100
 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");
@@ -1591,9 +1591,9 @@ DESCR("convert timestamp to time");
 
 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 - ));
@@ -1661,16 +1661,16 @@ DATA(insert OID = 1370 (  interval           PGUID 12 f t f t 1 f 1186 "1083" 100 0 0 1
 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 - ));
@@ -2313,11 +2313,11 @@ DATA(insert OID = 1702 ( numeric_out            PGUID 12 f t t t 1 f 23 "0" 100 0 0 100
 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'");
@@ -2327,79 +2327,79 @@ DATA(insert OID = 1709 ( trunc                  PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 1
 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)");
index d14f9287e24c39e2fc00d70f0f18acfd2095fae3..04457d7296ee1fdd1525c1e2c67bd56d1bb728bb 100644 (file)
@@ -8,7 +8,7 @@
  * 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
@@ -174,7 +174,7 @@ DATA(insert OID = 16 (  bool       PGUID  1   1 t b t \054 0   0 boolin boolout bool
 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
 
@@ -368,10 +368,10 @@ DATA(insert OID = 1034 (  _aclitem     PGUID -1 -1 f b t \054 0 1033 array_in array
 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
 
@@ -417,7 +417,7 @@ DESCR("variable-length string, stored compressed");
 #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
 
index 03d13e3d4ed2548fb179c45b011cdcbbee139280..274f8f959d86edde2e4ff9e3bf62ce9c4aadbccf 100644 (file)
@@ -11,7 +11,7 @@
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -185,6 +185,7 @@ extern struct varlena * pg_detoast_datum_copy(struct varlena * datum);
 
 /* 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)
index db772d6ecf2b69538fa88f20b192893127defa4d..9b19a3ae85cbb493d691d740c6bccc98784611f9 100644 (file)
@@ -7,7 +7,7 @@
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -400,32 +400,32 @@ extern Datum bpchar(PG_FUNCTION_ARGS);
 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);
@@ -447,9 +447,9 @@ extern Datum name_text(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);
@@ -527,43 +527,43 @@ extern Datum macaddr_manuf(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);