본문 바로가기
WIKI 기술 지식 베이스

확장

원문 보기 위키 갱신

확장 (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

더 알아보기 (Learn more)