]> granicus.if.org Git - postgresql/blobdiff - src/include/utils/numeric.h
Improve hash_create's API for selecting simple-binary-key hash functions.
[postgresql] / src / include / utils / numeric.h
index 2cbf5f0c7236e3fb43b38b0c6e1ce6caf6f0a1cf..d298718f7d70d8b2bc8ba39170c0823006f7c7b4 100644 (file)
@@ -1,67 +1,63 @@
-/* ----------
+/*-------------------------------------------------------------------------
+ *
  * numeric.h
+ *       Definitions for the exact numeric data type of Postgres
  *
- *     Definitions for the exact numeric data type of Postgres
+ * Original coding 1998, Jan Wieck.  Heavily revised 2003, Tom Lane.
  *
- *     1998 Jan Wieck
+ * Copyright (c) 1998-2014, PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/include/utils/numeric.h,v 1.6 1999/05/25 22:43:37 momjian Exp $
+ * src/include/utils/numeric.h
  *
- * ----------
+ *-------------------------------------------------------------------------
  */
-
 #ifndef _PG_NUMERIC_H_
 #define _PG_NUMERIC_H_
 
-#include "postgres.h"
+#include "fmgr.h"
 
-
-/* ----------
- * The hardcoded limits and defaults of the numeric data type
- * ----------
+/*
+ * Hardcoded precision limit - arbitrary, but must be small enough that
+ * dscale values will fit in 14 bits.
  */
 #define NUMERIC_MAX_PRECISION          1000
-#define NUMERIC_DEFAULT_PRECISION      30
-#define NUMERIC_DEFAULT_SCALE          6
 
+/*
+ * Internal limits on the scales chosen for calculation results
+ */
 #define NUMERIC_MAX_DISPLAY_SCALE      NUMERIC_MAX_PRECISION
-#define NUMERIC_MIN_DISPLAY_SCALE      NUMERIC_DEFAULT_SCALE + 4
+#define NUMERIC_MIN_DISPLAY_SCALE      0
 
 #define NUMERIC_MAX_RESULT_SCALE       (NUMERIC_MAX_PRECISION * 2)
-#define NUMERIC_MIN_RESULT_SCALE       (NUMERIC_DEFAULT_PRECISION + 4)
 
-#define NUMERIC_UNPACKED_DATASIZE      (NUMERIC_MAX_PRECISION * 2 + 4)
-
-
-/* ----------
- * Sign values and macros to deal with n_sign_dscale
- * ----------
+/*
+ * For inherently inexact calculations such as division and square root,
+ * we try to get at least this many significant digits; the idea is to
+ * deliver a result no worse than float8 would.
  */
-#define NUMERIC_SIGN_MASK      0xC000
-#define NUMERIC_POS                    0x0000
-#define NUMERIC_NEG                    0x4000
-#define NUMERIC_NAN                    0xC000
-#define NUMERIC_SIGN(n)                ((n)->n_sign_dscale & NUMERIC_SIGN_MASK)
-#define NUMERIC_DSCALE(n)      ((n)->n_sign_dscale & ~NUMERIC_SIGN_MASK)
-#define NUMERIC_IS_NAN(n)      (NUMERIC_SIGN(n) != NUMERIC_POS &&                      \
-                                                               NUMERIC_SIGN(n) != NUMERIC_NEG)
+#define NUMERIC_MIN_SIG_DIGITS         16
 
+/* The actual contents of Numeric are private to numeric.c */
+struct NumericData;
+typedef struct NumericData *Numeric;
 
-/* ----------
- * The Numeric data type stored in the database
- * ----------
+/*
+ * fmgr interface macros
  */
-typedef struct NumericData
-{
-       int32           varlen;                 /* Variable size                */
-       int16           n_weight;               /* Weight of 1st digit  */
-       uint16          n_rscale;               /* Result scale                 */
-       uint16          n_sign_dscale;  /* Sign + display scale */
-       unsigned char n_data[1];        /* Digit data                   */
-} NumericData;
-typedef NumericData *Numeric;
 
-#define NUMERIC_HDRSZ  (sizeof(int32) + sizeof(uint16) * 3)
+#define DatumGetNumeric(X)               ((Numeric) PG_DETOAST_DATUM(X))
+#define DatumGetNumericCopy(X)   ((Numeric) PG_DETOAST_DATUM_COPY(X))
+#define NumericGetDatum(X)               PointerGetDatum(X)
+#define PG_GETARG_NUMERIC(n)     DatumGetNumeric(PG_GETARG_DATUM(n))
+#define PG_GETARG_NUMERIC_COPY(n) DatumGetNumericCopy(PG_GETARG_DATUM(n))
+#define PG_RETURN_NUMERIC(x)     return NumericGetDatum(x)
 
+/*
+ * Utility functions in numeric.c
+ */
+extern bool numeric_is_nan(Numeric num);
+int32          numeric_maximum_size(int32 typmod);
+extern char *numeric_out_sci(Numeric num, int scale);
+extern char *numeric_normalize(Numeric num);
 
-#endif  /* _PG_NUMERIC_H_ */
+#endif   /* _PG_NUMERIC_H_ */