Difference between revisions of "MonetDB type system"

From MonetDB
Jump to navigationJump to search
Line 15: Line 15:
 
|-
 
|-
 
|  1-byte  (8-bit) <br> signed integer        || TINYINT        || :bte || bte    ||  1-byte <br>    8-bit || yes    || bte_nil == <br> GDK_bte_min            || (GDK_bte_min:GDK_bte_max]    <br>    (-2^7:2^7-1]              || "%hhd"                      || always                                                    ||                  bte x = 0; <br> printf("%hhd", x);
 
|  1-byte  (8-bit) <br> signed integer        || TINYINT        || :bte || bte    ||  1-byte <br>    8-bit || yes    || bte_nil == <br> GDK_bte_min            || (GDK_bte_min:GDK_bte_max]    <br>    (-2^7:2^7-1]              || "%hhd"                      || always                                                    ||                  bte x = 0; <br> printf("%hhd", x);
 +
|-
 +
|  1-byte  (8-bit) <br> unsigned integer      ||                || || unsigned char ||  1-byte <br>    8-bit || no      ||                                        ||                                          [0:2^8-1]              || "%hhu"                      || always                                                    ||        unsigned char x = 0; <br> printf("%hhu", x);
 
|-
 
|-
 
|  2-byte  (16-bit) <br> signed integer        || SMALLINT        || :sht || sht    ||  2-byte <br>    16-bit || yes    || sht_nil == <br> GDK_sht_min            || (GDK_sht_min:GDK_sht_max]    <br>    (-2^15:2^15-1]            ||  "%hd"                      || always                                                    ||                  sht x = 0; <br> printf( "%hd", x);
 
|  2-byte  (16-bit) <br> signed integer        || SMALLINT        || :sht || sht    ||  2-byte <br>    16-bit || yes    || sht_nil == <br> GDK_sht_min            || (GDK_sht_min:GDK_sht_max]    <br>    (-2^15:2^15-1]            ||  "%hd"                      || always                                                    ||                  sht x = 0; <br> printf( "%hd", x);
 +
|-
 +
|  2-byte  (16-bit) <br> unsigned integer      ||              || || unsigned short ||  2-byte <br>    16-bit || no      ||                                        ||                                          [0:2^16-1]            ||  "%hu"                      || always                                                    ||        unsigned short x = 0; <br> printf( "%hu", x);
 
|-
 
|-
 
|  4-byte  (32-bit) <br> signed integer        || INT<br>INTEGER  || :int || int    ||  4-byte <br>    32-bit || yes    || int_nil == <br> GDK_int_min            || (GDK_int_min:GDK_int_max]    <br>    (-2^31:2^31-1]            ||  "%d"                      || always                                                    ||                  int x = 0; <br> printf(  "%d", x);
 
|  4-byte  (32-bit) <br> signed integer        || INT<br>INTEGER  || :int || int    ||  4-byte <br>    32-bit || yes    || int_nil == <br> GDK_int_min            || (GDK_int_min:GDK_int_max]    <br>    (-2^31:2^31-1]            ||  "%d"                      || always                                                    ||                  int x = 0; <br> printf(  "%d", x);
 
|-
 
|-
|  8-byte  (64-bit) <br> signed integer        || BIGINT          || :lng || lng    ||  8-byte <br>    64-bit || yes    || lng_nil == <br> GDK_lng_min            || (GDK_lng_min:GDK_lng_max]    <br>    (-2^63:2^63-1]            || LLFMT                        || always                                                    ||                  lng x = 0; <br> printf(LLFMT , x);
+
|  4-byte  (32-bit) <br> unsigned integer      ||                || || unsigned int ||  4-byte <br>    32-bit || no      ||                                        ||                                          [0:2^32-1]            ||  "%u"                      || always                                                    ||          unsigned int x = 0; <br> printf(  "%u", x);
 +
|-
 +
|  8-byte  (64-bit) <br> signed integer        || BIGINT          || :lng || lng    ||  8-byte <br>    64-bit || yes    || lng_nil == <br> GDK_lng_min            || (GDK_lng_min:GDK_lng_max]    <br>    (-2^63:2^63-1]            || LLFMT                        || always                                                    ||                  lng x = 0; <br> printf( LLFMT, x);
 +
