# Types All data representations (nouns) of the Obelisk system are strongly typed. ## Column Types The fundamental data element in Obelisk is an atom that is typed by an aura. Data cells, which are intersections of a `` row and column, are typed atoms. Obelisk supports the following auras (see ch12-literals for representing the atomic types): | Aura | Description | | :--- |:---------------------------- | | @c | UTF-32 | | @da | date | | @dr | timespan | | @f | loobean | | @if | IPv4 address | | @is | IPv6 address | | @p | ship name | | @q | phonemic base | | @rh | half float (16b) | | @rs | single float (32b) | | @rd | double float (64b) | | @rq | quad float (128b) | | @sb | signed (low bit) binary | | @sd | signed (low bit) decimal | | @sv | signed (low bit) base32 | | @sw | signed (low bit) base64 | | @sx | signed (low bit) hexadecimal | | @t | UTF-8 text (cord) | | @ta | ASCII text (knot, url safe) | | @tas | ASCII text (term) | | @ub | unsigned binary | | @ud | unsigned decimal | | @uv | unsigned base32 | | @uw | unsigned base64 | | @ux | unsigned hexadecimal | Columns are typed by an aura and indexed by name. ``` ::= ``` ## Table Row and Table Types All datasets in Obelisk are sets, meaning each typed element, ``, only exists once. Datasets are also commonly regarded as tables, which is accurate when the index of each cell (row/column intersection) can be calculated. This calculation is possible when the `SELECT` statement includes an `ORDER BY` clause. All tables originate from, or are derived from, base tables created by the `CREATE TABLE` command. A base-table (``) row has a default type, which is the table's atomic aura-typed columns in a fixed order. ``` ::= list ``` Each base table is typed by its ``. ``` ::= (list ) ``` A base table's definition includes a unique primary row order, giving it `list` type rather than `set` type. This is not true for all `` instances. Rows from ``s, ``s, and the command output from ``, or any other table that is not a base-table, can only have an immutable row order if it is explicitly specified (i.e., the `SELECT` statement includes an `ORDER BY` clause). In general, these other tables have types that are unions of ``s. When the `` is a union of ``s. There is a `` representing the full width of the `SELECT` statement and as many `` sub-types as necessary to represent any unjoined outer `JOIN`s that result in a selected row. Sub-types align their columns with the all-column ``, regardless of the SELECT statement's construction. In general, ``s have the type: ``` ::= (list ) | (set ( | | ... | )) ``` ## Additional Types All the static types in Obelisk API are defined in `sur/ast/hoon`. ## Remarks Even `
`s can be typed as sets, because a `SELECT` statement without an `ORDER BY` clause has an undefined row order. Regardless of the presence of `ORDER BY`, any `` emitted by any step in a ``, a CTE, or a `` is a list of `` in some (possibly arbitrary) order. Ultimately, "set" is the most important concept because every `` will have one unique row value for any given sub-type of ``.