---
layout: docu
redirect_from:
- /docs/api/c/types
- /docs/api/c/types/
- /docs/clients/c/types
title: Types
---
DuckDB is a strongly typed database system. As such, every column has a single type specified. This type is constant
over the entire column. That is to say, a column that is labeled as an `INTEGER` column will only contain `INTEGER`
values.
DuckDB also supports columns of composite types. For example, it is possible to define an array of integers (`INTEGER[]`). It is also possible to define types as arbitrary structs (`ROW(i INTEGER, j VARCHAR)`). For that reason, native DuckDB type objects are not mere enums, but a class that can potentially be nested.
Types in the C API are modeled using an enum (`duckdb_type`) and a complex class (`duckdb_logical_type`). For most primitive types, e.g., integers or varchars, the enum is sufficient. For more complex types, such as lists, structs or decimals, the logical type must be used.
```c
typedef enum DUCKDB_TYPE {
DUCKDB_TYPE_INVALID = 0,
DUCKDB_TYPE_BOOLEAN = 1,
DUCKDB_TYPE_TINYINT = 2,
DUCKDB_TYPE_SMALLINT = 3,
DUCKDB_TYPE_INTEGER = 4,
DUCKDB_TYPE_BIGINT = 5,
DUCKDB_TYPE_UTINYINT = 6,
DUCKDB_TYPE_USMALLINT = 7,
DUCKDB_TYPE_UINTEGER = 8,
DUCKDB_TYPE_UBIGINT = 9,
DUCKDB_TYPE_FLOAT = 10,
DUCKDB_TYPE_DOUBLE = 11,
DUCKDB_TYPE_TIMESTAMP = 12,
DUCKDB_TYPE_DATE = 13,
DUCKDB_TYPE_TIME = 14,
DUCKDB_TYPE_INTERVAL = 15,
DUCKDB_TYPE_HUGEINT = 16,
DUCKDB_TYPE_UHUGEINT = 32,
DUCKDB_TYPE_VARCHAR = 17,
DUCKDB_TYPE_BLOB = 18,
DUCKDB_TYPE_DECIMAL = 19,
DUCKDB_TYPE_TIMESTAMP_S = 20,
DUCKDB_TYPE_TIMESTAMP_MS = 21,
DUCKDB_TYPE_TIMESTAMP_NS = 22,
DUCKDB_TYPE_ENUM = 23,
DUCKDB_TYPE_LIST = 24,
DUCKDB_TYPE_STRUCT = 25,
DUCKDB_TYPE_MAP = 26,
DUCKDB_TYPE_ARRAY = 33,
DUCKDB_TYPE_UUID = 27,
DUCKDB_TYPE_UNION = 28,
DUCKDB_TYPE_BIT = 29,
DUCKDB_TYPE_TIME_TZ = 30,
DUCKDB_TYPE_TIMESTAMP_TZ = 31,
} duckdb_type;
```
## Functions
The enum type of a column in the result can be obtained using the `duckdb_column_type` function. The logical type of a column can be obtained using the `duckdb_column_logical_type` function.
### `duckdb_value`
The `duckdb_value` functions will auto-cast values as required. For example, it is no problem to use
`duckdb_value_double` on a column of type `duckdb_value_int32`. The value will be auto-cast and returned as a double.
Note that in certain cases the cast may fail. For example, this can happen if we request a `duckdb_value_int8` and the value does not fit within an `int8` value. In this case, a default value will be returned (usually `0` or `nullptr`). The same default value will also be returned if the corresponding value is `NULL`.
The `duckdb_value_is_null` function can be used to check if a specific value is `NULL` or not.
The exception to the auto-cast rule is the `duckdb_value_varchar_internal` function. This function does not auto-cast and only works for `VARCHAR` columns. The reason this function exists is that the result does not need to be freed.
> `duckdb_value_varchar` and `duckdb_value_blob` require the result to be de-allocated using `duckdb_free`.
### `duckdb_fetch_chunk`
The `duckdb_fetch_chunk` function can be used to read data chunks from a DuckDB result set, and is the most efficient way of reading data from a DuckDB result using the C API. It is also the only way of reading data of certain types from a DuckDB result. For example, the `duckdb_value` functions do not support structural reading of composite types (lists or structs) or more complex types like enums and decimals.
For more information about data chunks, see the [documentation on data chunks]({% link docs/stable/clients/c/data_chunk.md %}).
## API Reference Overview
### Date Time Timestamp Helpers
### Hugeint Helpers
### Decimal Helpers
### Logical Type Interface
duckdb_logical_type duckdb_create_logical_type(duckdb_type type);
char *duckdb_logical_type_get_alias(duckdb_logical_type type);
void duckdb_logical_type_set_alias(duckdb_logical_type type, const char *alias);
duckdb_logical_type duckdb_create_list_type(duckdb_logical_type type);
duckdb_logical_type duckdb_create_array_type(duckdb_logical_type type, idx_t array_size);
duckdb_logical_type duckdb_create_map_type(duckdb_logical_type key_type, duckdb_logical_type value_type);
duckdb_logical_type duckdb_create_union_type(duckdb_logical_type *member_types, const char **member_names, idx_t member_count);
duckdb_logical_type duckdb_create_struct_type(duckdb_logical_type *member_types, const char **member_names, idx_t member_count);
duckdb_logical_type duckdb_create_enum_type(const char **member_names, idx_t member_count);
duckdb_logical_type duckdb_create_decimal_type(uint8_t width, uint8_t scale);
duckdb_type duckdb_get_type_id(duckdb_logical_type type);
uint8_t duckdb_decimal_width(duckdb_logical_type type);
uint8_t duckdb_decimal_scale(duckdb_logical_type type);
duckdb_type duckdb_decimal_internal_type(duckdb_logical_type type);
duckdb_type duckdb_enum_internal_type(duckdb_logical_type type);
uint32_t duckdb_enum_dictionary_size(duckdb_logical_type type);
char *duckdb_enum_dictionary_value(duckdb_logical_type type, idx_t index);
duckdb_logical_type duckdb_list_type_child_type(duckdb_logical_type type);
duckdb_logical_type duckdb_array_type_child_type(duckdb_logical_type type);
idx_t duckdb_array_type_array_size(duckdb_logical_type type);
duckdb_logical_type duckdb_map_type_key_type(duckdb_logical_type type);
duckdb_logical_type duckdb_map_type_value_type(duckdb_logical_type type);
idx_t duckdb_struct_type_child_count(duckdb_logical_type type);
char *duckdb_struct_type_child_name(duckdb_logical_type type, idx_t index);
duckdb_logical_type duckdb_struct_type_child_type(duckdb_logical_type type, idx_t index);
idx_t duckdb_union_type_member_count(duckdb_logical_type type);
char *duckdb_union_type_member_name(duckdb_logical_type type, idx_t index);
duckdb_logical_type duckdb_union_type_member_type(duckdb_logical_type type, idx_t index);
void duckdb_destroy_logical_type(duckdb_logical_type *type);
duckdb_state duckdb_register_logical_type(duckdb_connection con, duckdb_logical_type type, duckdb_create_type_info info);
#### `duckdb_result_get_chunk`
> Warning Deprecation notice. This method is scheduled for removal in a future release.
Fetches a data chunk from the duckdb_result. This function should be called repeatedly until the result is exhausted.
The result must be destroyed with `duckdb_destroy_data_chunk`.
This function supersedes all `duckdb_value` functions, as well as the `duckdb_column_data` and `duckdb_nullmask_data`
functions. It results in significantly better performance, and should be preferred in newer code-bases.
If this function is used, none of the other result functions can be used and vice versa (i.e., this function cannot be
mixed with the legacy result functions).
Use `duckdb_result_chunk_count` to figure out how many chunks there are in the result.
##### Syntax
duckdb_data_chunk duckdb_result_get_chunk(
duckdb_result result,
idx_t chunk_index
);
##### Parameters
* `result`: The result object to fetch the data chunk from.
* `chunk_index`: The chunk index to fetch from.
##### Return Value
The resulting data chunk. Returns `NULL` if the chunk index is out of bounds.
#### `duckdb_result_is_streaming`
> Warning Deprecation notice. This method is scheduled for removal in a future release.
Checks if the type of the internal result is StreamQueryResult.
##### Syntax
bool duckdb_result_is_streaming(
duckdb_result result
);
##### Parameters
* `result`: The result object to check.
##### Return Value
Whether or not the result object is of the type StreamQueryResult
#### `duckdb_result_chunk_count`
> Warning Deprecation notice. This method is scheduled for removal in a future release.
Returns the number of data chunks present in the result.
##### Syntax
idx_t duckdb_result_chunk_count(
duckdb_result result
);
##### Parameters
* `result`: The result object
##### Return Value
Number of data chunks present in the result.
#### `duckdb_result_return_type`
Returns the return_type of the given result, or DUCKDB_RETURN_TYPE_INVALID on error
##### Syntax
duckdb_result_type duckdb_result_return_type(
duckdb_result result
);
##### Parameters
* `result`: The result object
##### Return Value
The return_type
#### `duckdb_from_date`
Decompose a `duckdb_date` object into year, month and date (stored as `duckdb_date_struct`).
##### Syntax
duckdb_date_struct duckdb_from_date(
duckdb_date date
);
##### Parameters
* `date`: The date object, as obtained from a `DUCKDB_TYPE_DATE` column.
##### Return Value
The `duckdb_date_struct` with the decomposed elements.
#### `duckdb_to_date`
Re-compose a `duckdb_date` from year, month and date (`duckdb_date_struct`).
##### Syntax
duckdb_date duckdb_to_date(
duckdb_date_struct date
);
##### Parameters
* `date`: The year, month and date stored in a `duckdb_date_struct`.
##### Return Value
The `duckdb_date` element.
#### `duckdb_is_finite_date`
Test a `duckdb_date` to see if it is a finite value.
##### Syntax
bool duckdb_is_finite_date(
duckdb_date date
);
##### Parameters
* `date`: The date object, as obtained from a `DUCKDB_TYPE_DATE` column.
##### Return Value
True if the date is finite, false if it is ±infinity.
#### `duckdb_from_time`
Decompose a `duckdb_time` object into hour, minute, second and microsecond (stored as `duckdb_time_struct`).
##### Syntax
duckdb_time_struct duckdb_from_time(
duckdb_time time
);
##### Parameters
* `time`: The time object, as obtained from a `DUCKDB_TYPE_TIME` column.
##### Return Value
The `duckdb_time_struct` with the decomposed elements.
#### `duckdb_create_time_tz`
Create a `duckdb_time_tz` object from micros and a timezone offset.
##### Syntax
duckdb_time_tz duckdb_create_time_tz(
int64_t micros,
int32_t offset
);
##### Parameters
* `micros`: The microsecond component of the time.
* `offset`: The timezone offset component of the time.
##### Return Value
The `duckdb_time_tz` element.
#### `duckdb_from_time_tz`
Decompose a TIME_TZ objects into micros and a timezone offset.
Use `duckdb_from_time` to further decompose the micros into hour, minute, second and microsecond.
##### Syntax
duckdb_time_tz_struct duckdb_from_time_tz(
duckdb_time_tz micros
);
##### Parameters
* `micros`: The time object, as obtained from a `DUCKDB_TYPE_TIME_TZ` column.
#### `duckdb_to_time`
Re-compose a `duckdb_time` from hour, minute, second and microsecond (`duckdb_time_struct`).
##### Syntax
duckdb_time duckdb_to_time(
duckdb_time_struct time
);
##### Parameters
* `time`: The hour, minute, second and microsecond in a `duckdb_time_struct`.
##### Return Value
The `duckdb_time` element.
#### `duckdb_from_timestamp`
Decompose a `duckdb_timestamp` object into a `duckdb_timestamp_struct`.
##### Syntax
duckdb_timestamp_struct duckdb_from_timestamp(
duckdb_timestamp ts
);
##### Parameters
* `ts`: The ts object, as obtained from a `DUCKDB_TYPE_TIMESTAMP` column.
##### Return Value
The `duckdb_timestamp_struct` with the decomposed elements.
#### `duckdb_to_timestamp`
Re-compose a `duckdb_timestamp` from a duckdb_timestamp_struct.
##### Syntax
duckdb_timestamp duckdb_to_timestamp(
duckdb_timestamp_struct ts
);
##### Parameters
* `ts`: The de-composed elements in a `duckdb_timestamp_struct`.
##### Return Value
The `duckdb_timestamp` element.
#### `duckdb_is_finite_timestamp`
Test a `duckdb_timestamp` to see if it is a finite value.
##### Syntax
bool duckdb_is_finite_timestamp(
duckdb_timestamp ts
);
##### Parameters
* `ts`: The duckdb_timestamp object, as obtained from a `DUCKDB_TYPE_TIMESTAMP` column.
##### Return Value
True if the timestamp is finite, false if it is ±infinity.
#### `duckdb_is_finite_timestamp_s`
Test a `duckdb_timestamp_s` to see if it is a finite value.
##### Syntax
bool duckdb_is_finite_timestamp_s(
duckdb_timestamp_s ts
);
##### Parameters
* `ts`: The duckdb_timestamp_s object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_S` column.
##### Return Value
True if the timestamp is finite, false if it is ±infinity.
#### `duckdb_is_finite_timestamp_ms`
Test a `duckdb_timestamp_ms` to see if it is a finite value.
##### Syntax
bool duckdb_is_finite_timestamp_ms(
duckdb_timestamp_ms ts
);
##### Parameters
* `ts`: The duckdb_timestamp_ms object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_MS` column.
##### Return Value
True if the timestamp is finite, false if it is ±infinity.
#### `duckdb_is_finite_timestamp_ns`
Test a `duckdb_timestamp_ns` to see if it is a finite value.
##### Syntax
bool duckdb_is_finite_timestamp_ns(
duckdb_timestamp_ns ts
);
##### Parameters
* `ts`: The duckdb_timestamp_ns object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_NS` column.
##### Return Value
True if the timestamp is finite, false if it is ±infinity.
#### `duckdb_hugeint_to_double`
Converts a duckdb_hugeint object (as obtained from a `DUCKDB_TYPE_HUGEINT` column) into a double.
##### Syntax
double duckdb_hugeint_to_double(
duckdb_hugeint val
);
##### Parameters
* `val`: The hugeint value.
##### Return Value
The converted `double` element.
#### `duckdb_double_to_hugeint`
Converts a double value to a duckdb_hugeint object.
If the conversion fails because the double value is too big the result will be 0.
##### Syntax
duckdb_hugeint duckdb_double_to_hugeint(
double val
);
##### Parameters
* `val`: The double value.
##### Return Value
The converted `duckdb_hugeint` element.
#### `duckdb_double_to_decimal`
Converts a double value to a duckdb_decimal object.
If the conversion fails because the double value is too big, or the width/scale are invalid the result will be 0.
##### Syntax
duckdb_decimal duckdb_double_to_decimal(
double val,
uint8_t width,
uint8_t scale
);
##### Parameters
* `val`: The double value.
##### Return Value
The converted `duckdb_decimal` element.
#### `duckdb_decimal_to_double`
Converts a duckdb_decimal object (as obtained from a `DUCKDB_TYPE_DECIMAL` column) into a double.
##### Syntax
double duckdb_decimal_to_double(
duckdb_decimal val
);
##### Parameters
* `val`: The decimal value.
##### Return Value
The converted `double` element.
#### `duckdb_create_logical_type`
Creates a `duckdb_logical_type` from a primitive type.
The resulting logical type must be destroyed with `duckdb_destroy_logical_type`.
Returns an invalid logical type, if type is: `DUCKDB_TYPE_INVALID`, `DUCKDB_TYPE_DECIMAL`, `DUCKDB_TYPE_ENUM`,
`DUCKDB_TYPE_LIST`, `DUCKDB_TYPE_STRUCT`, `DUCKDB_TYPE_MAP`, `DUCKDB_TYPE_ARRAY`, or `DUCKDB_TYPE_UNION`.
##### Syntax
duckdb_logical_type duckdb_create_logical_type(
duckdb_type type
);
##### Parameters
* `type`: The primitive type to create.
##### Return Value
The logical type.
#### `duckdb_logical_type_get_alias`
Returns the alias of a duckdb_logical_type, if set, else `nullptr`.
The result must be destroyed with `duckdb_free`.
##### Syntax
char *duckdb_logical_type_get_alias(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type
##### Return Value
The alias or `nullptr`
#### `duckdb_logical_type_set_alias`
Sets the alias of a duckdb_logical_type.
##### Syntax
void duckdb_logical_type_set_alias(
duckdb_logical_type type,
const char *alias
);
##### Parameters
* `type`: The logical type
* `alias`: The alias to set
#### `duckdb_create_list_type`
Creates a LIST type from its child type.
The return type must be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_list_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The child type of the list
##### Return Value
The logical type.
#### `duckdb_create_array_type`
Creates an ARRAY type from its child type.
The return type must be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_array_type(
duckdb_logical_type type,
idx_t array_size
);
##### Parameters
* `type`: The child type of the array.
* `array_size`: The number of elements in the array.
##### Return Value
The logical type.
#### `duckdb_create_map_type`
Creates a MAP type from its key type and value type.
The return type must be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_map_type(
duckdb_logical_type key_type,
duckdb_logical_type value_type
);
##### Parameters
* `key_type`: The map's key type.
* `value_type`: The map's value type.
##### Return Value
The logical type.
#### `duckdb_create_union_type`
Creates a UNION type from the passed arrays.
The return type must be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_union_type(
duckdb_logical_type *member_types,
const char **member_names,
idx_t member_count
);
##### Parameters
* `member_types`: The array of union member types.
* `member_names`: The union member names.
* `member_count`: The number of union members.
##### Return Value
The logical type.
#### `duckdb_create_struct_type`
Creates a STRUCT type based on the member types and names.
The resulting type must be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_struct_type(
duckdb_logical_type *member_types,
const char **member_names,
idx_t member_count
);
##### Parameters
* `member_types`: The array of types of the struct members.
* `member_names`: The array of names of the struct members.
* `member_count`: The number of members of the struct.
##### Return Value
The logical type.
#### `duckdb_create_enum_type`
Creates an ENUM type from the passed member name array.
The resulting type should be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_enum_type(
const char **member_names,
idx_t member_count
);
##### Parameters
* `member_names`: The array of names that the enum should consist of.
* `member_count`: The number of elements that were specified in the array.
##### Return Value
The logical type.
#### `duckdb_create_decimal_type`
Creates a DECIMAL type with the specified width and scale.
The resulting type should be destroyed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_create_decimal_type(
uint8_t width,
uint8_t scale
);
##### Parameters
* `width`: The width of the decimal type
* `scale`: The scale of the decimal type
##### Return Value
The logical type.
#### `duckdb_get_type_id`
Retrieves the enum `duckdb_type` of a `duckdb_logical_type`.
##### Syntax
duckdb_type duckdb_get_type_id(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type.
##### Return Value
The `duckdb_type` id.
#### `duckdb_decimal_width`
Retrieves the width of a decimal type.
##### Syntax
uint8_t duckdb_decimal_width(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The width of the decimal type
#### `duckdb_decimal_scale`
Retrieves the scale of a decimal type.
##### Syntax
uint8_t duckdb_decimal_scale(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The scale of the decimal type
#### `duckdb_decimal_internal_type`
Retrieves the internal storage type of a decimal type.
##### Syntax
duckdb_type duckdb_decimal_internal_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The internal type of the decimal type
#### `duckdb_enum_internal_type`
Retrieves the internal storage type of an enum type.
##### Syntax
duckdb_type duckdb_enum_internal_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The internal type of the enum type
#### `duckdb_enum_dictionary_size`
Retrieves the dictionary size of the enum type.
##### Syntax
uint32_t duckdb_enum_dictionary_size(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The dictionary size of the enum type
#### `duckdb_enum_dictionary_value`
Retrieves the dictionary value at the specified position from the enum.
The result must be freed with `duckdb_free`.
##### Syntax
char *duckdb_enum_dictionary_value(
duckdb_logical_type type,
idx_t index
);
##### Parameters
* `type`: The logical type object
* `index`: The index in the dictionary
##### Return Value
The string value of the enum type. Must be freed with `duckdb_free`.
#### `duckdb_list_type_child_type`
Retrieves the child type of the given LIST type. Also accepts MAP types.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_list_type_child_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type, either LIST or MAP.
##### Return Value
The child type of the LIST or MAP type.
#### `duckdb_array_type_child_type`
Retrieves the child type of the given ARRAY type.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_array_type_child_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type. Must be ARRAY.
##### Return Value
The child type of the ARRAY type.
#### `duckdb_array_type_array_size`
Retrieves the array size of the given array type.
##### Syntax
idx_t duckdb_array_type_array_size(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The fixed number of elements the values of this array type can store.
#### `duckdb_map_type_key_type`
Retrieves the key type of the given map type.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_map_type_key_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The key type of the map type. Must be destroyed with `duckdb_destroy_logical_type`.
#### `duckdb_map_type_value_type`
Retrieves the value type of the given map type.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_map_type_value_type(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The value type of the map type. Must be destroyed with `duckdb_destroy_logical_type`.
#### `duckdb_struct_type_child_count`
Returns the number of children of a struct type.
##### Syntax
idx_t duckdb_struct_type_child_count(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type object
##### Return Value
The number of children of a struct type.
#### `duckdb_struct_type_child_name`
Retrieves the name of the struct child.
The result must be freed with `duckdb_free`.
##### Syntax
char *duckdb_struct_type_child_name(
duckdb_logical_type type,
idx_t index
);
##### Parameters
* `type`: The logical type object
* `index`: The child index
##### Return Value
The name of the struct type. Must be freed with `duckdb_free`.
#### `duckdb_struct_type_child_type`
Retrieves the child type of the given struct type at the specified index.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_struct_type_child_type(
duckdb_logical_type type,
idx_t index
);
##### Parameters
* `type`: The logical type object
* `index`: The child index
##### Return Value
The child type of the struct type. Must be destroyed with `duckdb_destroy_logical_type`.
#### `duckdb_union_type_member_count`
Returns the number of members that the union type has.
##### Syntax
idx_t duckdb_union_type_member_count(
duckdb_logical_type type
);
##### Parameters
* `type`: The logical type (union) object
##### Return Value
The number of members of a union type.
#### `duckdb_union_type_member_name`
Retrieves the name of the union member.
The result must be freed with `duckdb_free`.
##### Syntax
char *duckdb_union_type_member_name(
duckdb_logical_type type,
idx_t index
);
##### Parameters
* `type`: The logical type object
* `index`: The child index
##### Return Value
The name of the union member. Must be freed with `duckdb_free`.
#### `duckdb_union_type_member_type`
Retrieves the child type of the given union member at the specified index.
The result must be freed with `duckdb_destroy_logical_type`.
##### Syntax
duckdb_logical_type duckdb_union_type_member_type(
duckdb_logical_type type,
idx_t index
);
##### Parameters
* `type`: The logical type object
* `index`: The child index
##### Return Value
The child type of the union member. Must be destroyed with `duckdb_destroy_logical_type`.
#### `duckdb_destroy_logical_type`
Destroys the logical type and de-allocates all memory allocated for that type.
##### Syntax
void duckdb_destroy_logical_type(
duckdb_logical_type *type
);
##### Parameters
* `type`: The logical type to destroy.
#### `duckdb_register_logical_type`
Registers a custom type within the given connection.
The type must have an alias
##### Syntax
duckdb_state duckdb_register_logical_type(
duckdb_connection con,
duckdb_logical_type type,
duckdb_create_type_info info
);
##### Parameters
* `con`: The connection to use
* `type`: The custom type to register
##### Return Value
Whether or not the registration was successful.