Difference between revisions of "MonetDB type system"

From MonetDB
Jump to navigationJump to search
Line 12: Line 12:
 
! semantics                                    !! SQL            !! MAL  !! C      !! width                  !! signed? !! NIL value                              !! value range                                                      !! format string                !! availability                                              !! C example
 
! semantics                                    !! SQL            !! MAL  !! C      !! width                  !! signed? !! NIL value                              !! value range                                                      !! format string                !! availability                                              !! C example
 
|-
 
|-
| bit / boolean <br> (0/1 / false/true)        || BOOLEAN        || :bit || bit    ||  1-byte <br>    8-bit || (yes)  || bit_nil == <br> (bit) bte_nil          || [GDK_bit_min:GDK_bit_max]<br>[FALSE:TRUE]<br>[0:1]              || "%hhd"                      || always                                                    ||                  bit x = 0; <br> printf("%hhd", x);
+
| bit / boolean <br> (0/1 / false/true)        || BOOLEAN        || :bit || bit    ||  1-byte <br>    8-bit || (yes)  || bit_nil == <br> (bit) bte_nil          || {GDK_bit_min,GDK_bit_max} <br> {FALSE,TRUE} <br> {0,1}          || "%hhd"                      || always                                                    ||style="text-align: left;"|                  bit 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> 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                                                    ||style="text-align: left;"|                  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);
+
|  1-byte  (8-bit) <br> unsigned integer      ||                || || unsigned char ||  1-byte <br>    8-bit || no      ||                                        ||                                          [0:2^8-1]              || "%hhu"                      || always                                                    ||style="text-align: left;"|        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                                                    ||style="text-align: left;"|                  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);
+
|  2-byte  (16-bit) <br> unsigned integer      ||              || || unsigned short ||  2-byte <br>    16-bit || no      ||                                        ||                                          [0:2^16-1]            ||  "%hu"                      || always                                                    ||style="text-align: left;"|        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                                                    ||style="text-align: left;"|                  int x = 0; <br> printf(  "%d", 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);
+
|  4-byte  (32-bit) <br> unsigned integer      ||                || || unsigned int ||  4-byte <br>    32-bit || no      ||                                        ||                                          [0:2^32-1]            ||  "%u"                      || always                                                    ||style="text-align: left;"|          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> 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                                                    ||style="text-align: left;"|                  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);
+
|  8-byte  (64-bit) <br> unsigned integer      ||                ||      || ulng    ||  8-byte <br>    64-bit || no      ||                                        ||                                          [0:2^64-1]            || ULLFMT                      || always                                                    ||style="text-align: left;"|                  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)||style="text-align: left;"| #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
+
| 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)||style="text-align: left;"| #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                                                    ||style="text-align: left;"|                  flt x = 0; <br> printf(  "%f", x);
 
|-
 
|-
|  8-byte  (64-bit) <br> floating-point number || FLOAT<br>DOUBLE || :dbl || dbl    ||  8-byte <br>    64-bit || yes    || dbl_nil == <br> GDK_dbl_min            || (GDK_dbl_min:GDK_dbl_max]    <br> (-DBL_MAX:DBL_MAX]            || "%e", "%f", "%g"            || always                                                    ||                  dbl x = 0; <br> printf(  "%f", x);
+
|  8-byte  (64-bit) <br> floating-point number || FLOAT<br>DOUBLE || :dbl || dbl    ||  8-byte <br>    64-bit || yes    || dbl_nil == <br> GDK_dbl_min            || (GDK_dbl_min:GDK_dbl_max]    <br> (-DBL_MAX:DBL_MAX]            || "%e", "%f", "%g"            || always                                                    ||style="text-align: left;"|                  dbl x = 0; <br> printf(  "%f", x);
 
|-
 
|-
| object-ID / tuple-ID                        ||                || :oid || oid    || 4/8-byte <br> 32/64-bit || no      || oid_nil == <br> 2^31/2^63              || [GDK_oid_min:GDK_oid_max]    <br>        [0:2^31-1/2^63-1]      || OIDFMT                      || always                                                    ||                  oid x = 0; <br> printf(OIDFMT, x);
+
| object-ID / tuple-ID                        ||                || :oid || oid    || 4/8-byte <br> 32/64-bit || no      || oid_nil == <br> 2^31/2^63              || [GDK_oid_min:GDK_oid_max]    <br>        [0:2^31-1/2^63-1]      || OIDFMT                      || always                                                    ||style="text-align: left;"|                  oid x = 0; <br> printf(OIDFMT, x);
 
