Represents columns in the table.
It contains the column's field definition and data.
The field (an Adbc.Field) describes the column's name, type,
and metadata. The data field is opaque and must not be accessed
directly, use functions such as to_list/1 to get a list of
values of the column's data type.
You can create new columns using constructors such as s8/2,
boolean/2, etc. new/2 is available as a convenience that
infers the type for you.
Summary
Functions
A column that contains binary values.
A column that contains booleans.
A column that contains date represented as 32-bit signed integers in UTC.
A column that contains date represented as 64-bit signed integers in UTC.
A column that contains 128-bit decimals.
A column that contains 256-bit decimals.
Construct an array using dictionary encoding.
A column that contains durations represented as 64-bit signed integers.
A column that contains 16-bit half-precision floats.
A column that contains 32-bit single-precision floats.
A column that contains 64-bit double-precision floats.
A column that contains fixed size binaries.
Similar to list/3, but the length of the list is the same.
Returns whether the column contains a validity bitmap (which would indicate the presence of nils).
A column that contains durations represented as signed integers.
A column that contains large binary values.
Similar to list/3, but for large lists.
A column that contains UTF-8 encoded large strings.
A column that each row is a list of some type or nil.
Converts a column's data from reference type to regular Elixir terms.
Creates a column by inferring the type from the data.
A column that contains signed 8-bit integers.
A column that contains signed 16-bit integers.
A column that contains 32-bit signed integers.
A column that contains 64-bit signed integers.
A column that contains UTF-8 encoded strings.
A column that contains time represented as signed integers in UTC.
A column that contains timestamps represented as signed integers in the given timezone.
Returns the column's data as a raw binary.
Converts a column's data to a plain Elixir list.
A column that contains unsigned 8-bit integers.
A column that contains unsigned 16-bit integers.
A column that contains un32-bit signed integers.
A column that contains un64-bit signed integers.
Types
@type interval_month() :: s32()
@type precision128() :: 1..38
@type precision256() :: 1..76
@type s8() :: -128..127
@type s16() :: -32768..32767
@type s32() :: -2_147_483_648..2_147_483_647
@type s64() :: -9_223_372_036_854_775_808..9_223_372_036_854_775_807
@type t() :: %Adbc.Column{ data: term(), field: Adbc.Field.t(), size: non_neg_integer() | nil }
@type u8() :: 0..255
@type u16() :: 0..65535
@type u32() :: 0..4_294_967_295
@type u64() :: 0..18_446_744_073_709_551_615
Functions
A column that contains binary values.
Arguments
data: A list of binary valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.binary([<<0>>, <<1>>, <<2>>])
iex> col.field
%Adbc.Field{name: nil, type: :binary}
iex> Adbc.Column.to_list(col)
[<<0>>, <<1>>, <<2>>]
A column that contains booleans.
Arguments
data: A list of booleansopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.boolean([true, false, true])
iex> col.field
%Adbc.Field{name: nil, type: :boolean}
iex> Adbc.Column.to_list(col)
[true, false, true]
A column that contains date represented as 32-bit signed integers in UTC.
Arguments
data: a list, each element of which can be one of the following:- a
Date.t() - a 32-bit signed integer representing the number of days since the Unix epoch.
- a
opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains date represented as 64-bit signed integers in UTC.
Arguments
data: a list, each element of which can be one of the following:- a
Date.t() - a 64-bit signed integer representing the number of milliseconds since the Unix epoch.
- a
opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains 128-bit decimals.
Arguments
data: a list, each element can be either- a
Decimal.t() - an
integer()
- a
precision: The precision of the decimal values; precision should be between 1 and 38scale: The scale of the decimal valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains 256-bit decimals.
Arguments
data: a list, each element can be either- a
Decimal.t() - an
integer()
- a
precision: The precision of the decimal values; precision should be between 1 and 76scale: The scale of the decimal valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Construct an array using dictionary encoding.
Dictionary encoding is a data representation technique to represent values by integers referencing a dictionary usually consisting of unique values. It can be effective when you have data with many repeated values.
Any array can be dictionary-encoded. The dictionary is stored as an optional property of an array. When a field is dictionary encoded, the values are represented by an array of non-negative integers representing the index of the value in the dictionary. The memory layout for a dictionary-encoded array is the same as that of a primitive integer layout. The dictionary is handled as a separate columnar array with its own respective layout.
As an example, you could have the following data:
Adbc.Column.string(["foo", "bar", "foo", "bar", nil, "baz"])In dictionary-encoded form, this could appear as:
Adbc.Column.dictionary(
Adbc.Column.string(["foo", "bar", "baz"]),
Adbc.Column.s32([0, 1, 0, 1, nil, 2])
)Arguments
data: a list, each element of which can be one of the following:nilAdbc.Column
Note that each
Adbc.Columnin the list should have the same type.opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
@spec duration([s64() | nil], Adbc.Field.time_unit(), Keyword.t()) :: t()
A column that contains durations represented as 64-bit signed integers.
Arguments
data: a list of integer values representing the time in the specified unitunit: specify the unit of the time value, one of the following::seconds:milliseconds:microseconds:nanoseconds
opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains 16-bit half-precision floats.
Arguments
data: A list of float values (will be converted to 16-bit floats in C). Integer values are automatically cast to floats.opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.f16([1.0, 2.0, 3.0])
iex> col.field
%Adbc.Field{name: nil, type: :f16}
iex> Adbc.Column.to_list(col)
[1.0, 2.0, 3.0]
A column that contains 32-bit single-precision floats.
Arguments
data: A list of 32-bit single-precision float values. Integer values are automatically cast to floats.opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.f32([1.0, 2.0, 3.0])
iex> col.field
%Adbc.Field{name: nil, type: :f32}
iex> Adbc.Column.to_list(col)
[1.0, 2.0, 3.0]
A column that contains 64-bit double-precision floats.
Arguments
data: A list of 64-bit double-precision float values. Integer values are automatically cast to floats.opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.f64([1.0, 2.0, 3.0])
iex> col.field
%Adbc.Field{name: nil, type: :f64}
iex> Adbc.Column.to_list(col)
[1.0, 2.0, 3.0]
@spec fixed_size_binary([iodata() | nil], non_neg_integer(), Keyword.t()) :: t()
A column that contains fixed size binaries.
Similar to binary/2, but each binary value has the same fixed size in bytes.
Arguments
data: A list of binary valuesnbytes: The fixed size of the binary values in bytesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.fixed_size_binary([<<0>>, <<1>>, <<2>>], 1)
iex> col.field
%Adbc.Field{name: nil, type: {:fixed_size_binary, 1}}
iex> Adbc.Column.to_list(col)
[<<0>>, <<1>>, <<2>>]
@spec fixed_size_list(list(), Adbc.Field.t(), s32(), Keyword.t()) :: t()
Similar to list/3, but the length of the list is the same.
Arguments
data: a list of lists (ornilfor null rows)inner_field: anAdbc.Fielddescribing the type of the list elementsfixed_size: The fixed size of the list.opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Returns whether the column contains a validity bitmap (which would indicate the presence of nils).
The column must be materialized. Raises ArgumentError if the
column data is still a NIF reference.
@spec interval( [interval_month() | interval_day_xime() | interval_month_day_nano() | nil], Adbc.Field.interval_unit(), Keyword.t() ) :: t()
A column that contains durations represented as signed integers.
Arguments
data: a list, each element of which can be one of the following:if
unitis:month:- a 32-bit signed integer representing the number of months.
if
unitis:day_time:- a 2-tuple, both the number of days and the number of milliseconds are in 32-bit signed integers.
if
unitis:month_day_nano:- a 3-tuple, the number of months, days, and nanoseconds; the number of months and days are in 32-bit signed integers, and the number of nanoseconds is in 64-bit signed integers
unit: specify the unit of the time value, one of the following::month:day_time:month_day_nano
opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains large binary values.
Similar to binary/2, but for binary values larger than 2GB.
Arguments
data: A list of binary valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.large_binary([<<0>>, <<1>>, <<2>>])
iex> col.field
%Adbc.Field{name: nil, type: :large_binary}
iex> Adbc.Column.to_list(col)
[<<0>>, <<1>>, <<2>>]
@spec large_list([t() | nil], Adbc.Field.t(), Keyword.t()) :: t()
Similar to list/3, but for large lists.
Arguments
data: a list of lists (ornilfor null rows)inner_field: anAdbc.Fielddescribing the type of the list elementsopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
A column that contains UTF-8 encoded large strings.
Similar to string/2, but for strings larger than 2GB.
Arguments
data: A list of UTF-8 encoded string valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.large_string(["a", "ab", "abc"])
iex> col.field
%Adbc.Field{name: nil, type: :large_string}
iex> Adbc.Column.to_list(col)
["a", "ab", "abc"]
@spec list([t() | nil], Adbc.Field.t(), Keyword.t()) :: t()
A column that each row is a list of some type or nil.
Arguments
data: a list of lists (ornilfor null rows)inner_field: anAdbc.Fielddescribing the type of the list elementsopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Converts a column's data from reference type to regular Elixir terms.
The size field is nil for unmaterialized columns and is set to the
number of elements after materialization (or when built from Elixir).
You can use size to check whether a column has been materialized.
Creates a column by inferring the type from the data.
This is a higher-level API that traverses the data element by element, inferring the most appropriate type.
Type inference rules
true/false→:boolean- integers →
:s64 - floats,
:nan,:infinity,:neg_infinity→:f64(integers in the same column are promoted to:f64) - binaries →
:string %Date{}→:date32(integers also supported)%Time{}→{:time64, :microseconds}(integers representing microseconds also supported)%NaiveDateTime{}→{:timestamp, :microseconds, "UTC"}(integers representing microseconds also supported)
If there are no values, the default type of :string is assumed.
Options
:name- The name of the column
Examples
iex> col = Adbc.Column.new([1, 2, 3], name: "ids")
iex> col.field
%Adbc.Field{name: "ids", type: :s64}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
iex> col = Adbc.Column.new([1, nil, 3.0])
iex> col.field
%Adbc.Field{name: nil, type: :f64}
iex> Adbc.Column.to_list(col)
[1.0, nil, 3.0]
A column that contains signed 8-bit integers.
Arguments
data: A list of signed 8-bit integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.s8([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :s8}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains signed 16-bit integers.
Arguments
data: A list of signed 16-bit integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.s16([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :s16}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains 32-bit signed integers.
Arguments
data: A list of 32-bit signed integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.s32([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :s32}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains 64-bit signed integers.
Arguments
data: A list of 64-bit signed integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.s64([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :s64}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains UTF-8 encoded strings.
Arguments
data: A list of UTF-8 encoded string valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.string(["a", "ab", "abc"])
iex> col.field
%Adbc.Field{name: nil, type: :string}
iex> Adbc.Column.to_list(col)
["a", "ab", "abc"]
@spec time([Time.t() | s64() | nil], Adbc.Field.time_unit(), Keyword.t()) :: t()
A column that contains time represented as signed integers in UTC.
Arguments
data:a list of
Time.t()valuea list of integer values representing the time in the specified unit
Note that when using
:secondsor:millisecondsas the unit, the time value is limited to the range of 32-bit signed integers.For
:microsecondsand:nanoseconds, the time value is limited to the range of 64-bit signed integers.
unit: specify the unit of the time value, one of the following::seconds:milliseconds:microseconds:nanoseconds
opts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
@spec timestamp( [NaiveDateTime.t() | s64() | nil], Adbc.Field.time_unit(), String.t(), Keyword.t() ) :: t()
A column that contains timestamps represented as signed integers in the given timezone.
Arguments
data:- a list of
NaiveDateTime.t()value - a list of 64-bit signed integer values representing the time in the specified unit
- a list of
unit: specify the unit of the time value, one of the following::seconds:milliseconds:microseconds:nanoseconds
timezone: the timezone of the timestampopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Returns the column's data as a raw binary.
Supported types and their binary formats:
:s8/:u8/:s16/:u16/:s32/:u32/:s64/:u64:f16/:f32/:f64:date32- equivalent to:s32:date64- equivalent to:s64{:time32, unit}- equivalent to:s32{:time64, unit}- equivalent to:s64{:timestamp, unit, tz}- equivalent to:s64{:duration, unit}- equivalent to:s64{:interval, :month}- equivalent to:s32{:interval, :day_time}- two:s32values per element (days, milliseconds){:interval, :month_day_nano}-:s32+:s32+:s64per element (months, days, nanoseconds){:decimal128, precision, scale}- 128-bit signed little-endian two's complement{:decimal256, precision, scale}- 256-bit signed little-endian two's complement{:fixed_size_binary, n}-nraw bytes per element{:dictionary, key_type, _}- returns the key binary in the key's format
Raises ArgumentError for other data types or unmaterialized columns.
Converts a column's data to a plain Elixir list.
For primitive columns, returns the data as-is. For composite types (dictionary, list, struct, list_view, run_end_encoded), expands the data into its logical representation.
Examples
iex> Adbc.Column.s32([1, 2, 3]) |> Adbc.Column.to_list()
[1, 2, 3]
iex> col = Adbc.Column.dictionary(
...> Adbc.Column.s32([0, 1, 0, 2]),
...> Adbc.Column.string(["a", "b", "c"])
...> )
iex> Adbc.Column.to_list(col)
["a", "b", "a", "c"]
A column that contains unsigned 8-bit integers.
Arguments
data: A list of unsigned 8-bit integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.u8([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :u8}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains unsigned 16-bit integers.
Arguments
data: A list of unsigned 16-bit integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.u16([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :u16}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains un32-bit signed integers.
Arguments
data: A list of un32-bit signed integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.u32([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :u32}
iex> Adbc.Column.to_list(col)
[1, 2, 3]
A column that contains un64-bit signed integers.
Arguments
data: A list of un64-bit signed integer valuesopts: A keyword list of options
Options
:name- The name of the column:metadata- A map of metadata
Examples
iex> col = Adbc.Column.u64([1, 2, 3])
iex> col.field
%Adbc.Field{name: nil, type: :u64}
iex> Adbc.Column.to_list(col)
[1, 2, 3]