C API 타입
C API 타입 (Types)
DuckDB는 강타입(strongly typed) 데이터베이스 시스템이에요. 그래서 모든 열에는 단일 타입이 지정돼요. 이 타입은 열 전체에 걸쳐 일정해요. 즉 INTEGER 열로 표시된 열에는 INTEGER 값만 들어간다는 뜻이에요.
DuckDB는 복합 타입(composite type)의 열도 지원해요. 예를 들어 정수 배열(INTEGER[])을 정의할 수 있고, 임의의 struct(ROW(i INTEGER, j VARCHAR))로 타입을 정의할 수도 있어요. 이런 이유로 네이티브 DuckDB 타입 객체는 단순한 enum이 아니라, 잠재적으로 중첩될 수 있는 클래스예요.
C API의 타입은 enum(duckdb_type)과 복합 클래스(duckdb_logical_type)로 모델링돼요. 대부분의 기본 타입(예: 정수, varchar)에는 enum으로 충분해요. 리스트, struct, decimal 같은 더 복잡한 타입에는 logical type을 사용해야 해요.
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)
결과에서 열의 enum 타입은 duckdb_column_type 함수로 얻을 수 있고, 열의 logical type은 duckdb_column_logical_type 함수로 얻을 수 있어요.
duckdb_value
duckdb_value 함수는 필요에 따라 값을 자동 캐스팅해요. 예를 들어 duckdb_value_int32 타입 열에 duckdb_value_double을 사용해도 문제없어요. 값이 자동 캐스팅되어 double로 반환돼요. 다만 특정 경우에는 캐스트가 실패할 수 있다는 점에 유의해요. 예를 들어 duckdb_value_int8을 요청했는데 값이 int8에 맞지 않으면 그런 일이 생길 수 있어요. 이 경우 기본값(보통 0 또는 nullptr)이 반환돼요. 해당 값이 NULL일 때도 같은 기본값이 반환돼요.
특정 값이 NULL인지 아닌지는 duckdb_value_is_null 함수로 확인할 수 있어요.
자동 캐스팅 규칙의 예외는 duckdb_value_varchar_internal 함수예요. 이 함수는 자동 캐스팅하지 않고 VARCHAR 열에서만 동작해요. 이 함수가 존재하는 이유는 결과를 해제(free)할 필요가 없기 때문이에요.
duckdb_value_varchar와duckdb_value_blob은 결과물을duckdb_free로 해제해야 해요.
duckdb_fetch_chunk
duckdb_fetch_chunk 함수는 DuckDB 결과 집합에서 데이터 청크를 읽는 데 사용할 수 있고, C API로 DuckDB 결과에서 데이터를 읽는 가장 효율적인 방법이에요. 또한 특정 타입의 데이터를 DuckDB 결과에서 읽는 유일한 방법이기도 해요. 예를 들어 duckdb_value 함수들은 복합 타입(리스트나 struct)이나 enum·decimal 같은 더 복잡한 타입의 구조적 읽기를 지원하지 않아요.
데이터 청크에 대한 자세한 내용은 데이터 청크 문서를 참고해요.
API 참조 개요 (API Reference Overview)
이 섹션은 스크립트(scripts/generate_c_api_docs.py)로 생성되며, 각 함수의 시그니처와 설명·파라미터·반환값을 담고 있어요. 주요 그룹은 다음과 같아요:
- 결과 관련:
duckdb_result_get_chunk,duckdb_result_is_streaming,duckdb_result_chunk_count,duckdb_result_return_type - 날짜·시간·타임스탬프 헬퍼 (Date Time Timestamp Helpers):
duckdb_from_date,duckdb_to_date,duckdb_is_finite_date,duckdb_from_time,duckdb_create_time_tz,duckdb_from_time_tz,duckdb_to_time,duckdb_from_timestamp,duckdb_to_timestamp,duckdb_is_finite_timestamp,duckdb_is_finite_timestamp_s,duckdb_is_finite_timestamp_ms,duckdb_is_finite_timestamp_ns - Hugeint 헬퍼 (Hugeint Helpers):
duckdb_hugeint_to_double,duckdb_double_to_hugeint - Decimal 헬퍼 (Decimal Helpers):
duckdb_double_to_decimal,duckdb_decimal_to_double - Logical Type 인터페이스 (Logical Type Interface):
duckdb_create_logical_type,duckdb_logical_type_get_alias,duckdb_logical_type_set_alias,duckdb_create_list_type,duckdb_create_array_type,duckdb_create_map_type,duckdb_create_union_type,duckdb_create_struct_type,duckdb_create_enum_type,duckdb_create_decimal_type,duckdb_get_type_id,duckdb_decimal_width,duckdb_decimal_scale,duckdb_decimal_internal_type,duckdb_enum_internal_type,duckdb_enum_dictionary_size,duckdb_enum_dictionary_value,duckdb_list_type_child_type,duckdb_array_type_child_type,duckdb_array_type_array_size,duckdb_map_type_key_type,duckdb_map_type_value_type,duckdb_struct_type_child_count,duckdb_struct_type_child_name,duckdb_struct_type_child_type,duckdb_union_type_member_count,duckdb_union_type_member_name,duckdb_union_type_member_type,duckdb_destroy_logical_type,duckdb_register_logical_type
이 자동 생성 참조의 대표적인 함수 설명 몇 개를 살펴볼게요.
duckdb_result_get_chunk
경고 Deprecation 공지. 이 메서드는 향후 릴리스에서 제거될 예정이에요.
duckdb_result에서 데이터 청크를 가져와요. 이 함수는 결과가 소진될 때까지 반복 호출해야 해요.
결과는 duckdb_destroy_data_chunk로 파괴해야 해요.
이 함수는 모든 duckdb_value 함수와 duckdb_column_data·duckdb_nullmask_data 함수를 대체해요. 성능이 훨씬 좋으므로 새 코드베이스에서는 이 함수를 선호해야 해요.
이 함수를 사용하면 다른 결과 함수는 사용할 수 없고 그 반대도 마찬가지예요(즉, 이 함수를 레거시 결과 함수와 섞을 수 없어요).
결과에 청크가 몇 개 있는지 알아내려면 duckdb_result_chunk_count를 사용해요.
duckdb_data_chunk duckdb_result_get_chunk(duckdb_result result, idx_t chunk_index);
파라미터:
result: 데이터 청크를 가져올 결과 객체.chunk_index: 가져올 청크 인덱스.
반환값:
결과 데이터 청크. 청크 인덱스가 범위를 벗어나면 NULL을 반환해요.
duckdb_result_return_type
주어진 결과의 return_type을 반환하고, 오류가 있으면 DUCKDB_RETURN_TYPE_INVALID를 반환해요.
duckdb_result_type duckdb_result_return_type(duckdb_result result);
파라미터:
result: 결과 객체.
반환값: return_type.
duckdb_from_date
duckdb_date 객체를 연·월·일로 분해해요(duckdb_date_struct로 저장).
duckdb_date_struct duckdb_from_date(duckdb_date date);
파라미터:
date:DUCKDB_TYPE_DATE열에서 얻은 날짜 객체.
반환값:
분해된 요소를 가진 duckdb_date_struct.
duckdb_to_date
연·월·일(duckdb_date_struct)로 duckdb_date를 재구성해요.
duckdb_date duckdb_to_date(duckdb_date_struct date);
파라미터:
date:duckdb_date_struct에 저장된 연·월·일.
반환값:
duckdb_date 요소.
duckdb_is_finite_date
duckdb_date가 유한(finite) 값인지 검사해요.
bool duckdb_is_finite_date(duckdb_date date);
파라미터:
date:DUCKDB_TYPE_DATE열에서 얻은 날짜 객체.
반환값: 날짜가 유한하면 true, ±무한이면 false.
duckdb_from_time_tz
TIME_TZ 객체를 micros와 타임존 오프셋으로 분해해요. micros를 시·분·초·마이크로초로 더 분해하려면 duckdb_from_time을 사용해요.
duckdb_time_tz_struct duckdb_from_time_tz(duckdb_time_tz micros);
파라미터:
micros:DUCKDB_TYPE_TIME_TZ열에서 얻은 시간 객체.
duckdb_create_logical_type
주어진 타입으로 logical type을 생성해요.
duckdb_logical_type duckdb_create_logical_type(duckdb_type type);
duckdb_get_type_id
logical type의 duckdb_type id를 반환해요.
duckdb_type duckdb_get_type_id(duckdb_logical_type type);
파라미터:
type: logical type 객체.
duckdb_destroy_logical_type
logical type을 파괴하고 해당 타입에 할당된 모든 메모리를 해제해요.
void duckdb_destroy_logical_type(duckdb_logical_type *type);
파라미터:
type: 파괴할 logical type.
duckdb_register_logical_type
주어진 연결 내에서 커스텀 타입을 등록해요. 타입에는 별칭(alias)이 있어야 해요.
duckdb_state duckdb_register_logical_type(duckdb_connection con, duckdb_logical_type type, duckdb_create_type_info info);
파라미터:
con: 사용할 연결.type: 등록할 커스텀 타입.
반환값: 등록 성공 여부.
이 자동 생성 API 참조의 나머지 함수들도 같은 패턴을 따라요: 각 함수는 시그니처, 설명, 파라미터, 반환값을 담고 있어요. 전체 세부 사항은 공식 C API 참조에서 확인할 수 있어요.