|-
 
|-
| number of tuples in a BAT (count)           ||                ||      || BUN    || 4/8-byte <br> 32/64-bit || no      || BUN_NONE == <br> (BUN) GDK_int/lng_max || [0:BUN_MAX == (BUN_NONE - 1)] <br>        [0:2^31-2/2^63-2]      || BUNFMT                      || always                                                    ||                  BUN x = 0; <br> printf(BUNFMT, x);
+
| number of tuples in a BAT <br> (count)       ||                ||      || BUN    || 4/8-byte <br> 32/64-bit || no      || BUN_NONE == <br> (BUN) GDK_int/lng_max || [0:BUN_MAX == (BUN_NONE - 1)] <br>        [0:2^31-2/2^63-2]      || BUNFMT                      || always                                                    ||style="text-align: left;"|                  BUN x = 0; <br> printf(BUNFMT, x);
 
|-
 
|-
| string length,<br>array size,<br>memory size<br>[byte]||        ||      || size_t  || 4/8-byte <br> 32/64-bit || no      ||                                        ||                                          [0:2^32-1/2^64-1]      ||  SZFMT                      || always                                                    ||                size_t x = 0; <br> printf( SZFMT, x);
+
| string length,<br>array size,<br>memory size<br>[byte]||        ||      || size_t  || 4/8-byte <br> 32/64-bit || no      ||                                        ||                                          [0:2^32-1/2^64-1]      ||  SZFMT                      || always                                                    ||style="text-align: left;"|                size_t x = 0; <br> printf( SZFMT, x);
 
|-
 
|-
| string length -,<br>array size -,<br>memory size -<br>- difference<br>[byte]|| || ||ssize_t||4/8-byte<br>32/64-bit||yes  ||                                        ||                                      [-2^31/-2^63:2^31-1/2^63-1] || SSZFMT                      || always                                                    ||              ssize_t x = 0; <br> printf(SSZFMT, x);
+
| string length -,<br>array size -,<br>memory size -<br>- difference<br>[byte]|| || ||ssize_t||4/8-byte<br>32/64-bit||yes  ||                                        ||                                      [-2^31/-2^63:2^31-1/2^63-1] || SSZFMT                      || always                                                    ||style="text-align: left;"|              ssize_t x = 0; <br> printf(SSZFMT, x);
 
|-
 
|-
| pointer difference<br>[byte]                ||                ||    || ptrdiff_t || 4/8-byte <br> 32/64-bit || yes    ||                                        ||                                      [-2^31/-2^63:2^31-1/2^63-1] ||  PDFMT                      || always                                                    ||            ptrdiff_t x = 0; <br> printf( PDFMT, x);
+
| pointer difference<br>[byte]                ||                ||    || ptrdiff_t || 4/8-byte <br> 32/64-bit || yes    ||                                        ||                                      [-2^31/-2^63:2^31-1/2^63-1] ||  PDFMT                      || always                                                    ||style="text-align: left;"|            ptrdiff_t x = 0; <br> printf( PDFMT, x);
 
|-
 
|-
| BAT-ID                                      ||                ||      ||'''bat'''||  4-byte <br>    32-bit || yes    || bat_nil == <br> (bat) int_nil          ||                                            (-2^31:2^31-1]        ||  "%d"                      || always                                                    ||                  bat x = 0; <br> printf(  "%d", x);
+
| BAT-ID                                      ||                ||      ||'''bat'''||  4-byte <br>    32-bit || yes    || bat_nil == <br> (bat) int_nil          ||                                            (-2^31:2^31-1]        ||  "%d"                      || always                                                    ||style="text-align: left;"|                  bat x = 0; <br> printf(  "%d", x);
 
|}
 
|}
  
 
... to be continued ...
 
... to be continued ...

Revision as of 23:40, 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}
{FALSE,TRUE}
{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 ...