mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-18 18:44:06 +08:00
1f747c6722
Adriaan Joubert
78 lines
2.8 KiB
Plaintext
78 lines
2.8 KiB
Plaintext
A set of C routines to implement an SQL-compliant bitstring type.
|
|
|
|
The file varbit.c contains the c-functions to implement both BIT and
|
|
BIT VARYING. Both types are implemented in essentially the same way,
|
|
except that BIT is zero padded to a specified length. I've tried to
|
|
make this code as independent as possible of the byte length, but it
|
|
is quite possible that there may be problems on machines that don't
|
|
have 8 bits/byte (are there still any around?).
|
|
|
|
In the input routines I have assumed that the parser eats the quotes
|
|
in B'...' or X'...'.
|
|
|
|
The SQL standard only defines comparison, SUBSTR and concatenation
|
|
operators, and these have been implemented. In addition all logical
|
|
operators have been implemented, i.e. ~,|,&,^,<< and >>. This is
|
|
useful if one wants to build bit masks. If the two strings are not of
|
|
the same length the longer string is truncated (truncation was the
|
|
only real option, as padding with zeros could give unintuitive results
|
|
for ^) and the result has the length of the shorter string. If there
|
|
is a requirement for any other functions, let me know, and I will have
|
|
a look.
|
|
|
|
My knowledge of postgres is not up to integrating a type, so I'm hoping
|
|
that somebody can integrate this type for me, or give me some hints as
|
|
to what needs to be done. These routines were developed outside the
|
|
postgres source tree, with a hacked version of postgres.h. The header
|
|
files probably need some ammending.
|
|
|
|
The included files are
|
|
|
|
varbit.h -- bit string header type
|
|
varbit.c -- the routines
|
|
vartest.c -- a few calls to the routines to
|
|
|
|
The following routines are available.
|
|
|
|
char * zpbitin(char *s, int dummy, int32 atttypmod);
|
|
Read in a zero padded bit string of the form X'...' or B'...'
|
|
|
|
char * zpbitout(char *s);
|
|
Print a zero padded bit string in hex X'...'
|
|
|
|
char * zpbitsout(char *s);
|
|
Print a zero padded bit string in binary B'...'
|
|
|
|
char * varbitin(char *s, int dummy, int32 atttypmod);
|
|
Read in a varying length bit string of the form X'...' or B'...'
|
|
|
|
[There is no need for separate output functions for varying bit, as
|
|
zpbitout will print them out correctly]
|
|
|
|
char * bitcat (char *arg1, char *arg2);
|
|
Bit concatenation.
|
|
|
|
char * bitsubstr (char *arg, int32 s, int32 l);
|
|
Substring of a bit string.
|
|
|
|
bool biteq (char *arg1, char *arg2);
|
|
bool bitne (char *arg1, char *arg2);
|
|
bool bitge (char *arg1, char *arg2);
|
|
bool bitgt (char *arg1, char *arg2);
|
|
bool bitle (char *arg1, char *arg2);
|
|
bool bitlt (char *arg1, char *arg2);
|
|
int bitcmp (char *arg1, char *arg2);
|
|
Comparison operators
|
|
|
|
char * bitand (char * arg1, char * arg2);
|
|
char * bitor (char * arg1, char * arg2);
|
|
char * bitxor (char * arg1, char * arg2);
|
|
char * bitnot (char * arg);
|
|
char * bitshiftright (char * arg, int shft);
|
|
char * bitshiftleft (char * arg, int shft);
|
|
Bit operations.
|
|
|
|
If anything else needs to be done, please let me know.
|
|
|
|
Adriaan (adriaan@albourne.com)
|