Postgres int8
Thomas G. Lockhart <Thomas.Lockhart@jpl.nasa.gov>
This is a first attempt at 64-bit integer arithmetic for Postgres. The code
should support any 64-bit architecture and any 32-bit machine using a recent
GNU C compiler. At the moment, DEC-Alpha and Linux/gcc are explicitly
supported. The code uses "long long int" support in GNU C on 32-bit machines.
This type is an extension to ANSI-C, and may not appear on any other compiler.
The modules are built and installed as user-defined types, so destination
directories are pointing away from the standard Postgres areas.
Other compilers and architectures should be supportable, so please let me know
what changes were required to run on your machine, and I will fold those into
this standard distribution.
Good luck!
- Tom
Installation
You will need to modify the Makefile paths to fit your machine. Since this
is packaged as a "user-installable" type, the libraries and source code
can reside outside of the standard Postgres areas.
If you are compiling on a DEC-Alpha, then the code might compile
and run without change. (I do a lot of code development on Alphas,
but do not have a Postgres installation to test).
make
make install
psql dbname < int8.sql
If you are running gcc on a 32-bit machine, you will probably need to:
- remove the extra library reference in the Makefile.
- if there are unresolved symbols when you try running, then find
the right library. The one I had chosen might be a clue.
If you are not running gcc on a 32-bit machine, you will need to:
- redeclare the 64 bit data type.
- modify the scanf and printf() arguments to use the appropriate
64-bit int arguments.
On my Linux box, I had to find an extra library for the division function.
For Alpha boxes, both the DEC and GNU compilers should need "long int" only.
I have a reference to "__alpha" in the C source code, but have not tested it
and am not certain that this is the correct pre-defined symbol for that machine.
itest.sql is a small test file which exercises some of the I/O, functions,
and boolean operators.
int8:
=
<>
<
>
<=
>=
- unary minus
+ addition
- subtraction
* multiplication
/ division
int4() convert to 4-byte integer
float8() convert to double float
Routines defined are:
int64 *int8in(char *str);
char *int8out(int64 *val);
bool int8eq(int64 *val1, int64 *val2);
bool int8ne(int64 *val1, int64 *val2);
bool int8lt(int64 *val1, int64 *val2);
bool int8gt(int64 *val1, int64 *val2);
bool int8le(int64 *val1, int64 *val2);
bool int8ge(int64 *val1, int64 *val2);
bool int84eq(int64 *val1, int32 val2);
bool int84ne(int64 *val1, int32 val2);
bool int84lt(int64 *val1, int32 val2);
bool int84gt(int64 *val1, int32 val2);
bool int84le(int64 *val1, int32 val2);
bool int84ge(int64 *val1, int32 val2);
int64 *int8um(int64 *val);
int64 *int8pl(int64 *val1, int64 *val2);
int64 *int8mi(int64 *val1, int64 *val2);
int64 *int8mul(int64 *val1, int64 *val2);
int64 *int8div(int64 *val1, int64 *val2);
int64 *int48(int32 val);
int32 int84(int64 *val);
int64 *dtoi8(float8 *val);
float8 *i8tod(int64 *val);