aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/main/main.c3
-rw-r--r--src/backend/port/Makefile.in3
-rw-r--r--src/backend/utils/adt/cash.c729
-rw-r--r--src/include/catalog/pg_aggregate.h12
-rw-r--r--src/include/catalog/pg_operator.h49
-rw-r--r--src/include/catalog/pg_proc.h22
-rw-r--r--src/include/catalog/pg_type.h29
-rw-r--r--src/include/utils/builtins.h3
-rw-r--r--src/include/utils/cash.h41
9 files changed, 592 insertions, 299 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 5803f9dd3ba..7887aff3f1c 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.5 1997/04/12 09:37:31 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.6 1997/04/15 17:39:17 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -38,6 +38,7 @@ main(int argc, char *argv[])
#ifdef USE_LOCALE
setlocale(LC_CTYPE,""); /* take locale information from an environment */
setlocale(LC_COLLATE,"");
+ setlocale(LC_MONETARY,"");
#endif
#if defined(NOFIXADE) || defined(NOPRINTADE)
/*
diff --git a/src/backend/port/Makefile.in b/src/backend/port/Makefile.in
index a2d23188cef..e7e7e49a413 100644
--- a/src/backend/port/Makefile.in
+++ b/src/backend/port/Makefile.in
@@ -19,10 +19,11 @@
# be converted to Method 2.
#
# IDENTIFICATION
-# $Header: /cvsroot/pgsql/src/backend/port/Attic/Makefile.in,v 1.3 1997/03/19 02:33:29 scrappy Exp $
+# $Header: /cvsroot/pgsql/src/backend/port/Attic/Makefile.in,v 1.4 1997/04/15 17:39:23 scrappy Exp $
#
#-------------------------------------------------------------------------
+SRCDIR=../..
include ../../Makefile.global
ifndef PORTNAME
diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c
index 5ef92c295b4..7f6323a7ae7 100644
--- a/src/backend/utils/adt/cash.c
+++ b/src/backend/utils/adt/cash.c
@@ -1,274 +1,521 @@
/*
-cash.c
-Written by D'Arcy J.M. Cain
+ * cash.c
+ * Written by D'Arcy J.M. Cain
+ *
+ * Functions to allow input and output of money normally but store
+ * and handle it as longs
+ *
+ * A slightly modified version of this file and a discussion of the
+ * workings can be found in the book "Software Solutions in C" by
+ * Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
+ *
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.4 1997/04/15 17:39:44 scrappy Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <locale.h>
+
+#include "postgres.h"
+#include "miscadmin.h"
+#include "utils/builtins.h"
+#include "utils/cash.h"
-Functions to allow input and output of money normally but store
-and handle it as longs
-
-Set tabstops to 4 for best results
+/* when we go to 64 bit values we will have to modify this */
+#define CASH_BUFSZ 24
+
+#define TERMINATOR (CASH_BUFSZ - 1)
+#define LAST_PAREN (TERMINATOR - 1)
+#define LAST_DIGIT (LAST_PAREN - 1)
+
+#ifdef USE_LOCALE
+static struct lconv *lconv = NULL;
+#endif
+
+/* cash_in()
+ * Convert a string to a cash data type.
+ * Format is [$]###[,]###[.##]
+ * Examples: 123.45 $123.45 $123,456.78
+ *
+ * This is currently implemented as a 32-bit integer.
+ * XXX HACK It looks as though some of the symbols for
+ * monetary values returned by localeconv() can be multiple
+ * bytes/characters. This code assumes one byte only. - tgl 97/04/14
+ */
+Cash *
+cash_in(const char *str)
+{
+ Cash *result;
+
+ Cash value = 0;
+ Cash dec = 0;
+ Cash sgn = 1;
+ int seen_dot = 0;
+ const char *s = str;
+ int fpoint;
+ char dsymbol, ssymbol, psymbol, nsymbol, csymbol;
+
+#ifdef USE_LOCALE
+ if (lconv == NULL) *lconv = localeconv();
+
+ /* frac_digits in the C locale seems to return CHAR_MAX */
+ /* best guess is 2 in this case I think */
+ fpoint = ((lconv->frac_digits != CHAR_MAX)? lconv->frac_digits: 2); /* int_frac_digits? */
+
+ dsymbol = *lconv->mon_decimal_point;
+ ssymbol = *lconv->mon_thousands_sep;
+ csymbol = *lconv->currency_symbol;
+ psymbol = *lconv->positive_sign;
+ nsymbol = *lconv->negative_sign;
+#else
+ fpoint = 2;
+ dsymbol = '.';
+ ssymbol = ',';
+ csymbol = '$';
+ psymbol = '+';
+ nsymbol = '-';
+#endif
+
+ /* we need to add all sorts of checking here. For now just */
+ /* strip all leading whitespace and any leading dollar sign */
+ while (isspace(*s) || *s == csymbol) s++;
+
+ /* a leading minus or paren signifies a negative number */
+ /* again, better heuristics needed */
+ if (*s == nsymbol || *s == '(') {
+ sgn = -1;
+ s++;
+
+ } else if (*s == psymbol) {
+ s++;
+ }
+
+ while (isspace(*s) || *s == csymbol) s++;
+
+ for (; ; s++) {
+ /* we look for digits as long as we have less */
+ /* than the required number of decimal places */
+ if (isdigit(*s) && dec < fpoint) {
+ value = (value * 10) + *s - '0';
+
+ if (seen_dot)
+ dec++;
+
+ /* decimal point? then start counting fractions... */
+ } else if (*s == dsymbol && !seen_dot) {
+ seen_dot = 1;
+
+ /* "thousands" separator? then skip... */
+ } else if (*s == ssymbol) {
+
+ } else {
+ /* round off */
+ if (isdigit(*s) && *s >= '5')
+ value++;
+
+ /* adjust for less than required decimal places */
+ for (; dec < fpoint; dec++)
+ value *= 10;
+
+ break;
+ }
+ }
-A slightly modified version of this file and a discussion of the
-workings can be found in the book "Software Solutions in C" by
-Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
+ while (isspace(*s) || *s == ')') s++;
- $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.3 1997/04/10 20:51:13 scrappy Exp $
-*/
+ if (*s != '\0')
+ elog(WARN,"Bad money external representation %s",str);
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include <ctype.h>
-#include <locale.h>
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't input cash '%s'",str);
-#include <utils/cash.h>
+ *result = (value * sgn);
-/* when we go to 64 bit values we will have to modify this */
-#define CASH_BUFSZ 24
+ return(result);
+} /* cash_in() */
-#define TERMINATOR (CASH_BUFSZ - 1)
-#define LAST_PAREN (TERMINATOR - 1)
-#define LAST_DIGIT (LAST_PAREN - 1)
-/* function to convert a long to a dollars and cents representation */
+/* cash_out()
+ * Function to convert cash to a dollars and cents representation.
+ * XXX HACK This code appears to assume US conventions for
+ * positive-valued amounts. - tgl 97/04/14
+ */
const char *
-cash_out(long value)
+cash_out(Cash *value)
{
- char *retbuf, buf[CASH_BUFSZ];
- struct lconv *lc = localeconv();
- int mod_group = *lc->mon_grouping;
- int comma = *lc->mon_thousands_sep;
- int points = lc->frac_digits; /* int_frac_digits? */
- int minus = 0;
- int count = LAST_DIGIT;
- int point_pos;
- int comma_position = 0;
-
- /* frac_digits in the C locale seems to return CHAR_MAX */
- /* best guess is 2 in this case I think */
- if (points == CHAR_MAX)
- points = 2;
-
- point_pos = LAST_DIGIT - points;
-
- /* We're playing a little fast and loose with this. Shoot me. */
- if (!mod_group || mod_group == CHAR_MAX)
- mod_group = 3;
-
- /* allow more than three decimal points and separate them */
- if (comma)
- {
- point_pos -= (points - 1)/mod_group;
- comma_position = point_pos % (mod_group + 1);
- }
+ char *result;
+ char buf[CASH_BUFSZ];
+ int minus = 0;
+ int count = LAST_DIGIT;
+ int point_pos;
+ int comma_position = 0;
+ char mon_group, comma, points;
+ char csymbol, dsymbol, *nsymbol;
+ char convention;
+
+#ifdef USE_LOCALE
+ if (lconv == NULL) *lconv = localeconv();
+
+ mon_group = *lconv->mon_grouping;
+ comma = *lconv->mon_thousands_sep;
+ csymbol = *lconv->currency_symbol;
+ dsymbol = *lconv->mon_decimal_point;
+ nsymbol = lconv->negative_sign;
+ /* frac_digits in the C locale seems to return CHAR_MAX */
+ /* best guess is 2 in this case I think */
+ points = ((lconv->frac_digits != CHAR_MAX)? lconv->frac_digits: 2); /* int_frac_digits? */
+ convention = lconv->n_sign_posn;
+#else
+ mon_group = 3;
+ comma = ',';
+ csymbol = '$';
+ dsymbol = '.';
+ nsymbol = "-";
+ points = 2;
+ convention = 0;
+#endif
+
+ point_pos = LAST_DIGIT - points;
+
+ /* We're playing a little fast and loose with this. Shoot me. */
+ if (!mon_group || mon_group == CHAR_MAX)
+ mon_group = 3;
+
+ /* allow more than three decimal points and separate them */
+ if (comma) {
+ point_pos -= (points - 1)/mon_group;
+ comma_position = point_pos % (mon_group + 1);
+ }
+
+ /* we work with positive amounts and add the minus sign at the end */
+ if (*value < 0) {
+ minus = 1;
+ *value *= -1;
+ }
+
+ /* allow for trailing negative strings */
+ memset(buf, ' ', CASH_BUFSZ);
+ buf[TERMINATOR] = buf[LAST_PAREN] = '\0';
+
+ while (*value || count > (point_pos - 2)) {
+ if (points && count == point_pos)
+ buf[count--] = dsymbol;
+ else if (comma && count % (mon_group + 1) == comma_position)
+ buf[count--] = comma;
+
+ buf[count--] = (*value % 10) + '0';
+ *value /= 10;
+ }
+
+ buf[count] = csymbol;
+
+ if (buf[LAST_DIGIT] == ',')
+ buf[LAST_DIGIT] = buf[LAST_PAREN];
+
+ /* see if we need to signify negative amount */
+ if (minus) {
+ if (!PointerIsValid(result = PALLOC(CASH_BUFSZ + 2 - count + strlen(nsymbol))))
+ elog(WARN,"Memory allocation failed, can't output cash",NULL);
+
+ /* Position code of 0 means use parens */
+ if (convention == 0)
+ sprintf(result, "(%s)", buf + count);
+ else if (convention == 2)
+ sprintf(result, "%s%s", buf + count, nsymbol);
+ else
+ sprintf(result, "%s%s", nsymbol, buf + count);
+ } else {
+ if (!PointerIsValid(result = PALLOC(CASH_BUFSZ + 2 - count)))
+ elog(WARN,"Memory allocation failed, can't output cash",NULL);
- /* we work with positive amounts and add the minus sign at the end */
- if (value < 0)
- {
- minus = 1;
- value *= -1;
- }
+ strcpy(result, buf + count);
+ }
- /* allow for trailing negative strings */
- memset(buf, ' ', CASH_BUFSZ);
- buf[TERMINATOR] = buf[LAST_PAREN] = 0;
+ return(result);
+} /* cash_out() */
- while (value || count > (point_pos - 2))
- {
- if (points && count == point_pos)
- buf[count--] = *lc->decimal_point;
- else if (comma && count % (mod_group + 1) == comma_position)
- buf[count--] = comma;
- buf[count--] = (value % 10) + '0';
- value /= 10;
- }
+bool
+cash_eq(Cash *c1, Cash *c2)
+{
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
- if (buf[LAST_DIGIT] == ',')
- buf[LAST_DIGIT] = buf[LAST_PAREN];
-
- /* see if we need to signify negative amount */
- if (minus)
- {
- retbuf = palloc(CASH_BUFSZ + 2 - count + strlen(lc->negative_sign));
-
- /* Position code of 0 means use parens */
- if (!lc->n_sign_posn)
- sprintf(retbuf, "(%s)", buf + count);
- else if (lc->n_sign_posn == 2)
- sprintf(retbuf, "%s%s", buf + count, lc->negative_sign);
- else
- sprintf(retbuf, "%s%s", lc->negative_sign, buf + count);
- }
- else
- {
- retbuf = palloc(CASH_BUFSZ + 2 - count);
- strcpy(retbuf, buf + count);
- }
+ return(*c1 == *c2);
+} /* cash_eq() */
+
+bool
+cash_ne(Cash *c1, Cash *c2)
+{
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
- return retbuf;
-}
+ return(*c1 != *c2);
+} /* cash_ne() */
-/* convert a string to a long integer */
-long
-cash_in(const char *s)
+bool
+cash_lt(Cash *c1, Cash *c2)
{
- long value = 0;
- long dec = 0;
- long sgn = 1;
- int seen_dot = 0;
- struct lconv *lc = localeconv();
- int fpoint = lc->frac_digits; /* int_frac_digits? */
-
- /* we need to add all sorts of checking here. For now just */
- /* strip all leading whitespace and any leading dollar sign */
- while (isspace(*s) || *s == '$')
- s++;
-
- /* a leading minus or paren signifies a negative number */
- /* again, better heuristics needed */
- if (*s == '-' || *s == '(')
- {
- sgn = -1;
- s++;
- }
- else if (*s == '+')
- s++;
-
- /* frac_digits in the C locale seems to return CHAR_MAX */
- /* best guess is 2 in this case I think */
- if (fpoint == CHAR_MAX)
- fpoint = 2;
-
- for (; ; s++)
- {
- /* we look for digits as long as we have less */
- /* than the required number of decimal places */
- if (isdigit(*s) && dec < fpoint)
- {
- value = (value * 10) + *s - '0';
-
- if (seen_dot)
- dec++;
- }
- else if (*s == *lc->decimal_point && !seen_dot)
- seen_dot = 1;
- else
- {
- /* round off */
- if (isdigit(*s) && *s >= '5')
- value++;
-
- /* adjust for less than required decimal places */
- for (; dec < fpoint; dec++)
- value *= 10;
-
- return(value * sgn);
- }
- }
-}
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
+ return(*c1 < *c2);
+} /* cash_lt() */
-/* used by cash_words_out() below */
-static const char *
-num_word(int value)
+bool
+cash_le(Cash *c1, Cash *c2)
{
- static char buf[128];
- static const char *small[] = {
- "zero", "one", "two", "three", "four", "five", "six", "seven",
- "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
- "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty",
- "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"
- };
- const char **big = small + 18;
- int tu = value % 100;
-
- /* deal with the simple cases first */
- if (value <= 20)
- return(small[value]);
-
- /* is it an even multiple of 100? */
- if (!tu)
- {
- sprintf(buf, "%s hundred", small[value/100]);
- return(buf);
- }
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
- /* more than 99? */
- if (value > 99)
- {
- /* is it an even multiple of 10 other than 10? */
- if (value % 10 == 0 && tu > 10)
- sprintf(buf, "%s hundred %s",
- small[value/100], big[tu/10]);
- else if (tu < 20)
- sprintf(buf, "%s hundred and %s",
- small[value/100], small[tu]);
- else
- sprintf(buf, "%s hundred %s %s",
- small[value/100], big[tu/10], small[tu % 10]);
- }
- else
- {
- /* is it an even multiple of 10 other than 10? */
- if (value % 10 == 0 && tu > 10)
- sprintf(buf, "%s", big[tu/10]);
- else if (tu < 20)
- sprintf(buf, "%s", small[tu]);
- else
- sprintf(buf, "%s %s", big[tu/10], small[tu % 10]);
- }
+ return(*c1 <= *c2);
+} /* cash_le() */
- return(buf);
-}
+bool
+cash_gt(Cash *c1, Cash *c2)
+{
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
-/* this converts a long as well but to a representation using words */
-/* obviously way North American centric - sorry */
-const char *
-cash_words_out(long value)
+ return(*c1 > *c2);
+} /* cash_gt() */
+
+bool
+cash_ge(Cash *c1, Cash *c2)
{
- static char buf[128];
- char *p = buf;
- long m0;
- long m1;
- long m2;
- long m3;
-
- /* work with positive numbers */
- if (value < 0)
- {
- value *= -1;
- strcpy(buf, "minus ");
- p += 6;
- }
- else
- *buf = 0;
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(FALSE);
- m0 = value % 100; /* cents */
- m1 = (value/100) % 1000; /* hundreds */
- m2 = (value/100000) % 1000; /* thousands */
- m3 = value/100000000 % 1000; /* millions */
+ return(*c1 >= *c2);
+} /* cash_ge() */
- if (m3)
- {
- strcat(buf, num_word(m3));
- strcat(buf, " million ");
- }
- if (m2)
- {
- strcat(buf, num_word(m2));
- strcat(buf, " thousand ");
- }
+/* cash_pl()
+ * Add two cash values.
+ */
+Cash *
+cash_pl(Cash *c1, Cash *c2)
+{
+ Cash *result;
+
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(NULL);
+
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't add cash",NULL);
+
+ *result = (*c1 + *c2);
+
+ return(result);
+} /* cash_pl() */
+
+
+/* cash_mi()
+ * Subtract two cash values.
+ */
+Cash *
+cash_mi(Cash *c1, Cash *c2)
+{
+ Cash *result;
+
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(NULL);
- if (m1)
- strcat(buf, num_word(m1));
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't subtract cash",NULL);
- if (!*p)
- strcat(buf, "zero");
+ *result = (*c1 - *c2);
- strcat(buf, (int)(value/100) == 1 ? " dollar and " : " dollars and ");
- strcat(buf, num_word(m0));
- strcat(buf, m0 == 1 ? " cent" : " cents");
- *buf = toupper(*buf);
+ return(result);
+} /* cash_mi() */
+
+
+/* cash_mul()
+ * Multiply cash by floating point number.
+ */
+Cash *
+cash_mul(Cash *c, float8 *f)
+{
+ Cash *result;
+
+ if (!PointerIsValid(f) || !PointerIsValid(c))
+ return(NULL);
+
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't multiply cash",NULL);
+
+ *result = ((*f) * (*c));
+
+ return(result);
+} /* cash_mul() */
+
+
+/* cash_div()
+ * Divide cash by floating point number.
+ *
+ * XXX Don't know if rounding or truncating is correct behavior.
+ * Round for now. - tgl 97/04/15
+ */
+Cash *
+cash_div(Cash *c, float8 *f)
+{
+ Cash *result;
+
+ if (!PointerIsValid(f) || !PointerIsValid(c))
+ return(NULL);
+
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't divide cash",NULL);
+
+ *result = rint(*c / *f);
+
+ return(result);
+} /* cash_div() */
+
+
+/* cashlarger()
+ * Return larger of two cash values.
+ */
+Cash *
+cashlarger(Cash *c1, Cash *c2)
+{
+ Cash *result;
+
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(NULL);
+
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't return larger cash",NULL);
+
+ *result = ((*c1 > *c2)? *c1: *c2);
+
+ return(result);
+} /* cashlarger() */
+
+
+/* cashsmaller()
+ * Return smaller of two cash values.
+ */
+Cash *
+cashsmaller(Cash *c1, Cash *c2)
+{
+ Cash *result;
+
+ if (!PointerIsValid(c1) || !PointerIsValid(c2))
+ return(NULL);
+
+ if (!PointerIsValid(result = PALLOCTYPE(Cash)))
+ elog(WARN,"Memory allocation failed, can't return smaller cash",NULL);
+
+ *result = ((*c1 < *c2)? *c1: *c2);
+
+ return(result);
+} /* cashsmaller() */
+
+
+/* cash_words_out()
+ * This converts a long as well but to a representation using words
+ * Obviously way North American centric - sorry
+ */
+const char *
+cash_words_out(Cash *value)
+{
+ static char buf[128];
+ char *p = buf;
+ Cash m0;
+ Cash m1;
+ Cash m2;
+ Cash m3;
+
+ /* work with positive numbers */
+ if (*value < 0) {
+ *value *= -1;
+ strcpy(buf, "minus ");
+ p += 6;
+ } else {
+ *buf = 0;
+ }
+
+ m0 = *value % 100; /* cents */
+ m1 = (*value/100) % 1000; /* hundreds */
+ m2 = (*value/100000) % 1000; /* thousands */
+ m3 = *value/100000000 % 1000; /* millions */
+
+ if (m3) {
+ strcat(buf, num_word(m3));
+ strcat(buf, " million ");
+ }
+
+ if (m2) {
+ strcat(buf, num_word(m2));
+ strcat(buf, " thousand ");
+ }
+
+ if (m1)
+ strcat(buf, num_word(m1));
+
+ if (!*p)
+ strcat(buf, "zero");
+
+ strcat(buf, (int)(*value/100) == 1 ? " dollar and " : " dollars and ");
+ strcat(buf, num_word(m0));
+ strcat(buf, m0 == 1 ? " cent" : " cents");
+ *buf = toupper(*buf);
+ return(buf);
+} /* cash_words_out() */
+
+
+/*************************************************************************
+ * Private routines
+ ************************************************************************/
+
+static const char *
+num_word(Cash value)
+{
+ static char buf[128];
+ static const char *small[] = {
+ "zero", "one", "two", "three", "four", "five", "six", "seven",
+ "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
+ "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty",
+ "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"
+ };
+ const char **big = small + 18;
+ int tu = value % 100;
+
+ /* deal with the simple cases first */
+ if (value <= 20)
+ return(small[value]);
+
+ /* is it an even multiple of 100? */
+ if (!tu) {
+ sprintf(buf, "%s hundred", small[value/100]);
return(buf);
-}
+ }
+
+ /* more than 99? */
+ if (value > 99) {
+ /* is it an even multiple of 10 other than 10? */
+ if (value % 10 == 0 && tu > 10)
+ sprintf(buf, "%s hundred %s",
+ small[value/100], big[tu/10]);
+ else if (tu < 20)
+ sprintf(buf, "%s hundred and %s",
+ small[value/100], small[tu]);
+ else
+ sprintf(buf, "%s hundred %s %s",
+ small[value/100], big[tu/10], small[tu % 10]);
+
+ } else {
+ /* is it an even multiple of 10 other than 10? */
+ if (value % 10 == 0 && tu > 10)
+ sprintf(buf, "%s", big[tu/10]);
+ else if (tu < 20)
+ sprintf(buf, "%s", small[tu]);
+ else
+ sprintf(buf, "%s %s", big[tu/10], small[tu % 10]);
+ }
+
+ return(buf);
+} /* num_word() */
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index dcf7a79df63..69eb5d186ed 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_aggregate.h,v 1.5 1997/04/03 19:56:19 scrappy Exp $
+ * $Id: pg_aggregate.h,v 1.6 1997/04/15 17:40:19 scrappy Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@@ -35,9 +35,9 @@
* aggtransfn2 transition function 2
* aggfinalfn final function
* aggbasetype type of data on which aggregate operates
- * aggtranstype1 output types for xition func 1
- * aggtranstype2 output types for xition func 2
- * aggfinaltype output type for final func
+ * aggtranstype1 output types for transition func 1
+ * aggtranstype2 output types for transition func 2
+ * aggfinaltype output type for final function
* agginitval1 initial aggregate value
* agginitval2 initial value for transition state 2
* ----------------------------------------------------------------
@@ -91,11 +91,13 @@ DATA(insert OID = 0 ( avg PGUID int4pl int4inc int4div 23 23 23
DATA(insert OID = 0 ( avg PGUID int2pl int2inc int2div 21 21 21 21 _null_ 0 ));
DATA(insert OID = 0 ( avg PGUID float4pl float4inc float4div 700 700 700 700 _null_ 0.0 ));
DATA(insert OID = 0 ( avg PGUID float8pl float8inc float8div 701 701 701 701 _null_ 0.0 ));
+DATA(insert OID = 0 ( avg PGUID cash_pl float8inc cash_div 790 790 701 790 _null_ 0.0 ));
DATA(insert OID = 0 ( sum PGUID int4pl - - 23 23 0 23 _null_ _null_ ));
DATA(insert OID = 0 ( sum PGUID int2pl - - 21 21 0 21 _null_ _null_ ));
DATA(insert OID = 0 ( sum PGUID float4pl - - 700 700 0 700 _null_ _null_ ));
DATA(insert OID = 0 ( sum PGUID float8pl - - 701 701 0 701 _null_ _null_ ));
+DATA(insert OID = 0 ( sum PGUID cash_pl - - 790 790 0 790 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID int4larger - - 23 23 0 23 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID int2larger - - 21 21 0 21 _null_ _null_ ));
@@ -104,6 +106,7 @@ DATA(insert OID = 0 ( max PGUID float8larger - - 701 701 0 701 _null_ _nul
DATA(insert OID = 0 ( max PGUID int4larger - - 702 702 0 702 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID date_larger - - 1082 1082 0 1082 _null_ _null_ ));
DATA(insert OID = 0 ( max PGUID float8larger - - 1084 1084 0 1084 _null_ _null_ ));
+DATA(insert OID = 0 ( max PGUID cashlarger - - 790 790 0 790 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID int4smaller - - 23 23 0 23 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID int2smaller - - 21 21 0 21 _null_ _null_ ));
@@ -112,6 +115,7 @@ DATA(insert OID = 0 ( min PGUID float8smaller - - 701 701 0 701 _null_ _nul
DATA(insert OID = 0 ( min PGUID int4smaller - - 702 702 0 702 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID date_smaller - - 1082 1082 0 1082 _null_ _null_ ));
DATA(insert OID = 0 ( min PGUID float8smaller - - 1084 1084 0 1084 _null_ _null_ ));
+DATA(insert OID = 0 ( min PGUID cashsmaller - - 790 790 0 790 _null_ _null_ ));
DATA(insert OID = 0 ( count PGUID - int4inc - 0 0 23 23 _null_ 0 ));
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index 04e826b0f2c..fa8a4806873 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_operator.h,v 1.7 1997/04/02 18:36:12 scrappy Exp $
+ * $Id: pg_operator.h,v 1.8 1997/04/15 17:40:44 scrappy Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@@ -353,6 +353,17 @@ DATA(insert OID = 841 ( "!~" PGUID 0 b t f 409 25 16 0 839 0 0 char2re
DATA(insert OID = 840 ( "~" PGUID 0 b t f 410 25 16 0 842 0 0 char4regexeq eqsel eqjoinsel ));
DATA(insert OID = 842 ( "!~" PGUID 0 b t f 410 25 16 0 840 0 0 char4regexne neqsel neqjoinsel ));
+DATA(insert OID = 900 ( "=" PGUID 0 b t t 790 790 16 900 901 902 902 cash_eq eqsel eqjoinsel ));
+DATA(insert OID = 901 ( "<>" PGUID 0 b t f 790 790 16 901 900 0 0 cash_ne neqsel neqjoinsel ));
+DATA(insert OID = 902 ( "<" PGUID 0 b t f 790 790 16 903 905 0 0 cash_lt intltsel intltjoinsel ));
+DATA(insert OID = 903 ( ">" PGUID 0 b t f 790 790 16 902 904 0 0 cash_gt intgtsel intgtjoinsel ));
+DATA(insert OID = 904 ( "<=" PGUID 0 b t f 790 790 16 905 903 0 0 cash_le intltsel intltjoinsel ));
+DATA(insert OID = 905 ( ">=" PGUID 0 b t f 790 790 16 904 902 0 0 cash_ge intgtsel intgtjoinsel ));
+DATA(insert OID = 906 ( "+" PGUID 0 b t f 790 790 790 906 0 0 0 cash_pl - - ));
+DATA(insert OID = 907 ( "-" PGUID 0 b t f 790 790 790 0 0 0 0 cash_mi - - ));
+DATA(insert OID = 908 ( "*" PGUID 0 b t f 790 701 790 909 0 0 0 cash_mul - - ));
+DATA(insert OID = 909 ( "/" PGUID 0 b t f 790 701 790 0 0 0 0 cash_div - - ));
+
DATA(insert OID = 930 ( "<" PGUID 0 b t f 910 910 16 934 933 0 0 oidint4lt intltsel intltjoinsel ));
DATA(insert OID = 931 ( "<=" PGUID 0 b t f 910 910 16 933 934 0 0 oidint4le intltsel intltjoinsel ));
DATA(insert OID = 932 ( "=" PGUID 0 b t f 910 910 16 932 935 0 0 oidint4eq intltsel intltjoinsel ));
@@ -360,28 +371,28 @@ DATA(insert OID = 933 ( ">=" PGUID 0 b t f 910 910 16 931 930 0 0 oidi
DATA(insert OID = 934 ( ">" PGUID 0 b t f 910 910 16 930 931 0 0 oidint4gt intltsel intltjoinsel ));
DATA(insert OID = 935 ( "<>" PGUID 0 b t f 910 910 16 935 932 0 0 oidint4ne intltsel intltjoinsel ));
-DATA(insert OID = 965 ( "^" PGUID 0 b t f 701 701 701 0 0 0 0 dpow - - ));
+DATA(insert OID = 965 ( "^" PGUID 0 b t f 701 701 701 0 0 0 0 dpow - - ));
DATA(insert OID = 966 ( "+" PGUID 0 b t f 1034 1033 1034 0 0 0 0 aclinsert intltsel intltjoinsel ));
DATA(insert OID = 967 ( "-" PGUID 0 b t f 1034 1033 1034 0 0 0 0 aclremove intltsel intltjoinsel ));
DATA(insert OID = 968 ( "~" PGUID 0 b t f 1034 1033 16 0 0 0 0 aclcontains intltsel intltjoinsel ));
-DATA(insert OID = 1054 ( "=" PGUID 0 b t t 1042 1042 16 1054 1057 1058 1058 bpchareq eqsel eqjoinsel ));
-DATA(insert OID = 1055 ( "~" PGUID 0 b t f 1042 25 16 0 1056 0 0 textregexeq eqsel eqjoinsel ));
-DATA(insert OID = 1056 ( "!~" PGUID 0 b t f 1042 25 16 0 1055 0 0 textregexne neqsel neqjoinsel ));
-DATA(insert OID = 1057 ( "<>" PGUID 0 b t f 1042 1042 16 1057 1054 0 0 bpcharne neqsel neqjoinsel ));
-DATA(insert OID = 1058 ( "<" PGUID 0 b t f 1042 1042 16 1060 1061 0 0 bpcharlt intltsel intltjoinsel ));
-DATA(insert OID = 1059 ( "<=" PGUID 0 b t f 1042 1042 16 1061 1060 0 0 bpcharle intltsel intltjoinsel ));
-DATA(insert OID = 1060 ( ">" PGUID 0 b t f 1042 1042 16 1058 1059 0 0 bpchargt intltsel intltjoinsel ));
-DATA(insert OID = 1061 ( ">=" PGUID 0 b t f 1042 1042 16 1059 1058 0 0 bpcharge intltsel intltjoinsel ));
-
-DATA(insert OID = 1062 ( "=" PGUID 0 b t t 1043 1043 16 1062 1065 1066 1066 varchareq eqsel eqjoinsel ));
-DATA(insert OID = 1063 ( "~" PGUID 0 b t f 1043 25 16 0 1064 0 0 textregexeq eqsel eqjoinsel ));
-DATA(insert OID = 1064 ( "!~" PGUID 0 b t f 1043 25 16 0 1063 0 0 textregexne neqsel neqjoinsel ));
-DATA(insert OID = 1065 ( "<>" PGUID 0 b t f 1043 1043 16 1065 1062 0 0 varcharne neqsel neqjoinsel ));
-DATA(insert OID = 1066 ( "<" PGUID 0 b t f 1043 1043 16 1068 1069 0 0 varcharlt intltsel intltjoinsel ));
-DATA(insert OID = 1067 ( "<=" PGUID 0 b t f 1043 1043 16 1069 1068 0 0 varcharle intltsel intltjoinsel ));
-DATA(insert OID = 1068 ( ">" PGUID 0 b t f 1043 1043 16 1066 1067 0 0 varchargt intltsel intltjoinsel ));
-DATA(insert OID = 1069 ( ">=" PGUID 0 b t f 1043 1043 16 1067 1066 0 0 varcharge intltsel intltjoinsel ));
+DATA(insert OID = 1054 ( "=" PGUID 0 b t t 1042 1042 16 1054 1057 1058 1058 bpchareq eqsel eqjoinsel ));
+DATA(insert OID = 1055 ( "~" PGUID 0 b t f 1042 25 16 0 1056 0 0 textregexeq eqsel eqjoinsel ));
+DATA(insert OID = 1056 ( "!~" PGUID 0 b t f 1042 25 16 0 1055 0 0 textregexne neqsel neqjoinsel ));
+DATA(insert OID = 1057 ( "<>" PGUID 0 b t f 1042 1042 16 1057 1054 0 0 bpcharne neqsel neqjoinsel ));
+DATA(insert OID = 1058 ( "<" PGUID 0 b t f 1042 1042 16 1060 1061 0 0 bpcharlt intltsel intltjoinsel ));
+DATA(insert OID = 1059 ( "<=" PGUID 0 b t f 1042 1042 16 1061 1060 0 0 bpcharle intltsel intltjoinsel ));
+DATA(insert OID = 1060 ( ">" PGUID 0 b t f 1042 1042 16 1058 1059 0 0 bpchargt intltsel intltjoinsel ));
+DATA(insert OID = 1061 ( ">=" PGUID 0 b t f 1042 1042 16 1059 1058 0 0 bpcharge intltsel intltjoinsel ));
+
+DATA(insert OID = 1062 ( "=" PGUID 0 b t t 1043 1043 16 1062 1065 1066 1066 varchareq eqsel eqjoinsel ));
+DATA(insert OID = 1063 ( "~" PGUID 0 b t f 1043 25 16 0 1064 0 0 textregexeq eqsel eqjoinsel ));
+DATA(insert OID = 1064 ( "!~" PGUID 0 b t f 1043 25 16 0 1063 0 0 textregexne neqsel neqjoinsel ));
+DATA(insert OID = 1065 ( "<>" PGUID 0 b t f 1043 1043 16 1065 1062 0 0 varcharne neqsel neqjoinsel ));
+DATA(insert OID = 1066 ( "<" PGUID 0 b t f 1043 1043 16 1068 1069 0 0 varcharlt intltsel intltjoinsel ));
+DATA(insert OID = 1067 ( "<=" PGUID 0 b t f 1043 1043 16 1069 1068 0 0 varcharle intltsel intltjoinsel ));
+DATA(insert OID = 1068 ( ">" PGUID 0 b t f 1043 1043 16 1066 1067 0 0 varchargt intltsel intltjoinsel ));
+DATA(insert OID = 1069 ( ">=" PGUID 0 b t f 1043 1043 16 1067 1066 0 0 varcharge intltsel intltjoinsel ));
/* date operators */
DATA(insert OID = 1093 ( "=" PGUID 0 b t t 1082 1082 16 1093 1094 1095 1095 date_eq eqsel eqjoinsel ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index e8db3a263eb..bd1cf4f208b 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_proc.h,v 1.16 1997/04/02 18:36:24 scrappy Exp $
+ * $Id: pg_proc.h,v 1.17 1997/04/15 17:41:03 scrappy Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
@@ -618,6 +618,21 @@ DATA(insert OID = 859 ( namenlike PGUID 11 f t f 2 f 16 "19 25" 100 0 0
DATA(insert OID = 860 ( char16like PGUID 11 f t f 2 f 16 "20 25" 100 0 0 100 foo bar ));
DATA(insert OID = 861 ( char16nlike PGUID 11 f t f 2 f 16 "20 25" 100 0 0 100 foo bar ));
+DATA(insert OID = 886 ( cash_in PGUID 11 f t f 1 f 790 "0" 100 0 0 100 foo bar ));
+DATA(insert OID = 887 ( cash_out PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
+DATA(insert OID = 888 ( cash_eq PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 889 ( cash_ne PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 890 ( cash_lt PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 891 ( cash_le PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 892 ( cash_gt PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 893 ( cash_ge PGUID 11 f t f 2 f 16 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 894 ( cash_pl PGUID 11 f t f 2 f 790 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 895 ( cash_mi PGUID 11 f t f 2 f 790 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 896 ( cash_mul PGUID 11 f t f 2 f 790 "790 701" 100 0 0 100 foo bar ));
+DATA(insert OID = 897 ( cash_div PGUID 11 f t f 2 f 790 "790 701" 100 0 0 100 foo bar ));
+DATA(insert OID = 898 ( cashlarger PGUID 11 f t f 2 f 790 "790 790" 100 0 0 100 foo bar ));
+DATA(insert OID = 899 ( cashsmaller PGUID 11 f t f 2 f 790 "790 790" 100 0 0 100 foo bar ));
+
/* OIDS 900 - 999 */
DATA(insert OID = 920 ( oidint4in PGUID 11 f t f 1 f 910 "0" 100 0 0 100 foo bar));
@@ -790,6 +805,7 @@ DATA(insert OID = 1193 ( timespan_text PGUID 11 f t f 1 f 1186 "25" 100 0
DATA(insert OID = 1194 ( timespan_reltime PGUID 11 f t f 1 f 703 "1186" 100 0 0 100 foo bar ));
/* reserve OIDs 1195-1199 for additional date/time conversion routines! tgl 97/03/19 */
+/* OIDS 1200 - 1299 */
DATA(insert OID = 1200 ( int42reltime PGUID 11 f t f 1 f 703 "21" 100 0 0 100 foo bar ));
DATA(insert OID = 1290 ( char2icregexeq PGUID 11 f t f 2 f 16 "409 25" 100 0 0 100 foo bar ));
@@ -808,6 +824,8 @@ DATA(insert OID = 1241 ( nameicregexne PGUID 11 f t f 2 f 16 "19 25" 100 0 0
DATA(insert OID = 1297 ( timestamp_in PGUID 11 f t f 1 f 1296 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 1298 ( timestamp_out PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 1299 ( now PGUID 11 f t f 0 f 1296 "0" 100 0 0 100 foo bar ));
+
+/* OIDS 1300 - 1399 */
DATA(insert OID = 1306 ( timestampeq PGUID 11 f t f 2 f 16 "1296 1296" 100 0 0 100 foo bar ));
DATA(insert OID = 1307 ( timestampne PGUID 11 f t f 2 f 16 "1296 1296" 100 0 0 100 foo bar ));
DATA(insert OID = 1308 ( timestamplt PGUID 11 f t f 2 f 16 "1296 1296" 100 0 0 100 foo bar ));
@@ -854,6 +872,7 @@ DATA(insert OID = 1391 ( isfinite PGUID 14 f t f 1 f 16 "1186" 100 0 0 10
DATA(insert OID = 1392 ( isfinite PGUID 14 f t f 1 f 16 "702" 100 0 0 100 "select abstime_finite($1)" - ));
/* reserve OIDs 1370-1399 for additional date/time conversion routines! tgl 97/04/01 */
+/* OIDS 1400 - 1499 */
DATA(insert OID = 1400 ( float PGUID 14 f t f 1 f 701 "701" 100 0 0 100 "select $1" - ));
DATA(insert OID = 1401 ( float PGUID 14 f t f 1 f 701 "700" 100 0 0 100 "select ftod($1)" - ));
DATA(insert OID = 1402 ( float4 PGUID 14 f t f 1 f 700 "700" 100 0 0 100 "select $1" - ));
@@ -861,7 +880,6 @@ DATA(insert OID = 1403 ( float4 PGUID 14 f t f 1 f 700 "701" 100 0 0 10
DATA(insert OID = 1404 ( int PGUID 14 f t f 1 f 23 "23" 100 0 0 100 "select $1" - ));
DATA(insert OID = 1405 ( int2 PGUID 14 f t f 1 f 21 "21" 100 0 0 100 "select $1" - ));
-/* reserve OIDs 1370-1399 for additional date/time conversion routines! tgl 97/04/01 */
/* Oracle Compatibility Related Functions - By Edmund Mergl <E.Mergl@bawue.de> */
DATA(insert OID = 870 ( lower PGUID 11 f t f 1 f 25 "25" 100 0 0 100 foo bar ));
DATA(insert OID = 871 ( upper PGUID 11 f t f 1 f 25 "25" 100 0 0 100 foo bar ));
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index ad400ed8db9..f5a59fffd42 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_type.h,v 1.9 1997/03/25 08:11:01 scrappy Exp $
+ * $Id: pg_type.h,v 1.10 1997/04/15 17:41:19 scrappy Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@@ -143,24 +143,20 @@ typedef TypeTupleFormData *TypeTupleForm;
/* OIDS 1 - 99 */
DATA(insert OID = 16 ( bool PGUID 1 1 t b t \054 0 0 boolin boolout boolin boolout c _null_ ));
-
#define BOOLOID 16
DATA(insert OID = 17 ( bytea PGUID -1 -1 f b t \054 0 18 byteain byteaout byteain byteaout i _null_ ));
DATA(insert OID = 18 ( char PGUID 1 1 t b t \054 0 0 charin charout charin charout c _null_ ));
#define CHAROID 18
-DATA(insert OID = 19 ( name PGUID NAMEDATALEN NAMEDATALEN f b t \054 0 18 namein nameout namein nameout d _null_ ));
+DATA(insert OID = 19 ( name PGUID NAMEDATALEN NAMEDATALEN f b t \054 0 18 namein nameout namein nameout d _null_ ));
#define NAMEOID 19
DATA(insert OID = 20 ( char16 PGUID 16 16 f b t \054 0 18 char16in char16out char16in char16out i _null_ ));
-/*DATA(insert OID = 20 ( dt PGUID 4 10 t b t \054 0 0 dtin dtout dtin dtout i _null_ )); */
DATA(insert OID = 21 ( int2 PGUID 2 5 t b t \054 0 0 int2in int2out int2in int2out s _null_ ));
-
#define INT2OID 21
DATA(insert OID = 22 ( int28 PGUID 16 50 f b t \054 0 21 int28in int28out int28in int28out i _null_ ));
-
/*
* XXX -- the implementation of int28's in postgres is a hack, and will
* go away someday. until that happens, there is a case (in the
@@ -168,12 +164,9 @@ DATA(insert OID = 22 ( int28 PGUID 16 50 f b t \054 0 21 int28in int28ou
* over piles of int28's on the sidewalk. in order to do so, we
* need the OID of the int28 row from pg_type.
*/
-
#define INT28OID 22
-
DATA(insert OID = 23 ( int4 PGUID 4 10 t b t \054 0 0 int4in int4out int4in int4out i _null_ ));
-
#define INT4OID 23
DATA(insert OID = 24 ( regproc PGUID 4 16 t b t \054 0 0 regprocin regprocout regprocin regprocout i _null_ ));
@@ -181,7 +174,6 @@ DATA(insert OID = 25 ( text PGUID -1 -1 f b t \054 0 18 textin textout
#define TEXTOID 25
DATA(insert OID = 26 ( oid PGUID 4 10 t b t \054 0 0 int4in int4out int4in int4out i _null_ ));
-
#define OIDOID 26
DATA(insert OID = 27 ( tid PGUID 6 19 f b t \054 0 0 tidin tidout tidin tidout i _null_ ));
@@ -232,21 +224,20 @@ DATA(insert OID = 605 ( filename PGUID 256 -1 f b t \054 0 18 filename_in file
/* OIDS 700 - 799 */
-#define FLOAT4OID 700
-
DATA(insert OID = 700 ( float4 PGUID 4 12 f b t \054 0 0 float4in float4out float4in float4out i _null_ ));
-
-
-#define FLOAT8OID 701
-
+#define FLOAT4OID 700
DATA(insert OID = 701 ( float8 PGUID 8 24 f b t \054 0 0 float8in float8out float8in float8out d _null_ ));
+#define FLOAT8OID 701
DATA(insert OID = 702 ( abstime PGUID 4 20 t b t \054 0 0 nabstimein nabstimeout nabstimein nabstimeout i _null_ ));
DATA(insert OID = 703 ( reltime PGUID 4 20 t b t \054 0 0 reltimein reltimeout reltimein reltimeout i _null_ ));
DATA(insert OID = 704 ( tinterval PGUID 12 47 f b t \054 0 0 tintervalin tintervalout tintervalin tintervalout i _null_ ));
DATA(insert OID = 705 ( unknown PGUID -1 -1 f b t \054 0 18 textin textout textin textout i _null_ ));
-
#define UNKNOWNOID 705
+DATA(insert OID = 790 ( money PGUID 4 47 f b t \054 0 0 cash_in cash_out cash_in cash_out i _null_ ));
+#define CASHOID 790
+DATA(insert OID = 791 ( _money PGUID -1 -1 f b t \054 0 790 array_in array_out array_in array_out i _null_ ));
+
/* OIDS 800 - 899 */
DATA(insert OID = 810 ( oidint2 PGUID 6 20 f b t \054 0 0 oidint2in oidint2out oidint2in oidint2out i _null_ ));
@@ -292,10 +283,10 @@ DATA(insert OID = 1039 ( _char2 PGUID -1 -1 f b t \054 0 409 array_in arr
DATA(insert OID = 1040 ( _char4 PGUID -1 -1 f b t \054 0 410 array_in array_out array_in array_out i _null_ ));
DATA(insert OID = 1041 ( _char8 PGUID -1 -1 f b t \054 0 411 array_in array_out array_in array_out i _null_ ));
-#define BPCHAROID 1042
DATA(insert OID = 1042 ( bpchar PGUID -1 -1 f b t \054 0 18 bpcharin bpcharout bpcharin bpcharout i _null_ ));
-#define VARCHAROID 1043
+#define BPCHAROID 1042
DATA(insert OID = 1043 ( varchar PGUID -1 -1 f b t \054 0 18 varcharin varcharout varcharin varcharout i _null_ ));
+#define VARCHAROID 1043
DATA(insert OID = 1082 ( date PGUID 4 10 t b t \054 0 0 date_in date_out date_in date_out i _null_ ));
#define DATEOID 1082
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 7d780b7fc11..dc5b571fca9 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.14 1997/04/02 18:31:52 scrappy Exp $
+ * $Id: builtins.h,v 1.15 1997/04/15 17:41:35 scrappy Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
@@ -22,6 +22,7 @@
#include <utils/geo_decls.h>
#include <utils/datetime.h>
#include <utils/nabstime.h>
+#include <utils/cash.h>
#include <utils/rel.h>
/*
diff --git a/src/include/utils/cash.h b/src/include/utils/cash.h
index 02655c88747..2cfb29313a3 100644
--- a/src/include/utils/cash.h
+++ b/src/include/utils/cash.h
@@ -1,16 +1,35 @@
/*
-cash.h
-Written by D'Arcy J.M. Cain
+ * cash.h
+ * Written by D'Arcy J.M. Cain
+ *
+ * Functions to allow input and output of money normally but store
+ * and handle it as long integers.
+ */
-functions to allow input and output of money normally but store
-and handle it as long integers
-*/
+#ifndef CASH_H
+#define CASH_H
-#ifndef _CASH_H
-#define _CASH_H
+typedef long int Cash;
-const char *cash_out(long value);
-long cash_in(const char *str);
-const char *cash_words_out(long value);
+const char *cash_out(Cash *value);
+Cash *cash_in(const char *str);
-#endif /* _CASH_H */
+bool cash_eq(Cash *c1, Cash *c2);
+bool cash_ne(Cash *c1, Cash *c2);
+bool cash_lt(Cash *c1, Cash *c2);
+bool cash_le(Cash *c1, Cash *c2);
+bool cash_gt(Cash *c1, Cash *c2);
+bool cash_ge(Cash *c1, Cash *c2);
+
+Cash *cash_pl(Cash *c1, Cash *c2);
+Cash *cash_mi(Cash *c1, Cash *c2);
+Cash *cash_mul(Cash *c, float8 *f);
+Cash *cash_div(Cash *c, float8 *f);
+
+Cash *cashlarger(Cash *c1, Cash *c2);
+Cash *cashsmaller(Cash *c1, Cash *c2);
+
+const char *cash_words_out(Cash *value);
+static const char *num_word(Cash value);
+
+#endif /* CASH_H */