sqlite

sqlite

SQLite 데이터베이스에 저장된 데이터에 대해 쿼리를 수행할 수 있게 해주는 테이블 함수예요.

출처: 문서

본문

구문(Syntax)

sqlite('db_path', 'table_name')

인자(Arguments)

반환 값(Returned value)

  • 원본 SQLite 테이블과 같은 컬럼을 가진 테이블 객체.

테이블 이름 대신 쿼리 전달하기 (Passing a query instead of a table name)

테이블 이름 대신, 두 번째 인자로 SQLite에 그대로 전달되는 SELECT 쿼리를 쓸 수 있어요. 결과 테이블의 구조는 쿼리 결과에서 유추됩니다. 쿼리는 서브쿼리로 쓰거나 query 함수로 감싸서 쓸 수 있어요:

SELECT * FROM sqlite('sqlite.db', (SELECT col1, col2 FROM table1 WHERE col2 > 1));
SELECT * FROM sqlite('sqlite.db', query('SELECT col1, col2 FROM table1 WHERE col2 > 1'));

이런 테이블은 읽기 전용이라 INSERT가 허용되지 않아요. 같은 구문은 SQLite 테이블 엔진에서도 지원됩니다.

서브쿼리 형식 (SELECT ...)은 ClickHouse가 파싱한 뒤 SQLite로 보내기 전에 다시 직렬화합니다. 따라서 유효한 ClickHouse SQL이어야 해요. ClickHouse가 파싱하지 못하는 SQLite 전용 구문을 전달하려면 query('...') 형식을 쓰세요. 이 형식의 텍스트는 SQLite로 그대로(verbatim) 전송됩니다. 주변 ClickHouse 쿼리의 바깥 WHERE, LIMIT, 집계 등은 전달된 쿼리로 밀어 넣어지지(pushed down) 않고 — 전체 쿼리 결과를 가져온 뒤 ClickHouse에서 적용되어요. SQLite에서 읽는 데이터를 제한하려면 필터를 전달된 쿼리 안에 넣으세요. external_table_strict_query = 1에서는 테이블 함수의 컬럼에 대한 바깥 필터가 로컬에서 적용되는 대신 예외로 거부됩니다. 전달된 쿼리로 밀어 넣을 수 없기 때문이에요. 이 검사는 최상위 WHERE 술어와 최상위 AND의 각 항(conjunct)을 다룹니다. 이 테이블의 컬럼에 대한 PREWHERE는 이 설정의 대상이 아니에요: 이 테이블 엔진은 PREWHERE를 지원하지 않으며, 설정과 무관하게 해당 쿼리는 ILLEGAL_PREWHERE로 거부됩니다. 검사는 필터를 밀어 넣을 수 있는 경우에만 실행됩니다: 이 테이블이 쿼리의 유일한 테이블일 때, INNER JOIN의 양쪽일 때, 또는 외부 조인의 보존 쪽(preserving side)일 때(LEFT JOIN의 왼쪽, RIGHT JOIN의 오른쪽)입니다. LEFT/RIGHT JOIN의 비보존 쪽과 FULL JOIN의 양쪽에서는 아무것도 밀어 넣어지지 않고 검사도 되지 않으므로, 이 테이블의 컬럼에 대한 필터는 엄격 모드에서도 조인 후 로컬로 적용됩니다. 검사가 실행되는 곳에서는 주변 쿼리에서 조인된 다른 테이블을 참조하는 술어는 밀어 넣어지지 않고 검사에서 제외됩니다. 조인된 쪽만 참조하든 하나의 비-AND 표현식(예: OR) 안에서 이 테이블과 섞어 참조하든 마찬가지예요. 그런 술어는 평소 ClickHouse 평가 지점(조인 후의 WHERE, 그 전의 PREWHERE)을 유지하며 거부되지 않습니다.

예시(Example)

쿼리(Query)

SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2;

응답(Response)

┌─col1──┬─col2─┐
│ line1 │    1 │
│ line2 │    2 │
│ line3 │    3 │
└───────┴──────┘

더 알아보기 (Learn more)