]> granicus.if.org Git - postgresql/blob - src/include/utils/numeric.h
Commit to match discussed elog() changes. Only update is that LOG is
[postgresql] / src / include / utils / numeric.h
1 /* ----------
2  * numeric.h
3  *
4  *      Definitions for the exact numeric data type of Postgres
5  *
6  *      1998 Jan Wieck
7  *
8  * $Header: /cvsroot/pgsql/src/include/utils/numeric.h,v 1.15 2001/11/05 17:46:36 momjian Exp $
9  *
10  * ----------
11  */
12
13 #ifndef _PG_NUMERIC_H_
14 #define _PG_NUMERIC_H_
15
16 /* ----------
17  * The hardcoded limits and defaults of the numeric data type
18  * ----------
19  */
20 #define NUMERIC_MAX_PRECISION           1000
21 #define NUMERIC_DEFAULT_PRECISION       30
22 #define NUMERIC_DEFAULT_SCALE           6
23
24
25 /* ----------
26  * Internal limits on the scales chosen for calculation results
27  * ----------
28  */
29 #define NUMERIC_MAX_DISPLAY_SCALE       NUMERIC_MAX_PRECISION
30 #define NUMERIC_MIN_DISPLAY_SCALE       (NUMERIC_DEFAULT_SCALE + 4)
31
32 #define NUMERIC_MAX_RESULT_SCALE        (NUMERIC_MAX_PRECISION * 2)
33 #define NUMERIC_MIN_RESULT_SCALE        (NUMERIC_DEFAULT_PRECISION + 4)
34
35
36 /* ----------
37  * Sign values and macros to deal with packing/unpacking n_sign_dscale
38  * ----------
39  */
40 #define NUMERIC_SIGN_MASK       0xC000
41 #define NUMERIC_POS                     0x0000
42 #define NUMERIC_NEG                     0x4000
43 #define NUMERIC_NAN                     0xC000
44 #define NUMERIC_DSCALE_MASK 0x3FFF
45 #define NUMERIC_SIGN(n)         ((n)->n_sign_dscale & NUMERIC_SIGN_MASK)
46 #define NUMERIC_DSCALE(n)       ((n)->n_sign_dscale & NUMERIC_DSCALE_MASK)
47 #define NUMERIC_IS_NAN(n)       (NUMERIC_SIGN(n) != NUMERIC_POS &&                      \
48                                                                 NUMERIC_SIGN(n) != NUMERIC_NEG)
49
50
51 /* ----------
52  * The Numeric data type stored in the database
53  *
54  * NOTE: by convention, values in the packed form have been stripped of
55  * all leading and trailing zeroes (except there will be a trailing zero
56  * in the last byte, if the number of digits is odd).  In particular,
57  * if the value is zero, there will be no digits at all!  The weight is
58  * arbitrary in that case, but we normally set it to zero.
59  * ----------
60  */
61 typedef struct NumericData
62 {
63         int32           varlen;                 /* Variable size                */
64         int16           n_weight;               /* Weight of 1st digit  */
65         uint16          n_rscale;               /* Result scale                 */
66         uint16          n_sign_dscale;  /* Sign + display scale */
67         unsigned char n_data[1];        /* Digit data (2 decimal digits/byte) */
68 } NumericData;
69 typedef NumericData *Numeric;
70
71 #define NUMERIC_HDRSZ   (sizeof(int32) + sizeof(uint16) * 3)
72
73
74 /*
75  * fmgr interface macros
76  */
77
78 #define DatumGetNumeric(X)                ((Numeric) PG_DETOAST_DATUM(X))
79 #define DatumGetNumericCopy(X)    ((Numeric) PG_DETOAST_DATUM_COPY(X))
80 #define NumericGetDatum(X)                PointerGetDatum(X)
81 #define PG_GETARG_NUMERIC(n)      DatumGetNumeric(PG_GETARG_DATUM(n))
82 #define PG_GETARG_NUMERIC_COPY(n) DatumGetNumericCopy(PG_GETARG_DATUM(n))
83 #define PG_RETURN_NUMERIC(x)      return NumericGetDatum(x)
84
85 #endif   /* _PG_NUMERIC_H_ */