Bitfields allow for naming and accessing sequences of bits in a column.
Defining bitfields with CREATE TABLE
When creating a table with a bitfield column using the CREATE TABLE statement, the type of the column needs to be already defined with CREATE TYPE, for example:
Code Block |
---|
CREATE TYPE bf AS (f1 bit1, f2 bit2); CREATE TABLE foo AS ( x INTEGER, y DOUBLE, v STRING, status bf) ON 'new_api_example.odb'; |
In the above example we have declared a bitfield type called bf, consisting of two members: f1 and f2. f1 occupies 1 bit ("bit1"), f2 2 bits ("bit2").
Later the type bf was used to declare column status in the CREATE TABLE statement.
Referring to bitfield members
Syntax for accessing a member of a bitfield is:
Code Block |
---|
<column-name>.<bitfield-member-name> |
In case it is necessary to specify table name when referring to a column, correct way of referring to a member is:
Code Block |
---|
<column-name>.<bitfield-member-name>@<table-name> |
for example:
Code Block |
---|
report_status.active@hdr |
Expanding list of members with star (*) operator
The list of bitfield members can be expanded with the star (*) operator, for example:
Code Block |
---|
report_status.*@hdr |
will be expanded to
Code Block |
---|
report_status.active@hdr, report_status.passive@hdr, report_status.rejected@hdr, report_status.blacklisted@hdr, report_status.use_emiskf_only@hdr |
Finding details of bitfield definition
The odb header tool can be used to find out details of bitfield definition: its members and number of bits they occupy:
Code Block |
---|
$ odb header conv.odb | grep datum_status | head -n 1 40. name: datum_status@body, type: BITFIELD [active:1;passive:1;rejected:1;blacklisted:1;use_emiskf_only:1] , codec: int8, range=<1.000000,5.000000> |
Option -dll produces output in the Data Definition Language (part of SQL) format:
Code Block |
---|
$ odb header -ddl conv.odb | grep datum_status | head -n 1 CREATE TYPE datum_status@body_at_foo_t AS (active bit1, passive bit1, rejected bit1, blacklisted bit1, use_emiskf_only bit1); |