]> 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 c4d9d69debefe367c45fdd82c7c5ff20c2884d0f..d298718f7d70d8b2bc8ba39170c0823006f7c7b4 100644 (file)
@@ -5,9 +5,9 @@
  *
  * Original coding 1998, Jan Wieck.  Heavily revised 2003, Tom Lane.
  *
- * Copyright (c) 1998-2007, PostgreSQL Global Development Group
+ * Copyright (c) 1998-2014, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/utils/numeric.h,v 1.23 2007/01/05 22:19:59 momjian Exp $
+ * src/include/utils/numeric.h
  *
  *-------------------------------------------------------------------------
  */
  */
 #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           varlen;                 /* Variable size (std varlena header) */
-       int16           n_weight;               /* Weight of 1st digit  */
-       uint16          n_sign_dscale;  /* Sign + display scale */
-       char            n_data[1];              /* Digits (really array of NumericDigit) */
-} NumericData;
-
-typedef NumericData *Numeric;
-
-#define NUMERIC_HDRSZ  (sizeof(int32) + sizeof(int16) + sizeof(uint16))
-
+/* The actual contents of Numeric are private to numeric.c */
+struct NumericData;
+typedef struct NumericData *Numeric;
 
 /*
  * fmgr interface macros
@@ -84,4 +52,12 @@ typedef NumericData *Numeric;
 #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_ */