설명
시작하기
사용
버전 정책
- API가 변경되면 메이저 버전이 증가합니다
- 하위 호환되는 SQL 변경이 있으면 마이너 버전이 증가합니다
- 바이너리만 변경되면 패치 버전이 증가합니다
- 라이브러리 버전(PostgreSQL 18 이상에서는
PG_MODULE_MAGIC으로 정의됨)에는 전체 시맨틱 버전이 포함되며,pgch_version()함수의 출력 또는 Postgrespg_get_loaded_modules()함수에서 확인할 수 있습니다. - 확장 기능 버전(control file에 정의됨)에는 메이저 및 마이너 버전만 포함되며,
pg_catalog.pg_extension테이블,pg_available_extension_versions()함수의 출력, 그리고\dx pg_clickhouse에서 확인할 수 있습니다.
v0.1.0에서 v0.1.1로의 변경은 v0.1을 로드한 모든 데이터베이스에 적용되며,
업그레이드의 이점을 누리기 위해 ALTER EXTENSION을 실행할 필요가 없다는 뜻입니다.
반면 마이너 버전이나 메이저 버전이 증가하는 릴리스에는
SQL 업그레이드 스크립트가 함께 제공되며, 확장 기능이 포함된 기존의 모든 데이터베이스는
업그레이드의 이점을 누리기 위해 ALTER EXTENSION pg_clickhouse UPDATE를 실행해야 합니다.
DDL SQL 참고
CREATE EXTENSION
WITH SCHEMA를 사용하세요(권장됨):
ALTER EXTENSION
-
새 릴리스의 pg_clickhouse를 설치한 후에는
UPDATE절을 사용합니다: -
확장 기능을 새 스키마로 이동하려면
SET SCHEMA를 사용합니다:
DROP EXTENSION
CASCADE 절을 사용하십시오:
CREATE SERVER
driver: 사용할 ClickHouse 연결 드라이버입니다.binary또는http여야 합니다. 필수입니다.compression:binary driver용 네이티브 프로토콜 Compression 설정입니다. 값으로는none,lz4, 또는zstd중 하나를 사용할 수 있습니다. 기본값은lz4입니다.http driver에서는 무시됩니다.dbname: 연결 시 사용할 ClickHouse 데이터베이스입니다. 기본값은default입니다.host: ClickHouse 서버의 호스트 이름입니다. 기본값은localhost입니다;port: ClickHouse 서버에 연결할 때 사용할 포트입니다. 기본값은 다음과 같습니다:driver가binary이고host가 ClickHouse Cloud 호스트인 경우 9440driver가binary이고host가 ClickHouse Cloud 호스트가 아닌 경우 9004driver가http이고host가 ClickHouse Cloud 호스트인 경우 8443driver가http이고host가 ClickHouse Cloud 호스트가 아닌 경우 8123
min_tls_version: TLS를 사용하는 연결에서 협상할 최소 TLS 프로토콜 버전입니다. 값으로는TLSv1,TLSv1.1,TLSv1.2, 또는TLSv1.3중 하나를 사용할 수 있습니다. 기본값은 TLS 라이브러리 자체의 최소 버전입니다. 두 드라이버 모두에 적용됩니다.secure: 연결에 사용할 TLS를 제어합니다. 값은 다음 중 하나입니다:auto(기본값):host가 ClickHouse Cloud 호스트이거나port가 보안 포트이면 TLS를 사용하고, 그렇지 않으면 plaintext를 사용합니다.on(또는true/yes/1): 항상 TLS를 사용합니다. 기본port는 8443 (http) 또는 9440(binary)입니다.off(또는false/no/0): TLS를 사용하지 않습니다. 기본port는 8123 (http) 또는 9000(binary)입니다.
ALTER SERVER
DROP SERVER
CASCADE를 사용하십시오:
CREATE USER MAPPING
taxi_srv 외부 서버를 통해 연결할 때 현재 PostgreSQL 사용자를 원격 ClickHouse 사용자에 매핑하려면
다음과 같이 하십시오:
user: ClickHouse 사용자의 이름입니다. 기본값은 “default”입니다.password: ClickHouse 사용자의 비밀번호입니다.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO를 사용하십시오:
EXCEPT를 사용합니다:
CREATE FOREIGN TABLE
database: 원격 데이터베이스의 이름입니다. 기본값은 외부 서버에 정의된 데이터베이스입니다.table_name: 원격 테이블의 이름입니다. 기본값은 외부 테이블에 지정된 이름입니다.engine: ClickHouse 테이블에 사용되는 [테이블 엔진]입니다.CollapsingMergeTree()및AggregatingMergeTree()의 경우, pg_clickhouse는 테이블에서 실행되는 함수 표현식에 매개변수를 자동으로 적용합니다.
-
column_name: ClickHouse 쪽 컬럼의 이름입니다. 쿼리와 삽입을 deparse할 때 PostgreSQL 속성 이름보다 우선적으로 사용됩니다. 따옴표 없는 소문자 PostgreSQL 컬럼 이름을 대소문자를 구분하는 ClickHouse 컬럼에 매핑할 때 유용합니다. 예를 들면 다음과 같습니다. -
AggregateFunction: AggregateFunction Type 컬럼에 적용되는 집계 함수의 이름입니다. 데이터 타입을 함수에 전달되는 ClickHouse 타입에 매핑하고, 적절한 컬럼 옵션으로 집계 함수 이름을 지정하면 pg_clickhouse가 해당 컬럼을 평가하는 집계 함수에Merge를 자동으로 추가합니다. -
SimpleAggregateFunction: SimpleAggregateFunction Type 컬럼에 적용되는 집계 함수의 이름입니다. 데이터 타입을 함수에 전달되는 ClickHouse 타입에 매핑하고, 적절한 컬럼 옵션으로 집계 함수 이름을 지정하십시오.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE 절을 사용하십시오:
DML SQL 참고
EXPLAIN
VERBOSE 옵션을 사용하면
ClickHouse “Remote SQL” 쿼리가 출력됩니다:
SELECT
nodes 테이블의 로컬 복사본을 만들고 이를 조인 대상으로 사용합니다:
node_id를 기준으로 그룹화하면 더 많은 집계를 ClickHouse에서 처리하도록 할 수 있으며, 이후 lookup 테이블과 조인할 수 있습니다:
node_id별 집계를 푸시다운하여,
Postgres로 다시 가져와야 하는 행 수를 1000개(전체)에서
각 노드당 1개씩인 단 8개로 줄입니다.
파티션 테이블
enable_partitionwise_aggregate를 활성화하면 PostgreSQL은 Append 아래에서 부분
집계를 수행한 후, 위의 최종 집계에서 이를 결합하여 결과를 생성합니다. pg_clickhouse는 외부 파티션의 부분 집계를
ClickHouse로 푸시다운합니다:
부분 집계가 푸시다운되는 경우
- 전이 상태가 이미 최종 값인 분해 가능한 집계 함수는 직접 푸시다운됩니다.
여기에는
count,sum,min,max,bool_and/every,bool_or,bit_and,bit_or,bit_xor가 포함됩니다. - **정수에 대한
avg**는{count, sum}상태를 배열로 푸시다운합니다. - **부동 소수점에 대한
avg,var_pop,var_samp,stddev_pop,stddev_samp**는{N, sum, 제곱 편차의 합}상태를 배열로 푸시다운합니다.
FILTER (WHERE …)는 이러한 집계 함수와 함께 푸시다운됩니다.
폴백되는 경우
internal 유형인 집계 함수는 이식 가능한 표현이 없으므로, 외래 파티션에서 해당 행을 가져와 로컬에서 집계합니다. 여기에는 numeric에 대한 모든 집계와 avg(bigint), avg(interval)이 포함됩니다. DISTINCT, 순서 집합 및 가변 인수 집계 함수도 폴백됩니다.
PREPARE, EXECUTE, DEALLOCATE
{param:type} 형식 [쿼리 매개변수]를 전송합니다:
매개변수:
INSERT
COPY
⚠️ Batch API 제한 사항 pg_clickhouse는 아직 PostgreSQL FDW 배치 삽입 API를 지원하지 않습니다. 따라서 현재 COPY는 레코드를 삽입할 때 INSERT SQL 문을 사용합니다. 이 부분은 향후 릴리스에서 개선될 예정입니다.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings 매개변수는 이후 쿼리에 설정할 [ClickHouse
설정]을 지정합니다. 예시:
join_use_nulls 및 IN 계열의 transform_null_in
(IN 및 NULL 의미 체계 참조).
date_time_output_format: http driver는 이 값을 “iso”로 요구합니다format_tsv_null_representation: http driver는 기본값을 요구합니다output_format_tsv_crlf_end_of_line: http driver는 기본값을 요구합니다
pg_clickhouse.session_settings를 설정하기 전에 pg_clickhouse가 먼저 로드되어야 합니다. 이를 위해 [공유 라이브러리 사전 로드]를 사용하거나, 확장 기능에 포함된 객체 중 하나를 사용해 로드되도록 하면 됩니다.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex 매개변수는 pg_clickhouse가
정규식 함수와 연산자를 푸시다운할지 여부를 제어합니다. 기본값은 푸시다운을 수행하는 것이며,
푸시다운하지 않도록 하려면 이 매개변수를 false로 설정하십시오:
ALTER ROLE
SET 명령을 사용하면 pg_clickhouse를 사전 로드하거나
특정 역할별로 매개변수를 SET할 수 있습니다:
RESET 명령을 사용하십시오:
사전 로드
session_preload_libraries
데이터 타입
모든 컬럼은
text, varchar 또는 다른 문자열 타입으로도 읽을 수 있습니다. 값은
먼저 위의 PostgreSQL 타입으로 변환된 후 해당 타입의 출력 함수를 통해 렌더링됩니다.
bigint 최댓값을 초과하는 UInt64 값은 여전히 오류가 발생하므로, 이러한 값은
ClickHouse toString() 함수를 사용해 렌더링하십시오.
추가 참고 사항과 세부 내용은 아래에서 설명합니다.
BYTEA
SELECT 쿼리의 출력 결과는 다음과 같습니다:
Function 및 연산자 참고
함수
clickhouse_raw_query
host=localhost port=8123인 연결 문자열을 지정합니다. 지원되는 연결
매개변수는 다음과 같습니다.
driver: 사용할 연결 드라이버로, “http” 또는 “binary” 중 하나이며 기본값은 “http”입니다.host: 연결할 호스트입니다. 필수입니다.port: 연결할 포트입니다. “http” 드라이버의 기본값은8123이고, “binary” 드라이버의 기본값은9000입니다.host가 ClickHouse Cloud 호스트인 경우 각각8443또는9440으로 변경됩니다.dbname: 연결할 데이터베이스의 이름입니다.username: 연결에 사용할 사용자 이름입니다. 기본값은default입니다.password: 인증에 사용할 비밀번호입니다. 기본값은 비밀번호 없음입니다.
\N)을 반환하지만, 값별
표현 방식은 다릅니다. “http” 드라이버는 ClickHouse’s 자체 TSV
포맷을 그대로 반환하는 반면, “binary” 드라이버는 각 값을
PostgreSQL 출력 함수에 전달합니다.
기본적으로 이 함수에 대해 EXECUTE 권한을 가진 역할은 없습니다. 따라서 정당한 이유로 ad-hoc ClickHouse
쿼리를 실행해야 하는 역할(예: 전용 ClickHouse 관리자 역할)에만 GRANT로
권한을 부여하는 것이 좋습니다.
레코드를 반환하지 않는 쿼리에 유용하지만, 값을 반환하는 쿼리의 결과는
단일 텍스트 값으로 반환됩니다.
clickhouse_server_version
major.minor.patch 형식으로 반환합니다. 필요한 경우 서버’s 옵션과 현재 사용자의 사용자 매핑을 사용하여 연결합니다:
SELECT version() 쿼리로 가져온 뒤 연결이 유지되는 동안 캐시합니다.
clickhouse_query
driver,
자격 증명, 데이터베이스, 연결 캐시를 재사용합니다.
첫 번째 인수는 CREATE SERVER로 생성한 서버 이름입니다. 컬럼 정의 목록
(AS name(col type, ...))은 필수입니다. PostgreSQL은 행을 가져오기 전에 결과 구조를 알아야 하며,
이 구조는 쿼리가 반환하는 컬럼과 일치해야 합니다. 값은 외부 테이블 컬럼과 동일한 방식으로
ClickHouse에서 선언된 타입으로 변환됩니다. DDL처럼 결과를 반환하지 않는 SQL 문은
선언할 항목이 없으므로, 대신
clickhouse_perform을 사용하여 실행하십시오.
기본적으로 어떤 역할에도 EXECUTE 권한이 없습니다. 역할이
이 함수를 사용할 수 있도록 GRANT하십시오.
clickhouse_perform
clickhouse_query에서 선언할 결과 구조가 없는 SQL 문에 사용하십시오. 서버는
clickhouse_query와 동일한 방식으로 확인하며, 해당 함수의 driver,
자격 증명, 데이터베이스 및 연결 캐시를 재사용합니다.
프로시저이므로 SELECT가 아닌 CALL로 호출해야 하며, 행을 반환하지
않습니다. 기본적으로 어떤 역할에도 EXECUTE 권한이 없습니다. 프로시저 사용을 허용하려면 역할에
GRANT하십시오.
푸시다운 함수
HAVING 및 WHERE 절)에 사용되는 PostgreSQL 내장 함수 일부를 ClickHouse로 푸시다운합니다. 이 함수 집합은 다음과 같이 ClickHouse의 대응 함수에 매핑됩니다:
abs: absfactorial: factorialmod(int2/int4/int8/numeric): 나머지pow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi는 이름이 같은 ClickHouse 수학 함수입니다.asin,acos,atanh,acosh는 푸시다운되지 않습니다: PG는 범위를 벗어난 입력에서 오류를 발생시키지만 CH는NaN을 반환합니다.date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
extract(field FROM source): 매핑은date_part와 동일합니다date(timestamp)&date(timestamptz): toDate (CH 별칭date로 다시 표현됨)array_position: indexOf와0을NULL로 변환하는 nullIf, 그리고 검색 시작 인덱스를 지정하는 세 번째 인수가 있을 때 arraySlice를 사용합니다. 현재nan은 일치하지 않습니다array_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovecardinality: lengtharray_length(array, 1):nullIf(length(array), 0)array_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + 배열 인덱스trim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: trimLeftrtrim: trimRightconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_match: 정규식에 괄호로 묶인 서브표현식이 포함되어 있으면 extractGroups, 그렇지 않으면 extractAll을 arraySlice로 슬라이스합니다.regexp_replace: replaceRegexpOne 또는g플래그가 있으면 replaceRegexpOneregexp_split_to_array: splitByRegexpmd5: MD5fmt가 대소문자를 구분하지 않는 string constant인 경우의encode(bytea, fmt):encode(bytea, 'hex'): hex PostgreSQL이 소문자 hex를 생성하므로 lower로 감쌉니다.encode(bytea, 'base64'): base64Encode PostgreSQL의 MIME(RFC 2045) 형식에 따라 76자마다 삽입되는 줄 바꿈을 재현하기 위해 replaceRegexpAll로 감쌉니다.encode(bytea, 'base64url')(PostgreSQL 19+): base64URLEncode, padding 없이 PostgreSQL의 RFC 4648 URL 알파벳과 일치합니다.
json_extract_path_text: 서브컬럼 구문json_extract_path: toJSONString + 서브컬럼 구문jsonb_extract_path_text: 서브컬럼 구문jsonb_extract_path: toJSONString + 서브컬럼 구문bit_count(bytea): bitCountto_timestamp(float8): toDateTime64to_char(timestamp[tz], fmt): formatDateTimefmt가 모든 키워드에 대해 ClickHouse에 정확히 대응하는 값이 있는 string constant인 경우입니다. 지원되는 키워드는 호환성 참고 사항의 to_char()를 참조하십시오. 그렇지 않으면 이 함수는 PostgreSQL에서 로컬로 실행됩니다.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now와 toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_SCHEMA: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_CATALOG: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_USER: PostgreSQL 함수의 값으로 전달됩니다.USER: PostgreSQL 함수에서 값으로 전달됩니다.CURRENT_ROLE: PostgreSQL 함수의 값으로 전달됩니다.SESSION_USER: PostgreSQL 함수의 값으로 전달됩니다.
푸시다운 연산자
- 배열 슬라이스 (
arr[L:U]): arraySlice @>(배열 포함): hasAll<@(배열에 포함됨): hasAll&&(배열 겹침): hasAny~(정규식 일치): match!~(정규식 불일치): match~*(대소문자를 구분하지 않는 정규식 불일치): match!~*(대소문자를 구분하지 않는 정규식 불일치): match->>(JSON/JSONB 요소를 텍스트로 추출): 서브컬럼 구문->(JSON/JSONB 요소 추출): toJSONString + 서브컬럼 구문
IN 및 NULL 의미 체계
IN을 2값 논리로 평가합니다. 즉, NULL이 관련된 경우에도 프로브에서
일치 항목을 찾지 못하면 0을 반환하는 반면 PostgreSQL은
NULL을 반환합니다. PostgreSQL 의미 체계를 보존하기 위해 pg_clickhouse는 상수 목록 또는 배열에 대한 IN
계열(IN, NOT IN, = ANY, = ALL,
<> ANY, <> ALL)을 무조건 푸시다운합니다. 프로브나 배열 원소가 NULL일 수 없음을
증명할 수 있으면 네이티브 또는 저비용 형식을 사용하고, 그렇지 않으면 런타임에 NULL 값을 확인하는
보호된 CASE 형식을 사용합니다. 이를 통해 SELECT 목록이나
GROUP BY와 같은 값 위치를 비롯한 모든 컨텍스트에서 PostgreSQL의 정확한 3값 결과(TRUE, FALSE, NULL)를
계산합니다.
널 허용 컬럼에 대한 NOT IN (SELECT ...) 필터도 푸시다운되며,
PostgreSQL 동작을 유지하도록 보정 가드가 추가된 형태로 역파싱됩니다. 즉, NULL을 포함하는 Set은
모든 행을 제외하고, NULL 프로브는 빈 Set에 대해서만 통과합니다. NOT NULL 선언으로
불필요함을 증명할 수 있으면 각 가드는 생략됩니다. 위의 배열 형식과 달리 이 가드는 일반 필터 조건(또는
NOT 아래)에서만 적용됩니다. 값 위치의 IN (SELECT ...) 및 그룹화되거나 집계된 하위 쿼리
본문은 여전히 푸시다운하지 않습니다. 컬럼을 NOT NULL로 선언하면 더 저렴한
가드 없는 형식을 전송할 수 있으므로 푸시다운을 극대화할 수 있습니다. IMPORT FOREIGN SCHEMA는
Nullable이 아닌 ClickHouse 컬럼에 대해 이를 자동으로 수행합니다. 이 증명은 NULL이 아닌 상수,
NOT NULL 컬럼 및 이들에 대한 기본 산술 연산(+, -, *, 단항 -)을 대상으로 합니다.
이 규칙은 ClickHouse의 기본값인 transform_null_in = 0을 전제합니다. pg_clickhouse는
ClickHouse 서버 프로필이 이 값을 암묵적으로 변경하지 못하도록
pg_clickhouse.session_settings 매개변수의
기본값을 통해 모든 쿼리에 이를 설정합니다.
transform_null_in = 1로 설정하면 푸시다운된 모든 IN의 의미 체계가 깨집니다.
사용자 지정 함수
확장 기능 푸시다운
re2
@~→ matchre2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
푸시다운 캐스트
CAST(x AS bigint)와 같은 캐스트를 푸시다운합니다. 호환되지 않는 타입에서는 푸시다운이 실패합니다. 이 예시에서 x가 ClickHouse UInt64라면 ClickHouse는 해당 값의 캐스트를 거부합니다.
호환되지 않는 데이터 타입으로의 캐스트도 푸시다운할 수 있도록 pg_clickhouse는 다음 함수를 제공합니다. 이 함수들이 푸시다운되지 않으면 PostgreSQL에서 예외를 발생시킵니다.
푸시다운 집계 함수
- any_value
- array_agg
- avg
- bit_and
- bit_or
- bit_xor
- bool_and / every
- bool_or
- count
- corr
- covarpop
- covarsamp
- min
- max
- stddev_pop
- stddev_samp / stddev
- string_agg
- sum
- var_op
- var_samp /variance
사용자 지정 집계 함수
푸시다운 정렬된 집합 집계 함수
ORDER BY 표현식을 인수로 전달하는 방식으로 ClickHouse [매개변수화된
집계 함수]에 대응됩니다. 예를 들어, 다음 PostgreSQL 쿼리는:
ORDER BY 접미사 DESC 및 NULLS FIRST는 지원되지 않으며, 사용하면 오류가 발생합니다.
percentile_cont(double): quantilepercentile_cont(double[]): quantilespercentile_disc(double): quantileExactLowpercentile_disc(double[]): quantilesExactLow
사용자 정의 정렬된 집합 집계 함수
quantile(double): quantilequantileExact(double): quantileExact
사용자 정의 정렬된 집합 집계 함수
푸시다운 윈도우 함수
OVER (PARTITION BY ... ORDER BY ...) 절과 함께 ClickHouse로 푸시다운됩니다.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(OVER절 사용)
row_number, rank, dense_rank, ntile, cume_dist,
percent_rank)는 ClickHouse에서 이러한 함수의 프레임 사양을 허용하지 않으므로 푸시다운 시 프레임 절을 생략합니다.
호환성 관련 참고 사항
정규식
-
PostgreSQL은 POSIX Regular Expressions를 지원하고 ClickHouse는
RE2 Regular Expressions를 지원합니다. 동작 방식의 차이에 유의하십시오. 정규식이 ClickHouse에서 평가되는 경우(예:
WHERE절)에는 RE2를 사용하고, Postgres에서 평가되는 경우(예:SELECT절)에는 POSIX를 사용하십시오. -
pg_clickhouse는 [Postgres 플래그]를
(?)안의 ClickHouse 정규식 앞에 붙여 전달합니다. 예시는 다음과 같습니다:다음과 같이 바뀝니다 -
둘 다 지원하므로 ClickHouse에서 평가할 때 사용할 수 있는 플래그는
다음뿐입니다:
RE2에서는 이러한 플래그만 지원하므로 다른 [Postgres 플래그]는 사용하지 마십시오.
-
이 표는 새 줄 문자와 줄 끝을 매칭할 때 다양한 플래그(및
s와 동일한, 플래그를 지정하지 않은 경우)의 영향을 요약합니다. Postgres에서는m과p가 부정 문자 클래스([^xyz])가 새 줄 문자와 매칭되는 것을 막지만, ClickHouse의 해당 플래그는 그렇지 않다는 점에 유의하십시오. 그 외의 동작은 ClickHouse와 Postgres에서 동일합니다: - 정규식 함수에 전달된 다른 플래그가 있으면 함수는 푸시다운되지 않습니다.
-
예외는
regexp_replace()로,g플래그도 지원합니다.g가 설정되면 pg_clickhouse는replaceRegexpOne()대신replaceRegexpAll()을 사용하고, 다른 플래그를 앞에 추가하기 전에g플래그를 제거합니다. -
Postgres
regexp_replace()의 대체 인수는 전체 일치를 가리킬 때\&를 지원하지만, ClickHouse에서는 전체 일치에\0를 사용합니다. 함수가 ClickHouse로 푸시다운되는 경우 반드시\0를 사용하십시오. -
일치하는 항목이 없으면 Postgres
regexp_match는NULL을 반환하지만, 푸시다운되는 표현식은 빈 배열을 반환합니다. 반환 값을 호환되게 비교하려면COALESCE()를 사용해NULL대신 빈 배열을 반환하게 하십시오. 예시는 다음과 같습니다:
to_char()
timestamp 및 timestamp with time zone에 대한 PostgreSQL to_char()는 포맷 인수가
비-NULL 문자열 상수이고, 그 안의 모든 PostgreSQL 키워드에 바이트 단위까지 동일한 ClickHouse 대응 항목이 있는 경우에만 ClickHouse formatDateTime으로
푸시다운됩니다. 포맷이 동적이거나
(Const가 아님), 지원되지 않는 키워드 또는 수정자를 포함하는 경우에는
해당 호출은 PostgreSQL에서 로컬로 평가됩니다 — 부분 변환으로는
푸시다운을 전혀 시도하지 않으므로 출력은 PG 호환성을 유지합니다.
numeric, interval 및 기타
타임스탬프가 아닌 타입에 대한 2인수 to_char() 형태는 절대로 푸시다운되지 않습니다. ClickHouse formatDateTime은
날짜-시간 값만 포맷합니다.
번역된 키워드
인용된 텍스트와 리터럴
"..."로 감싼 텍스트는 있는 그대로 전달되며, 리터럴 %는
ClickHouse의 지정자 접두사(prefix)를 이스케이프하기 위해 %%로
두 번 써야 합니다. 따옴표 밖의 \"도 리터럴 "로 그대로 전달됩니다.
"..." 내부에서는 백슬래시가 "에만 이스케이프 문자로 작동하며, 다른 백슬래시
시퀀스는 리터럴 텍스트로 처리됩니다.
David E. Wheeler