~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/include/utils/numeric.h

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-------------------------------------------------------------------------
 
2
 *
 
3
 * numeric.h
 
4
 *        Definitions for the exact numeric data type of Postgres
 
5
 *
 
6
 * Original coding 1998, Jan Wieck.  Heavily revised 2003, Tom Lane.
 
7
 *
 
8
 * Copyright (c) 1998-2005, PostgreSQL Global Development Group
 
9
 *
 
10
 * $PostgreSQL: pgsql/src/include/utils/numeric.h,v 1.20 2005-01-01 05:43:09 momjian Exp $
 
11
 *
 
12
 *-------------------------------------------------------------------------
 
13
 */
 
14
#ifndef _PG_NUMERIC_H_
 
15
#define _PG_NUMERIC_H_
 
16
 
 
17
/*
 
18
 * Hardcoded precision limit - arbitrary, but must be small enough that
 
19
 * dscale values will fit in 14 bits.
 
20
 */
 
21
#define NUMERIC_MAX_PRECISION           1000
 
22
 
 
23
/*
 
24
 * Internal limits on the scales chosen for calculation results
 
25
 */
 
26
#define NUMERIC_MAX_DISPLAY_SCALE       NUMERIC_MAX_PRECISION
 
27
#define NUMERIC_MIN_DISPLAY_SCALE       0
 
28
 
 
29
#define NUMERIC_MAX_RESULT_SCALE        (NUMERIC_MAX_PRECISION * 2)
 
30
 
 
31
/*
 
32
 * For inherently inexact calculations such as division and square root,
 
33
 * we try to get at least this many significant digits; the idea is to
 
34
 * deliver a result no worse than float8 would.
 
35
 */
 
36
#define NUMERIC_MIN_SIG_DIGITS          16
 
37
 
 
38
 
 
39
/*
 
40
 * Sign values and macros to deal with packing/unpacking n_sign_dscale
 
41
 */
 
42
#define NUMERIC_SIGN_MASK       0xC000
 
43
#define NUMERIC_POS                     0x0000
 
44
#define NUMERIC_NEG                     0x4000
 
45
#define NUMERIC_NAN                     0xC000
 
46
#define NUMERIC_DSCALE_MASK 0x3FFF
 
47
#define NUMERIC_SIGN(n)         ((n)->n_sign_dscale & NUMERIC_SIGN_MASK)
 
48
#define NUMERIC_DSCALE(n)       ((n)->n_sign_dscale & NUMERIC_DSCALE_MASK)
 
49
#define NUMERIC_IS_NAN(n)       (NUMERIC_SIGN(n) != NUMERIC_POS &&      \
 
50
                                                         NUMERIC_SIGN(n) != NUMERIC_NEG)
 
51
 
 
52
 
 
53
/*
 
54
 * The Numeric data type stored in the database
 
55
 *
 
56
 * NOTE: by convention, values in the packed form have been stripped of
 
57
 * all leading and trailing zero digits (where a "digit" is of base NBASE).
 
58
 * In particular, if the value is zero, there will be no digits at all!
 
59
 * The weight is arbitrary in that case, but we normally set it to zero.
 
60
 */
 
61
typedef struct NumericData
 
62
{
 
63
        int32           varlen;                 /* Variable size (std varlena header) */
 
64
        int16           n_weight;               /* Weight of 1st digit  */
 
65
        uint16          n_sign_dscale;  /* Sign + display scale */
 
66
        char            n_data[1];              /* Digits (really array of NumericDigit) */
 
67
} NumericData;
 
68
 
 
69
typedef NumericData *Numeric;
 
70
 
 
71
#define NUMERIC_HDRSZ   (sizeof(int32) + sizeof(int16) + sizeof(uint16))
 
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_ */