mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
102 lines
3.1 KiB
Plaintext
102 lines
3.1 KiB
Plaintext
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);
|