|-
 +
|  8-byte  (64-bit) <br> unsigned integer      ||                ||      || ulng    ||  8-byte <br>    64-bit || no      ||                                        ||                                          [0:2^64-1]            || ULLFMT                      || always                                                    ||                  ulng x = 0; <br> printf(ULLFMT, x);
 
|-
 
|-
 
| 16-byte (128-bit) <br> signed integer        || HUGEINT        || :hge || hge    ||  16-byte <br>  128-bit || yes    || hge_nil == <br> GDK_hge_min            || (GDK_hge_min:GDK_hge_max]    <br>  (-2^127:2^127-1]            || (none provided by compilers) || if supported by compiler <br> (configure then defines HAVE_HGE) || #ifdef HAVE_HGE <br> hge x = 0; <br> printf("%.40g", (dbl) x); <br> #endif
 
| 16-byte (128-bit) <br> signed integer        || HUGEINT        || :hge || hge    ||  16-byte <br>  128-bit || yes    || hge_nil == <br> GDK_hge_min            || (GDK_hge_min:GDK_hge_max]    <br>  (-2^127:2^127-1]            || (none provided by compilers) || if supported by compiler <br> (configure then defines HAVE_HGE) || #ifdef HAVE_HGE <br> hge x = 0; <br> printf("%.40g", (dbl) x); <br> #endif
 +
|-
 +
| 16-byte (128-bit) <br> unsigned integer      ||                ||      || uhge    ||  16-byte <br>  128-bit || no      ||                                        ||                                          [0:2^128-1]            || (none provided by compilers) || if supported by compiler <br> (configure then defines HAVE_HGE) || #ifdef HAVE_HGE <br>uhge x = 0; <br> printf("%.40g", (dbl) x); <br> #endif
 
|-
 
|-
 
|  4-byte  (32-bit) <br> floating-point number || REAL            || :flt || flt    ||  4-byte <br>    32-bit || yes    || flt_nil == <br> GDK_flt_min            || (GDK_flt_min:GDK_flt_max]    <br> (-FLT_MAX:FLT_MAX]            || "%e", "%f", "%g"            || always                                                    ||                  flt x = 0; <br> printf(  "%f", x);
 
|  4-byte  (32-bit) <br> floating-point number || REAL            || :flt || flt    ||  4-byte <br>    32-bit || yes    || flt_nil == <br> GDK_flt_min            || (GDK_flt_min:GDK_flt_max]    <br> (-FLT_MAX:FLT_MAX]            || "%e", "%f", "%g"            || always                                                    ||                  flt x = 0; <br> printf(  "%f", x);

Revision as of 23:23, 6 October 2015

  • Type Rules
    • C types long & unsigned long are evil and must NOT be used!
      While they are 32/64-bit on 32/64-bit systems under Unix, they are always 32-bit (also on 64-bit systems) under Windows.
    • monetdb_config.h must be the first #include in each .c file (not in any .h file).
    • In C, a tuple-/object-ID (OID) is of type oid, NOT of type int, lng, size_t, BUN, etc.
    • In C, a BAT-ID is of type bat, NOT of type int.
    • In C, the number of tuples in a BAT (BATcount) is of type BUN, NOT of type int, lng, size_t, oid, etc.
    • In C, the length of a string and the size of an array or memory region are of type size_t, NOT of type int, lng, oid, BUN, etc.
