확장
확장 (Extensions)
특화된 SQL 함수와 가상 테이블을 더해 주는 내장·로더블 확장을 정리한 문서예요. 확장별로 어떤 함수가 있는지 차근차근 살펴볼게요.
출처: 문서
본문
Turso는 특화된 SQL 함수와 가상 테이블을 추가하는 여러 내장 확장을 제공해요. 확장은 load_extension() 함수로 런타임에 로드할 수 있어요.
Loading Extensions
SELECT load_extension('extension_name');
Turso는 Turso 네이티브 확장 로드를 지원해요. SQLite .so/.dll 로더블 확장은 지원되지 않아요.
UUID Extension
UUID 확장은 UUID를 생성하고 다루는 함수를 제공해요. UUID는 기본적으로 16바이트 BLOB으로 저장돼요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
uuid4() |
none | BLOB | 무작위 UUID v4 생성 |
uuid4_str() |
none | TEXT | 무작위 UUID v4를 문자열로 생성. 별칭: gen_random_uuid() |
uuid7() |
none | BLOB | 시간 순서 UUID v7 생성 |
uuid7(seconds) |
INTEGER | BLOB | epoch 이후 지정된 초로 UUID v7 생성 |
uuid7_timestamp_ms(uuid) |
BLOB | INTEGER | UUID v7에서 epoch 이후 밀리초 추출 |
uuid_str(uuid) |
BLOB | TEXT | UUID blob을 문자열 표현으로 변환 |
uuid_blob(uuid) |
TEXT | BLOB | UUID 문자열을 blob 표현으로 변환 |
Examples
-- Generate UUIDs
SELECT uuid4_str();
-- '550e8400-e29b-41d4-a716-446655440000'
SELECT uuid_str(uuid4());
-- 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
-- UUID v7 is time-ordered (good for primary keys)
SELECT uuid_str(uuid7());
-- '0190a5c0-1234-7abc-8def-0123456789ab'
-- Extract timestamp from UUID v7
SELECT uuid7_timestamp_ms(uuid7());
-- 1720000000000
-- Use in a table
CREATE TABLE documents (
id BLOB PRIMARY KEY DEFAULT (uuid7()),
title TEXT
);
INSERT INTO documents (title) VALUES ('My Document');
SELECT uuid_str(id), title FROM documents;
Regexp Extension
regexp 확장은 sqlean-regexp와 호환되는 정규 표현식 함수를 제공해요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
regexp(pattern, source) |
TEXT, TEXT | INTEGER | source가 pattern과 일치하면 1 반환 |
regexp_like(source, pattern) |
TEXT, TEXT | INTEGER | source가 pattern과 일치하면 1 반환 (인자 순서 반대) |
regexp_substr(source, pattern) |
TEXT, TEXT | TEXT | pattern과 일치하는 첫 부분 문자열 또는 NULL 반환 |
regexp_capture(source, pattern) |
TEXT, TEXT | TEXT | 첫 capture group 매치 반환 |
regexp_capture(source, pattern, n) |
TEXT, TEXT, INTEGER | TEXT | n번째 capture group 매치 반환 |
regexp_replace(source, pattern, replacement) |
TEXT, TEXT, TEXT | TEXT | 매치를 replacement 문자열로 교체 |
Examples
-- Pattern matching
SELECT regexp('[0-9]+', 'abc123def');
-- 1
-- The REGEXP operator uses this extension
SELECT 'hello123' REGEXP '[a-z]+[0-9]+';
-- 1
-- Extract matching substring
SELECT regexp_substr('Price: $42.50', '[0-9]+\.[0-9]+');
-- '42.50'
-- Capture groups
SELECT regexp_capture('2025-03-15', '(\d{4})-(\d{2})-(\d{2})', 1);
-- '2025'
-- Replace
SELECT regexp_replace('Hello World', '[aeiou]', '*');
-- 'H*ll* W*rld'
Vector Extension
Turso Extension: 유사도 검색과 시맨틱 검색 애플리케이션을 위한 네이티브 벡터 검색이에요.
vector 확장은 벡터 임베딩을 만들고, 저장하고, 검색하는 함수를 제공해요. 벡터는 BLOB으로 저장돼요.
전체 함수 레퍼런스는 Vector Functions를 보세요.
Quick Reference
| Function | Description |
|---|---|
vector32(json) |
32비트 float 벡터 생성 |
vector64(json) |
64비트 float 벡터 생성 |
vector_distance_cos(v1, v2) |
코사인 거리 |
vector_distance_l2(v1, v2) |
유클리드 거리 |
vector_extract(v) |
벡터를 JSON으로 변환 |
vector_concat(v1, v2) |
벡터 연결 |
vector_slice(v, start, end) |
벡터 슬라이스 추출 |
Example
CREATE TABLE docs (
id INTEGER PRIMARY KEY,
content TEXT,
embedding BLOB
);
INSERT INTO docs VALUES (1, 'database systems', vector32('[0.1, 0.2, 0.3]'));
INSERT INTO docs VALUES (2, 'machine learning', vector32('[0.4, 0.5, 0.6]'));
-- Find similar documents
SELECT content, vector_distance_cos(embedding, vector32('[0.1, 0.25, 0.35]')) AS dist
FROM docs
ORDER BY dist
LIMIT 5;
Time Extension
time 확장은 sqlean-time과 호환되며 고급 시간 조작 함수를 제공해요.
time value (아래 표의 t)는 정수가 아니라 불투명한 13바이트 BLOB이에요 — sqlean-time과 바이트 단위로 일치해요(version(1) + seconds(8) + nanoseconds(4), 초는 1년부터 셈). 시간을 만드는 함수(time_now, time_date, time_add, …)는 BLOB을 반환하고, typeof(time_now())는 blob이에요. INTEGER를 얻으려면 time_to_unix / time_to_nano를, TEXT를 얻으려면 time_fmt_* 함수를 쓰세요.
STRICT 테이블에 time value를 저장하려면 BLOB 컬럼을 쓰거나 먼저 변환하세요:
CREATE TABLE X (t BLOB) STRICT;
INSERT INTO X (t) VALUES (time_now());
-- Or store a Unix integer:
CREATE TABLE Y (t INTEGER) STRICT;
INSERT INTO Y (t) VALUES (time_to_nano(time_now()));
Key Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
time_now() |
none | BLOB | 현재 시간 |
time_date(y,m,d,...) |
INTEGER... | BLOB | 구성 요소로 시간 생성 |
make_date(y,m,d) |
INTEGER... | BLOB | 날짜로 시간 생성 |
make_timestamp(...) |
INTEGER... | BLOB | 타임스탬프로 시간 생성 |
time_unix(sec) |
INTEGER | BLOB | Unix 초로 시간 생성 |
to_timestamp(sec) |
INTEGER | BLOB | Unix 초로 시간 생성 |
time_milli(ms) |
INTEGER | BLOB | 밀리초로 시간 생성 |
time_micro(us) |
INTEGER | BLOB | 마이크로초로 시간 생성 |
time_nano(ns) |
INTEGER | BLOB | 나노초로 시간 생성 |
time_to_unix(t) |
BLOB | INTEGER | Unix 초로 변환 |
time_to_milli(t) |
BLOB | INTEGER | 밀리초로 변환 |
time_to_micro(t) |
BLOB | INTEGER | 마이크로초로 변환 |
time_to_nano(t) |
BLOB | INTEGER | 나노초로 변환 |
time_get_year(t) |
BLOB | INTEGER | 연도 추출 |
time_get_month(t) |
BLOB | INTEGER | 월 추출 (1-12) |
time_get_day(t) |
BLOB | INTEGER | 일 추출 (1-31) |
time_get_hour(t) |
BLOB | INTEGER | 시 추출 (0-23) |
time_get_minute(t) |
BLOB | INTEGER | 분 추출 (0-59) |
time_get_second(t) |
BLOB | INTEGER | 초 추출 (0-59) |
time_get_weekday(t) |
BLOB | INTEGER | 요일 (0=Sunday) |
time_get(t, field) |
BLOB, TEXT | INTEGER | 이름으로 필드 추출 |
time_add(t, d) |
BLOB, INTEGER | BLOB | duration 더하기 |
time_add_date(t, y, m, d) |
BLOB, INTEGER... | BLOB | 연/월/일 더하기 |
time_sub(t, u) |
BLOB, BLOB | INTEGER | 시간 차이 (duration) |
time_since(t) |
BLOB | INTEGER | 그 시간 이후의 duration |
time_until(t) |
BLOB | INTEGER | 그 시간까지의 duration |
time_trunc(t, field) |
BLOB, TEXT | BLOB | 필드로 절삭 |
time_round(t, d) |
BLOB, INTEGER | BLOB | 가장 가까운 duration으로 반올림 |
time_after(t, u) |
BLOB, BLOB | INTEGER | t가 u 이후면 1 |
time_before(t, u) |
BLOB, BLOB | INTEGER | t가 u 이전이면 1 |
time_compare(t, u) |
BLOB, BLOB | INTEGER | -1, 0, 또는 1 |
time_equal(t, u) |
BLOB, BLOB | INTEGER | 같으면 1 |
time_fmt_iso(t) |
BLOB | TEXT | ISO 8601로 포맷 |
time_fmt_datetime(t) |
BLOB | TEXT | datetime으로 포맷 |
time_fmt_date(t) |
BLOB | TEXT | 날짜로 포맷 |
time_fmt_time(t) |
BLOB | TEXT | 시간으로 포맷 |
time_parse(s) |
TEXT | BLOB | 시간 문자열 파싱 |
Duration Constants
| Function | Value |
|---|---|
dur_ns() |
1 nanosecond |
dur_us() |
1 microsecond |
dur_ms() |
1 millisecond |
dur_s() |
1 second |
dur_m() |
1 minute |
dur_h() |
1 hour |
Example
-- Current time formatted
SELECT time_fmt_iso(time_now());
-- '2025-03-15T10:30:00Z'
-- Date arithmetic
SELECT time_fmt_date(time_add_date(time_now(), 0, 1, 0));
-- add 1 month to today
-- Duration since a timestamp
SELECT time_since(time_date(2025, 1, 1, 0, 0, 0)) / dur_h();
-- hours since Jan 1, 2025
Full-Text Search (FTS)
Turso Extension: Tantivy 기반 전문 검색으로 SQLite의 FTS3/FTS4/FTS5를 대체해요.
Turso는 FTS 인덱스 메서드를 통해 전문 검색을 제공해요. 쿼리 문법, 토크나이저, 스코어링을 포함한 전체 레퍼런스는 FTS Functions를 보세요.
Quick Reference
-- Create an FTS index
CREATE INDEX idx ON articles USING fts (title, body);
-- Search
SELECT title, fts_score('idx') AS score
FROM articles
WHERE fts_match('idx', 'database search')
ORDER BY score;
-- Highlighted results
SELECT fts_highlight('idx', 0, '<b>', '</b>') AS title
FROM articles
WHERE fts_match('idx', 'database');
CSV Extension
CSV 확장은 CSV 파일을 읽기 위한 가상 테이블을 제공해요.
Usage
CREATE VIRTUAL TABLE temp.csv_data USING csv(
filename='/path/to/data.csv',
header=yes
);
SELECT * FROM csv_data;
| Parameter | Description |
|---|---|
filename |
CSV 파일 경로 |
header |
첫 행이 컬럼 이름이면 yes |
Percentile Extension
백분위수를 계산하는 통계 집계 함수예요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
median(X) |
column | REAL | 중앙값 (50th percentile) |
percentile(Y, P) |
column, REAL | REAL | Y의 P 백분위수 (P는 0과 100 사이) |
percentile_cont(Y, P) |
column, REAL | REAL | 연속 백분위수 (보간) |
percentile_disc(Y, P) |
column, REAL | REAL | 이산 백분위수 (가장 가까운 값) |
Examples
CREATE TABLE scores (value REAL);
INSERT INTO scores VALUES (10), (20), (30), (40), (50);
SELECT median(value) FROM scores;
-- 30.0
SELECT percentile(value, 75) FROM scores;
-- 40.0
SELECT percentile_cont(value, 0.25) FROM scores;
-- 20.0
Crypto Extension
crypto 확장은 해싱과 인코딩 함수를 제공해요. sqlean-crypto와 호환돼요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
crypto_md5(data) |
TEXT/BLOB | BLOB | MD5 해시 |
crypto_sha1(data) |
TEXT/BLOB | BLOB | SHA-1 해시 |
crypto_sha256(data) |
TEXT/BLOB | BLOB | SHA-256 해시 |
crypto_sha384(data) |
TEXT/BLOB | BLOB | SHA-384 해시 |
crypto_sha512(data) |
TEXT/BLOB | BLOB | SHA-512 해시 |
crypto_blake3(data) |
TEXT/BLOB | BLOB | BLAKE3 해시 |
crypto_encode(data, format) |
BLOB, TEXT | TEXT | blob을 format(예: hex, base32, base64, url)으로 텍스트 인코딩 |
crypto_decode(text, format) |
TEXT, TEXT | BLOB | 지정 format의 텍스트를 blob으로 디코딩 |
-- Hash a value and encode it as hex
SELECT crypto_encode(crypto_sha256('hello'), 'hex');
-- Base64 round-trip
SELECT crypto_decode(crypto_encode(x'CAFE', 'base64'), 'base64');
Fuzzy Extension
fuzzy 확장은 문자열 유사도, 거리, 음성학 함수를 제공해요. sqlean-fuzzy와 호환돼요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
fuzzy_editdist(a, b) |
TEXT, TEXT | INTEGER | 맞춤법 검사 스타일 edit distance |
fuzzy_leven(a, b) |
TEXT, TEXT | INTEGER | Levenshtein distance |
fuzzy_damlev(a, b) |
TEXT, TEXT | INTEGER | Damerau-Levenshtein distance |
fuzzy_osadist(a, b) |
TEXT, TEXT | INTEGER | Optimal string alignment distance |
fuzzy_hamming(a, b) |
TEXT, TEXT | INTEGER | Hamming distance |
fuzzy_jarowin(a, b) |
TEXT, TEXT | REAL | Jaro-Winkler similarity |
fuzzy_soundex(s) |
TEXT | TEXT | Soundex 음성학 코드 |
fuzzy_rsoundex(s) |
TEXT | TEXT | Refined Soundex 코드 |
fuzzy_caver(s) |
TEXT | TEXT | Caverphone 음성학 코드 |
fuzzy_phonetic(s) |
TEXT | TEXT | US Census 음성학 코드 |
fuzzy_translit(s) |
TEXT | TEXT | 유니코드 텍스트를 ASCII로 음역 |
fuzzy_script(s) |
TEXT | INTEGER | 텍스트의 문자 체계 식별 |
phonetics(a, b) |
TEXT, TEXT | INTEGER | 두 문자열이 음성학적으로 같으면 1 |
-- Distance between two strings
SELECT fuzzy_leven('awesome', 'aewsime');
-- 3
-- Phonetic encoding
SELECT fuzzy_soundex('Robert');
-- 'R163'
IP Address Extension
ipaddr 확장은 IPv4와 IPv6 주소 및 네트워크를 다루는 함수를 제공해요.
Functions
| Function | Parameters | Return Type | Description |
|---|---|---|---|
ipfamily(ip) |
TEXT | INTEGER | IPv4면 4, IPv6면 6 반환 |
iphost(ip) |
TEXT | TEXT | 주소의 host 부분 (netmask 제거) |
ipmasklen(cidr) |
TEXT | INTEGER | CIDR 네트워크의 프리픽스(마스크) 길이 |
ipnetwork(cidr) |
TEXT | TEXT | CIDR 값의 네트워크 주소 |
ipcontains(network, ip) |
TEXT, TEXT | INTEGER | CIDR 네트워크가 해당 주소를 포함하면 1 |
SELECT ipfamily('192.168.1.1'); -- 4
SELECT ipnetwork('192.168.1.42/24'); -- '192.168.1.0/24'
SELECT ipcontains('10.0.0.0/8', '10.1.2.3'); -- 1
generate_series
generate_series 테이블 값 함수는 정수 시퀀스를 생성해요.
SELECT value FROM generate_series(start, stop);
SELECT value FROM generate_series(start, stop, step);
| Parameter | Type | Description |
|---|---|---|
| start | INTEGER | 시작 값 (포함) |
| stop | INTEGER | 끝 값 (포함) |
| step | INTEGER | 증가 폭 (기본값: 1) |
SELECT value FROM generate_series(1, 5);
-- 1, 2, 3, 4, 5
SELECT value FROM generate_series(0, 10, 2);
-- 0, 2, 4, 6, 8, 10
SELECT value FROM generate_series(10, 1, -3);
-- 10, 7, 4, 1
See Also
- Vector Functions — 벡터 함수 상세 레퍼런스
- FTS Functions — 전문 검색 함수 레퍼런스
- Aggregate Functions — GROUP BY와 쓰는 백분위수 함수
- Compatibility — 확장 지원 상태
더 알아보기 (Learn more)
- 집계 함수 — 백분위수 등 집계 함수 상세
- SQLite 호환성 — 확장 지원 상태 확인
- 셸 커맨드 —
.load로 확장 로드하기 - 데이터 타입 — BLOB 등 스토리지 클래스 이해하기