Review by Tom Lane.
/*
- * $PostgreSQL: pgsql/contrib/btree_gist/btree_numeric.c,v 1.13 2009/06/11 14:48:50 momjian Exp $
+ * $PostgreSQL: pgsql/contrib/btree_gist/btree_numeric.c,v 1.14 2010/07/30 04:30:23 rhaas Exp $
*/
#include "btree_gist.h"
NumericGetDatum(os)
));
- if (NUMERIC_IS_NAN(us))
+ if (numeric_is_nan(us))
{
- if (NUMERIC_IS_NAN(os))
+ if (numeric_is_nan(os))
*result = 0.0;
else
*result = 1.0;
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/format_type.c,v 1.53 2010/02/14 18:42:16 rhaas Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/format_type.c,v 1.54 2010/07/30 04:30:23 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
+ VARHDRSZ;
case NUMERICOID:
- /* precision (ie, max # of digits) is in upper bits of typmod */
- if (typemod > VARHDRSZ)
- {
- int precision = ((typemod - VARHDRSZ) >> 16) & 0xffff;
-
- /* Numeric stores 2 decimal digits/byte, plus header */
- return (precision + 1) / 2 + NUMERIC_HDRSZ;
- }
- break;
+ return numeric_maximum_size(typemod);
case VARBITOID:
case BITOID:
* Copyright (c) 1998-2010, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.123 2010/02/26 02:01:09 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.124 2010/07/30 04:30:23 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
#include "utils/int8.h"
#include "utils/numeric.h"
+/*
+ * Sign values and macros to deal with packing/unpacking n_sign_dscale
+ */
+#define NUMERIC_SIGN_MASK 0xC000
+#define NUMERIC_POS 0x0000
+#define NUMERIC_NEG 0x4000
+#define NUMERIC_NAN 0xC000
+#define NUMERIC_DSCALE_MASK 0x3FFF
+#define NUMERIC_SIGN(n) ((n)->n_sign_dscale & NUMERIC_SIGN_MASK)
+#define NUMERIC_DSCALE(n) ((n)->n_sign_dscale & NUMERIC_DSCALE_MASK)
+#define NUMERIC_IS_NAN(n) (NUMERIC_SIGN(n) != NUMERIC_POS && \
+ NUMERIC_SIGN(n) != NUMERIC_NEG)
+#define NUMERIC_HDRSZ (VARHDRSZ + sizeof(uint16) + sizeof(int16))
+
+
+/*
+ * The Numeric data type stored in the database
+ *
+ * NOTE: by convention, values in the packed form have been stripped of
+ * all leading and trailing zero digits (where a "digit" is of base NBASE).
+ * In particular, if the value is zero, there will be no digits at all!
+ * The weight is arbitrary in that case, but we normally set it to zero.
+ */
+struct NumericData
+{
+ int32 vl_len_; /* varlena header (do not touch directly!) */
+ uint16 n_sign_dscale; /* Sign + display scale */
+ int16 n_weight; /* Weight of 1st digit */
+ char n_data[1]; /* Digits (really array of NumericDigit) */
+};
+
+
/* ----------
* Uncomment the following to enable compilation of dump_numeric()
* and dump_var() and to get a dump of any result produced by make_result().
PG_RETURN_CSTRING(str);
}
+/*
+ * numeric_is_nan() -
+ *
+ * Is Numeric value a NaN?
+ */
+bool
+numeric_is_nan(Numeric num)
+{
+ return NUMERIC_IS_NAN(num);
+}
+
+/*
+ * numeric_maximum_size() -
+ *
+ * Maximum size of a numeric with given typmod, or -1 if unlimited/unknown.
+ */
+int32
+numeric_maximum_size(int32 typemod)
+{
+ int precision;
+
+ if (typemod <= VARHDRSZ)
+ return -1;
+
+ /* precision (ie, max # of digits) is in upper bits of typmod */
+ precision = ((typemod - VARHDRSZ) >> 16) & 0xffff;
+
+ /* Numeric stores 2 decimal digits/byte, plus header */
+ return (precision + 1) / 2 + NUMERIC_HDRSZ;
+}
+
/*
* numeric_out_sci() -
*
*
* Copyright (c) 1998-2010, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/include/utils/numeric.h,v 1.29 2010/01/02 16:58:10 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/numeric.h,v 1.30 2010/07/30 04:30:23 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
*/
#define NUMERIC_MIN_SIG_DIGITS 16
-
-/*
- * Sign values and macros to deal with packing/unpacking n_sign_dscale
- */
-#define NUMERIC_SIGN_MASK 0xC000
-#define NUMERIC_POS 0x0000
-#define NUMERIC_NEG 0x4000
-#define NUMERIC_NAN 0xC000
-#define NUMERIC_DSCALE_MASK 0x3FFF
-#define NUMERIC_SIGN(n) ((n)->n_sign_dscale & NUMERIC_SIGN_MASK)
-#define NUMERIC_DSCALE(n) ((n)->n_sign_dscale & NUMERIC_DSCALE_MASK)
-#define NUMERIC_IS_NAN(n) (NUMERIC_SIGN(n) != NUMERIC_POS && \
- NUMERIC_SIGN(n) != NUMERIC_NEG)
-
-
-/*
- * The Numeric data type stored in the database
- *
- * NOTE: by convention, values in the packed form have been stripped of
- * all leading and trailing zero digits (where a "digit" is of base NBASE).
- * In particular, if the value is zero, there will be no digits at all!
- * The weight is arbitrary in that case, but we normally set it to zero.
- */
-typedef struct NumericData
-{
- int32 vl_len_; /* varlena header (do not touch directly!) */
- uint16 n_sign_dscale; /* Sign + display scale */
- int16 n_weight; /* Weight of 1st digit */
- char n_data[1]; /* Digits (really array of NumericDigit) */
-} NumericData;
-
-typedef NumericData *Numeric;
-
-#define NUMERIC_HDRSZ (VARHDRSZ + sizeof(uint16) + sizeof(int16))
-
+/* The actual contents of Numeric are private to numeric.c */
+struct NumericData;
+typedef struct NumericData *Numeric;
/*
* fmgr interface macros
/*
* Utility functions in numeric.c
*/
+extern bool numeric_is_nan(Numeric num);
+int32 numeric_maximum_size(int32 typemod);
extern char *numeric_out_sci(Numeric num, int scale);
#endif /* _PG_NUMERIC_H_ */