MonetDB type system
semantics SQL MAL C width signed? NIL value value range format string availability C example
bit / boolean
(0/1 / false/true)
BOOLEAN :bit bit 1-byte
8-bit
(yes) bit_nil ==
(bit) bte_nil
[GDK_bit_min:GDK_bit_max]
[0:1]
"%hhd" always bit x = 0;
printf("%hhd", x);
1-byte (8-bit)
signed integer
TINYINT :bte bte 1-byte
8-bit
yes bte_nil ==
GDK_bte_min
(GDK_bte_min:GDK_bte_max]
(-2^7:2^7-1]
"%hhd" always bte x = 0;
printf("%hhd", x);
1-byte (8-bit)
unsigned integer
unsigned char 1-byte
8-bit
no [0:2^8-1] "%hhu" always unsigned char x = 0;
printf("%hhu", x);
2-byte (16-bit)
signed integer
SMALLINT :sht sht 2-byte
16-bit
yes sht_nil ==
GDK_sht_min
(GDK_sht_min:GDK_sht_max]
(-2^15:2^15-1]
"%hd" always sht x = 0;
printf( "%hd", x);
2-byte (16-bit)
unsigned integer
unsigned short 2-byte
16-bit
no [0:2^16-1] "%hu" always unsigned short x = 0;
printf( "%hu", x);
4-byte (32-bit)
signed integer
INT
INTEGER
:int int 4-byte
32-bit
yes int_nil ==
GDK_int_min
(GDK_int_min:GDK_int_max]
(-2^31:2^31-1]
"%d" always int x = 0;
printf( "%d", x);
4-byte (32-bit)
unsigned integer
unsigned int 4-byte
32-bit
no [0:2^32-1] "%u" always unsigned int x = 0;
printf( "%u", x);
8-byte (64-bit)
signed integer
BIGINT :lng lng 8-byte
64-bit
yes lng_nil ==
GDK_lng_min
(GDK_lng_min:GDK_lng_max]
(-2^63:2^63-1]
LLFMT always lng x = 0;
printf( LLFMT, x);
8-byte (64-bit)
unsigned integer
ulng 8-byte
64-bit
no [0:2^64-1] ULLFMT always ulng x = 0;
printf(ULLFMT, x);
16-byte (128-bit)
signed integer
HUGEINT :hge hge 16-byte
128-bit
yes hge_nil ==
GDK_hge_min
(GDK_hge_min:GDK_hge_max]
(-2^127:2^127-1]
(none provided by compilers) if supported by compiler
(configure then defines HAVE_HGE)
#ifdef HAVE_HGE
hge x = 0;
printf("%.40g", (dbl) x);
#endif
16-byte (128-bit)
unsigned integer
uhge 16-byte
128-bit
no [0:2^128-1] (none provided by compilers) if supported by compiler
(configure then defines HAVE_HGE)
#ifdef HAVE_HGE
uhge x = 0;
printf("%.40g", (dbl) x);
#endif
4-byte (32-bit)
floating-point number
REAL :flt flt 4-byte
32-bit
yes flt_nil ==
GDK_flt_min
(GDK_flt_min:GDK_flt_max]
(-FLT_MAX:FLT_MAX]
"%e", "%f", "%g" always flt x = 0;
printf( "%f", x);
8-byte (64-bit)
floating-point number
FLOAT
DOUBLE
:dbl dbl 8-byte
64-bit
yes dbl_nil ==
GDK_dbl_min
(GDK_dbl_min:GDK_dbl_max]
(-DBL_MAX:DBL_MAX]
"%e", "%f", "%g" always dbl x = 0;
printf( "%f", x);
object-ID / tuple-ID :oid oid 4/8-byte
32/64-bit
no oid_nil ==
2^31/2^63
[GDK_oid_min:GDK_oid_max]
[0:2^31-1/2^63-1]
OIDFMT always oid x = 0;
printf(OIDFMT, x);
number of tuples in a BAT (count) BUN 4/8-byte
32/64-bit
no BUN_NONE ==
(BUN) GDK_int/lng_max
[0:BUN_MAX == (BUN_NONE - 1)]
[0:2^31-2/2^63-2]
BUNFMT always BUN x = 0;
printf(BUNFMT, x);
string length,
array size,
memory size
[byte]
size_t 4/8-byte
32/64-bit
no [0:2^32-1/2^64-1] SZFMT always size_t x = 0;
printf( SZFMT, x);
string length -,
array size -,
memory size -
- difference
[byte]
ssize_t 4/8-byte
32/64-bit
yes [-2^31/-2^63:2^31-1/2^63-1] SSZFMT always ssize_t x = 0;
printf(SSZFMT, x);
pointer difference
[byte]
ptrdiff_t 4/8-byte
32/64-bit
yes [-2^31/-2^63:2^31-1/2^63-1] PDFMT always ptrdiff_t x = 0;
printf( PDFMT, x);
BAT-ID bat 4-byte
32-bit
yes bat_nil ==
(bat) int_nil
(-2^31:2^31-1] "%d" always bat x = 0;
printf( "%d", x);

... to be continued ...