Menu

CQL to Lua type mapping

This document describes how CQL types are mapped to and from Lua in UDF.

ASCII, TEXT and VARCHAR

When converting to Lua, these types are mapped to Lua strings.

When converting to CQL, types that Lua coerces to string are accepted. The values are verified to be valid ASCII or UTF8 as appropriate.

BLOB

Lua strings can hold arbitrary data, so blobs are converted to and from Lua strings.

TINYINT, SMALLINT, INT and BIGINT

Lua 5.3 has native support for 64 bit integers, so all these types are converted to a native integer.

When converting to CQL, types that Lua coerces to integers are supported. If the value is too large for the CQL type, it wraps.

BOOLEAN

This maps exactly to and from a Lua boolean.

COUNTER

Since UDF are pure functions, a counter is mapped to and from a native integer.

FLOAT and DOUBLE

When converting to Lua, these are mapped o Lua’s native double.

When converting to CQL, a number is rounded to a float or double value as appropriate. For example, it is valid to return a integer that is too large to have an exact representation as a double.

VARINT and DECIMAL

These are mapped to a userdata since there is no native support for large numbers is Lua. We try to provide type coercions similar to those Lua has. For example, a UDF returning the CQL type bigint, can return the value 42 with Lua code that returns

  • The integer 42

  • The double 42

  • The string “42”

  • The varint 42

  • The decimal 42

DATE

When converting to Lua, a date is mapped to the number of days since epoch + 2^31.

When converting to CQL, we support:

  • integer (number of days since epoch + 2^31).

  • CQL date literal in a string.

  • A lua “date table”, but with only year, month and day

DURATION

When converting to Lua we produce the table { months = v1, days = v2, nanoseconds = v3 }.

When converting to CQL we support a table in the same format or a CQL duration literal in a string.

INET

This is converted to and from a string (“127.0.0.1” or “::1”).

TIME

When converting to Lua we pass an integer with the number of seconds since midnight.

When converting to CQL we support an integer with the same meaning or a CQL time literal in a string.

TIMESTAMP

When converting to Lua we pass an integer with the number of milliseconds since the epoch.

When converting to CQL we support integers with the same meaning or CQL timestamp literal in a string.

TIMEUUID

UUID

These are converted to and from the string representation.

LIST

A list is represented as a sequence in lua. A list with “foo” and “bar” is represented as {“foo”, “bar”}. It is an error to return a table that is not a sequence.

TUPLE

A tuple is represented the same way as a list, but on return we check the number of elements and the types.

MAP

These are converted to and from lua tables. A map from “foo” to 42 is represented as {foo = 42}.

UDT

A UDT is represented by a table like a map, but on return we check that:

  • There are no unexpected keys

  • All expected keys are present

  • The fields have valid types

SET

A set is represented in lua by the keys of a table. A set with 1, 2 and 3 is represented by as {[1] = true, [2] = true, [3] = true}. On return the values are checked to be true.

Note that, like every other Lua table, the set is underscored. It is sorted when converting back to CQL.