mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-08 22:17:36 +08:00
Get rid of VARATT_SIZE and VARATT_DATA, which were simply redundant with VARSIZE and VARDATA, and as a consequence almost no code was using the longer names. Rename the length fields of struct varlena and various derived structures to catch anyplace that was accessing them directly; and clean up various places so caught. In itself this patch doesn't change any behavior at all, but it is necessary infrastructure if we hope to play any games with the representation of varlena headers. Greg Stark and Tom Lane
100 lines
3.8 KiB
C
100 lines
3.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* varbit.h
|
|
* Functions for the SQL datatypes BIT() and BIT VARYING().
|
|
*
|
|
* Code originally contributed by Adriaan Joubert.
|
|
*
|
|
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/utils/varbit.h,v 1.26 2007/02/27 23:48:10 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef VARBIT_H
|
|
#define VARBIT_H
|
|
|
|
#include "fmgr.h"
|
|
|
|
/*
|
|
* Modeled on struct varlena from postgres.h, but data type is bits8.
|
|
*/
|
|
typedef struct
|
|
{
|
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
|
int32 bit_len; /* number of valid bits */
|
|
bits8 bit_dat[1]; /* bit string, most sig. byte first */
|
|
} VarBit;
|
|
|
|
/*
|
|
* fmgr interface macros
|
|
*
|
|
* BIT and BIT VARYING are toastable varlena types. They are the same
|
|
* as far as representation goes, so we just have one set of macros.
|
|
*/
|
|
#define DatumGetVarBitP(X) ((VarBit *) PG_DETOAST_DATUM(X))
|
|
#define DatumGetVarBitPCopy(X) ((VarBit *) PG_DETOAST_DATUM_COPY(X))
|
|
#define VarBitPGetDatum(X) PointerGetDatum(X)
|
|
#define PG_GETARG_VARBIT_P(n) DatumGetVarBitP(PG_GETARG_DATUM(n))
|
|
#define PG_GETARG_VARBIT_P_COPY(n) DatumGetVarBitPCopy(PG_GETARG_DATUM(n))
|
|
#define PG_RETURN_VARBIT_P(x) return VarBitPGetDatum(x)
|
|
|
|
/* Header overhead *in addition to* VARHDRSZ */
|
|
#define VARBITHDRSZ sizeof(int32)
|
|
/* Number of bits in this bit string */
|
|
#define VARBITLEN(PTR) (((VarBit *) (PTR))->bit_len)
|
|
/* Pointer to the first byte containing bit string data */
|
|
#define VARBITS(PTR) (((VarBit *) (PTR))->bit_dat)
|
|
/* Number of bytes in the data section of a bit string */
|
|
#define VARBITBYTES(PTR) (VARSIZE(PTR) - VARHDRSZ - VARBITHDRSZ)
|
|
/* Padding of the bit string at the end (in bits) */
|
|
#define VARBITPAD(PTR) (VARBITBYTES(PTR)*BITS_PER_BYTE - VARBITLEN(PTR))
|
|
/* Number of bytes needed to store a bit string of a given length */
|
|
#define VARBITTOTALLEN(BITLEN) (((BITLEN) + BITS_PER_BYTE-1)/BITS_PER_BYTE + \
|
|
VARHDRSZ + VARBITHDRSZ)
|
|
/* pointer beyond the end of the bit string (like end() in STL containers) */
|
|
#define VARBITEND(PTR) (((bits8 *) (PTR)) + VARSIZE(PTR))
|
|
/* Mask that will cover exactly one byte, i.e. BITS_PER_BYTE bits */
|
|
#define BITMASK 0xFF
|
|
|
|
|
|
extern Datum bit_in(PG_FUNCTION_ARGS);
|
|
extern Datum bit_out(PG_FUNCTION_ARGS);
|
|
extern Datum bit_recv(PG_FUNCTION_ARGS);
|
|
extern Datum bit_send(PG_FUNCTION_ARGS);
|
|
extern Datum bittypmodin(PG_FUNCTION_ARGS);
|
|
extern Datum bittypmodout(PG_FUNCTION_ARGS);
|
|
extern Datum varbit_in(PG_FUNCTION_ARGS);
|
|
extern Datum varbit_out(PG_FUNCTION_ARGS);
|
|
extern Datum varbit_recv(PG_FUNCTION_ARGS);
|
|
extern Datum varbit_send(PG_FUNCTION_ARGS);
|
|
extern Datum varbittypmodin(PG_FUNCTION_ARGS);
|
|
extern Datum varbittypmodout(PG_FUNCTION_ARGS);
|
|
extern Datum bit(PG_FUNCTION_ARGS);
|
|
extern Datum varbit(PG_FUNCTION_ARGS);
|
|
extern Datum biteq(PG_FUNCTION_ARGS);
|
|
extern Datum bitne(PG_FUNCTION_ARGS);
|
|
extern Datum bitlt(PG_FUNCTION_ARGS);
|
|
extern Datum bitle(PG_FUNCTION_ARGS);
|
|
extern Datum bitgt(PG_FUNCTION_ARGS);
|
|
extern Datum bitge(PG_FUNCTION_ARGS);
|
|
extern Datum bitcmp(PG_FUNCTION_ARGS);
|
|
extern Datum bitand(PG_FUNCTION_ARGS);
|
|
extern Datum bitor(PG_FUNCTION_ARGS);
|
|
extern Datum bitxor(PG_FUNCTION_ARGS);
|
|
extern Datum bitnot(PG_FUNCTION_ARGS);
|
|
extern Datum bitshiftleft(PG_FUNCTION_ARGS);
|
|
extern Datum bitshiftright(PG_FUNCTION_ARGS);
|
|
extern Datum bitcat(PG_FUNCTION_ARGS);
|
|
extern Datum bitsubstr(PG_FUNCTION_ARGS);
|
|
extern Datum bitlength(PG_FUNCTION_ARGS);
|
|
extern Datum bitoctetlength(PG_FUNCTION_ARGS);
|
|
extern Datum bitfromint4(PG_FUNCTION_ARGS);
|
|
extern Datum bittoint4(PG_FUNCTION_ARGS);
|
|
extern Datum bitfromint8(PG_FUNCTION_ARGS);
|
|
extern Datum bittoint8(PG_FUNCTION_ARGS);
|
|
extern Datum bitposition(PG_FUNCTION_ARGS);
|
|
|
|
#endif
|