Types

Velox supports scalar types and complex types. These types cover most of the Presto and Spark data types.

Scalar Types

Scalar types in Velox are logical and SQL-compatible. Each scalar type is implemented using a C++ type. The table below shows the supported scalar types and their corresponding C++ type.

Velox Type

C++ Type

Bytes per Value

BOOLEAN

bool

0.125 (i.e. 1 bit)

TINYINT

int8_t

1

SMALLINT

int16_t

2

INTEGER

int32_t

4

BIGINT

int64_t

8

DATE

struct Date

8

REAL

float

4

DOUBLE

double

8

SHORT_DECIMAL

struct UnscaledShortDecimal

8

LONG_DECIMAL

struct UnscaledLongDecimal

16

TIMESTAMP

struct Timestamp

16

INTERVAL DAY TO SECOND

struct IntervalDayTime

8

VARCHAR

struct StringView

16

VARBINARY

struct StringView

16

All scalar types except DECIMAL have a one-to-one mapping with their C++ types.

DECIMAL type is a special scalar type since it carries additional precision, and scale information. Similar to SQL decimal, precision is the number of digits in a number. Scale is the number of digits to the right of the decimal point in a number. For example, the number 123.45 has a precision of 5 and a scale of 2. Velox supports two types of decimals, SHORT_DECIMAL and LONG_DECIMAL. SHORT_DECIMAL has a maximum precision of 18, with a range of [-10^{18} + 1, +10^{18} - 1]. LONG_DECIMAL has a maximum precision of 38, with a range of [-10^{38} + 1, +10^{38} - 1]. Their corresponding C++ types, UnscaledShortDecimal and UnscaledLongDecimal carry the unscaled value. For example, the unscaled value of decimal 123.45 is 12345. All the three values, precision, scale, unscaled value are required to represent a decimal value. UnscaledLongDecimal is a wrapper around the int128_t type. Some systems implement a similar wrapper around two int64_t values. Velox chose int128_t since most compilers now support this type and it simplifies the implementation.

Complex Types

Velox supports the ARRAY, MAP, and ROW complex types.