하위 호환되지 않는 변경 사항
- 사용자 SQL에서 시작된 S3 액세스는 이제 기본적으로 서버 자체의 클라우드 자격 증명(환경, IMDS/IRSA, 인스턴스 프로필, AWS 구성 파일,
role_arn기반 STS, GCP OAuth 메타데이터)을 확인하지 않습니다. 이러한 요청에는 명시적 자격 증명 또는NOSIGN을 사용해야 합니다. 명명된 컬렉션은 이제 기본적으로use_environment_credentials를0으로 설정합니다. 이전 동작은 요청별로use_environment_credentials = 1을 지정하거나(또는 전역적으로<s3>구성 사용), 새 설정s3_allow_server_credentials_in_user_queries와 함께 사용해 복원할 수 있습니다(기본값은 비활성화). 명시적으로 제공된 자격 증명과 운영자가 프로비저닝한 구성 자격 증명은 영향을 받지 않습니다. 서버 시작 시 또는RESTORE시에는 이러한 자격 증명을 확인하도록 정의된 영구S3/S3Queue테이블, 동적 S3 디스크 또는DataLakeCatalog를 시작을 중단하는 대신 익명으로 로드합니다(자격 증명을 다시 설정하기 전까지는 접근할 수 없음). 이 동작은 새 server settings3_load_table_anonymously_if_credentials_restricted로 제어되며, 기본값은 활성화입니다. #106855 (Raúl Marín). **/글롭(임의 개수의 디렉터리)이 이제 같은 디렉터리에도 일치합니다. 이전에는 글롭 패턴에서**/가 특수한 경우로 처리되지 않았기 때문에data/**/file.txt는data/file.txt(디렉터리 깊이 0)와 일치하지 않았습니다. #97676 (Alexey Milovidov).- 객체 스토리지에 저장된 백업에서는
zip/zipx백업 아카이브 포맷을BACKUP와RESTORE모두에서 거부합니다. 여기에는 직접S3(...)/AzureBlobStorage(...)대상을 사용하는 경우와 S3 또는 Azure 기반Disk(...)대상을 사용하는 경우가 포함됩니다. Zip은 중앙 디렉터리를 읽기 위해 시크가 필요하므로 객체 스토리지에서는 매우 느립니다. 대신tar.gz와 같은 tar 기반 포맷을 사용하십시오. #101770 (Yash ). DateTime64의 지원 범위를[1900-01-01, 2299-12-31]에서[0000-01-01, 9999-12-31]로 확장했습니다. 이제 이전 범위를 벗어나는 값도 경계값으로 잘리지 않고 올바르게 계산됩니다(cctz 사용). 정밀도가 8 또는 9인 경우에는 tick이Int64로 저장되므로 범위가 계속 더 좁습니다(나노초 정밀도에서는 최대값이 여전히2262-04-11입니다). 이전 버전과의 호환성: 과거에 범위를 벗어난 날짜-시간을 사용했고, 이전 범위 내부에서 적용되던 매우 특수한 포화 규칙에 의존했다면 이제 결과가 더 정확한 값으로 바뀐다는 점에 유의하십시오. #107907 (Alexey Milovidov).AggregatingMergeTree는 이제 테이블 생성 시 컬럼이 sorting key의 일부도 아니고 집계 상태 측정값(AggregateFunction/SimpleAggregateFunction)도 아닌 스키마를 거부합니다. 이런 컬럼은 백그라운드 머지 중 임의의 값으로 조용히 축약되어, 해당 컬럼에 대해GROUP BY를 수행하거나 필터링하는 쿼리에서 잘못된 결과를 만들 수 있습니다. 이전 동작을 복원하려면allow_dimensions_outside_sorting_key = 1을 설정하십시오. #751을 해결합니다. #108087 (Alexey Milovidov).- 구성 기반 workload scheduling 구성(
resources및workload_classifiersserver config 섹션)을 제거했습니다. 대신CREATE RESOURCE및CREATE WORKLOAD쿼리를 사용하십시오. 더 이상 사용되지 않는 구성 섹션은 경고와 함께 무시됩니다. #108286 (Sergei Trifonov). - ClickHouse는 이제 동기 삽입과 비동기 삽입 모두에 대해 통합된 삽입 중복 제거 해시를 항상 사용하며, 기존의 삽입별 중복 제거 동작은 제거되었습니다. 서버 설정
insert_deduplication_version은 마이그레이션 안전장치로 유지됩니다. 이 설정이 레거시 값(old_separate_hashes또는compatible_double_hashes)으로 설정되어 있으면 서버는 시작을 거부합니다. 레거시 값을 사용하던 버전에서 업그레이드하려면 먼저compatible_double_hashes를 지원하는 릴리스를 실행해야 합니다(이 릴리스는 레거시 해시와 통합 해시를 모두 기록합니다). 복제된 테이블(Replicated Table)의 경우 최소replicated_deduplication_window_seconds동안 실행하십시오(기본값은 1시간이며, 기본 윈도우 설정에서는 해당 시간 동안의 모든 삽입에 대한 통합 해시를 유지하므로 삽입 재시도 루프에는 충분한 것으로 간주됩니다).non_replicated_deduplication_window> 0인 비복제 테이블의 경우 이 윈도우는 시간 기반이 아니라 개수 기반이므로, 최소 그 횟수만큼compatible_double_hashes로 실행하십시오. 그런 다음 이 버전으로 업그레이드하기 전에 해당 설정을 제거하거나new_unified_hash로 설정하십시오. #108361 (Sema Checherinda).insert_deduplication_version을 한 번도 설정한 적이 없다면 이 항목은 무시해도 됩니다. - 오랫동안 사용 중단되었던
snowflakeToDateTime,snowflakeToDateTime64,dateTimeToSnowflake,dateTime64ToSnowflake함수가 제거되었습니다. 이 함수들은 v24.6에서 이미 사용 중단되었으며, 대신snowflakeIDToDateTime,snowflakeIDToDateTime64,dateTimeToSnowflakeID,dateTime64ToSnowflakeID를 사용해야 합니다. 이를 다시 활성화하는 데 사용되던 설정allow_deprecated_snowflake_conversion_functions는 이제 더 이상 사용되지 않으며 아무런 효과도 없습니다. #108711 (Alexey Milovidov). - 이제 설정
use_legacy_to_time의 기본값은0이므로,toTime은 날짜와 시간이 포함된 값을 고정된 날짜로 변환하는 대신Time데이터 타입으로 변환합니다. 기존 동작은 여전히toTimeWithFixedDate함수를 사용하거나use_legacy_to_time = 1로 설정하여 사용할 수 있습니다. #108729 (Alexey Milovidov). - 이제 Naive Bayes 모델(
naiveBayesClassifier에 사용됨)은 더 이상 지원되지 않는 이전의 서버 측 구성(XML 구성 파일에서 직렬화된.bin모델 파일을 참조하는 방식) 대신, 클래스별로 사전 집계된 n-그램 개수 테이블로부터 로드 시점에 생성되는NAIVE_BAYES레이아웃의 딕셔너리로 구성됩니다. 따라서 기존 모델은 딕셔너리로 다시 생성해야 합니다.naiveBayesClassifier와 함께 3개의 새 함수도 추가되었습니다.naiveBayesClassifierWithProb는 예측된 클래스와 그 확률을 함께 반환하고,naiveBayesClassifierWithAllProbs는 모든 클래스와 각 확률을 반환하며,naiveBayesNgrams는 원시 레이블 텍스트에서 학습 데이터를 만들 수 있도록 딕셔너리와 동일한 방식으로 텍스트를 n-그램으로 토큰화합니다. 또한 여러 성능 최적화가 적용되었습니다. 9.7 MiB 코드 포인트 트라이그램 언어 모델 기준으로 메모리 사용량은 약 49배 줄었고(1.84 GiB에서 38 MiB), 로드는 약 11배 빨라졌으며, 분류도 약 11배 빨라졌습니다. #108773 (Nihal Z. Miaji). - 이제
hasColumnInTable함수는 임의의 원격 서버에서 컬럼을 확인하기 위한 선택적 인수hostname,username,password를 더 이상 받지 않으며,hasColumnInTable(database, table, column)형식만 남아 있습니다. 제거된 원격 모드는 보안상 문제가 있었습니다. 어떤 사용자든 임의의 호스트로 아웃바운드 연결을 유발할 수 있었고, 자격 증명이 쿼리 로그에 노출되었으며, 어떤 privilege로도 제한되지 않았기 때문입니다. #110881 (Alexey Milovidov).
새로운 기능
- 쿼리 성능을 분석하기 위한
EXPLAIN ANALYZE가 추가되었습니다. 쿼리를 실행한 뒤 실제 실행 메트릭을 익숙한 쿼리 계획 형식으로 표시합니다. #106586 (Kirill Kopnev). #110668 (Kirill Kopnev). - 프로젝션 정의에서
WHERE절을 지원합니다.WHERE가 있는 프로젝션은 프레디케이트와 일치하는 행만 구체화하며, 쿼리의WHERE가 프로젝션의WHERE를 함의하는 경우 최적화기는 이를 비용 기반으로 활용할 수 있습니다. #102347 (S Bala Vignesh). skip_unavailable_shards가 활성화된 경우 원격 세그먼트에서 발생한 어떤 예외를 조용히 무시할지 제어하는skip_unavailable_shards_mode설정(Distributedengine 설정으로도 사용 가능)이 추가되었습니다. #79091 (cjw).- 지정한 출력 형식을 사용해 각 그룹의 행을 포맷하고 결과를 문자열로 반환하는
groupFormat집계 함수가 추가되었습니다. #93201 (Yang Hu). kafka_sasl_mechanism의 지원 값으로AWS_MSK_IAM이 추가되어, ClickHouse가 SASL/SCRAM 자격 증명을 관리하지 않고도 IAM 역할을 사용해 Amazon MSK에 인증할 수 있게 되었습니다. #96100 (kalavt).- 집계 함수 조합자
-Tuple이 추가되었습니다. 이 조합자는Tuple컬럼의 각 원소에 기본 집계 함수를 독립적으로 적용하고, 원소 이름을 유지한 채 결과Tuple을 반환합니다. 예를 들어t = (a, b)일 때sumTuple(t)는(sum(a), sum(b))를 반환합니다. 여러 인수를 받는 집계 함수는 인수마다 하나의 tuple을 받아 위치별로 짝지어 처리합니다.corrTuple((a1, a2), (b1, b2))는(corr(a1, b1), corr(a2, b2))를 반환합니다. 배열에 대한-ForEach와 달리 원소는 서로 다른 타입일 수 있으며, 원소별 결과 타입과 이름도 유지됩니다. #98190 (RinChanNOW). - 이제 텍스트 인덱스는
postprocessor인수를 지원합니다. 이는 토큰화 후 각 토큰을 변환하는 임의의 표현식입니다(예:lower). #98939 (Jimmy Aguilar Mena). #108606 (Jimmy Aguilar Mena). stem함수에 지정할 수 있는 모든 언어를 나열하는system.stemmers시스템 테이블이 추가되었습니다. #100611 (Jimmy Aguilar Mena).- 음수
LIMIT에 대해WITH TIES를 지원합니다. #100930 (Nihal Z. Miaji). toTimeZone의 문법적 편의 기능으로 표준 SQLAT TIME ZONE및AT LOCAL후위 연산자를 지원합니다. 이제 표현식expr AT TIME ZONE zone은toTimeZone(expr, zone)와 동일하고,expr AT LOCAL은toTimeZone(expr, timeZone())와 동일합니다. #106092 (lizepeng).URL테이블 엔진과url테이블 함수는 이제 URL scheme에 따라 적절한 백엔드로 dispatch됩니다.file://는File엔진이 처리하고,s3:///gs:///gcs:///oss://는S3,az:///azure:///abfss:///abfs://는AzureBlobStorage,hdfs://는HDFS,http(s)://는 이전과 같이URL엔진이 처리합니다.url_base설정은 scheme dispatch 전에 적용됩니다. 기본url_scheme_mappers로 해석되는 S3 scheme만 dispatch되며, 다른 S3-compatible 공급업체 scheme(cos,obs, …)은 여기에 포함되지 않으므로s3엔진/함수를 직접 사용해야 합니다. #106093 (Alexey Milovidov).remote및remoteSecure테이블 함수의 영구적 대응 버전인Remote및RemoteSecure테이블 엔진이 추가되었습니다. 이제CREATE TABLE ... AS remote(...)뿐 아니라CREATE TABLE ... ENGINE = Remote('addresses', db, table, ...)도 사용할 수 있습니다. #106189 (Alexey Milovidov).Kafka,RabbitMQ,NATS,S3Queue/AzureQueue테이블과 갱신 가능 구체화 뷰의 백그라운드 활동을 하나의 통합된 인터페이스로 제어할 수 있도록, 엔진에 구애받지 않는SYSTEM STOP,SYSTEM START,SYSTEM PAUSE,SYSTEM CANCEL,SYSTEM REFRESH명령과 서버 전체에 적용되는... ALL BACKGROUND형식이 추가되었습니다. 갱신 가능 구체화 뷰에서는 기존SYSTEM ... VIEW명령의 별칭으로 동작합니다. 또한 NATS에서 이러한 제어를 지원하기 위해, 이제 JetStream 테이블은 메시지가 성공적으로 삽입된 후에만 확인 응답합니다(at-least-once. 이전에는 메시지가 전달되면 자동으로 확인 응답되어 삽입이 실패할 경우 유실될 수 있었습니다). 새로운nats_wait_for_flush_interval설정(기본값false, 이전의 저지연 동작 유지)을 사용하면 큐가 비는 즉시 플러시하는 대신 전체 플러시 인터벌 동안 consumption 사이클을 열어 둘 수 있습니다. 새로운nats_commit_on_select설정을 사용하면 JetStream 테이블에 직접SELECT를 실행할 때 읽은 메시지를 consume(확인 응답)합니다. #107476 (Samuel Krempaský).mysql,postgresql,sqlite테이블 함수와 테이블 엔진이 테이블 이름 대신 사용자 쿼리를 받아 외부 데이터베이스에 그대로 전달할 수 있도록 지원이 추가되었습니다. 쿼리는 서브쿼리(SELECT ...)또는query('SELECT ...')형식으로 작성할 수 있습니다. 결과 테이블의 구조는 쿼리 결과로부터 추론되며, 이러한 테이블은 읽기 전용입니다. #46758이 해결되었습니다. Denis Vidiaev의 초기 구현(#79652)을 기반으로 합니다. #107740 (Alexey Milovidov).- 여러 쿼리를 동시에 작업할 수 있도록 ClickHouse Web UI(Play)에 탭이 추가되었습니다. 탭, 탭 제목, 매개변수, 활성 상태, 작은 결과 스냅샷은 새로고침 후에도 유지되며(큰 결과와 이미지 결과는 복원되지 않음), 브라우저 기록 및 URL과 연동되고, 마우스 휠로 전환할 수 있습니다. #107826 (Alexey Milovidov).
QueryRunner테이블 엔진이 도입되었습니다.QueryRunner테이블에 삽입된 레코드는 엔진이 실행할 쿼리를 나타냅니다. 이 엔진은 비동기 쿼리 실행, 생성된 쿼리의 일괄 실행, 원격 클러스터로의 쿼리 전달, 벤치마크, 퍼징, shadow traffic을 사용한 테스트에 활용할 수 있습니다. #107888 (Miсhael Stetsyuk).- GeoJSON
FeatureCollection문서를 출력하는GeoJSON출력 형식이 추가되어, 각 행마다 하나의 feature를 생성합니다. 단일 Geo 타입 컬럼(Point,LineString,MultiLineString,Polygon,MultiPolygon,Ring또는Geometry)은 각 feature의geometry가 되고, 이름이id인 컬럼은 featureid가 되며, 나머지 컬럼은 모두 featureproperties가 됩니다. 이때properties라는 이름의 단일 객체 타입 컬럼(JSON,Map또는 이름 있는Tuple)이 있으면 해당 값이properties객체로 직접 기록됩니다.Ring은 단일 링Polygon으로 기록됩니다. 새format_geojson_validate_geometry설정(기본적으로 활성화됨)은 4개 미만의 점을 가진Polygon이나 닫히지 않은Polygon링처럼 유효한 GeoJSON 도형이 아닌 geometry를 읽거나 쓸 때 거부할지를 제어합니다. 또한 이제GeoJSON입력 형식은id컬럼을String이 아니라Nullable(String)으로 추론하므로,id멤버가 없거나"id": null이 명시된 feature는NULL로 읽혀 빈 문자열""과 구분됩니다. 초기 구현은 Mark Needham이 작성했습니다(#98124). #108065 (Nihal Z. Miaji). QBit컬럼과 기준 벡터 사이의 근사 내적을 계산하는dotProductTransposed함수(별칭scalarProductTransposed)가 추가되어, 기존L2DistanceTransposed및cosineDistanceTransposed함수를 보완합니다. #108100 (Alexey Milovidov). 또한quantizeBFloat16ToInt8Lloyd-Max 코드의QBit(Int8)에서 동작하며 저장된 코드를 실행 중에 dequantize하는 양자화된 transposed 거리 함수cosineDistanceTransposedQuantized,L2DistanceTransposedQuantized,dotProductTransposedQuantized도 추가되었습니다. 부동소수점 기준 벡터는 full-precision 쿼리이며Float32정밀도로 비교됩니다(Float64쿼리는 더 좁은 타입으로 변환됨).Array(Int8)기준은 자체적으로 dequantize되어 대칭적인 quantized-vs-quantized 거리를 계산합니다. #109405 (Alexey Milovidov).QBit데이터 타입(QBit(T, dimension, stride))에 선택적 stride 매개변수가 추가되었습니다. 이 매개변수는 차원 그룹을 별도 스트림에 저장하므로 벡터 검색에서 앞부분 차원만 효율적으로 읽을 수 있습니다(예: Matryoshka embeddings). transposed 거리 함수는 축소된 수의 차원만 읽기 위한 선택적 네 번째 인수used_dims를 받습니다. #108103 (Alexey Milovidov).QBit데이터 타입에Int8타입 지원이 추가되어, 양자화된 8비트 정수 벡터에 대한 저장과 transposed-distance 벡터 검색(L2DistanceTransposed,cosineDistanceTransposed)이 가능해졌습니다. #108105 (Alexey Milovidov).- 새 함수
randomHadamardTransform(vector[, seed[, output_dims]]): 부동소수점 벡터에 대한 deterministic randomized Hadamard transform입니다. 이는 직교하며 norm을 보존하는 회전으로, 양자화 전에 embeddings를 전처리하는 데 유용하고, (truncated된 경우) Johnson–Lindenstrauss / subsampled-randomized-Hadamard random projection으로도 사용할 수 있습니다. #108227 (Alexey Milovidov). - 딕셔너리 정의에서
dictionary_lazy_load설정을 사용해 딕셔너리별 지연 로딩을 구성할 수 있도록 지원이 추가되었습니다. 이를 통해 전역dictionaries_lazy_loadserver setting을 재정의하여, 일부 딕셔너리는 지연 로딩하고 다른 딕셔너리는 즉시 로딩할 수 있습니다. #108314 (Miсhael Stetsyuk). - HTTP 인터페이스의
/docs경로에서 사용할 수 있는 내장 문서 검색 페이지를 추가했습니다. 이 페이지는system.documentation테이블을 즉시 검색하고 참고 문서를 렌더링합니다(구문 강조, 수식, 교차 링크 포함). #108345 (Alexey Milovidov). - 함수
xxHash64Spark를 추가했습니다. 이 함수는 시드42를 사용해String및NULL입력에 대한 Spark 호환xxHash64값을 계산하고Int64를 반환합니다. #108436 (Lalit Yadav). - 이제
ALTER USER,ALTER ROLE,ALTER SETTINGS PROFILE에서MODIFY SETTING name = value의 별칭으로SET name = value를 사용할 수 있습니다. 이는 전체 설정 목록을 교체하는 단독SETTINGS절과 달리, 나머지 설정은 유지하면서 개별 설정만 그대로 변경합니다. 따라서 사용자의 다른 설정이 실수로 지워질 가능성이 줄어듭니다. #108722 (Groene AI). - 기존 제약 조건의 표현식을 그대로 변경할 수 있도록
ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK expr를 지원합니다. #108768 (Alexey Milovidov). - Web UI: 컬럼별 색상 코딩 전환 기능(컬럼 헤더의 🌈 아이콘)을 추가하여 막대, 히트맵, 범주형, 시각화 없음 사이를 전환할 수 있습니다. 선택한 모드는 URL과 브라우저 기록에 저장됩니다. #108873 (Alexey Milovidov).
- 이제
Keeper가ZooKeeper의CreateContaineropcode(19)를 올바르게 처리합니다. 이 기능은 새 옵트인create_container기능 플래그로 제어되며(create_ttl과 마찬가지로 기본적으로 비활성화됨), ensemble 전체 업그레이드 후 활성화할 수 있습니다. 활성화되면 외부ZooKeeper클라이언트(예: JavaZooKeeper3.9+)는ConnectionLoss를 받는 대신Keeper에서 컨테이너 노드를 생성할 수 있습니다. 컨테이너 노드는 예상된ephemeralOwner센티널 값을 보고하며, 리더의 백그라운드 GC 스레드가 자식이 없는 컨테이너를 자동으로 삭제합니다. opcode 19 없이CONTAINERcreate-mode 플래그를 담은 일반Create요청은 계속 거부됩니다(ZBADARGUMENTS). 알려진ZooKeeper클라이언트 중 이 조합을 보내는 경우는 없습니다. 이는 서버 측 프로토콜 호환성만을 위한 것으로, ClickHouse 자체ZooKeeper클라이언트(zkutil)는 변경되지 않았으며 스스로 컨테이너 노드를 생성하는 API도 없습니다. #108908 (unintended). - WGS84 지리 좌표와 UTM 및 MGRS 좌표계 사이를 변환하는 함수
geoToUTM,UTMToGeo,geoToMGRS,MGRSToGeo를 추가했습니다. #108939 (Alexey Milovidov). digits(n, offset[, length])함수를 추가했습니다. 이 함수는 1부터 시작하는offset위치부터n의 숫자를length자리만큼 반환하며,length를 생략하면 숫자의 끝까지 반환합니다. #109012 (Umang Agrawal).- 숫자의 제곱을 계산하는 산술 함수
sqr를 추가했습니다. #109061 (Lalit Yadav). - 계층형 딕셔너리에서 키의 최상위 조상(루트)을 반환하는 새 함수
dictGetRoot를 추가했습니다. 이는dictGetHierarchy(dict_name, key)[-1]와 동일한 편리한 함수입니다. #109459 (Alexey Milovidov). - 딕셔너리 정의를 삭제하지 않고도 딕셔너리 메모리를 해제할 수 있도록
SYSTEM UNLOAD DICTIONARY및SYSTEM UNLOAD DICTIONARIES명령을 추가했습니다. 딕셔너리는 다음에 접근할 때 지연 로드됩니다. #109639 (Matheus Nerone). - 두 기하 데이터가 교차하는지 여부를 반환하는
geometryIntersectCartesian및geometryIntersectSpherical함수를 추가했습니다.polygonsIntersectCartesian/polygonsIntersectSpherical와 달리, 공통Geometry타입을 포함한 모든 기하 데이터 타입(Point,LineString,MultiLineString,Ring,Polygon,MultiPolygon)을 지원하며, 두 인수는 서로 다른 타입일 수도 있습니다. #110062 (Alexey Milovidov). - 이제 쿼리 매개변수(
{name:Type}치환)를 설정 값으로 사용할 수 있습니다. 이는 쿼리의SETTINGS절(SELECT또는INSERT등)과 별도의SET쿼리 모두에서 지원됩니다. 예:SELECT ... SETTINGS max_threads = {threads:UInt64}및SET max_threads = {threads:UInt64}. #108760 (Alexey Milovidov).
실험적 기능
url테이블 함수와URL테이블 엔진의 와일드카드 확장: URL 경로의 와일드카드는 HTTP 인덱스 페이지(HTML 또는 plaintext 디렉터리 목록)를 나열하고 일치하는 URL을 추출하는 방식으로 확장됩니다. 이때 인덱스 페이지 크기와 읽을 수 있는 디렉터리 수에는 제한이 있습니다.allow_experimental_url_wildcard_from_index_pages설정으로 활성화됩니다. #95181 (Yue Ni).- 이제 Text indexes는 토큰 위치(
support_phrase_search인덱스 인수)를 저장할 수 있으므로,hasPhrase함수에서 직접 읽기를 사용해 정확한 구문 일치를 수행할 수 있습니다. 이를 사용하려면MergeTree설정allow_experimental_text_index_phrase_search를 활성화해야 합니다. #103172 (Elmi Ahmadov). 이 인수는 처음에는positions라는 이름으로 도입되었습니다. #109900 (Elmi Ahmadov). Iceberg테이블에서OPTIMIZE TABLE ... MANIFEST를 통한 manifest 파일 compaction을 지원합니다(allow_experimental_iceberg_compaction설정으로 제어됨). #95174를 해결합니다. #98178 (Smita Kulkarni). 또한 manifest 파티션 튜플이 해당 파티션 사양과 일치하지 않을 때Iceberg테이블의OPTIMIZE TABLE ... MANIFEST가 올바르게 동작하도록 수정했습니다. #111368 (Smita Kulkarni).- 실험적
ALPcodec에 Real Doubles(RD) 변형과 선택적ALP(AUTO|STD|RD)인수를 추가했습니다. 이제 단독ALP는 항상STD를 사용하는 대신, 기존STD방식과RD사이에서 자동으로 선택합니다. #99654 (Nazarii Piontko). - 역직렬화된
Paimon메타데이터 파일(manifest 목록 및 manifests)을 위한 메모리 내 SLRU 캐시를 추가했습니다.use_paimon_metadata_files_cache설정으로 활성화하면 동일한Paimon테이블에 대한 반복 쿼리 시 객체 스토리지에서 메타데이터를 다시 다운로드하고 다시 파싱하는 과정을 건너뜁니다. #104657 (XiaoBinMu). - 실행형 사용자 정의 함수용 “드라이버”를 추가했습니다.
<user_defined_executable_function_drivers_config>에 선언된 드라이버는CREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...'에서 사용할 수 있으며, 함수 생성 시점에 사용자 코드 스니펫을 컴파일하거나 다른 방식으로 처리해 실행 가능한 executable UDF를 생성할 수 있습니다. 생성된 구성은<dynamic_user_defined_executable_functions_path>에 저장되며, 원본 쿼리는ATTACH FUNCTION으로 영속화되어 서버를 재시작해도 함수가 유지됩니다. 개념 증명용c_function_body드라이버는executable_pool모드에서 샌드박스된 Docker 컨테이너 내부의 C 함수 본문을 컴파일하고 실행합니다. Daniil Timižev의 초기 구현(#77128)을 기반으로 합니다. #105131 (Alexey Milovidov). - 프레디케이트가 컬럼을 기본값과 비기본값으로 정확히 나눌 때, 데이터 스캔 없이
serialization.json의 컬럼별 희소성 통계를 사용해SELECT count(*) FROM t WHERE col <op> default(col)를 처리합니다(새 실험적 설정optimize_trivial_count_with_sparsity_filter로 제어되며 기본적으로 비활성화됨). #105890 (Raúl Marín). - 이제
/api/v1/query및/api/v1/query_range에 대한 Prometheus Query API 요청이read_rows및read_bytes메트릭과 함께system.query_log에 기록됩니다. #106611 (James Cunningham). - 실험적
ReaderExecutor읽기 경로(use_reader_executor, 기본적으로 비활성화)는 이제 원격 소스 connection을 열린 상태로 유지하고 순차 읽기 전반에 걸쳐 재사용할 수 있어, scan 시 객체 스토리지 요청 수를 줄입니다. #107735 (Sema Checherinda). 이제 암호화된 파일 읽기도 지원하며, 전역 encryption header cache는encryption_header_cache_sizeserver setting으로 구성하고SYSTEM DROP ENCRYPTION HEADERS CACHE로 비웁니다. #109702 (Sema Checherinda). make_distributed_plan이 활성화되면MergeTree계열 테이블의SELECT ... FINAL에 대해 분산 쿼리 계획 읽기를 지원합니다. #108148 (Alexander Gololobov).MergeTree쿼리에 대해 계획 기반 병렬 레플리카 실행 기능을 실험적으로 추가했습니다. #108504 (Igor Nikonov).- 실험적
Quantize벡터 코덱 계열과 양자화된 companion stream에 대한 선택적 2단계 근사 벡터 검색 재작성을 추가했습니다. #108565 (Shankar Iyer). - 원래 Konstantin Vedernikov이 구현한(#83088)
Float32/Float64(및 해당 배열) column용 실험적SZ3오차 경계 손실 압축 코덱을 다시 활성화했습니다.allow_experimental_codecs가 필요합니다. #108788 (Alexey Milovidov). 이전에는CORRUPTED_DATA오류와 함께 실패하던SZ3('ALGO_LORENZO_REG', ...)로 압축된 데이터 읽기를 수정했으며, 유한하지 않은 floating-point 값(NaN및 무한대)을 압축할 때 발생할 수 있는 undefined 동작도 방지했습니다. #110762 (Alexey Milovidov). - 실험적
ZXC코덱을 추가했습니다. 이 코덱은 압축은 느리지만 압축 해제는 매우 빠른 비대칭 LZ 코덱이며, 압축률은LZ4와ZSTD사이입니다.allow_experimental_codecs = 1이 필요하며,system.compression_codecs에서는 실험적 기능으로 표시됩니다. #110620 (Alexey Milovidov). #111007 (Alexey Milovidov). - 이제
onelake_client_id및onelake_client_secret대신onelake_bearer_token설정을 통해 미리 획득한 Bearer token으로 OneLake에 인증할 수 있습니다. 이렇게 하면 장기간 유효한 클라이언트 시크릿을 공유하지 않아도 됩니다. 토큰은 갱신되지 않으므로 만료되면 데이터베이스를 다시 생성해야 합니다. #109104 (Asya Shneerson). - AI 함수는 더 이상 명명된 컬렉션을 첫 번째 위치 인수로 받지 않습니다. 자격 증명은
ai_function_text_default_credentials/ai_function_embedding_default_credentials설정 또는 선택적 후행Map(String, String)인수의credentials키에서 가져오며, 이 인수에는 조정 가능한 값(model,max_tokens,temperature,system_prompt,instructions,dimensions)도 함께 포함됩니다. #109232 (George Larionov). 이제aiEmbed함수는 명명된 컬렉션에서 읽는 대신model을 필수 위치 인수(aiEmbed(text, model[, params]))로 받으며, 이를 통해 embeddings의 재현성을 보장합니다. #110619 (George Larionov). skp_idx.packed에 패킹된 skip 인덱스(packed_skip_index_max_bytes로 제어됨)의data_uncompressed_bytes를 수정했습니다. 보고되던 압축되지 않은 크기가 실제로는 압축된 크기였으며, 이로 인해distributed_index_analysis가 활성화되지 않을 수도 있었습니다. #109272 (Raúl Marín).MergeTree테이블에 실험적인 패킹 data part 저장소를 추가했습니다. 이 기능은 스트림마다 파일을 하나씩 저장하는 대신, part 파일 대부분을 단일data.packed아카이브에 저장합니다(프로젝션 및txn_version.txt와 같은 일부 서비스 파일은 여전히 별도로 기록됨).min_bytes_for_full_part_storage,min_rows_for_full_part_storage,min_level_for_full_part_storage설정으로 제어되며, 기본적으로는 비활성화되어 있습니다. 테이블이 패킹된 part를 쓰기 시작하면 이전 server 버전에서는 이를 읽을 수 없으므로, 이 포맷을 활성화하면 server를 다운그레이드할 수 없습니다. #108118 (Raúl Marín).- 실험적인 테이블 함수
eval을 추가했습니다. 이 함수는 상수 표현식을 쿼리 문자열로 평가한 뒤, 그 결과로 생성된 단일SELECT쿼리를 실행합니다. 이 기능은 기본적으로 비활성화되어 있으며,allow_experimental_eval_table_function설정으로 활성화할 수 있습니다. 작성자: Yue Ni. #110132 (Alexey Milovidov). - 실험적인 Prometheus remote-write v1 HTTP handler에
zstd압축 지원을 추가했습니다. #110907 (James Cunningham). DeltaLake테이블 쓰기(allow_experimental_delta_lake_writes설정)가 Beta로 승격되었습니다. #107034 (Kseniia Sumarokova).- 실험적인 distributed query 계획(
make_distributed_plan)의 실행을 관찰할 수 있도록ProfileEventsDistributedPlanRemoteTasks,DistributedPlanLocalExecution,DistributedPlanHostsUsed를 추가했습니다. #107985 (Shankar Iyer). - Keeper에서 RocksDB 기반의 실험적인 저장소(
experimental_use_rocksdb)를 제거했습니다. 더 나은 새로운 온디스크 저장소가 곧 제공될 예정입니다. #108000 (Michael Kolupaev). - 분산 인덱스 분석(실험적 기능이며
distributed_index_analysis설정으로 제어됨)은 이제 큰 data part 이름 목록을 쿼리 텍스트에 포함하는 대신 스칼라 값으로 remote server에 전송합니다. 이를 통해max_ast_elements/max_query_size제한으로 인한 잠재적인 실패를 방지하고 AST 파싱 오버헤드를 제거합니다. #110419 (Azat Khuzhin). - 실험적인
timeSeries*ToGrid집계 함수를 최적화했습니다. 이제 buckets가 step과 윈도우 둘 다에 정렬되며, 윈도우가 step보다 훨씬 클 때 최종 집계가 훨씬 더 빨라집니다. 집계 state의 serialization 포맷은 호환되지 않는 방식으로 변경되었습니다(이 함수들은 실험적 기능입니다). #106724 (Vitaly Baranov). TimeSeries테이블의 external target table이 이제 참조 의존성으로 등록됩니다. materialized view와 마찬가지로, 이를 참조하는TimeSeries테이블을 삭제하기 전에는 external target table을 삭제할 수 없습니다(check_referential_table_dependencies가 활성화된 경우). #108388 (Vitaly Baranov).- PromQL 함수
increase를 추가했습니다. #111023 (Vitaly Baranov).
성능 개선
- 이제
JOIN은 왼쪽 테이블에서 프라이머리 키 인덱스 또는 스킵 인덱스를 사용해 그래뉼을 프루닝할 수 있습니다. 이 동작은enable_join_runtime_filters_index_analysis설정으로 제어됩니다. #109085 (Shankar Iyer). - 이제 단순 직렬화가 가능한 타입 벡터의 직렬화와 역직렬화는 개별 요소를 처리하는 대신 단일 버퍼 I/O 호출을 사용합니다. #89842 (Jimmy Aguilar Mena).
- 역방향 딕셔너리 조회를 최적화했습니다. 이제
WHERE dictGet(dict, attr, key_expr) = value와 같은 상수 동등 조건은IN (SELECT ... FROM dictionary(...))서브쿼리로 재작성되는 대신 키 필터(key_expr = const,key_expr IN [...], 또는WHERE 0)로 직접 상수 폴딩되며,dictGetKeys의 상수 경로도 병렬로 실행됩니다. #91164 (Nihal Z. Miaji). - 각 데이터 파트의 프라이머리 키 인덱스를 일반 제외 검색 알고리즘이 분석하는 데 사용할 수 있는 단계 수를 제한하는 새로운 설정
merge_tree_generic_exclusion_search_max_steps를 추가했습니다. 이 예산은 가장 큰 남은 키 범위부터 먼저 사용되므로, 예산이 작아도 데이터의 대부분을 프루닝할 수 있습니다. 완전히 분석되지 않은 범위는 전체를 읽으므로 쿼리 결과의 정확성은 유지되지만 더 많은 그래뉼을 읽을 수 있습니다. 이 제한은 느슨하게 적용됩니다. 즉, 최대merge_tree_coarse_index_granularity단계까지, 여기에 해당 파트가 이미 분할된 각 범위(예: 쿼리 조건 캐시로 인한 분할)마다 1단계를 더한 만큼 초과될 수 있습니다. 기본값 0은 단계 수가 무제한임을 의미합니다. #92779 (Michael Jarrett). - 이제
Distributed테이블 위의 뷰에 대해ORDER BY와LIMIT가 있는 쿼리는 merge-sorted-streams 최적화를 사용합니다. 외부ORDER BY/LIMIT가 단순 뷰의 내부 쿼리로 푸시다운되므로 각 샤드는 데이터를 로컬에서 정렬하고, coordinator는 전체 정렬을 수행하는 대신 사전 정렬된 스트림을 머지합니다. #94102 (matanper). optimize_or_like_chain을 기본적으로 활성화했습니다. #87779를 종료합니다. #94517 (Alexey Milovidov).- 불필요한 백그라운드 작업을 방지하기 위해 TTL이 없는 순환 비복제
MergeTree시스템 로그 테이블을table_readonly로 표시합니다. 이제table_readonlyMergeTree설정은 일반MergeTree테이블의 모든 백그라운드 작업도 억제합니다. 여기에는 일반 머지, TTL(DELETE/MOVE/재압축) 및 재압축 머지, 백그라운드 뮤테이션, 백그라운드 파트 이동이 포함됩니다. 또한 기존에 거부하던 insert, 뮤테이션,OPTIMIZE외에도 변경을 수반하는 파티션 명령(ATTACH/MOVE/DROP/DROP DETACHED/FETCH/REPLACE PARTITION및 테이블로의MOVE PARTITION ... TO TABLE)을 거부합니다. 그 결과, TTL이 있는table_readonly테이블은 이 설정이 활성화된 동안 만료된 데이터를 더 이상 정리하지 않습니다. #95079 (Mathuranath Metivier). - 서버에 사용자가 많은 경우
system.users에서 단일 사용자 레코드를 가져오는 성능을 개선했습니다. #96699 (Alistair Evans). - 이제 병렬 레플리카를 사용한 순차 읽기는 더 나은 병렬성을 위해 로컬 읽기와 동일하게 테이블을
max_threads개의 파트로 분할하는 로직을 사용합니다. #101434 (Nikita Taranov). - 파티션 키의 입력 컬럼이기도 한 프라이머리 키 컬럼이 있을 때,
MergeTree테이블의 프라이머리 키 분석에서 파티션 minmax 인덱스 경계를 활용해 더 많은 granule을 프루닝합니다. 예를 들어ORDER BY (id, event_time)및PARTITION BY toYYYYMM(event_time)를 사용하는MergeTree테이블에서는 ClickHouse가 프라이머리 키 인덱스 분석 중event_time의 파티션 minmax 인덱스를 사용해 granule 프루닝 결정을 더 정확하게 내립니다. 이 동작은 새로운 설정use_partition_minmax_for_primary_key_pruning으로 제어됩니다(기본적으로 활성화됨). #103480 (UnamedRus). - Top-K 동적 필터링(
ORDER BY ... LIMIT n)을 사용하는 쿼리에 대해 쿼리 조건 캐시를 활성화합니다. 캐시 항목은 Top-K 계획 매개변수별로 나뉘므로 동일한 쿼리는 캐시된WHERE필터 결과를 재사용하고,LIMIT, 정렬 컬럼 또는 정렬 방향이 달라지면 새 항목이 생성됩니다. #104478 (Alexey Milovidov). use_constant_folding_in_index_analysis설정이 추가되었습니다(기본적으로 비활성화됨). 활성화하면MergeTree프라이머리 키,MinMax및 스킵 인덱스 분석에서 각 part별로 파티션 수준 상수를 필터 프레디케이트에 별도로 반영하여, 예를 들어PARTITION BY a와 함께(a = 1 AND b >= 1) OR (a = 2 AND b > 10)처럼 분기가 파티션 값에 따라 달라지는 필터의 프루닝을 개선합니다. #104582 (Mikhail Artemenko).GROUP BY키가ORDER BY키 및 테이블 정렬 키와 일치할 때 조기 종료가 가능하도록LIMIT을 aggregation-in-order로 푸시해, 읽는 행 수를 크게 줄입니다. #104859 (Konstantin Bogdanov).- 이제 서버 전체 및 사용자별 카운터에 CPU별 atomic 연산을 사용하여 profile events 업데이트가 최대 30배 빨라졌습니다. 이 동작은
user_profile_events_per_cpu서버 설정으로 제어됩니다(64코어 기준 사용자당 약 640 KiB를 사용하므로, 사용자가 매우 많다면 비활성화 상태로 두는 것이 더 적절할 수 있습니다). #105056 (Azat Khuzhin). allow_aggregate_partitions_independently가 기본적으로 활성화됩니다.GROUP BY키가 파티션 키에 잘 맞으면 ClickHouse는 각 파티션을 독립적으로 집계하고 전역 머지 단계를 건너뛸 수 있습니다. 런타임 휴리스틱은 파티션 배치가 불리한 경우(파티션이 너무 적거나 너무 많거나, 파티션 크기 편차가 큰 경우) 이 최적화를 자동으로 건너뜁니다. #105128 (Alexey Milovidov).- rescoring(
vector_search_with_rescoring = 1)을 사용하는 벡터 검색 쿼리는 이제 벡터 인덱스가 반환한 행에 대해서만 정확한 거리를 계산하며, 동일한MergeTreegranule의 인접 행을 brute-force로 rescoring하는 대신 정확한 행 위치 필터를 적용합니다. #105591 (Sergey Kuznetsov). #108846 (Sergey Kuznetsov). - 값마다 비교 호출을 한 번씩 수행하는 대신 값의 연속 구간을 한꺼번에 비교해
FixedString키에서partial_merge조인 알고리즘의 성능을 개선합니다. #105737 (Artem Zuikov). - 데이터 레이크 카탈로그(Iceberg REST, Glue, Unity, Hive, Paimon)의
SHOW TABLES및system.tables는 이제 네임스페이스에 바인딩된 프레디케이트를 카탈로그로 푸시다운하여 전체 카탈로그 스캔을 피합니다. #105022를 해결합니다. #106029 (Smita Kulkarni). - 오버커밋 및 메모리 부족(out-of-memory) 오류를 방지하기 위해 CPU당 추적되지 않는 메모리의 상한을 설정했습니다(상한은
max_per_cpu_untracked_memory및per_cpu_untracked_memory_thread_bufferserver settings로 구성됩니다). #106055 (Azat Khuzhin). - 정렬된 stream에서 동일한 key value가 연속으로 나타나는 구간을 스캔하는 연산자의 성능을 개선했습니다 — in order
DISTINCT, in orderLIMIT BY, 음수 in orderLIMIT BY,full_sorting_merge및partial_merge조인. #106502 (Nihal Z. Miaji). - Apache Arrow 라이브러리를 사용하지 않는
Arrow및ArrowStream포맷용 네이티브 reader와 writer를 구현해 추가 데이터 복사와 변환을 피할 수 있게 했습니다. 이제 이것이 기본값이며(settingsinput_format_arrow_use_native_reader및output_format_arrow_use_native_writer), 읽기와 쓰기 모두에서 더 빠릅니다. #106522 (Alexey Milovidov). - LTO 사용 시 발생하던 thread-cache 손상을 수정한 뒤 jemalloc에 LTO를 다시 활성화해 성능을 개선했습니다. #106898 (Azat Khuzhin).
JOIN의 메모리 사용량을 줄이고 성능을 개선했습니다. 이제 해시 조인의 오른쪽은 compact 8바이트 인덱스 기반 행 참조를 사용하므로, 모든 키 유형에서ALL조인의 해시 테이블 entries가ANY조인만큼 작아졌습니다. 대규모parallel_hash조인 쿼리에서 벤치마크한 결과 —UInt64및String키를 사용하는 1억~3억 행 테이블의INNER및ANY조인에서, 고유 키와 중복 키를 모두 포함한 경우 중앙값 기준 쿼리가 약 12% 더 빨라졌고 peak memory는 약 15% 줄었으며, 느려진 쿼리는 없었습니다.UInt64키의INNER조인이 가장 큰 개선을 보였으며(중앙값 기준 약 21% 더 빨라지고 메모리는 38% 감소), 효과가 가장 컸습니다. #107189 (Harikrishnan Prabakaran).- 단일 컬럼 non-NULL
LowCardinality(String)조인 키를 이제 해시 조인에서 네이티브로 지원합니다. #107264 (Nikita Taranov). dpsub조인 순서 열거 알고리즘(dynamic programming over subsets)을 추가했습니다. 이를 통해dpsize보다 더 낮은 최적화 오버헤드로 최적의 조인 계획을 제공하고 non-inner 조인도 지원합니다. #107351 (Fisnik Kastrati).- 시작 시 파일 시스템 캐시 loading 속도를 높이기 위해 각 cache file의 크기를 파일 이름에 인코딩하도록 했습니다(
<_offset>_<size>가 아니라<offset>_<size>). 이에 따라 파일마다stat를 호출할 필요가 없습니다. 이전 버전에서 기록한 cache file의 loading도 계속 지원합니다. #107415 (Alexey Milovidov). - 불필요한 문자열 머티리얼라이즈를 피함으로써
Array(LowCardinality(String))에 대한arrayElement와LowCardinality(String)키 또는 값을 갖는Map에서 mapLIKE함수의 성능을 개선했습니다. #107450 (Michael Jarrett). - 전체 쿼리의 메모리가 아니라 집계 상태(aggregation state) 자체의 메모리를 추적하도록 해, 메모리 사용량이 작을 때 단일 수준 집계를 two-level aggregation으로 변환하지 않도록 했습니다. #107490 (Hechem Selmi).
- 집계 쿼리 분석 속도를 높였습니다. 이제 집계 해시 테이블 크기 통계를 위한 cache key는 전체 쿼리 AST를 빌드하는 대신 query plan에서 계산합니다. #107643 (Dmitry Novik).
- 각 행을 SipHash로 해시하는 대신 행 값을 기준으로 멀티셋의 키를 구성하여
INTERSECT ALL및EXCEPT ALL(INTERSECT와EXCEPT의 기본 모드)의 성능을 몇 배 향상했습니다. #107649 (Raúl Marín). - 캐시 잠금을 유지하지 않은 상태에서 행 policy 필터를 다시 빌드하도록 하여,
CREATE ROW POLICY와DROP ROW POLICY를 동시에 수행할 때 쿼리 확장성을 개선했습니다. #107917 (Azat Khuzhin). - 단순한 정규식에 대해
match,extract,extractAll,replaceRegexpOne,replaceRegexpAll함수를 LLVM으로 네이티브 코드로 컴파일해 속도를 높였습니다. 이는 새로운 설정compile_regular_expressions로 제어되며(기본적으로 활성화됨), 지원되는 부분 집합에 속하지 않는 패턴은 자동으로 RE2 engine으로 폴백됩니다. #108004 (Alexey Milovidov). - 짧은 offset의 겹치는 복사를 NEON으로 벡터화하여, 고정 폭 정수 컬럼처럼 match offset이 작은 컬럼에서 AArch64(ARM)의 ZSTD 압축 해제 속도를 높였습니다. 예를 들어
UInt64컬럼의 압축 해제는 AWS Graviton 4에서 최대 약 2.3배 빨라졌습니다. #108049 (Alexey Milovidov). - gzip/zlib/deflate 압축 및 압축 해제에
libdeflate라이브러리를 사용하여.gz/HTTP/url/s3데이터와 Parquet GZIP 코덱의 처리 속도를 높였습니다(압축은 더 나은 압축률로 약 1.15배, 압축 해제는 약 1.4–1.5배). #108074 (Alexey Milovidov). - 프라이머리 키 필터와 결합된 텍스트 검색 쿼리의 성능을 개선했습니다. #108114 (Anton Popov).
- 쿼리의 첫 실행 중 수집된 런타임 통계를 사용해 이후 실행을 최적화합니다.
hash조인 알고리즘은 수집된 통계에 따라parallel_hash로 자동 전환할 수 있습니다. #108125 (Hechem Selmi). 또한 새로운 설정join_runtime_filter_size_from_hash_table_stats로 제어되는 기능을 통해, 런타임 조인 통계의 해시 테이블 크기를 사용해 조인 런타임 필터의 크기도 최적화합니다. #108313 (Hechem Selmi). - 고정 크기의 낮은 cardinality 컬럼에 대해 LZ4 압축 해제 속도를 개선했습니다. #108175 (Nikita Taranov).
- 기본 공백 문자를 사용하는
trimLeft/trimRight/trimBoth함수(및 해당 alias인ltrim/rtrim/trim)의 속도를 높였습니다. trim이 필요 없는 연속된 행은 하나의 Batch로 복사하고, 행별 공백 스캔은 실제로 앞이나 뒤에 공백이 있는 행에 대해서만 수행합니다. #108177 (Groene AI). - 패턴이 단일 문자이고 대체 문자열도 단일 문자일 때
replaceAll과replaceRegexpAll의 성능을 개선했습니다(예:replaceRegexpAll(s, ' ', '_')). 이러한 대체는 더 이상 문자열 layout을 바꾸지 않으므로, 이제 컬럼을 한 번만 복사한 뒤 일치하는 바이트를 제자리에서 재작성하고, 각 일치 항목마다 검색 루프를 실행하지 않습니다. #108178 (Groene AI). - 상수 Polygon에 대한
pointInPolygon함수의 성능을 개선했습니다. 이제 전처리된 Polygon 캐시는 원시 상수 인수를 키로 사용하므로, 상수 Polygon은 입력 블록마다 다시 파싱되지 않고 한 번만 파싱됩니다(캐시 미스 시). #108184 (Groene AI). - 기본값인 best-effort 모드(
date_time_input_format = 'best_effort',cast_string_to_date_time_mode = 'best_effort')에서 정규YYYY-MM-DD hh:mm:ss날짜-시간 표현의 파싱 속도를 높였습니다. 이는 해당 기본값이basic에서best_effort로 바뀌면서 발생한 파싱 성능 회귀를 복구합니다. #108187 (Groene AI). - 기능이 비활성화된 경우(
predicate_statistics_sample_rate = 0, 기본값)MergeTree읽기 경로에서system.predicate_statistics_log의 selectivity 카운터를 유지하지 않도록 했습니다. 이로써 모든 읽기에서 granule별 atomic update와O(rows)filter popcount가 제거되어, 특히 AArch64에서 두드러졌던 성능 회귀를 복구합니다. #108190 (Groene AI). precise_float_parsing = 1일 때 텍스트에서 부동소수점 수를 파싱하는 속도를 높여, 거의 모든 입력에서 기본 parser와 같거나 더 빠르게 동작하도록 했습니다. 또한 포함된fast_floatlibrary를 v8.2.10으로 올렸습니다. #108205 (Raúl Marín).- base64 인코딩 및 디코딩 함수에
simdutflibrary를 사용해 성능을 개선했습니다. #108333 (Konstantin Bogdanov). - 비용이 큰 high-cardinality key에 대해
DISTINCT를 최적화했습니다. #108366 (Nihal Z. Miaji). - Linux가 아닌 build(macOS 및 FreeBSD)에서는 jemalloc이 dirty pages를 더 이상 즉시 purge하지 않습니다(
free마다madvisesyscall 1회). 대신 Linux처럼 유한한dirty_decay_ms를 사용하는 background purging thread를 사용합니다. 이로써 재귀 CTE처럼 allocation churn이 많은 workload의 속도가 크게 향상되며(macOS의 재귀 CTE 벤치마크에서 약 2배), RSS에 미치는 영향은 무시할 만한 수준입니다. #108430 (Alexey Milovidov). - 같은
WITHalias를 참조하거나 동일한 부분 표현식을 여러 번 반복하는 표현식(예: 깊게 중첩된if/multiIf체인)에 대해, actions DAG를 구성할 때 공유된 부분 표현식을 다시 만들지 않도록 하여 분석기에서의 query planning 속도를 높였습니다. #108523 (Dmitry Novik). - 이제
ONclause에 비동등 프레디케이트가 포함되어 있어도 동등 key를 기준으로 Runtime Filters를 생성하므로, 동등 및 비동등 조건이 섞인 join에서 해시 조인으로 들어가는 행 수가 줄어듭니다.LEFT ANTI JOIN은 영향을 받지 않습니다. #108579 (Antonio Álvarez Caballero). - 코드베이스 전반에서
-fno-math-errno를 전역으로 활성화하여 compiler가 수학 함수를 더 잘 최적화할 수 있도록 했습니다. #108628 (Nikita Taranov). - 집계 및 join 해시 테이블에 대한 소프트웨어 프리페치 임계값을
4 * L2 cache size에서L2 cache size로 낮춰, 해시 테이블이 더 이상 L2에 들어가지 않으면 프리페치가 활성화되도록 했습니다. 이는 보고된 L2 크기가 큰 플랫폼(예: 2 MiB L2를 사용하는 AArch64)에서 중간 크기 해시 테이블(~1-8 MiB)에 대한GROUP BY및JOIN의 성능 회귀를 복구합니다. #108655 (Groene AI). - 윈도 함수 성능을 개선했습니다. 이제
SELECT *를 포함하는 컬럼 수가 많은 테이블에 대한 윈도 쿼리는 메모리를 훨씬 적게 사용하며 더 빠르게 실행됩니다.quantile*,uniq*,groupArray를 포함한 윈도 집계는OVER ()및OVER (ORDER BY ... RANGE ...)에서 더 빨라졌습니다.cume_dist함수도 더 빨라졌으며,PARTITION BY또는ORDER BY를 사용하는 윈도는 반복값이 많은 컬럼에서도 이제 더 나은 성능을 발휘합니다. #108688 (Nihal Z. Miaji). - 비교식의
AND체인이 많거나 매우 긴 쿼리에 대한 쿼리 분석을 가속했습니다. 이제optimize_and_compare_chain최적화는 쿼리 트리의 상당 부분을 해시하는 대신 작업 예산(새로운 설정optimize_and_compare_chain_max_hash_work) 내에서 수행되며, lambda 해상도는 재귀 방지를 위해 lambda 본문 해시를 더 이상 다시 계산하지 않습니다. #108757 (Alexey Milovidov). - 여러 스레드로
JSON/Dynamic컬럼을 읽을 때 발생하던 성능 회귀를 수정했습니다.input_format_binary_max_type_complexity설정을 값마다 조회하면서 공유 쿼리 컨텍스트의 참조 카운트 경합이 발생해 병렬 읽기가 직렬화되었는데, 이제 설정 값이 스레드별로 캐시됩니다. #108797 (Seva Potapov). s3및 기타 테이블 함수를 통해 객체 스토리지에서 많은 작은 파일을 읽을 때 프리페치가 중단되고 동기식 읽기로 되돌아가, 수많은 초소형 파일에 대한 단일 스레드 및 낮은 동시성 읽기가 크게 느려지던 성능 회귀(#71781에서 도입됨)를 수정했습니다. #108872 (Nikita Fomichev). 이제 객체 스토리지 읽기가 파일 시스템 캐시(filesystem_cache_name)를 경유할 때도 초기 소형 객체 프리페치가 수행되므로, 캐시를 활성화한 상태에서 많은 작은 파일(예:S3Queue수집)을 읽을 때 더 이상 동기식으로 처리되지 않으며 지연 시간의 제약도 받지 않습니다. #109478 (Nikita Fomichev).- 깊게 중첩된 배열 및 튜플 리터럴을 이제 2차 시간이 아니라 선형 시간에 파싱합니다. #108892 (Alexey Milovidov).
parallel_hash조인 알고리즘에서 잠금 경합으로 인한 오버헤드를 줄였습니다. #108938 (Hechem Selmi).- 압축을 수행하는 대신 압축된 크기를 분석적으로 계산하도록 변경해
T64로 인코딩된 컬럼의estimateCompressionRatio를 가속했습니다. #109054 (Raufs Dunamalijevs). - 분산 쿼리 계획의 셔플 단계에 있던 단일 스레드 병목을 제거했습니다. 이제 각 업스트림 스트림이 전체 데이터 스트림을 단일 transform으로 몰아넣는 대신, 대상 버킷별로 자신의 행을 독립적으로 분산합니다. #109206 (Alexander Gololobov).
- Keeper server의 유휴 CPU 사용량을 줄였습니다. #109255 (Michael Kolupaev).
- 공유 데이터에 희소한 경로가 많은
JSON컬럼의 직렬화와 병합을 가속했습니다. 공유 데이터를 경로별 컬럼으로 평탄화할 때 누적된 모든 경로 컬럼을 각 행마다 스캔하던 작업을 제거했고, 기본값을 셀마다 하나씩 삽입하는 대신 누락 구간을 일괄 백필합니다. #109341 (Groene AI). - 컬럼 수가 많은 쿼리에서 표현식 평가에 드는 CPU 오버헤드를 줄였습니다(예: 작은 stride를 사용하는
QBit컬럼에 대한 벡터 검색에서는 각 벡터가 수백 개의 비트 평면 서브컬럼으로 확장되고, 이 모두가 단일*DistanceTransposed호출에 전달되는 경우). #109380 (Alexey Milovidov). - H3 geo 함수(
h3ToGeoBoundary,h3ToGeo,h3CellAreaM2/h3CellAreaRads2,geoToH3)의 성능을 개선했습니다. 사인과 코사인을 함께 계산하고 좌표 변환에서 중복되는 삼각 함수 호출을 제거했습니다. 결과는 바뀌지 않습니다(비트 단위까지 동일). #109399 (Alexey Milovidov). - 비교 및 부호 확장 코드를 분기 없이 처리하도록 변경해, 큰 폭의 정수 타입(
Int128,UInt128,Int256,UInt256및Decimal128처럼 이를 기반으로 하는 타입)의 비교(<,>,<=,>=) 성능을 최대 7배, 부호 있는 정수를Int256으로 변환하는 성능을 최대 7배(양수와 음수가 섞인 데이터 기준) 개선했습니다. #109474 (Manuel). uniqCombined(키 없는 집계 경우 포함) 및uniqHLL12를 최적화했습니다. #109794 (Anton Popov). #109831 (Anton Popov).arraySort및arrayReverseSort함수는 lambda 없이 호출할 때 숫자 배열(Decimal및DateTime64포함)에서 몇 배 더 빨라졌습니다. #109832 (Manuel).- 산술 고속 경로를 활용해, 고정 오프셋 시간대(예: UTC)의
DateTime및DateTime64값에 대한addDays,addWeeks,subtractDays,subtractWeeks처리 속도를 높였습니다. #109836 (Manuel). - 텍스트 인덱스 분석을 최적화했습니다. #109886 (Anton Popov).
parallel_hash조인 알고리즘에서 조인되지 않은 행 처리도 두 가지 경우에 추가로 병렬화했습니다. 잔여 필터가 있는 경우와 작은 조인 키(단일 레벨 해시 맵)인 경우입니다. #110008 (Hechem Selmi).- 내장 web UI 응답(Play UI, 대시보드, 정적 파일 handler)이 이제 클라이언트의
Accept-Encoding헤더에 따라 zstd, gzip, deflate, brotli, lz4, xz, snappy 또는 bzip2로 압축됩니다. 예를 들어/play페이지는 압축되지 않은 약 350 KB에서 zstd 사용 시 120 KB 미만으로 줄어들어, 느린 연결에서 로드 시간을 단축합니다. 이미 압축된 응답은 그대로 유지되며, CDN과 캐시를 올바르게 파티셔닝할 수 있도록Vary: Accept-Encoding도 함께 출력됩니다. #110108 (Sayantanu Dey). - 안전한 경우 필터를 윈도 함수 아래 또는
LIMIT BY아래로 푸시다운합니다. 즉, 그 위에 작성된 프레디케이트(서브쿼리를 감싸는 바깥쪽WHERE또는QUALIFY의 결합 조건)가 윈도PARTITION BY컬럼만 참조하거나,LIMIT BY키 컬럼만 참조하는 경우(n >= 1이고OFFSET이 없는LIMIT n BY), 이제 스토리지까지 도달하여 프라이머리 키 인덱스와 파티션 프루닝, 스킵 인덱스, 프로젝션을 활용할 수 있습니다. 예를 들어SELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x'는 더 이상 전체 테이블을 읽고 윈도 연산을 수행하지 않습니다. #110114 (Groene AI). #110116 (Groene AI). join_use_nulls = 1일 때, 외부 조인의 양쪽 컬럼을 모두 참조하는 NULL 배제WHERE(예:WHERE l.k = 42 AND r.k = 42)는 이제join_use_nulls = 0일 때와 마찬가지로 조인을INNER(또는LEFT/RIGHT)로 변환하고 프라이머리 키를 프루닝합니다. 이전에는 이 경우 이러한 변환이 건너뛰어져 두 테이블을 모두 전체 읽기했습니다. #110121 (Groene AI).- 단일 비상수
Nullable인수를 갖는 함수는 이제 새 null 맵을 할당하고 병합하는 대신, 인수의 null 맵을 결과와 공유합니다. #110151 (Manuel). - 프라이머리 키 인덱스 분석에서 각 hyperrectangle 검사마다 발생하던 힙 할당을 없애, 쿼리 형태에 따라 mark 필터링 속도를 5~26% 높였습니다. #110153 (Manuel).
- 각 요소를 비교하는 루프 대신 벡터화된 리덕션을 사용해 숫자 배열에 대한
arrayMin및arrayMax함수의 성능을 약 1.3~1.5배 향상했습니다. #110163 (Manuel). Delta코덱의 압축 해제를 벡터화했습니다. 이제 8/16/32비트 데이터 타입에서 디코딩이 1.5~5배 빨라졌으며,Delta로 압축된 컬럼 스캔은 최대 20% 더 빨라집니다. #110189 (Manuel).- 상수 needle을 사용하는
Enum컬럼에서 문자열 검색 함수(like,position,match,countSubstrings,hasToken등)의 속도를 높였습니다. 이제 모든 행을 검색하는 대신, 서로 다른 enum 이름만 검색한 뒤 결과를 각 행에 다시 매핑합니다. #110325 (Alexey Milovidov). - 벡터화된 배치 처리를 통해 집계 함수
groupBitOr/groupBitAnd/groupBitXor와 분산 계열(varPop,varSamp,stddevPop,stddevSamp,skewPop,skewSamp,kurtPop,kurtSamp,covarPop,covarSamp,corr)의 속도를 높였습니다. 예측하기 어려운 조건에서-Ifcombinator를 사용할 경우 최대 4배, 이를 사용하지 않는 분산 계열의 경우 최대 3배 빨라집니다. #110461 (Manuel). - text index 분석(어떤 그래뉼을 읽을지 선택하는 단계)의 속도를 높였습니다. 이제 모든 그래뉼을 순회하는 대신 제외 검색을 사용하고, 각 범위 검사마다 임시 비트맵을 생성하지 않습니다. #110530 (Anton Popov).
- 자동
PREWHERE최적화에서Map서브컬럼의 on-disk 크기를 반영하도록 개선했습니다. 이를 통해 #99200에서 도입된PREWHERE성능 회귀를 수정했습니다. #110462의 일부입니다. #110623 (Pavel Kruglov). - 텍스트에서
UUID값을 parsing하는 속도를 개선했습니다(예:JSONExtract에서LowCardinality(UUID)로 추출,toUUID,CAST AS UUID). 이제 16진수를 두 번 처리하지 않고 한 번에 검증하고 변환합니다. #110625 (Groene AI). - 더 빠른 sorting 및 해시 테이블 구현을 사용해
timeSeries*ToGrid집계 함수의 성능을 크게 개선했습니다. #110875 (Nikita Mikhaylov). - 이제
SELECT * FROM t WHERE id와 같은 쿼리는id컬럼에 대해 인덱스 스키핑을 사용합니다. #89222를 해결했습니다. #89603 (Aditya Chopra). - 조인 재정렬 최적화 중 표현식 단계를
JOIN단계에 병합할 수 있도록query_plan_merge_expression_into_join설정(기본적으로 enabled)을 추가했습니다. 이를 통해 조인을 감싸는 서브쿼리(예: 계산된 컬럼이 있는 서브쿼리 내부에JOIN이 있는 경우)를 가로지르는 조인 재정렬이 가능해져, 복잡한 조인 트리를 더 효과적으로 최적화할 수 있습니다. #98533 (Vladimir Cherkasov). - 동일한 표현식에 여러 비교 조건이 있는
ANDchains를 최적화합니다. 즉, 모순을 감지하고(예:a < 3 AND a > 5→false), 불필요한 조건을 제거합니다(예:a = 3 AND a < 5→a = 3). #99736 (Xiaozhe Yu). UNION쿼리의 여러 분기에서 참조되는 Materialized CTEs는 이제 한 번만 구체화되며 모든 분기에서 공유됩니다. 이전에는 각 분기마다 CTE 사본이 별도로 생성되어 인라인된 후 각각 평가되었습니다. #102107 (Dmitry Novik).BackgroundSchedulePool의 스레드는 이제 서버 시작 시 한꺼번에 생성되지 않고, 필요할 때 지연 생성됩니다. 새로운 server settingbackground_schedule_pool_initial_size(기본값16)로 미리 생성할 worker 수를 제어하며, 필요 시 풀은background_schedule_pool_size까지 확장됩니다. 이로써 부하가 낮은 서버의 유휴 스레드 수를 줄일 수 있습니다. #85265를 해결했습니다. #105066 (Alexey Milovidov).JSON타입의 고급 shared data serialization에서 불필요한 mark file 로드를 건너뜁니다. #107051 (Pavel Kruglov).- 함수
pointInPolygon에 사용되는 전처리된 상수 다각형 캐시는 이제 쿼리와 스레드 간에 공유되며, 새로운 서버 설정point_in_polygon_cache_size로 크기 상한이 정해집니다(기본값 256 MiB,0은 캐시 비활성화, 런타임에 변경 가능). 이전에는 캐시가 전처리된 각 다각형의 복사본을max_threads개까지 유지했고, 서로 다른 다각형이 늘어날수록 제한 없이 커졌으며, 서버를 재시작할 때까지 해제되지 않았습니다. 이 캐시는SYSTEM DROP POINT IN POLYGON CACHE로 비울 수 있으며, 현재 사용량은system.metrics의PointInPolygonCacheBytes,PointInPolygonCacheCells,PointInPolygonCacheSizeLimit에 보고됩니다. #106393을 해결했습니다. #107247 (Nihal Z. Miaji). - Keeper는 이제 스냅샷을 디스크에 직렬화해 기록하거나 디스크 간에 스냅샷을 이동하는 동안 내부 스냅샷 잠금을 유지하지 않으므로, 다른 노드로의 스냅샷 전송과 Raft 처리가 더 이상 로컬 스냅샷 생성으로 인해 중단되지 않습니다. #107595 (Antonio Andelic).
- 파일 시스템 캐시의 background eviction을 병렬화했습니다(
keep_free_space_ratio설정으로 제어). 병렬화 수준을 제어하는 새로운 설정keep_free_space_eviction_threads를 추가했으며,keep_free_space_remove_batch의 기본값을100에서250으로 늘렸습니다. #108147 (Kseniia Sumarokova). - Azure Blob Storage의 읽기 후 쓰기 방식 복사(네이티브 복사를 사용할 수 없을 때 backups에서 사용)에서 동시에 스테이징되는 파트 수를
max_inflight_parts_for_one_file로 제한하여, 많은 대용량 파일을 병렬로 복사할 때 과도한 메모리 사용을 방지합니다. #108232 (Smita Kulkarni). - 세 가지 text index 캐시를 모두 전역으로 활성화했습니다. 이전에는 쿼리 내에서만 활성화되었습니다. 또한 포스팅 리스트 캐시 크기는 이제 0으로 설정되어 사실상 다시 비활성화됩니다. 포스팅 리스트는 크기가 크고 캐싱 비용이 너무 높기 때문입니다. #108274 (Robert Schulze).
- 마크 로딩 중 스트리밍 인메모리 마크 압축을 추가하여 최대 메모리 사용량을 줄였습니다. #108285를 해결했습니다. #108325 (Pavel Kruglov).
- 새로운 파일 시스템 캐시 설정
reserve_granularity(기본값 4 MiB)는 더 큰 그래뉼 단위로 공간을 미리 예약하여, 파일 시스템 캐시 공간 예약 핫 패스에서의 잠금 경합을 줄입니다. #108369 (Kseniia Sumarokova). - 파일 시스템 캐시 메타데이터(파일 세그먼트별 및 키별)가 사용하는 메모리 양을 줄였습니다. #108477 (Kseniia Sumarokova).
- 이제
database및tablecolumns에 대한WHEREfilters가 있는system.iceberg_history쿼리는 일치하는 데이터베이스에만 접근하므로, 서버에 관련 없는 원격 데이터베이스가 많은 경우 시간을 절약할 수 있습니다. #108492 (Den Kalantaevskii). - 파일 시스템 캐시에서 불필요한 잠금을 제거하여 잠금 경합을 줄였습니다. #108932 (Kseniia Sumarokova).
BACKUP및RESTORE메타데이터 처리의 메모리 사용량을 줄였습니다. 이제 백업을 열 때(RESTORE용이거나 증분BACKUP의 기반인 경우).backup메타데이터를 인메모리 XML 문서 트리로 로드하는 대신 스트림으로 파싱하므로, 대규모 백업(특히 증분 백업)에서 수 GB 규모의 DOM 트리 할당을 피할 수 있습니다. #109107 (Julia Kartseva). 또한BACKUP을 마무리할 때 더 이상 모든 파일의 파일 정보를 임시 벡터로 복사하지 않으므로, 수백만 개의 파일이 포함된 백업에서 일시적으로 수 GB가 소모되던 문제가 해소되었습니다. #109861 (Julia Kartseva). 백업 엔트리를 기록할 때도 더 이상 현재 호스트의 파일 정보 목록을 복사하지 않습니다. #111162 (Julia Kartseva).- aggregator의 메모리 소모를 줄였습니다. #109224 (Konstantin Vedernikov).
File테이블 엔진을 통해 읽는 로컬Parquet파일에서 쿼리 조건 캐시를 지원합니다(이전에는 객체 스토리지와 데이터 레이크에서만 지원). #109247 (Alexey Milovidov).- 텍스트 인덱스 헤더 캐시의 메모리 사용량을 2~2.5배 줄였습니다. 더 많은 데이터 파트 헤더가 캐시(
text_index_header_cache_size설정)에 들어갈 수 있어 텍스트 검색 쿼리의 디스크 읽기가 줄어듭니다. #109332 (Anton Popov). - 전치 벡터 거리 함수
L2DistanceTransposed,cosineDistanceTransposed,dotProductTransposed가 이제Nullable(QBit)컬럼에 부분 비트 평면 읽기 최적화를 적용하여, 전체 컬럼 대신 요청된 비트 평면만 읽습니다. #109358 (Alexey Milovidov). - 이제
IS NOT DISTINCT FROM및IS TRUE도=와 마찬가지로 기본 키와 MinMax 인덱스를 사용해 그래뉼을 가지치기합니다. 이전에는k IS NOT DISTINCT FROM 42및(k = 42) IS TRUE가 모든 그래뉼을 스캔했습니다. #110006 (Groene AI). - 연결 풀의 연결은 이제 매번 사용 전에 Ping하지 않습니다. 이로써 재사용되는 모든 연결에 추가되던
Ping-Pong왕복이 제거되어 분산 쿼리와clickhouse-benchmark의 지연 시간이 줄어듭니다. 오래된 풀 연결은 타임아웃 0의 폴링(왕복을 추가하지 않는 non-blocking 검사)으로 감지하고, 재연결로 복구합니다. #110068 (Alexey Milovidov). - TLS(HTTPS, S3) 상의 HTTP keep-alive 풀 연결에서 불필요하게 재연결되던 문제를 수정했습니다. 오래된 연결 검사에서 소켓에
poll을 사용했는데, 이 방식은 읽지 않은 TLS post-handshake 레코드(세션 티켓 또는KeyUpdate)를 전달 중인 정상 연결을 닫힌 것으로 잘못 판단했습니다. 이제 일반 소켓에는 non-blockingMSG_PEEK를, TLS 소켓에는SSL_peek/SSL_has_pending를 사용하며, 이를 통해 정상적인 TLS 종료와 일부만 도착한 TLS 레코드도 올바르게 감지합니다. #110402 (Alexey Milovidov). - TopK 동적 필터링(
ORDER BY ... LIMIT k)으로 가속되는 쿼리는 이제 쿼리 조건 캐시를 더 폭넓게 활용합니다. 쿼리에 lazy materialization이 적용된 경우에도 캐시가 채워지며, 이러한 쿼리는 동일한WHERE프레디케이트를 가진 일반 쿼리가 이전에 기록한 엔트리도 재사용할 수 있습니다. #110507 (Shankar Iyer). - 와일드카드(
%,_)가 없는LIKE/NOT LIKE패턴은 이제 정확한 기본 키(primary key) 범위를 사용하므로, 더 넓은 접두사 범위를 읽는 대신 동등한=/!=프레디케이트와 동일한 수의 그래뉼을 읽습니다. #107077 (Groene AI). - 파일 시스템 캐시를 통해 데이터를 읽을 때 발생하던 중복 file segment 잠금 경합(26.1에서 도입된 성능 회귀)을 수정했습니다. #109577 (Kseniia Sumarokova).
Tuple서브컬럼에 정의된 스킵 인덱스가tupleElement(t, 'name'),tupleElement(t, N), 또는t.N으로 필드에 접근할 때, 같은 쿼리에서 전체 tuple도 함께 읽는 경우(예:SELECT *) 사용되지 않던 문제를 수정했습니다. 이제 이러한 모든 형식은 이름이 지정된 서브컬럼 접근인t.name과 동일하게 그래뉼을 가지치기합니다. #110056 (Groene AI).prefer_localhost_replica가 로컬 레플리카를 선택할 때Distributed테이블에서ORDER BY ... LIMIT쿼리가 느려지던 문제를 수정했습니다. 로컬 샤드 계획에서 사전 limit를 제거해 지연 실행 머티리얼라이즈와 동적 top-K 필터링이 적용되지 못하던 문제를 해결했습니다. #110136 (Michael Jarrett).- 인덱스가 단순 컬럼이 아니라 표현식에 정의된 경우(예:
lower(...)전처리기가 있는assumeNotNull(col))ILIKE연산자에 대해 텍스트 인덱스가 사용되지 않던 문제를 수정했습니다. 이러한 쿼리는 인덱스를 사용하는 대신 모든 그래뉼을 읽고 있었습니다. 이 변경으로 #110350이 해결됩니다. #110595 (Elmi Ahmadov). - 파일 시스템 캐시의 잠금 경합을 줄였습니다. 이제 캐시에서 읽는 쿼리는 엔트리의 LRU priority를 업데이트할 때 우선순위 큐 잠금으로 인해 더 이상 블록되지 않습니다. #109065 (Antonio Andelic).
- 필터 전용
postprocessor표현식(예:if(..., '', token))을 사용하는 텍스트 인덱스 쿼리는 이제 빈 토큰을 행별로 머티리얼라이즈하는 대신 미리 버리므로 성능이 향상됩니다. #109049 (Elmi Ahmadov). - 시스템 로그 큐의 잠금 경합을 줄여, 사용량이 많은 클러스터에서 쿼리 테일 지연 시간을 낮췄습니다. #110539 (Sean Haynes).
- 비상수 needle을 사용하는 substring search functions(
position,countSubstrings,multiSearch*,replaceAll,replaceOne및 이들의 case-insensitive 변형과 UTF-8 변형)의 성능을, 단순한 구현 대신 행별 경로에서 SIMD 기반 문자열 검색기를 사용해 최대 1.5배까지 향상했습니다. #110580 (Raúl Marín). - 이제
FINAL, 필터, 그리고 작은LIMIT이 있는ReplacingMergeTree쿼리에는ORDER BY가 없어도 지연 실행 머티리얼라이즈가 적용됩니다. 필터와FINAL머지에 필요하지 않은 컬럼은 limit 적용 후 남은 행에 대해서만 가져오므로, 선택도가 높은 필터와 함께 wide 컬럼을 선택하는 경우 이러한 쿼리가 훨씬 빨라집니다. 이는query_plan_optimize_lazy_materialization및query_plan_max_limit_for_lazy_materialization으로 제어됩니다. #110722 (Nikolai Kochetov). - 중복 제거가 활성화되어 있고 하나의 flush가 여러 파티션으로 나뉘는 경우 async insert 성능을 개선했습니다. 이제 ClickHouse는 각 파티션마다 다시 계산하는 대신, 계산된 중복 제거 해시를 파티션 전반에서 재사용합니다. #111150 (Valery Petrov).
개선 사항
input_format_csv_missing_nullable_as_empty_string설정(기본적으로 비활성화)이 추가되었습니다. 활성화하면 CSV 입력에서Nullable(String)컬럼의 누락된 값은input_format_csv_empty_as_default와 관계없이NULL대신 빈String으로 읽습니다. #58225 (kevinyhzou). #107577 (Alexey Milovidov).- 이제 함수
toDateOrNull,toDateTimeOrNull,toDateTime64OrNull은 모든 네이티브 정수 타입의 정수 인수를 받을 수 있습니다(toDate,toDateTime,toDateTime64와 동일하게 해석되며, 선택적 시간대 인수를 지원함). 결과 타입의 범위를 벗어나는 값은NULL을 반환합니다. 예를 들어toDateTimeOrNull(1583851242, 'Asia/Shanghai')는2020-03-10 22:40:42를 반환하고,toDateTimeOrNull(4294967296)는NULL을 반환합니다. #79791 (Jitendra). system.grants테이블에is_wildcard컬럼이 추가되었습니다. 이 컬럼은 권한 부여에 와일드카드 접두사 매칭이 사용되었는지 여부를 나타냅니다(예:GRANT SELECT ON db*.*). 이전에는 동일한 이름에 대한 와일드카드 권한 부여와 정확히 일치하는 권한 부여를system.grants에서 구분할 수 없었습니다. #92835를 해결합니다. #98577 (DQ).- HTTP 인터페이스에서 Snappy Compression을 허용하고(
Accept-Encoding: snappy), 일반적인file/urlSnappy I/O에서 Hadoop Snappy 블록 포맷과 Snappy framing 포맷 중 하나를 선택할 수 있도록snappy_mode설정을 추가했습니다. #100752 (Alexey Milovidov). analyzer_compatibility_allow_non_aggregate_in_having설정으로 이전 분석기와의 호환성을 지원합니다. 활성화하면 집계가 아닌 AND 조건이HAVING에서WHERE로 이동합니다. #104232 (Dmitry Novik).- 새로운 서버 설정
memory_worker_rss_speculative_reserve_ratio(기본값1.0)가 추가되었습니다. 이 설정은 샘플 간 RSS 증가 속도가 트래커의 메모리 집계보다 빠를 때 전역 memory tracker가 관측된 RSS를 기준으로 메모리를 추가로 추정 예약하도록 합니다. 이로 인해 allocation은 더 이르게MEMORY_LIMIT_EXCEEDED를 받게 되고, kernel OOM-killer가 먼저 동작할 가능성은 낮아집니다. 추정 예약을 비활성화하려면 비율을0으로 설정하십시오. #104976 (Alexey Milovidov). - 파일 시스템 캐시 eviction 활동에 대한 opt-in Prometheus 메트릭(
filesystem_cache_evictions_total,filesystem_cache_evicted_bytes_total,filesystem_cache_evicted_segment_hits,filesystem_cache_evicted_segment_size_bytes및user_id레이블이 붙은 사용자별 변형)이 추가되었으며,system.dimensional_metrics,system.histogram_metrics, Prometheus 엔드포인트를 통해 캐시별로 노출됩니다. 이 메트릭은 캐시 disk-config 설정expose_prometheus_eviction_metrics와expose_prometheus_eviction_metrics_per_user로 제어되며(둘 다 기본적으로 비활성화),SYSTEM RELOAD CONFIG를 통해 런타임에 전환할 수 있습니다. #105020 (Sacheendra Talluri). EXPLAIN [PLAN] actions=1, compact=1, pretty=1이 기본값이 됩니다. #105036 (Kirill Kopnev).DeltaLake통합의 기반 library인delta-kernel-rs를 v0.23.0으로 올렸습니다. #105861 (Smita Kulkarni).clickhouse-disks에du및wc명령을 추가했습니다. 각각 지정한 파일 또는 디렉터리의 전체 크기를 바이트 단위로 출력하고, 파일의 바이트 수, 줄 수, 단어 수를 표시합니다. #106268 (Asya Shneerson).- 새 비동기 메트릭
UntrackedMemory(system.asynchronous_metrics에서 확인 가능)를 추가했습니다. 이 메트릭은 스레드에서 이미 할당되었지만 아직 전역 메모리 추적 카운터에 반영되지 않은 메모리를 보고합니다. 각 스레드는 작은 할당을 로컬에 누적한 후 한꺼번에 보고합니다. 이를 통해MemoryTracking과 프로세스의 실제 메모리 사용량 사이에 차이가 나는 이유를 설명할 수 있습니다. 이제MEMORY_LIMIT_EXCEEDED오류 메시지에도 추적되지 않은 메모리 양이 포함되므로, 쿼리 또는 서버가 메모리 제한에 도달한 이유를 더 쉽게 파악할 수 있습니다. #106386 (Miсhael Stetsyuk). - ClickStack(관측성 UI)을 버전 2.28.0으로 업그레이드했습니다. #106406 (Aaron Knudtson).
dotProduct에BFloat16지원을 추가하고 SIMD 경로에 배칭을 적용해 성능을 개선했습니다. #106569 (Nikita Taranov).max_named_collection_num_to_throw,max_table_num_to_throw,max_replicated_table_num_to_throw,max_view_num_to_throw,max_dictionary_num_to_throw,max_database_num_to_throw설정을 서버 재시작 없이 변경할 수 있도록 했습니다. #106821 (Maxim Orlovsky).s3_storage_class_name설정에서STANDARD및INTELLIGENT_TIERING외에도REDUCED_REDUNDANCY,STANDARD_IA,ONEZONE_IA,GLACIER_IR,EXPRESS_ONEZONE값을 지원합니다. #107251 (Aditya Kumar).MaterializedPostgreSQL데이터베이스 엔진에 생성 시점 설정materialized_postgresql_use_extended_date_and_time_types를 추가했습니다. 기본적으로(활성화 시) PostgreSQLdate/timestamp컬럼은Date32/DateTime64로 추론되며,CREATE DATABASE시점에 이 값을0으로 설정하면 더 좁은Date/DateTime타입으로 추론합니다. 이 설정은MaterializedPostgreSQL테이블 엔진에는 적용되지 않습니다. #107428 (Alexey Milovidov).SOME/ALL배열 양화자(expr OP SOME(array)/expr OP ALL(array))가 이제 키워드 비교 프레디케이트IS DISTINCT FROM,IS NOT DISTINCT FROM과 문자열 검색 프레디케이트LIKE,ILIKE,NOT LIKE,NOT ILIKE,REGEXP도 지원하며, 이는arrayExists/arrayAll로 재작성됩니다. #107454 (Alexey Milovidov).- SQLite 데이터베이스를 여는 데 실패할 때 발생하던 메모리 누수를 수정했습니다(예:
sqlite테이블 함수 또는SQLite데이터베이스 엔진에 열 수 없는 경로가 지정된 경우). #107807 (Alexey Milovidov). - 웹 UI (
play.html)에서 실행 단축키 힌트는 이제 항상Ctrl/Cmd+Enter를 표시하는 대신 Mac에서는Cmd+Enter, 그 외 플랫폼에서는Ctrl+Enter를 표시합니다. 또한 힌트의, +Shift to run all부분은 여러 쿼리가 있을 때만 표시됩니다. #107817 (Alexey Milovidov). #108957 (Alexey Milovidov). - 이제 대상 테이블이
MergeTree계열인 경우Alias테이블 엔진이 병렬 레플리카를 사용한 읽기를 지원합니다. #107830 (Kai Zhu). uniqCombined64스케치를 기반으로 하는uniq통계의 경량 대안인uniq_v2컬럼 통계 유형이 추가되었습니다. #107863 (Han Fei). 또한minmax컬럼 통계 유형은 Deprecated 되었고,auto_statistics_types의 기본값은basic, uniq_v2로 변경되었습니다. #108680 (Han Fei).- 이제 AI 함수 (
aiGenerate,aiEmbed,aiClassify,aiExtract,aiTranslate)는ai_function_max_retries가 설정되면url테이블 함수의 retry 동작과 동일하게 일시적인 네트워크 오류(connection reset, TLS connect failure, timeout, unreachable address)를 재시도합니다. 이전에는 provider 측 HTTP 오류 응답만 재시도했습니다. #107927 (Alexey Milovidov). - 이제
MergeTree테이블에INSERT할 때 많은 part를 쓰는 중에도 쿼리 취소와max_execution_time이 적용되며, 종료된 뒤에도 오랫동안 계속 실행될 수 있는 문제가 없어졌습니다. #107929 (Michael Kolupaev). - 웹 UI (
play.html)에서 이제 웹 터미널 아이콘을 마우스 가운데 버튼 클릭 또는 Ctrl/Cmd/Shift+클릭으로 새 브라우저 탭에서 열 수 있습니다. #108006 (Alexey Milovidov). - 이제 클라이언트의 AI SQL 생성은 구성에서
ai.temperature로 명시적으로 설정한 경우에만temperature매개변수를 전송합니다. 이 변경으로temperature매개변수를 허용하지 않는 모델에서도 AI SQL 생성이 정상적으로 동작합니다. #108014 (Alexey Milovidov). - 오픈 소스 빌드에
system.masking_policies테이블과SHOW MASKING POLICIES내부 검사가 추가되었습니다. 마스킹 정책 자체는 계속 ClickHouse Cloud 기능으로 유지되므로 오픈 소스 빌드에서는 이 테이블이 비어 있지만, 내부 검사 쿼리가 더 이상 오류로 실패하지 않습니다. #108030 (Alexey Milovidov). - 이제 Keeper 기반 Kafka consumer는 레플리카 전반에서 임시 파티션 잠금을 획득하는 순서를 무작위화하여 파티션 분배의 공정성을 높이고 잠금 경합을 줄입니다. 이전에는 의도한 셔플이 효과를 내지 못했습니다. #108033 (Alexey Milovidov).
system.completions와 WASM 기반 SQL lexer를 바탕으로 한 자동 완성이 웹 UI (play.html)에 추가되었습니다. #108059 (Alexey Milovidov).clickhouse-client와clickhouse-local은 이제 커서가 입력 끝에 있을 때 가장 잘 맞는 제안에 대한 입력 중 자동 완성 힌트(인라인 “고스트” 텍스트)를 표시합니다. 가장 관련성 높은 제안(최근 사용한 항목과 쿼리에 이미 포함된 식별자)이 우선 표시됩니다. Up/Down(또는 Ctrl-Up/Ctrl-Down)으로 이동하고, Tab 또는 Right로 단일 힌트나 선택된 힌트를 적용할 수 있으며, Enter로 선택된 힌트를 적용할 수 있습니다. Tab은 기존 완성 목록도 엽니다. 새--hints옵션으로 제어됩니다(기본 활성화,--highlight필요). #108070 (Alexey Milovidov).- 이제
QBit데이터 타입에length함수를 지원하며, 벡터의 차원을 상수로 반환합니다. #108071 (Alexey Milovidov). 또한QBit에서Array로CAST하는 기능을 지원하여 원래 벡터를 재구성할 수 있습니다. 이는 기존Array에서QBit로 변환하는 기능의 역연산입니다. #108072 (Alexey Milovidov). - 이제 REST 데이터 레이크 카탈로그(예: OneLake)로 보내는 요청에 ClickHouse
User-Agent헤더가 포함됩니다. #108117 (Konstantin Vedernikov). - 이제
arrayFold는 쿼리 취소와max_execution_time을 준수합니다. 이전에는 매우 긴 배열에 대한 폴드 연산이 단일 함수 호출 내에서 전체 실행되어 중단할 수 없었기 때문에, 폴드가 끝날 때까지KILL QUERY와 시간 제한이 무시되었습니다. #108192 (Groene AI). - 이제
MVTEncodeGeom은 클리핑 전에 도형 데이터를 정수 픽셀 그리드에 스냅하고,wagyu라이브러리로 다각형을 클리핑하므로, 클리핑된 출력이 유효하며(자체 교차하는 링 복구) 경계에 맞춰 정렬되어 PostGISST_AsMVTGeom과 일치합니다. #108248 (Saarthak Gupta). - 단계별 쿼리 실행 전
ProfileEvents가 추가되었습니다:QueryParseMicroseconds,QueryAnalysisMicroseconds,QueryPlanBuildMicroseconds,QueryPipelineBuildMicroseconds. 이를 통해 쿼리 실행 전에 시간이 어디에 소요되는지(파싱, 분석, 쿼리 계획 빌드, 파이프라인 빌드)를 확인할 수 있으며,system.query_log와system.events에서 사용할 수 있습니다. #108282 (Jordi Villar). - 이제
ALTER TABLE작업으로 인해 테이블 메타데이터가max_query_size를 초과하게 되는 경우 사전에 거부하여, DDL 배포나 레플리카 복구 같은 구성 요소에서 테이블을 로드할 수 없게 되는 상황을 방지합니다. #108283 (Andrew Kravchuk). system.backups와system.backup_log에settings및engine_settings컬럼이 추가되었습니다.settings는 작업에 요청된 backup/복원 전용 설정(예:allow_s3_native_copy,deduplicate_files,structure_only)을 표시하고,engine_settings는 backup 엔진의 reader와 writer가 실제로 사용한 설정(예:allow_native_copy같은 S3 request 설정으로, endpoint 구성을 병합한 뒤 요청값과 달라질 수 있음)을 표시합니다. 이를 통해BACKUP/RESTORE작업이 실제로 어떤 설정으로 실행되었는지 확인할 수 있습니다. #108334 (Julia Kartseva).- 각 엔터티의 문서가 정의된 원본 파일 경로를 담는
source컬럼이system.documentation에 추가되었습니다. 이제 이 테이블에는 압축 코덱, profile events, 현재 메트릭, 비동기 메트릭, 그리고 시스템 테이블 자체(해당 컬럼 포함)에 대한 문서도 포함되며, 설정 문서에는 각 설정의 유형과 기본값도 표시됩니다. #108346 (Alexey Milovidov). 이제 비어 있는 설정 기본값은 빈 backticks 대신 empty string으로 렌더링됩니다. #108708 (Alexey Milovidov). kqueue위에 epoll 기반 폴링 기본 타입을 구현하여 macOS에서 원격 복제본의 비동기 읽기(async_socket_for_remote)를 지원합니다. 이에 따라 macOS에서 분산 쿼리가 샤드를 직렬이 아니라 병렬로 읽을 수 있습니다. #108403 (Raúl Marín).- 바이너리 수학 함수에서
BFloat16를 지원합니다. #108442 (Zhang Yifan). - 이제
MergeTree는 블록마다 서로 다른 코덱을 사용하는 압축 스트림을 읽을 수 있습니다. 이는 적응형 코덱 선택을 위한 읽기 측 전제 조건입니다(#105404). #108592 (Raufs Dunamalijevs). - 이제
max_threads및 유사한 설정의 자동값은system.settings에서'auto(8)'가 아니라auto(8)로 표시됩니다. 바깥쪽 작은따옴표는 오랫동안 값 자체에 포함된 artifact였습니다. 버전 간 compatibility는 유지됩니다. 이전 서버에서 전달된 설정을 파싱할 때는 기존 따옴표 형식도 계속 허용됩니다. #108657 (Alexey Milovidov). /schemaWeb UI에 여러 사용성 개선이 적용되었습니다. Enter 키로 스키마 로드, 테마에 맞는 스크롤바, 읽기 쉬운 테이블 이름, 독립 테이블의 데이터베이스별 일관된 그룹화, 드래그 중 텍스트 선택 방지, 그리고play스타일의 authentication 양식(Credential Management API, 비밀번호 제거를 포함한 URL 제공 자격 증명, 실시간 자격 증명 검증)이 포함됩니다. #108724 (Alexey Milovidov).- 텍스트 인덱스 지연 실행 posting-list 적용 모드는 더 이상 Experimental이 아니며,
allow_experimental_text_index_lazy_apply없이text_index_posting_list_apply_mode = 'lazy'로 선택할 수 있습니다. 밀도 임계값 설정 이름은text_index_density_threshold에서text_index_lazy_intersection_density_threshold로 변경되었습니다. #108814 (Anton Popov). - Databricks Delta Sharing의 Iceberg REST endpoint용
delta_sharingcatalog 유형이DataLakeCatalog에 추가되었습니다. 이 endpoint의 네임스페이스는 평면 구조이며parentlisting filter를 무시합니다. 그렇지 않으면SHOW TABLES가 멈출 수 있는 이러한 endpoint에서는catalog_type = 'rest'대신 이를 사용하십시오. #108865 (Seva Potapov). - 포맷된 echoed 쿼리 앞에 사용자 지정 구분자를 출력하는 새
clickhouse-client/clickhouse-local옵션--echo-query-separator가 추가되었습니다. 이를 통해 입력한 쿼리와 다시 포맷된 echo를 더 쉽게 구분할 수 있습니다. 기본적으로는 비활성화되어 있습니다. #108888 (David Meng). - Web UI의 데이터베이스 패널 개선 사항: 데이터베이스를 펼치면 데이터베이스 이름 옆 괄호 안에 테이블 수가 표시됩니다. #108891 (Alexey Milovidov). 펼쳐진 데이터베이스 옆의 새로 고침 버튼을 클릭하면 해당 테이블 목록을 다시 불러옵니다. #108958 (Alexey Milovidov). 패널을 다시 열면 이전에 펼쳐 두었던 데이터베이스가 복원됩니다. #108964 (Alexey Milovidov).
EXPLAIN WHATIF에서 결합된 skip-index 효과를 계산할 수 있도록 했습니다. 즉, 현재 존재하는 모든 적합한 가상 인덱스의 교집합에 대한 데이터 비율을 표시합니다. #108934 (Yarik Briukhovetskyi).- Web UI에서 셀 안의 링크를 클릭한 뒤 페이지로 돌아오면 결과 테이블의 가로 스크롤 위치가 초기화되던 문제를 수정했습니다. #108941 (Alexey Milovidov).
- 이제
MySQL데이터베이스 엔진, 테이블 엔진, 테이블 함수는 MySQL의 공간 컬럼 타입(LINESTRING,POLYGON,MULTILINESTRING,MULTIPOLYGON, 그리고 범용GEOMETRY)을String대신 해당하는 ClickHouse 기하학 타입으로 매핑합니다. 이 동작은 새로 추가된mysql_datatypes_support_level설정의geometry플래그로 제어되며, 기본적으로 활성화되어 있습니다.POINT는 계속 항상Point로 변환됩니다. 범용GEOMETRY컬럼은 상위Geometry타입으로 매핑되며, 하위 타입에 대응하는 ClickHouse 타입이 없는 값(MULTIPOINT,GEOMETRYCOLLECTION)을 읽으면 읽기 시점에 예외가 발생합니다. #108944 (Alexey Milovidov). - Web UI (
play.html): 전체 키보드 탐색 지원 — 데이터베이스 패널과 결과 테이블에서 화살표 키로 탐색할 수 있고, 도구 모음 버튼, 테마 전환기, 다운로드 메뉴에 키보드로 접근할 수 있으며, 포커스 윤곽선도 표시됩니다. #108972 (Alexey Milovidov). - HTTP 인터페이스: 자격 증명이 URL 매개변수(
user/password)와Authorization헤더를 통해 모두 제공되면, 이제 요청을 거부하는 대신 URL 매개변수가 우선 적용됩니다. 이로써 브라우저가 Basic 자격 증명을 기억하고 있을 때 Web UI (play.html)에서 결과를 다운로드하면AUTHENTICATION_FAILED(오류 516)로 실패하던 문제가 해결됩니다. #108980 (Alexey Milovidov). show_data_lake_catalogs_in_system_tables를system.tables,system.columns,system.completions에서DataLakeCatalog의 표시 여부만 제어하는 설정으로 복원했습니다. 또한 기본적으로 활성화되는show_remote_databases_in_system_tables를 추가하여, 사용자가 해당 시스템 테이블에서MySQL및PostgreSQL데이터베이스를 별도로 숨길 수 있도록 했습니다. #109082 (Pablo Marcos).- 기본적으로 정밀한(표현 가능한 값 중 가장 가까운) float parsing 알고리즘을 사용하고,
precise_float_parsing설정을toFloat*/CAST에만 아니라 입력 형식(CSV,TSV,JSON,VALUES, …)과 숫자 리터럴에도 적용하도록 했습니다. 이전 동작으로 되돌리려면precise_float_parsing = 0으로 설정하십시오. 이전 동작은 경우에 따라 더 빠를 수 있지만 정확도는 더 낮습니다. 해결: #60146. 해결: #74647. 해결: #68914. #109086 (Raúl Marín). - 단일 CTE가 있는 쿼리도 이제 여러 CTE가 있는 쿼리와 동일한 줄바꿈과 들여쓰기 형식으로 포맷됩니다. 이전에는
WITH a AS (...)에서 CTE가WITH와 같은 줄에 유지되었지만, CTE가 2개 이상이면WITH가 별도 줄에 표시되고 각 CTE는 들여쓰기되었습니다. #109092 (Groene AI). - Web UI: 강조 표시된 자동 완성 항목이 이미 입력한 단어와 같거나 대소문자만 다른 동일한 단어인 경우(예: 입력한
hash에 대해HASH가 제안되는 경우), 이제 Right/Tab/Enter를 눌러도 단어가 재작성되거나 자동 완성에 키 입력이 먹히지 않습니다. 대신 해당 키는 예상대로 캐럿을 이동하거나 줄바꿈을 삽입합니다. #109106 (Alexey Milovidov). #109384 (Alexey Milovidov). - Web UI(
play.html)에clickhouse-client와 동일하게 무지개 괄호, 괄호 짝, 식별자 짝, 숫자 그룹 강조 표시가 추가되었습니다. #109108 (Alexey Milovidov). - Web UI에서
Tab및Shift+Tab으로 이제 선택한 줄을 공백 4칸 기준으로 들여쓰기하거나 내어쓸 수 있습니다. #109110 (Alexey Milovidov). - Web UI: 쿼리 편집기에서 구문 오류 위치를 빨간 배경으로 강조 표시합니다. 편집기에 다시 포커스가 돌아오면 강조 표시는 즉시 해제됩니다. #109112 (Alexey Milovidov).
clickhouse-compressor --stat와 오래된 파트에 대한 기본 코덱 감지는 이제 손상된 블록 헤더를 오해의 소지가 있는 파일 끝 오류가 아니라 손상으로 보고합니다. #109157 (Raufs Dunamalijevs).- ClickHouse Keeper는 이제
os_collect_psi_metrics설정을 준수하며, 이 설정이 비활성화되어 있으면 PSI 메트릭 수집을 건너뜁니다. #109179 (Maxim Orlovsky). - Web UI에서 쿼리 탭이 표시될 때 연결 매개변수(host, user, password)는 이제 오른쪽 상단의 키 버튼 뒤에 숨겨지며, 필요할 때 드롭다운으로 표시됩니다. #109243 (Alexey Milovidov).
- Web UI: 단일 값 결과(1행 1컬럼, 예:
SHOW CREATE TABLE)를 3줄로 제한하지 않고 전체 높이로 표시합니다. #109245 (Alexey Milovidov). - Web UI에서 데이터베이스 패널의 테이블을 마우스 가운데 버튼으로 클릭하거나, Shift를 누른 채 클릭하거나, 플랫폼의 새 탭 수정자(macOS에서는 Cmd, 그 외 환경에서는 Ctrl)와 함께 클릭하면 이제 해당 쿼리가 새 Web UI 탭에서 열립니다. #109246 (Alexey Milovidov).
- 원격(객체 스토리지)
Parquet파일의 쿼리 조건 캐시를 경로뿐 아니라 ETag까지 기준으로 키를 지정하여, 객체를 제자리에서 덮어써도 더 이상 오래된 캐시 결과가 제공되지 않도록 했습니다. #109310 (Alexey Milovidov). - Web UI에서 빈 문자열과 NULL은 이제 categorical 색상 지정 모드에서 더 이상 색상 처리되지 않습니다. #109342 (Alexey Milovidov).
- Web UI: 이제 데이터베이스 패널에서 테이블 아이콘을 클릭하면 해당 컬럼 목록이 표시되며, 타입 아이콘, 압축된 크기에 비례하는 크기 막대, 그리고 압축된 크기/압축되지 않은 크기 및 압축률을 보여주는 툴팁이 함께 제공됩니다. #109346 (Alexey Milovidov).
- Web UI: 탭 제목이 잘린 경우 마우스를 올리면 전체 탭 제목이 툴팁으로 표시됩니다. #109354 (Alexey Milovidov).
- Web UI: 이제 탭 제목을 마우스 가운데 버튼으로 클릭하거나 Ctrl/Shift/Cmd+클릭하면 탭이 복제됩니다. #109357 (Alexey Milovidov).
- Web UI: 브라우저 창이 좁을 때 어색하게 줄바꿈되지 않도록 최종 진행률 및 쿼리 통계 영역의 크기를 균등하게 조정합니다. #109363 (Alexey Milovidov).
- Web UI: 이제 데이터베이스 패널에서 데이터베이스를 선택하면 에디터에서 실행하는 쿼리의 기본 데이터베이스로 사용됩니다. #109372 (Alexey Milovidov).
- 고정 크기 원소로 이루어진
Array를String으로reinterpret하는 기능을 지원합니다. 이는 기존의String/FixedString을Array로reinterpret하는 기능의 반대 방향입니다. #109383 (Alexey Milovidov). - Web UI: 결과에 행이 1개뿐이면 컬럼별 색상 구분 토글을 표시하지 않습니다. #109385 (Alexey Milovidov).
- 차원이 동일하게 유지되는 한, 원소 타입 및/또는 stride가 다른
QBit타입 간CAST를 허용합니다(예:QBit(Float32, N)에서CAST(x AS QBit(Float64, N))). stride만 변경하는 경우에는 손실이 없으며, 원소 타입 변경은 해당Array변환 시맨틱을 따릅니다(예:Float32를BFloat16으로 변환하면 정밀도가 손실될 수 있고,accurateCast/accurateCastOrNull은 정확히 표현할 수 없는 행을 거부합니다). #109387 (Alexey Milovidov). - 함수
quantizeBFloat16ToInt8및dequantizeInt8ToBFloat16은 이제 기존 스칼라 오버로드에 더해Array및QBit인수도 받으며, 전체 벡터에 Lloyd-Max 코덱을 적용합니다(해당 원소 타입의Array/QBit를 반환). #109398 (Alexey Milovidov). - Web UI: 이제 Documentation 링크가 URL에 현재 사용자 이름을 포함합니다. #109419 (Alexey Milovidov).
BFloat16배열에 대해arraySum,arrayAvg,arrayProduct를 지원합니다. #109420 (Alexey Milovidov).- 이제
parseDateTime/parseDateTime64(및 해당OrZero/OrNull변형)의 MySQL 스타일 포맷 지정자%f는 정확히 6자리를 요구하는 대신, MySQL의STR_TO_DATE처럼 왼쪽 정렬된 마이크로초로 해석되는 소수 자릿수 1~6자리를 허용합니다. 또한 내장 함수 문서 예시에서PrettyCompact테이블 정렬이 어긋나는 문제도 수정했습니다. #109421 (Alexey Milovidov). - Web UI: 이제 쿼리 탭이 지속적으로 유지됩니다 — 각 탭은 다른 탭으로 전환했다가 다시 돌아와도 렌더링된 결과(이미지와 차트 포함)와 실행 중인 쿼리를 그대로 유지하며, 오래 실행되는 쿼리도 백그라운드에서 계속 실행됩니다. 탭 제목에는 해당 쿼리의 스피너, 진행률 표시줄, 완료 체크 표시가 나타납니다. #109425 (Alexey Milovidov).
- Web UI: 쿼리 결과의 일부가 이미 스트리밍된 뒤 쿼리가 실패하는 경우, 클라이언트 측
SyntaxError: Unexpected end of JSON input를 표시하는 대신 오류를 올바르게 표시하도록 했습니다(또는http_write_exception_in_output_format사용 시 실패한 쿼리를 성공한 것으로 표시하던 문제를 수정했습니다). #109430 (Alexey Milovidov). - Web UI에 고정 컬럼을 추가했습니다. 이제 헤더에서 컬럼을 고정할 수 있으며, 결과 테이블을 가로로 스크롤해도 해당 컬럼이 가장자리에 고정된 상태로 계속 표시됩니다. #109439 (Alexey Milovidov).
- Advanced dashboard(
/dashboard)에서 이제 특정 메트릭의 차트를 소스 코드나 문서에 표시된 메트릭명으로 직접 추가할 수 있으므로, 디버깅 세션 중 여러 메트릭을 더 쉽게 추가할 수 있습니다. #109449 (Mikhail Artemenko). - Web UI: 마우스로 텍스트를 선택한 뒤 경계를 넘어 드래그할 때 연결 설정 드롭다운이 닫히는 문제를 수정했습니다. #109451 (Alexey Milovidov).
- Web UI: 이제 결과 테이블의 컬럼 헤더 위에 마우스를 올리면 전체 컬럼명과 유형이 툴팁으로 표시되므로, 잘린 헤더도 전체 내용을 확인할 수 있습니다. #109463 (Alexey Milovidov). 또한 컬럼이 전체 제목을 표시할 만큼 충분히 넓은데도 컬럼 헤더 제목이 줄임표로 잘리던 문제를 수정했습니다. #110397 (Alexey Milovidov).
- macOS 빌드에서 SSD cache 딕셔너리(
SSD_CACHE레이아웃)와FileLog테이블 엔진을 지원합니다. #109493 (Raúl Marín). - Web UI: 페이지를 열 때 빈 쿼리가 있는 탭은 복원하지 않도록 했습니다. #109529 (Alexey Milovidov).
TERM에256이 포함되지 않은 terminal(예: Ghostty, kitty, Alacritty, foot)에서 대화형 클라이언트의 입력 중 자동 완성 힌트가 읽기 어렵고 밝은 색상이 부자연스럽게 표시되던 문제를 수정했습니다. 이제 밝은 색상은 bold + 어두운 색상으로 대체하지 않고 항상 aixterm 밝은 색상 코드로 출력되며, 최신 terminal이 이를 어두운 배경에서 어둡고 읽기 어려운 색상으로 렌더링하던 문제를 해결합니다. #109622 (Alasdair Brown).- macOS 빌드에서 jemalloc의 CPU별 arena와 할당 프로파일링을 활성화했습니다. #109684 (Raúl Marín).
ALTER DATABASE ... MODIFY SETTING을 사용해OneLake데이터 레이크 카탈로그 데이터베이스의 일부 인증 설정을 변경할 수 있도록 했습니다. #110019 (alesapin).- 이제
Hive엔진은 Apache ArrowORC어댑터 대신 ClickHouse의 네이티브ORC리더를 사용해ORC파일 메타데이터(최소/최대 인덱스, 행 수)를 읽습니다. #110086 (Alexey Milovidov). - 드물게 사용되는 혼합 타입 쌍(
Decimal과 비트 폭이 다른 정수, 그리고Int128/UInt128/Int256/UInt256가 포함된 쌍)에 대해, 각 타입 조합마다 전용 컴파일 커널을 두는 대신 공통 타입으로 변환한 뒤 비교 및 산술 연산을 수행하도록 변경해 바이너리 크기를 약 10.5 MB 줄였습니다. 동일 타입 쌍, 자주 사용되는 쌍, 그리고 메모리 병목인plus/minus/multiply는 기존 전용 커널을 유지합니다. 결과, 결과 타입, 예외 처리 동작은 변경되지 않았습니다. #110131 (Alexey Milovidov). IN오른쪽의 서브쿼리에서 단일 컬럼이 왼쪽 인수보다 1차원 더 깊은 배열인 경우, 이제 혼란스러운 타입 불일치 오류로 실패하는 대신 배열의 원소 집합(배열 리터럴이나 배열을 반환하는 함수와 같은 방식)으로 해석합니다. 예를 들어, 이제x IN (SELECT groupArray(x) FROM ...)가 동작합니다. #110169 (Alexey Milovidov).SQLite테이블 엔진 또는sqlite테이블 함수에서 읽을 때, SQLite 데이터베이스가 다른 연결에 의해 잠겨 있으면 더 이상 CPU 코어 1개를 완전히 점유하며 바쁘게 대기하지 않습니다. 이제 읽기 작업은 잠금을 기다리는 동안 유휴 상태로 대기하며, 취소도 가능합니다. #110248 (Groene AI).- 로그 및 예외 메시지의 경과 시간, 속도, 비율 값을 소수 셋째 자리까지 반올림하여
1.345844286 sec.같은 숫자가 더 이상 전체 정밀도로 출력되지 않도록 했습니다. #110277 (Alexey Milovidov). - Web UI (Play)에서 이제
BFloat16을 부동소수점 수로 인식하며, 해당 컬럼은 이에 맞게 오른쪽 정렬되고 색상도 적용됩니다. #110433 (Alexey Milovidov). PostgreSQL테이블 엔진과postgresql테이블 함수에서SETTINGS절을 지원합니다(예:SETTINGS postgresql_connection_pool_size = 50). 이를 통해MySQL엔진과 기능 동등성을 갖추었습니다. #110614 (Alexey Milovidov).- 요청한 테이블이 존재하지 않을 경우, 이제
SHOW CREATE TABLE(및SHOW CREATE VIEW/SHOW CREATE DICTIONARY)도SELECT쿼리와 마찬가지로 오류 메시지에 이름이 비슷한 테이블을 제안합니다. #110633 (Alexey Milovidov). merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_once설정을 기본으로 활성화했습니다. 이제 머지 선택기는 파티션이 얼마나 가득 찼는지에 따라 한 번에 머지할 수 있는 최대 파트 수를 자동으로 낮춥니다. #91163를 참조하십시오. #110726 (Mikhail Artemenko).- PostgreSQL wire 프로토콜에서 PostgreSQL 정리 명령
RESET,UNLISTEN,DISCARD를 구문 오류로 실패 처리하는 대신 no-op으로 허용합니다. 이로써 연결 설정 및 정리 과정에서RESET ALL과UNLISTEN *를 보내는 Skunk 같은 드라이버와의 호환성이 향상됩니다. #110780 (Alexey Milovidov). auto_statistics_types설정의 기본값을basic, uniq에서basic, uniq_v2로 변경했습니다. #110878 (Han Fei).randomHadamardTransform는 이제 가장 큰 홀수 인수가 64 이하인 모든 벡터 길이에 대해 정확한 길이 보존 변환을 계산합니다(예:3584 = 512 * 7, embedding 모델에서 흔히 사용됨). 이는 기존2^N,2^k * {12, 20},2^k * 9계열을 확장한 것입니다. 정확히 표현할 수 없는 길이에 대한 전체 변환은 이제 더 긴 벡터로 자동 0 패딩하는 대신 예외를 발생시킵니다. 임의 길이의 잘린 투영을 계산하려면output_dims를 전달하십시오. #111006 (Alexey Milovidov).- 동시에 삭제 및 재생성되는
Replicated데이터베이스를 backup하는 중 발생하던LOGICAL_ERROR예외를 수정했습니다. 이제 이러한 backup은CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT과 함께 명확하게 실패합니다. #100651 (Alexey Milovidov). - zip 아카이브를 풀 수 없을 때(예: 아카이브를 S3에서 읽는 중 read buffer가 seek를 거부하는 경우) 실제 근본 원인이 드러나도록 했습니다. 이전에는 실제 오류가
Couldn't unpack zip archive: Code = -100/Couldn't open zip archive라는 일반적인 메시지에 가려져 있었습니다. #105103 (Groene AI). - server 재시작 후(또는
DETACH DATABASE/ATTACH DATABASE후) 표시되던 혼란스러운 “Maybe you meant X?” 힌트를 수정했습니다. 이미 삭제된 테이블을 다시 삭제하려고 하면 방금 삭제한 이름이 대안으로 제안될 수 있었습니다. #106238 (Groene AI). - 백그라운드 테이블 삭제 큐에서 발생하던 logical error(
Logical error: 'removed', debug builds에서 server 중단)를 수정했습니다. 이 오류는 동일한 명시적 UUID를 여러CREATE OR REPLACE TABLE쿼리에서 재사용할 때 트리거되며, 그 결과 해당 UUID를 공유하는 삭제된 테이블이 둘 이상 큐에 들어갈 때 발생했습니다. #107031 (Groene AI). - alias가 지정된 lambda가 접근 연산자(tuple 요소
.N또는 배열 요소[])의 피연산자로 사용되고 표현식 목록에서 첫 번째가 아닌 위치에 있을 때 발생할 수 있던Inconsistent AST formattinglogical error를 수정했습니다. 이 오류는 debug 및 새니타이저 build에서 server를 중단시킬 수 있었습니다. 예:SELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t. #107092 (Groene AI). clusterAllReplicas(..., urlCluster(...))처럼 다른 distributed query 내부에 중첩된 cluster table function(urlCluster,fileCluster,s3Cluster, …)은 이제 logical error(Distributed task iterator is not initialized)로 실패하는 대신BAD_ARGUMENTS오류를 반환하며 거부됩니다. #107107 (Groene AI).- 쿼리 timeout(
max_execution_time에서timeout_overflow_mode = 'break')으로 중단된OPTIMIZE ... DRY RUN은 이제rows_sources관련 logical error 대신TIMEOUT_EXCEEDED를 반환합니다(이전에는 debug/새니타이저 build에서 server를 중단시켰습니다). #107114 (Groene AI). - macOS에서
ZooKeeper세션 종료 처리 중 발생하는 무해한Net Exception: Socket is not connected오류를 더 이상 로깅하지 않습니다.clickhouse keeper-client도 종료 시 이 불필요한 오류를 더 이상 stderr에 출력하지 않습니다. #107438 (Groene AI). refresh_retries가 매우 큰 값(Int64최댓값 근처)으로 설정된 상태에서 갱신 가능 구체화 뷰가 실패한 갱신을 재시도할 때 발생하던 signed integer 오버플로우를 수정했습니다. 이 오버플로우는 undefined behavior 새니타이저가 적용된 build에서 server를 중단시킬 수 있었습니다. #108005 (Groene AI).JOIN에서 null-safe 비교 연산자(<=>/IS NOT DISTINCT FROM)를 사용하고 키 중 하나가 스칼라 서브쿼리인 경우(예:... JOIN t2 ON (SELECT x FROM t1) <=> t2.k), 이전 분석기(enable_analyzer = 0)에서 발생하던LOGICAL_ERROR(debug/sanitizer build에서 server abort)를 수정했습니다. 이제 이러한 쿼리는 논리 오류 대신 일반적인NOT_FOUND_COLUMN_IN_BLOCK오류를 반환합니다. #108123 (Groene AI).- 이제
_distance컬럼을 선택하는 벡터 검색 쿼리는 논리 오류로 실패하는 대신 적절한 오류를 반환합니다. #108423 (Robert Schulze). - 최종 비동기 S3/Azure multipart-upload 완료 작업의 scheduling이 실패할 때(예: thread-pool 고갈 시) 발생할 수 있었고, debug 및 sanitizer build에서 server abort를 일으킬 수 있었던
std::future_error(The associated promise has been destructed prior to the associated state becoming ready)를 수정했습니다. 이제 대신 실제 scheduling 오류가 보고됩니다. #108730 (Groene AI). - 매우 큰 정규식(예: 수십만 개의 와일드카드가 포함된
LIKE또는match패턴)을 컴파일할 때 과도한 서버 로그 출력과 지나치게 큰 오류 메시지가 발생하지 않도록 수정했습니다. 이제 이러한 패턴은 명확한CANNOT_COMPILE_REGEXP오류와 함께 실패합니다. #108821 (Raúl Marín). - 동기화가 어긋났거나 퍼징된 connection에서 범위를 벗어난 protocol 패킷 유형을 문자열로 변환할 때(예:
Unexpected packet from server/Received ... packet오류 메시지) 발생하던 정의되지 않은 동작을 수정했습니다. #108885 (Groene AI). - 테이블 표현식이
IN연산자의 왼쪽 인수로 사용될 때 발생하던 혼란스러운 내부 오류(Method getResultType is not supported for TABLE query tree node)를 수정했습니다. 이제 이러한 쿼리는 명확한 오류 메시지를 반환합니다. #109412 (Alexey Milovidov). - 버전 번호가 모두 숫자이지만 32비트 정수 범위를 초과하는 메타데이터 파일(예:
v99999999999999999999.metadata.json)이 있는 Iceberg 테이블을 읽을 때의 문제를 수정했습니다. 이전에는 이러한 이름이 명확한BAD_ARGUMENTS오류 대신 불명확한std::out_of_range(STD_EXCEPTION)를 발생시켰습니다. #109619 (Groene AI). - 행 기반 입력 형식(예:
TSV/CSV)이 입력을 parse하지 못했고 기본 읽기가 이미 취소된 경우(예: 잘못된 형식의 HTTP chunk 또는 잘린 body) 발생할 수 있었던Logical error: 'ReadBuffer is canceled. Can't read from it.'를 수정했습니다. 이제 verbose parse 진단을 구성할 때 취소된 buffer에서 더 이상 읽지 않습니다. #109708 (Groene AI). arrayJoin(또는 그 별칭인unnest)을 사용하는 행 정책 filter expression은 이제 명확한 오류와 함께 거부됩니다. 이전에는 이러한 정책이 쿼리 시점에column->size() == num_rows논리 오류를 발생시켰습니다. #109753 (Raúl Marín). #109973 (Raúl Marín).- 스키마에 지원되지 않는 중첩 유형(예:
ROW필드)이 포함된 Paimon 테이블을 읽을 때, 이제 오류 코드 0에 메시지도 없는 단순한DB::Exception. (OK)대신 지원되지 않는 유형 이름이 포함된 명확한BAD_ARGUMENTS오류를 보고합니다. #109762 (Groene AI). - 실험적 설정
make_distributed_plan = 1이 적용된 쿼리에서distributed_plan_default_reader_bucket_count또는distributed_plan_default_shuffle_join_bucket_count가 매우 크게 설정되면 발생하던LOGICAL_ERROR(std::length_error)를 수정했습니다. 이제 이러한 값은INVALID_SETTING_VALUE오류와 함께 거부됩니다. #109770 (Groene AI). - 재귀 CTE가 외부 스코프의 식별자를 상관된 컬럼(correlated column)으로 해석할 때(
allow_experimental_correlated_subqueries = 1) 발생하던LOGICAL_ERROR(query tree node does not have valid source node)를 수정했습니다. 이제 이러한 쿼리는 명확한UNSUPPORTED_METHOD오류를 반환합니다. #109863 (Groene AI). ORDER BY ... WITH FILL이Int64/UInt64컬럼에서 매우 큰 간격(gap)을 건너뛸 때(예: 2^63에 가까운 간격에서 step이 2인 경우) 발생하던 부호 있는 정수 오버플로우를 수정했습니다. 이 오버플로우는 새니타이저 환경에서는 정의되지 않은 동작이었고, 릴리스 build에서는 조용히 래핑되었습니다. #109937 (Groene AI).Distributed테이블에서optimize_const_name_size가 낮게 설정된 상태로SELECT ... ORDER BY ... WITH FILL을 실행할 때 발생하던Bad cast from type DB::FunctionNode to DB::ConstantNodelogical error를 수정했습니다(debug/새니타이저 build에서는 server가 중단됨). #109938 (Groene AI).- 이전 분석기(
enable_analyzer = 0)에서INTERPOLATE대상이WITH FILL컬럼의 별칭(alias)일 때 발생하던Invalid number of rows in Chunklogical error를 수정했습니다. 이제 이러한 쿼리는 명확한INVALID_WITH_FILL_EXPRESSION오류와 함께 거부됩니다. #110103 (Groene AI). indexHint/ignore/isZeroOrNull함수에 타입이Nothing으로 해석되는 인수(예:indexHint(assumeNotNull(materialize(NULL)))와 같은 표현식 내부)가 전달될 때 발생하던 logical error를 수정했습니다(debug/새니타이저 build에서는 server가 중단됨). #110192 (Groene AI).max_read_buffer_size또는max_read_buffer_size_local_fs와 같은 읽기 버퍼 크기 설정에 범위를 벗어난 값을 설정했을 때 발생할 수 있던Too large size (...) passed to allocatorlogical error를 수정했습니다. 이제 이러한 값은 설정 유효성 검사에서 256 MiB로 제한되며, 추가로INSERT ... FROM INFILE의 활용 지점에서도 제한됩니다. 이는 유효성 검사가 적용되지 않는clickhouse-client내부에서 파일을 읽기 때문입니다. #110207 (Alexey Milovidov).- 이제
CHECK TABLE은 메타데이터 로드에 실패한 프로젝션 파트에 대해, 오해의 소지가 있는Columns doesn't match ... Expected: 0 columns오류 대신 실제 손상 내용을 보고합니다. #110262 (Raúl Marín). - PostgreSQL source(예:
postgresql테이블 함수 또는PostgreSQL테이블 엔진)에서 읽은 값을 선언된 컬럼 타입으로 파싱할 수 없을 때(예:text컬럼을Int32로 선언한 경우) 발생하는 타입 불일치가 이제 적절한 쿼리 오류로 보고됩니다. 이전에는 debug 및 새니타이저 build에서 server가 중단되었습니다. #110264 (Groene AI). - macOS에서 쿼리 프로파일러, 메모리 및 trace 프로파일러, 그리고
system.trace_log심볼화(symbolization)를 지원합니다. #109825 (Raúl Marín). chdig를 v26.7.1로 업데이트했습니다. 공유용 압축 스택 트레이스, 쿼리 패턴, 별도 arena 메모리 지원, Perfetto 개선 사항, 호환성 수정이 포함됩니다. #110938 (Azat Khuzhin).- 부호 없는 키를 부호 있는 상수로 나눌 때
intDiv의 단조성 추론이 잘못되던 문제를 수정했습니다. 이 문제로 인해 결과 유형의 부호 경계를 넘는IN/NOT IN프레디케이트에서 프라이머리 키 인덱스 프루닝이 비활성화될 수 있었고, debug builds에서는LOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex가 발생하기도 했습니다. #107586 (Groene AI). allow_lossy_numeric_supertype설정을 추가했습니다(기본값은 비활성화). 이 설정을 활성화하면 손실 없는 공통 유형이 없는 숫자 인수(예:Decimal과Float64, 또는Int64와Float64)에 대해if,multiIf,coalesce,ifNull,array,map이Variant대신Float64로 결정되므로, 결과를sum,avg,min,max와 같은 집계 함수에 사용할 수 있습니다. 이제 관련 집계 함수 오류 메시지에도 이 설정 이름이 명시됩니다. #106707을 해결했습니다. #107236 (Groene AI).- 테이블이 로드되기 전에 Prometheus 엔드포인트(메트릭 전용 구성용)와 비동기 메트릭 수집을 시작하도록 변경하여, 시간이 오래 걸릴 수 있는 메타데이터 로딩 단계 중에도 메트릭을 확인할 수 있도록 했습니다. #108402 (Christoph Wurm).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- 중복 제거 블록이 많은 테이블에서
TRUNCATE TABLE및DROP PARTITION이 실패하던 문제를 수정했습니다. 기존에는 이 블록들을 단일 ZooKeeper request로 제거할 때 기본 1 MBjute.maxbuffer제한을 초과할 수 있었습니다. #105991 (Clayton McClure). 이 문제는 ClickHouse Keeper 대신 Apache ZooKeeper(권장하지 않음)를 사용하는 경우에만 영향을 줍니다. MergeTree계열 테이블에서DELETE FROM및ALTER TABLE ... UPDATE/DELETE같은 뮤테이션의WHERE절에서 정규화된 컬럼명(database.table.column)을 사용할 때 실패하던 문제를 수정했습니다. 이전에는 이러한 쿼리가 누락된 컬럼 오류로 실패했습니다. #71760을 종료합니다. #109491 (Mikhail Artemenko).- PromQL 쿼리의 쿼리 결과 캐시를 수정했습니다.
promql방언은 비결정적 함수 검사(non-deterministic-function check)를 우회해now()를 기준으로 한 오래된 결과를 반환할 수 있었고, Prometheus HTTP API (/api/v1/query,/api/v1/query_range)는 캐시 엔트리를 전혀 저장하지 않았습니다. #110887 (Nikita Mikhaylov). TZ환경 변수가 비어 있을 때 server가 시작되지 않던 문제를 수정했습니다. #68920을 종료합니다. #68921 (Ardenwick).Backup데이터베이스 엔진이 더 이상 사용할 수 없는 백업(예: 파일이 삭제되었거나 기본 스토리지에 접근할 수 없는 경우)을 참조할 때 server가 시작되지 않던 문제를 수정했습니다. 이제는 server 전체의 시작을 막는 대신 테이블 없이 데이터베이스를 로드합니다. #83188 (Vitaly Orlov).Distributed엔진 테이블에 background 삽입을 사용할 때, 원격 shard로 데이터를 전송하는 과정에서 반복된 오류로 인해 발생한 지연이 오류 해결 후 감소하도록 수정했습니다. 이전에는 지연이 계속 증가하기만 하고 초기화되지 않았습니다. #87378 (Andrei Kochemirovskii).- 시작 시
Distributed비동기 삽입 큐를 스캔하며 발견된 손상된 파일에 대해,system.distribution_queue의broken_data_files와BrokenDistributedFilesToInsert메트릭이 항상0을 보고하던 문제를 수정했습니다. #92124 (KG.Xu). - 디스크 가득 참 오류 이후 로깅이 복구되지 않던 문제를 수정했습니다. 이전에는 로그 디스크가 가득 차면 ClickHouse가 Failed 상태에 들어가 syslog에 오류 메시지를 계속 쏟아냈고(시간당 100GB 이상 기록될 수 있음), 디스크 공간이 확보된 뒤에도 복구되지 않았습니다. 이제는 디스크 공간이 다시 확보되면 server를 재시작하지 않아도 로깅 시스템이 자동으로 복구됩니다. #93127 (jaehanbyun).
vended_credentials가 비활성화된 경우 UnityDataLakeCatalog테이블 읽기에 정적 S3 자격 증명을 전달하도록 수정하여, 익명 객체 스토리지 접근 실패를 방지했습니다. #96910 (kgeg401).DeltaLake테이블 엔진의 스키마 parsing 코드에서 발생하던 충돌을 수정했습니다. #97112 (Kseniia Sumarokova).- 인증되지 않은 TCP 클라이언트가 interserver port를 통해 테이블 존재 여부와 복제 상태를 확인할 수 있던 보안 문제를 수정했습니다. #99854 (Shaohua Wang).
DESCRIBE TABLE에서 서브쿼리 뒤에 별칭(alias)이 올 때 발생하던 구문 오류를 수정했습니다. #100031을 해결했습니다. #100205 (Yarik Briukhovetskyi).ROLLUP/CUBE와 함께group_by_use_nulls를 사용할 때 outer column이널 허용(Nullable)이 되면 상관 서브쿼리(correlated subqueries)에서 발생하던 예외를 수정했습니다. #100365 (Alexey Milovidov).- 롤백된 트랜잭션성
MergeTreepart가 커밋된 part와 겹칠 때, 테이블 시작 중 발생하던 서버 비정상 종료(새니타이저 빌드에서)와 감지되지 않는 데이터 손실을 수정했습니다. #100992 (Tuan Pham Anh). MergeTree테이블의Array(LowCardinality(String))컬럼에서indexOfAssumeSorted가 잘못된 결과를 반환하던 문제를 수정했습니다. #101771 (Yash ).- 테이블의 정렬 키(sorting key)가
Date컬럼을toDateTime으로 감싸는 경우(예:ORDER BY toDateTime(date_column))와 쿼리가WHERE date_column >= '...'처럼 원본 컬럼에 비교 필터를 적용하는 경우, 잘못된 프라이머리 키 프루닝이 발생하던 문제를 수정했습니다.DateTime범위를 벗어나는Date값(2106-02-07이후)에 대해toDateTime(Date)는 오버플로우를 일으키므로 저장된 키는 단조성을 보장하지 않습니다. 따라서 ClickHouse는 이제 이 키/프레디케이트 조합에 대해 프라이머리 키 프루닝을 사용하지 않습니다. 그렇게 하면 일치하는 행이 들어 있는 그래뉼이 제외될 수 있기 때문입니다. #101744를 종료했습니다. #101814 (Nihal Z. Miaji). - 나눗셈이 부동소수점 예외(floating-point exception)(0으로 나누기 또는
INT_MIN / -1)로 이어질 때(부호 있는 인수와 없는 인수가 섞인 경우 포함),intDivOrNull,moduloOrNull,positiveModuloOrNull이NULL대신0을 반환하던 문제와intDivOrNull,intDivOrZero가NULL/0을 반환하는 대신 예외를 발생시키던 문제를 수정했습니다. #101976 (Yarik Briukhovetskyi). - 동시
Iceberg메타데이터 업데이트나DeltaLake테이블에 대해merge테이블 함수를 통한 읽기 같은 예외적인 상황에서Iceberg또는DeltaLake테이블을 읽을 때 발생하던LOGICAL_ERROR예외를 수정했습니다. #102033 (Groene AI). - 아웃바운드 HTTP 요청(예:
aiGenerate함수,url테이블 함수, S3)이 IPv4와 IPv6 주소를 모두 알리지만 그중 하나의 주소 계열만 라우팅 가능한 호스트에서No route to host로 실패하던 문제를 수정했습니다. 이제 HTTP 연결 풀은 첫 번째 주소가 네트워크 오류로 실패하면 첫 번째 요청에서 즉시 오류를 전파하는 대신, 다음으로 확인된 주소로 폴백합니다. #103786 (Alexey Milovidov). - 순환 의존성이 있는 테이블이 포함된 백업을
RESTORE하는 중 발생하던 서버 비정상 종료를 수정했습니다. #103824 (Konstantin Bogdanov). - Arrow
time32/time64컬럼에 대한 스키마 추론(예:SELECT * FROM file(..., 'Arrow'))은 이제DateTime64대신Time64를 추론합니다. 이전에 추론된 유형에 의존하던 후속 구성 요소는 업그레이드 후 새 유형을 보게 됩니다. 또한 이제Time/Time64값은 정밀도에 따라 적절한 Apache Arrow 시간 유형을 선택해 Arrow로 내보낼 수 있습니다. #104038을 해결했습니다. #104316 (/bin/cat). MergeTree에서ALTER TABLE ... RENAME COLUMN과 동시에 실행되는OPTIMIZE TABLE ... FINAL(또는 임의의 백그라운드 머지) 사이의 경쟁 상태(race)로 인해, 이름이 변경된 컬럼의 데이터가 경고 없이 기본값으로 대체될 수 있던 문제를 수정했습니다. #104822 (Groene AI).DETACH DATABASE/ATTACH DATABASE이후lazy_load_tables = 1이 설정된Atomic데이터베이스에서,ALTER TABLE ... RENAME COLUMN이 진행 중일 때 동시에 수행된INSERT중Block structure mismatch논리 오류(logical error)가 발생하던 문제를 수정했습니다. #104852 (Groene AI).- 매개변수 형식과 2인수 형식을 혼용할 때
groupConcat이 잘못 동작하던 문제를 수정했습니다. 예:groupConcat(',', 2)(x, '/'): 행 수 제한 매개변수가 경고 없이 무시되어 요청한 개수 대신 모든 행이 반환되었고, 이제 두 번째 인수의 구분자가 매개변수를 올바르게 재정의합니다. #104882 (Yarik Briukhovetskyi). KILL QUERY/KILL MUTATION/KILL PART_MOVE_TO_SHARD/KILL TRANSACTION의WHEREclause에 행별 subquery가 포함되어 있거나, 관련system.*테이블에 대한 내부SELECT가 2개 이상의 block을 내보낼 정도로max_block_size가 작을 때 발생하던LOGICAL_ERROR(Expected one block from input stream)를 수정했습니다. #104927 (Groene AI).- 더 작은 인터벌 단위에서 더 큰 인터벌 단위로
CAST할 때 잘못된 결과를 반환하던 문제를 수정했습니다(예:CAST(toIntervalSecond(60) AS IntervalMinute)가1대신0을 반환). #104986를 종료합니다. #105058 (Yarik Briukhovetskyi). - 읽기 순서 파이프라인(
optimize_read_in_order = 1및read_in_order_use_virtual_row_per_block = 1)으로 실행되는LIMIT ... WITH TIES쿼리에서 발생하던 논리 오류(logical error) (Assertion 'row < chunk.getNumRows()' failed)를 수정했습니다. #105102 (Groene AI). - 갱신 가능 구체화 뷰(
MATERIALIZED VIEW ... REFRESH ...)의 누수 문제를 수정했습니다. 갱신 시EXCHANGE TABLES를 통해 교체되는 임시 내부 테이블은max_table_size_to_drop보다 크면 삭제할 수 없었기 때문에, 이후 갱신할 때마다 또 다른 임시 내부 테이블이 생성되어 뷰의 데이터 디렉터리가 디스크가 소진될 때까지 계속 커질 수 있었습니다. 이제 갱신 작업의 내부 삭제는max_table_size_to_drop및max_partition_size_to_drop를 우회합니다. 이러한 안전장치는 뷰 자체에 대해 사용자가 실행한DROP TABLE에는 계속 적용됩니다. #104900를 종료합니다. #105106 (Groene AI). - 정렬 키를 변경하지 않는
ALTER쿼리(설정, comment, codec 변경, 키가 아닌 컬럼 추가 등)에서, 정렬 키에SimpleAggregateFunction(또는allow_suspicious_primary_key = 1일 때만 허용되는 다른 유형)이 포함된MergeTree테이블에 대해 예기치 않은DATA_TYPE_CANNOT_BE_USED_IN_KEY오류가 발생하던 문제를 수정했습니다. #105111 (Groene AI). Replicated데이터베이스가 삭제되거나DETACH되는 동안system.clusters레플리카 상태 컬럼(is_active,unsynced_after_recovery,recovery_time등)을 쿼리할 때 발생하던 use-after-free를 수정했습니다. 또한 이 코드 경로에서 무시되던 무해한 Keeper 예외(영향받는 데이터베이스는 일시적으로 사용할 수 없는 것으로 간주되어 건너뜀)는 이제Error가 아니라Information수준으로 기록되므로, 기본send_logs_level = 'warning'에서는 더 이상 클라이언트에 전달되지 않습니다. #105149 (Groene AI).clickhouse-local --ignore-error에서 여러 SQL 문을 실행할 때, 어휘 오류 또는 괄호 불일치 오류가 발생할 때마다 이후의 모든 SQL 문이 오류 메시지에 함께 출력되던 문제를 수정했습니다. #105480 (Groene AI).- 갱신 가능 구체화 뷰가 갱신 스케줄링과 동시에 삭제되거나 교체될 때 드물게 발생하던 서버 크래시를 수정했습니다. #105588 (Groene AI).
- 데이터 파일 포맷이
Parquet가 아닌Iceberg테이블에서ALTER TABLE ... DELETE및ALTER TABLE ... UPDATE를 수행할 경우, 서버가 크래시하거나 테이블이 조용히 손상되는 대신 명확한NOT_IMPLEMENTED오류를 반환하도록 했습니다. #105893 (Groene AI). EXCEPT또는INTERSECT로 정의된 뷰에서 피연산자가UNION체인인 경우,DETACH/ATTACH이후 또는 서버 재시작 후 잘못된 결과가 나오던 문제를 수정했습니다. 포매터에서INTERSECT/EXCEPT의UNION하위 식 주위 괄호가 누락되어, 저장된 SQL이 우선순위가 뒤바뀐 상태로 다시 파싱되고 있었습니다. #105935 (Groene AI).- 포맷 자동 감지 중
JSON데이터가TSKV로 잘못 감지되던 문제를 수정했습니다. 이슈 #100797을 해결했습니다. #106009 (Pavel Kruglov). JSON컬럼에 직접minmax스킵 인덱스를 생성하는 것을 금지했습니다. 이전에는 혼합 타입 배열이 삽입되면 나중에NO_COMMON_TYPE예외와 함께 INSERT가 실패할 수 있었습니다. 대신 타입이 있는 서브컬럼에 인덱스를 생성하십시오(예:INDEX idx json.field TYPE minmax). #106094 (linhaojie).Time유형 파티션 키가 있는 테이블에서OPTIMIZE TABLE ... PARTITION ...및 파티션 값을 해석하는 다른 쿼리가Parsed partition value ... doesn't match partition value for an existing part with the same partition ID논리 오류를 발생시키던 문제를 수정했습니다. #106202 (Groene AI).- 경량한 삭제 후 프로젝션 파트가 남지 않는 경우 데이터 파트가 손상된 프로젝션이 있는 것으로 잘못 표시되던 문제를 수정했습니다. 이는 프로젝션이 출력 행 0개로 다시 빌드되거나, 프로젝션이 삭제될 때(
lightweight_mutation_projection_mode = 'rebuild'/'drop') 발생할 수 있었습니다. 이전에는 이 손상 상태 때문에 해당 파트에 대한 쿼리에서 프로젝션 최적화가 비활성화되었습니다. #106273 (Shaohua Wang). plain객체 스토리지 디스크(s3_plain등)에서removeDirectory가 비어 있지 않은 디렉터리를 제거할 때 재귀 삭제처럼 내부의 모든 파일을 삭제하던 문제를 수정했습니다. 이제 비어 있지 않은 디렉터리 삭제는CANNOT_RMDIR로 실패하며, 재귀 삭제는 디렉터리 내용을 명시적으로 처리합니다. #106281 (RinChanNOW).- quorum
INSERT가 실패로 표시되는 것과 동시에 Keeper 하드웨어 오류로부터 복구하는 과정에서Part ... doesn't exist논리 오류가 발생해 서버가 중단될 수 있던 문제를 수정했습니다. #106424 (Alexey Milovidov). - 행 정책을 적용할 때 중복된 컬럼명 때문에 발생하던
LOGICAL_ERROR예외를 수정했습니다. #106438 (János Benjamin Antal). - 기존 대상의 크기가
max_table_size_to_drop를 초과할 때CREATE OR REPLACE TABLE및REPLACE TABLE이 디스크에_tmp_replace_*테이블을 남기고 원본 테이블을 빈 테이블로 교체하던 문제를 수정했습니다. 이제 크기 검사는 스왑 전에 수행되므로, 제한을 위반하면 사용자에게 표시되는 테이블명이 포함된 오류와 함께 정상적으로 중단됩니다. #106782 (Groene AI). Dynamic인수에서JSON_QUERY/JSON_VALUE/JSON_EXISTS가String/UInt8대신Dynamic을 반환하던 문제를 수정했습니다. #106461을 해결합니다. #106877 (Pavel Kruglov).query_plan_optimize_lazy_final이 활성화된 상태에서 텍스트 인덱스 필터와 함께FINAL로ReplacingMergeTree테이블을 쿼리할 때 잘못된 결과가 나오던 문제를 수정했습니다. 지연 실행FINAL최적화가 텍스트 인덱스의 직접 읽기를 재현하지 못하는 읽기 단계를 생성해, 필터가 일치하는 모든 행을 제거했습니다. #106894 (Jimmy Aguilar Mena).- 예외에 덧붙는 메시지에도
query_masking_rules를 적용하여, masking rules가 구성된 경우jdbc/odbc테이블 함수 오류의(in file/uri ...)접미사에 포함된 URL-encoded credentials가 노출되지 않도록 했습니다. #106916 (Gaurav Dubey). - 파티션 키에
LowCardinality(Nullable(...))컬럼이 있는 테이블에서 파트를 다시 로드할 때마다(서버 재시작,DETACH/ATTACH) 파트가 손상된 것으로 표시되고 detach되던 문제를 수정했습니다. 26.5부터는 이런 컬럼의 최솟값과 최댓값이NULL일 때 파트별 minmax 인덱스 파일이 기록되지 않았지만, 파트 일관성 검사는 여전히 해당 파일을 요구했습니다. 영향을 받은 버전에서 작성된 파트에는 minmax 인덱스 파일이 없으므로, 여전히 수동으로 다시 attach해야 합니다. #106837을 해결합니다. #106945 (Pedro Ferreira). - non-equi
JOIN ... ON프레디케이트가Nothing타입 컬럼(예:ARRAY JOIN []로 생성된 컬럼)을 참조할 때 발생하던LOGICAL_ERROR(Unexpected expression in JOIN ON section. Expected boolean (UInt8), got 'Nothing')를 수정했습니다. #106981 (Groene AI). enable_filesystem_query_cache_limit = 1로 생성된 파일 시스템 캐시 디스크를 통해MergeTree테이블을 읽을 때 드물게 발생하던LOGICAL_ERROR(Attempt to release query context that does not exist)와 이에 수반되는 server 크래시를 수정했습니다. #107028 (Groene AI).- 빈 파트를
plain_rewritable디스크로 이동할 때 발생하던 server 크래시를 수정했습니다(예:remove_empty_parts = 0으로 유지된 빈 파트에 대해ALTER TABLE ... MOVE PARTITION ... TO DISK를 수행하는 경우). #107040 (Groene AI). optimize_read_in_order및read_in_order_use_virtual_row가 활성화된 상태에서UNION ALL에 대한ORDER BY쿼리의 행 순서가 잘못되던 문제를 수정했습니다. #106879을 해결합니다. #107053 (Vladimir Cherkasov).- 좌표 인수에 상수 값과 비상수 값이 섞여 있거나 좌표가
BFloat16인 경우geohashesInBox함수에서 발생하던LOGICAL_ERROR(Unsupported argument types)를 수정했습니다. 이제 상수/비상수Float32인수를 혼용해도 동작하며,BFloat16인수는 명확한 오류 메시지와 함께 거부됩니다. #107063 (Groene AI). - 동일한 키에 대해
WITH CUBE,WITH ROLLUP, 또는GROUPING SETS를 사용하는GROUP BY에SELECT DISTINCT를 적용할 때 잘못된 결과(중복 행)가 발생하던 문제를 수정했습니다. 이러한 경우 그룹화 수식어가 키 컬럼이 기본값으로 채워진 추가 행을 생성할 수 있고, 이 행들이 실제 그룹 값과 충돌할 수 있으므로query_plan_remove_redundant_distinct최적화는 더 이상DISTINCT를 제거하지 않습니다. #107072 (Groene AI). WHERE필터가 상수 항을 포함하는 논리곱일 때OUTER JOIN에서 잘못된 결과가 발생하던 문제를 수정했습니다(예:p AND 1, 또는QUALIFY NULL이WHERE에 병합되는WHERE p QUALIFY NULL). 상수 논리곱 항이 조인의 보존되지 않는 쪽으로 푸시다운된 뒤 조인 후 필터에서 제거될 수 있었고, 그 결과 조인이 해당 쪽 컬럼이 기본값으로 채워진 비일치 행을 생성했으며, 이 행들이 필터를 잘못 통과했습니다. #107084 (Groene AI).<lifetime>으로 구성된executable_pool사용자 정의 함수가 기반 script의 변경 사항을 반영하지 못하던 문제를 수정했습니다. 이전에는SYSTEM RELOAD FUNCTIONS만 수정된 script를 다시 읽었고, 주기적인<lifetime>재로드에서는 계속 이전 버전이 실행되었습니다. #107087 (Groene AI).correlated_subqueries_default_join_kind = 'left'일 때 동일한 컬럼 식별자를 두 번 프로젝션하는 소스(예:SELECT number, *)에 대한 correlated scalar subquery에서 발생하던LOGICAL_ERROR예외(Cannot find input column ... on its position in inputs of expression actions DAG)를 수정했습니다. #107112 (Groene AI).- worker thread가 profiler를 시작하는 시점과 server 종료 시점 사이에 server 전역 trace collector에서 발생하던 data race를 수정했습니다. #107307 (Groene AI).
- 증분 백업은 이제
.backup메타데이터 파일의<base_backup>locator에S3자격 증명을 저장하지 않습니다.use_same_s3_credentials_for_base_backup = 1로 생성되었거나, 이 백업 locator와 일치하는 명시적 기준 백업 자격 증명으로 생성된 백업은 비밀값이 아닌 마커를 저장하며, 복원 시 추가 설정 없이 복원됩니다. 다른 명시적 기준 백업 자격 증명이나 추가 기준 authentication 인수로 생성된 백업의 경우base_backupsetting과 함께 해당 값을RESTORE에 전달하십시오. 이전 버전에서 embedded credentials로 생성된 백업도 계속 복원할 수 있습니다. #107357 (Pablo Marcos). output_format_csv_serialize_tuple_into_separate_columns가 활성화된 경우(기본값)CSVWithNames및CSVWithNamesAndTypesheader의 컬럼 수가 데이터보다 적던 문제를 수정했습니다. 이제 header(및 타입 행)는Tuple컬럼을 점 표기 이름(예:t.a,t.b)을 사용하는 리프 field로 평탄화하므로, header 컬럼 수가 데이터와 일치합니다. 이를 제어하는 새로운 설정output_format_csv_header_serialize_tuple_into_separate_columns(기본값1)이 추가되었으며, 이전의 단일 이름 header로 되돌리려면0으로 설정할 수 있습니다. #107371 (Groene AI).Parquetdata files에 예약된 행 계보 컬럼(예:_row_id)이 포함된Icebergv3 table을 읽을 때 발생하던 문제를 수정했습니다. 이제 네이티브Parquetreader는 table schema에 포함되지 않은 예약 field ID에 대해 더 이상ICEBERG_SPECIFICATION_VIOLATION을 발생시키지 않습니다. #107377 (Greg Maher).- 실행되기 전에 예약된 작업이 스레드 풀 큐에서 제거되면서, 종료 중 드물게 서버가 비정상 종료되던 문제(
std::future_error:The associated promise has been destructed prior to the associated state becoming ready)를 수정했습니다. #107383 (Groene AI). MaterializedPostgreSQL테이블 및 데이터베이스 엔진을 수정하여, 기본이 아닌 PostgreSQL schema(materialized_postgresql_schema)에서도 단일 테이블 또는 데이터베이스를 복제할 수 있도록 했습니다. 여기에는 동일한 데이터베이스의 여러 schema에 같은 이름의 테이블이 있는 경우도 포함됩니다(이전에는 publication과 replication slot을 공유하면서 서로 간섭했습니다). #107425 (Alexey Milovidov).- 서버가 중지된 동안 단일 복제된 테이블의 구조가 변경되면
MaterializedPostgreSQL이 전체 데이터베이스 복제를 중단하던 문제(LOGICAL_ERROR: Columns number mismatch)를 수정했습니다. 이제는 영향을 받은 테이블만 건너뛰며,DETACH/ATTACH로 복구할 수 있습니다. #107427 (Alexey Milovidov). MaterializedPostgreSQL데이터베이스의BACKUP이 더 이상Table ... were created or changed its definition during scanning오류와 함께 무기한 멈추지 않으며, 이제 실제로 테이블 데이터도 백업합니다(기반ReplacingMergeTree에 위임됨). 이 데이터는 독립 실행형ReplacingMergeTree로 복원할 수 있습니다. #107433 (Alexey Milovidov).compatibility = '26.6'설정 시(암묵적으로hive파티션 전략을 활성화함)BAD_ARGUMENTS를 발생시키지 않고 S3/객체 스토리지 테이블 경로에서{_partition_id}를 조용히 허용하던 회귀를 수정했습니다. #107437 (Lefteris).- MongoDB에서 읽는 동안(예: MongoDB 딕셔너리 또는
mongodb테이블 함수를 통해) 재시도 가능한 읽기 오류가 발생한 뒤, 재시도 중 서버 선택이 실패할 경우 생길 수 있던 번들된mongo-c-driver의 메모리 누수를 수정했습니다. #107448 (Groene AI). - 외부 엔진이 생성한 metadata에서 선택적인
snapshots,metadata-log,snapshot-log배열이 생략된Iceberg테이블에 삽입할 때 발생하던 예외를 수정했습니다. 이제 이러한 삽입은 실패하지 않고 성공합니다. #107473 (Shaohua Wang). DELETE FROM(경량한 삭제)에ALTER DELETE뿐 아니라ALTER UPDATEprivilege까지 필요하던 문제를 수정했습니다. 이제ALTER DELETE만 부여된 사용자도 문서에 설명된 대로DELETE FROM을 실행할 수 있습니다. #107491 (Shaohua Wang).use_hive_partitioning = 1을 사용해 Hive 파티셔닝된 파일을 읽을 때, 실제(가상 아님) 컬럼을 필터링하는WHERE/PREWHERE절이 있고 동시에 Hive 파티션 컬럼도 선택된 경우 발생하던NOT_FOUND_COLUMN_IN_BLOCK을 수정했습니다. #107505 (Groene AI).- 이전 분석기(
enable_analyzer = 0)가 자식이INTERSECT/EXCEPT집합 연산인UNION하위 쿼리에서 컬럼 일부만 읽을 때 발생하던LOGICAL_ERROR(Different order of columns in UNION subquery)를 수정했습니다. #107511 (Groene AI). Arrow/ORC데이터를LowCardinality(Nullable(...))컬럼에 삽입할 때NULL값이 조용히 빈 문자열로 변환되던 문제를 수정했습니다. 이는 26.5에서 도입된 회귀였습니다. #107532 (Jimmy Aguilar Mena).Dynamic컬럼이 있는 테이블의 mutation으로 생성된MergeTree파트를 머지하거나 읽는 과정에서 발생할 수 있던 논리 오류(Stream ... variant_discr ... is not found)를 수정했습니다. #107562 (Alexey Milovidov).pointInPolygon이Variant또는Dynamic같은 래퍼 유형의 상수 Polygon 인수와 함께 호출될 때(예:pointInPolygon((x, y), if(c, [(0, 0), ...], NULL))) 프라이머리 키 분석 중 발생하던 논리 오류(WhichDataType(const_type).isArray())를 수정했습니다. #107589 (Groene AI).- 감시 중인 파일이 삭제된 후 동일한 inode를 재사용해 다시 생성될 때
FileLog엔진에서 발생할 수 있던 논리 오류(Last stored last_written_position in meta file ... is bigger than current last_written_pos)를 수정했습니다. #107617 (Groene AI). - ZooKeeper 클라이언트 요청 처리 중 드물게 발생하던 서버 중단(
std::future_error:The associated promise has been destructed prior to the associated state becoming ready)을 수정했습니다. 이 문제는 예를 들어 메모리 압박 상태에서 비동기 Keeper 요청이 전송 중 폐기될 때 발생할 수 있었습니다. #107647 (Groene AI). ReplicatedMergeTree테이블에 대한RESTORE를 수정하여, 백업의 중복 콘텐츠 파트가 조용히 중복 제거되지 않고 보존되도록 했습니다. #107652 (Pablo Marcos).JSON컬럼에서 runtime join filter가 잘못된 결과를 생성하던 문제를 수정했습니다. Closes #107646. #107663 (Pavel Kruglov).- 공통 부분 표현식을 공유하는
ALIAS컬럼을 선택하는 분산 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. 컬럼 정렬이 어긋나 값이 잘못된 컬럼 아래 반환될 수 있었습니다. #107675 (Vladimir Cherkasov). - 이제
normalized_query_hash를 키로 사용하는 quota는 쿼리 수 카운터와 마찬가지로 모든 리소스(read_rows,read_bytes,result_rows,result_bytes,execution_time,written_bytes,errors)를 사용자별 단일 공유 버킷이 아니라 쿼리 패턴별로 집계합니다. #107681 (Alexey Milovidov). UNION/INTERSECT/EXCEPT의 형제 분기들이WHERE프레디케이트만 다르고, 한 분기의 프레디케이트가Const컬럼으로 상수 폴딩되었을 때 발생하던Block structure mismatch in UnionStep stream논리 오류(debug/sanitizer 빌드에서는 서버 중단, release 빌드에서는Code: 49)를 수정했습니다. #107719 (Groene AI).Variant및Dynamic컬럼 내부에 중첩된LowCardinality를 일관성 없이 제거하면서 발생하던 논리 오류(Bad cast)를 수정했습니다. 예를 들어concat,format, 프라이머리 키 분석에서 문제가 발생할 수 있었습니다. Closes #107598. #107773 (Pavel Kruglov).- 클러스터에 비활성 레플리카(예: 자동 스케일링 후 남아 있는 오래된 엔트리)가 있을 때 병렬 레플리카에서 작업 분배가 심하게 치우치던 문제를 수정했습니다. 이제 이러한 레플리카는 읽기 코디네이터의 집계 대상에서 제외되므로, 작업이 단일 레플리카에 몰리지 않고 온라인 레플리카 전체에 고르게 분배됩니다. #107805 (Alexey Milovidov).
- 프라이머리 키 분석 중
IN서브쿼리 Set를 빌드하는 과정이 조용히 실패할 때(예:overflow_mode = 'break'인 서브쿼리 timeout) 발생할 수 있었던Not-ready Set is passed as the second argument예외를 수정했습니다. 이 문제로 인해 해당 Set가 쿼리 파이프라인에서 영구적으로 빌드되지 않은 상태로 남을 수 있었습니다. #107924 (Alexey Milovidov). JOIN ... ON조건 내부에UNION서브쿼리가 있을 때 프레디케이트 푸시다운(enable_optimize_predicate_expression, 레거시 분석기)에서 발생하던 서버 크래시를 수정했습니다. #107930 (Groene AI).- S3 또는 S3 호환(예: GCS) 객체를 읽는 도중 동일한 위치에 덮어쓸 경우 발생하던 잘못된
CHECKSUM_DOESNT_MATCH및Parquet읽기 오류(일부 포맷에서는 조용히 잘못된 결과가 반환되는 문제 포함)를 수정했습니다. 이제 이런 읽기는 두 객체 버전의 데이터가 이어 붙여진 결과를 반환하는 대신, 명확하고 재시도 가능한 오류로 실패합니다. 이 동작은 새로운 설정s3_validate_etag_on_read로 제어되며 기본적으로 활성화되어 있습니다. #107934 (Shaohua Wang). - 항상 참인 조건과 인덱싱되지 않은 컬럼에 대한 검사 조건을 결합해 행 정책이 필터링하는 경우,
set데이터 스키핑 인덱스가 있는 테이블에서SELECT가NOT_FOUND_COLUMN_IN_BLOCK와 함께 실패하던 문제를 수정했습니다. #107971 (Shaohua Wang). - 빈 이름이나 잘못된 이름의 placeholder가 매개변수로 허용되지 않도록 실행형 사용자 정의 함수 명령 매개변수 파싱을 수정했습니다. #107983 (Goutam Adwant).
PREWHERE에서Map서브컬럼의 성능 회귀를 수정했습니다. #107912를 해결합니다. 원인은 #99200이었습니다. #107988 (Pavel Kruglov).- 존재하지 않는 variant 인덱스를 판별자가 참조하는 잘못된 형식의
Nativeblock에서Variant컬럼을 읽을 때 발생하던 범위 밖 쓰기를 수정했습니다. #107991 (uwezkhan). Date32키 컬럼에 함수가 표현할 수 있는 범위를 벗어난 날짜(특히1970-01-01이전 날짜)가 포함되어 있을 때,toStartOfDay,toStartOfISOYear,toDaysSinceYearZero,toRelativeSecondNum,toRelativeMinuteNum,toRelativeHourNum,toRelativeWeekNum,toRelativeDayNum,toMonthNumSinceEpoch, 또는toYearNumSinceEpoch를 적용하면 잘못된 프라이머리 키 및 파티션 프루닝으로 인해 쿼리 결과가 잘못되던 문제를 수정했습니다. 이 함수들은 자신이 프라이머리 인덱스에 대해 단조적이라고 보고하지만, 이전에는 이런 인수에서 값이 순환되어 실제로 일치하는 행이 들어 있는 그래뉼까지 인덱스가 프루닝할 수 있었습니다. 이제는 결과 타입의 경계값에서 포화되며Date32전체 범위에서 단조성을 유지합니다. #108018 (Nihal Z. Miaji).- 요소가
Dynamic/Variant인Tuple에 대한accurateCastOrNull을 수정했습니다. 실제 소스NULL이 변환 실패로 처리되던 문제입니다. 이제 대상 요소가Nullable이면 소스NULL은 요소NULL로 유지됩니다(일반적인Tuple(Nullable(...))소스와 동일). 대상 요소가Nullable이 아니면, 소스NULL은 요소 기본값을 생성하는 대신 전체 튜플을NULL로 만듭니다. 파싱/오버플로우 실패 시에는 계속해서 전체 튜플이NULL처리됩니다. #108023 (Groene AI). 또한Tuple내부에 중첩된Dynamic또는Variant컬럼을accurateCastOrNull또는accurateCastOrDefault로Nullable이 아닌 요소 타입으로 캐스팅할 때 발생하던 logical error도 수정했습니다. #108061 (Alexey Milovidov). - BSI(bit-sliced index) 구성이 다른 전체 1 벡터를 곱할 때
numericIndexedVectorPointwiseMultiply가 빈 결과를 반환하던 문제를 수정했습니다. #108027 (Alexey Milovidov). saturate및ignore오버플로우 모드에서 범위를 벗어난 값을Time64범위로 제한하지 않던toTime64및CAST(... AS Time64)문제를 수정했습니다. 이로 인해 표시상으로는 동일하지만 비교 시에는 다른 값으로 취급되는 값이 생성될 수 있었습니다. #108028 (Alexey Milovidov).- 이제
getClientHTTPHeader는 비결정적으로 올바르게 처리되므로, 그 결과가 더 이상 쿼리 결과 캐시에서 잘못 재사용되지 않습니다. #108029 (Alexey Milovidov). clickhouse-client --port 9440이 다시 보안(TLS) 연결을 자동으로 활성화합니다. 이는 포트를 보안 연결 검사에 전달하지 않도록 변경한 리팩터링 때문에 깨져 있던 문제였습니다. #108032 (Alexey Milovidov).- 읽기 전용 테이블의 데이터 파트를 갱신하는 중 일시적인 오류가 발생하더라도, 이제 백그라운드 갱신 작업이 영구적으로 중지되지 않습니다. #108034 (Alexey Milovidov).
system.warnings에서 memory/CPU/mutation 과부하 경고가 비동기 메트릭 사이클보다 한 사이클 늦게 표시되던 문제(그리고 첫 번째 사이클에서는 표시되지 않던 문제)를 수정했습니다. #108035 (Alexey Milovidov).- 이제
mongodb테이블 함수는oid_columns를 이름 있는 인수로 전달하는 방식(예:oid_columns='_id')을 지원하며, 더 이상BAD_ARGUMENTS오류로 거부하지 않습니다. #108039 (Alexey Milovidov). - 한정된 애스터리스크(
t.*)가JOIN USING키를 선택하고, 해당 join이PASTE/CROSS/쉼표 join 또는 외부ONjoin 아래에 중첩되어 있으며join_use_nulls = 0일 때 발생하던Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>예외(logical error)를 수정했습니다. #108043 (Groene AI). - regexp “match all” 함수
extractAll,extractAllGroupsVertical,extractAllGroupsHorizontal,countMatches,splitByRegexp에서 폭이 0인 단언(\b,^,$)을 잘못 처리하던 문제를 수정했습니다. 예를 들어, 이제extractAll('new york is the greatest', '\b(\w)')는 모든 글자가 아니라 각 단어의 첫 글자를 올바르게 반환합니다. #108047 (Alexey Milovidov). Atomic데이터베이스에서CREATE TABLE ... AS SELECT쿼리가 실패할 때 빈 테이블이 남던 문제를 수정했습니다. 예를 들어 사용자가 서브쿼리에서 참조된 테이블에 대한 접근 권한이 없는 경우가 이에 해당합니다. 이전에는 다시 시도하면 원래 오류 대신 테이블이 이미 존재한다는 메시지가 보고되었습니다. 이제 테이블은 임시 테이블을 통해 생성되며, 데이터가 모두 채워진 후에만 표시됩니다. #108048 (Alexey Milovidov).DateTime64,Decimal또는 부동소수점 범위를 사용하는range_hashed또는complex_key_range_hashed딕셔너리를dictGet/dictHas에 맞는 인수와 함께 쿼리할 수 있도록 했습니다. 이전에는 이러한 쿼리가must be convertible to Int64오류와 함께 실패했고,Decimal/DateTime64범위의 개방형 인터벌은 기본값을 잘못 반환했습니다. #108052 (Alexey Milovidov).- 딕셔너리 정의에서 키 컬럼이 첫 번째 컬럼이 아니고, 명시적 쿼리를 사용하는 로컬
ClickHouse소스가 있는 복합 키 딕셔너리를 로드할 때 발생하던 예외(CANNOT_PARSE_TEXT)를 수정했습니다. 이제 원본 컬럼은 위치가 아니라 이름을 기준으로 딕셔너리 구조와 매칭됩니다. #108053 (Alexey Milovidov). - 비트 폭이 작은 부동소수점 컬럼에서 정확히 표현할 수 없는 decimal 리터럴(예:
Float32컬럼의0.1)을 사용할 때values테이블 함수가ARGUMENT_OUT_OF_BOUND로 실패하던 문제를 수정했습니다. 예:SELECT * FROM values('x Float32', 0.1). 이제 이러한 값도 허용되며, 표현 가능한 가장 가까운 값으로 변환되어CAST및INSERT ... VALUES와 일관되게 동작합니다. #108055 (Alexey Milovidov). - 사용자가
ALIAS컬럼에만SELECT접근 권한을 가진 테이블에서SELECT count()(또는 그 밖의 단순한 쿼리)를 실행할 때 발생하던LOGICAL_ERROR(No available columns)를 수정했습니다. #108056 (Alexey Milovidov). mapFilter,mapSort(및 그 변형),mapConcat가Map의 키 및 값 타입에서LowCardinality를 제거하던 문제를 수정했습니다. 이전에는Map(LowCardinality(String), String)컬럼에mapFilter를 적용하면Map(String, String)이 반환되었고, 이로 인해CREATE TABLE ... AS SELECT로 생성된 테이블의 metadata가 손상되어CHECK TABLE이 실패할 수 있었습니다. #108057 (Alexey Milovidov).splitByNonAlpha이외의 토크나이저를 사용하는 텍스트 인덱스에서hasToken사용 시 잘못된 결과가 반환되던 문제를 수정했습니다. #108066 (Robert Schulze).- XML에 정의된 많은 MySQL 딕셔너리가
share_connection을 통해 하나의 연결 풀을 공유할 때SYSTEM RELOAD DICTIONARIES(및RELOAD DICTIONARY)가 멈추던 문제를 수정했습니다. 이제 이러한 풀도 구성의connection_pool_size와connection_wait_timeout(기본값 5초)을 준수하며, 이는 명명된 컬렉션을 통해 정의된 딕셔너리와 동일하게 동작합니다. #108083 (Alexey Milovidov). - 딕셔너리에 대해
SHOW DICTIONARIES권한만 가진 사용자도EXISTS <dictionary>를 사용할 수 있도록 했습니다(이전에는SHOW TABLES가 필요했습니다). #108084 (Alexey Milovidov). CREATE TABLE dst AS src SETTINGS ...(및 명시적인ENGINE없이ORDER BY/PARTITION BY를 사용하는 유사한 변형)에서 원본 테이블의 엔진, 스토리지 절(예: 테이블TTL및 키), 설정이 조용히 누락되던 문제를 수정했습니다. 이제 엔진과 재정의되지 않은 스토리지 절은 원본 테이블에서 상속되며, 지정한 설정은 원본 테이블 설정 위에 머지됩니다. #108085 (Alexey Milovidov).- Windows 기반 파일 시스템(WSL, CIFS/SMB, Docker Desktop bind mount)에서 part writer가 파트 디렉터리 rename 중 file descriptor를 열린 상태로 유지해
filesystem error: in rename: Permission denied가 발생하면서MergeTree테이블에 대한INSERT가 실패하던 문제를 수정했습니다. #108089 (Alexey Milovidov). WHERE절 없이Hive테이블을 쿼리할 때(예:SELECT * FROM hive_table) 크래시(null pointer dereference)가 발생하던 문제를 수정했습니다. #108094 (Alexey Milovidov).- 비상수 또는 false 조건이 있는
ALTER UPDATE col = ... WHERE <cond>를 수행한 뒤ALTER MODIFY COLUMN col <new type>를 실행한 후,apply_mutations_on_fly = 1상태에서 컬럼을 읽을 때 발생하던LOGICAL_ERROR(“if에서 예기치 않은 반환 유형”)를 수정했습니다. #108128 (Groene AI). - 입력값의 precision이 인터벌 단위보다 더 세밀할 때
toStartOfInterval및dateTrunc가 해당 인터벌의 시작값이 아니라 반올림된 값을 반환하던 문제를 수정했습니다. 예를 들어toStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond)는10:11:12.000대신10:11:12.001을 반환했습니다. 명시적인 origin을 사용하는 오버로드도 영향을 받았습니다. #103535를 해결했습니다. #108186 (Yarik Briukhovetskyi). system.query_views_log의view_query컬럼에서 민감한 정보를 숨기도록 했습니다. #108214 (Valerii Mordovskii).- 레거시
hypothesis스킵 인덱스(ATTACH호환성만을 위해 남겨둔 제거된 인덱스 유형)가 attached 상태인MergeTree테이블에서 멈춤 현상이 발생하던 문제를 수정했습니다. 이전에는 이러한 테이블에서 경량 DELETE,OPTIMIZE, 일반INSERT, 또는 필터링된SELECT를 수행하면ILLEGAL_INDEX(“‘hypothesis’ 유형의 인덱스는 더 이상 지원되지 않습니다”)와 함께 실패했고,DELETE뮤테이션은 무한히 재시도되었습니다. 이제 이 오래된 인덱스는 비활성 상태로 처리됩니다. 즉, 머지/뮤테이션 중에는 변경 없이 그대로 유지되고, 삽입 및 쿼리 계획에서는 건너뛰며,ALTER TABLE ... DROP INDEX로 계속 삭제할 수 있습니다. #108217 (Groene AI). type_json_allow_duplicated_key_with_literal_and_nested_object설정이JSON의 typed path에서 동작하지 않던 문제를 수정했습니다. #108218 (Pavel Kruglov).- 일반/집계 projection이 있는
MergeTree테이블에서make_distributed_plan = 1로 쿼리를 실행할 때 발생하던LOGICAL_ERROR(Different list of shards in child plans)를 수정했습니다. #108256 (Groene AI). replaceRegexpOne및replaceRegexpAll에서.이 기본적으로 줄바꿈 문자와도 매칭되도록 수정해, 다른 정규식 함수와 일관되게 동작하도록 했습니다. #108265 (linjiayu1025-collab).accurateCastOrNull로Array(Dynamic)또는Array(Variant)를QBit로 캐스팅할 때 발생하던 logical error를 수정했습니다. 예:accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI).- 이제
AggregateFunctionstate 컬럼에도index_granularity_bytes가 올바르게 적용됩니다. 이전에는 이런 컬럼에서 granule 바이트 상한이 무시되어(AggregatingMergeTree테이블의uniqExactstate 및 집계 프로젝션 등), 설정된 제한보다 훨씬 큰 granule이 생성되고 그 결과 읽기 증폭과 쿼리 시 메모리 사용량이 증가했습니다. #108297 (Groene AI). - lightweight
UPDATE/DELETE조건이 두 번 평가되던 문제를 수정했습니다. 이 문제는 비결정적 조건에서는 잘못된 동작을, 결정적 조건에서는 불필요한 추가 작업을 유발할 수 있었습니다. #86032를 해결합니다. #108323 (ofeliacode). headers_regexp정규식이 빈 값을 허용하는 헤더가 요청에 없을 때, 사전 정의된 HTTP 핸들러에서 발생하던 exception을 수정했습니다. #108324 (Vitaly Baranov).- 상수가 아닌 limit 인수에서
arrayPartialSort가 올바르게 동작하지 않던 문제를 수정했습니다. #108327 (Vitaly Baranov). - 스킵 인덱스를 빌드하는 동안 취소되거나
KILL된INSERT가 오랫동안 계속 실행되던 문제를 수정했습니다(예: high-cardinality 컬럼에 대한 제한 없는set(0)인덱스). 이제 쿼리가 취소되면 인덱스 빌드도 즉시 중단됩니다. #108351 (Shaohua Wang). primes테이블 함수에 대한SELECT가 취소 요청에 응답하지 않던 문제를 수정했습니다.step(또는limit)이 큰 경우KILL QUERY또는 타임아웃 이후에도 쿼리가 오랫동안 계속 실행될 수 있었습니다. 이제 즉시 중단됩니다. #108353 (Shaohua Wang).- 이름에
INT부분 문자열이 포함된 데이터 타입 이름의 파싱 문제를 수정했습니다(예: 데이터 타입 위치에서 사용된quantileInterpolatedWeighted와 같은 함수형 이름). 이런 이름이 MySQL 정수 타입으로 잘못 인식되어 첫 번째(...)인수 그룹이 display-width modifier로 조용히 소비되었고, 그 결과 쿼리 포맷팅 round-trip이 깨질 수 있었습니다. #108354 (Groene AI). - 잘못된 형식의
ARRAY JOIN뒤에 쉼표와 괄호로 묶인 테이블 목록이 올 경우, 거부되어야 하는데도 cross join으로 잘못 파싱되던 불일치를 수정했습니다. #108365 (Raúl Marín). format_display_secrets_in_show_and_select가 비활성화된 경우(기본값),EXPLAIN actions,EXPLAIN header,EXPLAIN PIPELINE출력에서encrypt,decrypt,HMAC등의 함수에 전달되는 시크릿 인수를 숨기도록 했습니다. #108386 (Raúl Marín).TO대상을 사용하는 갱신 가능 구체화 뷰의CREATE OR REPLACE문제를 수정했습니다. 교체되는 뷰가 이미 대상 테이블을 소유하고 있다는 이유로 잘못 거부되던 문제였습니다. #108392 (Nikolay Degterinsky).- 잘못된 형식이거나 동기화가 어긋난 native TCP protocol 스트림으로 인해 발생할 수 있던 서버 크래시(
Received signal 4, illegal instruction)를 수정했습니다. 이제 클라이언트가 제공한 초기 주소는 파싱하기 전에 숫자 형식의host:port인지 검증하며, 숫자가 아닌 포트가 트랩된getservbynamelibc 함수까지 전달되지 않도록 했습니다. #108410 (Groene AI). - 데이터베이스 종료 중 예외가 발생할 경우(예: 테이블의 플러시가 ZooKeeper timeout에 걸리는 경우) 발생하던 서버 크래시를 수정했습니다. 이제 나머지 종료 절차가 더 이상 건너뛰어지지 않으므로, 서버가 종료되기 전에 system logs가 플러시되고 해당 스레드가 join됩니다. #108417 (Groene AI).
- 패턴에 NUL(
\0) 바이트가 포함되어 있을 때 정규식 함수(match,extract,extractAll,replaceRegexpOne,replaceRegexpAll등)가 잘못된 결과를 조용히 반환하던 문제를 수정했습니다. 이제 NUL은 RE2와 일관되게 일반 리터럴 바이트로 처리됩니다. #108427 (Alexey Milovidov). http_options_response가 구성되지 않았을 때clickhouse-local이 HTTPOPTIONS요청에 빈 응답을 반환하던 문제를 수정했습니다. 이 때문에 쿼리는 정상적으로 동작하더라도 웹 UI(/play)에서는 연결이 끊어진 것으로 표시되었습니다. #108428 (Alexey Milovidov).- 분산 쿼리가 구조적으로 동일한 중복
ALIAS컬럼을 중복 제거하는 동시에key = valuenamed-collection 인수를 사용하는 테이블 함수(예:oss(s3_conn, filename = '...'))를 참조할 때 발생하던LOGICAL_ERROR(“Invalid action query tree node …”) 예외를 수정했습니다. #108435 (Groene AI). Replicated데이터베이스의 coordinated 갱신 가능 구체화 뷰가MULTI_READ기능 플래그를 지원하지 않는 Keeper(예: Keeper 다운그레이드 이후)에 attach되었을 때 시작 시 발생할 수 있던 서버 크래시(LOGICAL_ERROR: 'Unexpected exception in refresh scheduling')를 수정했습니다. 이제 서버를 중단하는 대신 해당 뷰가 정상적으로 중지됩니다. #108441 (Groene AI).- 병렬 레플리카 환경에서
MergeTree테이블의 virtual columns를 조회할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류(예:Column _part not found)를 수정했습니다. 여기에는asterisk_include_virtual_columns = 1을 사용하는SELECT *도 포함됩니다. #108451 (Groene AI). - 이제
SYSTEM RESET DDL WORKER를 실행하려면 새로운SYSTEM RESET DDL WORKERprivilege가 필요합니다. 이전에는 인증된 모든 사용자(readonly사용자 포함)가 이를 실행해 DDL worker 상태를 반복해서 재설정할 수 있었고, 그 결과ON CLUSTERDDL이 차단될 수 있었습니다. #108460 (Groene AI). catboostEvaluate의 model 경로를file테이블 함수 및 딕셔너리 소스와 마찬가지로user_files디렉터리로 제한했습니다. 이전에는 이 함수가 포함 여부 검사 없이 임의의 파일 시스템 경로를 허용해user_files외부 파일의 존재 여부를 확인하고 해당 파일에 대한 읽기를 유발할 수 있었습니다. 이제 model은 반드시user_files내부에 있어야 합니다. #108463 (Groene AI).- 이제
hasColumnInTable함수는 대상 테이블에 대한SHOW COLUMNSprivilege가 필요하며, 이는DESCRIBE및SHOW CREATE TABLE에 필요한 권한과 동일합니다. 이전에는 어떤 사용자든 접근 검사 없이hasColumnInTable을 호출해 컬럼명을 확인하고 테이블 및 데이터베이스의 존재 여부를 확인할 수 있었습니다. #108464 (Groene AI). mannWhitneyUTest,rankCorr,largestTriangleThreeBuckets,quantileGK,sequenceMatch/sequenceCount,groupArrayIntersect에 대해 조작된 집계 함수 상태를 역직렬화할 때 발생하던 과도한 메모리 할당 문제를 수정했습니다. 손상된 상태가 매우 큰 요소 개수를 선언하면 몇 바이트의 입력만으로도 서버가 수십 기가바이트를 할당하려고 시도할 수 있었는데, 이제 이러한 상태는TOO_LARGE_ARRAY_SIZE오류와 함께 거부됩니다. #108465 (Groene AI).- S3
301 Moved Permanently응답의 리디렉션 대상이remote_url_allow_hosts(RemoteHostFilter)와 일치하는지 검증하도록 했습니다. 이전에는 AWS SDK의 301 처리에서 응답에 포함된 공격자 지정 endpoint(Locationheader 또는<Endpoint>요소)를 호스트 검사 없이 그대로 따라갔기 때문에, 악의적이거나 침해된 S3-compatible 서버가 ClickHouse를 임의의 호스트(SSRF)로 리디렉션할 수 있었습니다. 307 리디렉션 경로에서는 이미 이 검사를 수행하고 있었으며, 이제 두 경로 모두 일관되게 동작합니다. #108466 (Groene AI). DataLakeCatalog데이터베이스 엔진의 기존storage_aws_access_key_id,storage_aws_secret_access_key,storage_catalog_credential,storage_auth_header설정이system.databases.engine_full및SHOW CREATE DATABASE에 평문으로 표시되던 자격 증명 유출 문제를 수정했습니다. 이제 이러한 값은[HIDDEN]으로 가려집니다. #108470 (Groene AI).ssl_certificate사용자 식별에서 단일*와일드카드가 정확히 하나의 이름 구성 요소에만 일치하도록 수정했습니다(RFC 6125 6.4.3). 이전에는CN또는DNS:SAN 주체의 와일드카드(예:*.corp.example.com)가evil.deep.corp.example.com과 같은 다중 레이블 이름에도 일치하여, 더 깊은 하위 도메인용 certificate 보유자가 와일드카드 사용자로 인증할 수 있었습니다.URI:SAN 일치 방식은 변경되지 않았습니다. #108472 (Groene AI).- MySQL wire 프로토콜의 SQL injection 문제를 수정했습니다. 이제 MySQL interface(포트 9004)를 통해 전송되는
SHOW TABLE STATUS LIKE인수와SET <mysql_setting>값은 재작성된 쿼리에 그대로 이어 붙이는 대신 파싱한 후 다시 인용합니다. 또한 MySQL interface를 통한KILL QUERY <id>가 여러 자리 connection id를 조용히 무시하던 문제도 수정했습니다. #108474 (Groene AI). - HTTP 쿼리 문자열 매개변수로 전달되는 민감한 값(예:
param_secret_key/param_aws_secret_access_key같은param_*쿼리 매개변수 바인딩,password매개변수 또는 S3 스타일signature매개변수)이 더 이상system.text_log또는 OpenTelemetry 스팬에 그대로 기록되지 않습니다. 이제Request URI로그 줄에서는 이름이 민감해 보이는 매개변수의 값을[HIDDEN]으로 대체해 가립니다. #108475 (Groene AI). url테이블 함수와URL저장 엔진의 스키마 추론 중http_forbid_headers구성이 적용되도록 했습니다. 이전에는 스키마를 추론하는 동안(예:Regexp형식 또는DESCRIBE사용 시) 금지된 header가 여전히 네트워크로 전송되었고, 해당 response body가 파싱 오류에 반영되어 시크릿이 유출될 수 있었습니다. 이제 추론 경로에서는 네트워크 접근 전에 header 필터를 검사하며, 이는urlCluster의 기존 동작과 일치합니다. #108476 (Groene AI).- 쿼리 조건 캐시(설정
use_query_condition_cache, 기본 활성화)와 함께SELECT ... SAMPLE ...를 사용할 때 잘못된 결과가 반환되던 문제를 수정했습니다. #108488 (Groene AI). max_parser_depth가 큰 값으로 설정된 경우[[[ ... ]]]또는array(array( ... ))처럼 깊게 중첩된 표현식으로 인해 발생하던 서버 크래시(스택 오버플로우)를 수정했습니다. #108493 (Raúl Marín).- 브로커가 TCP RST를 보내지 않은 채 누락된 하트비트로 인해 AMQP connection을 닫을 때,
DROP TABLE또는 서버 종료 시RabbitMQ테이블 엔진이 무기한 멈추던 문제를 수정했습니다. 이제 모든 블로킹 event loop 호출에 30초 타임아웃이 적용되어 종료가 항상 완료됩니다. #108497 (Aly Ayman). - 내부 쿼리의 일부로 실행된 보조 쿼리가 이제 내부 쿼리로 기록됩니다. #108506 (Miсhael Stetsyuk).
ArrowFlight테이블 엔진과arrowFlight테이블 함수가 이제<remote_url_allow_hosts>허용 목록을 준수합니다. 이전에는 connection 호스트와 포트가 검증되지 않아 쿼리가 허용 목록에 없는 호스트에도 연결될 수 있었습니다. #108507 (Groene AI).- MySQL wire 프로토콜 명령
COM_FIELD_LIST(mysql_list_fields)와COM_INIT_DB(USE database)가 이제 해당 SQL 대응식(SHOW COLUMNS/DESCRIBE및USE)과 동일한 access control을 적용합니다. 이전에는 일부 컬럼에만 권한이 있는 테이블의 컬럼명을 노출할 수 있었고,SHOW DATABASESprivilege 없이 현재 데이터베이스를 전환할 수도 있었습니다. #108508 (Groene AI). http_forbid_headers를 이제 대소문자를 구분하지 않고 일치시킵니다. HTTP header 이름은 대소문자를 구분하지 않으므로, 이제Authorization을 금지하면authorization,AUTHORIZATION및 그 밖의 대소문자 변형도 함께 차단됩니다. 설정된header_regexp패턴도 이제 명시적인(?i)플래그 없이 대소문자를 구분하지 않고 일치합니다. #108509 (Groene AI).- 분산 쿼리가 아직 구체화되지 않은
MATERIALIZEDCTE를 외부 테이블로 참조하고, 원격 소스가 지연 생성되는 경우 발생할 수 있던 서버 크래시(세그멘테이션 폴트)를 수정했습니다. #108547 (Groene AI). - 쿼리 조건 캐시(
use_query_condition_cache = 1)가 예를 들어use_skip_indexes = 0,ignore_data_skipping_indices또는 다른use_skip_indexes_for_disjunctions모드처럼 서로 다른 스킵 인덱스 집합이 실행된 쿼리에 대해 스킵 인덱스에서 파생된 mark 제외 정보를 재사용하면서 잘못된 결과를 반환하던 문제를 수정했습니다. 이제 스킵 인덱스에서 파생된 캐시 엔트리는 실제로 실행된 스킵 인덱스의 유효 집합을 기준으로 키가 지정됩니다. #108548 (Groene AI). DateTime64인수와 함께 사용하는changeYear,changeMonth,changeDay,changeHour,changeMinute,changeSecond의 여러 버그를 수정했습니다. 결과 컬럼이 인수의 scale 대신 하드코딩된 기본 scale 3으로 생성되어, 결과를arrayPushBack/arrayPushFront/arrayConcat에 전달할 때LOGICAL_ERROR(writeSlice expects same column types)가 발생할 수 있었습니다. 또한 나노초 정밀도(scale 9) 입력에서는DECIMAL_OVERFLOW가 발생했고, epoch 이전의 sub-second 입력은 잘못된 calendar second를 반환했습니다. 아울러DateTime64에 대한timeSlots가 선언된 return type에서 선택적Size인수의 scale을 무시하던 문제와,Size에서 가장 큰 scale에 대해 잘못된 timestamp를 반환하던 문제도 수정했습니다. #108551 (Groene AI). #108681 (Takumi Hara). #108994 (Groene AI).enable_identifier_resolve_cache가 활성화된 상태(기본값)에서 복합 프레디케이트에GROUP BY에서 별칭을 지정한 뒤 다시 참조할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #108553 (Groene AI).STREAM읽기(SELECT DISTINCT ... FROM table STREAM)에DISTINCT를 실행할 때 발생하던 논리 오류(Equal values are not contiguous within the range assumed to be sorted)를 수정했습니다. 이제STREAM읽기에는 읽기 순서 최적화가 적용되지 않습니다.STREAM읽기는 정렬 키 순서가 아니라 커밋 순서대로 행을 생성하기 때문입니다. #108568 (Groene AI).- 프로젝션이 두 가지 경우에 컬럼의 선언된
DEFAULT값(예:-1) 대신 컬럼 타입의 기본값(예:0)을 반환하던 문제를 수정했습니다. 첫째, 프로젝션 생성 후ALTER TABLE ... ADD COLUMN ... DEFAULT로 추가한 컬럼을 읽을 때(기본 테이블에서 읽는 경우는 이미 올바르게 동작했음), 둘째, 와이드 파트에서 해당 컬럼의TTL이 만료된 후입니다. #108569 (Shaohua Wang). #109013 (Shaohua Wang). - S3 업로드(예: 백업)가 일시적인 읽기 오류 후 재시도될 때 발생할 수 있던
ReadBuffer is canceled. Can't read from it.오류를 수정했습니다. #108573 (Groene AI). - 프라이머리 키는 서로 동일하지만 선언 방식이 다른 테이블(하나는 명시적
PRIMARY KEY, 다른 하나는ORDER BY에서 암묵적으로 파생됨)을ATTACH PARTITION ... FROM이 거부하던 문제를 수정했습니다. #108590 (Jordi Orihuela). - 여러 텍스트 인덱스가 부분적으로 구체화된 경우 텍스트 인덱스에서의 직접 읽기가 실패하던 문제를 수정했습니다. #108530을 해결합니다. #108607 (Anton Popov).
DESCRIBE loop('db', 'table')및DESCRIBE loop(<inner table function>)가SHOW COLUMNS/ 소스 접근 검사를 우회해 권한이 없는 사용자가 테이블의 컬럼 스키마를 읽을 수 있었던 메타데이터 노출 문제를 수정했습니다. #108624 (Groene AI).S3Queue및AzureQueue테이블 엔진의_etag가상 컬럼을 수정했습니다. 이 컬럼은 선언만 되어 있고 실제 값이 채워지지 않아SELECT _etag가 항상 빈 문자열을 반환했습니다. 이제S3엔진 및s3테이블 함수와 같이 객체 ETag를 반환합니다. #108625 (Groene AI).- 타임스탬프 컬럼의 시간대가 고정된 숫자 UTC 오프셋(예:
+05:30,-08:00,00:00) 또는 비IANA 표식fixed인Arrow,ArrowStream, Arrow 기반ORC파일을 읽을 때, 이전에는Cannot load time zone ...(BAD_ARGUMENTS) 오류와 함께 실패하던 문제를 수정했습니다. #108633 (Groene AI). SEMI/ANTIjoin에join_algorithm = 'full_sorting_merge'를 사용할 때 발생하던 예외(LOGICAL_ERROR: Join is supported only for pipelines with one output port또는NOT_IMPLEMENTED: MergeJoinAlgorithm is not implemented for strictness Semi)를 수정했습니다. 여기에는EXISTS상관 서브쿼리를 비상관화해 생성된 join도 포함됩니다. 이제full_sorting_merge는 실행할 수 없는 엄격성/종류 조합을 거부하므로, 플래너는 활성화된 다른 알고리즘으로 대체하거나 해당 join을 실행할 수 없다고 보고합니다. #108658 (Groene AI).- 서로 다른 짧은 토큰이 매우 많은 경우
positions = 1로 텍스트 인덱스를 빌드할 때 발생하던 힙 버퍼 오버플로를 수정했습니다. #108659 (Groene AI). - S3에서 읽거나 S3에 쓰는 쿼리가 S3 요청이 진행 중인 상태에서 취소될 경우(예:
KILL QUERY), 이제 오해의 소지가 있는 네트워크/S3 오류 대신 취소된 것으로 보고됩니다. 특히 S3로의 백업 또는 복원이 취소된 경우, 이제system.backups에BACKUP_CANCELLED/RESTORE_CANCELLED로 표시됩니다. #108673 (Julia Kartseva). - 잘못된 형식의
auth_header를 사용해 이전 버전(25.12 이하)에서 생성된DataLakeCatalog데이터베이스가 26.2 이상으로 업그레이드한 후 ATTACH되지 않아 server 시작이 실패하던 문제를 수정했습니다. 이제auth_header는CREATE시에만 검증되며,ATTACH시에는 startup 중이 아니라 처음 사용할 때 지연 방식으로 catalog를 빌드합니다. 따라서 설정이 잘못되었거나 연결할 수 없는 catalog 데이터베이스 하나 때문에 더 이상 server 시작이 차단되지 않습니다. #108674 (Groene AI). - 널 허용이 아닌
LowCardinality요소를Nullable(Tuple(...))컬럼의 subcolumn으로 사용할 때(예: sort key), merge 중 논리 오류(Sort order of blocks violated)가 발생하고 읽기 결과가 잘못될 수 있던 문제를 수정했습니다. #108679 (Groene AI). - 동일한
Distributed테이블에 대해SYSTEM FLUSH DISTRIBUTED와DROP TABLE이 동시에 실행될 때 발생할 수 있는 크래시(use-after-free)를 수정했습니다. #108684 (Groene AI). - key가 유효한 Base64가 아닐 때
azureBlobStorage(및 관련 Azure 테이블 함수와 스토리지)를 통해 발생할 수 있었던 Azure account key의 Base64 디코딩 크래시를 수정했습니다. 바이트 값이>= 0x80이면 범위를 벗어난 읽기가 발생했고, 유효하지 않은 바이트는 어떤 값이든 정의되지 않은 동작을 일으켰습니다. 이제 유효하지 않은 key는 정상적으로 거부됩니다. #108716 (Groene AI). Distributed테이블에 대한 subquery가 동일한 표현식으로 확장되는 2개 이상의ALIAS컬럼을 읽고(예:a1 String ALIAS toString(x), a2 String ALIAS toString(x)), 그 subquery가 바깥쪽 쿼리에 입력으로 사용될 때 발생하던NUMBER_OF_COLUMNS_DOESNT_MATCH오류를 수정했습니다. 예:SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (Groene AI).CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE실행 후 새 view가 원본 테이블을 구독하지 않은 상태로 남아, replace 이후 삽입된 모든 행이 조용히 누락되던 문제를 수정했습니다. #108728 (Alexey Milovidov).Distributed테이블의 세그먼트 분할 키가 분석기가 상수 폴딩하는 표현식(예:if(1, toInt32(id), toInt32(id) + 1))이고optimize_skip_unused_shards = 1일 때 발생하던 예외(Cannot find sharding key column, 그리고 debug 및 새니타이저 빌드에서는 server abort)를 수정했습니다. #108737 (Groene AI).GROUPING SETS/ROLLUP/CUBE에서LowCardinality상수 그룹화 키와 함께group_by_use_nulls를 사용할 때 발생하던 논리 오류(Bad cast from type DB::ColumnNullable to DB::ColumnString)와 잘못된 결과가 나올 수 있던 문제를 수정했습니다. #108771 (Alexey Milovidov).- 키에서
LowCardinality(FixedString)(또는LowCardinality(Nullable(FixedString))) 키 컬럼을 함수로 감싼 경우, 예를 들어WHERE k = 'literal'와 함께PARTITION BY sipHash64(k) % N을 사용할 때 파티션 및 프라이머리 키 프루닝이 조용히 비활성화되던 문제를 수정했습니다. 이 경우 쿼리는 프루닝하지 않고 모든 파티션을 스캔했습니다. #108777 (Groene AI). Alias테이블을 통한INSERT ... SELECT또는TimeSeries테이블로의INSERT ... SELECT가 예를 들어timeout_overflow_mode = 'break'와 같이 예외 없이 취소될 때 발생하던 logical error(디버그 및 새니타이저 빌드에서 서버 중단)를 수정했습니다. #108783 (Groene AI). #108796 (Shaohua Wang).String요소가 희소하게 저장된Tuple에groupConcat를 적용할 때 발생하던Bad cast from type DB::ColumnSparse to DB::ColumnStringlogical error(디버그 및 새니타이저 빌드에서 서버 중단)를 수정했습니다. #108790 (Groene AI).Map값에LowCardinality를 포함한 중첩Map이 있을 때mapFilter,mapSort,mapReverseSort,mapPartialSort,mapConcat에서 발생하던TYPE_MISMATCH를 수정했습니다. 예:mapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y'))). #108798 (Groene AI).- 살아 있는 레플리카 수가 과반수보다 적을 때
insert_quorum = 'auto'가 삽입을 미리 거부하지 않던 문제를 수정했습니다. 이제 이러한 삽입은 로컬 파트를 기록한 뒤 나중에UNKNOWN_STATUS_OF_INSERT로 timeout되는 대신, 즉시TOO_FEW_LIVE_REPLICAS와 함께 실패합니다. #108800 (Gagan Dhakrey). JOIN의WITH TOTALS행에 조인 한쪽의 상수 subquery에서 오는 상수값 대신 기본값(예:0)이 들어갈 수 있던 bug를 수정했습니다. 잘못된 결과는 일부 join 순서에서만, 또는query_plan_join_swap_table설정을 사용할 때만 나타났습니다. #108807 (Vladimir Cherkasov).- 서버 종료가
S3Queue/AzureQueue테이블 종료와 동시에 진행될 때 발생할 수 있던 segmentation fault(null 포인터 역참조)를 수정했습니다. #108810 (Miсhael Stetsyuk). - signal-stack 크기가 큰 CPU(예: AMX 인식 커널의 Intel Sapphire Rapids / Granite Rapids)에서 실행되는 glibc 빌드에서, signal alt-stack 크기를 페이지 크기의 배수로 올림하지 않아 시작 시 abort(
Cannot allocate ThreadStack,EINVAL)가 발생하던 문제를 수정했습니다. #108813 (Groene AI). - 이전에 취소된 쿼리로 인해 동기화가 어긋난 connection이 풀에서 재사용될 때, 분산 쿼리가 간헐적으로
UNEXPECTED_PACKET_FROM_SERVER(expected TablesStatusResponse, got ProfileInfo)와 함께 실패하던 문제를 수정했습니다. #108854 (Alexey Milovidov). - 분산 테이블에서
LowCardinality인수가 2개 이상인 함수 호출 시 발생할 수 있었던 논리 오류(릴리스 빌드에서는 예외, 디버그 및 새니타이저 빌드에서는 서버 중단)를 수정했습니다. 예를 들어remote테이블 함수와 함께GROUP BY키로 사용된concatAssumeInjective((SELECT toLowCardinality('p')), s)에서 발생할 수 있었습니다. 오류 메시지는Default functions implementation for LowCardinality is supported only with a single LowCardinality argument또는Expected the argument ... to have N rows, but it has M였습니다. #108871 (Groene AI). - 소스와 대상의 물리 타입이 동일할 때
reinterpret(x, 'Decimal128(scale)')(및Decimal32/Decimal64/Decimal256/DateTime64대상)가 요청된 대상 스케일이 아니라 소스 스케일을 내부 스케일로 갖는 결과 컬럼을 생성하던 문제를 수정했습니다. 값 자체는 올바르지만 컬럼 객체는 선언된 타입과 구조적으로 일관되지 않았습니다. #108878 (Groene AI). - 이전의 동일한 작업이 중단되어(예: 롤백된 transaction 또는 크래시) 오래된
tmp_empty_<part>디렉터리가 남아 있는 상태에서MergeTree테이블에 대해DROP/DETACH/MOVE/REPLACE PARTITION을 실행하면, 디버그 및 새니타이저 빌드에서 서버가 중단될 수 있었던LOGICAL_ERROR(New empty part is about to materialize but the directory already exist)를 수정했습니다. 이제는 실패하는 대신 오래된 디렉터리를 회수합니다. #108879 (Groene AI). - ClickHouse Keeper가
Create2응답의Stat에서 잘못된dataLength = 0을 반환하던 문제와, ClickHouse ZooKeeper 클라이언트가Create2응답의Stat를 역직렬화하지 않던 문제를 수정했습니다. #108909 (unintended). clickhouse-local이=바로 옆에 지정된 빈 옵션 값(예:--format_csv_null_representation='')을 거부하던 문제를 수정했습니다. 이제--format_csv_null_representation ""및SET format_csv_null_representation = ''와 동일하게 동작합니다. #108910 (Vismay).- 이름 있는 요소와 이름 없는 요소가 혼합된
Tuple데이터 타입(예:Tuple(a UInt8, UInt16))을 포맷팅할 때, 디버그 및 새니타이저 빌드에서 서버를 중단시키던LOGICAL_ERROR(Inconsistent AST formatting)를 수정했습니다. #108915 (Groene AI). GROUPING SETS,ROLLUP또는CUBE와 함께uniqExactaggregate state를 병합할 때max_threads > 1이면 발생하던 segmentation fault를 수정했습니다. #108928 (Raúl Marín).- 지연 실행 컬럼 복제(
enable_lazy_columns_replication)가 적용된 상태에서, 배치 중간 오류 이후INSERT가 롤백되면(예:Buffer테이블, 비동기 삽입, 또는Kafka/RabbitMQ/FileLog엔진) 잘못된 결과나 범위를 벗어난 읽기가 발생할 수 있었던 문제를 수정했습니다. #108935 (Groene AI). - 이제
join_any_take_last_row가 디스크로 자동 스필을 사용하는 join을 포함해, 지원되는 모든 해시 기반 join 경로에서 적용됩니다. #108936 (János Benjamin Antal). - 분석기에서
JOIN의 한 테이블에 지정한FINAL(예:FROM t1 FINAL JOIN t2)이 다른 조인 테이블에도 잘못 적용되던 버그를 수정했습니다. 이로 인해 이런 쿼리가 더 느려질 수 있었습니다. #108979 (Vladimir Cherkasov). - analyzer가 비활성화된 상태에서, 한 브랜치가 병렬 레플리카와 함께
GROUP BY GROUPING SETS를 사용하고 다른 브랜치가FINAL을 사용하는UNION ALL/INTERSECT/EXCEPT구문에서 발생할 수 있던LOGICAL_ERROR(“Cannot find__grouping_setcolumn in header of MergingAggregatedTransform with grouping sets” 또는 “Chunk info was not set for chunk in MergingAggregatedTransform”)를 수정했습니다. #109003 (Groene AI). automatic_parallel_replicas_mode가 활성화되어 있고parallel_replicas_min_number_of_rows_per_replica가 0보다 큰 경우 자동 병렬 레플리카 계획(planner)에서 발생할 수 있던LOGICAL_ERROR를 수정했습니다. #109011 (Groene AI).MsgPack포맷의 스키마 추론 중 발생하던 과도한 메모리 할당을 수정했습니다. 배열/맵/문자열/바이너리 헤더에 매우 큰 요소 개수가 선언된 손상된 입력이 더 이상 단일 수 GB 규모의 할당을 유발하지 않으며, 잘못된 입력으로 거부됩니다. 이 수정으로 릴리스 빌드에서의 메모리 부족 상태와 새니타이저에서의allocation-size-too-big중단도 해결되었습니다. #109019 (Groene AI).- 서버에서 해석되는
DateTime/DateTime64문자열 리터럴(비동기INSERT,SELECT리터럴)에 대해use_client_time_zone이 무시되던 문제를 수정했습니다. 이제use_client_time_zone이 활성화되면 클라이언트가 로컬 시간대를session_timezone으로 전달하므로, 서버 측 파싱이 동기INSERT경로와 일치합니다. #109051 (Groene AI). query_plan_optimize_lazy_final이 활성화되고WHERE필터가PREWHERE로 부분적으로 푸시다운되는(optimize_move_to_prewhere_if_final을 통해) 경우 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #109073 (Groene AI).b가 다른 테이블의 비복합 컬럼과 같은 이름을 공유하는 테이블(또는 subquery/CTE) 별칭인 쿼리에서b.*와 같은 한정 와일드카드를 사용할 때 발생하던 오류를 수정했습니다. 이제 이러한 쿼리는 더 이상 실패하지 않으며b의 모든 컬럼을 올바르게 선택합니다. #109078 (Vladimir Cherkasov).- 상관 subquery가 join으로 decorrelate되고 소스 relation에 동일한 컬럼명이 두 번 이상 포함된 경우 발생하던
Block structure mismatch in JoinStep논리 오류(debug 및 새니타이저 빌드에서는 서버 중단)를 수정했습니다. 예:WITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM t,correlated_subqueries_default_join_kind = 'right'인 경우입니다. #109114 (Groene AI). - 파일 시스템 캐시를 통해 읽는 쿼리가
KILL QUERY로 취소된 뒤에도 진행 중인 다운로드가 끝나기를 계속 기다리며 멈출 수 있었고, 이런 대기 상태로 인해 갱신이 멈춘 갱신 가능 구체화 뷰를 drop하거나SYSTEM STOP VIEW할 때 작업이 차단되던 문제를 수정했습니다. #109116 (Murphy). - materialized view가 있는 테이블에 삽입할 때
parallel_view_processing설정이 무시되던 문제를 수정했습니다. 25.10부터는 이 설정과 관계없이 뷰가 항상 병렬로 실행되었습니다. #109170 (Antonio Andelic). INSERT컬럼 목록에서t.* LIKE '<pattern>'/t.* ILIKE '<pattern>'형태의 한정된 컬럼 매처는 허용하면서, 정규 형식인t.COLUMNS('<regexp>')는 거부하던 파서의 불일치를 수정했습니다. 이 문제는 쿼리 포맷 왕복을 깨뜨렸고, debug 및 새니타이저 빌드에서는 서버를 중단시켰습니다. #109176 (Groene AI).- 비단조적으로 증가하던
ProfileEvents증가량 문제를 수정했습니다. 소켓 타임아웃 또는 AIO 실패 시NetworkReceiveBytes및AIOWriteBytes카운터가 음수만큼 증가해 매우 큰 값으로 래핑될 수 있었고,MemoryOvercommitWaitTimeMicroseconds는 비단조 시계로 측정되고 있었습니다. #109180 (Azat Khuzhin). Arrow,ArrowStream,Avro형식과 레거시ORC,Parquet리더에서 널 허용 struct 열에 대해Nullable(Tuple)을 반환하던 스키마 추론을 수정했습니다.allow_experimental_nullable_tuple_type가 비활성화되어 있을 때는Nullable(Tuple)유형이 허용되지 않습니다.DESCRIBE는CREATE TABLE이 거부하는 유형을 반환했기 때문에, 추론된 스키마를 사용해 테이블을 생성하거나 데이터를 삽입할 때Nullable Tuple type is not allowed오류로 실패했습니다. #109185 (Nihal Z. Miaji).- 상관된
EXISTS및 스칼라 서브쿼리에서, 상관 관계가 서브쿼리 프로젝션에만 나타나고 비상관WHERE절과 함께 사용될 때 잘못된 결과가 나오던 문제를 수정했습니다. 이 경우 서브쿼리가 모든 행에 대해 false 또는NULL로 평가될 수 있었습니다. #105760을 수정합니다. #109186 (Dmitry Novik). CREATE USER ... HOST LIKE 'a', 'b'(및 동등한ALTER USER)가 첫 번째 패턴만 조용히 유지하던 문제를 수정했습니다. 이제 지정된 모든HOST LIKE패턴이 사용자의 호스트 허용 목록에 저장됩니다. #109187 (Groene AI).- 분석기 사용 시
Distributedengine 테이블을 통해 쿼리한 경우,mapValues(map)또는mapKeys(map)에 정의된 텍스트 인덱스가 조용히 사용되지 않던 문제를 수정했습니다. 이 인덱스는 로컬 테이블과cluster/remote테이블 함수에서는 사용되었지만,Distributedengine 테이블을 통한 쿼리에서는 스킵되었고force_data_skipping_indices가 설정된 경우INDEX_NOT_USED로 실패했습니다. #109188 (Groene AI). Replicated데이터베이스에서 DDL 쿼리를 실행할 때 Keeper의 호스트별finished상태 노드가 이미 정리된 경우, 디버그 및 새니타이저 빌드에서 서버를 중단시킬 수 있었던 잘못된LOGICAL_ERROR(There was an error on <host>: Cannot obtain error message (probably it's a bug))를 수정했습니다. #109192 (Groene AI).- 지수의 크기가
Int32를 오버플로우하는SAMPLE비율(예:SAMPLE 1e-3000000000)이 조용히SAMPLE 1로 처리되던 문제를 수정했습니다. #109197 (Raúl Marín). SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER의 접근 검사에서SYSTEM PREWARM PRIMARY INDEX CACHE대신 잘못하여SYSTEM PREWARM MARK CACHEprivilege를 요구하던 문제를 수정했습니다. #109198 (Raúl Marín).- 사용자 지정
disk설정(SETTINGS disk = disk(...))으로 생성된MergeTree테이블에서ALTER쿼리가 실패하던 문제를 수정했습니다. #63019을 수정합니다. #109199 (Mikhail Artemenko). - 윈도우 컨텍스트(
OVER ())의 집계 함수cramersV,cramersVBiasCorrected,contingency,theilsU상태와 일반 집계를 연쇄된 집합 연산(EXCEPT,INTERSECT) 또는 중첩된UNION ALL로 결합한 뒤, 예를 들어-Mergecombinator를 통해 읽을 때 발생하던 서버 크래시를 수정했습니다. #109200 (Groene AI). - 상수
ON조건이 있는ANY JOIN(예:t1 ANY INNER JOIN t2 ON 1)에서 잘못된 결과가 반환되던 문제를 수정했습니다. 이 쿼리는ANYjoin 결과 대신 전체 카테시안 곱을 반환했습니다. #109207 (Vladimir Cherkasov). optimize_on_insert로 인해 삽입된 block이 비게 될 때(예:SummingMergeTree에서 합계가 0이 되는 행), 중복 제거가 적용된 비동기 삽입에서 발생하던 서버 크래시를 수정했습니다. #109229 (Den Kalantaevskii).SYSTEM DROP REPLICA및SYSTEM DROP DATABASE REPLICA ... FROM ZKPATH가 비어 있거나 루트만 가리키는 ZooKeeper 경로를 파싱 시점에BAD_ARGUMENTS와 함께 거부하고, 보조 Keeper 경로를 이름이 지정된 Keeper로 라우팅하며, Keeper 경로를 정규화해 로컬 자체 보호 검사가 의도한 레플리카를 잘못 대상으로 삼거나 우회되지 않도록 수정했습니다. #109230 (Groene AI).- URL 범위의
<s3>endpoint 블록이 최상위<s3>기본값보다 우선 적용되도록 S3 설정 우선순위를 수정했습니다. #109251 (Bharat Nallan). - 서버가 인라인 데이터를 직접 파싱하는 경우(
send_table_structure_on_insert_with_inline_data = 0)에, 인라인VALUES데이터와 함께 사용하는INSERT INTO TABLE FUNCTION(예:remote또는file)에 컬럼DEFAULT값이 적용되지 않던 버그를 수정했습니다.DEFAULT가 있는 비-Nullable컬럼에 명시적으로 삽입된NULL이 선언된 기본값 대신0이 되던 문제입니다. 이제 일반 테이블INSERT및 HTTP protocol과 동일하게 동작합니다. #109258 (Groene AI). Replicated데이터베이스 내에서s3Cluster(및fileCluster/urlCluster같은 다른 cluster table function)로 수행하는CREATE TABLE ... AS SELECT가NOT_FOUND_COLUMN_IN_BLOCK와 함께 실패하던 문제를 수정했습니다. #109266 (Groene AI).- 데이터 레이크 카탈로그 데이터베이스에서
SHOW TABLES와SELECT ... FROM system.tables가 서로 다른 결과를 반환하던 문제를 수정했습니다. 이제 ClickHouse가 읽을 수 없는 테이블은 두 경우 모두에서 일관되게 숨겨집니다. #109273 (Smita Kulkarni). enable_block_number_column또는enable_block_offset_column설정이 활성화된 상태에서 프로젝션이 있는MergeTree테이블을 머지할 때, 프로젝션 파트에 불필요한_block_number/_block_offset컬럼이 포함되던 버그를 수정했습니다. 이로 인해 머지된 프로젝션 파트가 프로젝션 정의 및 삽입으로 생성된 프로젝션 파트와 더 이상 일치하지 않게 되었고,CHECK TABLE및OPTIMIZE ... DRY RUN에서 이를 손상된 것으로(CORRUPTED_DATA) 보고했습니다. #109284 (Groene AI).- 두 필드
{key, value}를 가진 레코드의 Avroarray를 ClickHouseMap컬럼으로 읽을 수 있도록 했습니다. 이는 Iceberg와 Spark가 문자열이 아닌 키를 가진MAP<K, V>에 대해 생성하는 인코딩입니다(Avro 기본 맵은 문자열 키만 지원함). 이전에는 이러한 파일을Array(Tuple(key, value))로는 읽을 수 있었지만Map(K, V)로는 읽을 수 없었고,Type Map(...) is not compatible with Avro array오류와 함께 실패했습니다. #109289 (Groene AI). - 필수 인덱스 인수가 생략되었을 때
CREATE HYPOTHETICAL INDEX ... TYPE set(및ngrambf_v1/tokenbf_v1)에서 발생하던 server 크래시를 수정했습니다. 이제 이러한 SQL 문은 명확한 오류 메시지와 함께 거부됩니다. #109294 (Groene AI). enforce_keeper_component_trackingserver setting이 활성화된 경우, 메타데이터를 Keeper에 저장하는MergeTree테이블에서KILL MUTATION과 같은 mutation 작업 수행 시LOGICAL_ERROR(Current component is empty)가 발생할 수 있던 문제를 수정했습니다. #109297 (Groene AI).- 약 2262년 이후의
ORCtimestamps를 스케일이 9보다 작은DateTime64컬럼으로 읽을 때 발생하던 문제를 수정했습니다. 기존ORC네이티브 리더는 모든 timestamp를 고정된DateTime64(9)중간 단계로 변환했는데, 이 과정에서 나노초 스케일 기준Int64오버플로우가 발생해 요청한DateTime64스케일(예: Iceberg가 생성하는DateTime64(6))로는 값을 표현할 수 있는 경우에도VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE와 함께 해당 값을 거부했습니다. 이제 timestamps는 요청된 스케일로 직접 읽으며, 대상 스케일로도 값을 담을 수 없는 경우에는date_time_overflow_behavior를 따릅니다. #109302 (Groene AI). - server로 동작하는
clickhouse-local은(SYSTEM START LISTEN HTTP이후) 이제 대화형PrettyCompact기본값 대신clickhouse-server와 동일한TabSeparated기본 출력 형식으로 HTTP 연결을 제공합니다. 이로써clickhouse-connect와 같은 드라이버로 HTTP를 통해clickhouse-local에 연결할 때 발생하던 문제가 해결되었습니다. 대화형 terminal 세션에서는 계속PrettyCompact로 결과를 렌더링합니다. #109362 (Alexey Milovidov). - S3 멀티파트 업로드에서 일시적으로 발생하던
Code: 499 ... InvalidPart(S3_ERROR) 실패를 수정했습니다. MinIO는CompleteMultipartUpload시점에 방금 업로드한 part가 없다고 잠시 보고할 수 있는데, 이제 이 오류도 이미 처리되던NoSuchKey와 마찬가지로s3_max_unexpected_write_error_retries한도 내에서 재시도됩니다. #109364 (Groene AI). - 다른 컬럼에 인라인 alias를 정의하고 참조하는
DEFAULT또는MATERIALIZED표현식이 있을 때ALTER TABLE ... DROP COLUMN에서 발생하던UNKNOWN_IDENTIFIER오류를 수정했습니다. #109374 (Alexey Milovidov). GROUPING SETS,ROLLUP,CUBE에서 발생할 수 있었던, two-level Set을 사용하는uniqExactaggregate states의 병렬 머지 중 data race(및 그에 따른 드문 크래시)를 수정했습니다. #109389 (Groene AI).- 2개 이상의 shard가 있는 cluster에서
Distributed테이블을 읽는CREATE TABLE ... ON CLUSTER ... AS SELECT실행 시 발생하던 오류(NOT_FOUND_COLUMN_IN_BLOCK, 또는 이전 버전에서는std::bad_function_call)를 수정했습니다. #109407 (Alexey Milovidov). TTL ... GROUP BY(롤업)가 있는 테이블의 머지를 수정했습니다. 이미 완전히 집계된 parts가 무기한 반복해서 다시 머지되도록 예약될 수 있었고,MATERIALIZED컬럼이나 활성화된 persistent virtual columns가 있는 테이블도 잘못 처리되던 문제가 있었습니다. 이제 이러한 컬럼은any로 집계됩니다. #105647를 종료합니다. #109410 (Mikhail Artemenko). #109532 (Mikhail Artemenko).- 오른쪽 인수에 일반 배열 컬럼이 있는
IN이 잘못된 결과(항상 false)를 조용히 반환하거나 예외를 발생시키던 문제를 수정하여, 이제x IN arr가has(arr, x)처럼 동작합니다. #109416 (Alexey Milovidov). - 영속적 가상 컬럼
_block_number/_block_offset에 대한 암시적 MinMax 인덱스(add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column로 활성화)가 있는MergeTree테이블에서ALTER TABLE작업(RENAME/ADD/MODIFY COLUMN, 그리고 새로 삽입된 part가 있는 테이블의MATERIALIZE INDEX) 수행 시 발생하던UNKNOWN_IDENTIFIER오류를 수정했습니다. #109428 (Groene AI). #110236 (Groene AI). - 상수가 아닌
Array(LowCardinality(T))인수에 대한arrayFold에서 발생하던LOGICAL_ERROR를 수정했습니다(예:arrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0))). 이 문제는Arguments of 'plus' have incorrect data types오류와 함께 실패했으며(디버그 및 새니타이저 빌드에서는 server가 중단됨), 이제 해결되었습니다. #109462 (Groene AI). ReplicatedMergeTree테이블에서CHECK TABLE수행 중 일시적이고 재시도 가능한 ZooKeeper 오류(예: connection loss)가 발생하면 정상적인 part를 손상된 것으로 보고하던 문제를 수정했습니다. 이제 이러한 오류는 재시도 가능한 쿼리 오류로 표시됩니다. #109465 (Alexey Milovidov).groupArrayLastMerge와largestTriangleThreeBuckets집계 함수에서 발생하던 segfault를 수정했습니다. 이제 집계 함수 상태의 역직렬화를 검증하므로, 손상된 상태로 인해 메모리 범위를 벗어난 접근이 발생하지 않습니다. #109485 (Miсhael Stetsyuk). #109492 (Miсhael Stetsyuk).parallel_hash조인 알고리즘에서 전역max_rows_in_join/max_bytes_in_join제한이 적용되지 않던 문제를 수정했습니다. 이 문제로 인해join_overflow_mode = 'throw'인 쿼리가SET_SIZE_LIMIT_EXCEEDED를 발생시키는 대신 조용히 성공할 수 있었습니다. #109488 (Hechem Selmi).- 값이
Int32에 들어가지 않는BIGINT컬럼으로 파티션된 Paimon table을 읽을 때 발생하던 문제를 수정했습니다. 이러한 파티션 값은 잘려서(예:9223372036854775807이-1로 변환됨) 잘못된 파티션 경로가 생성되었고, 그 결과 파일 시스템 오류로 실패했습니다. #109510 (Groene AI). - equality delete file이 있는 Iceberg table을 읽을 때 발생하던 크래시를 수정했습니다. equality delete file에서는 컬럼이 nullable인데 table schema에서는 non-nullable이거나(또는 그 반대인 경우), delete file에서 읽은 값이 검사되지 않은 캐스트를 통해 다른 타입의 컬럼에 삽입되어(컬럼 타입 혼동) 컬럼이 손상되고 server가 크래시했습니다. #109551 (Miсhael Stetsyuk).
- MySQL
connect_timeout, read 및 write timeout이 적용되지 않던 문제를 수정했습니다. 응답하지 않는 MySQL server에 대한 connection 시도는connect_timeout = 1이어도 2분 넘게 멈출 수 있었는데, 이는 sampling query profiler의 주기적 시그널이 MySQL client의 내부 poll deadline을 계속 재설정했기 때문입니다. #109592 (Shaohua Wang). - 동일한 테이블에 데이터를 삽입한 커밋되지 않은 트랜잭션과 비트랜잭션
TRUNCATE가 동시에 실행될 때 발생할 수 있던LOGICAL_ERROR(creation_csn is not set while removal_csn is set to 1)를 수정했습니다. 이제 이러한TRUNCATE는 아직 커밋되지 않은 트랜잭션이 생성한 파트를 제거하지 않습니다. #109598 (Tuan Pham Anh). - 물리적 널 허용 여부가 요청된 ClickHouse 유형과 다른
Parquet구조체 컬럼을 읽을 때 발생하던TYPE_MISMATCH오류를 수정했습니다. 이제 널 비허용Parquet그룹도Nullable(Tuple(...))로 읽을 수 있으며, 네이티브Parquet리더는 물리적으로 널 허용인 구조체(ParquetOPTIONAL그룹)도Nullable(Tuple(...))로 읽을 수 있습니다. #109615 (Groene AI). #109898 (Groene AI). - 다중 쿼리 스트림에서
INSERT ... VALUES뒤에 후행 SQL 주석(예:VALUES (1) -- comment)이 붙는 경우, 서버 측 인라인 삽입 파싱 경로(send_table_structure_on_insert_with_inline_data = 0)에서 발생하던 무음 데이터 손실을 수정했습니다. 이 후행 주석이 종료;뒤의 행 데이터로 스캔되면서, 스트림에 이어지는 쿼리들이 조용히 건너뛰어지고 있었습니다. #109643 (Groene AI). - 시작 시 오류가 발생한 후 서버 종료 중인 짧은 시점에 쿼리가 도착하면 발생하던 segfault를 수정했습니다. #109675 (Miсhael Stetsyuk).
ALTER TABLE ... APPLY PATCHES로 경량 업데이트를 구체화한 뒤 오래된 스키핑 인덱스(text,bloom_filter등)와 프로젝션이 남아 있던 문제를 수정했습니다. 이전에는 패치로 업데이트된 컬럼에 의존하는 인덱스 및 프로젝션 파일이 그대로 남아 있어, 이를 사용하는 쿼리가 잘못된 결과를 반환할 수 있었습니다(예:hasToken이 업데이트된 행을 놓치거나, 사용이 끝난 패치 파트가 제거된 뒤 프로젝션이 오래된 집계를 반환하는 경우). #109709 (Groene AI).- 쿼리가
name/database컬럼만 읽을 때, 데이터베이스별 권한이 있는 사용자에 대해system.tables가 데이터베이스를 조용히 건너뛰던 문제를 수정했습니다. 26.2에서 도입되었습니다. #109723 (Samay Sharma). output_format_arrow_low_cardinality_as_dictionary = 1일 때LowCardinality(Time)컬럼을Arrow포맷으로 쓰는 과정에서 발생하던LOGICAL_ERROR를 수정했습니다. #109730 (Groene AI).- 객체 스토리지가 continuation token과 함께 빈 listing 페이지를 반환할 때
ObjectStorageQueue/AzureQueue(및azureBlobStorage테이블 함수)가 객체를 조용히 건너뛰던 문제를 수정했습니다. Azure Blob Storage에서는 이런 일이 발생할 수 있으며(예: listing이 내부 파티션 경계를 넘는 경우), 비동기 list iterator가 빈 페이지를 listing의 끝으로 간주해 token을 버리고 있었습니다. 이제 continuation token을 계속 따라갑니다. #109761 (Gal Ben Moshe). - 타임스탬프(
DateTime64) 컬럼으로 파티션된 Iceberg 테이블에서 파티션 프루닝 결과 행이 전혀 반환되지 않던 문제를 수정했습니다. #109764 (Den Kalantaevskii). FixedString인자에 대해conv함수에서 발생하던ILLEGAL_COLUMN예외를 수정했습니다. 이제 이러한 인자는 올바르게String으로 캐스트됩니다. #109670을 닫습니다. #109771 (hp).getClientHTTPHeader함수는 이제 RFC 9110에 따라 헤더 이름을 대소문자를 구분하지 않고(case-insensitive) 처리합니다. 특히authorization헤더는 이제 대소문자와 관계없이 필터링됩니다. #103957을 해결합니다. #109791 (Mikhail f. Shiryaev).max_execution_time(timeout_overflow_mode = 'throw'사용 시)이 간헐적으로 쿼리를 전혀 취소하지 못하던 문제를 수정했습니다. 내부 timeout 감시자가 이미 더 늦은 deadline의 쿼리를 대기 중인 상태에서, 그 이후에 등록된 더 이른 deadline의 쿼리가 완전히 누락되어 시간 제한을 한참 넘겨 실행될 수 있었습니다. #109792 (Shaohua Wang).- gzip으로 압축된 Iceberg 메타데이터 파일의 파일 이름을 수정했습니다. ClickHouse는 이를
v{N}.gzip.metadata.json(HTTPContent-Encoding토큰)으로 기록했지만, Iceberg 사양은gz확장자인v{N}.gz.metadata.json을 기대합니다. 그 결과 Spark와 다른 Hadoop 카탈로그 리더가 ClickHouse가 기록한 메타데이터를 찾지 못할 수 있었습니다. 이제 ClickHouse는v{N}.gz.metadata.json으로 기록하며, 이전 버전과의 호환성을 위해 기존gzip이름도 계속 읽습니다. #109812 (Groene AI). - 빌드 측 join 키가
NULL값을 포함한LowCardinality(Nullable(...))이고 런타임 필터가 블룸 필터로 폴백되는 경우,enable_join_runtime_filters = 1(26.2부터 기본 활성화)인 join에서 발생할 수 있었던NOT_IMPLEMENTED오류(“Method getDataAt is not supported for Nullable(String)“)를 수정했습니다. #109824 (Groene AI). - 외부 데이터베이스 엔진(예:
PostgreSQL)은 더 이상UUID컬럼에 대한 범위 비교(>=,>,<=,<)를 푸시다운하지 않습니다. ClickHouse와 외부 데이터베이스는 UUID를 서로 다르게 정렬하므로, 이를 푸시다운하면 결과에서 행이 조용히 누락되었습니다. 이제 이러한 프레디케이트는 ClickHouse에서 평가됩니다. #109833 (Vismay). - higher-order function이 구체적인 값을 기대하는 위치에 lambda 표현식이 전달될 때 서버가 크래시하던 문제를 수정했습니다(예:
arrayFold(lambda, arr, another_lambda)에서arrayFold의 accumulator). 이제enable_analyzer = 0일 때 이러한 쿼리는 크래시를 일으키는 대신ILLEGAL_TYPE_OF_ARGUMENT로 거부됩니다. #109840 (Groene AI). icebergLocal테이블 함수와IcebergLocalengine이 객체 스토리지 유형을local이 아니라azure로 선언하던 문제를 수정했습니다. 이 문제로 인해SETTINGS disk = '...'를 통해 로컬 디스크와 함께 사용할 때 디스크 유형 검사(Disk type doesn't match)에 실패했습니다. #109872 (Pedro Ferreira).- 동일한 원본 컬럼으로 두 번 이상 파티션된 Iceberg 테이블(예:
PARTITIONED BY (hours(ts), ts))을 읽을 때의 문제를 수정했습니다. 이러한 테이블은 이전에는Cannot add column ...: column with this name already exists (ILLEGAL_COLUMN)오류와 함께 실패했습니다. #109895 (Groene AI). - 최종 마크가 없는 파트(비적응형 세분화 수준,
index_granularity_bytes = 0)에서 역순(DESC) 키 컬럼을 가진 테이블에 대해 프라이머리 키 인덱스가 granule을 잘못 가지치기해 잘못된 쿼리 결과가 발생하던 문제를 수정했습니다. #109901 (Nihal Z. Miaji). - 내부 깊이 제한을 넘는 타입 중첩이 발생할 때
generateRandomStructure가 간헐적으로 두 개의 데이터 타입이 이어 붙은 잘못된 구조 문자열(예:Decimal32(7)IPv4)을 생성해 결과를 파싱할 수 없던 문제를 수정했습니다. #109928 (Groene AI). Array(LowCardinality(Nullable(String)))(이 방식으로 저장된Nested필드 포함)에text인덱스가 생성되어 있고, 인덱싱된 배열에NULL원소가 포함된 경우 발생하던NOT_IMPLEMENTED오류(Method getDataAt is not supported for Nullable(String) in case if value is NULL)를 수정했습니다. 이제 인덱스 생성 중에는Array(Nullable(String))와 동일하게NULL배열 원소를 건너뜁니다. #110055 (Groene AI).LowCardinality(Nullable(...))컬럼에minmax스킵 인덱스가 생성된 경우 잘못된 결과가 반환되던 문제를 수정했습니다. 이전에는 스토리지로 푸시다운된WHERE/PREWHERE/HAVING ... IS NULL프레디케이트가 모든 granule을 제외해, 해당 컬럼에NULL값이 있어도 0개의 행을 반환했습니다. #110061 (Groene AI).distinct_overflow_mode = 'break'를 수정했습니다. 이제DISTINCT는 문서에 설명된 대로 제한값까지 누적된 부분 결과를 반환하고 소스 읽기를 중단합니다. 이전에는max_rows_in_distinct/max_bytes_in_distinct를 초과한 청크가 버려져(결과가 잘리거나 비게 됨), 쿼리가 입력 끝까지 계속 읽으면서 해시 집합에 삽입해 결국MEMORY_LIMIT_EXCEEDED로 이어질 수 있었습니다. #110075 (Sergey Kuznetsov).- 모든 포지션 삭제 파일보다 최신인 비 Parquet 형식의 데이터 파일(예:
ORC)을 포함한 Iceberg 테이블에서OPTIMIZE TABLE수행 시 발생하던 논리 오류ChunkInfoRowNumbers does not exist를 수정했습니다. #110107 (Alexey Milovidov). max_bytes_in_distinct와max_bytes_in_set를 수정했습니다. 문자열 키는 제한 검사에 반영되지 않던 arena에 저장되었기 때문에, 문자열 키에 대한DISTINCT/IN은 전체 키 payload만큼(키 길이에 따라 사실상 제한 없이) 바이트 제한을 초과하는 메모리를 점유할 수 있었습니다. 이제 제한값 계산에 arena도 포함되어 문서와 일치하며, 바이트 제한에 근접한 문자열 키를 사용하는 쿼리는 이전보다 더 일찍(정상적으로) 제한에 걸릴 수 있습니다. #110120 (Sergey Kuznetsov).identity(또는 스칼라 서브쿼리 결과)가 중첩된LowCardinality를 포함한 값을 감싸고, 쿼리에서WITH TOTALS/WITH ROLLUP을 사용하는 경우 발생하던LOGICAL_ERROR(Bad cast from type ColumnLowCardinality to ColumnString)를 수정했습니다. #110138 (Groene AI).- 내부 차원 크기가 0인
Npy파일을 읽을 때 발생하던 문제를 수정했습니다. 이제 구체화된 행 수와 최적화된count결과, 비최적화count결과가 서로 일치합니다. #110146 (Yanjun Qiu). - 여러 키로 그룹화할 때 정렬 순서가 그룹화 키의 접두사에만 해당하는 경우, aggregation in order에서 이차 시간 복잡도로 급증하던 문제(및
max_execution_time에 반응하지 않던 문제)를 수정했습니다. #110159 (Alexey Milovidov). - 상관 서브쿼리를 포함한 필터(예:
exists((SELECT ...)))가convert_query_to_cnf또는optimize_and_compare_chain으로 최적화될 때 발생하던 논리 오류(Unexpected number of columns in result sample block)를 수정했습니다. #110187 (Alexey Milovidov). WHERE조건이나UPDATE할당식의 subquery 내부에서 set operation(UNION/UNION ALL/UNION DISTINCT/EXCEPT/INTERSECT)을 사용하는DELETE또는ALTER UPDATEmutation에서 발생하던 예외(UNION mode UNION_DEFAULT must be normalized)를 수정했습니다. #110196 (Alexey Milovidov).- 동일한 아카이브에서 이전 읽기가 스트림 도중 실패한 후 zip 아카이브를 읽는 과정(예: zip 백업에서
RESTORE수행 중)에서 발생할 수 있었던ReadBuffer is canceled. Can't read from it.logical error(debug/새니타이저 build에서 server 중단)를 수정했습니다. #110197 (Groene AI). x IN (subquery)가 포함된 mutation이 프라이머리 키 분석 중 subquery Set을 빌드할 때 발생하던 server 종료 지연과 응답하지 않는KILL MUTATION문제를 수정했습니다. 이제 Set 빌드가 즉시 취소됩니다. #110198 (Alexey Milovidov).- 이제 Keeper는 다중 노드 구성에서 무한 append-entries 루프에 빠지는 대신 coordination 설정
max_requests_batch_size및max_requests_append_size를0으로 설정하는 것을 거부합니다. #110200 (Alexey Milovidov). - tuple 표현식에
GROUP BY ALL을 적용하고ORDER BY를 함께 사용할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #110206 (Alexey Milovidov). - subcolumn(
Nullable컬럼의x.null또는Array의arr.size0등)을 참조하는CHECK제약 조건이 있는 table에INSERT할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #110208 (Alexey Milovidov). - 기본 sort order에서 인용이 필요한 컬럼(예:
@timestamp)을 참조하는 Iceberg tables를 읽는 문제를 수정했습니다. 이런 table은 생성된 storageORDER BY가 원시 컬럼명으로 만들어져SYNTAX_ERROR와 함께 파싱에 실패했기 때문에 읽을 수 없었습니다. #110233 (Groene AI). DataLakeCatalog(Iceberg/Glue) 데이터베이스의system.tables에서 단일 table의 metadata를 확인할 수 없을 때 전체 쿼리가 중단되거나, 아무 경고 없이 table이 누락되던 문제를 수정했습니다. 이제 이런 table은database_datalake_require_metadata_access와 관계없이, 열린 storage 객체가 필요한 컬럼(engine,total_rows등)에는 기본값/NULL 값을 사용한 채 이름으로 계속 표시됩니다. 손상된 table에 직접 접근하면 여전히 오류가 보고됩니다. #110242 (Groene AI).quantileTDigest계열 aggregate-function state 컬럼이GROUP BY키로 사용되고 여러 스레드에서 동시에 serialize될 때 발생할 수 있던 크래시(heap-buffer-overflow)를 수정했습니다. #110263 (Groene AI).- ADLS Gen2 (DFS) 쓰기를
.blobhost 대신.dfsendpoint host로 라우팅하도록 변경해 Microsoft Fabric / OneLakeDataLakeCatalogtable에 대한INSERT가IncorrectEndpointError(HTTP 400)와 함께 실패하던 문제를 수정했습니다. 참고:remote_url_allow_hosts를 사용할 경우INSERT를 위해.blob(읽기) 및.dfs(쓰기) Fabric host를 모두 허용 목록에 포함해야 합니다. #110290 (Mohammad Lareb Zafar). - 특정 PRQL 쿼리(
SET dialect = 'prql')를 구문 분석할 때 발생하던 server 중단 문제를 수정했습니다.prqlccompiler 내부의 panic 때문에 쿼리 오류로 보고되는 대신 프로세스가 중단되고 있었습니다. #110316 (Groene AI). - 프로젝션의 컬럼 집합이 변경되기 전에 기록된 프로젝션 파트가(예:
ALIAS컬럼의 소스를 구체화하는 방식이 버전 업그레이드 후 달라진 경우, 또는 프로젝션에서 사용하는ALIAS컬럼이ALTER TABLE ... MODIFY COLUMN으로 다른 대상을 가리키도록 변경된 경우) 프로젝션을 통해 읽히거나 머지될 때, 쿼리 결과가 조용히 잘못되던 문제를 수정했습니다. 누락된 컬럼이 실제 데이터 대신 기본값으로 채워지고 있었습니다. 이제 이러한 파트는 base table에서 읽고, 머지 시에는 base data를 기반으로 프로젝션을 다시 빌드합니다. #110328 (Shaohua Wang). - 큰 채우기 범위를 생성할 때(특히
INTERPOLATE사용 시)ORDER BY ... WITH FILL이max_execution_time을 준수하지 않고 취소에도 시간이 오래 걸리던 문제를 수정했습니다. #110332 (Alexey Milovidov). UPDATE ..., DELETE ...와 같은 다중 명령ALTER를 Iceberg table에 실행할 때 발생하던 logical error(debug/새니타이저 build에서의 server 중단)를 수정했습니다. 이제 이러한 뮤테이션은 명확한NOT_IMPLEMENTED오류와 함께 거부됩니다. #110347 (Groene AI).SELECT쿼리가 단순한 table 식별자 바로 뒤에서 끝나는 경우(예:... FROM t COMMENT 'x')COMMENT가 암시적 alias로 잘못 처리되던 parser bug를 수정했습니다. 이 때문에 comment가 view/table에 적용되지 않고, 대신 오해를 부르는 구문 오류가 발생하고 있었습니다. #110372 (Aditya Kumar).- 매우 깊게 중첩된
Array/Tuple/Map/Objectliteral을 복사하거나 파기할 때 발생하던 server crash(네이티브 stack 오버플로우)를 수정했습니다. 예를 들어max_parser_depth를 높인 상태에서 매우 깊게 중첩된 literal이 포함된 쿼리에서 발생할 수 있었습니다. #110393 (Raúl Marín). - 벡터 검색이 예상보다 적은 행을 반환할 수 있던 두 가지 경우를 수정했습니다.
vector_search_index_fetch_multiplier값이 1.0보다 작으면 계산된 fetch 수가 0으로 잘려 빈 결과가 나올 수 있었으며(이제 이러한 값은 거부됨),LIMIT ... WITH TIES쿼리에서는 이제 벡터 검색 최적화를 적용하지 않습니다. 이는 해당 최적화가 검색 범위를 정확히 N개의 후보로 제한해 N번째 행과 동률인 행을 제외했기 때문입니다. #110452 (Tamish Mhatre). #110453 (Tamish Mhatre). - 하위 쿼리에 correlated subquery가 포함되어 있고 인덱스 분석 중 Set이 빌드되는
IN (subquery)에서 발생하던 logical errorExpected CommonSubplanReferenceStep to reference CommonSubplanStep, 오류Subplan cannot be used to build pipeline, 그리고 logical errorTrying to extract chunk from ChunkBuffer before all inputs are finished를 수정했습니다. #110491 (Alexey Milovidov). - 이름이 지정된
WINDOW절 정의 내부에서 쿼리 매개변수 치환이 되지 않던 문제를 수정했습니다. 이전에는 해당 위치의 매개변수가 치환되지 않은 채로 조용히 남아 있었고, 설정되지 않은Identifier매개변수는EXPLAIN SYNTAX중Logical error: '!part.empty()'예외를 유발할 수 있었습니다. #110506 (Alexey Milovidov). - 남아 있는
txn_version.txt.tmp파일로 인해 디스크 수준 metadata가 손상된 경우, 객체 스토리지 디스크의MergeTree테이블에서 server 시작이 실패하던 문제를 수정했습니다. #110519 (Alexey Milovidov). - 백그라운드 캐시 다운로드가 파일 시스템 관련이 아닌 오류로 실패할 때(예: Iceberg table에서
OPTIMIZE실행 중) 빈 고아 캐시 파일이 남으면서 발생할 수 있었던 파일 시스템 캐시의 논리 오류(Expected file ... not to exist)를 수정했습니다. #110549 (Groene AI). Dynamic타입 개수 또는JSON/Object경로 개수가SIZE_MAX에 가까운 손상된Native형식 스트림을 읽을 때 발생하던 문제를 수정했습니다. 이제 이러한 잘못된 입력은 처리되지 않은std::length_error대신 명확한INCORRECT_DATA오류와 함께 거부됩니다. #110590 (Alexey Milovidov).- 아직 동기화 대기열에 들어 있는 상태에서 테이블이 분리되거나(또는 구조가 변경되거나) 할 때 발생할 수 있었던
MaterializedPostgreSQL데이터베이스 엔진의 서버 충돌을 수정했습니다. #110596 (Alexey Milovidov). - 클라이언트의
SET param_<name>(및--param_<name>플래그)가 매개변수 이름이limit,offset,max_threads,log_comment같은 내장 설정 이름과 일치할 때 잘못 동작하던 문제를 수정했습니다. 충돌한 설정에 따라 쿼리가CANNOT_PARSE_QUOTED_STRING으로 실패하거나, 값이 조용히 정규화되거나(예:max_threads=0이auto(N)으로 변경됨), 설정 별칭 이름이 사라질 수 있었습니다. 또한 이러한 매개변수는 같은 세션의 이후 모든SET param_*도 망가뜨렸습니다. #110597 (Raúl Marín). DEFAULT표현식이 있고 part에 구체화되지 않은 컬럼(예:ALTER TABLE ADD COLUMN이후 또는ALTER TABLE MATERIALIZE COLUMN중)의 서브컬럼을 읽을 때 발생하던 문제를 수정했습니다. 이전에는 서브컬럼이 평가된DEFAULT표현식 대신 타입 기본값으로 채워졌고, 이러한QBit컬럼에서 전치 벡터 거리 함수(cosineDistanceTransposed등)를 사용하면SIZES_OF_ARRAYS_DONT_MATCH오류가 발생했습니다. 이 변경으로 #110634가 해결됩니다. #110636 (Alexey Milovidov).non_replicated_deduplication_window가 활성화된 파티션된MergeTree테이블에INSERT할 때, 비동기 삽입 배치가 부분적으로만 중복 제거된 경우(insert_deduplication_token값 일부는 중복이고 일부는 신규인 경우) 발생할 수 있었던LOGICAL_ERRORInvalid partition key size: 0을 수정했습니다. #110651 (Groene AI).- 이제 백그라운드 비동기 삽입 플러시는
KILL QUERY로 종료하면 즉시 중단됩니다. 이전에는 큰 버퍼링 페이로드를 플러시할 때 끝까지 계속 파싱하면서 취소를 무시했습니다. #110652 (Shaohua Wang). partial_mergeJOIN 위에 배치된optimize_aggregation_in_order가 있는GROUP BY및optimize_distinct_in_order가 있는DISTINCT에서 잘못된 결과가 나오던 문제를 수정했습니다. 읽기 순서 최적화가 partial-merge join을 통해 전파되었지만, partial-merge join은 왼쪽 입력을 조인 키 기준으로 다시 정렬하므로 왼쪽 스트림의 원래 순서를 보존하지 않습니다. 이 때문에 행이 잘못 그룹화되었습니다. #110671 (Groene AI).Date/Date32/DateTime64값에서 극단적인MONTH,WEEK, 또는DAY인터벌 개수와 함께toStartOfInterval을 사용할 때 발생하던 부호 있는 정수 오버플로우를 수정했습니다. #110688 (Groene AI).- 병렬 레플리카가
custom_key_sampling/custom_key_range모드로 실행될 때,FROM에 서브쿼리가 있는 쿼리에서 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. 이러한 쿼리(예:SELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k)는 이전에는Not found column __table2.id in block ...오류와 함께 실패했습니다. #110690 (Groene AI). - 앞에 공백이 있는 WKT 문자열(예:
readWKT(' POINT(1 2)'))을readWKT가 거부하던 문제를 수정했습니다. 이러한 문자열은 타입이 지정된readWKTPoint/readWKTPolygon/… 리더와 WKT 문법에서는 허용됩니다. #110706 (Groene AI). Distributed테이블 위의Merge테이블에 대한 쿼리에서 동일한 텍스트 인덱스 프레디케이트가PREWHERE와WHERE양쪽에 사용될 때 발생하던 논리 오류(Column ... already added for reading, debug/새니타이저 빌드에서 서버 중단)를 수정했습니다. #110710 (Groene AI).- 병렬 레플리카가 활성화된 경우, 스칼라 서브쿼리 또는 상수 기준 벡터와 함께 호출되는
QBit컬럼용 전치 거리 함수(예:cosineDistanceTransposed)에서 발생하던NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. 이 변경으로 #110719가 해결됩니다. #110729 (Alexey Milovidov). - 두 개의 파티션 작업(예: 두 개의
MOVE PARTITION/REPLACE PARTITION쿼리 또는 backgroundDROP_RANGE와 경합하는 하나의 작업)이 겹치는 범위에 대한 background 파트 검사를 동시에 취소할 때,ReplicatedMergeTree에서 드물게 발생하던LOGICAL_ERROR(Unexpected number of parts to remove from parts_queue; debug/새니타이저 빌드에서 서버 중단)를 수정했습니다. #110738 (Groene AI). Quantized(...)codec이 적용된 컬럼이 다른 serialization 안에 감싸져 있을 때 발생할 수 있던Hash is not set for serialization논리 오류를 수정했습니다. 예를 들어, 동일한 이름의 컬럼이 서로 다른 유형을 갖는 소스들 위의Merge테이블에서(Variant로 머지됨) 이 문제가 발생할 수 있었습니다. #110776 (Groene AI).median/quantile집계 함수 상태에 매우 큰 정수 상수(예:medianState(x) * 18446744073709551615)를 곱할 때 발생하던 서버 멈춤 문제를 수정했습니다. 해당 쿼리는 취소에 응답하지 않게 되어 무기한 실행될 수 있었습니다. #110779 (Groene AI).- 길이가 0인 인터벌을 가진 쿼터(예:
CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000)가 소모될 때 발생하던 서버 크래시(정수 0으로 나누기)를 수정했습니다. 이제 0 이하의 쿼터 인터벌 기간은 쿼터 생성 시 거부됩니다. #110846 (Pedro Ferreira). col이LowCardinality일 때throwIf(notLike(col, pattern))(및 함수에 적용된 다른throwIf)가 무조건 예외를 발생시키던 문제를 수정했습니다. 기본LowCardinality구현은 전체 딕셔너리에 대해throwIf를 실행했는데, 이 딕셔너리에는 어떤 행도 참조하지 않더라도 예약된 기본값이 항상 포함됩니다. 따라서 사용되지 않는 해당 슬롯에 0이 아닌 값이 있으면, 조건을 만족하지 않는 데이터에 대해서도throwIf가 예외를 발생시켰습니다. #110864 (Groene AI).- interserver secret로 보호되는 클러스터에서 병렬 복제본(parallel-replica) 및
Distributed읽기 시 쿼리의 활성 역할(SET ROLE또는role매개변수)을 원격 노드로 전파하도록 수정했습니다. 이전에는 원격 노드가 사용자의 기본 역할로 되돌아가면서 행 수준 정책을 시작 노드와 일관되지 않게 평가했습니다. #110867 (Nikolay Degterinsky). - 초기 schema에 중첩 field(
Tuple/Array/Map)가 포함된 경우ALTER TABLE ... ADD COLUMN이후 Iceberg tables에서 중복 field ID가 생성되던 문제를 수정했습니다. 이제last-column-id는 중첩된 하위 field를 포함해 할당된 최대 field ID를 기록하므로, 이후 추가된 컬럼이 더 이상 중첩 field ID를 재사용하지 않으며 읽기 시ICEBERG_SPECIFICATION_VIOLATION(Duplicate field id)으로 실패하지 않습니다. #110884 (Groene AI). - Ed25519 SSH key(
CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519'또는users.xml의 해당 key)를 사용할 때 FIPS builds에서 발생하던 크래시를 수정했습니다. Ed25519는 FIPS 승인을 받은 방식이 아니므로, 이제 이러한 key는 명확한LIBSSH_ERROR오류와 함께 거부됩니다. #110891 (Konstantin Bogdanov). QBit컬럼에 대한 전치 거리 함수(cosineDistanceTransposed,L2DistanceTransposed,dotProductTransposed)의 저정밀도 결과를 수정했습니다.precision비트 평면으로 잘린 값은 제거된 비트를 0으로 채워 복원되고 있었는데, 이로 인해 복원된 모든 값이 0 쪽으로 바이어스되었고 낮은 정밀도에서는 퇴화 현상까지 발생했습니다. 예를 들어QBit(BFloat16)에서 정밀도가 1이면 부호 비트만 남아 모든 값이±0.0으로 복원되므로, 모든 행의 거리가 동일한 상수가 되어 순위 정보를 전혀 제공하지 못했습니다. 이제 잘린 값은 남아 있는 정밀도 cell의 제한된 중간점으로 복원됩니다(rawInt8코드는 해당 cell의 중심으로 복원되며, 정확한 0과 무한대는 유지됨). 따라서 더 낮은precision은 정확도를 속도와 맞바꾸되, 결과가 과도하게 바이어스되지는 않습니다. full-precision 결과는 변경되지 않습니다. 이로써 #110898가 해결되었습니다. #110911 (Alexey Milovidov).- 임시 테이블도 사용하는 세션에서 Iceberg tables를 쿼리한 뒤 정상 종료(graceful shutdown) 과정 중 발생하던 server 크래시(use-after-free)를 수정했습니다. #110914 (Miсhael Stetsyuk).
- 이전(version 0) state 포맷으로 serialize된
Bool값을 가진sumMap/sumMapWithOverflow/sumMapFilteredaggregate states를 병합할 때 발생하던LOGICAL_ERROR: Cannot sum Bools(debug/sanitizer builds에서의 server 중단)를 수정했습니다. 동일한 수정으로 version-0Boolstates에서 조용히 잘못된 결과가 나오던 두 가지 경우도 바로잡았습니다. 즉,Bool타입의 맵 key가 states 간에 deduplicate되지 않던 문제와, 0값 compaction이 잘못된 항목을 삭제하던 문제입니다. #110922 (Groene AI). -Tuplecombinator가 적용된 aggregate function을RESPECT NULLS와 함께 사용하고 중간 state(-State, 분산 집계,WITH ROLLUP/WITH CUBE)를 생성할 때 발생하던 크래시를 수정했습니다. 결합된 함수가 잘못된 state variant의 이름을 따르고 있었기 때문에, serialize된AggregateFunction타입이 round-trip 시 호환되지 않는 메모리 레이아웃으로 다시 해석되고 있었습니다. #110930 (Groene AI).- schema evolution으로 이름이 변경된 Iceberg 컬럼에 대해
PREWHERE(및 행 수준 정책)가 이전 data files에서 조용히0개의 행을 반환하던 문제를 수정했습니다. 이제 이러한 쿼리는WHERE와 일치하는 올바른 행을 반환합니다. #110941 (Groene AI). - 여러 거리값이 동일한 경우, lazy materialization과 함께
vector_search_with_rescoring = 1을 사용하는 벡터 검색 쿼리에서 발생할 수 있던LOGICAL_ERROR(LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M)를 수정했습니다. #111003 (Groene AI). - Apache Arrow Java < 19.0.0(Apache Spark에 번들됨)에서 생성된, 비어 있는 중첩
Array/Map컬럼이 포함된Arrow/ArrowStream데이터 읽기 문제를 수정했습니다. 이전에는 offsets 버퍼가 너무 작다는INCORRECT_DATA오류로 거부되었습니다. #111101 (Raúl Marín). - 페이지 캐시가 활성화된
plain_rewritable디스크에서 오래된 읽기 문제를 수정했습니다. #111105 (Mikhail Artemenko). - 분산 쿼리 및 병렬 레플리카를 사용하는 쿼리에서
Variant유형(Geometry포함) 상수에 대해 발생하던CANNOT_CONVERT_TYPE오류를 수정했습니다. #111136 (Nikita Fomichev). - 단일 read request가
hdfsPread의 32비트 크기 제한(INT_MAX)을 초과할 때, HDFS에서 큰 파일을 읽는 작업이 실패하거나 잘못 읽히던 버그를 수정했습니다. #98470 (Arup Chauhan). - 빈 needle을 사용한 동등 비교에서 text index가 잘못 사용되던 문제를 수정했습니다. #108340 (Robert Schulze).
- 예약된 머지를 가득 찬 background pool에 배치할 수 없을 때,
Manual머지 선택기와 함께SYSTEM SYNC MERGES에서 발생하던 멈춤 현상을 수정했습니다. #108770 (Alexey Milovidov). - 오래된
txn_version.txt.tmp파일이 data part에 남아 있을 때ATTACH TABLE ... AS REPLICATED가 커밋된 데이터를 버리고 mutation 이전의 행을 되살리던 문제를 수정했습니다. #108772 (Alexey Milovidov). - 이동된 파트의 commit과 블록 번호 할당이 동일한 잠금 아래에서 처리되지 않아, non-replicated
MergeTree테이블에서ALTER TABLE ... MOVE PARTITION TO TABLE실행 시 서로 겹치는 data parts가 생성될 수 있던 race condition을 수정했습니다. #108922 (Mikhail Artemenko). - Databricks UniForm이 manifest files에 퇴화된 placeholder 스키마(빈 필드 목록 포함)를 기록하는 경우, 해당 방식으로 작성된
Iceberg테이블을 읽지 못하던 문제를 수정했습니다. #108945 (Konstantin Vedernikov). - 파티션되지 않은
Hive테이블을 여러 스레드로 읽을 때 발생하던 use-after-free 문제를 수정했습니다. #109164 (Alexey Milovidov). logger.startup_console_log_level이 설정된 경우, server 시작 후 console 로그 레벨이 원래대로 복원되지 않던 문제를 수정했습니다. 잘못된 구성 키에서 레벨을 읽어 오고 있었기 때문에, console이 server의 전체 lifetime 동안 높아진 시작 레벨에 머물렀습니다. #103472를 종료합니다. #109858 (Garrett Thomas).plain_rewritable디스크 metadata 트랜잭션에서 snapshot isolation 이상 현상을 수정했습니다. #92055를 수정합니다. #110948 (Mikhail Artemenko).- 호스트가 명시적인
--host인수로 전달되지 않았을 때, 예를 들어--connection, 설정 파일 또는CLICKHOUSE_HOST환경 변수에서 호스트를 가져오는 경우clickhouse-client --login에서 발생하던 abort(front() called on an empty vector)를 수정했습니다. #103603을 닫습니다. #110279 (Christoph Wurm). - 람다 인수가 이름에 점이 포함된 백틱으로 감싼 식별자(예:
__table1.)일 때 발생하던 논리 오류(!part.empty())를 수정했습니다. 이전에는 이런 쿼리가 릴리스 빌드에서는 처리된 예외를 발생시키고, 오류 메시지를 포맷하는 동안 디버그 및 새니타이저 빌드에서는 서버를 중단시켰습니다. #108735 (Groene AI). - 표현식에서
INoperator를 사용하는ALIAS컬럼(다른ALIAS컬럼을 통해 간접적으로 사용하는 경우 포함)이 있는 테이블에서ALTER TABLE ... DROP COLUMN,ALTER TABLE ... DELETE/UPDATE뮤테이션, 그리고 lightweightDELETE FROM실행 시 발생하던LOGICAL_ERROR(No set is registered for key)를 수정했습니다. #111039 (Pedro Ferreira). - async inserts 및 중복 제거(
async_insert=1,async_insert_deduplicate=1)와 함께 발생하던 무증상 데이터 손실을 수정했습니다. 서로 다른insert_deduplication_token값을 가진 여러 비동기 삽입 항목이 서로 다른 파티션에 기록되는 하나의 플러시로 합쳐질 때, 각 토큰이 해당 토큰의 행이 실제로 기록된 파티션뿐 아니라 플러시가 기록한 모든 파티션의 중복 제거 로그에 등록되고 있었습니다. 그 결과, 이후 그 토큰 중 하나를 재사용한 삽입이 한 번도 기록된 적 없는 파티션에서도 조용히 중복으로 처리되어 제거될 수 있었습니다. 이제 토큰은 해당 행이 실제로 기록된 파티션에만 등록됩니다. #111031을 닫습니다. #111049 (Groene AI). - experimental setting
make_distributed_plan = 1을 사용할 때Distributed테이블 또는 뷰 위의Merge테이블을 쿼리하면 발생하던LOGICAL_ERROR예외(ScatterExchangeStep should have one source shard, got 8)와 중복 행 문제를 수정했습니다. #107946을 닫습니다. #108401 (Groene AI). Nullable(Tuple(...))컬럼을 여러 개의 개별 컬럼으로 평탄화하지 않고 하나의CSV필드로 serialize하도록 수정했습니다. 이전에는 널이 아닌 값은 여러CSV필드로 기록되고NULL은 단일\N으로 기록되어, 행마다 컬럼 수가 달라졌고 이로 인해CSVWithNames/CSVWithNamesAndTypes헤더와 round-trip이 깨졌습니다. #108959 (Groene AI).- 포맷 수준 키 조건이
Parquet파일에서 읽지 않는 컬럼을 참조할 때Parquetv3 리더에서 발생하던 논리 오류(KeyCondition uses PREWHERE output)를 수정했습니다. #109267 (Groene AI). serialize_query_plan = 1에서FINAL또는SAMPLE을 사용하는 테이블 함수 읽기의 잘못된 결과를 수정했습니다. 또한 서로 다른 테이블 함수가 더 이상 같은 사전 할당 항목을 공유하지 않도록, 테이블 함수의 집계 해시 테이블 통계 캐시 키도 수정했습니다. #109847 (Azat Khuzhin).- 최종화 전에 실패한
BACKUP ... TO Memory(...)의 정리(cleanup)를 수정했습니다. 이전에는 실패한 백업이 등록된 상태로 남아 있어 같은 이름을 다시 사용할 수 없었습니다. #109947 (Julia Kartseva). WITH FILL STEP및add*/subtract*날짜/시간 인터벌 함수의 극단적인 인터벌 산술 문제를 수정했습니다. 이제 범위를 벗어나는 델타는 더 이상 부호 있는 오버플로우에 의존하지 않으며,YEAR간격이 매우 큰WITH FILL도 달력을 거꾸로 계산하다가 멈추지 않습니다. #110158 (Groene AI).- Azure 서비스에서 발생하던
411 Length Required오류를 수정했습니다. 이제 Poco 기반 Azure HTTP 전송은 Azure Key Vault처럼 자체적으로Content-Length를 설정하지 않는 SDK 클라이언트에 대해 request body에서Content-Length를 설정합니다. #110299 (Konstantin Bogdanov). - 지연 실행
FINAL최적화 (query_plan_optimize_lazy_final, 기본적으로 비활성화됨)는 쿼리가 sorting-key 순서로 읽히는 경우 더 이상 적용되지 않습니다. 대체 계획이 그 순서를 보존하지 않아 결과가 잘못된 순서로 반환될 수 있기 때문입니다. 또한 읽어야 할 행 수보다 작은LIMIT가 읽기 단계에 직접 적용되는 경우에도 더 이상 적용되지 않습니다. 이 경우 필수적인 set 구성 패스 때문에 조기 종료의 이점이 사라집니다. #110576 (Nikolai Kochetov). POINT EMPTY에 대해readWKT및readWKTPoint가 초기화되지 않은 좌표(스칼라) 또는 이전 행의 오래된 좌표(벡터화)를 반환하던 문제를 수정했습니다. 이제POINT EMPTY는CANNOT_PARSE_TEXT와 함께 거부됩니다. ClickHousePoint는 빈 값을 표현할 수 없는 고정Tuple(Float64, Float64)이기 때문입니다. #110692 (Groene AI).- 해시 조인에서 오른쪽 컬럼을 materializing할 때 시간대가 잘못 처리되던 문제를 수정했습니다. #111033을 종료합니다. #111074 (Yarik Briukhovetskyi).
String(또는 더 좁은FixedString) 키 또는 minmax 스킵 인덱스를 더 넓은FixedString상수와 비교하는 조건으로 필터링할 때, 예를 들어toFixedString('abc', 257) = string_col같은 경우 잘못된count()결과가 나오고 행이 누락되던 문제를 수정했습니다. 프라이머리 키 및 minmax 프루닝이 NUL로 패딩된 상수로 범위를 구성하면서 일치하는 그래뉼을 잘못 건너뛰고 있었습니다. #111106 (Groene AI).- 비동기
Native포맷 삽입을 수정하여,ALTER ... MODIFY COLUMN이후 호환되지 않게 된 버퍼링된 엔트리 하나 때문에 전체 배치가 실패하지 않도록 했습니다. #111064을 종료합니다. #111108 (Mikhail f. Shiryaev). - 다른 종류의 객체로 딕셔너리에
CREATE OR REPLACE를 수행할 때 발생하던 문제를 수정했습니다. 대체가 이미 committed된 뒤CANNOT_DETACH_DICTIONARY_AS_TABLE로 실패하면서_tmp_replace_*고아 테이블이 남고 있었습니다. #111142 (Nikolay Degterinsky). - 오른쪽 컬럼에 대한
WHEREfilter로 인해 쿼리 플래너가 조인을SEMI또는ANTI로 재작성할 수 있을 때,Joinengine 테이블에 대한ANYjoin에서 발생하던INCOMPATIBLE_TYPE_OF_JOIN를 수정했습니다.Joinengine 테이블은 변경할 수 없는 고정된 선언 엄격성을 가지므로, 이제 이런 테이블에 대해서는 해당 변환을 수행하지 않습니다. #111362 (Groene AI). - 입력 데이터가 0개의 행으로 parse될 때(예: 빈 JSON document 또는 피처가 없는 GeoJSON
FeatureCollection)format테이블 함수가 컬럼을 전혀 반환하지 않던 문제를 수정했습니다. 이제NOT_FOUND_COLUMN_IN_BLOCK를 발생시키는 대신 올바른 컬럼을 가진 빈 결과를 반환합니다. #111390을 종료합니다. #111428 (Groene AI).
빌드/테스트/패키징 개선
- 새니타이저 빌드는 이제 새니타이저 보고서를 전역 버퍼
sanitizer_report에 저장하므로, 코어 덤프 분석기가 코어 덤프에서 이를 읽을 수 있습니다. #109333 (Miсhael Stetsyuk). - vendored 바이너리를 사용하는 대신
musl을 소스에서 직접 빌드합니다. #97452 (Konstantin Bogdanov). - LLVM-libc의 SIMD
memcmp/memcpy/memmove/memset/bcmp/memmem구현을 사용합니다. #107566 (Konstantin Bogdanov). AVX-512를 지원하는 머신의-O0디버그 빌드(-DDEBUG_O_LEVEL=0)에서 발생하던memmove의 무음 손상 문제를 수정했습니다. #110904 (Konstantin Bogdanov). - 코드베이스와 번들된 타사 라이브러리 전반에서
curl라이브러리 사용을 제거했습니다. #108296 (Konstantin Bogdanov). mariadb-connector-c를 3.4.9로 업데이트했습니다. #108328 (Konstantin Bogdanov).libssh를 0.12.0으로 업데이트했습니다. #108329 (Konstantin Bogdanov).- macOS에서 transaction
COMMIT시 발생하던 멈춤 문제를 수정했습니다. #108375 (Raúl Marín). - 객체 파일의 DWARF 디버그 섹션을 압축(
-gz)하는COMPRESS_DEBUG_SECTIONSCMake 옵션을 추가했습니다. 이 옵션은 compiler가 지원하는 환경에서 자동으로 활성화되어 Debug 빌드 디렉터리 크기를 줄여 줍니다. 최종 바이너리는 압축되지 않은 상태로 유지되므로 런타임 스택 트레이스 심볼화에는 영향이 없습니다. #109306 (Murphy). 이제 번들된 LLVM 툴체인이 zlib과 함께 빌드되므로 clang이-gz=zlib를 지원하며, 누락되어 있던clang++-21심볼릭 링크도 추가했습니다. #109596 (Murphy). - 이제 Debug 빌드는 vendored Rust 크레이트를 축소된 디버그 정보(
debug = 1, cargo’slimited수준)와 incremental 캐시 없이(REDUCE_RUST_DEBUG_INFO, 기본 활성화) 컴파일하므로, Rust 빌드 아티팩트 크기를 줄이고(클린 빌드 기준 약 12 → 약 7 GB) 재빌드 과정에서 cargo 캐시가 무제한으로 커지는 문제를 방지합니다. 전체 DWARF와 incremental 컴파일을 복원하려면-DREDUCE_RUST_DEBUG_INFO=OFF로 설정하십시오. #109471 (Murphy). - macOS에서 streaming 분산 쿼리 exchange와
STREAM읽기를 지원합니다. #109769 (Raúl Marín). libarchive를 3.8.7에서 3.8.8로 올렸습니다. #109874 (Robert Schulze).c-ares를 1.34.6에서 1.34.8로 올렸습니다. #109905 (Robert Schulze).- CVE-2026-40355 및 CVE-2026-40356 수정이 포함되도록
krb5를 업데이트했습니다. #109910 (Robert Schulze). libpng타사 의존성을 제거했습니다. 이제FORMAT PNG는 기존 대신 번들된 zlib를 기반으로 하는 작은 내장 PNG 인코더를 사용합니다. #110051 (Alexey Milovidov).- jemalloc malloc zone을 래핑하여
operator new를 거치지 않는 raw C allocation도 macOS의 memory tracker에서 추적하도록 했으므로, 이들에도 메모리 제한이 적용됩니다. #110370 (Raúl Marín). clickhouse-server및clickhouse-keeper용-distrolessDocker 이미지는 이제 셸이 없는 production stage에서 빌드됩니다. 이전에는 debug stage에서 빌드되어/busybox/sh를 포함했습니다. #105677를 해결했습니다. #105678 (ashishch432).abseil-cpp를 LTS20260526.0으로 업데이트했습니다. #108991 (Konstantin Bogdanov).
하위 호환되지 않는 변경 사항
- 이번 변경으로
allow_experimental_query_deduplication기능이 제거되었습니다. 이 기능은 오랫동안 Experimental 상태였고, 테스트도 없으며 앞으로도 지원할 계획이 없습니다(초기 테스트는 불안정하여 #49579에서 제거되었습니다). #99398 (Igor Nikonov). - XRay 기반
SYSTEM INSTRUMENT기능은 이제parameters대신arguments를 사용합니다.system.instrumentation.parameters컬럼 이름이arguments로 변경되었고,SYSTEM INSTRUMENT ADD ... HANDLER PARAMETERS ...구문도SYSTEM INSTRUMENT ADD ... HANDLER ARGUMENTS ...로 변경되었습니다. 기존 컬럼명이나 구문을 사용하는 쿼리 또는 자동화는 새 이름을 사용하도록 업데이트해야 하며, 이전 이름은 더 이상 지원되지 않습니다. #103854 (Pablo Marcos). - 설정
show_data_lake_catalogs_in_system_tables는show_remote_databases_in_system_tables로 이름이 바뀌었고 적용 범위도 확장되었습니다. 값이 0(기본값)일 때는 데이터 레이크 카탈로그뿐 아니라MySQL및PostgreSQL데이터베이스도system.tables,system.columns,system.completions에서 숨겨집니다. 이전 설정 이름은 별칭으로 유지됩니다. #104416 (Pablo Marcos). - 기본 x86 build는 이제 x86-64-v2(SSE4.2) 대신 x86-64-v3(AVX2)를 대상으로 합니다. 이를 사용하려면 AVX2를 지원하는 CPU(Intel Haswell 이상, AMD Excavator 이상)가 필요합니다. CPU가 AVX2를 지원하지 않으면 일반 x86-64를 대상으로 하는
amd64compatbuild를 사용하십시오. #105019 (Raúl Marín). - 이제
min/maxaggregate와minmaxindexes에서 중첩된Dynamic/Variant를 거부합니다. 이전에는 최상위 수준의Dynamic/Variant만 검사했습니다. #104747을 해결합니다. #105468 (Pavel Kruglov). icebergHash와icebergBucket은 이제Int128,UInt128,Int256,UInt256,Decimal256인수를 명시적인 오류와 함께 거부합니다. 이전에는 더 넓은 값을 조용히 잘라내 충돌하는 해시를 생성했습니다. Iceberg spec은 32/64비트 정수와 precision이 최대 38인 Decimal에 대해서만 해싱을 정의하므로, 범위에 맞는 값에 대해 기존 동작을 유지하려면Int64또는Decimal128로 캐스팅하십시오. #105866 (Raúl Marín).- CLI에 쿼리 에코 동작을 세밀하게 제어하는 기능이 추가되었습니다.
--echo옵션은 이제 선택적 Boolean 값을 받을 수 있으며 interactive와 batch mode 모두에서 동작합니다. 새 옵션--echo-formatted와--echo-query-id는 각각 에코된 쿼리에 포맷을 적용할지 여부와query_id를 출력할지 여부를 제어합니다.--hilite/--highlight옵션은 이제 에코된 쿼리의 하이라이트도 제어합니다. 이에 따른 부수 효과로--echo는 이제 Boolean 값 옵션이 되었으므로, 값 없이 단독으로 사용한--echo바로 뒤에 오는 위치 인수 쿼리는 해당 옵션의 값으로 처리됩니다. 이 경우--echo --query "..."또는--echo=false를 사용하십시오. #106191 (Alexey Milovidov). - Experimental KQL(Kusto) 함수
array_sort_asc와array_sort_desc, 그리고 해당 SQL backend인kql_array_sort_asc와kql_array_sort_desc가 제거되었습니다. 이 함수들은 Experimental 상태였고 구현 품질이 낮았으며, 정확성 문제와 parser 버그의 원인이었습니다. 이제 이러한 이름을 사용하는 쿼리는UNKNOWN_FUNCTION을 반환합니다. #108101 (Groene AI). ALTER TABLE ... REPLACE PARTITION ... FROM ...은 이제 원본 테이블에 요청한 파티션의 파트가 없을 때 대상 파티션의 데이터를 더 이상 조용히 삭제하지 않습니다. 이전에는 이런 요청이 대상 파티션을 삭제한 뒤 그 자리에 아무 데이터도 쓰지 않았는데, 이는 데이터 손실로 이어지기 쉬운 위험한 동작이었습니다. 이제는 기본적으로BAD_ARGUMENTS오류와 함께 거부됩니다. 이전의 조용한 초기화 동작을 복원하려면 새로운 설정allow_replace_partition_from_empty_source = 1을 설정하거나compatibility를26.5이하로 설정하십시오. 대상 데이터를 명시적으로 삭제하려면ALTER TABLE ... DROP PARTITION을 사용하십시오. #104939 (Groene AI).- 서버 설정
insert_deduplication_version의 기본값이compatible_double_hashes에서new_unified_hash로 변경됩니다. 이제 삽입 중복 제거는 파트/파티션 단위가 아니라 삽입된 블록 전체(삽입 1회 기준)에 대해 동작합니다. 즉, 동일한 삽입을 재시도하는 경우에는 여전히 중복 제거되지만, 동일한 파트를 생성하는 서로 다른 두 삽입 사이에서는 더 이상 중복 제거되지 않으며, 같은 행이라도 순서만 바꿔 삽입한 경우에는 더 이상 중복 제거되지 않습니다. 이전 동작을 복원하려면insert_deduplication_version = compatible_double_hashes를 설정하십시오. 기본값이old_separate_hashes였던 release에서 직접 업그레이드하는 instance는new_unified_hash를 사용하기 전에, 관련된 가장 긴 중복 제거 윈도우가 경과할 때까지 먼저compatible_double_hashes로 실행해야 합니다. #107886 (Sema Checherinda).
새로운 기능
- 일련의 스냅샷 읽기(snapshot reads)를 통해 구현된
MergeTree테이블 대상 연속 쿼리 지원이 추가되었습니다. 이는 Streaming Queries에 대한 일반 지원을 위한 첫 단계입니다. #105114 (Mikhail Artemenko). - 가상(what-if) 스킵 인덱스가 추가되었습니다.
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...를 사용해 세션 범위의 가상 스킵 인덱스를 정의한 다음,EXPLAIN WHATIF SELECT ...를 사용하면 이를 구체화하지 않고도 스킵 비율과 비용을 추정할 수 있습니다. 정의된 인덱스는 새로운system.hypothetical_indexes테이블에서 확인할 수 있습니다. #104608 (Yarik Briukhovetskyi). - 테이블, materialized view, 갱신 가능 구체화 뷰, Dictionaries, 분산 테이블, 뷰 간의 의존성 그래프를 시각화하는 내장
/schema웹 UI가clickhouse-server에 추가되었습니다. #105276 (Nikita Mikhaylov). PNG출력 형식 지원이 추가되어 쿼리 결과를 PNG 이미지로 직접 렌더링할 수 있습니다. #74691 (Maksim Dergousov).- 환경 변수를 기반으로
clickhouse-client또는clickhouse-local을 호출한 AI 코딩 agent(Claude Code, Cursor, Codex, Gemini CLI, Goose 등)를 감지하는 기능이 추가되었습니다. 감지된 agent는system.query_log,system.query_thread_log,system.processes의 새client_agent컬럼에 기록됩니다. #106619 (Alexey Milovidov). - 시스템의 공통 구성 요소(functions, table engines, data types, settings, formats 등)에 대한 내장 참조 문서를 단일 테이블에 수집하고, 해당 문서를 Markdown으로 렌더링하는 새로운 system table
system.documentation이 추가되었습니다. #107463 (Alexey Milovidov). - GeoJSON
FeatureCollection문서를 읽기 위한GeoJSON입력 형식이 추가되었습니다. 이 형식은 feature마다 1개의 행을 생성하며,id(String),geometry(Geometry),properties(Nullable(JSON)) 컬럼을 만듭니다.Point,LineString,MultiLineString,Polygon,MultiPolygongeometry는 ClickHouse의 네이티브Geometry유형으로 읽어들입니다.Geometry유형으로 표현할 수 없는GeometryCollection및MultiPoint는 기본적으로 예외를 발생시키며,input_format_geojson_unsupported_geometry_handling설정을 통해NULL로 저장할 수도 있습니다. #91533에 기여합니다. #98124 (Mark Needham). - SQL에서 Mapbox Vector Tiles를 직접 제공하기 위한 함수가 추가되었습니다.
MVTEncodeGeom은 geometry를 slippy-map 타일의 픽셀 공간으로 투영한 뒤 클리핑하고,MVTEncode는 그룹의 투영된 geometry를 단일 레이어 타일의 바이너리 바이트로 집계하며,MVTBoundingBox/MVTBoundingBoxMercator는 타일의 경계 상자를 반환해 행을 해당 범위로 제한할 수 있도록 합니다. Point, 선, Polygon geometry가 지원됩니다. PostGIS 별칭인ST_AsMVTGeom및ST_AsMVT로도 사용할 수 있습니다. #106107 (Saarthak Gupta). - 이제
clickhouse-local은SYSTEM START LISTEN및SYSTEM STOP LISTEN쿼리를 지원하므로, TCP 및 HTTP 연결을 수락하는 서버로 변환할 수 있습니다. #101143 (Alexey Milovidov). clickhouse-client와clickhouse-local에 대화형help명령을 추가했습니다.help <name>(help대신/help,man,/man도 사용 가능)를 입력하면 함수, 테이블 엔진, 데이터 타입, 포맷, 설정 또는 기타 구성 요소의 문서가 표시되며, 터미널에서 Markdown으로 렌더링되고 SQL 구문 강조가 적용됩니다. 단어가 모호한 경우에는 일치하는 모든 항목을 표시하고, 찾을 수 없는 경우에는 유사한 이름을 제안합니다. #108042 (Alexey Milovidov).- Azure Data Lake Storage Gen2에 쓰기를 지원합니다. #105406 (Konstantin Vedernikov).
- 스키마 진화(schema evolution) 지원을 강화하기 위해
RowBinaryWithNamesAndTypesAndDefaults포맷을 추가했습니다. #105736 (Mark Zitnik). - 기존
Enum타입에 새 값을 추가할 때 현재의 모든Enum값을 다시 지정할 필요가 없도록ALTER TABLE쿼리에ADD ENUM VALUES를 구현했습니다. #93830 (Ilya Golshtein). - 이제 갱신 가능 구체화 뷰는 시간 기반 일정 대신 다른 RMV의 갱신에 따라 갱신을 트리거하는
REFRESH DEPENDS ON을 지원합니다. (REFRESH EVERY ... DEPENDS ON은 이미 존재했지만, 이 사용 사례에는 안정적으로 사용할 수 없었습니다.) 자세한 내용은CREATE MATERIALIZED VIEW문서를 참고하십시오. #104440 (Michael Kolupaev). * LIKE '<pattern>'및* ILIKE '<pattern>'를 사용해 컬럼을 이름 패턴으로 선택하는 기능을 추가했으며,table.* LIKE '<pattern>',table.* ILIKE '<pattern>'와 같은 테이블 한정 형식도 지원합니다.LIKE는 컬럼명을 대소문자를 구분해 일치시키고,ILIKE는 대소문자를 구분하지 않고 일치시킵니다. #104569 (Yue Ni).LIKE패턴에서 사용자 정의 이스케이프 문자를 정의하는ESCAPE구문을 추가하여%와_를 와일드카드가 아닌 일반 문자로 처리할 수 있게 했습니다. #99774 (Ilya Yatsishin).materialize_projections_on_insert와materialize_projections_on_mergeMergeTree테이블 설정을 추가했습니다.materialize_projections_on_insert = 0이면INSERT시 프로젝션 파트 생성을 건너뛰므로, 프로젝션이 많은 테이블의 삽입 처리량이 향상됩니다.materialize_projections_on_merge = 1이면 머지 시 소스 파트 전체에 없는 프로젝션을 다시 빌드하므로, 프로젝션을 삽입 시점이 아니라 머지 중에 생성할 수 있습니다. 머지는 여전히 동일한 프로젝션 집합을 공유하는 파트만 결합합니다. #100993 (Christoph Wurm).- 기본적으로 비활성화된 새로운 변경 불가능한
MergeTree설정allow_tuple_element_aggregation을 추가했습니다. 활성화하면SummingMergeTree,AggregatingMergeTree,CoalescingMergeTree가 머지 중에Tuple컬럼을 재귀적으로 평탄화하고 각 리프 요소를 최상위 컬럼인 것처럼 독립적으로 집계합니다. 즉,SummingMergeTree는 합산하고,AggregatingMergeTree는 해당 집계 함수 상태를 머지하며,CoalescingMergeTree는 마지막 non-NULL 값을 유지합니다. 이 설정은 테이블 생성 시 지정해야 하며, 이를 지원하지 않는 엔진에서는 별도 경고 없이 무시됩니다. #98039 (johnjing). - 새 함수
quantizeBFloat16ToInt8와dequantizeInt8ToBFloat16: 임베딩 구성 요소를 256단계 Gaussian Lloyd-Max 양자화기를 사용해 8비트로 압축하는 스칼라 코덱으로, 여기서 비트 절단을 통해 Int4/Int2/binary 코드를 추출할 수 있습니다. #108102 (Alexey Milovidov). - 함수
arrayTopK및arrayBottomK를 추가했습니다: -arrayTopK(k, array)는 가장 큰 K개 원소를 내림차순으로 반환합니다 -arrayBottomK(k, array)는 가장 작은 K개 원소를 오름차순으로 반환합니다. #104563 (Vitaly Baranov). Iceberg테이블의 파일별 메타데이터를 노출하는 새로운 시스템 테이블system.iceberg_files를 추가했습니다. 이 테이블은 각 테이블의 현재 스냅샷에 포함된 각 데이터 파일 또는 삭제 파일마다 1개의 행을 제공합니다. 이로써 #98777가 해결되었습니다. #104415 (Asya Shneerson).- 모든 테이블의
CHECK및ASSUME제약 조건에 대한 정보를 제공하는system.constraints테이블을 추가했습니다. 여기에는 제약 조건 이름, 유형, 표현식이 포함됩니다. #105337 (Pedro Ferreira). - 사용 가능한 딕셔너리 레이아웃을 내장 문서(
description,syntax,examples,introduced_in,related)와 함께 나열하는 새로운system.dictionary_layouts테이블을 추가했습니다. #106182 (Alexey Milovidov). - 사용 가능한 딕셔너리 소스를 내장 문서(
description,syntax,examples,introduced_in,related)와 함께 나열하는 새로운system.dictionary_sources테이블을 추가했습니다. #106184 (Alexey Milovidov). - 사용 가능한 데이터 스키핑 인덱스 유형을 내장 문서(
description,syntax,examples,introduced_in,related)와 함께 나열하는 새로운system.data_skipping_index_types테이블을 추가했습니다. #106186 (Alexey Milovidov). - 사용 가능한 디스크 유형을 내장 문서(
description,syntax,examples,introduced_in,related)와 함께 나열하는 새로운system.disk_types테이블을 추가했습니다. #106187 (Alexey Milovidov). SYSTEM RESTART DISK <name>를 구현했습니다. 이제 디스크의 인메모리 메타데이터를 다시 로드하고, 해당 디스크에 있는 readonly 레플리카 테이블의 데이터 파트를 다시 스캔합니다. 이를 통해 공유plain_rewritable스토리지에 있는 테이블의 readonly 레플리카가refresh_parts_interval을 기다리거나 서버를 재시작하지 않고도, 다른 서버가 기록한 데이터를 필요할 때 확인할 수 있습니다. #106645 (Jordi Villar).- 이제 PostgreSQL 스타일의
expr OP SOME(array)/expr OP ALL(array)(subquery가 아닌 우변)이 지원되며,=/<>의 경우has/NOT has로, 그 밖의 비교 연산자의 경우arrayExists/arrayAll람다로 재작성됩니다.ANY는any가 집계 함수이기도 하므로 array form에서는 허용되지 않습니다. 대신SOME을 사용하십시오.ANY/SOME/ALL의 subquery form은 계속해서IN/NOT IN으로 변환됩니다. #105129 (Alexey Milovidov). load_balancing전략hostname_longest_common_prefix및hostname_longest_common_suffix두 가지를 새로 추가했습니다. 이 전략은 시작 노드의 호스트명과 가장 긴 공통 prefix(각각 suffix)를 공유하는 레플리카를 우선 선택합니다. 데이터 센터 정보가 호스트명의 prefix 또는 suffix에 인코딩되어 있고 숫자 구간의 길이가 가변적인 경우에 유용합니다. 이런 경우 기존nearest_hostname및hostname_levenshtein_distance전략은 잘못된 레플리카를 선택할 수 있습니다. #107360 (Denny [DBA at Innervate]).- 인증서 기반 authentication의 관측성을 개선하기 위해 TLS 클라이언트 certificate 정보(subjects, serial number, issuer, validity period)를
system.session_logtable에 추가했습니다. #107679 (Alexey Milovidov). S3역할 기반 접근을 위한 선택적external_idcredential을 추가했습니다. #106941 (Elian Gidoni).- 새로운
S3Queuesettingafter_processing_move_preserve_path를 추가했습니다.after_processing='move'및after_processing_move_prefix와 함께 활성화하면, 처리된 객체를 파일 이름만 남기도록 평탄화하지 않고 원본 전체 경로를 대상 prefix 아래에 유지한 채 이동합니다. #105354 (Asya Shneerson). - message queue 엔진(
Kafka,RabbitMQ,NATS)에서 attached 상태인 materialized view로 삽입하는 기능을 비활성화하는message_queue_disable_insertionserver setting을 추가했습니다. 읽기 전용 레플리카 시나리오에 유용합니다. #104911 (JIaQi Tang). LOCALTIME및LOCALTIMESTAMP를 추가했습니다(SQL 표준 / PostgreSQL 구문).LOCALTIMESTAMP는now()의 alias이며(DateTime반환),LOCALTIME은 현재 시각의 시간 부분을Time값으로 반환합니다. #106139 (Thomas Cabral).EXTRACT(unit FROM expr)의 구문 설탕으로date_part('unit', expr)를 추가했습니다. 표준 인터벌 종류와 PostgreSQL 추가 항목(epoch,dow,doy,isodow,isoyear,century,decade,millennium)을 모두 지원합니다. #105127 (Alexey Milovidov).- 시간대 오프셋의 시와 분 부분을 위한 PostgreSQL 호환
EXTRACT(TIMEZONE_HOUR FROM dt)및EXTRACT(TIMEZONE_MINUTE FROM dt)와, 인터벌에서 값을 추출하기 위한EXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>)를 추가했습니다. #106227 (Vinayak Joshi). argMin및argMax에 대한 aggregate aliasmin_by와max_by를 추가했습니다. #105712 (Joey Yu). 이런 alias는 멍청하며, 진짜 엔지니어는 원래 ClickHouse 이름을 사용합니다.- Oracle/MySQL/Snowflake compatibility를 위해
regexpExtract의 대소문자 구분 없는 alias로REGEXP_SUBSTR를 추가했습니다. #105122 (Alexey Milovidov). - PostgreSQL / SQL 표준 compatibility를 위해
currentUser()의 대소문자 구분 없는 alias로SESSION_USER를 추가했습니다. #106081 (Takumi Hara). CREATE TABLE과 마찬가지로ALTER TABLE ... ADD/MODIFY COLUMN에서 끝에 오는NULL/NOT NULLmodifier를 지원합니다. #106150 (Takumi Hara).- 이제 h3의
h3PolygonToCellsWithContainmentfunction을 사용해 중심 기반, 완전 포함, 겹침 포함 모드를 지원하는 새 알고리즘을 사용할 수 있습니다. #104455 (Youssef Kadry). - 키 지정이
IP_ADDRESS또는FORWARDED_IP_ADDRESS로 이루어질 때IPV4_PREFIX_BITS and IPV6_PREFIX_BITS플래그를 추가합니다. #89270 (Aditya Chopra). - 이제
formatReadableTimeDelta는Month및Year를 제외한 타입의INTERVAL표현식을 입력으로 받을 수 있습니다. #64315 (Francisco J. Jurado Moreno). - 이제
formatReadableSize,formatReadableDecimalSize,formatReadableQuantity함수에 선택적 precision 인수를 지정해 소수점 이하 자릿수를 제어할 수 있습니다. 기본값은 2로, 기존 동작을 유지합니다. #104648 (Antonio Filipovic). - 부동소수점 텍스트 출력의 소수 자릿수를 제어하는
output_format_float_precision설정을 추가합니다. #99721 (phulv94). - 텍스트 형식에서 부동소수점 및
Decimal숫자가 정수값인 경우에도 항상 소수점을 출력하도록 하는output_format_always_write_decimal_point_in_float_and_decimal설정을 추가했습니다. 예를 들어1대신1.을 출력합니다. 기본적으로는 비활성화되어 있습니다. #62614 (Ilya Yatsishin). - 새로운 HTTP handler 구성 원소
<url_prefix>및<full_url_prefix>(기본 경로 하위의 모든 경로와 일치하며, 예를 들어 Prometheus handler에 유용함)를 지원하고,<url_regexp>,<full_url_regexp>,<headers_regexp>도 함께 지원합니다. 기존<url>regex:...</url>형식은 이제 더 이상 사용되지 않습니다. #107492 (Vitaly Baranov). basic통계를 지원합니다. 이는 컬럼별 compact 통계로, 해당하는 경우 숫자의 최소/최대값, 평균 문자열 길이, NULL 개수를 저장합니다. #106048 (Han Fei).- ClickHouse Keeper에서 TTL 노드를 지원하며,
create_ttl기능 플래그로 활성화할 수 있습니다. #100397 (Konstantin Vedernikov). - workloads를 위한 메모리 reservation 기능을 도입합니다. workload scheduling 문서를 참조하십시오. #82414 (Sergei Trifonov).
실험적 기능
- 다단계 분산 쿼리 실행: planner가 쿼리 계획을 scatter / broadcast / gather / shuffle exchange로 연결된 stage로 분할하고, 계획 조각을 worker 노드에 dispatch합니다. stage 간 데이터는 TCP를 통해 스트리밍되거나 공유 객체 스토리지의 임시 파일을 통해 전달되며, 이 경로는 분산 shuffle 및 broadcast hash 조인, shuffle 집계, 분산 정렬을 지원합니다. 이 기능은 Experimental 상태이며 기본적으로 비활성화되어 있습니다. #106020 (Alexander Gololobov). 이제 experimental 분산 쿼리 계획 엔진(
make_distributed_plan)은 worker별로 서로 다른 task-dispatch 및 streaming-exchange 포트를 사용할 수 있으며,<remote_servers>에서 replica별로stateless_worker_port와streaming_exchange_port를 사용해 구성합니다. 설정하지 않으면 기존 server 수준 포트(stateless_worker_client.port및distributed_query.streaming_exchange_port)가 사용됩니다. 이를 통해 하나의 호스트에서 여러 worker를 실행할 수 있습니다. #107885 (Alexander Gololobov). - 내부 조인용 experimental
dphyp조인 재정렬 알고리즘이query_plan_optimize_join_order_algorithm설정의 옵션으로 추가되었으며, 조인 순서 탐색에 상한을 두고 상한을 초과하면 체인의 다음 알고리즘으로 대체되는query_plan_optimize_join_order_max_searched_plans설정도 추가되었습니다. 이전의 무제한 탐색 동작을 유지하려면 이를0으로 설정하십시오. #98798 (Alexander Gololobov). - ClickHouse 내부에서 LLM API를 사용해 임베딩을 생성할 수 있는
aiEmbed함수가 추가되었습니다. #102922 (George Larionov). - Experimental Linux OOM 카나리가 추가되었습니다. 이는 메인 server 프로세스보다 먼저 Linux OOM killer의 대상이 되는 희생용 자식 프로세스입니다.
oom_canary_enable로 활성화하면 allocator 캐시를 비우고, 쿼리와 merge를 취소하고,system.crash_log에 이벤트를 기록하여 메모리 압박을 완화합니다. OOM 대응에는 cgroup v2memory.events의 OOM-kill 증거가 필요합니다. #101942 (Peng). /webterminal의 웹 terminal 인터페이스가 이제 정식 기능이 되었으며 기본적으로 활성화됩니다. 이는 새로운enable_webterminalserver 설정으로 제어되며, 기존allow_experimental_webterminal설정은 deprecated 상태이지만 이전 버전과의 호환성을 위해 계속 적용됩니다. endpoint를 비활성화하려면enable_webterminal을false로 설정하십시오. #106255 (Alexey Milovidov).- 이제 PromQL HTTP endpoint에서 URL 쿼리 매개변수(
database=,table=, 또는table=db.table)를 통해 데이터베이스와 table을 지정할 수 있습니다. 기존의 암묵적인default.prometheustable 대체 동작은 제거되었습니다. handler 구성이나 URL 어디에서도 table을 지정하지 않으면 이제 handler는The time series table name is not set를 반환합니다. 기존 동작을 유지하려면<table>default.prometheus</table>를 구성하거나 URL에table=...를 전달하십시오. #107553 (Vitaly Baranov). prometheusQuery및prometheusQueryRange테이블 함수에 PromQLhistogram_quantile함수 지원이 추가되었습니다. 이를 통해le레이블로 식별되는 기존 Prometheus histogram bucket에 대해 분위수를 계산할 수 있습니다. #103477 (Joe Smith).- text index에 lazy 포스팅 리스트 적용 모드가 추가되었습니다.
SET allow_experimental_text_index_lazy_apply = 1및SET text_index_posting_list_apply_mode = 'lazy'로 활성화하면, 포스팅 리스트는 Roaring Bitmap으로 완전히 materialize되는 대신 커서 기반 접근 방식을 사용해 packed-block 단위로 필요할 때 디코딩되므로, 선택적인 text index 쿼리의 메모리 사용량과 CPU 시간을 줄일 수 있습니다. #100035 (Peng). - WebAssembly UDF용 AssemblyScript ABI 지원이 추가되었습니다. 브라우저 기반 playground를 사용하면 로컬에 툴체인을 설치하지 않고도 AssemblyScript ABI를 사용해 볼 수 있습니다. 이 playground는 AssemblyScript 코드를 컴파일하고, 생성된 WebAssembly module을 로컬 ClickHouse에 로드합니다. #104606 (Vladimir Cherkasov).
- 선택적 prefix를 사용해 메인 HTTP 포트에 Prometheus handler를 attach할 수 있게 되었습니다. #104975 (James Cunningham).
- 실험적
MergeTreesettingpacked_skip_index_max_bytes가 추가되었습니다. 이 setting은 작은 skip-index 서브스트림을 part별 단일skp_idx.packed아카이브로 묶어, table에 많은 skip 인덱스가 정의된 경우 inode 부담을 줄입니다. 이 결정은 쓰기 시점에 서브스트림별로 이루어집니다. 직렬화된 크기가 임계값 이하인 서브스트림은 아카이브에 들어가고, 그보다 큰 항목은 독립형skp_idx_<name>.idx2/.mrk2레이아웃을 유지합니다. 하나의 part 안에서 두 레이아웃을 혼합할 수 있습니다. 전문 검색 인덱스는 지원되지 않으며 항상 파일별로 유지됩니다. 기본값은 0(패킹 비활성화)입니다. #105321 (Raúl Marín). ABI BUFFERED_V1을 사용하는 WebAssembly UDF용Buffersserialization을 지원하며, persisted WASM UDF function setting으로webassembly_udf_enable_fuel이 추가되었습니다. #105574 (Antonio Andelic).- 실험적
use_reader_executorsetting(기본값 비활성화)이 추가되었습니다. 이 setting은 읽기를 기존 레거시 read buffer 체인 대신 새로운 pipeline 기반ReaderExecutor를 통해 처리하도록 라우팅합니다. #106570 (Sema Checherinda). 모델링된 읽기 비용 KPI(ReaderExecutorModeledCostMsPerRequestedMiB)를 포함해, 실험적use_reader_executor읽기 경로를 위한 관측성 메트릭이 추가되었습니다. #106968 (Sema Checherinda). 실험적use_reader_executor읽기 경로 뒤에ChainedBuffersbuffer가 도입되었으며,ReaderExecutorChainedBufferBytes메트릭도 함께 추가되었습니다. #107210 (Sema Checherinda). MergeTreesorting key의 내림차순 정렬(예:ORDER BY (time DESC, key))이 이제 항상 지원되며, 더 이상 사용되지 않는 실험적 settingallow_experimental_reverse_key가 필요하지 않습니다. #106440 (Nikita Mikhaylov).Nullable(Tuple(...))가 이제 베타입니다. 기본적으로 비활성화되어 있으며, 사용하려면enable_nullable_tuple_type = 1로 설정하십시오. #107754 (Nihal Z. Miaji).
성능 개선
- Keeper를 전반적으로 약 2배 더 빠르게 만드는 여러 변경 사항이 적용되었습니다(향상된 배치 처리, 리더로 보내는 메시지의 파이프라이닝, 로그 추가 파이프라이닝). #101757 (Michael Kolupaev).
- 단순한
SELECT쿼리의 쿼리별 오버헤드(파싱, 분석, 계획)를 줄였습니다. 예를 들어, 단일 connection에서 실행한SELECT count() FROM hits는 약 50% 더 빨라졌습니다. #104513 (Raúl Marín). - 길고 high-cardinality인 프라이머리 키에 대한 프라이머리 키 인덱스 분석을 최적화했습니다. 긴 프라이머리 키의 경우 이제 인덱스 분석 실행 시간은 프라이머리 키의 길이보다 쿼리 filter의 복잡도(실제로 사용하는 키 컬럼)에 주로 좌우됩니다. 따라서 소수의 컬럼에만 filter를 적용하는 쿼리에서는 sorting key를 확장하더라도 인덱스 분석에 추가되는 오버헤드가 거의 없습니다. 또한 high-cardinality 프라이머리 키에서는 ClickHouse가 선택적인 키 컬럼 prefix만 메모리에 유지하고 뒤쪽 컬럼은 로드하지 않는데, 이제 인덱스 분석도 전체 키가 아니라 해당 인메모리 prefix만 대상으로 수행됩니다. 이 최적화는 기본적으로 활성화되어 있으며, 새로운 설정
use_lightweight_primary_key_index_analysis로 비활성화할 수 있습니다. #65103을 해결합니다. #91836 (Nihal Z. Miaji). - 이제 기본 x86 build는 x86-64-v2(SSE4.2) 대신 x86-64-v3(AVX2)를 대상으로 합니다. 이를 사용하려면 AVX2를 지원하는 CPU(Intel Haswell 이상, AMD Excavator 이상)가 필요합니다. CPU가 AVX2를 지원하지 않으면 일반 x86-64를 대상으로 하는
amd64compatbuild를 사용하십시오. #105019 (Raúl Marín). - 범용 비교 정렬에 Rust 표준 라이브러리의 sort 구현을 C++로 포팅한
ipnsort와driftsort(안정 정렬)를 사용합니다. 이를 통해 숫자가 아닌 컬럼에 대한ORDER BY와 안정 정렬이 빨라지고, 역순 정렬된 입력에서 발생하던 최악의 경우도 제거됩니다. #106650 (Alexey Milovidov). - 해시를 사용해 그룹화 키 기준으로 행을 thread 간에 분산하여 각 thread가 머지 단계 없이 서로 겹치지 않는 키 부분집합을 집계하도록 하는, 고카디널리티의 균등 분포 키를 위한 새로운
GROUP BY최적화가 추가되었습니다. 활성화하려면enable_sharding_aggregator = 1을 설정하십시오. #104233 (Nihal Z. Miaji). - 문자열 키
GROUP BY쿼리에 대해 해시 테이블 prefetching을 활성화하여, high-cardinality 문자열 집계 성능을 약 8% 개선했습니다. #101007 (Le Zhang). - 큰 aggregate state(예:
groupArray)를 사용하는 부분 2단계 집계 결과를 머지할 때 피크 메모리 사용량을 줄였습니다. 이제 머지가 완료될 때까지 모든 버킷의 원본 state를 유지하는 대신, 머지 중에 각 버킷의 원본 state를 점진적으로 해제합니다. #102330 (Yuri Fedoseev). EnumDataType의 메모리 표현을 최적화했습니다.Enum유형이 포함된 table의 메모리 사용량은Enum구성 요소에서 최대 10배까지 개선될 수 있습니다. 값(숫자)으로 이름을 조회하는 시간은 비슷하거나 더 빠릅니다. 이름으로 검색하는 경우는 약간 더 느리지만, 이런 접근 방식은 비교적 드뭅니다. #95668 (Ilya Yatsishin).- 쿼리 분석 중 식별자 확인이 중복 수행되지 않도록 식별자 확인 캐시를 추가했습니다. #88043 (Max Justus Spransy).
- 컬럼이 많은 테이블에 대한 쿼리의 쿼리 분석 성능을 개선했습니다. 필요하지 않은 경우 컬럼 노드 해시(전체 원본 테이블 표현식 포함)를 계산하지 않도록 했습니다. 이제 약 1200개 컬럼이 있는 테이블에 대한 중첩
SELECT *서브쿼리 분석이 약 50배 빨라졌습니다. #106957 (Dmitry Novik). - 함수 호출이 많거나 깊게 중첩된 쿼리의 쿼리 분석 속도를 개선했습니다. 함수 해석 캐시에서 불필요한 쿼리 트리 해시를 제거했습니다. #107516 (Dmitry Novik).
- 많은 접근 엔터티(행 정책, 역할, 할당량, 설정 프로필)가 한 번에 변경될 때 복제된 접근 스토리지에서 로그인 및 쿼리 시작이 오래 지연되던 문제를 수정했습니다. 이제 엔터티별 캐시는 변경된 각 엔터티마다 다시 계산하는 대신 알림 batch당 한 번만 다시 계산되므로, 접근 잠금을 몇 분간 유지할 수 있던 2차 복잡도 작업이 제거되었습니다. #107672 (Azat Khuzhin).
- probe 측에서 해시 조인의
FixedHashMap을 JOIN runtime filter로 공유합니다. build 측 해시 테이블이FixedHashMap이거나FixedHashMap으로 변환할 수 있는 경우, 이를 runtime filter로 게시하고 기존에BuildRuntimeFilterStep이 설치하던Set/BloomFilter를 대체합니다. 이 동작은 새로운 설정join_runtime_filter_from_fixed_hash_table(기본값true)으로 제어됩니다. #105640 (Xiaozhe Yu). JOIN뒤에 선택적인LIMIT,TopN또는 다른JOIN이 오는 경우 셀렉터 및 복제 인덱스를 지연 적용합니다. 지연 셀렉터 인덱스를 활성화하기 위한 payload 컬럼 수를 제어하려면 설정query_plan_min_columns_for_join_lazy_indexing을 사용하십시오(0은 최적화 비활성화를 의미합니다). 최적화가 적용될LIMIT을 제어하려면 설정query_plan_max_limit_for_join_lazy_indexing을 사용하십시오. #106566 (Hechem Selmi).- 이제 병렬 레플리카와 함께 DP(dynamic programming) JOIN 재정렬을 사용할 수 있습니다. #105889 (Nikita Taranov).
- JOIN이 runtime filter(기본 활성화:
enable_join_runtime_filters)를 사용할 때 쿼리 계획을 개선했습니다. 이제 join-reorder 비용 모델이 오른쪽 서브트리의WindowTransform(및 기타 행 보존 계획 단계)을 통과해 내부를 파악하고, 통계 없음으로 처리하는 대신 기반 행 수와 컬럼별 NDV를 사용합니다. #107229 (UnamedRus). - RIGHT 및 FULL join에서 조인되지 않은 행을 배칭하여 출력하는 경로를 de-virtualize했습니다. #105679 (Hechem Selmi).
HashJoin에서 패킹keys32및keys64메서드를 지원합니다. #107202 (Nikita Taranov).Set에서 패킹keys32및keys64메서드를 지원합니다. #107564 (Nikita Taranov).- 집계에서 널 허용 컬럼을 더욱 최적으로 처리합니다. #106015 (Nikita Taranov).
LIMIT BY쿼리의 성능을 개선했습니다. #103349 (Nihal Z. Miaji).LIMIT BY컬럼이ORDER BY의 접두사인 경우,Sort수행 중 각 병렬 정렬 스트림 내부에서LIMIT BY를 실행하도록 해ORDER BY ... LIMIT BY쿼리 속도를 높였습니다. 이로써 최종 정렬 머지와 이후 파이프라인 단계로 전달되는 행 수가 줄어듭니다. 이 최적화는 새로운 설정query_plan_push_limit_by_into_sort로 제어되며(기본적으로 활성화됨), #104000 (Nihal Z. Miaji)에서 도입되었습니다.<cols>가 테이블의 정렬 키(sorting key) 접두사이거나,WHERE col = const로 선행 컬럼이 고정된 뒤 접두사가 되는 경우SELECT ... LIMIT N BY <cols>쿼리 속도를 높였습니다. 이 기능을 활성화하면MergeTree는 프라이머리 키 순서로 데이터를 읽고,LIMIT BY는 먼저 스트리밍 모드에서 각 정렬 스트림마다 O(1) 메모리로 필터링을 수행해 대부분의 데이터를 걸러낸 다음, 마지막으로 줄어든 데이터에 일반LIMIT BY를 적용해 최종 결과를 얻습니다. 새로운 설정optimize_limit_by_in_order로 제어되며(기본적으로 활성화됨), #105135 (Nihal Z. Miaji)에서 도입되었습니다.- 파티셔닝된
MergeTree테이블에서LIMIT BY쿼리 속도를 높였습니다. 이제 제한을 적용하기 전에 모든 스트림을 하나로 머지하는 대신, 각 파티션의 스트림 내부에서LIMIT BY를 병렬로 실행합니다. 이는 파티션 표현식이LIMIT BY컬럼의 deterministic 함수인 경우에 적용되며, 이 경우 어떤LIMIT BY그룹도 두 파티션에 걸칠 수 없습니다. 새로운 설정allow_limit_by_partitions_independently로 제어되며(기본적으로 활성화됨), #105126 (Nihal Z. Miaji)에서 도입되었습니다. - 중복된 키 표현식을 제거해
LIMIT BY쿼리 속도를 높였습니다. 다른 키들의 deterministic 함수인 키는 제거되며(예:LIMIT 5 BY x, f(x)는LIMIT 5 BY x가 됨), 키의 injective 함수는 해당 인수로 대체됩니다(예:LIMIT 5 BY toString(x)는LIMIT 5 BY x가 됨). 이에 따라 각 행에서 평가해야 하는 표현식 수와 비용이 줄어듭니다. 새로운 설정optimize_limit_by_function_keys및optimize_injective_functions_in_limit_by로 제어되며, 둘 다 기본적으로 활성화되어 있습니다. #106818 (Nihal Z. Miaji). - 세그먼트된 집계,
grace_hash조인의 버킷 처리, 병렬 윈도우 파티셔닝의 속도를 높이기 위해 청크별 컬럼 해싱을 하드웨어 CRC32C를 사용하는 커널로 대체했습니다. #106538 (Harikrishnan Prabakaran). - x86-64-v4/v3에서 다중 타깃 auto-vectorization을 사용해 배열 인수에 대한
L1Distance,L2Distance,L2SquaredDistance,LinfDistance,cosineDistance를 최적화했습니다. 비상수 배열 인수의 경우, 런타임 exponent와 함께std::pow를 사용하는LpDistance를 제외한 모든 함수가 이제 컴파일러가 벡터화한 커널을 사용할 수 있습니다. 기존 AVX-512 및 Sapphire RapidsBFloat16상수 인수 고속 경로는L2Distance와cosineDistance에 대해 그대로 유지됩니다. #101310 (Peng). {Norm}Distance및dotProduct함수의 성능이 향상되었습니다. #106007 (Nikita Taranov).arrayNorm함수의 성능이 향상되었습니다. #106211 (Nikita Taranov).- 일부 경우
dotProduct의 성능이 향상되었습니다. #106210 (Nikita Taranov). - 배열 길이가 벡터화 처리 폭으로 정확히 나누어떨어질 때
Array(Float32),Array(Float64),Array(BFloat16)에서L2Distance및cosineDistance의 AVX-512 const-left 경로 성능을 개선했습니다. #104625 (Sergey Kuznetsov). - AMD에 대해 AVX-512 코드 생성(codegen)을 활성화하고
arrayDistance의 코드 생성을 개선했습니다. #106505 (Nikita Taranov). QBit데이터 타입에 대한L2DistanceTransposed및cosineDistanceTransposed함수의 성능을 개선했습니다. #106701 (Raufs Dunamalijevs).encrypt,decrypt,tryDecrypt,aes_encrypt_mysql,aes_decrypt_mysql함수의 성능을 최대 10배까지 개선하여 BoringSSL에서 OpenSSL 3.x로의 마이그레이션(24.4) 과정에서 손실된 성능을 복구했습니다. #107339 (Konstantin Bogdanov).- OpenSSL 3.x에서 행별 암묵적 OpenSSL 프로바이더 조회를 피하도록 하여
encrypt,decrypt,halfMD5함수의 성능을 개선했습니다. #99105 (Konstantin Bogdanov). - AVX-512를 사용해 여러 입력을 병렬로 해시하는
SHA1의 SIMD 구현을 추가해 처리량을 개선했습니다. #105459 (Joanna Hulboj). - 멀티버퍼
MD5구현을 위한 AArch64 ASIMD/NEON 백엔드를 추가했습니다. #105563 (Venkata Vineel ). MATERIALIZE PROJECTION중 프로젝션을 계산하기 전에 소스 블록을 스쿼시하여 임시 프로젝션 파트 수와 머지 오버헤드를 줄였습니다. 5천만 행 테이블에서 약 3.4배 빨라졌습니다. #100047 (Amos Bird).- 파트 쓰기 중 불필요한 컬럼 순열을 피하도록 하여
ORDER BY컬럼에 스킵 인덱스가 있는MergeTree테이블의INSERT지연 시간을 줄였습니다(트레이스 형태 워크로드에서 약 17%). #101101 (Amos Bird). - Arrow의 SIMD 코드 경로(ARM의 NEON, x86의 SSE4.2/AVX2/AVX512)를 활성화하고 이를 사용해
BYTE_STREAM_SPLIT로 인코딩된 ParquetFLOAT/DOUBLE컬럼의 디코딩 속도를 높였습니다. #106376 (Raúl Marín). bloom_filter인덱스가 있는LowCardinality컬럼의 삽입 성능을 개선했습니다. #106410 (Michael Jarrett).- 디스크별 스레드 풀을 사용해
DiskObjectStorageTransaction::copyFile에서 blob 복사를 병렬화했습니다. #105089 (Asya Shneerson). file,s3같은 파일 기반 테이블 함수와 함께One입력 형식을 사용할 때 파일 내용을 읽지 않도록 했습니다. #105157 (Yue Ni).- 동적 심볼을 내보내지 않도록 하여 macOS에서
clickhouse시작 속도를 약 3배 높였습니다. 그렇지 않으면 동적 링커가 시작할 때마다 이를 처리해야 합니다. #107768 (Raúl Marín). - 시작 시 파일 시스템 캐시를 로드할 때 캐시 키마다 중복으로 디렉터리를 여는 작업을 없애 성능을 높였습니다. #107414 (Alexey Milovidov).
- 시작 시 파일 시스템 캐시를 로드할 때, 디렉터리 목록 조회가 끝난 뒤 스레드의 절반을 유휴 상태로 두는 대신 해당 스레드가 캐시 메타데이터 로드도 돕도록 하여 성능을 높였습니다. #107416 (Alexey Milovidov).
- 번들된 WasmEdge 라이브러리를 업데이트하여
clickhouse프로세스 시작 오버헤드를 줄였습니다. 이제 이 라이브러리는 시작할 때마다 전역 초기화기에서 임의의 hash secret을 생성하지 않습니다. #107869 (Raúl Marín). - 이제
MergeTree프라이머리 키와 스킵 인덱스는ifNull또는coalesce가 조건을 감싼 필터(예:ifNull(key = 0, 0)또는coalesce(key = 0, 0))에 대해서도 그래뉼을 가지치기할 수 있습니다. 이러한 프레디케이트는 잠재적으로NULL일 수 있는 비교를 확정적인 Boolean으로 바꾸기 위해 쿼리 생성기가 자주 만들어내지만, 이전에는 인덱스 분석기가 이를 해석하지 못해 그래뉼을 건너뛸 수 없었습니다. 이는 기존allow_key_condition_coalesce_rewrite설정(기본적으로 활성화됨)을 확장한 것입니다. #106264를 해결합니다. #106272 (Andy Zhao). - 26.6에서는
DateTime64타입에 대한 스킵 인덱스 평가 시 CPU 사용량이 더 줄어듭니다. #107707 (Shankar Iyer). - 희소한 token 처리 방식을 최적화하여 여러 token 검색에서 텍스트 인덱스 분석 성능을 개선했습니다. #98226 (Anton Popov).
- 텍스트 인덱스의 posting-list 압축 세그먼트에 캐시를 사용합니다. #106299 (Anton Popov).
- 테이블의 큰 연속 구간을 선택하는 쿼리에 대한 일반 제외 검색 성능을 개선했습니다. #93813 (Michael Jarrett).
- 동일한 endpoint와 bucket을 사용하는
S3clients는 캐시를 공유하므로 중복된 region 디스커버리를 피할 수 있습니다. #92482를 해결합니다. #96802 (Andrey Zvonov). - 쿼리에
has(<constant array>, <expr>)가 포함된 경우, 분석기는 가능하면 더 빠른in구현을 사용하도록 해당 노드를 변환합니다. #97341 (Shankar Iyer). ThreadPool에서 새 job이 예약되면 임의의 worker thread 대신 가장 최근에 유휴 상태가 된 worker thread(LIFO)를 깨웁니다. 이렇게 하면 스레드별 allocator 캐시로 인한 메모리 단편화를 줄일 수 있습니다. job 처리 순서는 바뀌지 않습니다. #100177 (Alexey Milovidov).- 근사 런타임 필터와 블룸 필터 인덱스의 성능을 개선했습니다. #100201 (Christoph Viebig).
ASOF JOIN에서parallel_hash조인 알고리즘을 사용할 수 있도록 하여, 서로 다른 동등성 키 값에 걸쳐 build를 병렬화할 수 있게 했습니다. 이전에는ASOF가 무조건parallel_hash에서 제외되었습니다. #105375 (Greg Maher).- 빈 입력으로 결과가 비어 있음이 이미 확정되는 경우,
INTERSECT및EXCEPT쿼리에서 범위가 제한되지 않은 입력을 읽지 않도록 했습니다. #105393 (Yue Ni). - 다양한
MemoryTracker블로커에constinit를 추가했습니다. #105490 (Azat Khuzhin). - 범위 검사 중
rb_max를 반복 호출하지 않도록 개선하여,UInt64가 아닌groupBitmap상태에서bitmapContains성능을 향상했습니다. #105960 (Yue Ni). - 단일 딕셔너리를 사용하는
LowCardinality컬럼의 불연속 쿼리 처리 속도를 높였습니다. #103662 (Ivan Babrou). - 블록에 행이 1개만 있을 때
HashJoin프로브를 위한 빠른 경로를 추가했습니다. #106008 (Nikita Taranov). - 이제
SELECT ... FROM view(SELECT ... FROM remote(...)) WHERE ...와 같은 쿼리의 프레디케이트가 원격 샤드로 전송되는 쿼리로 푸시다운됩니다. 최적화allow_push_predicate_ast_for_distributed_subqueries에 테이블 함수 처리 케이스가 누락되어 있었습니다. #105986 (Nikolai Kochetov). enable_join_transitive_predicates를 기본으로 활성화했습니다. #103724 (Alexander Gololobov).- 텍스트 인덱스에서
multiSearchAny,multiSearchAnyUTF8,multiMatchAny함수를 지원하도록 추가했습니다. 또한match함수의 텍스트 인덱스 분석도 개선하여, 이제 대체 그룹이 있는 패턴에서 더 많은 그래뉼을 건너뛸 수 있습니다. #106279 (Anton Popov). - 초기 PREWHERE 선택 이후에 도입된 필터(프레디케이트 푸시다운, 런타임 필터, 또는 planner가 설정한 WHERE와 명시적 PREWHERE의 조합)를
MergeTree읽기 위에 별도의 Filter 단계로 남겨두는 대신, 두 번째 optimizer 패스에서 기존 PREWHERE에 머지할 수 있도록 했습니다. #105445 (Yarik Briukhovetskyi). - 이제
QueryConditionCache는 PREWHERE를 부분적으로만 통과하는 읽기 배치 내에서도 개별적으로 필터링된 그래뉼을 기록하므로, 동일한 조건을 사용하는 후속 쿼리에서 mark 재읽기 횟수를 줄입니다. #105335 (Han Fei). - 기본적으로 활성화되는 Keeper 설정
nuraft_use_bg_thread_for_snapshot_io를 추가하여,NuRaft가 스냅샷 객체를 Raft worker thread가 아니라 background thread에서 읽도록 했습니다. #106285 (Antonio Andelic). KeeperMemoryStorage를 사용하는 ClickHouse Keeper에서 수신한 스냅샷을 적용할 때 최대 메모리 사용량을 줄였습니다. #105851 (Antonio Andelic).- LLVM/JIT allocation을 전용 jemalloc arena로 라우팅합니다. 수명이 긴 JIT bookkeeping과 수명이 짧은 쿼리 allocation이 뒤섞이면서 발생하는 RSS 단편화를 줄입니다. 관측성을 위해 새로운 비동기 메트릭
jemalloc.jit_arena.active_bytes,jemalloc.jit_arena.dirty_bytes,CompiledExpressionCacheBytesMax,CompiledExpressionCacheCountMax를 추가했습니다. 이제SYSTEM DROP COMPILED EXPRESSION CACHE는 기본 CHJIT 인스턴스도 함께 삭제하고 JIT arena도 비웁니다. #104113 (Raúl Marín). - 네이티브 V3 리더로
Parquet에서 희소 딕셔너리 인코딩된Nullable(String)컬럼을 읽을 때 과도한 메모리 reservation이 발생하던 문제를 수정했습니다. #102805 (Francisco). - 암호화된 디스크에서
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)가 하드링크 대신 데이터를 복사하던 문제를 수정했습니다. #106731 (Nikita Mikhaylov). - 쿼리 계획 최적화기의 카디널리티 추정을 개선했습니다. 이제 결정적 단일 인수 함수(예:
toYear(date))가 생성한 컬럼은 통계 정보 없이 남겨지는 대신, 해당 인수의 고유값 개수를 상한으로 상속하므로 조인 재정렬의 정확도가 높아집니다. #107757 (Alexander Gololobov). - 높은 로그 발생률에서 비동기 로깅의 CPU 오버헤드를 줄였습니다. 이제 모든 메시지마다가 아니라, 큐가 비어 있는 상태에서 비어 있지 않은 상태로 전환될 때만 로그 컨슈머에 알립니다. #107352 (Nikita Mikhaylov).
- 더 많은 시나리오에서 쿼리 실행 중 중복 계산을 제거했습니다. #106113 (Yarik Briukhovetskyi).
- recursive CTE 결과 처리를 병렬화했습니다. 이제 대규모
WITH RECURSIVE결과에 대한GROUP BY또는 기타 연산이 더 이상 단일 스레드로 제한되지 않습니다. #107694 (Alexey Milovidov). - ARM에는 NEON SIMD 경로를, x86에는 더 넓은 AVX2 커널을 추가하여 대소문자를 구분하지 않는 부분 문자열 검색(
positionCaseInsensitiveUTF8,ILIKE,multiSearchAnyCaseInsensitiveUTF8및 관련 함수)의 성능을 개선했습니다. #107882 (Raúl Marín). FPC부동소수점 코덱의 predictor 테이블이VectorWithMemoryTracking을 사용하기 시작하면서 발생한 ARM 환경에서의 약 16% 처리량 저하를 수정했습니다. #108182 (Groene AI).
개선 사항
- 백그라운드
MemoryWorker가 이제 현재 메모리 사용량과 커널이 사용 가능하다고 보고한 메모리 양을 기반으로 서버의 hard memory limit를 주기적으로 갱신합니다. 이를 통해 ClickHouse는 동일한 호스트에서 실행 중인 다른 프로세스를 위한 여유 메모리를 남겨둘 수 있습니다. 계산식은(resident memory + system MemAvailable) * max_server_memory_usage_to_ram_ratio입니다. 동일한 서버 설정max_server_memory_usage_to_ram_ratio가 시작 시 cap과 동적 조정 모두를 제어하며, 둘 다 비활성화하려면0으로 설정하십시오. 정적인 시작/리로드 cap만 유지하려면(이전 버전의 동작) 새 서버 설정memory_worker_dynamic_hard_limit를0으로 설정하십시오. #104964 (Alexey Milovidov). PostgreSQLprotocol에서 C# PostgreSQL 클라이언트를 지원합니다. 이로써 #18611이 해결되었습니다. #80785 (Konstantin Vedernikov).- 뮤테이션이 이제 분석기를 사용합니다. #98884 (Nikolai Kochetov).
- CLI에서 쿼리 에코에 대한 세분화된 제어가 추가되었습니다. 이제
--echo옵션은 선택적 Boolean 값을 받을 수 있으며 interactive 및 batch mode 모두에서 동작합니다. 새 옵션--echo-formatted와--echo-query-id는 각각 에코된 쿼리의 포맷 적용 여부와query_id출력 여부를 제어합니다. 이제--hilite/--highlight옵션은 에코된 쿼리의 하이라이트 여부도 제어합니다. 이에 따라--echo는 이제 Boolean 값 옵션이므로, 값 없이--echo바로 뒤에 오는 위치 인자는 해당 옵션의 값으로 처리됩니다. 대신--echo --query "..."또는--echo=false를 사용하십시오. #106191 (Alexey Milovidov). - 데이터 레이크 카탈로그에 대해 concurrent consistency check와 함께 schema evolution을 지원합니다. #106102 (Konstantin Vedernikov).
- datalake 테이블 엔진에서 cache disk를 사용할 수 있습니다. #102017 (RinChanNOW).
catalog_type = 'onelake'인DataLakeCatalog데이터베이스가 기본적으로 OneLake Blob endpoint(.blob.fabric.microsoft.com)를 사용해 테이블 데이터를 읽도록 수정했습니다. 이전 DFS endpoint(.dfs.fabric.microsoft.com) 동작을 유지하려면onelake_use_blob_endpoint = false를 설정하십시오. #106843 (Konstantin Vedernikov).S3(Azure)Queue설정persistent_processing_node_ttl_seconds의 기본값을1 hour에서6 hours로 변경했습니다(서비스 비정상 재시작 등으로 인한 정리 시간을 의미함). 이전 기본값은 processing nodes ttl에는 적절했지만 버킷 lock ttl에도 사용되며, 이 경우 더 오래 유지될 수 있으므로 1시간으로는 충분하지 않았습니다. #106838 (Kseniia Sumarokova).Icebergmetadata cache의 기본 크기를 1 GB에서 128 MB로 줄였습니다. #106492 (Konstantin Vedernikov).S3Queuestreaming task의query_id를 종속 테이블 삽입에 전달합니다. #106494 (Christoph Wurm).DataLakeCatalog를 통해 테이블을 쿼리할 때system.query_log의used_storages를 저장 엔진 이름으로 채웁니다. #100706 (Melvyn Peignon).- Iceberg snapshot이 어떤 ‘operation’과 ‘summary’를 갖는지 확인할 수 있습니다. 테스트와 디버깅에 유용합니다. #106246 (Den Kalantaevskii).
- 최종
S3멀티파트 업로드 요청을 task tracker를 통해 비동기로 완료하도록 개선하여, finalize 단계에서 직렬로 실행하는 대신 마지막 part 업로드와 동시에 겹쳐 수행할 수 있게 했습니다. #105487 (Asya Shneerson). - text index의 기본 매개변수를 제어하는 4개의 새로운
MergeTree테이블 설정text_index_dictionary_block_size,text_index_dictionary_block_frontcoding_compression,text_index_posting_list_block_size,text_index_posting_list_codec를 추가했습니다. 이 설정을 사용하면 각 인덱스 정의마다 매개변수를 지정하지 않아도 테이블 수준에서 text index 동작을 조정할 수 있습니다. 인덱스별로 명시한 인수는 계속 우선 적용됩니다. #100626 (Anton Popov). - projection이
index_granularity뿐 아니라 추가MergeTree설정(compression, part format, serialization)도 재정의할 수 있도록 허용하고, 허용 가능한 설정의 allow-list와 검증도 함께 추가했습니다. #101170 (Amos Bird). - projection 머지 진행 상황을 확인할 수 있도록
system.merges에current_projection,current_projection_progress,projections_completed,projections_remaining컬럼을 추가했습니다. #102611 (Amos Bird). - 프라이머리 키 컬럼에 대한
IN서브쿼리와 함께 사용하는PREWHERE가 granule pruning에 프라이머리 키 인덱스를 사용하지 않아, 관련 granule만 읽지 못하고 전체 테이블 스캔이 발생하던 문제를 수정했습니다. #102570 (Nikita Mikhaylov). - 이제
h3PolygonToCells함수는MultiPolygon의 모든 polygon에 걸쳐 최대 배열 크기를 강제 적용하고, 기반 H3 라이브러리의 반환 코드를 검증하며, 빈 결과를 조용히 반환하는 대신MultiLineString인수를 거부합니다. #106399 (Raúl Marín). - 로컬 ClickHouse Keeper snapshot 정보를 제공하는 새로운 keeper 전용
system.keeper_snapshots테이블을 추가했습니다. #105571 (Miсhael Stetsyuk). - 로컬 ClickHouse Keeper changelog(Raft 로그) 파일 정보를 제공하는 새로운 keeper 전용
system.keeper_changelogs테이블을 추가했습니다. #105617 (Miсhael Stetsyuk). - keeper 전용
system.keeper_cluster테이블을 추가했습니다. 현재 Keeper가 인식하는 각 Raft cluster 멤버마다 한 개의 행이 포함됩니다. #105646 (Miсhael Stetsyuk). - watch에 대해 더 많은 Keeper 프로파일 이벤트(서버 측 + 클라이언트 측)를 추가했습니다. #97703을 해결합니다. #105336 (Konstantin Vedernikov).
NuRaft의 미커밋 log entry 수용 제한과 append-entries backward-probe 스로틀링을 위한 Keepercoordination_settings를 추가했습니다. #106108 (Antonio Andelic).mysql테이블 함수,MySQL테이블 엔진,MySQL데이터베이스 엔진, 딕셔너리SOURCE(MYSQL), 명명된 컬렉션에enable_compression설정을 추가했습니다. 이 설정을 활성화하면 ClickHouse는 연결을 통해 전송되는 모든 데이터에 대해 MySQL 프로토콜 수준의 compression을 협상합니다. #103229 (Bernard Lim).- PostgreSQL wire 프로토콜을 통해 실행되는 쿼리의 취소 지연 시간을 줄였습니다. 이제
KILL QUERY는 전체 청크가 클라이언트로 전송될 때까지 기다리지 않고, 단일 청크 내에서 출력 직렬화를 중단합니다. #106535 (Roman Vasin). - MySQL wire 프로토콜을 통해 실행되는 쿼리의 취소 지연 시간을 줄였습니다. 이제
KILL QUERY는 전체 청크가 클라이언트로 전송될 때까지 기다리지 않고, 단일 청크 내에서 출력 직렬화를 중단합니다. #107228 (Roman Vasin). - MySQL handshake에서
auth_responselength를 읽는 방식을 수정했습니다. 길이 바이트>= 128가 signedchar로 읽히면서 수 기가바이트 크기의 값으로 해석되던 문제를 해결했습니다. #107384 (uwezkhan). - 이제
MaterializedPostgreSQL은 정밀도가 76보다 큰 PostgreSQLnumeric(p, 0)열(예: 256비트 정수에 사용되는numeric(78, 0))을 “Precision too big” 오류로 실패 처리하는 대신 ClickHouseInt256으로 매핑합니다.Int256에 맞지 않는 값은 명확한 오류와 함께 거부됩니다. #107431 (Alexey Milovidov). - TCP connection 설정에 실패하면 클라이언트에 예외를 전송합니다. #107317 (Nikolai Kochetov).
- 이제 사용자는 8비트/16비트/32비트/64비트 정수 변형에
AvroFixed필드를 삽입할 수 있습니다. #98139 (Patrick Pichler). - 이제
AvroConfluent포맷은 일시적인 장애(전송 시간 초과, connection 거부, DNS 오류, HTTP5xx/408/429)가 발생할 때 첫 번째 네트워크 문제에서 INSERT를 중단하는 대신, Confluent 스키마 레지스트리 HTTP 클라이언트를 지수형 백오프로 재시도합니다. 새로운 설정format_avro_schema_registry_max_retries(기본값5)와format_avro_schema_registry_retry_initial_backoff_ms(기본값100)로 이 정책을 제어합니다. 스키마 검증 오류(HTTP409, 잘못된 형식의 Avro JSON)는 계속 치명적인 오류로 처리됩니다. #106661 (Groene AI). system.query_log.used_privileges에 예외를 발생시키지 않는isGranted경로(checkAccessWithFilter)를 거치는 경우를 포함해, 부여된 모든 접근 검사에 대한 권한을 기록합니다. 이전에는 예외를 발생시키는 진입점(checkAccess/checkGrantOption)을 통해 검사된 권한만 기록되었기 때문에,file/s3/azure/url테이블 함수를 사용하는DESCRIBE,CREATE TABLE AS및 유사한 쿼리에서READ ON FILE/READ ON S3/READ ON AZURE/READ ON URL이 감사 로그에 표시되지 않았습니다. 접근 제어 적용 방식은 변경되지 않았습니다. #104693 (Alexey Bakharew).- MergeTree-family tables에 저장된 데이터의 총 압축되지 않은 크기를 보고하는 비동기 메트릭
TotalUncompressedBytesOfMergeTreeTables및TotalUncompressedBytesOfMergeTreeTablesSystem을 추가했습니다. #106364 (Alexey Milovidov). - 운영자가 서버 전체 메모리 한도에 도달한 시점을 모니터링할 수 있도록 프로파일 이벤트
GlobalMemoryLimitExceeded를 추가했습니다. #106466 (Sacheendra Talluri). executable_poolUDF에 대해ExecutableUserDefinedFunction*ProfileEvents카운터를 채우도록 했습니다. 이제 호출별 실행 횟수, wall 시간과 풀 대기 시간, 자식 프로세스의 CPU 및 최대 메모리 사용량, stdin/stdout 바이트를system.query_log.ProfileEvents에서 확인할 수 있습니다. #105010 (Xu Jia) #105618 (Ilya Andreev).- resident memory(
VmRSS)와executable및executable_pool사용자 정의 함수의 실행 중인 프로세스 수를 보고하는 비동기 메트릭ExecutableUserDefinedFunctionMemoryResidentBytes및ExecutableUserDefinedFunctionProcesses를 추가했습니다. 여기에는 하위 프로세스와 유휴 풀 워커도 포함됩니다. #107300 (Hanzi Jiang). - 나머지 anonymous memory와 별도로 pthread 스택 메모리를 보고하는 Linux 전용 async 메트릭 3개(
MemoryThreadStacksCount,MemoryThreadStacksVirtual,MemoryThreadStacksResident)를 추가했습니다.asynchronous_metrics_enable_heavy_metrics를 통해 활성화됩니다. Linux 5.17+(prctl(PR_SET_VMA_ANON_NAME))와 읽기 가능한/proc/self/smaps가 필요하며, 그렇지 않으면 해당 메트릭은 제공되지 않고 이 제한 사항은system.warnings에 보고됩니다. #106230 (Raúl Marín). - macOS에서
MemoryThreadStacks*비동기 메트릭(스레드 스택의 resident/virtual 크기 및 개수)을 노출합니다. #107752 (Raúl Marín). - 이제 테이블 엔진에 내장 문서가 포함되며,
system.table_engines테이블의 새로운description,syntax,examples,introduced_in,related컬럼을 통해 확인할 수 있습니다. #106177 (Alexey Milovidov). - 이제 데이터베이스 엔진에 내장 문서가 포함되며,
system.database_engines테이블의 새로운description,syntax,examples,introduced_in,related컬럼을 통해 확인할 수 있습니다. #106178 (Alexey Milovidov). - 이제 데이터 타입에 내장 문서가 포함되며,
system.data_type_families테이블의 새로운description,syntax,examples,introduced_in,related컬럼을 통해 확인할 수 있습니다. #106180 (Alexey Milovidov). - 이제 입력/출력 포맷에 내장 문서가 포함되며,
system.formats테이블의 새로운description,examples,introduced_in,related컬럼을 통해 확인할 수 있습니다. #106181 (Alexey Milovidov). - 이제 집계 함수 조합자에 내장 문서가 포함되며,
system.aggregate_function_combinators테이블의 새로운description,syntax,examples,introduced_in,related컬럼을 통해 확인할 수 있습니다. #106185 (Alexey Milovidov). clickhouse-client,clickhouse-local, 그리고 내장 클라이언트에--chime명령줄 옵션을 추가했습니다. 쿼리가 최소 N초 동안 실행된 후 종료되면(성공 또는 오류), 클라이언트는 stderr에 ASCIIBEL제어 문자(\x07)를 기록합니다. 소리를 낼지 시각적으로 깜박일지는 terminal이 사용자 기본 설정에 따라 결정합니다. 기본적으로 5초 임계값으로 활성화되며, 사용자 지정 임계값은--chime N, 비활성화하려면--chime 0을 사용하십시오. #92718을 닫습니다. #104545 (Groene AI).clickhouse-client에서 terminal이 bracketed paste를 지원하지 않는 경우, 붙여넣은 여러 줄 쿼리의 줄바꿈이 이제 각 줄마다 continuation prompt로 전환되지 않고 동일한 편집 버퍼로 합쳐집니다. 붙여넣은 쿼리는 하나의 prompt 아래에 유지되며, 화살표 키로 줄 사이를 이동할 수 있습니다. 이는 일반적인 TTY 버퍼링 기반 붙여넣기 동작에 의존하는 최선형 개선입니다. #104299 (Alexey Milovidov). 이제 syntax highlighting이 비활성화된 경우(--highlight 0)에도 동작합니다. #106665 (Alexey Milovidov).clickhouse-client/clickhouse-local에 MySQL 스타일의 런타임 pager 제어를 추가했습니다. #105706 (Azat Khuzhin).clickhouse-client가 이제 UTF-8이 아닌 terminal도 올바르게 처리합니다. terminal 문자 encoding이 UTF-8이 아닌 경우(예:LANG=C),Pretty포맷은 terminal을 깨뜨릴 수 있는 유니코드 박스 그리기 문자를 출력하는 대신 ASCII 격자 테두리로 폴백됩니다. #106213 (Alexey Milovidov).- 악의적인 server가 클라이언트에 그대로 표시되는 바이트를 주입하지 못하도록,
clickhouse-client의Hellopacket 처리에서 server가 제공하는 표시 문자열(server name, time zone, display name, password-rule pattern 및 message)을 정제하고, 크기 상한도 두어 무제한 allocation을 방지했습니다. #105243 (Raúl Marín). - 이제 Web UI는 쿼리가
FORMAT PNG와 같은 image 출력 형식을 사용할 경우, raw bytes를 table로 보여주는 대신 결과를 image로 표시합니다. #107638 (Alexey Milovidov). output_format_pretty_use_nbsp_for_paddingsetting을 추가했습니다.output_format_pretty_grid_charset이UTF-8일 때 table 스타일Pretty포맷의 table 레이아웃 padding을U+00A0NO-BREAK SPACE로 렌더링합니다. 이렇게 하면 일반 공백을 축소하는 도구에서도 복사한Pretty출력의 table 정렬을 유지하는 데 도움이 됩니다. 이 setting은 기본적으로 비활성화되어 있으며,ASCIIcharset 출력에서는 일반 공백을 그대로 사용합니다. #103559 (Ashrith Bandla).- 공통 설치 script가 이제 Linux 및 macOS에서
clickhousectl도~/.local/bin에 설치하고,chctlsymlink도 함께 생성합니다. 건너뛰려면CLICKHOUSE_ONLY=1을 설정하십시오. #105399 (Alasdair Brown). - 현재 directory에
clickhousebinary가 이미 있는 상태에서curl https://clickhouse.com/ | sh로 ClickHouse를 설치할 때 간헐적으로 발생할 수 있던 잘못된Syntax error: Unterminated quoted string를 수정했습니다. #106417 (Alexey Milovidov). - web terminal이 열려 있을 때
play.html페이지의 왼쪽 패널 높이를 수정하여, 하단의 terminal toggle 버튼이 계속 표시되도록 했습니다. #105087 (Alexey Milovidov). - Web UI에서 쿼리를 실행한 후 유일한 쿼리가 선택되지 않도록 했습니다. #105711 (Joey Yu).
- 이제 Web SQL UI는 쿼리 높이가 현재 editor 높이보다 최대 30% 더 큰 경우 쿼리 editor를 확장합니다. #105713 (Joey Yu).
- Web UI에서 왼쪽 패널이 확장되면 하단 메뉴 아이콘(Web Terminal 및 GitHub)을 가로로 배치해 데이터베이스와 테이블 목록에 더 많은 세로 공간을 확보합니다. #106427 (Alexey Milovidov).
- Web UI(
play.html)에서 이제Escape를 누르면 현재 선택된 결과 테이블 셀이 비활성화됩니다. #107777 (Alexey Milovidov). - Web SQL UI(Play)의 데이터베이스 패널 개선 사항: 데이터베이스 아이콘 툴팁, 패널 숨기기 버튼, 전체 너비에서 클릭 가능한 데이터베이스/테이블 이름, 그리고 스크롤바가 나타날 때 패널 너비가 흔들리던 문제를 수정했습니다. #108013 (Alexey Milovidov).
- 모든 allocation에서
MEMORY_LIMIT_EXCEEDED를 발생시킬 수 있도록 서버 setting(min_allocation_size_to_throw_on_memory_limit)을 추가했습니다. 이는 OOM을 방지하는 데 도움이 됩니다. #105265 (Azat Khuzhin). - SSH에
NONEauthentication을 허용합니다(no_password사용자에게 비밀번호를 묻지 않도록 함). #105476 (Azat Khuzhin). - privilege를 삭제하기 전에
clickhouse su에서 보조 그룹 목록을 초기화하여/bin/su및sudo의 동작과 일치시켰습니다. 이전에는 권한이 삭제된 프로세스가 호출자의 보조 그룹을 상속했습니다. #105247 (Raúl Marín). - 숫자 프레디케이트 함수(
isFinite,isNaN)에BFloat16지원을 추가했습니다. #105391 (Mohamed Hussain S). - 폴리곤 딕셔너리(
polygon_index_cell,polygon_index_each)의 메모리 사용량을 줄이고,system.dictionaries.bytes_allocated가 이들이 빌드하는 조회 인덱스를 올바르게 반영하도록 했습니다. #105431 (Raúl Marín). - Kafka 테이블 엔진 consumer가 파티션 assignment 이후에도 짧은 폴링 주기를 계속 사용하던 문제를 수정해, 구성된
kafka_poll_timeout_ms로 돌아가도록 하고 과도한 빈 폴링, 더 작은 inserted part, 그리고 리밸런싱 이후 추가 머지 오버헤드를 방지합니다. #100431 (sugaf1204). - query plan에서 사용되지 않는 컬럼을 제거할 때 컬럼명 대신 위치로 컬럼을 식별합니다. 이를 통해 중복된 컬럼명이 있는 경우에도 미사용 컬럼 제거가 가능해집니다. #100586 (János Benjamin Antal).
- 이제 복제된 엔진에
table_readonly를 사용하려는 시도에 대해 ClickHouse가 적절한 exception을 발생시키며, 이 setting과 관련된 DDL queries(및DatabaseReplicated)에 대한 exception 처리도 개선되었습니다. #100950 (alesapin). 이제 대상 테이블에table_readonly = 1이 설정된 경우OPTIMIZE TABLE ... ON CLUSTER및 기타 DDL이 더 이상 멈추지 않습니다. 이제 이 setting은 전용 새 오류 코드TABLE_IS_PERMANENTLY_READ_ONLY를 발생시키며,DDLWorker는 이를 재시도할 수 없는 오류로 처리합니다(임시ReplicatedMergeTreeZooKeeper 연결 끊김 중 발생하는 일시적TABLE_IS_READ_ONLY와 구별됨). 또한 이제table_readonlysetting은 생성 시와ALTER MODIFY SETTING을 통해서 모두ReplicatedMergeTree에 대해 명시적으로 거부됩니다. #97652의 후속 작업입니다. #105109 (Alexey Milovidov). - 대상 테이블이 교체된 뒤(예:
EXCHANGE TABLES또는 삭제 후 재생성)UNKNOWN_TABLE로 실패할 수 있던 갱신 가능 구체화 뷰의 갱신을 수정했습니다. 이제 갱신 시 오래된 UUID에 의존하지 않고 대상 테이블 이름으로 확인합니다. #102724 (Seva Potapov). wait_for_part_commit_in_dependent_materialized_views설정(기본값false)을 추가했습니다. materialized view의SELECT가 자신의 원본 테이블을 다시 읽는 경우(예: 원본에 대한INNER JOIN)에는, 삽입된 part가 종속 뷰 실행 이후에야 커밋되므로 현재 삽입 중인 행이 연쇄 처리에서 누락될 수 있었습니다. 이 설정을 활성화하면 종속 뷰가 트리거되기 전에 part를 커밋하므로 진행 중인 행도 확인할 수 있지만, 그 대신 삽입 병렬성은 낮아집니다. #105943 (Elmi Ahmadov).tryDeserialize에서 치명적 오류(예:MEMORY_LIMIT_EXCEEDED)를 더 이상 무시하지 않습니다. #106808 (Azat Khuzhin).InverseDictionaryLookupPass에서CREATE TEMPORARY TABLE권한을 지연 평가하도록 했습니다. #107098 (Azat Khuzhin).serialize_query_plan = 1이 설정된 분산 쿼리에서 상수 인수가 있는 람다(예:arrayMap(t -> t.2, ...))를 포함할 때 발생하던ILLEGAL_TYPE_OF_ARGUMENT오류를 수정했습니다. 이제 쿼리 계획 직렬화 중ActionsDAGINPUT노드의 상수 컬럼이 보존됩니다. #107124 (Alexey Milovidov).contingency,cramersV,cramersVBiasCorrected,theilsU집계 함수 상태의 역직렬화는 이제 저장된 개수들이 일관된 contingency table을 이루는지 검증하며, 그렇지 않으면CORRUPTED_DATA예외를 발생시킵니다. #106899를 닫습니다. #107185 (Nihal Z. Miaji).arrow::Status로 래핑된 예외의 원래 오류 코드를 보존합니다. #107267 (Azat Khuzhin).- 기존
CREATE QUOTA ... KEYED BY normalized_query_hashDDL syntax와 일치하도록, 정적 서버 구성(users.xml)에 정의된 quota에서keyed_by_normalized_query_hash를 지원합니다. #107654 (Alexey Milovidov). - 이제 compatibility 설정은 더 이상 사용되지 않는 설정을 적용하지 않으므로, 이를 변경된 것으로 표시하거나 더 이상 사용되지 않는 설정 경고를 생성하지 않습니다. #107737 (Maxim Orlovsky).
- async inserts는 더 이상
trace/debug수준에서query_id전체 목록을 기록하지 않습니다. 이 동작은 26.2부터 async insert 트래픽이 많은 services에서text_log를 과도하게 증가시킬 수 있었습니다. 이제 상세한 줄은test수준에 기록됩니다. #107852 (Sema Checherinda). - 파일 시스템 캐시 개선 사항: 무효화된 priority 항목이
KeyMetadata를 붙잡아 두지 않도록 했습니다. #106387의 후속 작업입니다. #107903 (Kseniia Sumarokova). FileCache메트릭 개선 사항입니다. #106116 (Kseniia Sumarokova).- 스택 트레이스가 실제로 비어 있을 때는 예외 메시지에 “Stack trace (when copying this message, always include the lines below):” 머리말을 출력하지 않도록 했습니다. #106524 (Alexey Milovidov).
- 매우 큰 오프셋에 대한 파일 시스템 캐시 경계 정렬을 계산할 때
roundUpToMultiple에서 발생할 수 있는 잠재적인 오버플로우를 수정했습니다. #92579 (Bharat Nallan). - 이제
EXPLAIN SYNTAX는 explain 출력에서 연산자를 일관되게 함수 호출 형식으로 포맷합니다(예:1 + 2대신plus(1, 2)). #94681 (Mohamed Abdelhalim ). - 오류 메시지의 테이블 이름 힌트를 개선했습니다. 더 이상 완전히 동일한 이름을 제안하지 않으며, 제안에 데이터베이스 이름도 포함합니다(예: “Maybe you meant
other_db.my_table?”). #95116 (Mathuranath Metivier). FROM절이 없는 쿼리에서 확인되지 않은 식별자에 대한 오류 메시지를 개선해FROM절 추가를 제안하도록 했습니다. #101769 (Yash ).- 반복되는 processor 체인을 축약해 표시하는
EXPLAIN PIPELINE옵션을 추가했습니다. #104662 (Yue Ni). - parser가 첫 번째 세미콜론 또는 스트림 끝 토큰보다 앞까지 되돌아간 경우 발생하던, 구문 오류 메시지 구성 과정의 heap-buffer-overflow 읽기(
parseQuery.cpp를 통한UTF8::computeWidthImpl)를 수정했습니다. release 빌드에서는 인접한 heap 메모리의 바이트가 표시된 오류 메시지에 섞여 들어갔고, ASan 빌드에서는 중단되었습니다. #105086 (Groene AI). - compatibility 설정
file_like_engine_default_partition_strategy에서 hive 파티션 strategy를 기본값으로 사용하도록 했습니다. #86746 (Kseniia Sumarokova). - macOS에서 더 큰(8 MiB) thread stack을 사용해 Linux 기본값과 맞추고, JIT 컴파일 중 stack overflow로 인해 드물게 발생하던 server 충돌을 수정했습니다. #107033 (Raúl Marín).
clickhouse-local의 임시 저장소 크기 제한이 더 이상 1 GiB로 하드코딩되지 않습니다. 기본값은 1 TiB로 상향되었으며,max_temporary_data_on_disk_sizeserver setting으로 구성할 수 있습니다. #106689 (Alexey Milovidov).clickhouse-disks에read-checksums명령을 추가했습니다. 이 명령은MergeTreeDataPart의checksums.txt파일을 읽어 사람이 읽기 쉬운 탭 구분 테이블로 출력합니다. #106901 (Asya Shneerson).clickhouse-disks에read-bitmap명령을 추가했습니다. #107834 (murphy-4o).- Chdig: 보안 연결에 TLS를 활성화했습니다(기존에는 “unknown setting
skip_verify” 또는 “connection reset by peer”가 발생했습니다). #105864 (Azat Khuzhin). chdigv26.5.1. #105918 (Azat Khuzhin).chdigv26.6.1 -{asynchronous_,}metric_log, 쿼리 패턴, 히트맵, 디스크에 저장된 로그/트레이스(이전에는 1시간 분량의 트레이스 저장에 >40GiB가 필요할 수 있었습니다). #107678 (Azat Khuzhin).- 서버 구성(
programs/server/config.xml)에서 이제keep_alive_timeout을 30으로 설정합니다(기존 값은 10). 이는 문서화된 실제 기본 구현값과 일치합니다. #107779 (Dan Checkoway). - 서버 설정
disk_connections_rcvbuf의 기본값이0(커널 TCP 자동 튜닝)에서204800(200 KB)으로 변경되었습니다. 이에 따라 객체 스토리지(S3/Azure/GCS) 디스크 연결의 소켓별 TCP 수신 버퍼 상한이 설정됩니다. #107859 (Sema Checherinda). - 이제
PREWHERE최적화기는 선택도를 추정하기 전에 동일한 컬럼 집합을 참조하는 결합 조건을 그룹화합니다. 따라서a > 2500 AND a < 2502와 같은 조건은 서로 독립적인 두 프레디케이트가 아니라 하나의 결합된 범위로 함께 평가되어, 더 정확한 선택도 추정값을 생성합니다. #106337 (Han Fei). - silk fiber 대응 보안 소켓 및 일반 소켓 구현을 추가했습니다. #107680 (Miсhael Stetsyuk).
nested함수의 깨진 오류 메시지(인수 순서가 뒤바뀜)와 오타를 수정했습니다. #108031 (Alexey Milovidov).- 지정된 경로에
sed표현식을 제자리에서 적용하는sed명령을clickhouse-disks에 추가했습니다. #107131 (Asya Shneerson). MaterializedPostgreSQL데이터베이스 엔진에 생성 시점 설정materialized_postgresql_use_extended_date_and_time_types를 추가했습니다. 기본값(활성화)에서는 PostgreSQLdate/timestamp컬럼을Date32/DateTime64로 추론하며,CREATE DATABASE시점에 이 값을0으로 설정하면 더 좁은Date/DateTime타입으로 추론합니다. #107428 (Alexey Milovidov).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
tryN접미사가 붙은 분리된 파트를 삭제할 수 있게 했습니다. #58957 (János Benjamin Antal).- 병렬 레플리카로 실행할 때 중첩된 서브쿼리 내부에서 projection alias가 중복된 쿼리(예:
SELECT *, day + 365 AS day)에 대해 발생하던MULTIPLE_EXPRESSIONS_FOR_ALIAS예외를 수정했습니다. #80310 (Alexey Milovidov). - 세미콜론 뒤에 주석이 있는 쿼리 끝에서
splitMultipartQuery가 “Empty query” 오류를 발생시키던 버그를 수정했습니다. #85491 (Yarik Briukhovetskyi). ARRAY JOIN에서 발생하던Function writeSlice expects same column types for GenericArraySlice and GenericArraySink예외를 수정했습니다. 이 문제는LowCardinality숫자 타입이 사용될 때 발생했습니다(issue #57243). #91784 (Jimmy Aguilar Mena).- 새 분석기와 함께 상수 컬럼이 포함된
LIMIT BY를DISTINCT및ORDER BY와 함께 사용할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #93195 (Ashrith Bandla). data_type_default_nullable = 1이고 테이블이Replicated데이터베이스에서 생성되거나ON CLUSTER를 통해 생성될 때,NOT NULL컬럼이 조용히Nullable로 생성되던 문제를 수정했습니다. #97572 (xiaohuanlin).- Hive Metastore와 통신할 때 발생하는 TTransportException 오류를 처리하기 위해 자동 재시도 메커니즘과 재연결 로직을 추가해 HiveCatalog 연결 안정성을 개선했습니다. #98471 (Dmitriy Borisenko).
nested함수(ARRAY JOIN에서 내부적으로 사용됨)가 컬럼 타입에서LowCardinality를 제거해 출력에서Array(LowCardinality(String))이Array(String)으로 바뀌던 문제를 수정했습니다. #95582를 해결합니다. #98974 (Yash ).- 병렬 레플리카가 활성화된 쿼리에서
url,s3또는 유사한 테이블 함수를 사용할 때 발생하던 “Distributed task iterator is not initialized” 예외를 수정했습니다. #100146 (Alexey Milovidov). - 외부 도구(예: Spark)로 format 버전이 업그레이드된 Iceberg 테이블을 읽을 때 발생하던 logical error 예외를 수정했습니다. #100407 (Alexey Milovidov).
- 이제
like,ilike,notLike,notILike,match함수는 비상수 needle과 함께 상수 haystack(예:'foo' LIKE pattern_column)도 지원하며, 이전에는 이 경우ILLEGAL_COLUMN이 발생했습니다. #100479 (Yash ). - 뷰가 정수 컬럼을
Bool컬럼으로 매핑할 때query_plan_enable_optimizations = 0인MaterializedView쿼리가 잘못된 행 수를 반환하던 문제를 수정했습니다. #100692 (Maksim Moisiuk). - PREWHERE 최적화가 활성화된 상태에서 ORC 데이터 파일이 포함된 Iceberg 테이블을 읽을 때 발생하던 예외(
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it')를 수정했습니다. #101206 (Groene AI). - RestCatalog의 경쟁 상태(race) 문제를 수정했습니다. #101216 (Smita Kulkarni).
- 일반 프로젝션이 있는 테이블 위의 VIEW에서 SELECT할 때 발생하던
NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #101218 (Amos Bird). - 파일이 삭제된 뒤 다시 생성될 때 FileLog의 오래된 메타데이터가 남아 있던 문제를 수정했습니다. #101408 (Azat Khuzhin).
- 조인 재정렬 과정에서
RIGHT/LEFT JOIN이 다른 테이블과 쉼표 조인(교차 조인)될 경우 일치하지 않는 행이 조용히 누락되던 문제를 수정했습니다. 예:t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. 이전에는 쿼리가 외부 조인 결과 대신 내부 조인 결과를 반환했습니다. #101684 (Groene AI). EXPLAIN INSERT INTO ... SELECT ... FORMAT ...에서FORMAT절이EXPLAIN출력에 적용되지 않고INSERT에서 소비되던 문제를 수정했습니다. #101772 (Yash ).- 테이블 수준의
default_compression_codec설정이 명시적으로 구성된 경우MergeTree파트에 잘못된 압축 코덱이 선택되던 문제를 수정했습니다. 삽입 시, 머지 중, 그리고 프로젝션용으로 기록된 파트에서 테이블 수준 설정 대신 서버 전체 기본 코덱이 사용되고 있었으며(완전 삭제 뮤테이션으로 생성된 빈 파트도 이제 여기에 포함됩니다). #101784 (Yash ). max_bytes_per_second,max_cpus등의 workload settings에서 음수Float64값(예:-100.5)을 거부하도록 했습니다. 이전에는 음수 정수만 검증했기 때문에, 음수 부동소수점 값이 조용히 손상된 scheduler 노드를 만들 수 있었습니다. #101825를 종료합니다. #101842 (Groene AI).- JOIN 내부에 집계가 포함된 VIEW가 있는 쿼리를 실행할 때 발생할 수 있던
LOGICAL_ERROR(“Port is not connected”, 코드 49)를 수정했습니다. #102574 (Jimmy Aguilar Mena). - 기본값이 아닌 serialization을 사용하는 컬럼에 뮤테이션을 수행한 뒤 파트 메타데이터가 일관되지 않던 문제를 수정했습니다. #102817 (Eduard Karacharov).
- 뮤테이션 실행 전에 메타데이터를 업데이트하도록 수정해 #96806을 해결했습니다. #102882 (Smita Kulkarni).
- 동시
INSERT가 실행 중일 때 SELECT 쿼리가 크게 느려지던 문제를 수정했습니다. 이전에는INSERT파이프라인이 대부분의 슬롯을 실제로 사용하지 않더라도 쿼리 시작 시max_threads까지 CPU 슬롯을 예약해 동시 SELECT를 굶주리게 했습니다. 이제 CPU 슬롯 할당은 수요 기반으로 이루어집니다. 즉, 파이프라인은 실제로 병렬화 가능한 작업을 푸시할 때만 슬롯을 요청합니다. 이는 동시성 제어와 workload용 선점형 CPU scheduler 모두에 적용됩니다. 새로운 server settingconcurrent_threads_lazy_allocation(기본값true)은 롤백 수단으로 사용할 수 있습니다. #102928 (Seva Potapov). Nullable(Tuple(...))컬럼에서 추출한 서브컬럼을 읽을 때NULL전파가 올바르게 처리되도록 수정했습니다. 예를 들어tup Nullable(Tuple(s Nullable(String)))의 경우, 이제SELECT tup.s는 바깥쪽 Tuple이NULL인 행에서 잘못된 값이 아니라NULL을 정확히 반환합니다. 이 수정은NULL을 표현할 수 있는 모든 요소 타입인Nullable,Dynamic,Variant,LowCardinality(Nullable(...))에 적용됩니다. #105356 종료. #102942 (Nihal Z. Miaji).- 클라이언트가 제공한 Native 형식 데이터가 잘렸거나 잘못된 형식인 경우
LOGICAL_ERROR대신INCORRECT_DATA를 발생시키도록 했습니다. #102975 (János Benjamin Antal). - ObjectStorage 읽기 작업에 취소 확인을 추가했습니다. #98165 종료. #103016 (Smita Kulkarni).
- 집계 함수 매개변수를 디코딩할 때
input_format_binary_max_type_complexity를 준수하도록 했습니다. #102903 종료. #103026 (Pavel Kruglov). - Arrow 기반 Parquet 리더에서 geo 컬럼의 널 허용 추론을 수정했습니다. #101845 종료. #103032 (Pavel Kruglov).
recursiveRemoveLowCardinality가 사용자 정의 geometry type 이름(예:LineString과Ring,MultiLineString과Polygon)을 지워 geometry type이 잘못 해석되던 문제를 수정했습니다. #103207 종료. #103041 (Joanna Hulboj).max_insert_block_size_bytes가0(기본값)일 때INSERTparsing 중input_format_max_block_size_bytes가 조용히 무시되던 문제를 수정했습니다. 이제 이 설정은 행 입력 형식이 생성하는 block 크기를 올바르게 제한합니다. #103068 (Kirill Kopnev).- 후행 null byte를 잘못 제거해 ClickHouse가 간헐적으로 잘못된 GSSAPI tokens를 생성하던 문제를 수정했습니다. #103114 (Michael Jarrett).
- short-circuit 함수(
if,multiIf,and,or등)에 대한 분석기 시점 상수 폴딩을 수정해, 정적으로 도달할 수 없는 분기에서 더 이상 분석 시점에 예외가 발생하지 않도록 했습니다. 예를 들어 이제WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))는 0으로 나누기 오류로 실패하지 않고0을 올바르게 반환합니다. #103157 (Peng). EXPLAIN SYNTAX가 parameterized views를 확장합니다. #103263 (Jordi Villar).INSERT INTO FUNCTION hdfs(...)를 통해 HDFS에 Parquet(및 ORC, Arrow 같은 다른 trailer-bearing 포맷)을 쓸 때 발생하던 데이터 손상 문제를 수정했습니다. 26.1부터WriteBufferFromHDFS가finalize()에서 작업 버퍼를 flush하지 않아, 각 파일의 마지막 최대DBMS_DEFAULT_BUFFER_SIZE바이트가 조용히 손실되었고 여기에는 ParquetPAR1footer도 포함되었습니다. 이런 파일을 읽으면Not a Parquet file (wrong magic bytes at the end of file)가 반환되었습니다. #103268 (Groene AI).join_overflow_mode = 'break'와 함께 조인 크기 제한(max_rows_in_join/max_bytes_in_join)이 설정된 경우, correlated subqueries에서 잘못된 결과가 나오거나 logical error가 발생할 수 있던 문제를 수정했습니다. 이제 correlated subquery를 평가하기 위해 내부적으로 생성되는 join은 이러한 사용자 제한을 무시하므로, 더 이상 조기에 중단되어 행이 누락되지 않습니다. #103322 (Groene AI).EmbeddedRocksDB테이블에서ALTER TABLE ... MODIFY SETTING을 실행할 때, server가 쿼리를 거부했더라도 잘못된 설정 값이 테이블 메타데이터 파일에 저장될 수 있던 버그를 수정했습니다. 이후 server를 다시 시작하면 테이블이CANNOT_PARSE_BOOL(또는 유사한 parsing error)로 인해 attach에 실패했고, 로드 실패를 치명적으로 처리하는 데이터베이스에서는 server 시작 자체가 거부될 수 있었습니다. 이제 잘못된 설정 값은 메타데이터를 기록하기 전에 거부됩니다. #103417 (Groene AI).- 지원되지 않는 개수의 인수로 객체 스토리지 engine(
AzureBlobStorage,DeltaLakeAzure,S3,HDFS) 테이블을 생성할 때 server가 abort되던 문제를 수정했습니다. 이제 debug/새니타이저 빌드에서도 abort되는 대신NUMBER_OF_ARGUMENTS_DOESNT_MATCH오류를 정상적으로 반환합니다. #103544 (Groene AI). - abstract syntax tree (AST)가 구조적으로 잘못된 경우(예: AST fuzzer가 생성한 경우)
JSON및Dynamic데이터 타입 매개변수 parsing에서 발생하던 server crash를 수정했습니다.equals(name, value)매개변수 표현식에 children이 2개 미만으로 남을 수 있었고, 이후DataTypeObject와DataTypeDynamic이 범위 검사 없이 이를 역참조하고 있었습니다. #103545 (Groene AI). - prewhere에서 사용된 람다의 컬럼명 충돌로 인해 분석기에서 발생하던 logical error를 수정했습니다. #103584를 닫습니다. #103627 (Pavel Kruglov).
- 비동기 메타데이터 로딩 중 일반 데이터베이스 안에서
Icebergengine 테이블을 로드할 때DataLakeConfiguration::getCatalog에서 간헐적으로 발생하던Logical error: 'Database <name> not found'를 수정했습니다. #103775 (Groene AI). PREWHERE/WHERE/HAVING/QUALIFY안에서 projection alias를 참조하는 쿼리(예:SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) 또는 컬럼명이 겹치는 self-join에 대한SELECT *를 병렬 레플리카 및parallel_replicas_local_plan = 0과 함께 실행할 때, remote 레플리카에서 발생하던MULTIPLE_EXPRESSIONS_FOR_ALIAS오류를 수정했습니다. #74324를 닫습니다. #103806 (Groene AI).- 여러
minmax스킵 인덱스와use_skip_indexes_for_disjunctions = 1이 설정된MergeTree테이블에서, 쿼리가 중첩된coalesce/ifNull비교(예:WHERE coalesce(a, b, coalesce(c, d), e) = const)를 사용할 때 server가 abort되던 문제를 수정했습니다. 이제<op>(coalesce(...), const)에 대한 skip-index 재작성은 내부coalesce인수에도 재귀적으로 적용되므로, 각 인덱스의KeyConditionRPN이 disjunction 추적 코드가 이미 가정하고 있는 template의 RPN과 일치합니다. #103929 (Groene AI). - 새로운 분석기에서
GLOBAL IN및GLOBAL JOIN쿼리의max_rows_to_transfer와max_bytes_to_transfer가 조용히 무시되던 문제를 수정했습니다. 이제 구체화된 외부 테이블이 설정된 한도를 초과하면, 이전 분석기의 동작과 동일하게SET_SIZE_LIMIT_EXCEEDED가 발생하거나(transfer_overflow_mode에 따라) 중단됩니다. #103333을 해결했습니다. #104119 (Groene AI). show_data_lake_catalogs_in_system_tables가 활성화된 DataLake catalog 데이터베이스에서INSERT또는 DDL 문이 존재하지 않는 테이블을 참조할 때 catalog/S3 메타데이터를 과도하게 읽던 문제를 수정했습니다. 오타 힌트 제안 경로에서 전체 catalog의 각 테이블에 대한 전체 Iceberg 메타데이터를 로드하고 있었으며, 이로 인해 큰 catalog에서는 메모리가 고갈될 수 있었습니다. #104124 (DQ).MergeTree오른쪽 테이블과 함께directjoin_algorithm을 사용하는 쿼리에서, 조회 계획이 최적화 과정에서 컬럼 순서를 재배치할 때 발생할 수 있던 크래시(LOGICAL_ERROR“Columns are assumed to be of identical types, but they are different in Nullable”가 debug 빌드에서 발생하고,ColumnString::compareAt널 포인터 SIGSEGV가 release 빌드에서 발생)와 잘못된 결과를 수정했습니다. 오른쪽 컬럼이 잘못된 이름의 슬롯에 배치될 수 있었고, 그 결과 join key에 대한 filter 또는 비교가 잘못된 유형의 컬럼을 참조할 수 있었습니다. AST fuzzer가 STID 2139-5111로 드러냈으며 #107272에 보고되었습니다. #104174 (Groene AI).Date에 대해 범위를 벗어난 정수 파티션 ID를ALTER시 조용한 오버플로우 또는LOGICAL_ERROR를 일으키는 대신 거부하도록 수정했습니다. #104250 (Azat Khuzhin).- query plan serialization 없이 병렬 레플리카 및 분석기와 함께
additional_table_filters를 비활성화했습니다. 이전에는 이로 인해 잘못된 결과가 발생할 수 있었습니다. #104296 (Azat Khuzhin). Nullable키 컬럼의 값이 딕셔너리에 없을 때dictGetOrNull이SELECTprojection의 다른 컬럼을 조용히NULL로 덮어쓰던 문제를 수정했습니다. 이 함수는 입력에 alias된 null map을 제자리에서 변경하고 있었으며, 이제 변경 전에 결과 컬럼을 깊은 복사로 복제합니다. #73633을 해결했습니다. #104327 (Groene AI).ALTER TABLE ... DROP PARTITION ID 'patch-...'이후DETACH/ATTACH TABLE을 수행했을 때 손상된 patch part가 생기던 문제를 수정했습니다. 이전에는 비어 있는 covering part가partition.dat와source_parts.dat없이 기록되었고, 그 결과 다음 attach 또는 서버 재시작 후system.detached_parts에broken-on-start_patch-...항목이 생겼습니다. #93132를 해결했습니다. #102103를 해결했습니다. #104353 (Groene AI).HTTP인터페이스 및INSERT SELECT FROM input에 대해input_format_max_block_wait_ms를 사용하는 streamingINSERT를 수정하여, 요청이 끝나기 전에 부분 입력 block이 flush되도록 했습니다. #104534 (Alexey Milovidov).JOIN이후ORDER BY ... LIMIT와arrayJoin을 함께 사용하는 쿼리가 조용히 0개의 행을 반환할 수 있던 버그를 수정했습니다. 함수 평가를SortingStep위로 끌어올리는 쿼리 계획 최적화는, 끌어올린 표현식에arrayJoin이 포함된 경우 더 이상 적용되지 않습니다.arrayJoin은 행 수를 변경할 수 있기 때문입니다. #82279를 종료합니다. #104558 (Groene AI).MergeTree계열 테이블이 제거되는 과정에서 드물게 발생하던 server abort를 수정했습니다. 이 abort는 background-job scheduler가 완전히 중지되기 전에shutdown에서 예외가 발생할 때 일어날 수 있었습니다. 이 짧은 시점에 background task가 실행되면, 부분적으로 파괴된 storage object를 통해 virtual call을 dispatch하면서__cxa_pure_virtual에 도달할 수 있었습니다. #104561 (Groene AI).- null value를 포함하는 type hint와 결합된
JSON복합 subcolumn에서 결과가 일관되지 않던 문제를 수정했습니다. #104584 (Pavel Kruglov). - aggregate projection에 서로 다른
IN (...)조건을 가진 여러sumIfaggregate가 포함된 경우, 잘못된 결과가 반환되거나 projection이 누락되던 문제를 수정했습니다. #104765 (Jimmy Aguilar Mena). JOIN ON내부에서 사용된arrayJoin()의 행 수 계산이 잘못되던 문제를 수정했습니다. 결과가 배열 길이만큼 한 번 더 곱해지고 있었습니다. #104785 (Shaohua Wang).- 부호 있는 정수 타입이 0을 지나는 경우
deltaSumTimestamp가 잘못된 결과를 반환하던 문제를 수정했습니다. #104750을 해결합니다. #104830 (Konstantin Bogdanov). - NULL 상수와 함께 filter push-down이 수행된 뒤 UnionStep에서 block structure 불일치가 발생하던 문제를 수정했습니다. #104821를 종료합니다. #104853 (Pavel Kruglov).
- 새로 ATTACH된
Iceberg,DeltaLake, 또는Hudi테이블의 메타데이터 파일이 손상되었거나 로드할 수 없는 경우DELETE FROM이 발생시키던Logical error: 'Metadata is not initialized'를 수정했습니다. 이제는 일반적인 사용자 대상 예외가 보고되며, server는 계속 실행됩니다. #104891를 종료합니다. #104917 (Groene AI). - 구성 변경 시
max_memory_usage_soft_limit가 on-the-fly로 업데이트되지 않던 문제를 수정했습니다. soft memory limit는 시작 시 한 번 계산된 뒤 캐시되었기 때문에, 이후 구성 다시 로드는 효과가 없었습니다. 이 수정 이후에는 구성이 다시 로드될 때마다 제한이 다시 계산되어 즉시 적용되며, Keeper 재시작이 필요하지 않습니다. #104940 (Kai Zhu). - macOS에서 JIT symbol resolution을 수정하여 sort, 표현식, aggregate JIT 컴파일이 더 이상
CANNOT_COMPILE_CODE: Could not find symbol _<name>오류로 실패하지 않도록 했습니다. #104946 (Alexei Fedotov). - 새로운 분석기에서
optimize_skip_unused_shards_rewrite_in이 활성화된 상태로SELECT ... FROM <Distributed table> WHERE/HAVING/GROUP BY ... (sharding_key_column IN tuple())형태의 쿼리를 실행할 때 발생하던 예외(벡터 하드닝에서의Received signal 6 (abort)로 나타나며, 빈 벡터에 대한Tuple::back()으로 관찰 가능)를 수정했습니다. #104966 (Alexey Milovidov). - 디버그 / sanitiser 빌드에서
CREATE TABLE t (c0 Int CODEC(not((not(materialize(1), materialize(2)))), ZSTD)) ENGINE = Memory와 같은 쿼리로 발생하던Logical error: 'Inconsistent AST formatting'서버 중단(STID 1941-1bfa)을 수정했습니다. 이제 포매터는CODEC/STATISTICS/BACKUP_NAME인수 목록 내부(연산자 형식(a, b)를 사용할 수 없는 위치)에 있는 다중 인수tuple(...)함수 호출 주위에 불필요한 바깥 괄호를 더 이상 출력하지 않으므로, 포맷-파싱-포맷 round-trip이 안정적으로 유지됩니다. #104991 (Groene AI). - 25.8에서 생성되었고 별도의
ALTER TABLE ... ADD COLUMN으로 추가된 컬럼에 대한 스킵 인덱스를 포함한 파트에서ALTER TABLE ... MATERIALIZE INDEX실행 시 발생하던NOT_FOUND_COLUMN_IN_BLOCK을 수정했습니다. 이제 mutation은 강제 재계산 중 해당 파트에 이미 존재하는 모든 스킵 인덱스와 프로젝션에 필요한 모든 컬럼을 올바르게 읽습니다. #104872를 닫습니다. #105039 (Groene AI). enable_materialized_cte를 사용하는 쿼리에서 발생하던 두 가지 형태의LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized를 수정했습니다. (1) 다른 materialized CTE에 대한IN (subquery)로 필터링되는 재사용 materialized CTE, (2) 직접 참조되는 동시에 중첩된 IN-subquery를 통해 MergeTree 프라이머리 키에 도달하는WHERE ... IN (...)필터 내부에서도 참조되는 materialized CTE입니다. 동일한 쿼리에 대한EXPLAIN도 영향을 받았는데, 이 버그들이 계획 최적화 중 발생했기 때문입니다. #101940, #102320을 닫습니다. #105041 (Dmitry Novik).Float32컬럼에 대한countminstatisticsPREWHEREselectivity 추정을 수정했습니다. 두 가지 버그 때문에countminstatistics가Float32컬럼에 대해 잘못된 추정값을 조용히 생성하고 있었습니다.ConditionSelectivityEstimator는 컬럼 타입(Float32)이 리터럴 타입(Float64)보다 더 좁을 때 statistics를 완전히 건너뛰어 기본 selectivity로 되돌아가고 스케치를 무시했으며,StatisticsCountMinSketch::estimateEqual는Field객체의 처음 N바이트를 해시했지만Field는Float32를Float64로 저장하므로(NearestFieldType<Float32>=Float64), 쿼리 시점에 사용된 바이트 패턴이 빌드 중 저장된 실제Float32바이트와 달랐습니다. #105047 (Han Fei).ENGINE없이 스토리지 절(ORDER BY,PARTITION BY,PRIMARY KEY,SAMPLE BY,TTL,UNIQUE KEY또는 엔진SETTINGS)을 지정하는ATTACH TABLE name <clauses>;쿼리는, 저장된 정의로 테이블을 조용히 다시 ATTACH하고 사용자 지정 절을 무시하는 대신 이제BAD_ARGUMENTS를 발생시킵니다. 쿼리 수준 세션SETTINGS(log_comment등)는 계속 적용됩니다. 저장된 metadata로 다시 ATTACH하려면ATTACH TABLE t;를 사용하고, 설정을 변경하려면ATTACH후ALTER TABLE t MODIFY SETTING ...를 사용하십시오. #105068 (Groene AI).- 집계 함수가 자체 state를 반환하는 컬럼(예:
uniqStateOrDefaultState,sumStateOrDefaultState,uniqStateForEachState)에 대해 호출될 때runningAccumulate에서 발생하던 use-after-free를 수정했습니다. #105085 (János Benjamin Antal). - Web UI(
play.html)의 버그를 수정했습니다. 커서가 마지막의 유일한;뒤에 있을 때 쿼리를 실행하면 실제로 쿼리를 실행하는 대신 “empty query”가 표시되던 문제입니다. #105107 (Alexey Milovidov). Replicated데이터베이스 내의CREATE TABLE ... AS SELECT가system.current_roles또는system.enabled_roles를 읽을 때 발생하던LOGICAL_ERROR: 'No user in current context, it's a bug'를 수정했습니다. 이제 이 내부 DDL 워커 Context에서는 쿼리가 성공적으로 실행되며 빈 result set을 반환합니다. #105150 (Groene AI).quantileExactWeightedInterpolated,quantileDD,quantilePrometheusHistogram의 aggregate state를 복수형 대응 함수인quantilesXxxMerge와 머지할 때(또는 그 반대의 경우) 발생하던ILLEGAL_TYPE_OF_ARGUMENT를 수정했습니다. 이 3개 분위수 계열의 단수형 및 복수형 variant는 동일한 내부 aggregate state를 공유하지만 내부 이름 매핑 테이블에 등록되어 있지 않아, 함수 간 state 머지와 이 계열에 대한 함수 융합 최적화가 거부되고 있었습니다. #105189 (Groene AI).- 결과가
Date범위를 벗어나는Date32및DateTime64인수에 대해toStartOfWeek,toLastDayOfWeek,toMonday,toStartOfMonth,toLastDayOfMonth,toStartOfQuarter,toStartOfYear가 잘못된 결과를 반환하던 문제를 수정했습니다. 이제 임의의 날짜로 오버플로우되는 대신,1970-01-01이전 결과는1970-01-01로 제한되고2149-06-06이후 결과는2149-06-06으로 제한됩니다. 또한 이러한 함수가 범위를 벗어난 값을 포함한Date32또는DateTime64키에 대해WHERE절에서 사용될 때 발생하던 잘못된 쿼리 결과(잘못 가지치기된 파트 및 그래뉼)도 함께 수정했습니다. #105244 (Yarik Briukhovetskyi). - 첫 번째 인수가 모든 대안이 두 번째 인수의 유형과 호환되지 않는
Variant배열이고variant_throw_on_type_mismatch가 비활성화되어 있을 때arrayRemove에서 발생하던 logical error를 수정했습니다. 이제 함수는 이 비교를 “절대 같지 않음”으로 처리하고, 서버 측assertTypeEquality실패를 발생시키는 대신 배열을 변경하지 않은 채 반환합니다. #105248 (Groene AI). - 캐싱을 위해 디스크에 일부 디렉터리를 생성하지 못하더라도
FileCache에서 쿼리를 성공적으로 실행할 수 있도록 수정했습니다. #105250 (Den Kalantaevskii). extremes = 1인 쿼리가ExtremesTransform에서 첫 번째 청크로부터 극값 컬럼을 구성하는 도중 예외(예:MEMORY_LIMIT_EXCEEDED)를 만나면 발생하던Assertion 'px != 0' failed에 따른 서버 중단을 수정했습니다. 이제 서버가 충돌하는 대신 클라이언트가 원래 예외를 받습니다. #105264 (Groene AI).- 이제
LEFT ANTI JOIN은 일치하지 않는 행에 대해 왼쪽 키 값을 복제하는 대신, 오른쪽 조인 키 컬럼을 기본값으로 올바르게 반환합니다. 이전에는SELECT a.x AS l, b.x AS r FROM a LEFT ANTI JOIN b ON a.x = b.x가 일치하지 않는 행에 대해 기본값(Int32의 경우0,String의 경우'',Nullable의 경우NULL)을 반환해야 하는데도r = a.x를 반환할 수 있었습니다. 영향받은 것은 조인 키 컬럼뿐이었으며, 키가 아닌 오른쪽 컬럼은 이미 기본값으로 올바르게 처리되고 있었습니다. 동일한 버그는 최적화기가 양쪽을 바꿨을 때RIGHT ANTI JOIN에서도 발생했습니다. #99959를 해결합니다. #105278 (Groene AI). - 기본값이 아닌
--default_database로 반복 실행할 때clickhouse-local에서 발생하던 데이터 손실 문제를 수정했습니다(예:clickhouse-local --path X -- --default_database=mydb). 영속 저장된 데이터베이스 UUID를 찾는 경로가metadata/default로 하드코딩되어 있어, 재시작할 때마다 새 UUID가 발급되고 이전 실행에서 만든 테이블이 보이지 않게 되었습니다. #101831을 해결했습니다. #105284 (Groene AI). ALTER TABLE <memory_table> APPLY PATCHES또는ALTER TABLE <memory_table> APPLY DELETED MASK를 실행할 때 발생하던 논리 오류Mutation ofMemorytable produced incomplete output를 수정했습니다.Memory테이블은 patch part나 deletion mask를 가지지 않으므로, 이제 두 명령 모두 올바르게 no-op으로 처리됩니다. #105286 (Groene AI).- 쿼리 요청에
table_id매개변수를 전달하도록 하여 Unity Catalog에서 장시간 실행되는 쿼리 문제를 수정했습니다. #105303 (Konstantin Vedernikov). distributed_group_by_no_merge=1일 때Distributed위의Merge위에 다시Merge를 사용하는 경우 발생하던CANNOT_CONVERT_TYPE를 수정했습니다. #105330 (Azat Khuzhin).- 위치 인수로 파일도 함께 지정된 경우
clickhouse local과clickhouse client가--query/-q를 조용히 무시하던 문제를 수정했습니다. 이제 두 경우 모두 일관되게BAD_ARGUMENTS를 반환합니다. #105334 (Raúl Marín). - 대상이 존재하지 않을 때
REPLACE TEMPORARY TABLE이 조용히 새 테이블을 만들던 문제를 수정했습니다. 이제REPLACE TABLE의 동작에 맞춰UNKNOWN_TABLE을 발생시킵니다. create-or-replace 동작을 유지하려면CREATE OR REPLACE TEMPORARY TABLE을 사용하십시오. #105373 (Groene AI). catalog_type = 'glue'인DataLakeCatalog데이터베이스에서 장시간 실행되는 읽기(예:INSERT ... SELECT)가, 테이블 메타데이터 로드 시점에 확보한 STS 세션 자격 증명의 만료 시간이 지나면ExpiredToken오류와 함께 실패하던 문제를 수정했습니다. 이제 AWS STS 자격 증명은 쿼리 실행 중에도 갱신되므로, 해당 읽기는 토큰 만료 이후에도 계속됩니다. #105381 (Pratima Patel).- 일부 경우
ARRAY JOIN과 함께 사용할 때 음수LIMIT BY에서 발생하던 논리 오류를 수정했습니다. #105403 (Nihal Z. Miaji). - Parquet 파일을 읽을 때
read_bytes(및system.query_log, 진행률 표시줄 등에 표시되는 파생 bytes/s)가 과도하게 계산되던 문제를 수정했습니다. 이전 구현에서는 각 청크마다 row group의 전체 압축된 크기를 보고했기 때문에, N개 컬럼 중 K개를 읽으면N / K만큼 과다 계산되었습니다. 이제는 선택한 컬럼에 대해서만 합산합니다. 또한 이전에는 데이터 파일 크기를 전혀 보고하지 않던 Iceberg 테이블의 파일 단위 진행률 추적도 수정했습니다. #105413 (Groene AI). - 플래너가
recursive_with플래그는 설정했지만WITH표현식은 없는SELECT를 생성할 때, cluster table functions(s3Cluster,urlCluster,fileCluster, …)에서 발생할 수 있던 서버 segfault를 수정했습니다. #105370을 해결했습니다. #105433 (Groene AI). count_distinct_optimization = 1일 때Nullable컬럼에서countDistinct/uniqExact의 잘못된 결과를 수정했습니다(NULL 그룹이 잘못 집계되고 있었습니다). #105439 (Raúl Marín).- 바이너리 또는 문자열 컬럼에서 손상된 중간 오프셋이 있는 Arrow 또는 ArrowStream 파일을 읽을 때 발생하던 heap-buffer-overflow와, geo 태그가 있는 Arrow 컬럼을 읽을 때 발생하던 null 포인터 역참조를 수정했습니다. #105449 (Raúl Marín).
- 윈도우
PARTITION BY에서Dynamic/Variant타입을 검증하도록 수정했습니다. 이전에는allow_suspicious_types_in_group_by가 비활성화된 경우 이를 검사하지 않았습니다. #105028 이슈를 해결했습니다. #105450 (Pavel Kruglov). - JSONStrings* 포맷에서
input_format_json_empty_as_default가 동작하지 않던 문제를 수정했습니다. #104913 이슈를 해결했습니다. #105453 (Pavel Kruglov). - 표현식 파싱 중
VALUES포맷을 통해Variant컬럼에NULL을 삽입할 때 발생하던 문제를 수정했습니다. #104909 이슈를 해결했습니다. #105455 (Pavel Kruglov). - 딕셔너리 키가 조회된 경우와 조회되지 않은 경우가 섞여 있고
short_circuit_function_evaluation이 활성화된 상태에서, 기본 인수가Nullable표현식일 때dictGetOrDefault가CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN을 발생시키던 문제를 수정했습니다. #105461 (Raúl Marín). Quoted(Values) 텍스트 리더가Map(Array(Nothing), ...)처럼 불완전하게 추론된 타입에 대해String으로 폴백할 때,Dynamic컬럼에서 값이 잘리던 문제를 수정했습니다. 이전에는 이 폴백이 원시 필드를 단순한'...'연결로 감쌌기 때문에, 내부의 작은따옴표(이러한 폴백에서는 항상 존재함)로 인해 문자열이 중간에 종료되어 값의 나머지 부분이 손실되었습니다. #105463 (Groene AI).ALTER후 압축된Memory테이블에서Dynamic서브컬럼을 읽을 때 발생하던 SIGSEGV를 수정했습니다. #104901 이슈를 해결했습니다. #105464 (Pavel Kruglov).Dynamic에 대해toFloat64/toUInt32/toString/etc.가cast_keep_nullable을 무시하던 문제를 수정했습니다. #104789 이슈를 해결했습니다. #105467 (Pavel Kruglov).WithNames포맷의 스키마 캐시 키에skip_first_lines를 포함하도록 수정했습니다. #104527 이슈를 해결했습니다. #105469 (Pavel Kruglov).GROUP BY ... WITH ROLLUP,WITH CUBE, 또는WITH TOTALS와 함께 Nullable 인수를 사용할 때,uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(및uniq에 대한 유사한 combinator chain)에서 발생하던 서버 segfault를 수정했습니다. #105470 (Groene AI).- 분석기가 활성화된 상태에서
ORDER BY ... WITH FILL INTERPOLATE와LIMIT N BY를 함께 사용할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #103474 이슈를 해결했습니다. #105481 (Yakov Olkhovskiy). - 음수(에포크 이전)
DateTime64값에서toStartOfMillisecond및toStartOfMicrosecond가 거의 1초 차이 나는 결과를 반환하던 문제를 수정하고,INT64_MIN에 가까운DateTime64입력에 대해toStartOfSecond,toStartOfMillisecond,toStartOfMicrosecond에서 발생하던UndefinedBehaviorSanitizersigned-integer-overflow도 수정했습니다. #105482 (Groene AI). - 새로운 compatibility 설정
analyzer_compatibility_prefer_alias_over_subcolumn을 추가했습니다(기본값은 비활성화). 이 설정을 활성화하면 새 분석기는 다중 구성 요소 식별자에 대해Tuplesubcolumn / dotted-column 일치보다 alias-prefix 해석을 우선 적용하여, 이전 interpreter의 동작을 복원합니다. 이로써 조인에 대해SELECT *를 사용하는 CTE/subquery의 내부 table과 이름이 같은 table을 쿼리에서 join할 때, 애스터리스크로 이름이 변경된 컬럼(예:b.id)이 내부 table 식별자를 외부 스코프로 누출시켜 발생하던AMBIGUOUS_IDENTIFIER(및 관련) 오류를 방지합니다. #105491 (Vladimir Cherkasov). - 이제 index only 최적화로 실행된 벡터 검색 쿼리는
SELECT목록에L2Distance()가 포함된 경우 올바른 값을 반환합니다. 이전에는 이 함수가 L2-squared 거리 값을 잘못 반환했습니다. 벡터 검색 쿼리 자체는 올바른 순위의 결과를 반환하고 있었으며,L2Distance()값을 명시적으로 가져와 해석하는 애플리케이션에서만 제곱된 값을 보게 되었다는 점에 유의하십시오. #105495 (Shankar Iyer). - 새로운 Kafka 테이블 엔진에서 topic 파티션 재할당 중 메시지가 잘못 처리되어, offset rollback 이후 메시지가 누락될 수 있던 드문 문제를 수정했습니다. #105500 (János Benjamin Antal).
- 본문이 correlated subquery인
MATERIALIZEDCTE를IN의 오른쪽 피연산자로 사용할 때 발생하던 예외(Trying to execute PLACEHOLDER actionlogical error)를 수정했습니다. 이제 이러한 CTE는 분석 시점에 거부되며, 이는 동일한 패턴이 CTE를FROM에서 직접 참조할 때 이미 거부되던 방식과 일치합니다. #105518 (Groene AI). - 포맷을 명시적으로 지정했을 때 stdout/stdin compression이 적용되지 않던 문제를 수정했습니다. #104441을 해결했습니다. #105528 (Pavel Kruglov).
JSON유형의singleValueOrNull역직렬화에서 발생하던 segfault를 수정했습니다. #103630을 해결했습니다. #105535 (Pavel Kruglov).clickhouse-format --backslash가INSERTVALUES데이터를 조용히 누락하던 문제를 수정했습니다. #103533을 해결했습니다. #105536 (Pavel Kruglov).variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false가 함수 실행 중 예외를 포착하지 못하던 문제를 수정했습니다. #103484을 해결했습니다. #105543 (Pavel Kruglov).JSON의 shared data에 삽입할 때input_format_try_infer_datetimes가 무시되던 문제를 수정했습니다. #103221을 해결했습니다. #105544 (Pavel Kruglov).- 작은 비정렬 입력에서
histogram이 잘못된 결과를 반환하던 문제를 수정했습니다. #103109 해결. #105548 (Pavel Kruglov). JSONExtract및 텍스트 역직렬화에서 범위를 벗어난 값을 처리할 때DateTime이 순환하던 문제를 수정했습니다. #103094 해결. #105551 (Pavel Kruglov).optimize_trivial_insert_select가 활성화되어 있을 때 테이블 함수에서 삽입 테이블을 사용하는 방식의 문제를 수정했습니다. #103083 해결. #105555 (Pavel Kruglov).- 표현식과
WHEN값이 모두NULL일 때, 일치하는THEN대신CASE표현식이ELSE브랜치를 반환하던 문제를 수정했습니다. #105556 (Raúl Marín). select의FD_SETSIZE제한에 도달해 발생하던replxx크래시를 수정했습니다(이제poll로 대체됨). 이전에는 SSH 또는 웹 터미널이 활성화된 경우 서버가 크래시될 수 있었습니다. #105559 (Azat Khuzhin).- 표현식을 실행하기 전에
executePartitionByExpression에서 서브컬럼을 구체화하도록 수정했습니다. #103057 해결. #105573 (Pavel Kruglov). TTL표현식이 서브컬럼을 참조할 때 발생하는NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #105578 (Pavel Kruglov).- HTTP 또는 네이티브 프로토콜을 통해
ENGINE절 없이CREATE TABLE ... TO INNER UUID '...'를 전송할 때,CREATE TABLE권한이 있는 모든 사용자가 유발할 수 있었던 서버 크래시(SIGSEGV)를 수정했습니다. 동일한 버그로 클라이언트도 크래시될 수 있었습니다. 이제 파서는 null 포인터를 역참조하는 대신 적절한BAD_ARGUMENTS오류를 보고합니다. #105579 (Groene AI). estimateCompressionRatio윈도 함수가 행 사이에서 누적 데이터를 잃어버리던 문제를 수정했습니다. #101738 해결. #105581 (Pavel Kruglov).- 동일한 VALUES 절에서 크기가 서로 다른 튜플을
String컬럼에 삽입할 때 발생하는 크래시를 수정했습니다. #101727 해결. #105582 (Pavel Kruglov). - 이제 Hive 파티션 값 추출은
cast_string_to_date_time_mode설정을 따르며, 기본적으로 파티션 키에서 시간대 접미사가 포함된 ISO 8601 타임스탬프(예:+0000,+00:00,Z)를 허용합니다. #105584 (Alexey Milovidov). NULL값을 포함하는 Timezone이 있는DateTime에서toString을 호출할 때 발생하는NOT_IMPLEMENTED오류를 수정했습니다. #103712 해결. #105587 (Yarik Briukhovetskyi).- 평탄화된
Dynamic컬럼의Native역직렬화에서 발생하는 OOB 읽기를 수정했습니다. #105666 (Pavel Kruglov). - 결과 유형이
Variant이고, 두 번째 또는 세 번째 분기가Int64에 들어가는UInt64리터럴에 대한 상수 조건if인if표현식의 쿼리 계획 수립 중 발생하던LOGICAL_ERROR(Unexpected return type from if)를 수정했습니다. #105649를 해결합니다. #105680 (Groene AI). - 다른 writer(예:
icebergLocal/icebergS3테이블 함수)가 해당 설정 없이 테이블을 갱신한 뒤iceberg_use_version_hint = 1로 Iceberg table을 읽을 때 잘못된 결과가 반환되던 문제를 수정했습니다. 이제version-hint.text파일이 존재하면 모든 writer가 이를 동기화된 상태로 유지하므로, 이후 힌트를 사용하는 reader는 최신 snapshot을 볼 수 있습니다. #105682 (Groene AI). use_query_condition_cache = 1(기본값)일 때SELECT쿼리에서 개수가 실제보다 적게 집계되지만 별도 오류는 표시되지 않던 문제를 수정했습니다. bloom-filter 스킵 인덱스가 있는 컬럼에 대해PREWHERE pk_prefix = X WHERE non_pk IN (...)형태의 쿼리가pk_prefix = X프레디케이트에 대한QueryConditionCache를 오염시켜, 이후 정상적인SELECT count() ... WHERE pk_prefix = X가 실제보다 적은 잘못된 결과를 반환했습니다. 모든 26.x releases에 영향을 주었습니다. #104781. #105686 (Groene AI).- 여러 개의 서로 다른 값을 이미 관측한 state를 머지할 때
singleValueOrNullMerge가NULL대신 구체적인 값을 반환하던 문제를 수정했습니다. #105734 (Minh Vu). - 잘못된 행을 처리한 뒤
Template입력 형식의 오류 복구가 제대로 동작하지 않던 문제를 수정했습니다. #105735 (Yue Ni). - collection 이름이 비어 있거나 NUL 바이트를 포함할 때
mongodb테이블 함수, MongoDB 스토리지, MongoDB 딕셔너리 소스에서 발생하던 크래시를 수정했습니다. #105776 (Raúl Marín). - 쓰기 실패 후
Keepersnapshot 정리 동작을 수정하여, 부분 snapshot이 안전하게 정리되고 실패한 쓰기를latest_snapshot_meta를 앞당기지 않고 재시도할 수 있도록 했습니다. #105779 (Antonio Andelic). - 명시적으로 지정된
SummingMergeTree및CoalescingMergeTree의columns_to_sum컬럼에 대해ALTER TABLE ... CLEAR COLUMN이 거부되던 문제를 수정했습니다. #105785 (Antonio Andelic). - 데이터베이스 이름을 쿼리 매개변수로 전달하는 parameterized view를 생성할 때, 예를 들어
CREATE VIEW {db:Identifier}.v AS SELECT {p:UInt64}와 같은 경우DatabaseCatalog::tryGetDatabase에서 assertion이 발생하고(release 빌드에서는 그 결과UNKNOWN_DATABASE오류가 발생) 하던 문제를 수정했습니다. 이제CREATEstatement의 DDL 부분에 있는 매개변수는 생성 시점에 치환되며, SELECT 본문에 있는 매개변수는 view 호출 시점에 계속 치환할 수 있습니다. #105799 (Groene AI). - 집계 상태가 직렬화될 때(예: 병렬 레플리카, binary-state formatter를 통한
sumMapState, external aggregation)Nested(... Nullable(Decimal(P, S)))컬럼에 대한sumMap및sumMapWithOverflow에서 발생하던Bad get: has Decimal32, requested Decimal128문제를 수정했습니다. #105816 (Groene AI). ALTER MODIFY COLUMN ... LowCardinality(...)뮤테이션보다 앞서 대기 중인 on-flyUPDATE/DELETE뮤테이션이 큐에 있는 테이블에서apply_mutations_on_fly = 1을 사용할 때 발생하던Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinality오류를 수정했습니다. #105847 (Raúl Marín).- 이제 Iceberg 쓰기에서
Nullable(T)파티션 컬럼의 NULL 값이 보존됩니다. 이전에는 ClickHouse가 기록한 NULL이 Spark 또는 다른 Iceberg reader에서 다시 읽을 때 내부 유형의 기본값(int의 경우0)으로 나타났습니다. #105852를 해결했습니다. #105862 (Groene AI). IN (subquery)프레디케이트에 대한Parquet및ORC필터 pushdown을 수정하여file,url,s3및 object-storage 읽기에서 row-group/page/bloom-filter 프루닝이 동작하도록 했습니다. #105863 (Arsen Muk).- 새 분석기에서
Merge테이블의 read-in-order를 수정했습니다. #105867 (Nikolai Kochetov). - 단일 delete file이 여러 data file을 참조하고, 그러한 delete file 여러 개가 동일한 data file에 적용될 때 Iceberg v2 merge-on-read position deletes가 잘못된 행을 반환하던 문제를 수정했습니다. 이제 streaming reader(
use_roaring_bitmap_iceberg_positional_deletes = 0)는 Parquet row-group 프루닝에 의존하지 않고 C++에서file_path를 기준으로 delete-file 행을 필터링하여 오름차순 positions 불변식을 복원합니다. #105888 (Groene AI). - 새 분석기에서
IN Array(...)필터를 사용하는 분산 쿼리에 대해 발생하던Cannot find column오류를 수정했습니다. #105894 (Nikolai Kochetov). STATISTICS가 있는 컬럼이 다른ALTER에 의해 동시에 삭제될 때,MergeTree테이블에서ALTER TABLE ... MODIFY COLUMN ... Nullable(...)수행 시 발생하던 SIGSEGV를 수정했습니다. #105912를 해결했습니다. #105917 (Groene AI).- PostgreSQL에서 읽는 쿼리, 즉 postgresql 테이블 함수, PostgreSQL 테이블 엔진 또는 PostgreSQL 소스를 사용하는 딕셔너리를 통한 쿼리가 취소되었을 때(예: KILL QUERY), 원격 PostgreSQL 쿼리 취소에 실패하면 발생할 수 있던 서버 크래시를 수정했습니다. #105949 (Rory Shanks).
- handler 인수가 단일 공백으로 구분되도록
SYSTEM INSTRUMENT ADDformatting을 수정하고, 값이 3개 이상인 잘못된SLEEPinstrumentation 인수 목록이나 최소값이 최대값보다 큰 범위를 거부하도록 했습니다. #105984 (Pablo Marcos). - outer join 뒤에 오는 inner join이 outer join의 null-supplying side를 참조하는 쿼리에서 잘못된 결과가 나올 수 있던 문제를 수정했습니다. join 재정렬 과정에서 inner join 조건을 outer join의 ON 절로 끌어오는 실행 계획이 선택될 수 있었습니다. #105992 (Vladimir Cherkasov).
- 쿼리에 지나치게 큰 문자열 리터럴이 포함되어 전송될 때 발생할 수 있던 크래시를 수정했습니다. #105996 (Nikita Taranov).
ORDER BY에서 정렬 접두사와 함께INTERPOLATE ()(비어 있음)를 사용하고use_with_fill_by_sorting_prefix가 활성화된 경우 발생하던INVALID_WITH_FILL_EXPRESSION예외를 수정했습니다. 이제 정렬 접두사 컬럼은 암시적 보간 집합에서 올바르게 제외되며, 명시적으로 이름을 지정한INTERPOLATE (col)와 동일하게 동작합니다. #106001 (Yakov Olkhovskiy).Bool파티션 키에서ALTER TABLE파티션 작업이 조용히 실패하던 문제를 수정했습니다. #101722를 해결했습니다. #106004 (Pavel Kruglov).- 기본값이 있는 타입 지정
JSON경로에서JSONExtractRaw및JSONHas가 올바르게 동작하지 않던 문제를 수정했습니다. #101721를 해결했습니다. #106005 (Pavel Kruglov). - 데이터 레이크 구성에서 비어 있는 basepath에 잘못
'/'접두사가 추가되던 문제를 수정했습니다. #105989를 해결했습니다. #106013 (thewisenerd). DETACH+ATTACH를 수행한 뒤 또는 서버 재시작 후IcebergLocal테이블 엔진이 읽기 전용이 되어, 이후 모든INSERT가Local object storage Local is readonly. (READONLY)와 함께 실패하던 문제를 수정했습니다. #106016 (Groene AI).- 새 요청 디스패처 응답 큐가 응답 스레드가 시작되기 전에 가득 차면서 팔로워 catch-up 중
Keeper장애가 발생하던 문제를 수정했습니다. #106049 (Antonio Andelic). - 기존 분석기와의 호환성을 개선했습니다. 테이블에
x.a Array, x.b Array, x String같은 컬럼이 있는 경우ARRAY JOIN x에서 배열을 우선 사용합니다. #106069 (Nikolai Kochetov). - 객체 metadata에 blob ETag가 포함되지 않아 Azure Blob Storage(예: Azure 기반 Delta Lake 테이블)에서 파일 시스템 캐시가 조용히 비활성화되던 문제를 수정했습니다. #106091 (thewisenerd).
- 부분적인
SHOW DICTIONARIESrevoke가 있을 때system.dictionaries가 0개의 행을 반환하던 문제를 수정했습니다. #106105 (Pavel Kruglov). allow_experimental_delta_kernel_rs가 활성화된 상태에서 잘못된 바이트를 포함한 자격 증명 또는 옵션으로 DeltaLake 테이블을 쿼리하면 서버가 충돌하던 문제를 수정했습니다(Rust FFI가extern "C"경계를 넘어 패닉을 일으킴). #106109 (Raúl Marín).ORDER BY에(c0 / -42)또는intDiv(c0, -42)같은 단조 감소 함수가 포함된 테이블에 대한 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. 기반 컬럼에 대한 프레디케이트(예:c0 < 0)가 일치하는 행이 포함된 그래뉼을 잘못 가지치기해 결과가 누락될 수 있었습니다. #106084를 해결했습니다. #106124를 해결했습니다. #106080를 해결했습니다. #106136 (Nihal Z. Miaji).MATERIALIZED VIEW정의에서WASMSQL UDF를 사용할 수 있도록 지원을 수정했습니다. #106161 (Yue Ni).- Iceberg 파티션 프루닝이 이제 분석기가 스칼라 서브쿼리 결과를 소스 타입과 대상 타입이 같은 내부
_CAST(Const, 'TargetType')로 감싸는 경우에도WHERE partition_col = (SELECT ... FROM ...)필터를 올바르게 처리합니다. 이전에는 이러한 필터로 인해 파티션 프루닝이 비활성화되어 full table scan이 트리거되었습니다. #106204 (Groene AI). - clickhouse local의
--query_id매개변수가 사용자 지정 query id를 지정할 수 있도록 수정했습니다. #106205 (Yue Ni). S3디스크 및 객체 스토리지에서 멀티파트 업로드로 기록된 객체에 S3 storage class(s3_storage_class/s3_storage_class_name)가 적용되지 않던 문제를 수정했습니다. 이로 인해 큰 객체가 기본STANDARD클래스로 생성되었습니다. 이제 이 옵션 이름은 디스크, 객체 스토리지, backups에서s3_storage_class와s3_storage_class_name모두 사용할 수 있습니다. #106214 (Alexey Milovidov).nuraft_max_log_gap_in_stream설정이 기본값이 아닌 값으로 설정된 경우(기본값은 0이며, 즉append_entriesrequests의 파이프라이닝을 비활성화함) Keeper가 시작 중 간헐적으로 멈추는 문제를 수정했습니다. #106220 (Michael Kolupaev).- 손상된
DDSketch집계 함수 상태(bin keys)를 잘못된 데이터로 허용하는 대신 삽입 시 검증하도록 수정했습니다. #106236 (Yarik Briukhovetskyi). - 서브쿼리가 in-order 설정을 재정의할 때 coordinator 모드가 일치하지 않던 문제를 수정했습니다. #106243 (Nikita Taranov).
- 프레디케이트가 상위에 적용된 상태에서
Distributed테이블을Merge테이블 또는merge테이블 함수를 통해 쿼리할 경우optimize_skip_unused_shards가 적용되지 않고,force_optimize_skip_unused_shards가 잘못 실패하던 문제를 수정했습니다. #106250 (Nikolai Kochetov). - 이전 분석기에서
SELECT목록의ORDER BY열에 별칭이 지정된 경우INTERPOLATE ()가INVALID_WITH_FILL_EXPRESSION을 발생시키던 문제를 수정했습니다. #106248을 닫습니다. #106252 (Yakov Olkhovskiy). - 잘못된 형식의
AggregateFunction(uniqTheta, ...)상태를RowBinary입력 또는 query parameter에서 역직렬화할 때 abort가 발생하던 문제를 수정했습니다. 이제 잘못된 입력은std::exception으로 빠져나가abortOnFailedAssertion을 통해 프로세스를 중단시키는 대신CORRUPTED_DATA로 거부됩니다. #106260 (Groene AI). RowBinaryWithNamesAndTypes타입 디코딩 중(input_format_binary_decode_types_in_binary_format = 1) 범위를 벗어난IntervalKind바이트를, 이후 해시 경로에서 undefined behavior를 일으킬 수 있는 잘못된 kind의DataTypeInterval을 생성하는 대신, 명확한INCORRECT_DATA오류로 거부하도록 수정했습니다. #106261 (Groene AI).26.1+에서SLRUdowngrade 실패 시 rollback 문제를 수정했습니다.keep_free_space_ratio기능의System/Datacache 분할 우선순위도 수정했습니다. #106286 (Kseniia Sumarokova).- null-map이 아니라
Nullable(JSON)에서null서브컬럼을JSON경로로 읽도록 수정했습니다. #106085를 해결했습니다. #106295 (Pavel Kruglov). - Iceberg REST 카탈로그에 테이블이 포함된 경우
RestCatalog::empty가 잘못된 결과를 반환하던 문제를 수정했습니다. #106301 (Lefteris). enable_parallel_replicas,query_plan_use_new_logical_join_step,query_plan_optimize_join_order_algorithm = 'greedy'가 활성화된 상태에서, 왼쪽MergeTree테이블이 비어 있는INNER JOIN쿼리에서 발생하던 예외를 수정했습니다. #106338 (Nikolai Kochetov).- 가수부 시프트가 1비트 어긋나 발생하던 비정규
Float16값의Float32변환 오류를 수정했습니다(예: Numpy.npy파일에서 읽을 때). #106343 (Joanna Hulboj). - 제약 조건 기반 최적화(
optimize_using_constraints)를 상관 서브쿼리와 함께 사용할 때 발생할 수 있던 크래시와NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #106349 (Raúl Marín). - 모든 배열이 비어 있고 키가 상수가 아닐 때 컬럼을 해시하는 과정에서
sipHash64Keyed,sipHash128Keyed,sipHash128ReferenceKeyed에 발생하던 경계 밖 읽기를 수정했습니다. #106355 (Raúl Marín). SYSTEM RELOAD CONFIG가 엔드포인트별 Azure Blob Storage 설정(use_native_copy등)을 유실하던 문제를 수정했습니다. 이로 인해 서버를 재시작하기 전까지 디스크에 구성된 설정값이BACKUP/RESTORE에서 무시되었습니다. #106357 (Julia Kartseva).- 캡처 그룹이 없는 pattern에서
regexpExtract(haystack, pattern)이INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE를 발생시키는 대신 전체 일치 항목을 반환하도록 수정했습니다. #106374 (Groene AI). - 목록 조회와 읽기 사이에 원격 S3 객체가 더 짧은 내용으로 덮어써질 때, 캐시 사전 다운로드 중 발생하던
LOGICAL_ERROR예외를 수정했습니다. #106375 (Nikita Fomichev). - 파일 시스템 캐시의 메모리 사용량 증가 문제를 수정했습니다. #106387 (Kseniia Sumarokova).
- Arrow IPC 포맷 리더(
ArrowColumnToCHColumn)의 여러 heap 경계 밖 읽기 문제를 수정했습니다. 잘못된 Arrow 파일은 버퍼에 들어 있는 것보다 더 많은 행을 선언하거나, list/struct/map child 길이를 부모와 일치하지 않게 선언하거나, 단조 증가하지 않는 list offsets를 제공하거나, child 유효성 비트맵을 잘라낼 수 있으며, 이로 인해 heap 할당의 끝을 넘어 읽기가 발생할 수 있었습니다. 이 문제는SELECT권한이 있는 모든 사용자가file(),format(), 테이블 함수 또는 ArrowFlight 입력을 통해 유발할 수 있습니다. 이제 raw pointer에 접근하기 전에 모든 데이터, offsets, view-struct, 유효성 비트맵 버퍼를 검증하며, list/struct/map 형태와 offsets의 일관성도 확인합니다. #106395 (Raúl Marín). - 갱신 가능 구체화 뷰의 REPLACE 대상이 복제된 또는 Shared 데이터베이스에서 수집될 때, 해당 materialized view가 백업을 시작한 레플리카에 아직 인스턴스화되지 않은 경우
FILE_DOESNT_EXIST로 인해 백업이 실패하던 문제를 수정했습니다. #106411 (Julia Kartseva). - mutation (
DELETE/UPDATE) 프레디케이트에, 또 다른 서브쿼리 안에 중첩된 기본 테이블 표현식에서 읽는IN/EXISTS서브쿼리가 포함될 때 발생할 수 있는 논리 오류Column identifier ... is already registered를 수정했습니다. #106414 (Alexey Milovidov). - 조인 그래프에서 두 릴레이션이 같은 컬럼명을 공유할 때, 병렬 레플리카로 실행되는 join에서 발생할 수 있던 조인 순서 최적화기의 논리 오류(
Left and right columns have same names)를 수정했습니다. #106418 (Alexey Milovidov). NaN또는 무한대 포인트 좌표가 포함된 소스 데이터로 polygon dictionary를 생성할 때 발생하던 논리 오류를 수정했습니다. 이제 이러한 좌표는 명확한 오류와 함께 거부됩니다. #106423 (Alexey Milovidov).system.query_log의used_privileges및missing_privileges컬럼에 다른 사용자, 데이터베이스 또는 세션의 이전 무관한 쿼리에서 유출된 권한 문자열이 포함될 수 있던 버그를 수정했습니다. #106425 (Alexey Milovidov).- 이제
base58Encode,base58Decode,tryBase58Decode함수는 큰 입력에 대해서도max_execution_time과 쿼리 취소를 준수하며, 매우 오랫동안 실행되는 대신 10 KB를 초과하는 입력을 거부합니다. 이 제한은 새로운 설정function_base58_max_input_size로 구성할 수 있습니다(0은 비활성화). #106428 (Alexey Milovidov). read_in_order_use_virtual_row_per_block = 1과 작은max_block_size를 사용해 wide parts를 역순으로 읽을 때ORDER BY ... DESC쿼리에서 간헐적으로 잘못된 결과가 발생하던 문제를 수정했습니다. #106429 (Vladimir Cherkasov).- Parquet V3 native reader를 사용할 때,
SELECT목록에 없는 컬럼에 대한IS NOT NULL이 포함된 복합WHERE로 Iceberg 또는 S3 table을 쿼리하면 발생하던NOT_FOUND_COLUMN_IN_BLOCKexception을 수정했습니다. #106443 (Shaohua Wang). - 이름이 지정된 컬렉션을 사용해
HTTPDictionary의 헤더를 지정할 수 있도록 했습니다. #106459 (Jan Rada). CurrentThread::attachToGroup가 중간에 실패한 뒤 worker thread가 오래된 thread group에 attached 상태로 남아, 이후 같은 thread에서 실행되는 작업이Thread is already attached to a group오류와 함께 실패할 수 있던 경우를 수정했습니다. #106462 (Mikhail f. Shiryaev).- 벡터 검색 쿼리가 벡터 인덱스를 사용하면서
minmax같은 다른 스킵 인덱스와use_skip_indexes_on_data_read = 1을 함께 사용할 때 발생하던 exception을 수정했습니다. #106473 (Shankar Iyer). - 손상된
Avro데이터를 역직렬화할 때 범위를 벗어난 읽기와 중단을 일으키는 대신, 잘못된 형식의Avroenum 값은 이제 검증되며 오류와 함께 거부됩니다. #106476 (Miсhael Stetsyuk). _file또는_path필터를 사용해 Iceberg tables에서 읽을 때 progress 보고가 과도하게 집계되던 문제를 수정했습니다. 이전에는 필터링 여부와 관계없이total_bytes_to_readprogress에 매니페스트의 모든 파일이 포함되었습니다. #106491 (Pedro Ferreira).STORAGE_TYPE 'simple'과cache/direct레이아웃, 그리고 단일 문자열(복합) 키를 사용하는 Redis Dictionaries에서 발생하던Bad cast exception을 수정했습니다. 이제 이러한 Dictionaries는 정상적으로 동작하며,simple스토리지의 복합 키는 명확한 오류를 보고합니다. #106501 (Vladimir Cherkasov).f(const)가 NaN으로 평가될 때, 예를 들어 음수 상수에 대해ORDER BY sqrt(c0)를 사용하는 경우ORDER BY f(c0)가 있는 테이블에서WHERE c0 = const가 행을 전혀 반환하지 않던 잘못된 결과 버그를 수정했습니다. 프라이머리 키 분석이 모든 granule을 잘못 가지치기했으며, 후속 쿼리의 쿼리 조건 캐시까지 오염시켰습니다. #106507 (Groene AI).- 동률을 판단할 때
LIMIT WITH TIES및 소수형LIMIT WITH TIES가ORDER BY ... COLLATE의 Collation을 따르지 않던 문제를 수정했습니다. Collation에 따라 동일한 행(예: numeric Collation에서'1'과'01')을 바이트 단위로 비교해 일부 동률 행이 결과에서 잘못 제외되고 있었습니다. #106539 (Nihal Z. Miaji). - 정렬 순서 기반
DISTINCT와 정렬 순서 기반LIMIT BY최적화(음수LIMIT BY포함)가 Collation이 적용된 정렬 입력(ORDER BY ... COLLATE)에서 잘못된 결과를 반환하던 문제를 수정했습니다. Collation에 따라 같은 행(예: case-insensitive Collation에서'a'와'A')은 Collation 키 기준으로 정렬되므로 값 기준으로는 인접하지 않을 수 있어, 이제 collator를 사용하면 in order 최적화를 건너뜁니다. #106564 (Nihal Z. Miaji). - 암시적
_minmax_count_projection, 명시적 aggregate projection 또는 일반 projection이 있는 테이블에서SELECT c, count() FROM t WHERE c GROUP BY c가 잘못된 결과를 반환하던 문제를 수정했습니다. 이전에는 모든 그룹이 상수 키와 전체 행 수를 가진 단일 행으로 합쳐졌습니다. #106590 (Groene AI). - 두 번째 인수가 비상수 tuple인 경우
IN의 첫 번째 인수에서 스칼라 서브쿼리를 사용할 수 없던 버그를 수정했습니다. #106610 (Yarik Briukhovetskyi). Memoryengine에서 행별 데이터에 영향을 주지 않는ALTER TABLE <memory_table>명령, 즉APPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTION,REWRITE PARTS를 실행할 때 발생하던Mutation ofMemorytable produced incomplete output예외를 수정했습니다.Memory테이블은 이러한 구조를 소유하지 않으므로, 이제 이런 명령은 no-op으로 처리됩니다. #106621 (Groene AI).LowCardinality(DateTime)컬럼을 형식(CSV, TSV, JSONEachRow 등)으로 직렬화할 때session_timezone이 무시되던 문제를 수정했습니다. 이전에는 서버에서LowCardinality(DateTime)컬럼이 한 번 기록된 뒤, 이후 해당 컬럼을 기록하는 모든 쿼리가session_timezone과 관계없이 처음 관찰된 시간대의 wall-clock 문자열을 출력했습니다. #106634 (Groene AI).multiIf내부의 애스터리스크를 테이블 함수 인수로 전달하는 쿼리(예:numbers(multiIf(*, ...), 2))에서 발생하던LOGICAL_ERROR“Trying to get name of not a column:ExpressionList”를 수정했습니다. 이제 이 쿼리는 확인할 수 없는 matcher를UNSUPPORTED_METHOD로 거부합니다. #106647 (Groene AI).MergeTree테이블에 그래뉼이 0개인 skip-index 파트가 있고 디스크에 비어 있지 않은 마크 파일이 있을 때,Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)오류로 서버가 시작하지 못하던 문제를 수정했습니다. #106675 (Groene AI).- 디렉터리 목록 조회에서 무한 재귀를 일으킬 수 있는 비정상적인
file글롭 패턴을 거부하도록 했습니다. 이제 최대 재귀 깊이 1000이 적용되며, 이를 초과하는 쿼리는 서버가 스택 오버플로우로 비정상 종료되는 대신TOO_DEEP_RECURSION오류를 발생시킵니다. #106676 (Groene AI). if/multiIf조건이Const(Nullable(Nothing))로 상수 폴딩될 때(예:arraySort(x -> x, [])[toNullable(1)]처럼 빈 배열에 대해 범위를 벗어난 첨자 접근),FunctionIf::executeForConstAndNullableCondition에서Bad cast from type DB::ColumnNothing to DB::ColumnVector<char8_t>와 함께 서버가 중단되던 문제를 수정했습니다. #106678 (Groene AI).- 테이블 함수
input이 쿼리에서 두 곳 이상 참조되는 non-MATERIALIZED CTE로 감싸져 있을 때 발생하던 예외'Trying to read from input() twice.'를 수정했습니다. 이제 이런 쿼리는 계획 수립 시점에 명확한INVALID_USAGE_OF_INPUT오류와 함께 거부됩니다.input은 일회성 클라이언트 스트림이므로 쿼리 계획에서 하나의 소스만 이를 소비할 수 있습니다. #106682 (Groene AI). EXPLAIN ... INSERT ... SELECT ... FORMAT ...의EXPLAIN출력에도FORMAT이 적용되도록 했으며,SETTINGS가FORMAT보다 앞에 오거나 출력 형식이Values인 경우에도 동일합니다. #101772의 후속 작업입니다. #106686 (Alexey Milovidov).- 실제로 workload 리소스에 대한 접근이 허용된 쿼리에서 드물게 잘못 발생하던
RESOURCE_ACCESS_DENIED오류(“Scheduler queue with resource request is about to be destructed”)를 수정했습니다. 이 문제는 재사용된 thread-local request 객체에 이전 request의 실패 상태가 남아 있어 발생했습니다. #106690 (Alexey Milovidov). - NATS 라이브러리의 callbacks를 통해
INATSConsumer::onMsg가 호출되는 시점과INATSConsumer객체가 파괴되는 시점 사이의 경쟁 상태를 수정했습니다. #106692 (Miсhael Stetsyuk). - 16진수 또는 8진수 이스케이프가 포함된 정규식에 대해
match,extract,extractAll,countMatches가 잘못된 결과를 반환하던 문제를 수정했습니다. #106709 (ofeliacode). - 이제 Keeper의 내부 Raft TLS가
openSSL.client.verificationMode설정을 따릅니다. 이전에는 이 설정과 관계없이 Keeper 간 Raft 통신에서 피어 인증서 검증이 항상 활성화되어 있었기 때문에none이 조용히 무시되었습니다. 이제none은 Raft 피어 인증서 검증을 명시적으로 비활성화하며, 설정이 없으면 이전과 같은 기본 보안 동작이 유지됩니다.none을 명시적으로 설정한 구성은 업그레이드 후 설정 의도에 맞게 Raft 피어 인증서 검증을 중단합니다. #106726 (Antonio Andelic). SYSTEM RELOAD CONFIG의 시작 스크립트와 관련된 논리 오류를 수정했습니다. 또한SYSTEM RELOAD CONFIG시 시작 스크립트를 로드하도록 했습니다(현재는 비공개 전용 기능). #106727 (Miсhael Stetsyuk).- 이전에 정상적으로 동작하던 집계를 깨뜨리던 변경 사항을 되돌렸습니다. 이 변경으로 인해
sumMap/-Mapcombinator가 사용자 지정 이름의 숫자 값 유형(예:SimpleAggregateFunction(sum, T)및Bool)을ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed와 함께 거부했습니다. #106729 (Nikita Fomichev). - 신뢰할 수 없는 입력으로 도달 가능한 포맷 리더의 여러 메모리 안전성 및 리소스 고갈 문제를 수정했습니다. 여기에는 네이티브 Parquet 리더의
DataPageV2definition/repetition level-length 처리에서 발생하는 힙 경계 밖 읽기, 깊게 중첩된 스키마를 가진 Parquet 파일에서의 스택 오버플로우, 그리고 GeoParquet WKB/WKT geometry 및 Avro strings/bytes를 파싱할 때max_memory_usage를 무시하던 메모리 할당이 포함됩니다. #106739 (Raúl Marín). - 확장되는 HTML 엔터티
≫⃒또는≪⃒가 포함된 문자열을 디코딩할 때decodeHTMLComponent에서 발생하던 힙 버퍼 오버플로우(서버 크래시)를 수정했습니다. 이 문제는 모든 사용자가 단일SELECT만으로 유발할 수 있었습니다. #106741 (Raúl Marín). - 스키핑 인덱스에 대해
GRANULARITY 0을 사용하는CREATE TABLE,ALTER TABLE ADD INDEX,CREATE INDEX를 명확한BAD_ARGUMENTS오류로 거부하도록 했습니다. 이전에는 디버그 빌드에서 이로 인해Inconsistent AST formatting예외가 발생했습니다. #106783 (Groene AI). - 레거시 형식의
azure_blob_storage디스크에서 endpoint 설정을 무시하던 Azure BACKUP/RESTORE 문제를 수정했습니다. #106784 (Julia Kartseva). - 키 컬럼이
LowCardinality이고 프레디케이트 상수가LowCardinality(Nullable(...))일 때,MinMaxstatistics로 파트를 가지치기하는 과정에서 발생하던Bad cast예외를 수정했습니다. #106793 (Groene AI). - 파싱 중 예외(예:
MEMORY_LIMIT_EXCEEDED)가 발생할 때 불일치한 컬럼이 생성되고, 이후LOGICAL_ERROR로 이어지던 문제를 수정했습니다. #106802 (Azat Khuzhin). keeper_server.http_control.secure_port를 구성한 뒤 HTTPS 클라이언트의 요청에 server가 HTTP 응답을 반환하던 문제를 수정했습니다. #106822 (linjiayu1025-collab).- 비ASCII 입력 바이트에 대한
parseDateTime의 logical error를 수정했습니다. #106856 (Pavel Kruglov). SHOW CREATE ROW POLICY가 다른 키워드와 일관되지 않게restrictive/permissive를 대문자가 아닌 소문자로 출력하던 문제를 수정했습니다. #106865 (Valery Petrov).UNION내의 빈 테이블 때문에UNION이 포함된 뷰에 병렬 레플리카가 적용되지 않던 문제를 수정했습니다. #106900 (Igor Nikonov).input_format_allow_errors_num > 0일 때 잘린Protobuf데이터를 읽는 과정에서 발생하던 server 크래시(SIGSEGV)를 수정했습니다. #106905 (Andrey Tsarevskiy | Андрей Царевский ).- 집계 함수 인수에
Nullable유형으로의 cast가 필요할 때,optimize_rewrite_aggregate_function_with_if최적화와 관련된 분산 쿼리에서 발생하던THERE_IS_NO_COLUMN예외를 수정했습니다. #106908 (Yakov Olkhovskiy). - 조인 키에
Tuple,Array또는Map안에 중첩된Variant또는Dynamic타입이 포함되어 있고, 조인의 오른쪽에 고유 값이 하나만 있을 때 JOIN runtime filter에서 발생하던 예외(LOGICAL_ERROR)를 수정했습니다. #106931 (Groene AI). - 가중치 배열에 큰 정수 값이 포함된 경우
arrayLevenshteinDistanceWeighted및arraySimilarity에서 발생하던 부호 있는 정수 오버플로우(정의되지 않은 동작)를 수정했습니다. 이제 가중치가 정수형이면 가중 거리를 더 넓은 정수형에 누적하므로, 큰 정수 가중치에서도 더 이상 오버플로우가 발생하지 않고 정확도가 유지됩니다. #106934 (Groene AI). - RocksDB 핸들이 해제된
EmbeddedRocksDB테이블에서TRUNCATE또는DROP을 실행할 때 발생하던 server 크래시(null 포인터 역참조)를 수정했습니다. 예를 들어 이전TRUNCATE로 데이터 디렉터리가 비워진read_only테이블에서 이 문제가 발생할 수 있었습니다. #106940 (Groene AI). urlCluster와 같은*Cluster테이블 함수에서max_streams_for_files_processing_in_cluster_functions설정값이 매우 클 때 읽기 작업 중 발생하던 예외(LOGICAL_ERROR로 보고되는std::length_error)를 수정했습니다. 이제 stream 수는 합리적인 값으로 제한됩니다. #106946 (Groene AI).- 분산 쿼리가 샤드로 전송되기 직전에 취소될 때
RemoteQueryExecutor에서 발생하던 server 크래시(DB::IConnections의 null 포인터 역참조)를 수정했습니다. #106950 (Groene AI). - 비동기 삽입 플러시(
AsyncInsertFlush) 쿼리에 대해system.processors_profile_log및system.query_log에서elapsed_us가 항상 0으로 기록되고read_rows/read_bytes가 실제보다 적게 집계되던 문제를 수정했습니다. #106982 (Christoph Wurm). - 로컬 저장 순서가 전역 순서와 다른
Mapvariant를 포함한Variant컬럼이 있는 정렬된 block을 병합할 때 발생하던 크래시(Source column is not Map/SIGSEGV)를 수정했습니다. #107011 (Groene AI). ReplicatedMergeTree테이블에 동기 삽입하는 중, 삽입된 block이 완전히 중복 제거되었고 충돌한 part의 중복 제거 노드가 이미 제거된 경우(예: 동시DROP PARTITION) 발생하던 논리 오류conflicted_part_name.has_value()를 수정했습니다. #107026 (Groene AI).- 동일한 원본 테이블에 연결된 두 개의 materialized view가 같은 대상 테이블에 기록하고, 종속 view가 그 대상 테이블을 읽는 상황에서
materialized_views_squash_parallel_inserts가 활성화되어 있을 때INSERT시 발생하던 예외(논리 오류this->visited_views == right->visited_views)를 수정했습니다. #107027 (Groene AI). UNION/INTERSECT/EXCEPT의 한 브랜치가Sparse로 직렬화된 컬럼을 읽고, 다른 형제 브랜치가 같은 컬럼을 전체 형식(full)으로 읽을 때(예: materialized view로 푸시할 때) 발생하던Block structure mismatch in UnionStep stream논리 오류(debug/sanitizer build에서는 server 중단, release build에서는Code: 49)를 수정했습니다. #107041 (Groene AI).- 쓰기 스키마와 일치하지 않는 컬럼이 있는 DeltaLake 테이블에 삽입할 때 발생하던
LOGICAL_ERROR예외를 수정했습니다(예: 서브컬럼으로 펼쳐지는Nested컬럼 또는 명시적인 컬럼 하위 집합을 사용하는 테이블 함수). 이제 이러한 삽입은 사용자에게 표시되는INCOMPATIBLE_COLUMNS오류와 함께 실패합니다. #87402을 해결했습니다. #107058 (Groene AI). - lazy materialization으로 인해 정렬 컬럼보다 다른 컬럼이 앞에 배치될 때
ORDER BY <numeric column> ... LIMIT n쿼리에서 발생하던TYPE_MISMATCH오류(“Cannot convert string … to type …”)를 수정했습니다. 이제 top-K 임계값은 올바른 정렬 컬럼에서 읽어옵니다. #107060 (Groene AI). SHOW ROW POLICIES또는SHOW MASKING POLICIES뒤에FORMAT,SETTINGS, 또는INTO OUTFILE절이 오는 경우 발생하던 구문 오류를 수정했습니다(예:SHOW ROW POLICIES FORMAT TabSeparated). #107061 (Groene AI).- 해제된 컬럼명을 서로 다른 타입의 컬럼 사이에서 다시 사용하는 복합
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a(“swap”) 처리 문제를 수정했습니다. 머티리얼라이즈된 파트에 잘못된 컬럼 타입이 기록되어 이후SELECT가Conversion between numeric types and IPv6 is not supported오류와 함께 실패하거나(debug build에서는 part 로드 중 중단) 했습니다. #107064 (Groene AI). - boundaries 배열에
NaN이 포함될 때roundDown함수가 비결정적 결과를 반환하던 문제를 수정했습니다. 동일한 입력값도 배치 내 주변 행에 따라 유한한 boundary 또는NaN을 반환할 수 있었습니다. 이제NaNboundary는 무시되므로 결과는 유한한 boundary에만 의존합니다. #107065 (Groene AI). - 보간된 분위수가 소수이지만 범위 내에 있을 때
Date및DateTime인수에 대해quantileTDigest와quantileTDigestWeighted가DECIMAL_OVERFLOW를 발생시키던 문제를 수정했습니다(예: 모든 값이 해당 타입 범위에 들어가는quantileTDigestWeighted(date, weight)). 이제 소수 결과는 결과 타입에 맞게 잘리며,quantilesTDigestWeighted와 동일하게 동작합니다. 실제로 범위를 벗어난 값은 계속 오류를 발생시킵니다. #106722을 해결했습니다. #107066 (Groene AI). - 사용자 지정 trim character set이 16자를 초과할 때
trimLeft,trimRight,trimBoth(및 별칭ltrim,rtrim,trim)가TOO_LARGE_STRING_SIZE를 발생시키던 문제를 수정했습니다. 이제 길이에 관계없이 trim set이 다시 지원됩니다. #107071 (Nikita Fomichev). Enum8/Enum16타입 정의에서 범위를 벗어난 정수 값이 조용히 잘리던 문제를 수정했습니다. 이제Enum8('a' = 200)은 조용히Enum8('a' = -56)을 생성하는 대신ARGUMENT_OUT_OF_BOUND를 발생시킵니다. #107081 (Groene AI).- 여러 행이 선행 컬럼에서 같은 값을 가질 때,
Nullable컬럼으로 정렬하는 다중 컬럼ORDER BY ... LIMIT쿼리에서 잘못된 행 순서가 발생하던 문제(및 debug build에서의LOGICAL_ERROR“Rows are not sorted with permutation”)를 수정했습니다. #107094 (Groene AI). Dynamic에 대한 JOIN으로 생성된Dynamic컬럼에서 함수를 실행할 때 발생하던LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y)를 수정했습니다(예:RIGHT/FULL JOIN의 조인되지 않은 행, 또는 join으로 디코릴레이션된 상관EXISTS서브쿼리). #107095 (Groene AI).- 구성을 다시 로드할 때 불필요하게 ZooKeeper 세션이 재생성되던 문제를 수정했습니다. #107096 (Azat Khuzhin).
- 액세스 엔터티를 새로 고칠 때 ZooKeeper 읽기 전반에 걸쳐 mutex를 유지하지 않도록 수정했습니다. #107097 (Azat Khuzhin).
adaptive_write_buffer_initial_size를 매우 큰 값으로 설정한 경우MergeTree테이블에INSERT할 때 발생하던Logical error: Too large size passed to allocator예외를 수정했습니다. 이제 adaptive write buffer initial size는 buffer의 최대값으로 제한됩니다. #107104 (Groene AI).LowCardinality멤버를 포함하는Variant상수를, key 표현식이 비단조적 결정 함수인 키 컬럼과 비교할 때 발생하던LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality)를 수정했습니다(예:sipHash64(col)에 대한minmax스킵 인덱스). #107111 (Groene AI).JOIN ... USING키에 대한 수식된 애스터리스크(t.*)를 집계 함수에 전달하고 outer JOIN의 반대편에Nullable키가 있는 경우(join_use_nulls = 0) 발생하던Bad cast from type DB::IColumn const* to DB::ColumnNullable const*logical error를 수정했습니다. #107129 (Groene AI).MODIFY SETTING/RESET SETTING과 comment 변경(예:MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123)이 함께 포함된ALTER TABLE ... ON CLUSTER배치가 leader 레플리카에만 적용되고 다른 레플리카는 서로 다른 상태로 남던 문제를 수정했습니다. 또한 위치 기반 또는 컬럼별SETTINGS의MODIFY COLUMN ... COMMENT가 로컬 comment 전용 metadata 변경으로 잘못 분류되던 문제도 수정했습니다. 이로 인해 컬럼 재정렬이 복제된 metadata에서 누락되어 레플리카 재시작 시INCOMPATIBLE_COLUMNS가 발생할 수 있었습니다. #107142 (Groene AI).- 수식된 애스터리스크 매처(예:
x.*)가 자신의 재귀 항 내부에서 이름으로 recursive CTE를 참조할 때 발생하던LOGICAL_ERROR(“Table expression … data must be initialized”)를 수정했습니다. 이제 이러한 매처는 해당 위치에서 이미 동작하던 수식된 컬럼(x.a) 또는 비수식 매처(*)와 동일하게 재귀 테이블의 컬럼으로 확장됩니다. #107144 (Groene AI). - on-fly 뮤테이션(
apply_mutations_on_fly) 또는 patch parts가PREWHERE전에 행을 필터링할 때 쿼리 조건 캐시로 인해 잘못된 쿼리 결과가 발생하던 문제를 수정했습니다.apply_mutations_on_fly = 1로 읽는 쿼리가 캐시를 오염시켜, 이후apply_mutations_on_fly = 0이고 동일한 프레디케이트를 사용하는 쿼리가 원래 읽어야 할 mark를 건너뛰어 너무 적은 행을 반환할 수 있었습니다. 동일한 수정은PREWHERE앞에 필터로 추가되는 행 수준 보안 policy에도 적용됩니다. 제한적인 row policy로 실행된 쿼리가, 이후 해당 policy 없이 동일한 프레디케이트를 사용하는 쿼리의 캐시를 오염시킬 수 있었습니다. #107145 (Groene AI). BACKUP에서AzureBlobStorage로의 복사를 수정했습니다. 백업 내부에서 데이터 파일을 복사할 때 대상 객체가 백업 디렉터리 밖에 기록되던 문제가 있었습니다. 이제S3대상의 Backup 객체 존재 여부 확인은 접두사 나열 대신 정확한HeadObject요청을 사용하므로, 비슷한 접두사를 가진 키가 잘못 일치하는 문제를 방지합니다. #107153 (Pablo Marcos).quantileExactExclusive,quantilesExactExclusive,quantileExactInclusive,quantilesExactInclusive의 부호 있는 정수 오버플로를 수정했습니다. 이 문제는 큰 범위에 걸친Int64입력에서 잘못된 결과를 생성할 수 있었습니다. #107154 (Groene AI).- 갱신 가능 구체화 뷰에
REFRESH ... DEPENDS ON <name>의존성이 있고, 그 한정되지 않은 이름이 임시 테이블 또는 CTE 이름과 일치할 때 재시작 시 server가 크래시 루프에 빠질 수 있던LOGICAL_ERROR(“Unexpected exception in refresh scheduling”)를 수정했습니다. #107156 (Groene AI). - 구성 다시 로드 시 시작 스크립트가 실행되지 않도록 했습니다. 이는 의미적으로 잘못된 동작일 뿐 아니라 사용자가 예상하지 않는 동작이며, 오류를 일으키기 쉬운 것으로 알려져 있었습니다. #107187 (Miсhael Stetsyuk).
- 사전 예약용
queue_size의 최대값에 상한을 두었습니다. #107205 (Elian Gidoni). group_by_use_nulls설정이 활성화된 상태에서grouping함수를 사용하는 쿼리에서 발생하던Argument ... of GROUPING function is not a part of GROUP BY clause오류를 수정했습니다. #107206 (Nikolai Kochetov).max_streams_for_union_step설정으로 인해 union 파이프라인이 축소될 때,optimize_read_in_order가 활성화된UNION ALL의ORDER BY결과 순서가 잘못되던 문제를 수정했습니다. 이제 계획이 정렬된 UNION output streams에 의존하는 경우 축소를 건너뜁니다. #106880을 닫습니다. #107208 (Vladimir Cherkasov).- server 종료 후반부에 프록시 구성을 확인하는 과정에서 발생할 수 있던 null pointer dereference를 수정했습니다. #107231 (Pedro Ferreira).
- non-replicated
MergeTree테이블에서 legacy parallel replicas가 활성화된 경우 lightweightUPDATE쿼리를 수정했습니다. #107246 (Groene AI). - 쓰기 block의 컬럼명이 최신 스키마의 field id와 일치하지 않는
Iceberg테이블에 삽입할 때 발생하던 server 중단(std::out_of_rangelogical error)을 수정했습니다(예: 동시 작성자가iceberg_metadata_staleness_ms범위 내에서 컬럼명을 변경한 경우). 이제는 server가 크래시되는 대신 명확한 쿼리 오류와 함께 삽입이 실패합니다. #107279 (Groene AI). max_*_thread_pool_free_size > 0인 경우 정적 스레드 풀이 idle threads를 무기한 유지해 server 및 local 종료가 멈추던 버그를 수정했습니다. #107291 (Miсhael Stetsyuk).s3테이블 함수가 소문자 위치 인수partition_strategy(예:hive)를 조용히 무시하던 문제를 수정했습니다. #107297 (Julia Kartseva).- 병렬 block 마샬링에서
low_cardinality_allow_in_native_format=0처리를 수정했습니다. #107319 (Azat Khuzhin). use_skip_indexes_for_top_k최적화가 활성화된 상태에서, 정렬 컬럼에minmax스킵 인덱스가 있는 파트의 일부 행이 경량DELETE로 제거된 경우ORDER BY <col> LIMIT n이 잘못된 결과(대개 빈 결과)를 반환하던 문제를 수정했습니다. 이제 이 최적화는 경량 삭제된 파트의 오래된 minmax를 실제 상위 행이 있는 파트보다 우선 순위에 두지 않습니다. #107320 (Groene AI).- ClickHouse Keeper에서
last_snapshot(및mntr의zk_latest_snapshot_size)을 통해 보고되는 스냅샷 메타데이터가 오래되었거나 중복된 스냅샷 설치 후 이전 상태로 되돌아갈 수 있던 버그를 수정했습니다. 이로 인해 동일한 인덱스를 가진 로컬 스냅샷이 피어로 계속 스트리밍되거나 S3로 업로드되는 도중, 등록된 스냅샷 파일을 제자리에서 덮어쓸 수도 있었습니다. #107321 (Antonio Andelic). MsgPack,BSON,ORC,Parquet,JSON,DeltaLake,Iceberg,Paimon포맷에서 매우 깊게 중첩된 스키마 또는 값을 읽을 때 발생할 수 있던 server stack 오버플로우(크래시) 문제를 수정했습니다. 이제 이러한 깊은 중첩 입력은 예외와 함께 거부됩니다. #107341 (Raúl Marín).SYSTEM SYNC DATABASE REPLICA ... STRICT에서 발생할 수 있는 logical error를 수정하고,STRICT수정자가 데이터베이스 레플리카에 실제로 적용되도록 했습니다. #107344 (Pedro Ferreira).- Delta 로그에서 컬럼 이름이 변경되거나 삭제된 뒤처럼, ClickHouse 스키마에 정의된 컬럼이 Delta 컬럼 매핑에 없는
DeltaLake테이블을 읽을 때 debug/새니타이저 빌드에서 server abort가 발생하던 문제를 수정했습니다. 이제는 대신 쿼리가 잡아서 처리할 수 있는INCORRECT_DATA오류로 실패합니다. #107347 (Groene AI). - 채우기 대상 컬럼보다 앞에 있는
ORDER BY컬럼에COLLATEcollation이 사용될 때ORDER BY ... WITH FILL이 추가 행을 생성하던 문제를 수정했습니다. 이제 행은 정렬 순서와 일치하도록 해당 collation을 사용한 sorting prefix를 기준으로 그룹화됩니다. #107365 (Groene AI). - 메타데이터 버전 간에 기존
schema-id가 다른 스키마에 다시 바인딩되는 Iceberg 테이블을 읽을 때 발생하던 크래시(debug 빌드에서는LOGICAL_ERROR)와, 조용히 잘못된 결과를 반환하던 버그(release 빌드)를 수정했습니다. 이제 이러한 메타데이터는ICEBERG_SPECIFICATION_VIOLATION으로 거부됩니다. #107370 (Groene AI). toString,concat같은 함수가 단일 비어 있지 않은 variant와 NULL을 함께 담고 있는Variant또는Dynamic컬럼에 적용되고, 함수가 입력 컬럼을 변경 없이 그대로 반환할 때 발생하던LOGICAL_ERROR(Variant N (T) has size X, but expected Y)를 수정했습니다. #107374 (Groene AI).- scalar subquery에 동일한 테이블을 읽는 중첩된 서브쿼리가 포함된 경우, 병렬 레플리카에서 발생할 수 있던
Logical error: 'Duplicate announcement received for replica number N'문제를 수정했습니다. #107381 (Groene AI). getServerSetting이system.server_settings의 보고와 일치하도록, 런타임 중 변경 가능한 server settings(max_server_memory_usage,mark_cache_size,max_concurrent_queries, 스레드 풀 크기 등)의 현재 실제 적용 값을 반환하도록 수정했습니다. #107388 (Alexey Milovidov).Decimal크기 인수를 사용하는arrayResize를 수정했습니다. 이제 크기는 원시 비스케일 표현이 아니라 실제 값으로 해석됩니다(예:arrayResize([1, 2, 3], 1.5::Decimal(2, 1))는 요소 1개를 반환합니다). #107389 (Alexey Milovidov).use_strict_insert_block_limits가 활성화된 상태에서Alias테이블에 비동기INSERT를 수행할 때 발생하던LOGICAL_ERROR(block.rows() == getRows())를 수정했습니다. #107400 (Groene AI).- 분기(부분 술어) 푸시다운 최적화가 JOIN에 의해 유형이 확장된
USING키로 조건을 푸시할 때 발생하던 논리 오류(Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8)를 수정했습니다. 또한 알 수 없는 식별자를 참조하는 상수 폴딩 가능한if/multiIf분기를 포함한JOIN ... USING쿼리에서 식별자를 해석할 때 analyzer에서 발생하던 server 크래시(세분화 오류)도 수정했습니다. #107407 (Groene AI). - 범위를 벗어난 이벤트 유형을 가진 조작된 집계 함수 상태를 finalize할 때
windowFunnel에서 발생하던 힙 버퍼 오버플로(server 크래시)를 수정했습니다. 이 문제는 단일SELECT만으로도 누구나 악용할 수 있었습니다. #107412 (uwezkhan). - 유한하지 않은 부동소수점 값(
nan또는inf등)이prometheusQuery/prometheusQueryRange테이블 함수의 timestamp/duration 인수로 전달될 때 발생하던 정의되지 않은 동작을 수정했습니다. 이제 이러한 인수는 잘못된 timestamp를 생성하는 대신BAD_ARGUMENTS를 발생시킵니다. #107417 (Groene AI). - PostgreSQL 데이터베이스 또는 테이블 이름에 대문자가 포함된 경우
MaterializedPostgreSQL이 변경 사항 복제를 조용히 중단하던 문제를 수정했습니다(pgoutputconsumer가 대소문자를 유지하는 publication과 일치하지 않는, 따옴표 없는 소문자 publication 이름을 요청했습니다). #107423 (Alexey Milovidov). - 키 표현식(
ORDER BY,PRIMARY KEY,PARTITION BY또는 skipINDEX)에 오른쪽 피연산자로 테이블이 오는IN연산자가 포함된 경우(예:ORDER BY (x IN some_table)) 발생하던 예외(Logical error: Not-ready Set is passed as the second argument for function 'in')를 수정했습니다. 이제 이러한 키 표현식은 테이블 생성 시점에 거부됩니다. #107424 (Groene AI). NULL페이로드 값을 보존하는 집계 함수(*_respect_nulls계열:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls)에 대해optimize_rewrite_aggregate_function_with_if최적화가 잘못된 결과를 반환하던 문제를 수정했습니다. 이제 이 최적화는 이러한 함수에 대해f(if(cond, x, NULL))를-If형태로 재작성하지 않습니다. #107430 (Groene AI).- 로컬 디스크 객체 스토리지 디렉터리(예:
local디스크의 Iceberg table)를 나열하는 동안 파일이 동시에 교체될 때 발생하던 잘못된filesystem error: in last_write_time: No such file or directory예외를 수정했습니다. 이제 동시에 제거된 항목은 나열을 중단시키는 대신 목록에서 생략됩니다. #107432 (Groene AI). optimize_if_transform_strings_to_enum = 1이고 최적화된 문자열 리터럴 기반if/transform표현식이 분산 테이블 또는 병렬 레플리카에서의GROUP BY또는ORDER BY키인 경우 발생하던THERE_IS_NO_COLUMN오류를 수정했습니다. #107455 (Groene AI).- distinct 키 집합을 초기화하는 도중 메모리 할당이 실패할 때(예: memory limit에 도달한 경우) 발생할 수 있었던 드문 서버 크래시를
DISTINCT처리에서 수정했습니다. #107467 (Groene AI). apply_mutations_on_fly = 1을 사용하는 테이블에서, 보류 중인 on-flyUPDATE의 대상 컬럼이 더 앞선 on-flyUPDATE에서 함수 인수로도 읽히고 그 전에ALTER MODIFY COLUMN ... LowCardinality(...)뮤테이션이 있는 경우 발생하던LOGICAL_ERROR: Unexpected return type from materialize(및 유사한 유형 불일치 오류)를 수정했습니다. #107475 (Groene AI).S3를 통해DeltaLake테이블을 읽을 때 AWS STS 자격 증명이 오래된 상태로 유지되던 문제를 수정했습니다. 이제 엔진은 스냅샷을 갱신할 때 새 자격 증명이 적용된S3클라이언트를 계속 사용하므로, 장시간 실행되는 읽기 작업이 STS 토큰의 TTL이 만료된 뒤 더 이상 실패하지 않습니다. 또한 STS assume-role 자격 증명 공급자는 이제 STS를 사용하는 모든S3접근에서 자격 증명 갱신을 올바르게 반영합니다. #107480 (Elmi Ahmadov).CREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROM,MOVE PARTITION ... TO TABLE이 일반MergeTree의 파트를ReplacingMergeTree,SummingMergeTree,AggregatingMergeTree로 가져온 뒤SELECT ... FINAL과OPTIMIZE TABLE ... FINAL이 중복 행을 반환하던 문제를 수정했습니다. 이제 소스 엔진과 대상 엔진이 다르면 가져온 파트의 머지 수준을 0으로 재설정하므로, 대상 엔진이 다음 머지에서 이를 중복 제거합니다. #107481 (Groene AI).- 길이 필드가 4보다 작은 메시지로 인해
size - 4에서 래프어라운드가 발생하고 과도한resize/ignore가 수행되던 PostgreSQL wire 프로토콜 파서의 정수 언더플로를 수정했습니다. #107485 (uwezkhan). - 이제 ReplicatedMergeTree에서 쿼럼을 기다리는 동안 쿼리 취소가 더 정확하게 추적됩니다. #107513 (Nikita Taranov).
PARTITION BY키가 있는 테이블을 쿼리할 때, 더 큰 표현식 안에 포함된IN/NOT IN서브쿼리(예:WHERE (c0 IN (SELECT ...)) != 0)로 인해 발생하던Not-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR)를 수정했습니다. #107515 (Groene AI).- 비동기 삽입 플러시 경로(
async_insert = 1)에서currentUser(),user(),SESSION_USER,authenticatedUser()가 빈 문자열로 평가되던 문제를 수정했습니다. 이 문제는 이러한 함수를 참조하는DEFAULT/MATERIALIZED컬럼 표현식과 materialized views에 영향을 주었으며, 삽입한 사용자 대신 빈 문자열이 조용히 저장되었습니다. #107541 (Groene AI). enable_analyzer = 1(기본값)일 때, 테이블이 다른 데이터베이스에만 존재하는 경우 이제 해당 이름만으로 쿼리해도 올바른 테이블을 제안합니다. 예를 들어SELECT * FROM functions를 실행하면Maybe you meant system.functions?가 표시됩니다. 이전에는 새 분석기가 힌트 없는Unknown table expression identifier오류를 반환했지만, 기존 분석기는 이미 유용한 제안을 제공했습니다. #107550 (Groene AI).- rapidjson 라이브러리(
prettyPrintJSON,JSONMergePatch, rapidjson JSON 파서)에서 사용하는 메모리를 memory tracker에 반영하도록 하여, 비정상적인 입력이 제한 없이 메모리를 할당하는 대신MEMORY_LIMIT_EXCEEDED로 거부되도록 했습니다. #107555 (Raúl Marín). optimize_prewhere_after_pushdown이 활성화된 상태에서 명시적PREWHERE와WHERE를 함께 사용해file(),url(), 또는 객체 스토리지 원본을 쿼리할 때 발생하던LOGICAL_ERROR(updateFormatPrewhereInfo called more than once)를 수정했습니다. #107568 (Groene AI).- 분산 쿼리 계획이 로컬에서 실행될 때(
make_distributed_plan+distributed_plan_execute_locally)log_formatted_queries = 1이면 발생할 수 있던 크래시(널 포인터 역참조)를 수정했습니다. #107570 (Groene AI). - 분산 계획 쿼리(
make_distributed_plan = 1)를 종료하는 과정에서 워커 상태 검사에 실패해 다음 검사를 다시 예약하지 못할 경우(예: 종료 시CANNOT_SCHEDULE_TASK또는MEMORY_LIMIT_EXCEEDED) 발생하던 서버 중단(std::terminate, signal 6)을 수정했습니다. 이제 쿼리는 정상적으로 실패하고 서버는 계속 실행됩니다. #107575 (Groene AI). - Elf 및 DWARF 파싱에 누락되어 있던 경계 검사를 추가했습니다. #107579 (Michael Kolupaev).
- ORC 리더에 누락되어 있던 경계 검사를 추가했습니다. #107580 (Michael Kolupaev).
Replicated데이터베이스 내TimeSeries테이블이 관련된RENAME TABLE,RENAME DATABASE, 또는CREATE OR REPLACE TABLE에서 발생할 수 있던 예외(Digest does not matchlogical error)를 수정했습니다. 이제TimeSeries테이블 이름 변경도 지원됩니다. #107583 (Groene AI).- MySQL 프로토콜 포트에서 인증 없이 메모리 고갈을 유발할 수 있던 서비스 거부 문제를 수정했습니다. #107599 (Shaohua Wang).
Replicated데이터베이스의TimeSeries테이블에 대한DROP TABLE문제를 수정했습니다. 이전에는 내부 테이블이 정리되지 않은 채 남고 백그라운드 삭제 작업이 무한히 재시도되어(DROP TABLE ... SYNC가 멈춤) 있었습니다. #107604 (Groene AI).- 복제된 part 가져오기 프로토콜에서 악의적인 레플리카가 part 디렉터리 외부에 파일을 쓸 수 있게 할 수 있던 두 가지 경로 순회 문제를 수정했습니다. #107606 (Antonio Andelic).
- Azure를 통해 Delta Lake table을 읽을 때 발생하던 ‘Account must be specified error’를 수정했습니다. #107620 (Smita Kulkarni).
- 일반
MergeTree테이블에서ALTER TABLE ... REPLACE PARTITION수행 후 서버를 재시작하면 교체된 part가 다시 살아나, 테이블이 대체된 행과 이전의 오래된 행을 모두 반환하던 문제를 수정했습니다. #107623 (Groene AI). - 대상이
Distributed테이블인 materialized view를enable_analyzer = 0으로 쿼리할 때 발생하던 서버 크래시를 수정했습니다. #107653 (Groene AI). - 여러 쿼터가 동일한 사용자 또는 역할에 할당된 경우, 이제는 그중 하나만 비결정적으로 선택되어 적용되는 대신 모든 쿼터가 함께 적용됩니다(하나라도 초과하면 쿼리가 거부됨). 또한
SHOW QUOTA와system.quota_usage에는 현재 사용자에게 적용되는 모든 쿼터가 표시됩니다. #107664 (Alexey Milovidov). - 키-값 인수가 중복될 때
s3및 기타 객체 스토리지 테이블 함수가BAD_ARGUMENTS대신LOGICAL_ERROR를 발생시키던 문제를 수정했습니다. 예:s3('http://...', format = 'CSV', format = 'TSV'). #107670 (Groene AI). MySQL Connector/J8.2.0 이상(9.x 포함)에서 MySQL interface를 사용할 수 없던 문제를 수정했습니다. 이제OK패킷의info필드가 MySQL server와 동일하게 길이 인코딩되어 JDBC 드라이버가 연결할 수 있습니다. #107693 (Alexey Milovidov).make_distributed_plan = 1인 쿼리에서 함수로 감싼 키를 기준으로 조인할 때, 양쪽에 공통 유형이 없으면LOGICAL_ERROR(“Input nodes size mismatch in dag”)가 발생하던 문제를 수정했습니다(예: 오른쪽 키가UInt64인ON intDiv(-1, t1.key) = t2.key). #107701 (Groene AI).- Apache Arrow Java < 19.0.0(Apache Spark 포함)에서 생성된 빈
String/Binary컬럼이 있는 Arrow/ArrowStream 데이터를 읽을 때 더 이상INCORRECT_DATA가 발생하지 않습니다. #107764 (Raúl Marín). - 쿼리에서 사전에 강제 변환되지 않은 다른 유형의 리터럴과 컬럼을 비교할 때(예:
numeric_col IN (SELECT '5')또는string_col IN (SELECT 5)),countmin컬럼 통계 추정 중BAD_GET예외(“Bad get: has String, requested UInt64”)가 발생하던 문제를 수정했습니다. #107793 (Groene AI). - 원격 테이블 구조를 추론하는 동안 브리지가 응답하지 않게 되면
odbc및jdbc테이블 함수가 몇 분 동안 멈추고 쿼리 취소(KILL QUERY,max_execution_time)를 무시하던 문제를 수정했습니다. #107809 (Alexey Milovidov). s3/gcs테이블 함수에서 위치 기반 시크릿 인수 형식과 이름이 지정된 시크릿 인수 형식을 혼용한 잘못된 쿼리를 포맷할 때 예외(Logical error: 'index >= result.start')가 발생하던 문제를 수정했습니다. 예:s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (Groene AI).LowCardinality컬럼에서 Set 스킵 인덱스가 그래뉼을 프루닝하지 못하던 문제를 수정했습니다. #107868 (Konstantin Bogdanov).- 서버 설정
insert_deduplication_version = new_unified_hash를 사용할 때String및Array컬럼에 대해 삽입 중복 제거가 잘못된 해시를 계산하던 문제를 수정했습니다. 동일한 삽입이라도 중복 제거 해시가 삽입된 블록 내 행의 위치에 따라 달라져 중복 제거에 실패할 수 있었습니다. #107915 (Sema Checherinda). - macOS(Apple Silicon)에서 여러 정렬 키를 사용하는
Nullable컬럼에 대한ORDER BY결과가 잘못되던 문제를 수정했습니다. 원인은 JIT-compiled 정렬 비교자에서 부호 확장이 누락된 것이었습니다. #107973 (Raúl Marín). - 여러 스레드로
Dynamic컬럼을 읽을 때 발생한 성능 회귀를 수정했습니다. 원인은 #100730이었습니다. #107942를 해결했습니다. #107997 (Pavel Kruglov). - 사용 중단된 데이터 레이크 설정
storage_catalog_url이 이제 카탈로그 가드에서 올바르게 거부되며(이전에는storage_catalog_type및storage_aws_access_key_id만 검사했음), 오류 메시지에는 사용 중단된 모든 설정이 나열됩니다. #108040 (Alexey Milovidov). LIKE쿼리가 희소 저장된 컬럼에 대해 direct-read 폴백 경로를 통해text인덱스에서 읽을 때 발생하던Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>logical error를 수정했습니다. #108068 (Groene AI).- 빈 batch에서도 access cache의 batch-finished 핸들러를 항상 실행하도록 수정했습니다. #108124 (Azat Khuzhin).
UNION ALL이 포함된 일부 쿼리에서 발생하던LOGICAL_ERROR(Column identifier is already registered)를 수정했습니다. #100770 (Shaohua Wang).- 서버 종료 중 workload storage mutex에서 발생하던 use-after-free를 수정했습니다. #101447 (Tuan Pham Anh).
Shared카탈로그에서ALTER DATABASE MODIFY COMMENT실행 시 발생하던 데드락을 수정했습니다. #103683 (Nikolay Degterinsky).- 이제 비어 있는 유니코드 인용 식별자는
CANNOT_PARSE_QUOTED_STRING대신SYNTAX_ERROR를 발생시킵니다. #104173 (leonard9893). timeSeries*집계 함수의 원래 매개변수 타입을 보존하여, 테이블을 다시 ATTACH할 때와 병렬 레플리카 환경에서도AggregateFunction타입이 올바르게 round-trip되도록 했습니다. #104812 (Vitaly Baranov).- 병렬 레플리카 환경에서
serialize_query_plan사용 시 materialized CTE에서 발생하던LOGICAL_ERROR를 수정했습니다. #104896 (Igor Nikonov). - staleness(윈도우) 매개변수가
INT64_MAX에 가까울 때timeSeries*ToGrid함수에서 발생하던 부호 있는 정수 오버플로우를 수정했습니다. #105319 (Groene AI). compatibility설정 값이 더 이상apply_row_policy_after_final을false로 되돌리지 않으므로,FINAL과 함께 row policy가 항상 올바르게 적용됩니다. #105637 (Yarik Briukhovetskyi).posix_spawnstub에서SETPGROUP/RESETIDS/SETSIGDEF를 올바르게 반영하도록 수정해clickhouse chdig client문제를 해결했습니다. #105858 (Azat Khuzhin).- merge/mutate 실행기가 초기화되지 않았을 때 프로젝션에 대한 merge-tree 무결성 검사 중 발생하던 예외를 수정했습니다. #105919 (Mikhail Artemenko).
- 프로젝션에 대한 인덱스 분석 중
minmax인덱스를 이제 부모 파트가 아니라 프로젝션 자체에서 로드하도록 수정하여 올바른 결과가 나오게 했습니다. #105940 (Mikhail Artemenko). materialize(monotonic_chain(...))에 대해addMonotonicChain에서 발생하던 예외를 수정했습니다. #106050 (Nikolai Kochetov).MASKING POLICY종속 항목이 포함된 백업에서RESTORE가 실패하던 문제를 수정했습니다. #106086 (Julia Kartseva).prefer_column_name_to_alias가 활성화된 상태에서 SQL 사용자 정의 함수를 확장할 때 발생할 수 있던 메모리 손상 문제를 수정했습니다. #106121 (Nikolai Kochetov).- 이제 브리지 연결을 사용하는 딕셔너리는 서버 재시작 후 연결을 다시 설정하면서 재로드됩니다. #106151을 해결합니다. #106152 (Pedro Ferreira).
LocalObjectStorage의 파일 시스템 캐시를 수정했습니다. #106239 (Kseniia Sumarokova).use_delayed_remote_source를 사용하는 테이블 함수의 지연 원격 소스를 수정했습니다. #106470 (Nikolay Degterinsky).- 그리드 시작 이전의 타임스탬프와 윈도우 범위를 벗어난 타임스탬프에 대한
timeSeriesLastToGrid문제를 수정했습니다. #106504 (Vitaly Baranov). #106577 (Vitaly Baranov). - 쿼리 매개변수가 포함된 함수 이름에서 발생하던
LOGICAL_ERROR(Inconsistent AST formatting)를 수정했습니다. #106635 (Vitaly Baranov). - 분산 실행 계획 작업의 역직렬화 전에 테이블이 삭제될 때 발생하던 logical error를 수정했습니다. #106944 (Alexander Gololobov).
NullableGROUP BY키에 정확한 비교를 사용하도록 했습니다. #107050 (Nikolai Kochetov).- 테이블 함수 인수가 컬럼 표현식이 아닐 때(예:
multiIf/CASE의 아직 해석되지 않은*matcher) 발생하던LOGICAL_ERROR(Trying to get name of not a column)를 수정했습니다. #107411 (Alexey Milovidov). - 서로 다른 잘못된 time-zone 이름이 많이 처리될 때 time-zone cache (
DateLUT)가 무제한으로 증가하던 문제를 수정했습니다. #107464 (Alexey Milovidov). - 일반
MergeTreemutation을 완료된 것으로 보고하기 전에part_log항목을 먼저 기록하도록 했습니다. #107741 (Azat Khuzhin). - 이제
arrayFold는 잘못된 입력에 대비해 배열 인수의 유효성을 검사합니다. #107932 (Michael Kolupaev). MergeTreepart의 캐시된 skip-index archive reader에서 드물게 발생하던 data race와 use-after-free 가능성을 수정했습니다. 이 문제는 쿼리가 part가 이동되거나 이름이 변경되는 동안 skip indices를 읽을 때 발생할 수 있었습니다. #107995 (Raúl Marín).PREWHERE를 사용하는Map서브컬럼의 성능 회귀를 수정했습니다. #107988 (Pavel Kruglov).- 시간대가 포함된
parseDateTimeBestEffort가toString(Nullable(DateTime64))의 NULL 행에서CANNOT_PARSE_DATETIME을 발생시키던 문제를 수정했습니다. #108310 (Yarik Briukhovetskyi). - 선택 사항인
dataset키가 빠진 명명된 컬렉션을No such key 'dataset'오류와 함께 거부하던ArrowFlight테이블 함수와 엔진을 수정했습니다. #108041 (Alexey Milovidov). - 인수가 없는 윈도 함수가
CODEC또는 엔진 선언 안에 있을 때 발생하던Inconsistent AST formatting논리 오류를 수정했습니다(예:CODEC(cume_dist() OVER (...))). 이제 이러한 함수는 괄호를 유지하므로 쿼리가 포맷/파싱 round-trip을 거쳐도 유지됩니다. #107806 (Alexey Milovidov). - 구분자가 포함된 needle에 대해
hasToken이BAD_ARGUMENTS를 발생시키지 않고 텍스트 인덱스를 통해 조용히 결과를 반환하던 문제를 수정했습니다. #108189 (Jimmy Aguilar Mena). - 이제
use_skip_indexes_on_data_read설정을compatibility설정을 통해 26.1 이전의 기본값(false)으로 되돌릴 수 있습니다. 이는 on-data-read 경로가minmax/set/bloom_filterskip-index mark-range pruning을 무력화하는 성능 회귀를 피할 수 있는 수단을 제공합니다. #108330 (egor romanov). remote/remoteSecure에 전달된 명명된 컬렉션의database/db재정의가 상수 데이터베이스 이름이 아닐 때 발생할 수 있던 크래시(null pointer dereference)를 수정했습니다. 예:remote(nc, database = (SELECT 1)). 이제는 크래시가 발생하는 대신 명확한 오류와 함께 쿼리가 실패합니다. #108271 (Groene AI).- ZooKeeper 연결이 잘못된 타이밍에 끊기면 갱신 가능 구체화 뷰가 멈추던 문제를 수정했습니다. #108234 (Michael Kolupaev).
- 값이 기본값으로 채워진
Array(Tuple(...))컬럼을 읽을 때 발생하던Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple문제를 수정했습니다. 예를 들어ALTER TABLE ... ADD COLUMN이후 또는 진행 중에 적용된 미완료ALTER TABLE ... CLEAR COLUMNmutation 이후에 발생할 수 있었습니다. #107232 (Groene AI). - 공통 상위 타입이
Dynamic인JOIN ... USING키를 명시적으로 참조해 집계 함수에 전달할 때 발생하던Bad cast from type DB::ColumnDynamic to DB::ColumnNullable논리 오류를 수정했습니다. 예:count(t.key) IGNORE NULLS. #107289 (Groene AI). - 적용되지 않은 lightweight
UPDATE패치가 남아 있는 파티션에서REPLACE PARTITION,MOVE PARTITION,DETACH PARTITION또는DETACH PART를 실행할 때 일반 비복제MergeTree에서 조용한 데이터 손실이 발생하던 문제를 수정했습니다. 이제 이러한 작업은ReplicatedMergeTree와 마찬가지로 명령을 거부합니다. #107386 (Groene AI). - 조회 인수가
LowCardinality일 때Dynamic키를 가진Map에 대해has를 사용할 경우 발생하던 크래시(release builds에서는 SIGSEGV, debug builds에서는 type-mismatch assertion)를 수정했습니다. 예:has(map('a'::Dynamic, ...), toLowCardinality('b')). #107956 (Groene AI). - 뷰의
SELECT가 생성하는 것보다 더 넓은Enum을 가진 컬럼이TO대상 테이블에 선언된 materialized view에 삽입할 때 발생하던LOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”)를 수정했습니다. 이제 유효한Enum확장이 올바르게 적용됩니다. #107648 (Groene AI). - 여러
ALIAS컬럼이 동일한 표현식으로 확장되고, 이를ORDER BY/GROUP BY/HAVING와 함께 참조할 때Distributed테이블(또는 병렬 레플리카)을 쿼리하면 발생하던NUMBER_OF_COLUMNS_DOESNT_MATCH오류를 수정했습니다. #107913 (Yakov Olkhovskiy). - 입력 문자열이 32768바이트보다 크고 어떤 문자 집합도 감지할 수 없을 때
detectCharset및detectLanguageUnknown함수에서 발생하던 정의되지 않은 동작(memcpy에 null 포인터 전달)을 수정했습니다. #108250 (Groene AI). Int64범위 한계에 가까운 극단적인DateTime64값에서hour및minute단위로dateDiff를 사용할 때 발생하던signed integer overflow(정의되지 않은 동작)를 수정했습니다. #108229 (Groene AI).- 비어 있는 병합된 파트의 text index에서 발생하던
Too many marks를 수정했습니다. #106867 (Azat Khuzhin). - 상수가 아니거나 false인 조건을 사용하는
ALTER UPDATE col = ... WHERE <cond>를 수행한 뒤,ALTER MODIFY COLUMN col <new type>를 실행한 후apply_mutations_on_fly = 1상태에서 컬럼을 읽을 때 발생하던LOGICAL_ERROR(“Unexpected return type from if”)를 수정했습니다. #108128 (Groene AI). Array(Dynamic)또는Array(Variant)를accurateCastOrNull로QBit에 캐스팅할 때 발생하던 server abort(IColumn::insertFrom의Logical error)를 수정했습니다. 예:accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (Groene AI).DESCRIBE TABLE (...) AS ...에서 subquery 뒤에 alias가 오는 경우 발생하던 syntax error를 수정했습니다. #100205 (Yarik Briukhovetskyi).- 이제
getClientHTTPHeader는 비결정적으로 올바르게 처리되므로, 그 결과가 더 이상 쿼리 결과 캐시에서 잘못 재사용되지 않습니다. #108029 (Alexey Milovidov).
빌드/테스트/패키징 개선
delta-kernel-rs를default-engine-native-tls기능과 함께 빌드해 자체 HTTP 클라이언트(reqwest)가 ClickHouse에 이미 링크된 OpenSSL을 재사용할 수 있도록 했습니다. 이는native-tls를 부분적으로만 활성화한 것입니다.object_store가 여전히reqwest/rustls-tls-native-roots를 강제하므로,reqwest는 결국native-tls와rustls백엔드를 모두 사용하게 됩니다. 현재delta-kernel-rs는 MSan에서 계속 비활성화되어 있습니다. 이는ring이 여전히object_store를 통해 컴파일되기 때문입니다(rustls를 통한 전이적 경로와 AWS 요청 HMAC 서명을 위한 직접 경로 모두 포함). 또한ring의 수작업 어셈블리는 MSan에 필요한 심볼을 생성하지 않습니다(상위 프로젝트에서 arrow-rs-object-store#585로 추적 중). #96856 (Austin Bonander).clickhouse바이너리에 PGO (Profile-Guided Optimization) 및 BOLT (Binary Optimization and Layout Tool) 사후 링크 최적화를 추가했습니다. 프로필은 CI 워크로드에서 수집되며, 릴리스 빌드 중 최선 노력 방식으로 적용됩니다. 두 단계 모두 프로필이 오래되었거나 호환되지 않으면 최적화되지 않은 출력으로 폴백됩니다. 현재로서는 PGO의 이점이 없습니다. #100938 (Alexey Milovidov).clickhouse keeper-bench에--storage모드를 추가해KeeperStorage를 in-process로 벤치마크할 수 있도록 했습니다(네트워크 없음, raft 없음, state machine 없음). 이 모드는 네트워크 모드와 동일한setup/generator구성 섹션을 사용합니다. #103081 (Michael Kolupaev).ENABLE_AWS_S3=OFF일 때 빌드가 가능하도록 수정했습니다. #105390 (Yue Ni).mongo-cxx-driver를 r4.3.0으로 업데이트했습니다. #105522 (Konstantin Bogdanov).- RapidJSON 대상 빌드를 수정했습니다. #105674 (Ilya Golshtein).
- 널리 사용되는 base/ 헤더에서 전이적 include를 제거하고 벤더링된
Poco/Logger.h에서 사용되지 않는 코드를 제거해 빌드 속도를 높였습니다. #105702 (Raúl Marín). libxml2를 2.15.1에서 2.15.3으로 업데이트했습니다. #105985 (Konstantin Bogdanov).- Poco 내부에서
expat2.8.1을 사용합니다. #105988 (Konstantin Bogdanov). thrift를v0.23.0으로 올렸습니다. #105993 (Konstantin Bogdanov).postgres태그REL_18_4를 사용합니다. #105994 (Konstantin Bogdanov).krb5를 1.22.2로 업그레이드했습니다. #106076 (Konstantin Bogdanov).- 번들된
curl을 8.20.0으로 업데이트했습니다. #106077 (Konstantin Bogdanov). mariadb-connector-c를 3.1.29로 올렸습니다. ClickHouse 관련 패치는 모두 유지했습니다. #106287 (Nikita Mikhaylov).- libssl3t64 CVE 수정에 맞춰 distroless 베이스 이미지 다이제스트를 올렸습니다. #106360 (Rahul Nair).
wasmtimev45.0.1을 사용하도록 변경했습니다. #106836 (Konstantin Bogdanov).openssl을 3.5.7로 올렸습니다. #106844 (Konstantin Bogdanov).- 이제 Distroless Docker build는 전체 버전 태그뿐 아니라
:X.Y-distroless와:X.Y.Z-distroless플로팅 태그도 업데이트합니다. #106932 (Rahul Nair). - NTLM 인증, 쿠키, alt-svc, HSTS, DNS-over-HTTPS, netrc, MIME, AWS SigV4 등 사용하지 않는
curl기능을 비활성화했습니다. #107226 (Konstantin Bogdanov). - snapshot IO가 background thread에서 실행될 때 발생하던 snapshot-install 라이브락을 수정한 버전으로
NuRaft를 업데이트했습니다.nuraft_use_bg_thread_for_snapshot_ioKeeper 설정은 기본적으로 계속 비활성화되어 있으며, 이제 CI에서는 두 모드를 모두 포괄하도록 이 값을 무작위화합니다. #107338 (Antonio Andelic). - ClickHouse checkout 경로에 header 확장 기능과 일치하는 substring이 포함될 때
abseil빌드가 실패하던 문제를 수정했습니다. #107349 (zhiqiang). - x86_64에서는 musl libc에서 사용할 수 없는 glibc 전용
sysconf(_SC_LEVEL2_CACHE_SIZE)대신CPUID로 L2 cache size를 확인하도록 변경했습니다. #107469 (Konstantin Bogdanov). - 깊게 중첩된 쿼리를 지원하기 위해 musl build의 stack 크기를 8 MiB로 늘렸습니다. #107470 (Konstantin Bogdanov).
- Rust 정적 라이브러리에서 지역화되는 C library 심볼 집합을 수동으로 관리하는 allowlist가 아니라 실제 reference libraries를 기준으로 도출하도록 변경해, 모든 compiler-rt builtins와 플랫폼 libm 함수가 포함되도록 했습니다. #107571 (Raúl Marín).
- distroless server 및 Keeper image를
gcr.io/distroless/base-nossl-debian13로 전환해, ClickHouse가 실제로 링크하는 라이브러리만 포함하고 자체적으로 정적 링크하는 라이브러리는 더 이상 가져오지 않도록 했습니다. #107837 (Rahul Nair). - 오래되어 skip 처리되던 macOS(
arm_darwin)의 stateless tests 50개를 다시 활성화했고, macOS에서 directory 동기화에는F_FULLFSYNC대신fsync를 사용하도록 했습니다. #107887 (Raúl Marín).
하위 호환되지 않는 변경 사항
date_time_input_format및cast_string_to_date_time_mode의 기본값이basic에서best_effort로 변경되었습니다. 이전에는 기본 형식이 아닌 datetime 문자열(예:2024 April 4,Apr 15, 2020 10:30:00)을 파싱하지 못해 실패하던 쿼리가 이제는 기본적으로 성공할 수 있습니다. 기존의 엄격한 파싱 동작을 유지하려면 이 설정을basic으로 지정하거나compatibility를 사용하십시오. #89334 (Alexey Milovidov).- 이제
null이라는 Tuple 요소 이름은 사용할 수 없습니다. Nullable null 맵에 사용되는 subcolumn 이름과 충돌하여 subcolumn 확인이 모호해지기 때문입니다. #98377 (Alexey Milovidov). - 동적 디스크에서
from_env,from_zk,include사용을 금지하기 위해dynamic_disk_allow_from_env,dynamic_disk_allow_from_zk,dynamic_disk_allow_include설정이 추가되었습니다. 이전에는 기본적으로 허용되던 동작이 이제 기본적으로 금지되므로 하위 호환되지 않는 변경 사항입니다. #99138 (Kseniia Sumarokova). - 더 이상 폐기된 Arrow 기반 Parquet 리더 및 라이터를 사용할 수 없습니다. 대신 네이티브 구현이 사용됩니다. #100949 (Alexey Milovidov).
- 이제
SHOW CREATE TABLE t는 이름이t인 영구 테이블과 임시 테이블이 모두 존재하고 데이터베이스가 지정되지 않은 경우, 기존DESCRIBE TABLE동작과 동일하게 임시 테이블을 우선합니다. 또한DESCRIBE TEMPORARY TABLE구문도 이제 지원됩니다. #100966 (Alexey Milovidov). - 인증 전 HTTP 연결의 메모리 사용량을 제한하기 위해 기본
http_max_fields는 1,000,000에서 1,000으로,http_max_field_name_size는 128 KB에서 4 KB로 줄였습니다.http_max_request_header_size및http_headers_read_timeout설정도 추가되었습니다. 이전의 더 높은 제한값에 의존하는 사용자는 설정을 통해 이를 복원할 수 있습니다. #103285 (Sema Checherinda). system.metric_log에histograms중첩 컬럼이 추가되어, 등록된 모든 히스토그램 메트릭의 스냅샷이 각 행에 저장됩니다. 또한 0값 출력 여부를 제어하는system_metric_log_show_zero_values_in_histograms설정도 추가되었습니다. 이에 따라system.histogram_metric_log테이블은 더 이상 사용이 권장되지 않습니다. #103770 (Miсhael Stetsyuk).- 이제 명시적인 time zone 없이
DateTime또는DateTime64로CAST하면, 원본 인수가 명시적인 time zone을 가진DateTime/DateTime64인 경우 해당 time zone이 유지됩니다. 이는toDateTime/toDateTime64함수의 동작과 일치합니다. #55072를 닫습니다. #104433 (Alexey Milovidov). kql테이블 함수가 제거되었습니다. KQL 방언으로 쿼리를 실행하려면SET dialect = 'kusto'를 사용하십시오. #105101 (Alexey Milovidov).- 윈도우 함수
RANK와DENSE_RANK는 이제 SQL 표준에 맞게 인수를 허용하지 않으며,NUMBER_OF_ARGUMENTS_DOESNT_MATCH예외를 발생시킵니다. 이전에는RANK(x) OVER (ORDER BY id)와 같은 쿼리가 인수를 무시한 채 조용히 허용되었습니다. 이전의 관대한 동작을 복원하려면allow_rank_dense_rank_arguments = 1로 설정하십시오. #49526를 닫습니다. #104324 (Groene AI).
새로운 기능
max_bytes_ratio_before_external_group_by및max_bytes_ratio_before_external_sort와 동일한 방식의 새로운 설정max_bytes_ratio_before_external_join을 추가했습니다. 이 설정은 해시 조인의 디스크 spill 임계값을 사용 가능한 메모리 대비 비율로 나타내며, 절대값 설정인max_bytes_before_external_join과 함께 사용할 경우 계산된 임계값 중 더 작은 값이 적용됩니다. #103862 (Alexey Milovidov). 새로운max_bytes_ratio_before_external_join설정은 이제 기본적으로 0.5로 활성화되며,max_bytes_ratio_before_external_group_by및max_bytes_ratio_before_external_sort와 동일하게 동작합니다. 해시 조인은 오른쪽 데이터가 사용 가능한 시스템 메모리의 절반을 초과하면 자동으로 grace hash join으로 spill됩니다(메모리 제한이 구성된 경우). #104285 (Alexey Milovidov).- 테이블 함수
filesystem을 추가했습니다. 이를 통해 디렉터리 구조를 테이블로 표현하고, SQL을 사용해 파일의 메타데이터와 내용을 쿼리할 수 있습니다. 원래 작업은 @perst20의 #42039에서 시작되었습니다. #42039 및 #50208을 참조하십시오. #53610 (Alexey Milovidov). arrayMap,arrayFilter등의 고차 함수에 함수 이름만 직접 전달할 수 있도록 했습니다. 예를 들어 이제arrayMap(negate, [1, 2, 3])는arrayMap(x -> negate(x), [1, 2, 3])와 동일합니다. #101033 (Alexey Milovidov).- 서버가 네이티브 프로토콜을 통해 인라인 INSERT 데이터를 직접 파싱할 수 있도록 설정
send_table_structure_on_insert_with_inline_data와 클라이언트 옵션--inline-insert-data를 추가했습니다. 이를 통해 테이블 구조를 받기 위한 왕복을 피할 수 있어, 작은 삽입이 많은 경우 성능이 향상됩니다. #101034 (Alexey Milovidov). - SQL 쿼리 tokenization 및 구문 강조를 위한
tokenizeQuery와highlightQuery함수를 추가했습니다.tokenizeQuery는 lexer 토큰, 바이트 오프셋, 토큰 유형을 반환하며,highlightQuery는 parser 기반 구문 강조 범위와 강조 범주(keyword, identifier, function, number, string 등)를 반환합니다. #101054 (Alexey Milovidov). - RFC 3986 의미 체계를 따라
url테이블 함수와URL테이블 엔진에서 relative URL을 해석할 수 있도록url_base설정을 추가했습니다. #101113 (Alexey Milovidov). LIMIT BY절에서 음수 값을 지원하여 각 그룹의 시작이 아니라 끝에서 행을 선택할 수 있습니다. 예를 들어LIMIT -2 BY id는 각id에 대해 마지막 두 행을 반환합니다. 음수 offsets(LIMIT -1 OFFSET -1 BY id)와 부호가 혼합된 경우(LIMIT -2 OFFSET 1 BY id)도 지원됩니다. #103222 (Nihal Z. Miaji).- 여러 JSON 쿼리의 성능을 개선하기 위해
json_value함수가tuple및array로 출력하는 기능을 지원합니다. #78362 (kevinyhzou). 또한 @KevinyhZou가JSON_VALUE,JSON_EXISTS,JSON_QUERY에서 다중 경로Tuple/ArrayJSONPath 인수를 지원하도록 했습니다. #101102 (Alexey Milovidov). - 새로운
kafka_autodetect_client_rack매개변수가 도입되었습니다. 설정하면 클라우드 기능을 통해 Availability Zone을 감지하고 이를librdkafka의client.rack매개변수로 전달하여 존 간 통신을 방지합니다. #81323 (Ilya Golshtein). - 객체 스토리지 읽기 작업을 추적할 수 있도록
system.blob_storage_log에Read이벤트 유형을 추가했습니다. 이 기능은 새로운 설정enable_blob_storage_log_for_read_operations로 제어됩니다. #96867 (Alexey Milovidov). - 이제 새로운
system.zookeeper_watches테이블을 사용해clickhouse-server가 등록한 ZooKeeper watch를 확인할 수 있습니다. #99277 (Den Kalantaevskii). - 모든 테이블에 걸쳐 합산한, 분산 쿼리에 포함된 세그먼트 수를 집계하는
Shards프로필 이벤트를 추가했습니다. #99470 (Alexey Milovidov). - 이제
WASMUDF를DETERMINISTIC으로 선언할 수 있으며 상수 접기의 대상이 됩니다. #100005 (Vasily Chekalkin). parallel_replicas_prefer_local_replica설정을 추가했습니다. 비활성화하면 병렬 레플리카가 로드 밸런싱 알고리즘에 따라 순수하게 선택되므로max_parallel_replicas = 1인 쿼리도 다른 호스트로 전달될 수 있습니다. #100139 (Alexey Milovidov).- 송신 HTTP 연결의 TCP 소켓 버퍼 크기를 제어할 수 있도록
{disk,storage,http}_connections_rcvbuf및{disk,storage,http}_connections_sndbuf서버 설정을 추가했습니다. 이를 통해 운영자는 커널 자동 튜닝을 재정의하고 연결당 메모리 사용량의 상한을 설정할 수 있습니다. #100478 (Sema Checherinda). CREATE OR REPLACE TABLE과 동일한 원자적 교체 시맨틱으로CREATE OR REPLACE MATERIALIZED VIEW를 지원합니다. 내부 테이블,TO테이블,POPULATE,REFRESH,ON CLUSTER와 함께 작동합니다. #100539 (DQ).- S3 GET 요청의 연결 수명과 소비된 바이트를 관찰할 수 있도록
s3_read_request_duration_microseconds및s3_read_request_bytes히스토그램 메트릭을 추가했습니다. 이 메트릭은system.histogram_metrics와 Prometheus 엔드포인트에서 확인할 수 있습니다. #102058 (Sema Checherinda). - Keeper 스냅샷 진행 상황 추적을 기반으로 Incremental read를 지원하는
Paimon,PaimonS3,PaimonAzure,PaimonHDFS,PaimonLocal테이블 엔진을 추가했습니다. Incremental 모드는 마지막으로 커밋된 스냅샷 이후의 새 행만 반환합니다. 특정 대상 스냅샷의 delta 읽기는paimon_target_snapshot_id를 통해 사용할 수 있으며, 쿼리별 스냅샷 상한은max_consume_snapshots로 설정할 수 있습니다. 백그라운드 metadata refresh는paimon_metadata_refresh_interval_sec로 구성할 수 있습니다.allow_experimental_paimon_storage_engine으로 제어됩니다. #102343 (XiaoBinMu). - 새로운 Kafka 테이블 설정
kafka_map_virtual_columns_on_write를 추가했습니다. 활성화하면 Kafka 테이블 스키마에서_key,_timestamp,_headers.name,_headers.value라는 이름의 컬럼이INSERT시 각각 해당 Kafka 메시지 키, 타임스탬프, 헤더로 생성되며 메시지 페이로드에서는 제외됩니다. #103243 (Alexey Milovidov). - 갱신 가능 구체화 뷰에
SYSTEM PAUSE VIEW [db.]name및SYSTEM PAUSE VIEWS쿼리가 추가되었습니다.SYSTEM STOP VIEW와 달리SYSTEM PAUSE VIEW는 현재 실행 중인 갱신을 중단하지 않습니다. 즉, 진행 중인 갱신은 끝까지 완료되며 이후 갱신만 방지됩니다. 이 상태는SYSTEM START VIEW또는SYSTEM START VIEWS로 해제할 수 있으며, 이제 이 명령들은 중지 상태와 일시 중지 상태를 모두 일관되게 해제합니다. #103252 (Nikita Mikhaylov). - 문자열에서 N번째 정규식 일치의 바이트 위치를 반환하는 함수
regexpPosition(PostgreSQL 호환 alias인regexpInstr및regexp_instr포함)이 추가되었습니다. 시작 오프셋, 일치 후 반환 모드, 정규식 flag, 캡처 그룹 선택을 지원합니다. #104172 (Abhinav Agarwal). - 소수 판별을 위한 새 함수
isPrime및isProbablePrime이 추가되었습니다.isPrime은UInt64까지의 부호 없는 정수에 대해 정확한 결과를 반환합니다.isProbablePrime은UInt128및UInt256도 지원하며, 이러한 더 큰 타입에서는0이 확실한 합성수,1이 소수일 가능성이 높음을 의미합니다.isProbablePrime의 선택적 두 번째 인수rounds는 신뢰도를 제어하며(256으로 제한), 기본값인25회 반복은 임의의 합성수에 대한 거짓 양성률을10^-15미만으로 낮춥니다. 또한isProbablePrime은 취소할 수 있습니다. #104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji). - 이제
clear및/clear는 잘못된 쿼리로 실행되지 않고 clickhouse 명령줄 도구에서 터미널을 지웁니다. #104318 (Tyler Hannan). - 이제
SELECT쿼리에서file테이블 함수가Array(String)경로를 받을 수 있습니다. #104442 (Yue). system.functions테이블에deterministic및higher_order컬럼이 추가되었습니다. #104479 (Pedro Ferreira).bech32Encode에 선택적 인코딩 variant 매개변수(bech32/bech32m)가 추가되었고,bech32Decode에는 비-SegWit 주소 인코딩(예: Cosmos SDK, Injective, Osmosis)을 위한 raw decode 모드가 추가되었습니다. #98986 (Yash ).- 이제 이전에는 입력 전용이었던
AvroConfluent포맷으로 데이터를 쓸 수 있습니다. 이를 통해 예를 들어 Kafka에 쓸 때 Confluent 스키마 레지스트리 프레이밍이 적용된 Avro 메시지를 ClickHouse에서 직접 생성할 수 있습니다. 스키마는 스키마 레지스트리에 자동으로 등록됩니다. subject 이름을 지정하려면 새output_format_avro_confluent_subject설정을 사용하십시오. #101935 (János Benjamin Antal). - JSON 문자열을 사람이 읽기 쉬운 형태로 포맷하는
prettyPrintJSON함수가 추가되었습니다. 이전에는 클라이언트 측에서 별도 단계가 필요했던 dashboard나 보고서에서 유용합니다. #62523를 해결합니다. #102594 (Dmitry Prokofyev). - PostgreSQL / SQL 표준 호환성을 위해
STRING_AGG가groupConcat의 대소문자를 구분하지 않는 별칭으로 추가되었습니다. #105125 (Alexey Milovidov). - 이제 전체 외부 쿼리를 캐시하지 않아도 특정 서브쿼리에서
SETTINGS use_query_cache = true를 사용해 개별 서브쿼리 결과를 독립적으로 캐시할 수 있습니다. 새로운 설정query_cache_for_subqueries = true를 사용하면 모든 서브쿼리에use_query_cache를 일괄 적용할 수 있습니다. 참고: 이제 외부 쿼리의use_query_cache는 더 이상 서브쿼리로 자동 전파되지 않습니다. #99804 (Vincent Voyer). clickhouse-client의 색상을 본뜬 렉서 기반 구문 강조가 웹 UI의 쿼리 편집기(play.html)에 추가되었습니다. #105105 (Alexey Milovidov).
실험적 기능
- WebSocket을 통해 브라우저에서 대화형
clickhouse-client세션을 제공하는 실험적인 웹 터미널 인터페이스를/webterminal에 추가했습니다. 기본적으로 비활성화되어 있으며,allow_experimental_webterminal서버 설정으로 활성화할 수 있습니다. 여기에서 확인할 수 있습니다. #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov). Kafka2engine(실험적 기능이며 Keeper 기반 offset storage 사용)이 이제 직접SELECT쿼리와kafka_commit_on_select설정을 지원합니다. #100276 (Alexey Milovidov).- 이제
WASMUDFs는 더 많은 숫자 타입을 강제 변환할 수 있습니다. 더 작은 정수를 더 큰 정수로(예:Int8에서UInt64로), 그리고 모든 정수를 부동소수점으로(예:Int32에서Float32로) 변환할 수 있습니다. #100435 (Vasily Chekalkin). DELETE FROM system.webassembly_modules쿼리에서LIKE함수를 지원합니다. #104397 (Vladimir Cherkasov).Iceberg에서 geo types를 지원합니다. #103113 (Konstantin Vedernikov).- ArrowFlight SQL server에 prepared statements 기능을 추가했습니다. #103047 (Yakov Olkhovskiy).
- KQL parser 단계 전반에서 parser depth와 backtracks counters를 유지하도록 하여 KQL parser(Kusto 언어 지원)의 견고성을 개선했습니다. 이를 통해 복잡한 KQL 쿼리에서도 parser limits가 일관되게 추적됩니다. #103528 (Yakov Olkhovskiy).
성능 개선
file테이블 함수 또는File테이블 엔진을 통해 로컬 Parquet 파일을 읽을 때 Parquet footer 메타데이터 캐시를 재사용합니다. 이전에는 이 캐시를 객체 스토리지 백엔드에서만 사용했습니다. #104260 (Alexey Milovidov).- 정렬 키가 조인으로 보존되는 쪽의 컬럼만 참조하는 경우
ORDER BY ... LIMIT n을LEFT/RIGHT조인 아래로 푸시다운하여, 조인 전에 보존되는 쪽 입력이 생성해야 하는 행 수를 제한합니다. 이는 새로운 설정query_plan_top_k_through_join으로 제어됩니다(기본적으로 활성화됨). #104268 (Alexey Milovidov). ORDER BY ... LIMIT N쿼리의 성능을 개선하기 위해use_top_k_dynamic_filtering및use_skip_indexes_for_top_k설정을 기본적으로 활성화합니다. #99537 (Alexey Milovidov). 또한 기본적으로use_top_k_dynamic_filtering을 고정 길이 정렬 컬럼에만 적용하여, 행당 임계값 비교 비용이 I/O 절감 효과를 초과하는ORDER BY <var-length-column> LIMIT N쿼리에서 성능 회귀를 방지합니다. 이전 동작은 새로운use_top_k_dynamic_filtering_for_variable_length_types설정으로 사용할 수 있습니다. #104216 (Alexey Milovidov).- 페이지 폴트를 줄이기 위해
jemalloc의 oversize-arena 기능을 사용합니다. #103958 (Nikita Taranov). - 피크 메모리 사용량을 줄이기 위해
UNION ALL에서 동시에 활성 상태인 stream 수를 제한합니다. #100176 (Alexey Milovidov). - 사용자 공간 페이지 캐시를 소폭 최적화했습니다. #100300 (Alexey Milovidov). 이제 사용자 공간 페이지 캐시는 항상 OS 페이지 캐시보다 더 우수합니다.
- 사용자 공간 페이지 캐시(
use_page_cache_for_object_storage = 1)를 통한 객체 스토리지의 콜드 읽기가 이제 훨씬 빨라졌습니다. 연속된 캐시 미스를page_cache_block_size블록마다 하나의 요청으로 처리하는 대신 단일 HTTP request로 합치기 때문입니다. #104230 (Alexey Milovidov). - 타입 캐스팅과 함수 적용이 포함된 인덱스 분석 속도를 향상합니다. #55653을 해결합니다. #100366 (Alexey Milovidov).
- 매우 많은 수의 기반 테이블 위에 있는
Merge테이블에서 대규모 쿼리 성능을 향상합니다. #32465을 해결합니다. #100369 (Alexey Milovidov). - 설정 field 타입에서 vtable을 제거하여
Settings복사 크기를 약 28배 줄이고, 모든 설정 타입에 대해 typed-array layout을 사용해 캐시 지역성을 개선합니다. #102269 (Raúl Marín). - 서버의 여유 메모리가 부족할 때 쿼리 병렬성을 자동으로 줄이기 위해
max_threads_min_free_memory_per_thread및max_insert_threads_min_free_memory_per_thread설정을 추가합니다. #100383 (Alexey Milovidov). - 저메모리 시스템(< 4 GiB)에서 메모리 사용량을 줄입니다. #100389 (Alexey Milovidov).
OptimizeTrivialGroupByLimitPass를 추가했습니다. 단순한SELECT ... FROM t GROUP BY k LIMIT n쿼리(HAVING,ORDER BY, 윈도우 함수 없음)의 경우, 이제 분석기가max_rows_to_group_by = n + offset과group_by_overflow_mode = 'any'를 설정합니다. 따라서 전체 입력을 그룹화하지 않고, 서로 다른 키n개가 생성되는 즉시 집계가 중단됩니다. 이 동작은 새로운 설정optimize_trivial_group_by_limit_query로 제어되며 기본적으로 활성화되어 있습니다. #104473 (Amos Bird) (Alexey Milovidov)._part_offset및_block_number가상 컬럼에 대해, 프로젝션을 포함한 그래뉼 수준의 암시적 MinMax 인덱스를 추가했습니다. 이를 통해 가상 컬럼 프레디케이트를 기준으로 그래뉼을 빠르게 프루닝할 수 있습니다. #103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko).prealloc_serialized계열의 집계 메서드에 대해, batch 직렬화 단계에서 각 행의 해시를 미리 계산하고 이를 사용해 (a)emplaceKey/findKey에서 해시를 다시 계산하지 않으며 (b) 다음 행의 버킷에 소프트웨어 프리페치를 수행합니다. 이를 통해 해시 테이블 캐시 미스로 인한 지연 시간을 숨겨, 다중 키 문자열/직렬화 집계 성능을 높입니다. #104475 (Amos Bird) (Alexey Milovidov).Iceberg테이블용 쿼리 조건 캐시를 추가했습니다. #102115 (Konstantin Vedernikov).- 윈도우 함수와 함께 사용할 때
cramersV,cramersVBiasCorrected,theilsU,contingency를 최적화했습니다. #83521을 해결합니다. #93384 (Nihal Z. Miaji). tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N)를dictGet('dict', 'a', key)로 재작성하는 쿼리 최적화를 추가해, 불필요한 딕셔너리 속성을 가져오지 않도록 했습니다. 이 동작은optimize_dictget_tuple_element설정으로 제어되며 기본적으로 활성화되어 있습니다. #100186 (Alexey Milovidov).- 정렬이 포함된 분산 쿼리에서 initiator의 정렬 단계에 buffering을 활성화했습니다. #100661 (Nikita Taranov).
partial_mergeJOIN의 성능을 개선했습니다. #100945 (Artem Zuikov).partial_mergeJOIN에서 메모리 과다 할당을 소폭 줄였습니다. #100963 (Artem Zuikov).- 전체 메모리 추적기 계층을 순회하는 대신 샘플링 설정을 캐시해 allocations/deallocations를 최적화했습니다. #101267 (Azat Khuzhin).
- 내부 추적 컨테이너를 미리 할당해 S3 멀티파트 업로드 중 메모리 할당 오버헤드를 줄였습니다. #101799 (Gagan Dhakrey).
- 큰 해시 테이블의 메모리 접근 지연 시간을 줄이기 위해 해시 조인 probe 단계에 소프트웨어 프리페치를 추가했습니다. 이 기능은
enable_software_prefetch_in_join설정으로 제어됩니다. #102444 (Xiaozhe Yu). MemoryTracker레이아웃을 최적화해 성능을 약 25% 개선했습니다. #103464 (Azat Khuzhin).- 인덱스 분석 전에
coalesce(a, b, ...) <op> const및ifNull(a, b) <op> const프레디케이트를 재작성하여, 각 인수에 대한 컬럼별 프라이머리 키와 스킵 인덱스가 그래뉼을 가지치기할 수 있도록 했습니다. 이 동작은 새로운 설정allow_key_condition_coalesce_rewrite로 제어되며 기본적으로 활성화되어 있습니다. #103468 (Manuel). - 대용량 JSON 메타데이터 파일이 있는 Iceberg 카탈로그를 읽을 때, 이스케이프된 슬래시 처리 최적화를 통해 쿼리 성능을 크게 개선했습니다. #103998 (Mohaidoss).
- 캐시가 비활성화된 경우(서버 설정
index_uncompressed_cache_size = 0, 기본값) 인덱스 비압축 캐시 오버헤드를 피하도록 개선했습니다. #104063 (Michael Kolupaev). - 선택성이 낮은
WHERE필터와 함께 사용할 때, 작은 limit의ORDER BY ... LIMIT쿼리가 과도한 그래뉼을 읽던 문제를 수정했습니다. 이전에는 in-order read 위에 있는 모든 필터가 mark range별 작업 분할을 비활성화해, pipeline이 그래뉼 사이에서 취소되지 못하고 각 stream마다 전체 part를 읽었습니다. #104112 (Vladimir Cherkasov). - JOIN 순서를 재배치한 뒤 해시 테이블 크기 캐시 재사용이 누락되던 문제를 수정했습니다. #104131 (Nikita Taranov).
fsync_after_insert가 활성화된 경우, 이제 part 파일의 fsync를 IO 스레드 풀을 사용해 병렬로 수행하므로 wide tables에서 삽입 마무리 속도가 빨라집니다. 전체 ClickBenchhits적재는 약 22% 더 빨라졌습니다. #104137 (Alexey Milovidov).- AArch64에서 NEON을 사용해
find_first_symbols,find_first_not_symbols,find_last_symbols_or_null,find_last_not_symbols_or_null,splitInto를 벡터화했습니다. 이전에는 이 helper들이 x86(SSE2 / SSE4.2)에서만 SIMD 경로를 사용했고 ARM에서는 스칼라 루프로 처리되었습니다. 그 결과 ClickBenchhits데이터셋에서 TSV 파싱은 약 2배, URL 함수와splitByChar는 약 1.3배 빨라졌습니다. 반면 매우 높은 밀도의 JSON 파싱(필드 간격이 16바이트 미만인 경우)은 기존 SSE2 절충과 마찬가지로 약간 느려집니다. #104228 (Alexey Milovidov). - 단순한
ALIAS컬럼(예:some_alias ALIAS m일 때some_alias['key'])을 통해 데이터를 읽을 때도 이제 기본 컬럼을 직접 참조할 때와 동일한 subcolumn별 읽기 경로를 사용하므로,Map,Array,Tuple,Nullable별칭 컬럼에서 큰 I/O 절감 효과가 다시 복원됩니다. #104245 (Raúl Marín). - 쿼리별
AsyncReadCounters를 락 프리로 바꿔 비동기 원격 FS 읽기 경로에서 락 경합을 줄였습니다. #104374 (Nikita Mikhaylov). - 프로젝션의 in-order scan에 대한 쿼리 계획을 소폭 개선했습니다. #103723 (Mikhail Artemenko).
optimizeUseNormalProjections를 확장해, 필터링된 항목은 없지만 projection의 sorting key로 쿼리 계획에서 정렬 단계를 제거할 수 있는 특정 사례도 처리하도록 했습니다. #104680 (Mikhail Artemenko).json.path[]문법 설탕과 명시적 type hint가 타입이 지정된JSON경로에서 올바르게 작동하도록 지원합니다. #99179 (Pavel Kruglov).json.path[N].nested.path(tupleElement(tupleElement(json.path[N], 'nested'), 'path')로 확장됨)를json.path[].nested.path[N]로 최적화하여 읽는 데이터 양을 크게 줄였습니다. #99802 (Pavel Kruglov).system.parts에서SHOW TABLES접근 검사를 최적화했습니다. 데이터베이스 수준의 grant 검사를 테이블별 루프 밖으로 이동했습니다. #100860 (Shaohua Wang).system.tables의SELECT name/SELECT database, namefast path에서 중복된 테이블별SHOW TABLES접근 검사를 제거했습니다. #100881 (Shaohua Wang).- macOS에서 JIT 컴파일을 활성화했습니다. #100947 (Alexey Milovidov).
FINAL이후의 행 정책이 정렬 키 컬럼에만 의존하고 deterministic한 경우, 해당 행 정책의 지연 적용을 건너뛰고 그로 인해 강제되던PREWHERE지연도 함께 건너뜁니다. #102884 (Yarik Briukhovetskyi).- text index에서
hasAny와hasAll을 filter 프레디케이트로 지원하도록 추가했습니다. #103266 (Anton Popov). - 수명이 긴 MergeTree 힙 상태(파트별 및 테이블별 metadata)를 전용 jemalloc arena로 분리하고, 이를
jemalloc.mergetree_arena.*비동기 메트릭으로 노출합니다. 이를 통해 안정 상태에서 기본 arena의 단편화를 줄이고, 파트별로 오래 남는 객체가 원래 해제될 수 있는 페이지를 계속 점유하지 않도록 합니다. #104136 (Raúl Marín). - 많은 요청이 단일 session에서 파이프라이닝되는 높은 부하 상황에서 ZooKeeper 클라이언트의 timeout 처리 방식을 개선했습니다. 이제 ZooKeeper 클라이언트는 진행 기반 timeout을 사용합니다.
session_timeout_ms내에 서버로부터 어떤 데이터라도 수신되는 한 대기 시간이 연장됩니다. 요청당3 * session_timeout_ms의 하드 상한은 여전히 호출 측 지연 시간을 제한합니다. #100466을 해결합니다. #104351 (Antonio Andelic). - 이벤트별 trace 플래그를 별도 배열로 분리하고 필요 시점에 할당하도록 변경해
ProfileEventstracing 오버헤드를 줄였습니다. #105030 (Azat Khuzhin). ColumnDecimal에compareTrackAt를 추가해Decimal컬럼의 비교 성능을 개선했습니다. #105110 (Artem Zuikov).- 여러 입력을 병렬로 해시하는
MD5의 SIMD 구현(AVX2/AVX512)을 추가해 처리량을 개선했습니다. #105161 (Joanna Hulboj).
개선 사항
- 모든 ClickHouse 애플리케이션의 도움말 출력을 개선했습니다. 이제
--help는 일관되게 종료 코드0을 반환하고stdout에 출력되며, 최상위clickhouse --help에서는 모든 하위 명령이 표시됩니다. 또한clickhouse start/restart에--no-sudo옵션(Docker에서 유용함)과clickhouse help하위 명령을 추가했습니다. @qoega의 #58244를 잇는 작업입니다. #98148 (Alexey Milovidov). input_format_column_name_matching_mode의 기본값이match_case에서auto로 변경되었습니다. 입력 컬럼 이름을 테이블 스키마와 대조하는 입력 형식(JSONEachRow,CSVWithNames,JSONColumns,BSONEachRow,RowBinaryWithNames등)은 이제 먼저 대소문자를 구분해 일치를 시도하고, 실패하면 대소문자를 구분하지 않는 방식으로 다시 시도합니다. 이전의 엄격한 동작은compatibility에서 유지됩니다. #104320 (Alexey Milovidov).- PostgreSQL/SQL 표준 호환성을 위해
stddevSamp의 대소문자 비구분 별칭으로STDDEV를 추가했습니다. #105120 (Alexey Milovidov). - PostgreSQL 호환성을 위해
arrayStringConcat의 대소문자 비구분 별칭으로array_to_string을 추가했습니다. #105121 (Alexey Milovidov). - PostgreSQL 호환성을 위해
arrayJoin의 대소문자 비구분 별칭으로unnest를 추가했습니다(함수 호출 형식). #105124 (Alexey Milovidov). clickhouse-client의 진행 표시줄에 이제 RAM 옆에 디스크의 임시 데이터 사용량(예: 외부 sort, aggregation 또는 JOIN용)이 표시되며, 분산 쿼리의 호스트별 세부 내역도 포함됩니다. #105190 (Alexey Milovidov).- 쿼리별 프레디케이트 필터 선택도와 MergeTree 인덱스 granule 프루닝을 샘플링해 기록하는 새 로그
system.predicate_statistics_log를 추가했습니다. 기본적으로 비활성화되어 있으며,predicate_statistics_sample_rateserver setting으로 활성화할 수 있습니다. 자동 인덱스 및 프로젝션 추천에 필요합니다. #98727 (Yarik Briukhovetskyi). skip_unavailable_shards가 활성화된 경우, 테이블이 없는 로컬 세그먼트를 스키핑할 수 있도록 했습니다. #100141 (Alexey Milovidov).- Linux mdraid 배열이 resync 중이거나 성능 저하 상태일 때 시작 경고(
system.warnings에서 확인 가능)를 추가했습니다. 두 경우 모두 디스크 I/O 성능에 영향을 줄 수 있으며, 디스크 장애를 나타낼 수도 있습니다. #100941 (Alexey Milovidov). - 이제 WASM UDF가
system.functions에 올바른origin(WasmUserDefined)으로 표시되며,syntax,arguments,returned_value컬럼은 해당 ClickHouse 유형 메타데이터를 기반으로 채워집니다. 이전에는 누락되거나 잘못된origin으로 중복 표시되었습니다. #101053 (Vasily Chekalkin). - 이제
generate_series테이블 함수가 내림차순 시퀀스를 생성할 수 있도록 음수 간격 값을 지원합니다. 예:SELECT * FROM generate_series(99, 0, -1). #101056 (Alexey Milovidov). - 일부 함수(
dotProduct,formatRow,structureToCapnProtoSchema/structureToProtobufSchema, 사용자 정의 함수)를DEFAULT/MATERIALIZED표현식이나 테이블 엔진 설정 같은 지연 실행 경로에서 사용할 때 발생하던Context has expired예외를 수정했습니다. 필요한 경우 해당 함수가 강한 Context를 유지하도록 보장했습니다. #101109 (Alexey Milovidov). - 한도가 0인 우선순위(예:
enable_filesystem_query_cache_limit가 활성화되어 있을 때 사용되는 쿼리별 파일 시스템 캐시 우선순위)에서 발생하던 잘못된Cache limits violatedlogical error를 수정했습니다. #101428 (Alexey Milovidov). s3expressendpoint의 Region을 자동으로 감지합니다. #101520 (Pradeep Chhetri).Iceberg쓰기에서 data file의 field id를 지원합니다. #102322를 해결합니다. #102362 (Konstantin Vedernikov).- 이제 web UI(
play.html)의 왼쪽 패널이 독립적으로 스크롤되며, 페이지를 스크롤해도 계속 표시되고, 테이블을 클릭하면 쿼리 영역으로 이동합니다. #102498 (Alexey Milovidov). - 왼쪽 패널의 ClickHouse 로고를 Ctrl/Cmd/Shift+클릭하거나 가운데 클릭하면 Play UI를 새 tab에서 열 수 있습니다. #102501 (Alexey Milovidov).
- 모든 테이블에서 projection primary key와 projection index granularity가 사용하는 메모리를 추적하는 새 메트릭을 추가했습니다. #102587 (Narasimha Pakeer).
- 원격 파일 시스템 읽기/쓰기에
max_network_bandwidth_for_user및max_network_bandwidth_for_all_users를 적용합니다. #103080 (Azat Khuzhin). - 전역 상태가 아니라 스냅샷된 테이블의 상태를 기준으로 판단하도록 변경하여, 갱신 가능 구체화 뷰가 지속적으로 갱신될 때도 backups의 복원력을 개선했습니다. #103384 (Nikita Mikhaylov).
- 이제
SELECT * FROM system.databases는show_data_lake_catalogs_in_system_tables설정과 관계없이 데이터 레이크 카탈로그 데이터베이스를 항상 표시합니다. 이전에는 기본적으로 숨겨져 있었는데, 항상 이를 표시하는SHOW DATABASES와 일관되지 않았습니다. #103444 (Alsu Giliazova). - 코드에서 server setting
concurrent_threads_soft_limit_ratio_to_cores의 기본값을 함께 제공되는config.xml값(2)과 일치시키도록 조정했습니다. 이에 따라 함께 제공되는config.xml을 사용하지 않더라도, 기본max_min_fairconcurrent threads scheduler가 별도 설정 없이 쿼리 처리 스레드를 코어 수의 2배로 제한합니다. #103446 (Alexey Milovidov). getURLScheme에서 빈 입력을 처리하고,Lexer::nextToken의max_query_size검사에서 null-pointer arithmetic을 방지하며, 디코딩 전에 빈 haystack에 대한 UTF-8 subsequence 평가를 단락 처리해 parser 및 문자열 함수의 경계 사례에서 새니타이저 안정성을 개선했습니다. #103489 (Yakov Olkhovskiy).divide(0, x)및intDiv(0, x)의 단조성 추론 정확성을 개선했습니다. 이전에는 이 함수들이 무조건 단조적인 것으로 보고되었지만,0 / x는 0을 포함하는 모든 범위에서 비단조적입니다.0 / 0이 정의되지 않기 때문입니다(divide는NaN/Inf,intDiv는 0으로 나누기 예외 발생). 이 잘못된 판단으로 인해KeyCondition::applyMonotonicFunctionsChainToRange가left > right인 범위를 생성했고, 프라이머리 키에 대한IN/NOT IN표현식에서 키를divide(0, key)또는intDiv(0, key)로 감싼 경우 디버그 빌드에서LOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex가 발생했습니다. 릴리스 빌드는 영향을 받지 않았습니다 — 해당 어설션은#ifndef NDEBUG로 제한되기 때문입니다. #103621 (Groene AI).system.histogram_metrics에서HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95}비동기 메트릭을 버킷 기반 히스토그램http_pool_tcp_buf_bytes(레이블group,direction)로 대체했습니다. 그룹별 총합 비동기 메트릭은 그대로 유지됩니다. #103704 (Sema Checherinda).- 이제 서버 설정
{disk,storage,http}_connections_{rcvbuf,sndbuf}가system.server_settings에서 재시작 없이 변경 가능하다고 표시됩니다. 이 값들은SYSTEM RELOAD CONFIG를 통해 업데이트할 수 있으며, 런타임 적용 경로는 이미 #100478부터 갖춰져 있었습니다. #103772 (Sema Checherinda). flameGraph에 해석된 심볼(Array(String)) 지원을 추가했습니다. #103816 (Azat Khuzhin).- 이제 CLI 클라이언트는 터미널 색상이 괄호와 충돌하는 환경에서 구성에
<rainbow_parentheses>false</rainbow_parentheses>를 지정할 수 있습니다(마찬가지로clickhouse format에도 이제--no_rainbow_parentheses가 추가되었습니다). #103851 (Larry Snizek). - 실패 시 부분적으로 수행된
putNGram삽입을 롤백하고 실패한 검색 패턴을 폴백 검색기로 전환하도록 하여,MultiVolnitsky의 UTF-8 대소문자 비구분 검색에서 발생하던 비일관 상태를 방지하도록 수정했습니다. #103864 (Yakov Olkhovskiy). - glibc 호환 musl에서
rseqTLS를 통해sched_getcpu를 구현했습니다. #104016 (Azat Khuzhin). - APPEND 모드의 복제된 갱신 가능 구체화 뷰는 갱신 중 ZooKeeper 연결이 잠시 끊기더라도 더 이상 두 번 갱신되지 않습니다. #104051 (Michael Kolupaev).
- 명시적인 컬럼 목록이 없는 분산 테이블도 추론된 원격 테이블 구조를 기준으로 세그먼트 분할 키를 검증할 수 있도록 했습니다. #104111 (Yue).
Azureabfss경로에서 REST 카탈로그 관련 문제를 수정했습니다. #104120 (Konstantin Vedernikov).- Keeper S3 스냅샷 클라이언트가
role_arn및role_session_name인증 설정을 따르도록 하여, 스냅샷 업로드에 STSAssumeRole기반 인증을 사용할 수 있게 했습니다. #104140 (Alexey Milovidov). MATERIALIZEDCTE가 포함된 쿼리를 실행할 때 발생하던 메모리 누수를 수정했습니다. #104153 (Alexey Milovidov).- 대규모 비ASCII 데이터 세트(예: 텍스트 인덱스 build 중)를 처리할 때 누적 출력 버퍼가 2 GiB를 초과하면 발생하던
lowerUTF8/upperUTF8예외를 수정했으며, 지나치게 긴 단일 행은 명확한 오류 메시지와 함께 거부하도록 했습니다. #104229 (Shaohua Wang). - 일시적인 I/O 실패가 발생하더라도 MergeTree 컬럼 통계 로딩이 더 안정적으로 동작하도록 개선하여, 영향을 받은 파트에서 통계 기반 최적화가 영구적으로 비활성화되는 것을 방지했습니다. #104372 (zoomxi).
- 이제
INSERT INTO ... SELECT FROM input(...)에CREATE TEMPORARY TABLE권한이 더 이상 필요하지 않습니다. #104470 (Alexey Milovidov). - 삭제 대상 파트 중 하나 이상이 원격 디스크에 저장되어 있을 때
concurrent_part_removal_threshold대신 사용하는 새로운 MergeTree settingconcurrent_part_removal_threshold_for_remote_disk(기본값16)을 추가했습니다. 기존 임계값100에서는 각 삭제가 별도의 네트워크 왕복임에도 직렬로 수행되어, 객체 스토리지 백엔드에서DROP TABLE및 기타 파트 삭제 작업이 수십 초 동안 멈춘 것처럼 보일 수 있었습니다. 새 setting은 원격 스토리지에서 병렬 삭제 경로가 훨씬 더 빨리 활성화되도록 하면서도, 로컬 디스크의 동작은 변경하지 않습니다. #104676 (Groene AI). - 새로운 설정
defer_partition_pruning_after_final(기본값1)은 26.3에서 도입된FINAL하의 파티션 프루닝 건너뛰기 동작을 선택적으로 비활성화할 수 있게 합니다. 이 값을0으로 설정하면 26.3 이전의 파티션 프루닝 동작으로 복원되며, 동일 PK 행이 여러 파티션에 걸칠 수 없는 이벤트 로그 워크로드에서 성능이 크게 향상됩니다.compatibility = '26.2'를 설정하면 자동으로0으로 전환됩니다. #104705 (Nikita Fomichev). - 범위를 벗어난 입력에 대해
intExp2가 잘못된 결과를 반환하던 문제를 수정했습니다(JIT에서는 시프트>= 64, 두 코드 경로 모두에서는 절댓값이INT_MAX를 초과하는 정수). #105054 (Raúl Marín). clickhouse install및clickhouse git-import에서 CLI 옵션과 파싱된 입력으로 생성된 셸 인수를 따옴표로 감싸, 공백이나 셸 메타문자가 포함된 경로, 사용자/그룹 이름, commit 해시도 올바르게 처리되도록 했습니다. #105232 (Raúl Marín).- 이제
Alias테이블 엔진은 더 이상 Experimental 상태가 아니며,allow_experimental_alias_table_engine설정 없이 사용할 수 있습니다. #103488 (Alexey Milovidov). clickhouse-benchmark에--queries-format옵션을 추가하여, 기본 탭 이스케이프 방식의 한 줄당 하나의 쿼리 입력(tsv)과;로 구분된 여러 쿼리 스크립트로 표준 입력을 파싱하는 방식(script) 중에서 선택할 수 있도록 했습니다. #99972 (Aleksandr Musorin).- 요소별 튜플 연산자
tuplePlus,tupleMinus,tupleMultiply,tupleDivide,tupleModulo,tupleIntDiv,tupleIntDivOrZero가 이제 가변 인수를 지원하며, 크기가 같은 2개 이상의 튜플을 받아 좌측 폴드 방식으로 요소별 적용을 수행합니다. 이전에는 정확히 2개의 인수만 받을 수 있었습니다. #104659 (Aruj Bansal). /processors-profile에 새로운 내장 웹 UI가 추가되어,system.query_log와system.processors_profile_log를 기반으로 과거SELECT쿼리의 파이프라인을 히트맵으로 시각화할 수 있습니다. 각 processor는elapsed_us값에 따라 색상이 지정되며, 마우스를 올리면 processor별 통계(행 수, 바이트 수, 대기 시간)가 표시됩니다. #104614 (Nikita Mikhaylov).query_plan_use_logical_join_step설정(및 해당 alias인query_plan_use_new_logical_join_step)은 이제 obsolete 상태이며 더 이상 효과가 없습니다. logical join step이 항상 사용됩니다. #104017 (Vladimir Cherkasov).play.html과 다른 내장 웹 페이지(dashboard.html,jemalloc.html,merges.html,binary.html,webterminal.html)의user입력란은 더 이상default라는 고정 텍스트로 미리 채워지지 않습니다. 이제userplaceholder 힌트가 표시되며, 기본적으로 비어 있습니다. 비워 둔 경우 페이지는user=URL 매개변수를 전송하지 않으며(WebTerminal 인증 JSON에서도userfield가 생략됨), 이에 따라 server는 평소와 같이default사용자로 폴백합니다. 또한 다른 채널(X-ClickHouse-User, HTTP Basic, handler별<handler><user>구성)로 제공된 HTTP 자격 증명도 더 이상 덮어써지지 않습니다. #105254 (Alexey Milovidov).ORCreader: offset 기반 읽기(readBigAt)를use_prefetch와 분리하여,HDFS의 EC-encoded 데이터를use_prefetch = false인 경우에도(예: Gluten에서) 올바르게 읽을 수 있도록 했습니다. #103348 (zhanglistar).- 이제
play.html에서CSVWithNames포맷으로 다운로드한 파일은.csv파일 확장자를 사용합니다. #103737 (JackFielding). - BigLake catalog에 대한 입력 검증이 강화되었습니다. #105117 (Konstantin Vedernikov).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- 표현식이 괄호로 묶였는지 기억하도록 하여 일관되지 않은 포맷 문제를 수정했습니다. #92340 (Alexey Milovidov).
- Decimal과 Float 유형 간의 정확한 비교가 이루어지도록 수정했습니다. #94293 (zoomxi).
- 분산 쿼리에서 위치 인수를 사용할 수 있도록 했습니다. #94359 (simonmichal).
- 동일한 이름의 구체화된 뷰(materialized view)를 삭제한 뒤 다시 생성할 때
DatabaseCatalog::updateDependencies에서 발생하던 assertion failure를 수정했습니다. 또한 참조 의존성이 비어 있을 때RENAME TABLE또는EXCHANGE TABLES수행 중 뷰 의존성이 조용히 사라지던 문제도 수정했습니다. #98779 (Alexey Milovidov). - 기존 데이터베이스의 UUID와 동일한 UUID로
ON CLUSTER를 통해 테이블을 생성할 때 발생하던 서버 중단(assertion failure inDatabaseCatalog::getTableImpl) 문제를 수정했습니다. #98861 (xiaohuanlin). - 데이터 읽기 시 스킵 인덱스 사용(설정
use_skip_indexes_on_data_read가 활성화된 경우)과 경량 업데이트로 생성된 기존 patch parts 처리 문제를 수정했습니다. #99543 (Alexey Milovidov). - 쿼리 최적화기가
IN (subquery)가 포함된 filter를 PREWHERE로 이동할 때 발생할 수 있던 “Not-ready Set” 예외를 수정했습니다. #100375 (Alexey Milovidov). - 단일
ALTER TABLE문에서ADD COLUMN과RENAME COLUMN을 함께 사용할 때 발생하던 “Cannot find column” 오류를 수정했습니다. #100387 (Alexey Milovidov). UNION과INTERSECT/EXCEPT연산자가 혼합된 뷰가DETACH/ATTACH또는 서버 재시작 후 잘못된 결과를 반환하던 문제를 수정했습니다. #100390 (Alexey Milovidov).- IN 절에 상관 서브쿼리가 있을 때 AST 퍼저를 사용한 스트레스 테스트 중 발생할 수 있던 “Trying to execute PLACEHOLDER action” 예외를 수정했습니다. #100398 (Alexey Milovidov).
year,month,day변환으로 파티션된Date컬럼이 있는 Iceberg table에 삽입할 때 발생하던 logical error 예외를 수정했습니다. #100404 (Alexey Milovidov).ALTER TABLE MODIFY COLUMN으로 컬럼 유형이 변경된 뒤 호환되지 않는 데이터에 스킵 인덱스가 사용되던 문제를 수정했습니다. 이 문제는 새니타이저 빌드에서 서버 충돌이나 잘못된 쿼리 결과를 초래할 수 있었습니다. #100526 (Alexey Milovidov).paimonCluster,paimonS3Cluster,paimonAzureCluster,deltaLakeS3테이블 함수의query_log에서 자격 증명이 노출되던 문제를 수정했습니다. #100529 (JIaQi Tang).rd_kafka_consumer_close의 데드락으로 인해 Kafka engine 테이블에서DROP TABLE이 무기한 멈출 수 있던 문제를 수정했습니다. #100604 (Alexey Milovidov).- 하드코딩된
source_table_engines목록을StorageFactory및DatabaseFactory를 통한 런타임 조회로 대체합니다. 소스 엔진(PostgreSQL, MySQL, S3 등)을 사용하는CREATE DATABASE가CREATE TABLE과 동일한 소스 권한을 요구하도록DatabaseFactory::EngineFeatures에source_access_type을 추가합니다. 이로써table_engines_require_grant=false일 때GRANT TABLE ENGINE ON *가 실패하던 문제가 수정됩니다. #71544를 닫습니다. #100746 (pufit). ALIAS컬럼에 함수 호출 내부에 중첩된 상관 서브쿼리(예:ALIAS toString(intDivOrZero(x, (SELECT ...))))가 포함된 테이블을 읽을 때 발생하던 서버 크래시를 수정합니다. 이제CREATE TABLE및ALTER TABLE은DEFAULT/ALIAS/MATERIALIZED컬럼 표현식에서 깊이에 관계없이 모든 서브쿼리를THERE_IS_NO_DEFAULT_VALUE와 함께 거부합니다. 이전에는 얕은 검증으로 중첩된 서브쿼리가 허용되어, 상관 서브쿼리의 경우 읽기 시점에 크래시가 발생했고, 중첩되어 있지만 상관되지 않은 경우에는 동작하는 것처럼 보였지만 예기치 않은 동작으로 이어질 수 있었습니다. 이제 두 경우 모두 DDL 시점에 거부됩니다. #100753 (Groene AI).CONSTRAINT ... ASSUME정의가 있는 테이블에서 상관 서브쿼리가 포함된 쿼리를 사용할 때,optimize_substitute_columns및convert_query_to_cnf설정이 활성화되어 있으면 발생할 수 있던 서버 크래시(Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode)를 수정했습니다. #100756 (Groene AI).- JSON 컬럼에 행을 삽입할 때, 해당 행이 호환되지 않는 값을 가진 타입 지정 필드와 함께 새로운 동적 필드를 추가하고, 이후 그 컬럼이 GROUP BY 키로 사용될 경우 발생할 수 있던 예외를 수정합니다. #100758 (Jimmy Aguilar Mena).
DiskObjectStorageTransaction경로(s3_with_keeper디스크에서 사용되며,use_fake_transaction=false일 때 명시적으로 사용됨)를 거치는 S3/객체 스토리지 쓰기에서 workload IO scheduling이 조용히 우회되던 문제를 수정합니다. 이전에는 이러한 디스크의 MergeTree 테이블에 대한 INSERT 쓰기에서 트랜잭션 쓰기 경로용WriteSettings에 리소스 링크가 주입되지 않아CREATE RESOURCE/CREATE WORKLOAD스로틀링이 무시되었습니다. #100777 (JIaQi Tang).Protobuf와ProtobufList간 공유 스키마 캐시 충돌을 수정합니다. 메시지를 먼저FORMAT Protobuf로 읽고 그다음FORMAT ProtobufList로 읽으면,ProtobufList가 캐시된 스키마를 엔벌로프 형식으로 강제하기 때문에 실패할 수 있었습니다. 이제 엔벌로프 스키마를 사용할 수 없으면ProtobufList는 캐시된 메시지 유형으로 폴백합니다. #100849 (Callum Cooper).std::exceptionABI 불일치로 인해 발생하던 Rust CXX 브리지의 heap-buffer-overflow를 수정합니다. #100931 (Azat Khuzhin).- 이제
FunctionVariantAdaptor는 함수와 호환되는Variant대안이 하나도 없을 때, 조용히Nullable(Nothing)를 반환하는 대신ILLEGAL_TYPE_OF_ARGUMENT예외를 발생시킵니다. 이전에는 호환되는 대안 유형이 없는WHERE function(variant_col)프레디케이트가 오류 없이 0개의 행을 반환했지만, 동일한SELECT문맥에서는 이미 올바르게 예외가 발생했습니다. #100939 (Vasily Chekalkin). - 이제 데이터베이스에 뷰가 포함되어 있어도
TRUNCATE ALL TABLES가 더 이상 실패하지 않습니다. #100943 (Alexey Milovidov). optimize_rewrite_array_exists_to_has최적화가 타입이 호환되지 않는 경우(예: Date와 String)도 올바르게 처리하도록 수정하고, 기본적으로 다시 활성화했습니다. #100944 (Alexey Milovidov).storage_configuration디스크 설정이 전역<s3>섹션보다 우선 적용되고, 사용자/프로필/쿼리 수준 설정은 이 둘보다 우선 적용되도록 S3 설정 우선순위를 수정했습니다. #100975 (Alexey Milovidov).- 희소 직렬화에서 BFloat16, Float32, Float64 컬럼의 음수 0(-0.0) 부호가 손실되던 문제를 수정했습니다. #100983 (Takumi Hara).
- WKT로 인코딩된 GeoParquet 및 Arrow 파일을 읽을 때 사용하는 WKT geometry parser의 두 가지 버그를 수정했습니다.
MULTILINESTRINGgeometry가 잘못Polygon으로 파싱되던 문제(타입이 지정된 컬럼에서는 예외가 발생하고, 혼합Geometry컬럼에서는 데이터가 조용히 손상됨)와, 타입 키워드가 없는 잘못된 형식의 WKT 문자열이 명확한 오류 대신 정의되지 않은 동작을 일으키던 문제를 해결했습니다. #100997 (Vasily Chekalkin). - 단일 세그먼트가 있는 분산 테이블에서
grouping/GROUPING SETS쿼리가 “Method executeImpl is not supported for ‘grouping’ function” 오류와 함께 실패하던 문제를 수정했습니다. #101030 (Alexey Milovidov). - 동일한 테이블 표현식이 여러 번 처리될 때 발생할 수 있던 플래너의
LOGICAL_ERROR“Column identifier is already registered” 오류를 수정했습니다. #101048 (Alexey Milovidov). additional_result_filter설정을 UNION 또는 EXCEPT 쿼리와 함께 사용할 때 발생하던 LOGICAL_ERROR 예외 “Column identifier is already registered”를 수정했습니다. #101051 (Alexey Milovidov).- GROUPING SETS, ROLLUP 또는 CUBE와 함께 집계 함수가 포함된
* APPLY및group_by_use_nulls=1을 사용할 때 발생하던 server 크래시(Logical error: Bad cast from ColumnVector to ColumnNullable)를 수정했습니다. #101062 (Groene AI). input_format_csv_skip_first_lines또는input_format_tsv_skip_first_lines가 파일의 줄 수보다 클 때 발생하던 무한 루프를 수정했습니다. #101111 (Alexey Milovidov).- 디버그 build에서 예외를 일으킬 수 있던 lazy materialization optimization의 범위 밖 접근 문제를 수정했습니다. #101144 (Alexey Milovidov).
- 재귀 CTE의 type inference를 수정했습니다. 이제
UNION ALL의 비재귀 측과 재귀 측 전반에 걸쳐 컬럼 타입을getLeastSupertype으로 수렴할 때까지 반복적으로 확장하므로,x + 1과 같은 표현식에서 정수 오버플로우를 방지합니다. #101155 (Alexey Milovidov). - CREATE TABLE SETTINGS를 통해 극단적인 값을 설정했을 때 server 크래시가 발생하지 않도록 MergeTree 압축 block 크기 설정(max_compress_block_size, min_compress_block_size, marks_compress_block_size, primary_key_compress_block_size)을 256 MiB로 제한했습니다. #101159 (Groene AI).
- ROW POLICY가
USING절에서 스칼라 서브쿼리를 사용할 때(예:USING (SELECT 1))QueryAnalyzer::resolve()에서 발생하던 LOGICAL_ERROR 크래시를 수정했습니다. #100695를 닫습니다. #101263 (Groene AI). - stream 할당에 실패할 때
MergeTreeDataPartWriterCompact::cancel에서 발생하던 정의되지 않은 동작을 수정했습니다. #101292 (Alexey Milovidov). - ALTER statement에서 할당 시 시간대가 포함되지 않던 문제를 수정했습니다. #101328를 닫습니다. 관련: https://github.com/ClickHouse/ClickHouse/pull/100647. #101403 (Yarik Briukhovetskyi).
- SELECT pipeline이 여러 stream을 생성할 때 ORDER BY ALL이 포함된 INSERT SELECT 쿼리에서 발생하던 server 크래시(LOGICAL_ERROR)를 수정했습니다. #101443 (Groene AI).
- join 재정렬 과정에서 INNER JOIN filter(outer join의 보존되는 쪽만 참조)를 outer join의 ON 절로 밀어 넣어 발생하던 잘못된 쿼리 결과를 수정했습니다. #101504 (Vladimir Cherkasov).
- arrayJoin이 포함된 계획에는 lazy materialization을 적용하지 않도록 하여, limit가 지켜지지 않을 수 있던 문제를 수정했습니다. #101608을 닫습니다. #101644 (Vladimir Cherkasov).
mergeFilterIntoJoinCondition최적화가 타입이 일치하지 않는 WHERE 동등 조건을 조용히 삭제하면서 발생하던 잘못된 JOIN 쿼리 결과를 수정했습니다. #101652 (Xiaozhe Yu).error테스트 힌트가 구문/파싱 오류에서 동작하지 않던 문제를 수정했습니다 — 이전에는 잘못된 쿼리에 대한-- { error SYNTAX_ERROR }가 클라이언트 측 parse 오류와 매칭되지 않고 “Expected server error”로 실패했습니다. #101675 (Groene AI).INTO OUTFILE ... TRUNCATE가 실제로 atomic rename을 사용하지 않던 문제를 수정했습니다 — 원본 파일이 아니라 임시 파일에 써야 했지만 실제로는 원본 파일에 직접 기록되어, 쿼리 실패 시 원본 내용이 손상되었습니다. 이제 데이터는 임시 파일에 기록되며 성공한 경우에만 rename됩니다. #101884 (Pablo Marcos).- schema에 varchar(n) 또는 char(n) 컬럼 타입이 포함된 Delta Lake 테이블을 읽을 때 발생하던
Unsupported DeltaLake type: varchar(n)예외를 수정했습니다. 이제 이러한 타입은 Delta Lake protocol이 Parquet에서 이를 일반 바이트 배열로 저장하는 방식과 일관되게 String으로 매핑됩니다. #101973 (Flavio Malavazi). schema_inference_mode=union과 이질적인 Parquet schema를 사용하는 S3의 tar 아카이브를 읽을 때 발생하던 조용한 데이터 손실을 수정했습니다 — Parquet metadata cache가 아카이브의 첫 번째 파일 metadata를 이후 모든 파일에 잘못 재사용하고 있었습니다. #101990 (Ahaan Limaye).- 동일한 server lifetime 동안 해당 테이블에 대해 이전에 SELECT 또는 INSERT가 한 번도 수행되지 않은 상태에서 Iceberg 테이블에 ALTER TABLE UPDATE/DELETE를 실행하면 발생하던 server 크래시(LOGICAL_ERROR)를 수정했습니다. #102113 (Alexey Milovidov).
- 인메모리 데이터베이스(예: 임시 테이블)의 테이블에서 ALTER 쿼리를 실행할 때 발생할 수 있는 크래시를 수정했습니다. #102360 (Den Kalantaevskii).
- 동일한 소스에 대해 하위 호환 READ/WRITE 권한 부여를 포맷할 때
formatQuery가GRANT FILE ON *.*, FILE ON *.* TO x처럼 중복된 권한 부여를 생성하던 문제를 수정했습니다. 이제GRANT FILE ON *.* TO x만 생성합니다. #102411 (Groene AI). max_streams_to_max_threads_ratio가 1보다 클 때 read-in-order 쿼리 이후 집계의 병렬성이 손실되던 문제를 수정했습니다. #102467 (Alexey Milovidov).- Buffer 테이블 엔진에서 서브컬럼(예: 널 허용의
.null, 배열의.size0, Tuple 요소 또는 맵 키/값)을 선택할 때 발생하던 크래시(LOGICAL_ERROR: Unknown virtual column)를 수정했습니다. #102470 (Groene AI). join_use_nulls를 사용하는 LEFT/RIGHT JOIN이 3개 이상의 테이블이 포함된 다른 조인과 함께 사용될 때, 조인 재정렬 최적화에서 발생하던 “Cannot fold actions for projection” 예외를 수정했습니다. #102516 (Alexey Milovidov).- numericIndexedVector에서 스칼라 원소별 연산(예:
numericIndexedVectorPointwiseAdd) 수행 시 스칼라가 범위를 벗어나면 조용히 오버플로우가 발생하던 문제를 수정했습니다. 이제 이런 입력은 손상된 값을 반환하는 대신INCORRECT_DATA오류를 발생시킵니다. #102546 (FriendLey). - SAMPLE 및 쿼리 수준 OFFSET이 포함된 INSERT의 AST 포맷이 일관되지 않던 문제를 수정했습니다. #102523를 닫습니다. #102547 (zoomxi).
- 잘못된 집계 함수 상태를 역직렬화할 때
groupConcat에서 발생하던LOGICAL_ERROR예외를 수정했습니다. #102558 (Christoph Wurm). - 이제
input_format_csv_use_default_on_bad_values=0일 때 Time64 CSV 값 끝부분의 잘못된 데이터를 허용하지 않습니다. #102490를 닫습니다. #102596 (Yarik Briukhovetskyi). - Enum 타입 경로가 있는 JSON 컬럼에 기본값을 삽입할 때 발생하던 UNKNOWN_ELEMENT_OF_ENUM 예외를 수정했습니다. #102359를 닫습니다. #102687 (Pavel Kruglov).
- 일부 경우 컬럼 이름 변경 중
columns_substreams.txt가 손상되던 문제를 수정했습니다. #102259를 닫습니다. #102689 (Pavel Kruglov). - JSON 파싱 중 Time 데이터 타입에 삽입할 때 발생하던 문제를 수정했습니다. #102016를 닫습니다. #102690 (Pavel Kruglov).
- 캐시된 스키마 파일 이름에서 content sample의 16진수 인코딩 문제를 수정했습니다. #101904를 닫습니다. #102703 (Pavel Kruglov).
SummingMergeTree머지 중ORDER BY키가 signaling NaN 값을 포함한Float32컬럼에 대한 hash 표현식일 때 발생하던 정렬 순서 위반(디버그에서는 크래시, 릴리스에서는 조용한 데이터 손상) 문제를 수정했습니다. #102791 (Groene AI).DETACH DATABASE ... SYNC및waitDetachedTableNotInUse를 호출하는 기타 작업이KILL QUERY로 취소 가능하고 server 종료에도 응답하도록 변경하여, 동시에 실행되는 쿼리가 테이블 참조를 보유할 때 무기한 대기 상태에 빠지는 문제를 방지했습니다. #102804 (Antonio Andelic).ANY RIGHT JOIN에서 잘못된 결과가 나올 수 있던 문제를 수정했습니다. #102893 (Nikita Taranov).- socket 계층의 짧은 쓰기를 Poco
BufferedStreamBuf::flushBuffer가 처리하지 못해, S3 요청이 재시도되지 않고ios_base::clear: unspecified iostream_category error로 실패하던 문제를 수정했습니다. #102894 (Sema Checherinda). - INSERT SELECT 쿼리에서 HTTP 인터페이스를 통해
input('auto')테이블 함수가 실패하던 문제를 수정했습니다. #102902 (Miсhael Stetsyuk). - row policies/additional_table_filters에서 단순한 LIMIT 최적화를 비활성화했습니다(병렬 인덱스 분석을 허용하기 위해). #102921 (Azat Khuzhin).
HMACSQL 함수에서 시크릿 키를 숨기도록 했습니다. #102927 문제를 수정했습니다. #102997 (Mikhail f. Shiryaev).optimize_syntax_fuse_functions가 활성화된 상태에서 동일한quantile호출을 여러 번 참조하는 분산 쿼리(예:SELECT,HAVING,ORDER BY)에서 발생하던MULTIPLE_EXPRESSIONS_FOR_ALIAS예외를 수정했습니다. #103014 (tanner-bruce).- 필터가 왼쪽 컬럼에 의존할 때 준비되지 않은 Set이 전달되던 CI에서 발견된 사례를 수정했습니다. #102966을 닫습니다. #103029 (Yarik Briukhovetskyi).
- 일부 경우
castOrNull을 JSON으로 변환할 때 발생하던 문제를 수정했습니다. #101818을 닫습니다. #103036 (Pavel Kruglov). - 집계 PROJECTION이 쿼리와 일치하고 테이블의 일부 파트에 PROJECTION 데이터가 없을 때(예: 이미 데이터를 보유한 테이블에 PROJECTION이 추가되었지만
MATERIALIZE PROJECTION을 실행하지 않은 경우)SELECT DISTINCT가 불완전한 결과를 조용히 반환하던 문제를 수정했습니다. #102951을 닫습니다. #103052 (Nihal Z. Miaji). - 분석기에서 공통 표현식 추출 중
AND(OR(A, A), A)와 같은WHERE프레디케이트가 최상위 단일 인수로 축약될 때 발생하던TOO_FEW_ARGUMENTS_FOR_FUNCTION예외를 수정했습니다. #103072 (Peng). QBit요소를 포함한 튜플, 맵 또는 배열에 대해if/ifNull을 평가할 때 발생하던 논리 오류Function writeSlice expects same column types for GenericArraySlice and GenericArraySink를 수정했습니다.ColumnQBit::structureEquals가 한QBit컬럼의 내부 튜플을 다른QBit컬럼의 외부 래퍼와 잘못 비교해, 구조적으로 동일한QBit컬럼을 서로 다른 것으로 판단하고 있었습니다. #103084 (Groene AI).database_atomic_wait_for_drop_and_detach_synchronously와 함께 사용하는DETACH DATABASE가 테이블 참조가 유지되고 있을 때 무기한 대기하지 않고KILL QUERY를 따르도록 수정했습니다. #103095 (Alexey Milovidov).- 식별자가 아닌 프레디케이트를 사용해 WASM 모듈을 삭제할 때(예:
WHERE 1=1) 발생하던 segfault를 수정했습니다. #103101 (Joe Redfern). remote()또는 분산 테이블을 통해 더 최신 server에 삽입할 때, 기존 클라이언트가UNEXPECTED_PACKET_FROM_SERVER와 함께 실패하던 하위 호환성 문제를 수정했습니다. 원인은processInsertQuery끝에서sendProgress를 무조건 호출하던 것이었습니다. #103148 (Sema Checherinda).- 두 번째 인수로 상수가 아닌 튜플을 사용하는 IN에서는, 튜플 요소를 좌변 타입으로 CAST해 축소하면 안 되도록 수정했습니다. 이 경우 오버플로우가 발생할 수 있습니다. #103055를 닫습니다. #103169 (Yarik Briukhovetskyi).
- protocol 함수에서 초기화되지 않은 값을 사용하던 문제를 수정했습니다. #103187 (Pavel Kruglov).
WHERE절에서LowCardinality키 컬럼을 중첩된LowCardinality를 포함하는 타입으로 CAST한 상수(예:Variant(LowCardinality(Date), String))와 비교할 때, MergeTree 인덱스 분석 중 발생하던LOGICAL_ERROR(Bad cast … to ColumnLowCardinality)를 수정했습니다. #103211 (Groene AI).timeSeries*ToGrid집계 함수 계열(예:timeSeriesResampleToGridWithStaleness,timeSeriesChangesToGrid,timeSeriesResetsToGrid,timeSeriesRateToGrid)을 버킷 수 계산에서 부호 있는 64비트 산술 오버플로우를 일으킬 수 있는 극단적인 timestamp 매개변수로 호출할 때 발생하던Logical error: 'index < bucket_count'를 수정했습니다. 또한 악의적인 입력으로 인해 대규모 메모리 할당이 실수로 발생하지 않도록 전체 그리드 버킷 수를 최대 1,600만 개로 제한했습니다. #103223 (Groene AI).ReplacingMergeTree의 지연 실행FINAL경로에서 파이프라인 확장 중 발생하던Logical error: 'Port is already connected'예외를 수정했습니다. 이 버그는query_plan_optimize_lazy_final = 1인 쿼리에 영향을 주었으며,ReadFromMergeTree::initializePipeline이 내부 변환(예:Resize)을 삽입해 서브 파이프라인의 processors를 서로 연결하면서LazyUnorderedReadFromMergeTreeSource::expandPipeline이 이미 연결된 출력 포트를 다시 연결하려고 시도한 것이 원인이었습니다. #103230 (Groene AI).- 입력이 정렬된 서브쿼리들의
UNION ALL인 경우LIMIT BY와DISTINCT에서 잘못된 결과가 나오던 문제를 수정했습니다. 쿼리 계획 최적화기가 이러한 union을 전역적으로 정렬된 것으로 잘못 판단해 추가 행이 반환되고 있었습니다. #103231 (Nihal Z. Miaji). - 지연 복제가 적용된 맵(Map) 타입에서 통계 계산 중 발생할 수 있던 크래시를 수정했습니다. #102390을 닫습니다. #103273 (Pavel Kruglov).
- ClickHouse, MySQL, PostgreSQL 및 XDBC 딕셔너리 소스에서
clone() const와isModified() const가 동일한invalidate_query_response문자열을 각각 읽고 쓰면서 발생하던 data race를 수정했습니다. #103277 (Miсhael Stetsyuk). Date32의 잘못된 단조성 감지를 수정했습니다. #101265를 닫습니다. #103283 (Yarik Briukhovetskyi).- 인증 전 TCP Hello 패킷 문자열을 64 KB로 제한하고, 전체 handshake 시간을 제한하는
handshake_timeout_millisecondsserver setting을 추가해 인증되지 않은 클라이언트가 과도한 메모리를 사용하거나 스레드를 무기한 점유하지 못하도록 했습니다. #103284 (Sema Checherinda). - String 컬럼의 Parquet ColumnIndex 통계에서
min_value > max_value가 되는 문제를 수정했습니다. #103334 (Saurabh Kumar Ojha). flattenTuple및tupleToNameValuePairs에서Nullable(Tuple(...))입력의 NULL 행을 잘못 처리하던 문제를 수정했습니다. 이제flattenTuple은 바깥쪽 null 맵을 유지하므로 NULL 행이 그대로 NULL로 유지됩니다. 또한tupleToNameValuePairs는 입력이Nullable(Tuple(...))일 때 가능한 경우 결과 값 타입을Nullable(T)로 변경하므로, NULL 행이[('a', 0), ('b', 0)]대신[('a', NULL), ('b', NULL)]을 생성합니다. 요소 타입을Nullable로 감쌀 수 없는 경우(예:Array)에는 NULL 대신 기본값이 사용됩니다. #103312를 닫습니다. #103383 (Nihal Z. Miaji).- Native 형식에서 잘못된 flattened Dynamic 데이터를 검사하도록 수정했습니다. #103392 (Pavel Kruglov).
- snapshot 동기화 후 오래된 RPC로 인해 복제가 멈추던 문제를 수정했습니다. #103406 (Seva Potapov).
- BSON 타입이
Nullable(T)또는Array(Nullable(T))컬럼 내부의 대상 컬럼 타입과 호환되지 않는 값을 포함한 잘못된 BSON document를 읽을 때, 서버를 중단시키던LOGICAL_ERROR“Cannot pop N rows from X”를 수정했습니다(디버그 / 새니타이저 build에서 발생). 이제 잘못된 행은 의도한 대로 깔끔한ILLEGAL_COLUMNexception을 생성합니다. #103418 (Groene AI). - 첫 번째 행이 비어 있는
Array(String)컬럼에 상수 false 람다를 함께 적용할 때arrayFill및arrayReverseFill에서 발생하던 서버 중단을 수정했습니다. aggregate / sub-array 루프에서size_t인덱스가 underflow되어SIZE_MAX가 되었고, 그 결과ColumnString::doInsertManyFrom내부에서 범위를 벗어난 읽기가 발생했습니다. #12263와 같은 계열의 버그입니다. #103424 (Groene AI). - 상위 REPLACE RMV의 EXCHANGE가 해상도 결정 중 대상 storage 아이덴티티를 바꾸면서, SQL SECURITY DEFINER를 사용하는 하위 APPEND RMV에서 발생하던 ACCESS_DENIED / UNKNOWN_TABLE 문제를 수정했습니다. #103427 (Alexander Gololobov).
url테이블 함수에서_time컬럼을 채우도록 수정했습니다. #103437 (Nikita Taranov).- 잘못된 비트 폭을 가진 비정상 입력을 처리할 때
ALP코덱 압축 해제 경로에서 발생할 수 있는 범위 밖 읽기 문제를 수정했습니다. #103457 (Raufs Dunamalijevs). SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ...에서 쿼리를 포맷하는 과정에서 캐시 이름이 누락되어, 원격 노드가 요청된 캐시만 동기화하는 대신 모든 파일 시스템 캐시를 동기화할 수 있던 버그를 수정했습니다. #103469 (Asish Kumar).deltaLakeAzure에서 URL 인코딩된 경로를 처리하는 문제를 수정했습니다. #103509를 해결합니다. #103525 (Smita Kulkarni).AggregateFunction상태에 정수를 곱할 때(예:quantilesExactState(...) * N) 발생하던 heap-use-after-free 문제를 수정했습니다. 제곱을 이용한 거듭제곱 루프에서 상태를 자기 자신과 머지했는데, 집계 함수의merge가 내부 저장소를 재할당하는 경우 이는 정의되지 않은 동작입니다. STID 0988-40af를 해결합니다. #103536 (Groene AI).- 디스크에 있는 2개의 비어 있는 Unexpected 파트가 서로 겹치지만 포함 관계는 아닌 블록 범위를 가질 때,
ReplicatedMergeTree테이블 시작 중 드물게 발생하던LOGICAL_ERROR“Part X intersects previous part Y”를 수정했습니다. 이 예외로 인해 테이블 ATTACH 스레드가 중단되어 테이블이 시작되지 못했습니다. #103537 (Groene AI). - 마지막 데이터 마크가 불완전한 비적응형 인덱스 세분화 수준(
index_granularity_bytes = 0)의MergeTree테이블에서 뮤테이션으로 인해 트리거되던Logical error: Incorrect mark rows for part ...(디버그 전용 assertion)을 수정했습니다. 이 문제는DETACH/ATTACH후 경량DELETE를 수행하면 가장 쉽게 재현되었습니다. #103538 (Groene AI). file()테이블 함수를 통해/proc및/sys의사 파일을 읽을 때(예:SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')),clickhouse-local이 아무런 경고 없이 0행을 반환하던 문제를 수정했습니다. #103548 (Ashrith Bandla).GenerateRandom테이블 엔진의max_string_length인수 처리 문제를 수정했습니다. #103550 (Alex Kuleshov).- 로그에서 중첩된 자격 증명을 마스킹하는 처리 문제를 수정했습니다. #103552 (Vitaly Baranov).
- 사용할 수 없을 때도 SVE 명령어를 사용하던 SVE 감지 문제를 수정했습니다. #103568 (Raúl Marín).
GenerateRandom스토리지 인수 파싱 문제를 수정했습니다. #103574 (Konstantin Bogdanov).- 데이터가 ±inf로 시작할 때
WITH FILL에서 발생하던 무한 루프를 수정했습니다. #103580 (Konstantin Bogdanov). JSONExtract가Variant타입으로 추출할 때 JSON의 소수 숫자를 소리 없이 잘라내던 문제를 수정했습니다. 이전에는JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)')가Int64=3을 반환했고,JSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)')도Int64=3을 반환해 소수 부분이 사라졌습니다. 이제는 소수 값이 손실 없이 보존됩니다.Float64/Decimal멤버가 있으면 해당 멤버가 값을 저장하고, 그렇지 않으면String멤버가 원래 JSON을 담습니다. 정수 멤버만 포함하는Variant타입(예:Variant(Int64, Int32))과 직접 정수 추출(JSONExtract(json, 'Int64'),JSONExtractInt등)은 변경되지 않습니다. #103620 (Groene AI).- 인수 없이
SYSTEM INSTRUMENT REMOVE를 실행했을 때SYNTAX_ERROR(오류 코드 62) 대신std::bad_optional_access(오류 코드 1001)가 발생하던 문제를 수정했습니다. #103622 (Pablo Marcos). - 시간대 문자열을 3번째 인수로 전달해 호출했을 때
windowID및tumblewindow view에서 발생하던 logical error / 정의되지 않은 동작을 수정했습니다. #103641 (Alexey Milovidov). - 이제 S3 클라이언트 로깅은 비어 있지 않은 x-amz-bucket-region 헤더(잘못된 SigV4 서명 Region)를 포함한 HTTP 400 응답을 일반적인 오류 경로로 처리하지 않고, 더 명확한 로그 메시지와 함께 정보성 wrong-region 사례로 처리합니다. 또한 STS 웹 아이덴티티 자격 증명 provider는 웹 아이덴티티가 구성된 경우에만 S3 자격 증명 체인에 추가되므로, 이를 사용하지 않는 배포에서 불필요한 경고가 줄어듭니다. #99140을 해결합니다. #103673 (MeltonSmith).
- 데이터베이스가 존재하지 않을 때
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS가 오류 없이 성공하도록 수정해, 테이블이 없을 때의 기존 동작 및DROP TABLE IF EXISTS의 선례와 일치시켰습니다. 이전에는IF EXISTS가 있어도 쿼리가UNKNOWN_DATABASE를 발생시켰습니다. #103629을 해결합니다. #103689 (Groene AI). MergeTree테이블의 정렬 키에Array(LowCardinality(...))가 있고,WHERE절에서 해당 컬럼과 요소 타입이 다른Array상수 사이에plus/minus를 사용할 때FunctionBinaryArithmetic::executeImpl2가Arguments of 'plus' have incorrect data types라는 logical error를 발생시키던 문제를 수정했습니다. 이제KeyCondition::getMonotonicityForRange는 내부 숫자 디스패치를 호출하기 전에LowCardinality를 재귀적으로 제거합니다. #103701 (Groene AI).- 26.1+에서 동적 cache 크기 조정 중 발생하던 경쟁 상태를 수정했습니다. #103702 (Kseniia Sumarokova).
- 표현식에 캡처된 상수가 있는 람다(예:
arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m))))가 포함된ALIAS컬럼에서 text 및 bloom_filter skip 인덱스가 소리 없이 무시되던 문제를 수정했습니다. #103708 (Anton Popov). UINT64_MAX에 가까운start_pos에서position및positionCaseInsensitive가 오버플로우하는 포인터 산술 때문에 멈추거나 세그멘테이션 폴트를 일으키던 문제를 수정했습니다. #103766 (Raúl Marín).- 소수 부분이 두 번 포함된 dateTime을 파싱하는 과정에서 발생하던 정의되지 않은 동작을 수정했습니다. #103773 (Yarik Briukhovetskyi).
- 26.x에서
Decimal결과 유형이고 한 분기에는 비-Decimal(정수 또는 부동소수점) 리터럴이 있는 JIT 컴파일if및multiIf가, 값이 실제보다10^scale배 작게 조용히 반환되던 데이터 정확성 회귀를 수정했습니다. 느린(비-JIT) 경로는 영향을 받지 않았습니다. 영향을 받는 버전의 우회 방법:SET compile_expressions = 0. #103809 (Groene AI). - text index에서 지원되는 함수로 토크나이저가 전달되지 않던 문제를 수정했습니다. #103826 (Elmi Ahmadov).
WHERE절에서, 요소들이 단일 키 컬럼으로 deduplicate되는 tuple에 대해IN또는NOT IN을 사용할 경우numbers,generate_series및 유사한 범위 준수 소스가 잘못된 결과를 반환하던 문제를 수정했습니다(예:WHERE tuple(number, number) NOT IN (tuple(1, 2))). #103660을 해결합니다. #103835 (Groene AI).- 자동 스필 해시 조인의 실제 메모리 피크가
max_bytes_before_external_join이하로 유지되도록 했습니다. 이전에는 통계 기반 사전 할당, 제자리 해시 테이블 확장, 그리고 제한 없는GraceHashJoin인메모리 버킷 때문에 각각 쿼리가 구성된 한도를 초과하여MEMORY_LIMIT_EXCEEDED가 발생할 수 있었습니다. #103838 (Alexey Milovidov). - system logs(
text_log,filesystem_cache_log등)가 구성된 경우clickhouse-local종료 시 멈추는 문제를 수정했습니다.SystemLogs::flushImpl가BaseDaemon::instance().flushTextLogs()를 호출하고 있었는데, 이는clickhouse-server외부에서std::bad_cast를 발생시키고 저장 스레드를 계속 실행 상태로 남겨pthread_cond_destroy가 system log 큐의 파괴를 막고 있었습니다. #103874 (Alexey Milovidov). - 본문이 참조마다 서로 다른 추론 컬럼 유형으로 해석되는
MATERIALIZEDCTE 쿼리는, 서버를Bad castLOGICAL_ERROR로 크래시시키는 대신 명확한TYPE_MISMATCH오류로 거부하도록 했습니다. 이는 이전에 CTE 본문이 외부 스코프의 식별자(예: 호출하는 subquery의 projection에 있는 alias)를 참조하고, 이것이 참조마다 서로 다른 상수로 인라인될 때 발생했습니다. #103879 (Groene AI). ANYOUTERJOIN위의 filter에rand,now,rowNumberInAllBlocks같은 비결정적 함수가 포함될 때 JOIN 변환 쿼리 계획 최적화기(tryConvertAnyOuterJoinToInnerJoin,tryConvertAnyJoinToSemiOrAntiJoin)에서 초기화되지 않은 값을 사용하던 문제를 수정했습니다. 이제 최적화기는 이러한 filter를 상수 폴딩하려고 시도하지 않고 JOIN도 변경하지 않습니다. 이로써 행이 조용히 누락될 수 있었던INNER/SEMI/ANTI JOIN으로의 잘못된 변환도 방지됩니다. #103880 (Groene AI).- consumer가 임시(ephemeral) topic-partition 잠금을 보유한 상태에서 Keeper session이 교체될 경우 서버가 크래시할 수 있었던
StorageKafka2의 use-after-free 문제를 수정했습니다. #103890 (Groene AI). EmbeddedRocksDB테이블을JOIN ... USING (key)로 조인할 때, subquery의 키 컬럼 유형이 스토리지의 프라이머리 키와 다른 유형(예:Nullable(UInt64),Int64,Decimal)이면 발생하던LOGICAL_ERROR“Primary key type mismatch”를 수정했습니다. 이제 플래너는 유형 불일치 시DirectKeyValueJoin을 적용하지 않고, 유형 변환을 처리할 수 있는HashJoin으로 대체합니다. #103928 (Groene AI).SET max_threads = DEFAULT(max_final_threads및max_parsing_threads도 동일)에서 더 이상 auto 상태가 사라지지 않습니다. 이전에는 이 설정들 중 하나를 재설정한 후system.settings가'auto(32)'대신 해석된 코어 수(예:32)를 표시했고, server는 해당 값이 명시적으로 고정된 것처럼 동작했습니다. #103991 (Groene AI).- 저장된
alpha_size가 25.12 이전 버전의 deserialize+serialize 사이클로 증가한AggregateFunction(topK(N), String)컬럼을 읽을 때 발생하던SIZES_OF_ARRAYS_DONT_MATCH를 수정했습니다. #104002 (Raúl Marín). - PostgreSQL, Cassandra 및 XDBC 딕셔너리 소스의 SQL injection 취약점을 수정했습니다. 작은따옴표가 포함된 문자열 키는
\'(백슬래시)로 이스케이프되었지만, 이들 backend는 이를 이스케이프 시퀀스가 아니라 문자 그대로의 백슬래시로 처리하므로 딕셔너리 lookup 쿼리에 임의의 SQL이 삽입될 수 있었습니다. 이제ExternalQueryBuilder는 해당 backend에 대해 SQL 표준''이스케이프를 생성하며, ClickHouse 및 MySQL 딕셔너리 소스는 계속 백슬래시 이스케이프를 사용합니다. #104009 (Shaohua Wang). - 컬럼 유형이 LowCardinality로 변경되거나 LowCardinality에서 다른 유형으로 변경되었고 min-max projection이 재구축되지 않았을 때 집계에서 발생할 수 있는 유형 불일치를 수정했습니다. #104013 (Nikita Taranov).
- 표현식을 병합할 때 사용되지 않는 컬럼 제거 방지 정보가 전파되지 않아 발생하던 쿼리 최적화의 무한 루프를 수정했습니다. #104083 (János Benjamin Antal).
- 이름 기반 대신 UUID 기반 아이덴티티 추적을 사용하여 streaming 테이블(S3Queue, Kafka, RabbitMQ)의 batch 이름 변경 시
StreamingStorageRegistry::renameTable에서 발생하던LOGICAL_ERROR를 수정했습니다. #104101 (Nikita Taranov). UNION ALL로 구성된 CTE에SELECT DISTINCT브랜치가 포함되어 있고 바깥쪽 쿼리가 CTE 컬럼의 부분 집합만 projection할 때 잘못된 결과가 나오던 문제를 수정했습니다. 새로운 분석기의RemoveUnusedProjectionColumnsPass가 내부DISTINCTprojection에서 참조되지 않은 컬럼을 잘못 제거하면서, 원래는 distinct 상태로 유지되어야 할 행들(즉, projection된 컬럼의 값은 같지만 제거된 컬럼의 값은 다른 경우)이 하나로 합쳐졌습니다. #104114 (Groene AI).optimize_inverse_dictionary_lookup설정에서 최적화가 행을 조용히 누락시키거나 예외를 억제할 수 있었던 여러 edge case 정합성 문제를 수정했습니다. #103270을 닫습니다. #103085를 닫습니다. #104133 (Nihal Z. Miaji).quantileTiming상태를 deserialize하는 동안 발생하던 범위 밖 쓰기를 수정했습니다. #104141 (Alexey Milovidov).- 범위를 벗어난
Float64값이 wide 정수 유형(UInt64,Int64,Int128,UInt128,Int256,UInt256)으로 변환될 때 발생하는 정의되지 않은 동작을 수정했습니다. 이전에는Float64(numeric_limits<T>::max())와 같은 값(실제 최댓값보다 큰 값으로 반올림됨)이 경계 검사를 우회해 이후 cast에서 UB를 유발했습니다. 이는 집계 함수 매개변수 파싱(topK,histogram,uniqUpTo,groupArrayInsertAt등)과SET <setting> = <Float64>를 통한 정수 유형 설정에 영향을 주었습니다. #103817을 닫습니다. #104154 (Groene AI). - 중첩된
Tuple(Tuple(Nullable(...)))(또는 그보다 더 깊은 중첩)을String리터럴과 비교할 때 발생하던LOGICAL_ERROR예외 “Unexpected return type from comparison. ExpectedUInt8. GotConst(Nullable(UInt8))”를 수정했습니다. 이제 비교 결과의 반환 유형이 런타임 동작과 일치하게Nullable(UInt8)로 올바르게 추론됩니다. #104171 (Groene AI). query_plan_optimize_lazy_final = 1일 때SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr>에서 발생하던 서버 중단(UndefinedBehaviorSanitizer: reference binding to null pointer, 릴리스 빌드의 segfault)을 수정했습니다. 지연 실행 FINAL의 비교차 읽기 단계에서is_deleted컬럼을 입력으로 소비한 뒤 출력에 다시 포함하지 않아 출력 헤더에서is_deleted컬럼이 누락되었습니다. 그 결과 후속addIsDeletedFilter단계에서 nullActionsDAG::Node포인터를 역참조했습니다. #104177 (Groene AI).- system.failpoints 테이블을 호출할 때 failpoint가 사용되어 비활성화될 수 있던 문제를 수정했습니다. #104237 (Pedro Ferreira).
- 입력에 버퍼 경계에서 정확히 끝나는 UTF-8 문자가 포함될 때
detectLanguage*함수에서 발생하던MemorySanitizer: use-of-uninitialized-value를 수정했습니다. #104257 (Raúl Marín). - 기본 객체 스토리지가 파일 시스템 캐시와 같은 데코레이터로 래핑된 디스크를 대상으로
SETTINGS disk = '...'와 함께 호출할 때, 데이터 레이크 테이블 함수 및 엔진(icebergS3,deltaLakeS3등)의 인수 파싱이 중단되던 논리 오류(Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage)를 수정했습니다. #89300을 해결합니다. #104258 (Groene AI). values라는 이름의 컬럼에 대한 괄호로 감싼 아래첨자 표현식(예:(values['a']))의 파싱을 수정하여, 더 이상 SQL 표준VALUES테이블 표현식으로 해석되지 않도록 했습니다. #104312 (Desel72).- 파일 시스템 캐시 백그라운드 축출 스레드(
SLRUFileCachePriority::collectEvictionInfo)에서 발생할 수 있던 서버 중단/LOGICAL_ERROR를 수정했습니다. 이 문제는keep_free_space_size_ratio또는keep_free_space_elements_ratio가 충분히 높아, 모든 캐시 엔트리가 이미 SLRU 보호 큐로 승격된 상태(수습 큐는 비어 있음)에서 축출이 트리거될 때 발생할 수 있었습니다. #104313 (Groene AI). - UNION ALL 뷰, 윈도우 함수 또는 별칭과 컬럼 이름 충돌이 있는 경우에 프로젝션 사용 시 발생하던 예외(
NOT_FOUND_COLUMN_IN_BLOCK,LOGICAL_ERROR,AMBIGUOUS_COLUMN_NAME)를 수정했습니다. #88798에서 비롯된 회귀입니다. #104317 (Amos Bird). - Postgres 배열 파싱에서 발생할 수 있는 underflow를 수정했습니다. #104322 (Grant Holly).
- 이제
Array,Tuple,Map처럼Nullable이 아닌 유형을 반환하는 함수도Nullable인수를 받을 수 있습니다. 영향받는 함수는extractAll,extractAllGroups,extractAllGroupsHorizontal,extractAllGroupsVertical,extractGroups,splitByChar,splitByString,splitByRegexp,splitByWhitespace,splitByNonAlpha,alphaTokens입니다.NULL입력 행이 들어오면 이제 “Nested type is not allowed inside Nullable type” 오류를 발생시키는 대신 결과 유형의 기본값(예: 빈 배열)을 반환합니다. #104326 (Alexey Milovidov). - 파티션된 테이블에서 Iceberg 통계를 수정했습니다. 이로써 #104321이 해결됩니다. #104329 (Konstantin Vedernikov).
- macOS(및 유사한 jemalloc build)에서 server 시작 시 발생하던 치명적인 logical error를 수정했습니다. 이 문제는 선택적
background_thread/max_background_threadsmallctl이 없는데도Jemalloc::verifySetup이jemalloc_enable_background_threads불일치를 잘못 보고하면서 발생했습니다. 이제 해당 mallctl을 사용할 수 없으면 검증을 건너뛰며,getValue도 실패 시 출력값이 초기화되지 않은 상태로 남지 않도록 수정했습니다. 이로써 #102183이 해결됩니다. #104330 (SAYON DEEP). max_rows_to_read_leaf및read_overflow_mode_leaf = 'throw'를 사용하는SELECT쿼리에서, 스킵 인덱스로 인해 실제 읽기량이 leaf 제한 아래로 줄어들 수 있는데도TOO_MANY_ROWS를 잘못 발생시키던 정확성 회귀를 수정했습니다. 대응되는 non-leaf 설정(max_rows_to_read/read_overflow_mode)은 이미 올바르게 처리되고 있었습니다. #104331 (Groene AI).toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,UUID및Nullable(UUID)로CAST,UUID로accurateCastOrNull, 그리고 텍스트에서 UUID를 파싱하는 입력 형식(Avro,MsgPack,JSONExtract, …)이 이제 길이는 맞지만 16진수가 아닌 문자를 포함한 문자열을 거부합니다. 이전에는 이런 입력이 16진수 숫자 lookup table의 끝을 벗어나면서 조용히 가짜 UUID로 변환되었습니다. 이제toUUID는CANNOT_PARSE_UUID를 발생시키고,Or*변형은NULL/ zero UUID / 지정된 기본값을 반환합니다. #104370 (Groene AI).caseWithExpression(및 SQLCASE expr WHEN ... THEN ... ELSE ...)에서 THEN만의 supertype과 (THEN들 + ELSE)의 supertype이 서로 다른ColumnDecimalstorage에 놓일 때 발생하던Bad castLOGICAL_ERROR를 수정했습니다. 예를 들어 THEN 값이(UInt16, Int8)이고 ELSE가Decimal(9, 2)인 경우입니다. 이로써 #104335이 해결됩니다. #104378 (Groene AI).logExceptionBeforeStart를 통해 보고되는 내부 실패(비동기 삽입 플러시, 구체화된 뷰(Materialized View) 갱신, 내부 쿼리 중 발생한 parse 오류)가 이제 사용자에게 보이는FailedQuery,FailedSelectQuery,FailedInsertQuerycounters와 함께FailedInternalQuery,FailedInternalSelectQuery,FailedInternalInsertQueryProfileEvents도 올바르게 증가시킵니다. 이전에는 쿼리 실행이 시작되기 전에 발생한 실패의 경우 이러한 내부 counters가 0으로 남아, 중요한 내부 실패 범주가 과소 집계되고 있었습니다. #104399 (Groene AI).BACKUP또는RESTORE구문의base_backup설정 안에서 쿼리 매개변수를 사용할 때 발생하던Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}예외를 수정했습니다(예:BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)). 이 회귀는 PR #99205로 인해26.1.5에 도입되었습니다. #103324을 해결합니다. #104413 (Groene AI).ALTER TABLE ... DROP COLUMN뒤에iceberg_metadata_staleness_ms가 0보다 큰INSERT를 수행할 때IcebergLocal/IcebergS3쓰기에서 발생하던 서버 비정상 종료를 수정했습니다. 이제ALTER가 로컬 Iceberg 메타데이터 파일 캐시를 무효화하므로, 이후 읽기 및 쓰기 작업에서 새 스키마를 올바르게 확인할 수 있습니다. #104419 (Groene AI).DROP ROLE,DROP USER,DROP SETTINGS PROFILE,DROP ROW POLICY,DROP QUOTA,DROP MASKING POLICY실행 시, 삭제된 엔터티를 참조하던 다른 액세스 엔터티에서도 해당 참조를 제거하고(예: 사용자의DEFAULT ROLE목록, settings profile의TO목록, row policy의 grantee), 이 정리 내용을 디스크에 영구 저장하도록 수정했습니다. 이전에는SHOW CREATE가 알 수 없는 UUID를 필터링했기 때문에 메모리 내 상태는 올바른 것처럼 보였지만, 디스크의.sql파일에는 고아 상태의ID('<dropped-uuid>')항목이 남아 있었고, 다음 서버 재시작 시 참조가 다시 살아나 분산 쿼리 실행 중ACCESS_ENTITY_NOT_FOUND오류로 나타났습니다. #104427 (Groene AI).BlobEndpointURL에 비어 있거나, 숫자가 아니거나, 범위를 벗어난 포트가 포함된 연결 문자열(예:BlobEndpoint=http://host:abc/)과 함께azureBlobStorage,AzureBlobStorage엔진, DeltaLake-on-Azure를 사용할 때 트리거되던 서버 비정상 종료를 수정했습니다. 이제 서버는 debug/새니타이저 빌드에서 중단되는 대신, 명확한BAD_ARGUMENTS오류를 반환합니다. #104460 (Groene AI).remote및remoteSecure테이블 함수에서 사용자 이름으로 따옴표 없는 식별자를 허용하도록 했습니다. 이는 데이터베이스 및 테이블 인수가 따옴표 없는 식별자를 허용하는 방식과 동일합니다. 이전에는 이러한 쿼리가default사용자를 가리키는 오해의 소지가 있는 인증 오류와 함께 실패했습니다. #104465 (Alexey Milovidov).- SQL 사용자 정의 함수 본문에 괄호로 묶인 내부
UNION ALL이 포함될 때 트리거되던Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N)를 수정했습니다(예:CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))). #104477 (Groene AI). - 두 번째 인수가 빈
uniqThetastate일 때uniqThetaIntersect가0이 아니라 첫 번째 인수의 카디널리티를 반환하던 문제를 수정했습니다. 예를 들어 프레디케이트가 모든 행을 제외하는 경우의uniqThetaMergeStateIf(s, predicate)결과가 이에 해당합니다. #104529 (Groene AI). - Iceberg REST 카탈로그(
iceberg-rest,onelake,biglake)를 백엔드로 사용하는DataLakeCatalog데이터베이스에서SHOW TABLES및system.tables가 목록을 조용히 잘라내던 문제를 수정했습니다. 카탈로그 서버가 list-tables 또는 list-namespaces 응답을 페이지 단위로 나누는 경우(예: Microsoft Fabric / OneLake에서 네임스페이스당 테이블 수가 약 50개를 초과하는 경우), 뒤쪽 페이지의 테이블은 직접SELECT로 쿼리할 수 있었음에도SHOW TABLES와system.tables에서는 보이지 않았습니다. 이제RestCatalog는 Iceberg REST OpenAPI 사양에 정의된next-page-token연속 토큰을 따라가며, 기존PaimonRestCatalog및UnityCatalog의 동작과 일치합니다. #104531 (Groene AI). - 이제
input테이블 함수는 고정된 스키마를 갖는 포맷(LineAsString,RawBLOB,JSONAsString등)의 경우 주변INSERT쿼리의FORMAT절에서 구조를 추론합니다. 따라서 이러한 포맷에서는 더 이상input('line String')처럼 구조를 반복해서 지정할 필요가 없습니다. #104532. #104533 (Groene AI). - Iceberg 이력의 필드 데이터 형식을
Int32에서Int64로 변경했습니다. #94176를 종료합니다. #104579 (Smita Kulkarni). - 함수 호출에서 쉼표 뒤에 람다가 오는 경우(예:
SELECT substring(x, `x` -> `x`)) 파싱 시 발생하던Inconsistent AST formattingLOGICAL_ERROR를 수정했습니다. 기존 parser는 앞선 인수들을 람다의 왼쪽으로 조용히 병합해, 동일한 AST로 다시 파싱할 수 없는 단일 인수 호출을 만들어냈습니다. 이제 함수의 원래 인수 개수를 보존합니다. #104626 (Groene AI). - 이제
CHECK TABLE t는 데이터베이스 한정자가 지정되지 않은 경우 같은 이름의 영구 테이블보다TEMPORARY테이블을 우선합니다. 이는 이미SHOW CREATE TABLE,DESCRIBE TABLE,OPTIMIZE TABLE,ALTER TABLE에 적용되는 우선순위와 일치합니다. 이전에는CHECK TABLE t가 임시 테이블을 완전히 건너뛰었기 때문에, 해당 엔진이CHECK를 지원하더라도 임시Log또는File테이블에서UNKNOWN_TABLE오류가 발생했습니다. #100966의 후속 작업입니다. #104637 (Groene AI). <placement>가 구성되지 않은 Keeper에quorum_reads=true와 함께get /keeper/availability_zone을 보낼 때 발생하던 Keeper 종료 및 재시작 루프를 수정했습니다. #104663 (myeongjun).FutureSetFromTuple::buildOrderedSetInplace에서 논리 오류를 일으키는 TOCTOU data race를 수정했습니다. #104673 (Miсhael Stetsyuk).- 인수가 컬럼으로 전달됐는지 상수로 전달됐는지에 따라 동일한 입력에 대해서도 서로 다른 결과를 반환하던 여러 함수를 수정했습니다:
bitRotateLeft/bitRotateRight(경계 shift count),length(FixedString)/concatWithSeparator의LowCardinality(Nullable)입력, NaN에 대한roundDown, 잘못된 UTF-8에 대한rightUTF8. #104710 (Raúl Marín). - 가장 자주 나타나는 값이 컬럼 기본값이고 데이터가 여러
MergeTree파트에 걸쳐 있는 경우(희소 컬럼 읽기 경로),anyHeavy가 heavy value가 아닌 값을 반환하던 문제를 수정했습니다. #104712 (Raúl Marín). - 설정 제약 조건 처리의 여러 결함을 수정했습니다. 설정의 정식 이름에 선언된
MergeTreeSettings제약 조건은 해당 설정의 별칭으로 값을 쓰면 우회할 수 있었고,disallowed_values제약 조건 검사는 clamp 경로(보조 쿼리,ON CLUSTERworkers,SQL SECURITY DEFINERviews)에서 변경을 조용히 무시하는 대신 예외를 발생시키고 있었습니다. #104737 (Raúl Marín). - 아직 metadata가 로드되지 않은 지연 ATTACH된
Iceberg/IcebergLocal/DeltaLake/Huditable에서OPTIMIZE TABLE,ALTER TABLE ... DELETE,ALTER TABLE ... ADD COLUMN및 기타 ALTER 변형 실행 시 발생하던LOGICAL_ERROR예외(Metadata is not initialized)를 수정했습니다(일반적으로 server 재시작 후 또는 이전 metadata 쓰기 실패로 디스크에 손상된 metadata 파일이 남은 뒤에 발생). 이제 metadata 로드에 성공하면 작업이 정상적으로 진행되며, 실패하면 debug / sanitizer builds에서 server를 중단시키는 대신 근본 원인인 로드 실패를 일반적인 사용자 대상 예외로 표시합니다. #104738 (Groene AI). AvroConfluentRowInputFormat의 use-after-free 버그로 인한 segfault를 수정했습니다. #104751 (Miсhael Stetsyuk).- 이제
numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDivide,numericIndexedVectorPointwiseEqual,numericIndexedVectorPointwiseNotEqual의 스칼라 변형은Int64::max를 초과하는UInt64스칼라로 호출되면INCORRECT_DATA를 발생시킵니다. #104784 (FriendLey). compatibility설정을 적용한 뒤 별칭 이름으로 설정을 수동 재정의하는 경우(예:SET allow_experimental_analyzer = 1대신SET enable_analyzer = 1) 이후compatibility설정을 다시 변경하면 해당 재정의가 되돌아갈 수 있던 버그를 수정했습니다. #104829 (Raúl Marín).- https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d 이후 AWS 로거가 비활성화되던 문제를 수정했습니다. #104837 (Konstantin Bogdanov).
- 인수가 컬럼으로 전달되었는지 상수로 전달되었는지에 따라 동일한 입력에 대해 서로 다른 결과를 반환하던 함수 3개를 추가로 수정했습니다. 대상은 상수
Date/Date32/Enum/FixedString기본값을 사용하는transform(및 이를 통해 호출되는caseWithExpression),String과 상수FixedString사이의 비교 연산자, 그리고 상수 조건에서FixedString분기를 갖는if/ifNull/nullIf입니다. #104858 (Raúl Marín). - 파티션 표현식에 단일 상수 값으로 축약되는 함수 chain(예:
floor(NULL, toRelativeYearNum(...)))이 포함될 때MergeTreetables의 파티션 프루닝 중 발생하던Bad cast from type DB::ColumnConst to DB::ColumnNullableserver 중단 문제를 수정했습니다. #104861 (Groene AI). ContextData복사 생성자에서 발생하던ThreadSanitizerdata race를 수정했습니다.table_function_results가table_function_results_mutex를 획득하지 않은 채 원본 객체에서 복사되어, 동시에 실행 중인Context::executeTableFunction쓰기 작업이 복사 생성자의 동기화되지 않은 읽기와 경합할 수 있었습니다. #104879 (Groene AI).- 동적 structure를 가진 유형의 data part 일관성 검사를 수정하고 손상된 columns_substreams.txt를 감지하도록 했습니다. 추가 변경 사항을 포함해 https://github.com/ClickHouse/ClickHouse/pull/103858 을(를) 다시 제출한 것입니다. #104888 (Pavel Kruglov).
- DatabaseCatalog에서 DROP과 UNDROP 사이의 경쟁 상태를 수정했습니다. #104915 (Azat Khuzhin).
- 부분적으로 다운로드된 세그먼트가 있는 파일 시스템 캐시의 동적 크기 조정을 수정하고, eviction 실패 후 복원 accounting도 바로잡았습니다. #104921 (Antonio Andelic).
- 임시 테이블에서
DETACH TABLE(TEMPORARY키워드 없이 사용)을 실행하면 이제DETACH TEMPORARY TABLE과 동일하게SYNTAX_ERROR가 올바르게 발생합니다. 이전에는 내부is_detached플래그만 조용히 설정한 뒤 오류 없이 반환했습니다. 임시 테이블을 제거하려면DROP TEMPORARY TABLE또는DROP TABLE을 사용하십시오(후자는Context::ResolveExternal을 통해 임시 테이블을 확인합니다). #103475를 해결합니다. #104943 (Groene AI). filesystem테이블 함수가 파일 내용을 로드할 때max_memory_usage/max_server_memory_usage를 준수하도록 수정했습니다. 이전에는 크거나 많은 병렬 콘텐츠 읽기가MEMORY_LIMIT_EXCEEDED를 발생시키지 않은 채 한도를 초과해, 결국 OOM으로 종료될 수 있었습니다. #104956 (Alexey Milovidov).uuid로system.detached_tables를 필터링할 때 발생하던LOGICAL_ERROR를 수정했습니다(예:SELECT count() FROM system.detached_tables WHERE uuid = '...'). 이제 쿼리가 서버를 중단시키는 대신 예상한 결과를 반환합니다. #104979 (Groene AI).flattenTuple를 중첩 구조에 빈Tuple()리프만 포함된 튜플(예:Tuple(c0 Array(Tuple()))또는Tuple(c0 Tuple()))에 호출해도 더 이상LOGICAL_ERROR가 발생하지 않습니다. 이제 이런 입력에는 flatten 결과가 빈 튜플이 된다는 점을 설명하는 사용자 대상ILLEGAL_TYPE_OF_ARGUMENT예외가 발생합니다. #104989 (Groene AI).GROUP BY와 함께loop(remote(...))(또는 집계를 지연할 수 있는 storage를 감싸는 모든loop())를 쿼리할 때 발생하던 서버 비정상 종료와 조용히 잘못된 결과를 반환하는 버그를 수정했습니다. 이전에는 외부 플래너가 내부 storage가 보고한 processing stage를 기준으로MergingAggregatedStep을 추가했지만,LoopSource는 항상 내부 select를QueryProcessingStage::Complete로 구체화하고 일반 컬럼 청크를 내보내므로,enable_parallel_replicas = 1에서는MergingAggregatedTransform에서LOGICAL_ERROR(Chunk info was not set for chunk in MergingAggregatedTransform)가 발생했고 그 외의 경우에는 외부 집계가 조용히 누락되었습니다. #105001 (Groene AI).clickhouse-benchmark --reconnect(값 없이 단독 사용)는--reconnect를 값을 요구하는 정수 옵션으로 바꾼 변경 때문에 25.4에서 의도치 않게 동작이 깨졌습니다. 이제 이 단독 형식이 다시 동작하며--reconnect=1(모든 쿼리마다 재연결)과 동일합니다. #105006 (Groene AI).- 불완전한 UTF-8 시퀀스로 끝나는 컬럼 이름에 대해 잘못된 형식의 JSON 출력이 생성되던 문제를 수정했습니다. #105012 (Pablo Marcos).
- materialized view의 원본 테이블에 대해
EXCHANGE TABLES또는CREATE OR REPLACE TABLE실행 후 발생하던 조용한 데이터 손실을 수정했습니다. 이제MV의 source-view 의존성 에지가 원래 이름에 유지되므로 삽입 시 계속 트리거됩니다. 이 회귀는 #98779에서 도입되었으며, 회귀 이전 동작을 복원합니다. #105029 (Sema Checherinda). toUInt128(<Float64 expression>)처럼Float를UInt128로 변환하는 표현식을 JIT 컴파일할 때 발생하던CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti문제를 수정했습니다. 부호 없는 128비트 float-to-int용 compiler-rt builtin이 JIT 심볼 리졸버에 누락되어 있었습니다. #105031을 해결합니다. #105048 (Raúl Marín).send_logs_level이 설정된 경우, 실패한 쿼리의 로그 메시지를clickhouse-local이 출력하지 않던 문제를 수정했습니다. #105067 (Alexey Milovidov).- 동일한 쿼리에서 같은 매개변수화된 뷰(parameterized view)가 서로 다른 인수 값으로 두 번 이상 참조될 때 잘못된 결과가 나오던 문제를 수정했습니다. 이전에는 분석기가 호출을 하나로 합쳐 첫 번째 필터를 제외한 나머지를 조용히 삭제했습니다. #105170 (Alexey Milovidov).
play.htmlweb UI에서 결과 테이블 하단에TOTALS행이 두 번 렌더링되던 문제를 수정했습니다. #103803 (Alexey Milovidov).- 벡터 검색 중 유한하지 않은 벡터(
NaN,±Inf)를 거부하도록 했습니다(검색 대상 벡터와 기준 벡터 모두 포함). 이전에는 이로 인해usearch에서 정의되지 않은 동작이 발생했습니다. #104079 (Groene AI). - PromQL: 빈 벡터에 대한 집계 연산자 문제를 수정했습니다. #104425 (Vitaly Baranov).
- PromQL: Prometheus 쿼리 API의 오류 처리 문제를 수정했습니다. #104741 (Vitaly Baranov).
MergeTreeTransaction::afterCommit의 경쟁 상태를 수정했습니다. 커밋CSN을 ZooKeeper에 기록한 뒤 트랜잭션을 최종 확정하기 전에 연결이 끊기면, 새로운creation_csn/removal_csn이system.parts에 반영되기 전에COMMIT응답이 클라이언트에 도달할 수 있었습니다. #104708 (Tuan Pham Anh).- 중첩 배열 인덱싱(
arr[arr[arr[...]]])을 변환할 때 KQL 파서에서 메모리가 기하급수적으로 증가하던 문제를 수정했습니다. #105142 (Alexey Milovidov). - 오른쪽 테이블에 키당 여러 행이 있고 크기 제한 때문에 출력 블록이 분할될 때
RIGHT ANY JOIN에서 잘못된 결과가 나오던 문제를 수정했습니다. #99431을 해결합니다. #102064 (Vladimir Cherkasov). - 중첩 유형 역직렬화 중
Avro리더에서 스택 오버플로우를 검사하도록 했습니다. #102417 (Pavel Kruglov). MergeTree설정에 대해system.completions에 중복 행이 생기던 문제를 수정했습니다.getMergeTreeSettings와getReplicatedMergeTreeSettings가 동일한 설정 이름을 갖고 있는데도 둘 다 덤프되어 각 설정 이름이 두 번씩 나타났습니다. #102013을 해결합니다. #102015 (Groene AI).- 부분적으로 처리된 파일을 객체 스토리지에서 끝까지 모두 읽을 때까지
StorageObjectStorageQueue(S3Queue,AzureQueue)가 종료되지 않던 문제를 수정했습니다. 이제 종료 시 소스가 읽기를 즉시 중단하며, 중복 제거 덕분에 종료 전에 대상 테이블로 이미 스트리밍된 행은 다음 시작 시 파일을 다시 시도하더라도 중복 삽입되지 않습니다. #103126 (Tuan Pham Anh). insert_deduplication_token을 사용하는Alias테이블 엔진으로 다중 블록 삽입 시 모든 블록이 유지되도록 수정했습니다. #103246 (Enric Calabuig).- 네이티브
JSON컬럼에서JSONHas및JSONExtractBool이0/1대신 추출된 값(UInt8로 캐스팅됨)을 반환하던 문제를 수정했습니다. #103313 (zxuhan7). format_custom_row_after_delimiter가 누락된 비정상적이거나 악의적인 데이터로부터CustomSeparated입력 형식을 보호하도록 수정했습니다. 이전에는 헤더 감지, 스키마 추론, 가변 컬럼 행 처리 과정에서 필드가 제한 없이 누적되어 실패하기 전에 수 기가바이트의 메모리가 할당될 수 있었습니다. 이제 단일 행에 1,000,000개가 넘는 필드가 포함되면INCORRECT_DATA와 함께 읽기가 실패합니다. #103404 (Groene AI).- 복원된 파트 ATTACH에 일반 삽입용 Keeper 재시도 한도 대신
backup_restore_keeper_max_retries를 사용하도록 복제된MergeTree테이블의RESTORE를 수정했습니다. #104610 (Pablo Marcos). MergeTree테이블에서WHERE p AND <LowCardinality(Nullable(int)) constant>가 잘못된 결과를 반환하던 문제를 수정했습니다. 이전에는 이러한 쿼리가 0개의 행을 반환했는데, 이는 파트 프루닝이LowCardinality(Nullable(...))타입에서 기본값NULL을 도출하고notEquals(x, NULL)가드를 합성해 모든 파트를 프루닝했기 때문입니다. #104767 (Groene AI).- 컬럼의 비단사 함수이면서 동시에 파티션 키이기도 한 값을 기준으로 그룹화할 때 잘못된 집계 결과가 나오던 문제를 수정했습니다(예:
PARTITION BY a와 함께GROUP BY intDiv(a, 2)또는a % 2). 같은 그룹으로 매핑되는 서로 다른 파티션의 값이 머지되지 않아allow_aggregate_partitions_independently = 1환경에서 중복된 그룹 행이 생성되었습니다. #104869 (Nihal Z. Miaji). - 복구 중인 팔로워에게 snapshot을 전송하는 도중 해당 snapshot이 제거되거나 이동될 수 있던
Keepersnapshot 전송의 경쟁 상태 문제를 수정했습니다. #104941 (Antonio Andelic). hilbertEncode및mortonEncode에서 비상수Tuple첫 번째 인수(범위 마스크)가 모든 행의 비트 시프트 계산에 0번째 행의 값을 사용하던, 잘못된 결과를 조용히 반환하는 버그를 수정했습니다. 이제 이 함수들은 행별 마스크 값을 계산하므로 결과가 더 이상 입력이 상수인지 여부나 블록 크기에 의존하지 않습니다. #104992 (Groene AI)../clickhouse-local.xml,~/.clickhouse-local/config.xml, 또는/etc/clickhouse-local/config.xml에서 설정 파일이 자동으로 탐지될 때clickhouse-local이 사용자 수준 구성(profiles,users,quotas, 접근 제어 설정)을 조용히 무시하던 문제를 수정했습니다. 이전에는--config-file이 전달되었거나 현재 디렉터리에./config.xml이 있을 때만 이러한 설정이 적용되었지만, 이제는 모든 탐지 경로에서 일관되게 동작합니다. #105008 (Groene AI).- 문자열 리터럴과 비교할 때
BFloat16컬럼이 일치하는 항목을 0개로 조용히 반환하던 문제를 수정했습니다(예:WHERE bf16_col = '49.9'). #105042 (Raúl Marín). - 머지 중
SummingMergeTree,AggregatingMergeTree,CoalescingMergeTree에서 머지에 필요한 컬럼이 없거나 만료된 경우CLEAR COLUMN및 TTL 처리가 올바르게 동작하지 않던 문제를 수정했습니다. #101953를 닫습니다. #105203 (Antonio Andelic). - 역참조 전에
shared->clusters_config에 대한 명시적인 null 가드를 추가해DNSCacheUpdater::run과Context::reloadClusterConfig사이의 경쟁 상태를 수정했습니다. #105220 (Mikhail f. Shiryaev). ms및nsprecision에서toDateTime64의best_effort날짜/시간 parsing 문제를 수정했습니다. #105233 (Kaviraj Kanagaraj).OSIOWaitMicroseconds가 쿼리별 I/O 대기 시간이 아니라 thread-lifetime I/O 대기 시간을 보고하던 문제를 수정했습니다. #105246 (Mikhail f. Shiryaev).- 이제
Hudi테이블 엔진은 테이블 디렉터리의 Parquet file 이름이 Hudi[FileId]_[FileWriteToken]_[Timestamp].[extension]명명 규칙과 일치하지 않을 때LOGICAL_ERROR대신INCORRECT_DATA(일반적인 쿼리 수준 예외)를 발생시킵니다. 이전에는 이런 파일 이름이 디버그 build에서 예외를 유발했습니다. #105266 (Groene AI). - 스케줄링 실패 시
ParallelFormattingOutputFormat에서 발생하던 교착 상태를 수정했습니다.scheduleFormatterThreadForUnitWithNumber가 예외를 발생시키면(예:CANNOT_SCHEDULE_TASK) 해당 unit을 처리할 formatter thread가 없는 상태에서 unit이READY_TO_FORMAT에 남아 멈춤이 발생했습니다. 이제 schedule 호출은try/catch로 감싸며, 모든 실패는onBackgroundException을 통해 처리되어 collector가 정상적으로 종료됩니다. #105275 (Azat Khuzhin). - 비정상 종료 후 복구하는 과정에서
Distributedasync inserts에 발생하던 조용한 데이터 손실 문제를 수정했습니다. 저장된 batch에서 마지막.bin파일은 온전하지만 중간 파일 하나가 손상된 경우,DistributedAsyncInsertBatch::recoverBatch는 마지막 파일의 헤더만 검증했고 이후sendBatch는 온전한 파일까지 포함한 전체 batch를 손상된 것으로 표시해 해당 행이 유실됐습니다. 이제 각 파일의 헤더를 개별적으로 검증하므로 실제로 손상된 파일만broken/으로 이동하고, 남은 행은 원격 세그먼트에 정상적으로 전달됩니다. #105281 (Groene AI). clickhouse extract-from-config --try의 회귀 문제를 수정했습니다. 구성에서from_env속성을 사용하고include_from요소가 없거나(또는 없는 파일을 가리키는 경우) 모든from_env치환이 조용히 누락되어 빈 문자열이 반환되던 문제입니다. 이로 인해 26.2.5에서 Docker entrypoint의 포트 디스커버리가 깨졌습니다. #101704를 닫습니다. #105283 (Groene AI).INSERT INTO로SQLite테이블에 삽입할 때, 삽입되는 값이 작은따옴표를 포함하는 텍스트 표현의Enum,JSON,AggregateFunction이면 SQLite 구문 오류로 실패하던 문제를 수정했습니다. 이제output_format_values_escape_quote_with_quote설정이 해당 serialization에도 적용됩니다(이전에는String과FixedString에만 적용됐습니다). #105285 (Groene AI).allow_push_predicate_ast_for_distributed_subqueries = 1(기본값)이 설정된 분산 쿼리에서,GLOBAL IN튜플이 projection에 중복된 컬럼 이름이 포함된 서브쿼리와 매칭될 때 발생하던Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists오류를 수정했습니다. 예:(x, y) GLOBAL IN (SELECT number, number FROM numbers(5)). #105290 (Groene AI).reinterpret를Array(LowCardinality(...))에 적용할 때 런타임에 혼란을 주는NOT_IMPLEMENTED오류가 반환되던 문제를 수정했습니다. 이제 타입 검사 중ILLEGAL_TYPE_OF_ARGUMENT를 반환합니다. #105301 (Raúl Marín).minMap/maxMap(배열 형식) 및minMappedArrays/maxMappedArrays가 이제NaN을ORDER BY와 일관되게 처리합니다.NaN은 마지막으로 처리되며(모든 값이NaN인 경우에만 반환됨), 이전에는 IEEE 754의 비순서 비교 의미론 때문에 결과가 데이터 내NaN의 위치에 따라 달라졌고, #100448에서 수정된minMap/maxMap의Map인수 형식과도 일치하지 않았습니다. #105331 (Raúl Marín).Nested컬럼이 있는MergeTree계열 테이블의 테이블별ColumnsDescription캐시에서 발생하던 메모리 누수를 수정했습니다.share_nested_offsets = 1(기본값)일 때ALTER ADD COLUMN/DROP COLUMN사이클 전반에서 항목이 한 번도 제거되지 않았습니다. #105376 (Groene AI).TYPE set(N)스킵 인덱스가 있는SELECT에 결과 타입이Float,BFloat16또는 기타 비정수 타입인WHERE원자 조건이 포함될 때(예:WHERE c0 + 0.1또는WHERE log(c0)), 발생하던BAD_ARGUMENTS예외 “It’s a bug! Only integer types are supported by__bitWrapperFunc”를 수정했습니다. 이제 이 경우 스킵 인덱스는 일반 프레디케이트 경로로 대체됩니다. #105384 (Groene AI).
빌드/테스트/패키징 개선
- 시스템
compiler-rt라이브러리와 헤더 사용을 중단합니다. #91475를 해결합니다. #102857 (Konstantin Bogdanov). libssl3t64의 OpenSSL CVE를 해결하기 위해 distroless Docker 베이스 이미지를 갱신합니다. #103583 (Rahul Nair).keyserver.ubuntu.com에서 시간 초과가 발생하는 대신 여러 Ubuntu 키 서버를 연계해 사용함으로써, 릴리스 중 GPG 키를 안정적으로 받아오도록 합니다. #103834 (Mikhail f. Shiryaev).- 빌드 시점의
CMake검사(check_*,try_compile,try_run)를 제거하고 금지합니다. 컴파일러와 툴체인은 고정되어 있으므로 구성 시점의 기능 탐지는 불필요하며, 이제 프로젝트 전체에서 차단됩니다. 버전별 동작은 반드시CMAKE_CXX_COMPILER_VERSION을 기준으로 명시적으로 분기해야 합니다. #103980 (Alexey Milovidov). libarchive를 3.8.6에서 3.8.7로 올립니다. #104047 (Robert Schulze).mongo-c-driver를 2.3.0으로 업데이트합니다. #104300 (Raúl Marín).- 22.x용 LLVM 의존성을 업데이트합니다. #104381 (Joshua Carp).
- 이식 가능한 POSIX
posix_openpt/grantpt/unlockpt를 사용하고 Linux 전용#if가드를 제거해, 내장 클라이언트와 PTY 디스크립터 클래스가 macOS 및 FreeBSD에서 빌드되도록 합니다. #104436 (Alexey Milovidov). librdkafka를 버전 2.14.1로 업그레이드합니다. #105222 (János Benjamin Antal).
하위 호환되지 않는 변경 사항
- 이제
IN연산자는Bool타입에 대해 정확한 값 비교 semantics를 사용합니다. 즉, 집합 내0과1값만Bool값과 일치합니다. 이전에는IN집합에서255보다 큰 숫자 값이Bool과 비교될 때 잘못해서 true로 클램프되어,SELECT CAST(1, 'Bool') IN (256)이 1을 반환했습니다. 이제는 올바르게0을 반환합니다. #92980을 해결합니다. #93115 (Ashrith Bandla). - H3 라이브러리가 v4로 업데이트되어 길이, 면적 및 기타 메트릭 계산의 정밀도가 향상되었습니다. 새 결과가 이전 결과와 다르기 때문에 이 변경은 하위 호환되지 않습니다. #100348 (Alexey Milovidov).
- 이제
WITH표현식 목록 요소에서SELECT를 bareword 식별자로 사용하는 것을 허용하지 않습니다. #101059 (Aruj Bansal). - 이 패치는 merge 테이블이 가상 컬럼을 처리하는 방식을 변경합니다. 기반 테이블에
_table또는_database가 있으면 해당 컬럼은 스토리지에서 읽고, 그렇지 않으면 읽기 단계 이후 표현식 단계를 통해 채웁니다. #101742 (Mikhail Artemenko). - 이제
IN연산자는 복합 타입(Tuple,Array,Map) 내부에서 발생하는 손실성Decimal변환도 거부하므로, 동작이 최상위 스칼라 비교와 일관되게 되었습니다. 이전에는 정밀도 검사가 최상위 스칼라 값에만 적용되었습니다. 예를 들어CAST('33.3', 'Decimal64(1)') IN (33.33)은 올바르게0을 반환했지만,CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])은 손실성 변환이Array내부에서 발생했기 때문에 잘못해서1을 반환했습니다. 이제 두 경우 모두 올바르게0을 반환합니다. #101812 (Nihal Z. Miaji). - 인증 전 HTTP 연결의 메모리 사용량을 제한하기 위해 기본
http_max_fields를 1,000,000에서 1,000으로,http_max_field_name_size를 128 KB에서 4 KB로 낮췄습니다. 또한http_max_request_header_size및http_headers_read_timeout설정을 추가했습니다. 이전의 더 높은 제한값에 의존하는 사용자는 설정을 통해 이를 복원할 수 있습니다. #103285 (Sema Checherinda).
새로운 기능
- 메모리 제한에 도달하면 해시 조인과 병렬 해시 조인을 grace hash join으로 변환해 자동으로 스필하도록 지원합니다. 이 동작은
max_bytes_before_external_join로 제어됩니다. #97813 (János Benjamin Antal). - Arrow Flight SQL 지원이 추가되었습니다. #91170 (Yakov Olkhovskiy).
Paimon테이블 엔진에 Keeper 기반 스냅샷 진행 상태 추적을 통한 증분 읽기 지원을 추가하고,paimon_target_snapshot_id를 사용한 대상 스냅샷 델타 읽기를 포함했으며, 유형 매핑, 파티션 프루닝, 증분 읽기 시나리오에 대한 테스트 범위를 확장했습니다. #93655 (XiaoBinMu).stem함수는 이제 실험적 기능이 아닙니다(이전에는allow_experimental_nlp_functions설정을 활성화해야 했습니다). #102399 (Jimmy Aguilar Mena). 이제stem함수를 사용하면String,FixedString,Array([Fixed]String),Nullable,LowCardinality,Const컬럼의 모든 단어/토큰에 대해 손쉽게 어간 추출을 수행할 수 있습니다. #99137 (Jimmy Aguilar Mena).- 호환성 설정
use_strict_insert_block_limits를 사용할 때 squashing 과정에서max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rows,min_insert_block_size_bytes에 대한 새로운 동작을 구현합니다. #94207 (Kirill Kopnev). - 숫자 배열의 각 지연값(lag)에 대한 정규화된 자기상관을 계산하는 함수
arrayAutocorrelation(arr [, max_lag])를 추가했습니다. 정수, 부동소수점, 십진수 배열 타입을 지원합니다. #94776 (Wenyu Chen). - SQL 함수
obfuscateQuery. 이슈 #98010을 해결합니다. #98305 (Xuewei Wang). - 딕셔너리 속성에 Map 및 JSON/Object 타입 지원을 추가했습니다. 이제 딕셔너리는 FLAT 및 HASHED 레이아웃 모두에서 Map(String, String), Map(String, Array(String)), JSON, Nullable(JSON) 타입을 포함한 복합 타입을 저장하고 가져올 수 있습니다. #98627 (yanglongwei).
- 새로운 MergeTree 설정 2개(
replicated_fetches_min_part_level및replicated_fetches_min_part_level_timeout_seconds)가 추가되어, 레플리카가 피어에서 새로 삽입된(머지되지 않은) 파트를 가져오지 않고 건너뛸 수 있게 되었습니다. 이에 따라 수집 부하가 큰 상황에서 복제 오버헤드를 줄일 수 있습니다. #98625 (tanner-bruce). - JSONAllPaths와 bloom_filter, tokenbf_v1, ngrambf_v1 및 text(역색인) 인덱스 타입을 사용해 JSON 컬럼에 대한 MergeTree 스킵 인덱스 지원이 추가되어, 각 그래뉼에 존재하는 JSON 경로 집합을 기준으로 그래뉼 스키핑이 가능해졌습니다. #98886 (Pavel Kruglov).
- 이제
printf함수는 상수가 아닌 포맷 문자열도 지원하여, 컬럼 값에 따라 각 행마다 서로 다른 포맷 패턴을 사용할 수 있습니다. #98991 (Yash ). - 삽입 순서에 따라 데이터를 재구성하는 새 프로젝션 인덱스
commit_order를 추가했습니다. #99004 (Mikhail Artemenko). - 텍스트 문자열에서 검색어가 나타난 부분을 HTML 태그(기본값
<em>/</em>)로 감싸는highlight함수를 추가했습니다. ASCII case-insensitive 일치, 겹치는 일치 항목의 자동 병합, 사용자 지정 여는/닫는 태그를 지원합니다. #99131 (Peng). - 공개 ClickHouse 서비스를 남용으로부터 보호하기 위해 정규화된 쿼리 해시를 기준으로 쿼터를 구현했습니다. 1. 쿼터 키 유형으로
NORMALIZED_QUERY_HASH를 지원합니다. - 서로 다른 정규화된 쿼리마다 별도의 쿼터 버킷을 사용하므로,CREATE QUOTA q KEYED BY normalized_query_hash는 각 개별 쿼리를 독립적으로 추적합니다. 2. 쿼터 리소스 유형으로QUERIES_PER_NORMALIZED_HASH를 지원합니다 — 인터벌 내에서 단일 정규화된 쿼리의 최대 실행 횟수를 제한하므로,MAX queries_per_normalized_hash = 100은 특정 쿼리 패턴이 100회를 초과해 실행되는 것을 방지합니다. #99586 (Alexey Milovidov). - 이제
NATURAL JOIN구문을 사용해 JOIN 쿼리를 작성할 수 있으며, 이 구문은 이름이 같은 모든 컬럼을 자동으로 매칭하고 결과에서 해당 컬럼의 중복을 제거합니다. #99840 (Peter Nguyen). SET session_timezone의 별칭인SET TIME ZONE 'tz'를 지원합니다. #99883 (phulv94).- Web UI(
play.html)에 매개변수화된 쿼리 지원이 추가되었습니다.{name:Type}와 같은 쿼리 매개변수를 감지하고, 해당 값을 입력할 수 있는 입력 필드를 표시합니다. #100041 (Alexey Milovidov). - SQL 표준
VALUES절을FROM절에서 테이블 표현식으로 사용할 수 있도록 지원합니다. 예:SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). EXTRACT연산자에 PostgreSQL과 호환되는 단위EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADE,MILLENNIUM을 추가했습니다. 또한 이전에는 오류가 발생했던EXTRACT(WEEK FROM date)도 수정했습니다. #100274 (Alexey Milovidov).TO범위 한정자를 사용하는 SQL 표준 복합 인터벌 리터럴(예:INTERVAL '1:30' HOUR TO MINUTE) 지원이 추가되었습니다. 내부적으로는 인터벌의 합으로 분해됩니다. #100453 (Desel72).- HTTP 연결 풀 소켓의 커널 TCP 수신 및 송신 버퍼 메모리(
sk_rmem_alloc,sk_wmem_alloc)에 대한 비동기 메트릭을 추가하고, 이를 연결 그룹별 p50/p75/p90/p95 백분위수와 합계로 보고하도록 했습니다. #100575 (Sema Checherinda). - HTTP 제어 포트의
/jemalloc경로에서 사용할 수 있는 ClickHouse Keeper용 jemalloc 프로파일링 웹 UI가 추가되었습니다. #100606 (murphy-4o). - ordered mode와 unordered mode를 위한 명령
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'을 구현했습니다. #100709 (Bharat Nallan). JSON컬럼의 모든 값을 텍스트 표현으로 직렬화해 경로 이름 순으로 정렬한 뒤Array(String)으로 반환하는JSONAllValues함수를 추가했습니다.JSON컬럼의JSONAllValues표현식에 대한 텍스트 인덱스 지원도 추가했습니다.JSONAllValues(json_column)에 텍스트 인덱스를 생성하면JSON서브컬럼에 대한 쿼리 필터링(예:json_column.key1 = 'value')에 자동으로 사용됩니다. #100730 (Anton Popov).- 입력 형식에 대해 대소문자 구분 방식을 다르게 설정할 수 있는 새로운 설정
input_format_column_name_matching_mode를 추가했습니다. #99346 (manerone). clickhouse-keeper-client에watch명령이 추가되었으며,get,exists,ls명령에서도watch를 지원합니다. #100834 (Den Kalantaevskii).- ClickHouse Keeper에
getChildrenRecursive(ListRecursive) 요청이,clickhouse-keeper-client에lsr명령이 추가되었습니다. 이로써 #99916가 해결되었습니다. #100998 (Konstantin Vedernikov). - 2차원 배열(행렬)을 받아 전치하는 새 함수
arrayTranspose가 추가되었습니다:SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]]). #101214 (Vitaly Baranov). auto_statistics_types mergetree설정의 기본값은'minmax, uniq'입니다 — 새 테이블에서 적절한 모든 컬럼에 대해 minmax 및 uniq 통계가 자동으로 생성됩니다 -materialize_statistics_on_insert의 기본값은 false입니다 — 이제 통계는 삽입 시점이 아니라 머지 과정에서 구축되므로 삽입 오버헤드가 줄어듭니다. 이전 동작을 복원하려면SET materialize_statistics_on_insert = 1을 사용하십시오. #101275 (Han Fei).- 교차 레플리카 간 복제 지연으로 발생하는 데이터 누락을 줄이기 위해 materialized view 의존성 체인에
prefer_dependency_replica갱신 설정을 추가했습니다. #101591 (Seva Potapov). - 구문 검색(연속된 토큰 시퀀스)을 위한
hasPhrase(별칭matchPhrase) 함수를 추가했습니다. 검색은 브루트포스 방식으로 수행되며, 즉 아직 텍스트 인덱스에서는 지원되지 않습니다. #101997 (Elmi Ahmadov). - S3 GET 요청 연결 수명 주기와 소비된 바이트 수를 관찰할 수 있도록
s3_read_request_duration_microseconds및s3_read_request_bytes히스토그램 메트릭을 추가했으며,system.histogram_metrics와 Prometheus 엔드포인트에서 확인할 수 있습니다. #102058 (Sema Checherinda). - 이제
Date및Date32값을+연산자로Time및Time64값에 더해DateTime또는DateTime64결과를 생성할 수 있습니다. 예를 들어SELECT toDate('2024-01-15') + toTime('14:30:25')는2024-01-15 14:30:25를 반환합니다. 결과는 session 시간대에서 계산되며, 범위를 벗어나는 결과는date_time_overflow_behavior설정에 따라 처리됩니다. #95914를 해결합니다. #102421 (Nihal Z. Miaji). - 텍스트 인덱스는 이제 일반 제공 상태이며,
compatibility설정과 관계없이 활성화된 상태를 유지하여 백업 복원 중이나 호환 모드에서 실행할 때 예기치 않게 비활성화되는 일을 방지합니다. #101518 (Nikita Fomichev).
실험적 기능
- Iceberg 테이블에서 객체 스토리지의 미참조 파일을 식별하고 제거하는
ALTER TABLE ... EXECUTE remove_orphan_files를 추가했습니다. #99127 (murphy-4o). - join 재정렬에 사용되는 통계를 무작위화하는
query_plan_optimize_join_order_randomize설정을 추가했습니다. 테스트에 유용합니다. #100643 (Vladimir Cherkasov). - SQL을 사용해 OpenAI 및 Anthropic 엔드포인트를 호출할 수 있도록 ClickHouse에 AI 함수 지원을 추가했습니다.
aiGenerate는 이러한 함수의 첫 번째 예입니다. #100831 (George Larionov). - ClickHouse에서 LLM API를 활용할 수 있는 AI 함수
aiClassify,aiExtract,aiTranslate를 추가했습니다. #100832 (George Larionov). - 모든 히스토그램 메트릭(예: S3/Azure 지연 시간, Keeper 요청 처리 단계의 소요 시간)을 주기적으로 스냅샷하는 새로운 시스템 테이블
system.histogram_metric_log를 추가했습니다. 또한system.histogram_metrics의value컬럼은 더 유연하고 Prometheus 데이터 모델과도 더 잘 호환되므로Float64로 변경됩니다. #103046 (Miсhael Stetsyuk). 이 테이블 구조는 향후 릴리스에서 변경될 가능성이 높습니다.
성능 개선
- 이제 ClickHouse는 min/max 통계를 기반으로 SELECT 쿼리에서 전체 데이터 파트를 건너뛸 수 있습니다. #94140 (zoomxi).
- 뮤테이션이 완료된 ReplicatedMergeTree 테이블에서 readonly 작업 중 발생하는 잠금 경합을 줄였습니다. #95771 (Eduard Karacharov).
- 프로젝션을 읽을 때
optimize_read_in_order가 적용되도록 했습니다. #89453을 해결했습니다. #95885 (Andrey Zvonov). - 해시 조인 및 Concurrent Hash Join이 소폭 개선되었습니다. #96663 (Yarik Briukhovetskyi).
- 입력 데이터의 중복이 거의 없을 때
LowCardinality컬럼 최적화를 비활성화하여DISTINCT변환을 최적화했습니다. #97113 (Nihal Z. Miaji). - #97723의
LIKE쿼리 성능이 최적화되었습니다. 이제 이러한 쿼리에서도 텍스트 인덱스를 사용할 수 있습니다. #98149 (Elmi Ahmadov). - 벡터화된 수학 함수(
exp,log,sigmoid,tanh)는 이제 AArch64(NEON/SVE 사용)와 FreeBSD/Darwin에서도 가속됩니다. 이전에는 이들 환경에서 더 느린 스칼라 폴백을 사용했습니다. #98230 (Raúl Marín). - 이제
^(abc-1|abc-2)와 같이 리터럴 문자열의 정규식 선택 패턴을 사용해MergeTree프라이머리 키(primary key) 컬럼을 필터링하는 쿼리도, 각 선택지가 공통 접두사를 공유하면 프라이머리 키 프루닝을 사용할 수 있습니다. #98988 (Yash ). ORDER BY ... LIMITtop-k 동적 필터링을 일반화해Nullable,String,COLLATE타입도 지원합니다. #99033 (murphy-4o).- 직접 인덱스 해시 테이블을 사용해 값 범위가 좁은
Int32및Int64키의 해시 조인 속도를 개선했습니다. #99275 (Hechem Selmi). - 단일 딕셔너리를 사용하는
LowCardinality컬럼의 비연속 쿼리 성능이 향상되었습니다. #99285 (Ivan Babrou). - 내부 루프의 가상 디스패치를 제거해
Float64컬럼용var*Stable및stddev*Stable함수의 속도를 높였습니다. 참고: 이로 인해 부동소수점 결과를 ULP 수준에서 변경하는 컴파일러 최적화(FMA/레지스터)가 활성화됩니다. #99460 (Riyane El Qoqui). - 입력이 32/64바이트인 경우 최적화된 Firedancer base58 인코딩을 사용합니다(
base58Encode에는 자동으로 적용됨). 디코딩 결과가 32/64바이트인 경우 최적화된 base58 디코딩도 사용할 수 있습니다(base58Decode('...', 32)등으로 명시). #99461 (Joanna Hulboj). - 바이너리 크기를 줄이고 명령어 캐시 활용 효율을 높이기 위해 링커의 섹션 기반 최적화(
-ffunction-sections,-fdata-sections,--icf=all)를 활성화했습니다. #99474 (Alexey Milovidov). - 코어 수가 많은 머신에서 집계를 수행하는 짧은 쿼리의 음의 스케일링 문제를 수정했습니다. 쿼리가 소수의 마크를 읽는 경우, 집계 후 파이프라인이 더 이상
max_threads까지 확장되지 않아 대부분 비어 있는 스트림으로 인한 오버헤드를 방지합니다. #99493 (Alexey Milovidov). - 읽기 작업 크기를 적절히 선택해 병렬 레플리카 쿼리의 성능을 개선했습니다. #99801 (Nikita Taranov).
- 사용자 공간 페이지 캐시를 통해 원격 파일을 읽을 때 프리페치를 사용할 수 있도록 합니다. #99919 (Alexey Milovidov).
- 서브컬럼을 열거할 때 String
.size서브컬럼이 불필요하게 계산되는 것을 방지했습니다. #99941 (Pavel Kruglov). - 레플리카 수가 매우 많은 클러스터에 호텔에서 접속해 작업할 때 clickhouse-client의 진행률 표시줄이 덜 흔들리도록 개선했습니다. #100145 (Alexey Milovidov).
- 페이지 캐시가 활성화된 경우
clickhouse-local에서MemoryWorker를 시작해 사용자 공간 페이지 캐시를 실제로 사용할 수 있게 했습니다. #100306 (Alexey Milovidov). LIMIT절을UNION ALL내부로 푸시다운해 쿼리를 최적화합니다. #100364 (Alexey Milovidov).ORDER BY에서String및FixedString컬럼 비교를 위한 JIT 컴파일 지원을 추가하여, 문자열 비중이 높은 정렬 키에서 머지 단계 정렬 성능을 6~17% 개선했습니다. @lgbo-ustc와 공동 작성했습니다. #100577 (Raúl Marín).read_in_order_use_virtual_row가 새로운read_in_order_use_virtual_row_per_block설정과 함께 활성화되면, 이제MergeTree에서 읽은 각 블록 뒤에 가상 행 경계 정보가 생성되어WHERE/PREWHERE/JOIN에 의해 데이터가 완전히 필터링된 파트의 경우 머지가 스트림 도중 소스 우선순위를 다시 조정할 수 있습니다. Close #99945. #100603 (Vladimir Cherkasov).- dragonbox 호환 반올림을 사용해
itoa의 fast path를 확장함으로써 큰 정수 값의 Float-to-String 변환 속도를 높였습니다. #100649 (Raúl Marín). - Float를 String으로 변환하는 속도를 1.5배~3배 높이기 위해
dragonbox를zmij로 대체합니다. #100650 (Raúl Marín). - 소프트웨어 나눗셈을 Barrett reduction으로 대체하고 변환 루프를 언롤링해
Int128/UInt128의 문자열 변환 속도를 높였습니다. #100671 (Raúl Marín). uniqExact병렬 머지에서 중복 스레드 생성 방지. #100686 (Jiebin Sun).uniqExact에 배치 병렬 머지 기능을 추가했습니다. #100687 (Jiebin Sun).- 기반
MergeTree테이블이 있는 단순 뷰를 병렬 레플리카로 실행할 때 쿼리 병렬화가 개선되었습니다. #100815 (Igor Nikonov). parallel_replicas_allow_view_over_mergetree=1일 때 단순 뷰(적격한MergeTree테이블에 대한UNION ALL뷰 포함)에서 병렬 레플리카를 지원합니다. 이를 통해 내부 쿼리 대신 뷰의 외부 쿼리를 병렬화할 수 있어, 노드 전반에서 쿼리 병렬성이 향상됩니다. #100958 (Igor Nikonov).- 쿼리 계획(query plan)에
IN필터가 있는 경우full_sorting_merge가 기본 키(primary key) 순서로 읽도록 최적화했습니다. #101261 (Nikita Taranov). - 전체 memory tracker 계층을 순회하는 대신 샘플링 설정을 캐시해 메모리 할당/해제를 최적화했습니다. #101267 (Azat Khuzhin).
deduplicate_insert = 'enable'(26.2부터 기본값)일 때 발생하던 심각한 INSERT 성능 회귀를, 데이터 해시 계산을squashing에서sink로 미루고updateHashWithValueRange를 통한 배치 컬럼 해싱을 사용해 수정했습니다. 그 결과 22개 컬럼, 500만 행 기준 오버헤드가 약 2.5초에서 약 0.5초로 줄었습니다. #101494 (Sema Checherinda).try_lock을 사용해 경합 없는 획득의 타이밍 측정을 피하고 보유 시간 측정을 제거함으로써 프로파일링된 잠금 오버헤드를 줄였습니다. #101502 (Antonio Andelic).arrayDotProduct의 수작업 AVX-512 intrinsics를 플랫폼 독립적이며 자동 벡터화가 가능한 루프로 대체하고, AVX2 및 ARM NEON 지원을 추가했습니다. #101571 (Peng).- 이스케이프된 문자열(예:
'{\'key\':1}') 형태로 값이 전달될 때Map,Array,Tuple컬럼의INSERT VALUES성능을 개선하여 SQL 표현식 파서로 불필요하게 폴백되는 것을 방지했습니다. #102119 (Joanna Hulboj). RabbitMQ테이블 엔진의 과도한 CPU 사용 문제를 수정했습니다. #102711 (Jaap Elst).- 이제 JOIN 순서 최적화기는 기존 조인 조건에서 추이적인 동등 조인 프레디케이트를 추론합니다. 예를 들어
A.x = B.x AND B.x = C.x가 주어지면A.x = C.x라는 동치 관계를 인식하여, 최적화기가 추이적으로 연결된 테이블 간의 Direct JOIN도 고려할 수 있습니다. 이로써 차원 테이블이 공유 팩트 테이블을 통해 연결되는 스타 및 스노우플레이크 스키마(schema)에서 실행 계획의 품질이 향상될 수 있습니다. 이 기능은 새로운enable_join_transitive_predicates설정으로 제어되며(기본적으로 비활성화), #98479 (Alexander Gololobov)에서 도입되었습니다. - 병렬로 머지 작업을 미리 취소하여
TRUNCATE DATABASE TABLES LIKE를 최적화했습니다. #98597 (Shaohua Wang). - 곱셈 연산에 대한 단조성 지원이 추가되어
key * constant표현식에 대해 기본 키(primary key) 프루닝이 가능해졌습니다. #98983 (Amos Bird). - 캐시 딕셔너리는 더 이상
hasKeys에서 배타적 잠금을 사용하지 않습니다. 캐시 읽기에 공유 잠금을 사용하도록 변경되어 잠금 경합이 줄어듭니다. #100796 (liuguangliang). - VIEW에 더 많은 최적화를 적용할 수 있도록 쿼리 트리에서 VIEW 서브쿼리를 인라인 처리했습니다. #100830 (Dmitry Novik).
- 서버 시작 시 cache loading을 최적화했습니다. #101500 (Kseniia Sumarokova).
- 프레디케이트의 선택도가 충분히 높을 때 FINAL을 사용하는 ReplacingMergeTree에 지연 컬럼 머티리얼라이즈를 구현합니다. #101647 (Nikolai Kochetov).
optimize_rewrite_array_exists_to_has최적화를 다시 활성화합니다(23.10부터 기본적으로 비활성화됨). 이 최적화는arrayExists(x -> x = elem, arr)를 훨씬 더 빠른has(arr, elem)로 재작성하며, 이제 배열의 element 타입과elem이has와 호환되지 않는 경우(예:Date와String)에는 재작성을 올바르게 건너뛰므로, 이전에는 오류가 발생하던 쿼리도 계속 작동합니다. #71431을 해결합니다. #100944 (Alexey Milovidov).
개선 사항
- EXPLAIN PLAN pretty=1 출력이 개선되었습니다. 최상위 쿼리의 출력 컬럼을 표시하고, join 릴레이션의 레이블/기호와 예상 결과 행 수 및 locality를 보여주며, join/source 단계별 출력 컬럼도 포함합니다. 이번 변경은 #98117의 Information Deficit 부분을 다룹니다. #99462 (Kirill Kopnev).
- MergeTree 테이블 설정
share_nested_offsets를 추가했습니다(기본값true).false로 설정하면 점으로 구분된 이름(예:n.a,n.b)을 가진 배열 컬럼은 오프셋 파일을 공유하고 기존Nested시맨틱의 일부로 배열 크기가 같은지 검증하는 대신, 각각 독립적인 컬럼으로 처리됩니다. #98416 (Amos Bird). - 이제 users.xml/yaml 구성 파일에서 여러 인증 메서드를 지정할 수 있습니다(SQL에서는 원래부터 가능했습니다). #91998 (Flip-Liquid).
- TLS를 사용하는 Raft 노드 간 연결을 자동으로 재로드합니다. #93455 (Evgeny).
cast_keep_nullable가 Dynamic/JSON 타입에서도 동작하도록 확장되었습니다. 이 옵션을 설정하면 널 허용(Nullable) 가능한 타입에서 NULL을 캐스팅할 때 NULL을 반환하고, 그렇지 않으면CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN오류를 발생시킵니다. #96504 (Seva Potapov).- 객체 풀을 도입해 내부 데이터 구조(
ISerialization객체)의 메모리 점유량을 줄였습니다. #96563 (Nikita Mikhaylov). - keeper-client XML 설정에
password및identity필드 지원을 추가했습니다. #96800 (Grigorii Sokolik). - Unity Catalog용
Iceberg쓰기 기능을 개선했습니다. #98162 (Konstantin Vedernikov). finalize_projection_parts_synchronously설정을 추가해 INSERT 중 프로젝션 파트를 동기적으로 최종화할 수 있도록 했습니다. 기본적으로는 기존 비동기 동작을 유지하면서, 프로젝션이 많은 테이블의 피크 메모리 사용량을 줄일 수 있습니다. #98228 (Amos Bird).- 각 프로젝션의 머지/재빌드 소요 시간을 밀리초 단위로 기록하는
projections_duration_ms컬럼을system.part_log에 추가했습니다. #98292 (Amos Bird). - KILL QUERY와 clickhouse-client의 쿼리 취소(Ctrl+C)를 통해 ExpressionTransform 및 NumbersRangedSource에서의 쿼리 취소를 개선했습니다. #98908 (Roman Vasin).
- 하드코딩된
source_table_engines목록을StorageFactory::getAllStorages()를 통한 런타임 조회로 대체했습니다. 이 변경으로 일부 누락된 테이블 엔진에 대한 접근 검사도 추가되었으며, #71544가 해결되었습니다. #98984 (pufit). - Variant 및 Dynamic의 유형 불일치 시 동작(throw 또는 NULL 반환)을 제어하는 설정을 추가했습니다. #99085 (Bharat Nallan).
Iceberg및 Spark 호환성 개선: 저장소 경로와 메타데이터 경로를 혼용하면서 발생한 일관성 없는 경로 처리 문제를 수정하고,Iceberg테이블이 테이블 위치를 URL 또는 절대 경로로만 기록하도록 강제했으며, 일부 ClickHouse 리더는 순회 후 바이트 수 계산을 지원하지 않으므로Azure에서 파일 크기 계산을 위한 폴백을 추가했고, Spark와 호환되는 방식으로version-hint.txt를 처리하며, 앞으로 경로 타입이 혼동되지 않도록 타입 수준 추상화를 도입했고, 중간 업로드/다운로드 없이 엔진 간 상호 운용성을 검증하는Azure및Local테스트를 추가했으며, 이전에는 적절하지 않은 경로 추론 휴리스틱에 의존하던 위치 삭제 사용도 수정했습니다. #99163 (Daniil Ivanik). #100420 (Daniil Ivanik).- https://github.com/ClickHouse/ClickHouse/pull/92844에서 도입된
IPartitionStrategy::cached_result의 잠재적인 경쟁 조건을 수정했습니다. #99400 (Arthur Passos). - 이제 ClickHouse 인터벌 데이터 타입을 Arrow 형식으로 작성할 수 있습니다. #99519 (Peter Nguyen).
Arrow및Parquet포맷에서UUID데이터 타입을 가져오고 내보내는 기능에 네이티브 지원이 추가되었습니다. 이제 사용자는 수동으로 문자열 변환을 하거나 별도 우회 방법을 쓰지 않고도 ClickHouse와 다른 데이터 도구 간에 UUID 데이터를 직접 쿼리하고 전송할 수 있습니다. 최상위 UUID에 대해서는 자동 논리 추론을 지원하며, 중첩 UUID에 대해서는 명시적 스키마 힌트도 지원합니다. #99521 (Ivan).- 객체 스토리지에서
7z아카이브를 지원합니다. #70968을 해결합니다. #99600 (Alexey Milovidov). - 객체 스토리지(
S3,Azure등) 파일 목록 조회 및 읽기 파이프라인을 내부 검사할 수 있도록ObjectStorageListedObjects,ObjectStorageGlobFilteredObjects,ObjectStoragePredicateFilteredObjects,ObjectStorageReadObjectsProfileEvents를 추가했습니다. #99778 (Sema Checherinda). - 모든 기반 분산/원격 테이블에 없는 컬럼을 쿼리할 때
UNKNOWN_IDENTIFIER오류로merge테이블 함수가 실패하던 문제를 수정했습니다. #99833 (Alexey Milovidov). - 이제 ReplicatedMergeTree의 mutation 총 실행 시간 메트릭에 커밋 시간도 포함됩니다. 이는 #96376 이후 누락되어 있었습니다. #99936 (alesapin).
MetadataStorageFromDisk에 삭제 대기 중인 blob 객체를 위한 write-ahead log를 추가해, 객체 삭제 시 메타데이터와 원격 객체 스토리지 간의 내구성과 일관성을 개선했습니다. #100019 (Maksim Kita).- server 환경 변수에 대한 접근을 방지하기 위해, 내장 클라이언트(SSH 및 WebSocket 프로토콜)에서 AI SQL 생성(
??명령)을 비활성화했습니다. #100290 (Alexey Milovidov). - catalog를 통한 Iceberg 삽입 인터페이스를 변경합니다. 다음 설정은 폐기 예정입니다:
storage_catalog_type,storage_aws_access_key_id등. #100334 (Konstantin Vedernikov). - clickhouse-client에 붙여넣을 때 탭이 공백 4개로 렌더링되도록 합니다. #100405를 닫습니다. #100416 (Raúl Marín).
show_data_lake_catalogs_in_system_tables가 비활성화된 경우, 「혹시 …을(를) 의미하셨나요?」 테이블 힌트를 표시하기 위해 원격 데이터 레이크 카탈로그 전체를 스캔하지 않도록 개선했습니다. #100452 (Alsu Giliazova).- 파티션 프루닝 이후
distributed_index_analysis_min_indexes_bytes_to_activate가 적용됩니다. #100477 (Azat Khuzhin). - 빈 IN/NOT IN 절을 사용할 때 Parquet 블룸 필터 push down에서 발생하던 assertion failure를 수정했습니다. #100543 (zoomxi).
- 이제 MinMax 컬럼 통계는 최소값과 최대값을 Float64 대신 타입이 지정된 Field로 저장합니다. 직렬화된 포맷에는 값과 함께 컬럼 타입 이름도 포함됩니다. 통계 파일 버전은 V2로 올라갔으며, 이전 버전에서 작성된 파일은 다시 구체화해야 합니다(ALTER TABLE … MATERIALIZE STATISTICS ALL). 수정 #53140. #100605 (Han Fei).
- Consumer 종료 시 발생하는 교착 상태 수정 사항을 포함하도록
cppkafka를 업데이트합니다. #100612 (Azat Khuzhin). - 이제 Iceberg에서 데이터 파일을 파싱할 때 사용되는 객체 정보에 manifest 파일에서 파싱된 파일 행 수와 바이트 단위의 파일 크기가 포함됩니다. #100645 (Daniil Ivanik).
- 캐시 메모리 아레나를 분리할지 제어할 수 있도록
use_separate_cache_arena구성 매개변수를 추가했습니다. #100664 (Seva Potapov). - Apache Arrow의
StringView및BinaryView데이터 타입을 ClickHouseString컬럼으로 가져올 수 있도록 네이티브 지원을 추가하여 Arrow 기반 수집의 호환성을 개선했습니다. #100762 (Ivan). - 이제 런타임 중 구성 파일이 변경되면 일부 Keeper server 설정이 즉시 다시 로드됩니다: max_requests_batch_size, max_requests_batch_bytes_size, max_request_size, quorum_reads. #100773 (Michael Kolupaev).
- 릴리스 빌드에서 profile events
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes의 카운트를 증가시켰습니다. #100899 (Pavel Kruglov). - 이제 Cgroupv2 메모리 추적에서는 커널 메모리에서
slab_reclaimable을 제외하여, 회수 불가능한 메모리 사용량을 더 정확하게 측정합니다. #100901 (Antonio Andelic). use_partition_pruning = 0은 이제 파티션 키 기반 프루닝뿐만 아니라, 파티션 키 컬럼에 대한MinMax인덱스 프루닝과 count 최적화도 비활성화합니다. #100904 (Nihal Z. Miaji).EXPLAIN [PLAN]에서pretty=1을 사용하면 이제 표현식이 사람이 읽기 쉬운 포맷으로 출력됩니다. #100927 (Kirill Kopnev).accurateCastOrNull및accurateCastOrDefault가 이제Tuple대상 타입을 지원하며, 여기에는널 허용요소를 포함하는 중첩튜플도 포함됩니다. 이전에는Tuple이Nullable내부에 포함될 수 없었기 때문에 이러한 함수에서Tuple대상을 허용하지 않았습니다. #100820을 해결했습니다. #100942 (Nihal Z. Miaji).- 밝은 테마와 어두운 테마를 전환할 때 실행 UI에서 차트가 중복 표시되는 문제를 수정했습니다. #101058 (Alexey Milovidov).
- chdig를 v26.3.1로 업데이트(perfetto UI, CPU/메모리/머지/쿼리 요약에 스파크라인 추가, system.warnings, 로그에서 regexp 검색). #101092 (Azat Khuzhin). chdig를 v26.4.3로 업데이트(perfetto 개선, pastila.nl을 통한 공유 관련 수정, 플레임 그래프 diff, 설정을 실시간으로 변경). #103145 (Azat Khuzhin).
- 이제
SELECT쿼리 앞의WITH절 끝에도 후행 쉼표를 사용할 수 있습니다. #101093 (Aruj Bansal). compress_per_column_in_compact_partsMergeTree 설정을 추가하여 압축 블록이 Compact 파트 내부에서 구성되는 방식을 제어할 수 있게 했습니다.true(기본값, 현재 동작 유지)인 경우 각 컬럼이 새 압축 블록에서 시작하므로 필요한 컬럼만 선택적으로 압축 해제할 수 있습니다.false인 경우 하나의 granule 내 모든 컬럼이 동일한 압축 블록에 패킹되어, 항상 모든 컬럼을 읽는 워크로드에서 압축률과 읽기 성능이 향상됩니다. #101114 (Amos Bird).- Play UI에서 테이블 정보 말풍선이 전체 행이 아니라 테이블 이름에 마우스를 올렸을 때만 표시되도록 개선했습니다. #101118 (Alexey Milovidov).
- Play UI 사이드바에 엔진별 아이콘을 추가하고 테이블 목록의 UX를 개선했습니다. #101134 (Alexey Milovidov).
Arrow,ArrowStream,ORC, 레거시Parquet포맷에서Nullable(Tuple)를 지원합니다. #101272 (Nihal Z. Miaji).- 웹 UI(play.html)에서 합계(TOTALS) 행을 테이블 푸터에 표시합니다. #101286 (Alexey Milovidov).
- 웹 UI(
play.html)에서 다중 쿼리 모드를 지원합니다.SELECT계열 쿼리를 병렬로 실행하고 각 쿼리의 결과를 개별적으로 표시하면서 여러 쿌리를 한 번에 실행할 수 있습니다. #101290 (Alexey Milovidov). - 결과 테이블이 웹 컴포넌트로 리팩터링된 이후 play.html 웹 UI에서 컬럼 크기 조정이 올바르게 동작하지 않던 문제를 수정했습니다. #101295 (Alexey Milovidov).
- 시간 인터벌별로 MEMORY_LIMIT_EXCEEDED 발생 시 jemalloc profile 플러시 횟수를 제한하는 기능을 추가했습니다. #101396 (Azat Khuzhin).
- Keeper 설정
nuraft_streaming_mode(기본값false),nuraft_max_log_gap_in_stream,nuraft_max_bytes_in_flight_in_stream가 추가되었습니다. #90743를 해결합니다. #101427 (Kseniia Sumarokova). - 커널 OS 페이지 캐시와 ClickHouse 사용자 공간 페이지 캐시를 모두 제외한 cgroup 메모리 사용량을 보고하는 비동기 메트릭
CGroupMemoryUsedWithoutPageCache가 추가되었으며,MemoryResidentWithoutPageCache와 동일한 방식입니다. 또한CGroupMemoryUsed메트릭 설명도 더 명확히 했습니다. #101513 (Francesco Ciocchetti). - SQL 표준
OVERLAY함수 구문에 파서(parser) 수준의 문법 편의 구문을 추가합니다.overlay함수는 이미 존재하며, 이번 변경으로PLACING,FROM,FOR를 구분자로 사용하는 키워드 기반 형식도 지원합니다. #101681 (Desel72). - 시스템 테이블
information_schema.tables에 컬럼 별칭INDEX_LENGTH가 추가되었습니다. 이는 이 테이블에 이미 있는 기존 대문자 별칭과 동일한 방식입니다. #101705 (Robert Schulze). - 시스템 테이블(system table)
information_schema.tables는 이제 비활성 테이블 파트를 무시합니다. 이에 따라 표시되는 테이블 크기 값이 더 현실적으로 표시됩니다. #101706 (Robert Schulze). - 이제
ngrams함수는 유효하지 않은 ngram 길이를 허용하지 않습니다. 예시:SELECT ngrams('abc', 0)는 이제 오류를 반환합니다. #101922 (Robert Schulze). - #91820 및 #90837의 후속 작업: 오류 메시지에서 지원되지 않는 알고리즘을 걸러내고, FIPS 빌드에서는 FIPS 전용 테스트를 실행합니다. #102067 (Mikhail f. Shiryaev).
- Web UI(
play.html)에서 셀 높이를 3줄로 제한하고, 클릭하면 셀이 확장되도록 개선했습니다. #102154 (Alexey Milovidov). - S3 endpoint에 대해 (virtual/path) 스타일을 강제할 수 있는 새 옵션이 추가되었습니다. #82019, #76007 문제를 해결합니다. https://github.com/ClickHouse/ClickHouse/pull/83168의 후속 작업입니다. #102378 (Konstantin Vedernikov).
- 이제
restore_replace_external_engines_to_null설정은 실패하거나 외부 연결을 시작하는 대신, 외부 엔진(예:DataLakeCatalog,MySQL,PostgreSQL,S3)을 사용하는 데이터베이스를 복원할 때도 해당 데이터베이스를 건너뜁니다. #102400 (Nikita Fomichev). HINT모드에서hasPhrase함수의 텍스트 인덱스 분석을 지원하도록 했습니다. #102438 (Elmi Ahmadov).- ColumnDependency에서 STATISTICS를 읽기 전용으로 간주하여 MATERIALIZE STATISTICS ALL 수행 중 발생하는 LOGICAL_ERROR를 수정합니다. #102627 (Konstantin Bogdanov).
- keeper-as-server 모드에서
system.asynchronous_metric_log를 생성하고 데이터를 채웁니다. #102664 (Miсhael Stetsyuk). - 시스템 로그 테이블에서 ALIAS 컬럼을 생략할 수 있도록
default_system_log_flush_policy.skip_alias_columns구성 옵션을 추가하여, ALIAS 컬럼을 거부하는 S3 기반 시스템 로그 문제를 해결했습니다. #102669 (Miсhael Stetsyuk). - 시스템 테이블에는 자동 통계를 활성화하지 마십시오. 이를 사용할 일은 거의 없습니다. #102862 (Han Fei).
- LIKE 최적화에서
array토크나이저를 지원합니다. #102880 (Elmi Ahmadov). - 릴리스 빌드에서도 MemoryAllocatedWithoutCheck를 전송하도록 했습니다. #103064 (Azat Khuzhin).
- system.stack_trace에 스레드별 untracked_memory를 표시합니다. #103065 (Azat Khuzhin).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- Lazy materialization에서 반환되는 불필요한 컬럼으로 인해 발생하는
Block structure mismatch in stream오류를 수정했습니다. #95191을 해결합니다. #96682 (Nikolai Kochetov). ON CLUSTER를 사용하는 데이터 마스킹 정책 쿼리의 논리 오류를 수정했습니다. #97594 (Bharat Nallan).- GCS에서 Unity Catalog를 사용할 때 발생하던 버그를 수정했습니다. #98456 (Melvyn Peignon).
DataLakeCatalog는 이제auth_header설정을 검증할 때 서버의http_forbid_headers구성을 따릅니다. #98827 (Michael Anastasakis).- S3 중괄호 확장 글롭 패턴에서 발생하던 N+1
HeadObject호출을 수정했습니다. #99219 (Konstantin Bogdanov). - 엔진 자체에서도 설정을 지원하는 경우 CREATE 쿼리의 설정 변경 사항을 검증합니다. #99279 (János Benjamin Antal).
- 표현식이 EPHEMERAL 컬럼에 의존하는 MATERIALIZED 컬럼이 있는 테이블에서
ALTER TABLE UPDATE/DELETE가Missing columns오류로 실패하던 문제를 수정했습니다. #99281 (Yash ). - JDBC, ODBC 및 NATS 연결 문자열의 자격 증명은 이제 쿼리 로그와
SHOW CREATE출력에서 마스킹되어, 민감한 정보가 실수로 노출되는 일을 방지합니다. URI 스타일 연결 문자열(예:{scheme}://{user}:{password}@{host})의 경우 비밀번호 부분만 마스킹되고, 나머지 부분은 디버깅을 쉽게 할 수 있도록 계속 표시됩니다. 이제nats_token설정도 마스킹됩니다. #99344 (János Benjamin Antal). - DD-month-YYYY 형식에서 month 프리픽스로 시작하는 단어를
parseDateTimeBestEffort가 잘못 파싱하는 문제를 수정했습니다. #99345를 해결합니다. #99350 (Pavel Kruglov). - 분석기를 사용하지 않을 때 TABLE_UUID_MISMATCH를 무시하던 문제를 수정했습니다. #99380 (Azat Khuzhin).
compatibility와 함께 동일한 요청으로 전송된 명시적 설정의 값이 서버 기본값과 일치할 경우, 해당 설정이 조용히 무시될 수 있던 버그를 수정했습니다. #99402 (Raufs Dunamalijevs).- hive 파티셔닝 경로에서 앞에 0이 붙은 숫자로 인해 오류가 발생하던 문제를 수정했습니다. #98801. #99458 (Yarik Briukhovetskyi).
- 실행 중인 읽기 쿼리와 동시에 테이블이 삭제될 때 발생하는 heap-use-after-free 문제를 수정했습니다(CI에서 지난 90일 동안 19회 발생). #99483 (Alexey Milovidov).
- Keeper에서 읽기 요청이 멈춰 세션 시간이 초과될 수 있던 버그를 수정했습니다. 이 문제는 동일한 서버에서 서로 무관한 다른 세션이 절묘하게 잘못된 시점에 종료될 때 발생할 수 있었습니다. #99484 (Michael Kolupaev).
- 패치 적용 전에 컬럼 구조를 검증합니다. #99531 (Seva Potapov).
Dynamic컬럼이 있는 테이블에서 수직 병합 중SYSTEM STOP/START MERGES를 빠르게 전환할 때 발생하는rows_sourcesassertion 실패를 수정했습니다. #99532 (Alexey Milovidov).toWeek()의 잘못된 파티션 프루닝을 수정하여toYYYYMM(date)로 파티션된 테이블에서WHERE toWeek(date, mode) = N쿼리가 49~52주차에 빈 결과를 반환하던 문제를 해결했습니다. #99542 (Takumi Hara).- JOIN으로 생성된 미참조 행이 있는 ColumnReplicated를 처리하는 함수에서 발생하던 예외를 수정했습니다. #99564 (Hechem Selmi).
CLEAR COLUMN이 프로젝션을 다시 빌드하지 않고, 비워진 컬럼에 의존하는 materialized 컬럼도 재평가하지 않던 문제를 수정했습니다. 이 문제는 이후 머지 과정에서 예외나 데이터 손상을 일으킬 수 있었습니다. #99565 (Desel72).- 테이블에 컬럼 통계(column statistics)가 있고
use_statistics가 활성화된 상태에서, 쿼리가 단일 스칼라 쿼리 매개변수(예:WHERE col IN ({p:String}))와 함께 IN을 사용할 때ConditionSelectivityEstimator에서 발생하던 예외(Bad get: has Tuple, actual type String)를 수정했습니다. #99614 (Ilya Yatsishin). - 알 수 없는 프로젝션이 있는 파트는 영구 손실로 표시되어서는 안 됩니다. #99623 (Sema Checherinda).
SYSTEM STOP MERGES및SYSTEM START MERGES가 동시에 실행되는 경우 수직 병합 중 드물게 발생하던 논리 오류 예외를 수정했습니다. #99628 (Desel72).- 머지 중 크래시를 일으키던 injectRequiredColumns의 댕글링 참조를 수정했습니다. #99679 (Tuan Pham Anh).
- 숫자 값이 대상 컬럼 유형의 표현 범위를 초과할 때 Avro 포맷 리더에서 발생하던 정의되지 않은 동작을 수정했습니다. 이제는 잘못된 값을 조용히 생성하는 대신 오버플로우가 발생하면 쿼리가 실패합니다. #99697 (asyablue22).
executable테이블 함수 인수의 셸 스타일 따옴표 파싱을 수정했습니다. #99794 (Nikita Semenov).- 행 수가 일치하지 않는 Native 형식 스트림을 역직렬화할 때
NativeReader에서 발생하던 오탐 abort를 수정했습니다.LOGICAL_ERROR를INCORRECT_DATA로 변경해, 새니타이저/디버그 빌드에서abort()를 트리거하는 대신 데이터 오류로 처리되도록 했습니다. #99822 (Rahul Nair). - 바이너리 스트림의 직렬화 종류가
DETACHED일 때Tuple컬럼 역직렬화 과정에서 프로세스가 비정상 종료되는 문제를 수정했습니다. #99823 (Rahul Nair). - SLRU 하위 큐 승격 과정의 경쟁 상태로 인해 파일 시스템 캐시를 동적으로 리사이즈할 때 잘못된
LOGICAL_ERROR예외가 발생하던 문제를 수정했습니다. #99850 (Alexey Milovidov). query_log및 클라이언트 출력에서written_rows,read_rows,result_rows가 0으로 보고되던 async insert 쿼리 문제를 수정했습니다. #99879 (Sema Checherinda).system tables에 대한 내부 쿼리가ColumnConst로 감싼 컬럼을 반환할 때KILL QUERY에서 발생하던 “Bad cast from type X to Y” 예외를 수정했습니다. #99881 (Alexey Milovidov).- untuple 인수 내부의 상관 서브쿼리에서 발생하던 논리 오류를 수정했습니다. #99917 (Vladimir Cherkasov).
right,rightUTF8또는 기타 substring 함수에 길이로 INT64_MIN (-9223372036854775808)을 지정해 호출할 때 발생하던 예외를 수정했습니다. 이전에는 정수 오버플로우로 인해 정의되지 않은 동작이 발생했지만, 이제는 함수가 ARGUMENT_OUT_OF_BOUND 오류를 올바르게 보고합니다. #99934 (Jimmy Aguilar Mena).- 이제 ClickHouse는 spark 스타일 테이블(각 파일에 전체 절대 경로가 있거나 공통 테이블 경로를 기준으로 한 상대 경로가 있는 경우)을 올바르게 처리합니다. #92348를 수정했습니다. #99935 (alesapin).
ALTER TABLE ... MODIFY QUERY에서 중첩된 서브쿼리에SETTINGS가 포함되어 있고ALTER자체에도SETTINGS가 있을 때 발생하던 “AST 포맷 불일치” 예외를 수정했습니다. #99938 (Nikita Mikhaylov).- 성능 회귀가 의심되어 #97114 “자식 노드가 1개인지 확인하기 전에 join 단계의 행 수 추정을 수행하도록 변경”을 되돌렸습니다. #99957 (Alexander Gololobov).
- HEAD 요청 응답에
Content-Length헤더가 없을 때(예: GCS의 압축 해제 트랜스코딩으로 인해) ClickHouse가 파일을 건너뛸 수 있던 버그를 수정했습니다. #99971 (Yarik Briukhovetskyi). - 짝수 정수 상수로
NumericIndexedVectoraggregate states를 곱할 때,pointwiseAddInplace에서 별칭이 있는 Roaring 비트맵에 자체 XOR가 수행되어 발생하던 assertion failure(디버그 빌드에서는 예외, 릴리스 빌드에서는 잘못된 결과)를 수정했습니다. #99976 (Desel72). - 연쇄된
JOIN USING에서 조인 변환 후 키 타입이 변경되더라도, 레거시 필터 푸시다운 중Unexpected return type예외가 발생하지 않도록 수정했습니다. #99999 (Alexey Milovidov). - 해석되지 않은 테이블 함수 인수 안에서 스칼라 서브쿼리를 사용할 때 발생하는
LOGICAL_ERROR예외 “테이블 표현식에 대해 예상하지 못한 노드 유형 … 실제는 IDENTIFIER”를 수정했습니다. 예:SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1))). #100014 (Alexey Milovidov). - 다음 줄에 후행 SQL 주석(
--또는/* */)이 있는 경우, 데이터 뒤에 이어지는VALUES를 사용한INSERT가 실패하던 문제가 수정되었습니다. 이제 해당 주석은 다른 행으로 구문 분석되는 대신 건너뜁니다. #100016 (Pratima Patel). arrayRemove에서 NULL 요소를 포함한 튜플을 비교할 때 발생하던 예외를 수정했습니다. #100017 (Alexey Milovidov).system.asynchronous_inserts에서 사용자 간 데이터 유출 문제를 수정했습니다. 이전에는 해당 테이블에 대한SELECT권한이 있는 사용자가 다른 사용자의 대기 중인 async insert 항목을 볼 수 있었지만, 이제는SHOW_USERS권한이 있는 경우를 제외하면 현재 사용자 기준으로만 항목이 필터링됩니다. #100024 (Shaohua Wang).- Time64를 UInt64로 CAST할 때 값이 24시간으로 잘릴 수 있던 문제를 수정했습니다. #100025 (Yarik Briukhovetskyi).
- 목록 값에 존재하지 않는 함수가 포함된 정의가 있는
CREATE DICTIONARY에서 로컬 server가 충돌하던 문제를 수정했습니다. #100036 (Yakov Olkhovskiy). CSV,MsgPack포맷에서Nullable(Tuple)을 올바르게 파싱하지 못하던 문제를 수정했습니다. #99753를 해결합니다. #100038 (Nihal Z. Miaji).IN의 오른쪽에 WITH 함수 표현식 별칭(예:tuple(...))을 사용할 때UNKNOWN_IDENTIFIER로 인해CREATE VIEW가 실패하던 문제를 수정했습니다. #100042 (Peng).- 병렬 레플리카 환경에서
initializeAggregation또는AggregatingMergeTree와 함께 사용할 때 시계열 집계 함수(예:timeSeriesResampleToGridWithStaleness)가ILLEGAL_TYPE_OF_ARGUMENT로 실패하던 문제를 수정했습니다. #100053 (Alexey Milovidov). - NumericIndexedVectorDataBSI 내부에서 음수 값이 올바르게 처리되도록 수정했습니다. #100086 (Daniil Ivanik).
- 상수 입력에서 Const 컬럼 유형이 유지되지 않던
accurateCastOrDefault및to*OrDefault함수 문제를 수정했습니다. #100132 (Alexey Milovidov). LowCardinality(Nullable(T))유형의 생략된 쿼리 매개변수는 이제Nullable(T)와 동일하게 기본값이 올바르게 NULL로 설정됩니다. #100144 (Denys Melnyk).- StringSearcher.h의 초기화되지 않은 값 사용 문제를 수정했습니다. #100225 (Konstantin Bogdanov).
- Ctrl+C로 스칼라 서브쿼리와 기타 분석 시점 파이프라인을 취소할 수 있도록 했습니다. 이전에는 오래 실행되는 스칼라 서브쿼리 도중 Ctrl+C를 눌러도 서브쿼리가 완료될 때까지 아무런 효과가 없었습니다. 또한 진행률 표시줄과 JSON 통계가 스칼라 서브쿼리 실행 중 읽은 행 수를
clickhouse-client와clickhouse-local모두에서 올바르게 표시하도록 수정했습니다. @YjyJeff와 공동 작성했습니다. #100230 (Raúl Marín). - 교차 조인 및 런타임 필터가 포함된
Dynamic컬럼 관련 쿼리에서 발생하던LOGICAL_ERROR예외를 수정했습니다. 원인은hasOnlyNulls최적화 경로에서ColumnVariant::filter가 variant 컬럼 포인터를 복제하는 대신 공유하던 것이었습니다. https://github.com/ClickHouse/ClickHouse/pull/100147을(를) 닫습니다. #100234 (Pavel Kruglov). arrayFirst/arrayLast함수를 호출할 때 variant 배열의 데이터 타입이 잘못 재해석될 수 있던 버그를 수정했습니다. 예를 들어, 이전에는 실제 내부 variant 타입이Date인 경우Array(Variant(Date, Bool))가Bool로 변환되었습니다. #100255 (timothygk).- 함수에 몇 가지 사소한 변경이 있었습니다. h3 함수는 이제 경계를 더 정확히 검증하고, readWKB는 크기 제한(새로운 설정
max_wkb_geometry_elements)을 확인하며, 난수 생성기 함수는 계산 중 최대 반복 횟수를 제한합니다. #93543의 후속 조치입니다. #100270 (Alexey Milovidov). - cutURLParameter에서 매개변수가 다른 매개변수의 부분 문자열로 포함된 경우, 해당 매개변수를 잘못 건너뛰는 문제를 수정했습니다. #100280 (Nikita Semenov).
- Iceberg 메타데이터 파일 경로 설정에 널 바이트가 포함된 경우 발생하던 예외를 수정했습니다. #100283 (Alexey Milovidov).
distributed_index_analysis를IN서브쿼리를 포함한 프레디케이트와 함께 사용할 때 실행 쿼리 수가 2차적으로 증가하던 문제를 수정했습니다. #100287 (Anton Popov).GROUP BY ... WITH TOTALS HAVING,UNION DISTINCT, 그리고 널 허용 표현식을 함께 사용할 때 발생하던 “Block structure mismatch” 예외를 수정했습니다. #100293 (Alexey Milovidov).block_size_bytes매개변수가 매우 클 때estimateCompressionRatio에서 발생하는 LOGICAL_ERROR 예외를 수정했습니다. #100298 (Alexey Milovidov).- 디버그 빌드에서
GROUP BY CUBE(...) WITH ROLLUP또는 이와 유사한 조합을 사용할 때 발생하던 “일관되지 않은 AST 포맷팅” 예외를 수정했습니다. #100376 (Alexey Milovidov). SELECT *또는EXCEPT/INTERSECT쿼리와 컬럼 별칭을 사용하는 뷰를 생성할 때 발생하던 예외를 수정했습니다. #100386 (Alexey Milovidov).- heartbeat 오류가 발생한 뒤 컨슈머가 리밸런싱 상태에 고착되었을 때 Kafka engine 테이블에서
DROP TABLE이 무기한 대기하는 문제를 수정했습니다. #100388 (Alexey Milovidov). - zip 아카이브를 사용하는 백업/복원 작업에서
ReadBuffer is canceled. Can't read from it.예외가 발생하던 문제를 수정했습니다. #100400 (Alexey Milovidov). - 데이터가 서로 맞지 않는 granule 경계를 가진 여러 파트에 분산되어 있을 때,
max_rows_to_read/force_primary_key를 사용하는SELECT count()쿼리에서 발생하는TOO_MANY_ROWS예외를 수정했습니다. #100408 (Alexey Milovidov). - 테이블별, DB별, 컬럼별 revoke를 포함한 모든 grant 조합에서
system.completions가 접근 권한에 따라 데이터베이스, 테이블, 컬럼을 올바르게 필터링하도록 수정했습니다. #100432 (Shaohua Wang). - race condition으로 인해 NuRaft에서 발생하던 SEGFAULT를 수정했습니다. #100444 (Pablo Marcos).
min/max/argMin/argMax가 이제 NaN을ORDER BY와 일관되게 처리합니다. NaN은 항상 건너뛰고(모든 값이 NaN인 경우에만 반환됨), 이전에는 IEEE 754의 비순서 비교 시맨틱 때문에 결과가 데이터 내 NaN의 위치에 따라 달라졌습니다. #100448 (Raúl Marín).delta_lake_snapshot_start_version없이delta_lake_snapshot_end_version만 설정된 경우,BAD_ARGUMENTS오류를 발생시키는 대신 그대로 무시되던 복사-붙여넣기 버그를 수정했습니다. #100454 (Mohammad Lareb Zafar).StorageRabbitMQ::shutdown은 멱등적이지 않습니다(weak pointer에 무조건 접근한 뒤 해당 shared pointer를 파괴함). 하지만 이제 이 메서드는 두 번 호출됩니다. 한 번은StreamingStorageRegistry에서, 그다음은DatabaseCatalog에서 호출됩니다. 이번 수정으로 이 메서드가 멱등적으로 동작하도록 변경하고, 방어적인 null 검사도 추가했습니다. #100455 (Miсhael Stetsyuk).QBit대상 유형에서accurateCastOrNull사용 시 발생하던LOGICAL_ERROR예외를 수정했습니다. #100470 (Raufs Dunamalijevs).- nested
Array(JSON)컬럼이 있는 테이블에optimize_on_insert=0으로 wide 파트에 삽입할 때 발생하던 LOGICAL_ERROR 예외 “Stream … not found” 문제를 수정했습니다. #100475 (Pavel Kruglov). - 백업 메타데이터에서 파일 항목의 경로를 검증해
RESTORE중 경로 순회, 절대 경로, 빈 이름을 차단합니다. #100483 (Pablo Marcos). - 작동하지 않던
LIMIT m OFFSET n WITH TIES구문 문제를 수정했습니다. 이 구문은 이미 작동하던LIMIT n, m WITH TIES와 동일합니다. #100491 (Nihal Z. Miaji). IN을 사용할 때 이름 있는 필드와LowCardinality요소가 포함된Nullable(Tuple)컬럼에서 발생하는 예외 “No set is registered for key”를 수정했습니다. #100523 (Alexey Milovidov).- 벡터 유사도 검색 중 크래시를 일으키거나 즉시 드러나지 않게 메모리를 손상시킬 수 있던 usearch
sorted_buffer_gt::insert()의 heap-buffer-overflow를 수정했습니다. #100537 (Dustin Healy). EXECUTE AS가 쿼리에서 지정된FORMAT및INTO OUTFILE절을 무시하던 문제를 수정했습니다. #100538 (pufit).- 쿼리 수준 OFFSET이 있는 SAMPLE의 일관되지 않은 AST 포맷을 수정했습니다. #100576을 해결합니다. #100579 (Pavel Kruglov).
- Azure에서 polaris catalog 관련 문제를 수정했습니다. 25.12부터는 Azure에서 이 catalog를 사용할 때 경로 시작 부분에 버킷이 추가되기 시작했습니다. 예를 들어
abfss://polaris-polaris@<some_url>.windows.net/<other-path>대신abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path>가 되었습니다. 이 PR은 경로에서 버킷을 제거합니다. #100583 (Konstantin Vedernikov). - 일부 블록에서 기본 컬럼이 const인 경우 transform에서 발생하던 type mismatch 예외를 수정했습니다. #100574를 해결합니다. #100616 (Pavel Kruglov).
- projection SELECT 부분에 쿼리의 원래 SELECT 부분에 없는 컬럼이 포함된 경우 발생하는 NOT_FOUND_COLUMN_IN_BLOCK 문제를 수정합니다. #100194을 해결합니다. #100623 (Yarik Briukhovetskyi).
- 비정상적으로 큰 차원을 가진 조작된
.npy파일로 인한 서비스 거부를 방지하기 위해, Npy 포맷의 shape 차원을 파일 크기와 오버플로우 한도에 맞춰 검증합니다. 또한 빈 shape는 거부하고, 행당 메모리 사용량은 2 GiB로 제한합니다. #100625 (Raúl Marín). - async inserts (TCP) 중과 HTTP를 통한 모든 삽입에서
DateTime값을 파싱할 때session_timezone이 무시되던 문제를 수정했습니다. #100647 (Sema Checherinda). - 소스로 테이블 함수를 사용할 때(예:
cluster('name', view(...), sharding_key)),cluster()및clusterAllReplicas()테이블 함수에 sharding key를 전달할 수 있습니다. #100665 (Sergey Veletskiy). - 매개변수화된 집계 함수에서 Array combinator와 NULL 인수(예:
quantileIfArrayArray(0.5)([[NULL]], [[1]]))를 사용할 때 발생하던 서버 충돌(assertion failure)을 수정했습니다. #100679 (nerve-bot). use_variant_as_common_type가 활성화된 상태에서 빈 튜플과 비어 있지 않은 튜플의 공통 상위 타입을 계산할 때 발생하던 예외를 수정했습니다. #100699 (Antonio Andelic).- Azure blob storage 디스크가 구성되어 있지만 endpoint에 일시적으로 연결할 수 없는 경우(예: DNS 실패)에도 server가 더 이상 시작되지 못하는 문제가 발생하지 않습니다. #100701 (Raúl Marín).
- 부호 없는 제수가 부호 있는 결과 타입에 담기지 않을 때
positiveModulo에서 발생하던 정의되지 않은 동작을 수정했습니다. #100705 (Raúl Marín). use_top_k_dynamic_filtering이 활성화되어 있고ORDER BY컬럼이Dynamic또는Variant유형일 때 발생하던 서버 크래시(논리 오류 “Unexpected return type from __topKFilter”)를 수정했습니다. #100742 (Groene AI).- LowCardinality 요소를 포함한 Tuple 키에서 PREWHERE/WHERE와 함께
has()함수를 사용할 때 발생하던 서버 충돌 문제를 수정했습니다. #100760 (Groene AI). - S3 객체 스토리지에서 동시 쓰기 환경의
Log또는StripeLog테이블을 읽을 때 발생하는file_offset_of_buffer_end <= getFileSize()어서션 실패(디버그 빌드에서는 예외)를 수정했습니다. #100763 (Alexey Milovidov). - 통계가 활성화된 테이블에서 WHERE 절에 함수 표현식(예: toDecimal64(col, 3))이 포함될 때 선택도 추정기에서 발생하던 예외를 수정했습니다. 이제 추정기는 잘못된 형 변환을 시도하는 대신 이러한 프레디케이트를 건너뜁니다. #100764 (Han Fei).
- 재정렬이 있는 join에서 잘못된 결과가 발생할 수 있는 드문 사례를 수정했습니다. #100790 (Yarik Briukhovetskyi).
- 최적화된 단순 count에서
AggregateFunction인수 타입이 잘못 처리되던 문제를 수정했습니다. 이 문제로 인해 분산 테이블에서count(v0 + v1)와 같은 표현식을 쿼리할 때NUMBER_OF_ARGUMENTS_DOESNT_MATCH예외가 발생했습니다. #100794 (YjyJeff). - 일부 카탈로그에서는
select * from system.databases쿼리 결과의SETTINGS섹션에 일부 시크릿이 표시될 수 있습니다. 이 PR은 이러한 동작이 발생하지 않도록 방지합니다. #100800 (Konstantin Vedernikov). toStartOfInterval에서 origin 인수를 사용해 Week, Quarter 또는 Year 인터벌에 극단적인 인터벌 값을 적용할 때 발생할 수 있던 정의되지 않은 동작(부호 있는 정수 오버플로우)을 수정했습니다. #100817 (Raúl Marín).Nullable(Tuple)도입 이후Tuple반환 유형과 하나 이상의Nullable인수를 가진If,Distinct,DistinctIf,IfState집계 함수 조합자가 이전에 직렬화된 상태를 읽을 수 없던 문제를 수정했습니다. #98917을 해결합니다. #100826 (Nihal Z. Miaji).- 연결 풀에서 발생한 use-after-free로 인해 s3Cluster 및 분산 쿼리에서 발생하던 segfault를 수정했습니다. #100837 (Konstantin Bogdanov).
- 서버 종료 중 딕셔너리를 로드할 때 발생하는 NULL 포인터 역참조 segfault를 수정했습니다.
Context::getUserDefinedSQLObjectsStorage(user_defined_sql_objects_storage를 역참조함)는 딕셔너리 thread에서 호출되고, 동시에 메인 thread는Context::shutdown(user_defined_sql_objects_storage를 null로 설정함)을 호출합니다. 따라서Context::shutdown를 실행하기 전에 딕셔너리 로더에서 이후 업데이트를 비활성화하고, 현재 실행 중인 딕셔너리 쿼리를 종료하며, 딕셔너리 로딩 thread를 join해야 합니다. 이는 일반 쿼리에서 처리하는 방식과 유사합니다. #100839 (Miсhael Stetsyuk). - 입력에 ASCII가 아닌 바이트가 포함된 경우
ULIDStringToDateTime의 버퍼 오버플로우를 수정했습니다. #100843 (Konstantin Bogdanov). - 여러 테이블(
Distributed테이블 포함)을 래핑하는Merge테이블(또는merge()테이블 함수)을distributed_group_by_no_merge=1이 활성화된 상태에서 쿼리할 때 발생하던 크래시(LOGICAL_ERROR)를 수정했습니다. #100859 (Groene AI). - Cast_keep_nullable가 활성화되면 dynamic null을 Variant로 CAST할 때 예외를 발생시키지 않습니다. #100864 (Seva Potapov).
clickhouse-keeper-client의get,exists,ls명령에서watch_id중복 오류 메시지가 stderr가 아닌 stdout에 출력되던 문제를 수정했습니다. #100893 (Mohammad Lareb Zafar).- 널 허용 튜플 배열에서 발생하던
intDiv/intDivOrZero예외를 수정했습니다. 예:SELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín). - 정의를 저장하기 전에
StorageAlias의 엔진 인수를 평가하여currentDatabase()와 같은 표현식이 데이터베이스에 저장되기 전에 리터럴 값으로 해석되도록 했습니다. #100902 (Nikolay Degterinsky). query_plan_merge_expressions = 0이고ExpressionStep이ReadFromMergeTree바로 위에 있을 때processAndOptimizeTextIndexFunctions를 수정했습니다. #100879를 해결합니다. #100909 (Jimmy Aguilar Mena).- replxx를 업데이트해 do_complete_line에서 발생하는 범위 외 접근 문제에 대한 수정이 포함되도록 했습니다. #100925 (Azat Khuzhin).
- JOIN에서 세그먼트-by-PK 최적화를 사용할 때 쿼리 조건 캐시가 적용되고 일부 파트가 캐시된 조건으로 필터링되면 잘못된 결과가 나오던 문제를 수정했습니다. #100926 (Groene AI).
divide및intDiv를 일부 경우 인덱스 분석 중 필터 표현식에서 사용하면ILLEGAL_DIVISION이 반환되던 문제를 수정했습니다. #100928 (Nihal Z. Miaji).- 비동기 시작 중 시작 의존성 순서가 잘못되어 발생하던, 내부 테이블이 있는 materialized view의 “대상 테이블이 존재하지 않습니다” 오류를 수정했습니다. #100946 (Nikolay Degterinsky).
- 18자리를 초과하는 초 단위 소수 자릿수를 포함한 datetime 문자열을 parsing할 때
parseDateTimeBestEffort에서 발생하는 정의되지 않은 동작(부호 있는 정수 오버플로우)을 수정했습니다. #100948 (Vasily Chekalkin). IN절에 튜플 서브쿼리가 포함된 경우(예:WHERE (id, str) IN (SELECT (id, str) FROM ...)) 또는 서브쿼리의 컬럼 수가IN왼쪽 튜플과 일치하지 않는 경우, 텍스트 검색 인덱스 사용 시 발생하던 비정상 종료를 수정했습니다. #100959 (Anton Popov).MergeTree테이블에서 희소 컬럼 직렬화를 사용할 때 폴리곤 딕셔너리를 생성하는 중 발생하던 충돌을 수정했습니다. #100964 (Anton Popov).- 상수 폴딩된 표현식과 함께
INTERSECT ALL/UNION ALL을 사용할 때 발생하는 논리 오류 “Invalid action query tree node”를 수정했습니다. #100977 (Alexey Milovidov). Nullable(Tuple)도입 이후 하나 이상의Nullable인수를 사용하는sumCountOrDefault집계 함수가 이전에 직렬화된 state를 읽지 못하던 문제를 수정했습니다. #100882를 해결했습니다. #101021 (Nihal Z. Miaji).- 지연 컬럼 복제(
enable_lazy_columns_replication)가 뒤늦게 도착한 입력과 함께 머지-정렬 파이프라인으로 전달되는ColumnReplicated컬럼을 생성할 때, 머지 알고리즘에서 발생하던 충돌(Logical error: isConst/isSparse/isReplicated assertTypeEquality)을 수정했습니다. #101036 (Groene AI). SELECT에서 동일한 alias가 여러 표현식에 사용될 때 잘못UNKNOWN_IDENTIFIER오류가 보고되던 문제를 수정했으며, 이제 올바른MULTIPLE_EXPRESSIONS_FOR_ALIAS오류가 보고됩니다. #101040 (Alexey Milovidov).- 지정된 시간대가 표현식의 시간대와 다를 때
DateTime/DateTime64타입의 ALIAS 컬럼에 시간대 변환이 적용되지 않던 문제를 수정했습니다. #101043 (Alexey Milovidov). - 뷰, 서브쿼리 및
INSERT ... SELECT의query_log에 행 정책(row policies)이 기록되지 않던 문제를 수정했습니다. 쿼리 계획 단계에서 행 정책이 적용되더라도, 로깅을 위해 서브 플래너에서 상위 플래너로 전달되지 않았습니다. 이제 행 정책(로깅 전용)은QueryAccessInfo에 보관되므로 플래너와 서브 플래너가 모두 이를 채울 수 있습니다. #101044 (Narasimha Pakeer). DirectJoinMergeTreeEntity에서 파이프라인 블록에ColumnConst컬럼이 포함되어 있고, 이 컬럼이 일반 컬럼과 머지될 때 발생하던 예외를 수정했습니다. #101046 (Alexey Milovidov).- CTE 컬럼 별칭 형식의 불필요한 공백을 수정했습니다 (
WITH t (a, b)→WITH t(a, b)). #101049 (Alexey Milovidov). - 분석기가 활성화된 상태에서
merge와 같은 중첩 테이블 함수를 사용할 때remote/cluster테이블 함수가 실패하던 문제를 수정했습니다. #101055 (Alexey Milovidov). prefer_localhost_replica=1일 때 분산 쿼리에서OFFSET이 두 번 적용되어 예상보다 적은 행이 반환되는 문제를 수정했습니다. #101071 (Nihal Z. Miaji).format_regexp설정에 유효하지 않은 정규식을 사용했을 때Regexp포맷에서 발생하던 충돌을 수정했습니다. #101074 (Nihal Z. Miaji).- 병렬 레플리카에서
serialize_query_plan=1을 사용할 때 시계열 집계 함수에 발생하던 “Illegal type Decimal64 of start parameter” 오류를 수정했습니다. #101083 (Groene AI). ORDER BY ... LIMIT와 함께 PREWHERE가 있는 프로젝션을 사용할 때optimizeLazyMaterialization에서 발생하던 예외를 수정했습니다. #101115 (Anton Popov).- 내부 전용
Nullcombinator(예:sumNull,avgNull)와 집계 함수를 함께 사용하고aggregate_functions_null_for_empty = 1설정이 활성화되어 있을 때 발생하던 서버 충돌(SIGABRT)을 수정했습니다. #101147 (Groene AI). - 파일 시스템 캐시 쓰기 경로에서 완료된 파일 세그먼트를 로깅할 때 해제된 메모리를 읽을 수 있던 use-after-free 문제를 수정했습니다(BuzzHouse에서 MemorySanitizer로 감지됨). #101161 (Groene AI).
- 명시적 요소 없이 생성된 Set을 사용하는 GLOBAL IN 프레디케이트를 분산 인덱스 분석에서 처리할 때, “Trying to attach external table to a ready set without explicit elements” 오류와 함께 서버가 충돌하던 문제를 수정했습니다. #101178 (Groene AI).
- JIT 컴파일이 활성화된 상태에서(컴파일 임계값 도달 후)
Decimal컬럼의MAX/MIN집계 함수가 잘못된 결과를 반환하던 문제를 수정했습니다. #101203 (Raúl Marín). - 경량한 삭제 후
minmax_count_projection및 단순COUNT(*)최적화가, 경량한 삭제 마스크가 있는 모든 파트가 머지되어 사라진 뒤에도 영구적으로 비활성화된 상태로 남아 있던 문제를 수정했습니다. #101212 (Anton Popov). list와read사이에 원격 객체가 덮어써지면서 이전에는 객체 메타데이터가 오래된 상태로 남아 캐시에서Having zero bytes, ...논리 오류가 발생할 수 있던 문제를 수정했습니다. #101219 (Kseniia Sumarokova).lc_column이 LowCardinality 타입일 때ORDER BY CAST(lc_column, 'Type')로 MergeTree 테이블을 쿼리하면 발생하던 server crash(LOGICAL_ERROR: ColumnVector에서 ColumnLowCardinality로의 잘못된 CAST)를 수정했습니다. #101220 (Groene AI).S3Queue에서 오래된 processing 노드 정리 문제를 수정했습니다. #101230 (Kseniia Sumarokova).- 유효하지 않은 optimizations 인수가 전달된 경우 mergeTreeAnalyzeIndexes()에서 발생할 수 있는 정의되지 않은 동작(UB)을 수정했습니다. #101253 (Azat Khuzhin).
- 파티션된 Iceberg 테이블에서
ALTER TABLE UPDATE를 연속으로 수행할 때 발생하는Logical error: 'partitions_count > 0'예외를 수정했습니다. #101278 (Desel72). - 큰 정수 상수(예: 256, 2147483648)가 MergeTree 테이블에서 AND와 함께 WHERE 절의 불리언 프레디케이트로 사용될 때 쿼리 결과가 잘못되던 문제를 수정했습니다. 예를 들어
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648는 모든 행과 일치해야 하지만, 이전에는 잘못하여 0을 반환했습니다. #101287 (Groene AI). - 복제된 MergeTree를 사용하는 Delta Lake 클러스터의 insert-select 문제를 수정했습니다. #101299 (Konstantin Vedernikov).
- 스칼라 서브쿼리가 서로 의존하는 구체화된 CTE 체인을 참조할 때 발생하던 “Logical error: Reading from materialized CTE before materialization” 크래시를 수정했습니다. #101305 (Groene AI).
IStorage::getDependentViewsByColumn의storage_id관련 데이터 레이스를 수정했습니다. #101385 (Nikolay Degterinsky).- BACKUP FROM SNAPSHOT AST의 포맷팅 및 클로닝 문제를 수정했습니다. #101405 (Pablo Marcos).
enforce_keeper_component_tracking이 활성화된 상태에서system.part_moves_between_shards를 쿼리할 때 발생하던 LOGICAL_ERROR 충돌 “Current component is empty”를 수정했습니다. #101462 (Groene AI).- 퍼저가 잘못된 Dynamic 타입 AST를 생성할 때
DataTypeDynamic::create()에서 발생하는 세그멘테이션 오류를 수정했습니다. #101464 (Groene AI). - DeltaKernel이 활성화되지 않은 상태에서
delta_lake_snapshot_version또는 CDF 버전 설정을 사용하면, 잘못된 데이터를 조용히 반환하는 대신 오류를 발생시킵니다. #101489 (Desel72). analyzer_compatibility_join_using_top_level_identifier설정이 활성화된 상태에서 ARRAY JOIN과 JOIN USING을 함께 사용할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #101240를 해결했습니다. #101507 (Vladimir Cherkasov).iceberg_metadata_file_path로 테이블을 생성했고 대상 메타데이터 버전이 이미 존재할 때 Iceberg INSERT 재시도 루프가 실패하던 문제를 수정했습니다. #101548 (Groene AI).- 직렬화/역직렬화 불일치를 방지하기 위해 arrayIntersect 및 관련 함수의 결과 컬럼에서 널 허용을 제거합니다. #101569 (George Larionov).
- IcebergLocal 테이블 엔진을 사용하는 materialized view를 SELECT할 때 발생하던 서버 충돌(LOGICAL_ERROR)을 수정했습니다. #101577 (Groene AI).
- NaN 인수로
intExp10을 호출할 때 오류 메시지가 잘못 표시되던 문제를 수정했습니다.intExp10이 아니라intExp2가 표시되고 있었습니다. #101582 (Krishna Chaitanya). - #100288의 리팩터링 이후
allow_statistics=0이ALTER TABLE ADD STATISTICS및ALTER TABLE DROP STATISTICS를 차단하지 못하던 문제를 수정했습니다. #101585 (Krishna Chaitanya). drop_lock_version노드가 없는 25.1 이전의 부분 삭제로 남은 ZooKeeper 노드가 있을 경우,KeeperMapCREATE TABLE이 “테이블 메타데이터를 생성할 수 없습니다” 오류와 함께 실패하던 문제를 수정했습니다. #101623 (Antonio Andelic).- 맵 서브컬럼을 읽는 과정에서 발생할 수 있는 잠재적인 논리 오류를 수정했습니다. #100769를 해결했습니다. #101336를 해결했습니다. #101641 (Pavel Kruglov).
- 잠재적인 충돌을 방지하기 위해
getSubcolumnData에서 prefix 일치보다 정확한 subcolumn 일치가 우선되도록 수정했습니다. #101271을 해결합니다. #101645 (Pavel Kruglov). LowCardinality컬럼을VariantNULL 상수와 비교할 때use_variant_default_implementation_for_comparisons가 비활성화된 경우 발생하던 크래시(LOGICAL_ERROR: “ColumnUnique can’t contain null values”)를 수정했습니다. #101690 (Groene AI).- 내용: Bzip2ReadBuffer에 빈 내부 스트림 처리 가드를 추가하여, 내부 스트림이 비어 있을 때 UNEXPECTED_END_OF_FILE을 발생시키는 대신 EOF를 반환하도록 했습니다. #101691 (ClickGap AI Bot).
- 내용:
system.s3_queue_settings및system.azure_queue_settings의alterable컬럼 설명 텍스트가 뒤바뀌어 있던 문제를 수정했습니다. 실제 코드 동작과 일치하도록0과1의 의미를 서로 바꿨습니다. #101703 (ClickGap AI Bot). - positiveModulo(tuple, number)가 modulo가 아니라 division으로 잘못 디스패치되던 문제를 수정했습니다. #101709 (ClickGap AI Bot).
thread_pool_size가 cache로 감싼 디스크에 설정된 경우 발생하던 충돌을 수정했습니다. 이전에는FileCacheSettings::loadFromConfig()가thread_pool_size를 알 수 없는 설정으로 간주해 거부했기 때문에 서버가 시작되지 못했습니다. 이 설정은 유효한IDisk매개변수로, 백그라운드 part 이동 작업 중 디스크 간 복사 작업에 사용되는 스레드 수를 제어합니다. #101712 (Francisco).RANGE_HASHED딕셔너리를 생성할 때 존재하지 않는MAX범위 속성이 아무 경고 없이 허용되고, 최소 및 최대 범위 속성의 타입이 서로 다를 경우 잘못된 타입 구성이 사용되던 문제를 수정했습니다. 이 버그는buildRangeConfiguration에서 최대 속성을 조회할 때max_attr_name대신min_attr_name을 참조한 복사-붙여넣기 오류로 인해 발생했습니다. #101732 (Yakov Olkhovskiy).- 대기 타이머의 수명이 자신이 참조하는
ProfileEvents::Counters를 가진 worker thread보다 길어질 때 CPU lease scheduler에서 발생하던 use-after-free crash를 수정했습니다. #101761 (Antonio Andelic). - arrayLevenshteinDistanceWeighted 및 arraySimilarity 함수의 버그를 수정했습니다. #101725를 해결했습니다. #101767 (Mikhail f. Shiryaev).
- POST form 본문을 무시하는 Prometheus Query API 문제를 수정했습니다. #101794 (James Cunningham).
- S3
Client::~Client소멸자에서 예외가 전파되어 서버가 종료되던 문제를 수정했습니다. #101798 (Gagan Dhakrey). Object유형 동적 경로의 병렬 역직렬화에서 발생하던 use-after-scope 문제를 수정해, 동적 경로가 많은 테이블을 읽을 때 발생할 수 있던 충돌을 방지했습니다. #101823 (Antonio Andelic).- 특정(기본값이 아닌) 형식 지정 설정에서 formatter
%W를 사용하는 함수formatDateTime의 잘못된 출력이 수정되었습니다. #101847 (Robert Schulze). - 검색 문자열이 디맹글된 심볼 이름의 템플릿 인수 내부에 처음 나타나는 경우
SYSTEM INSTRUMENT ADD에서shouldPatchFunctionfalse negative가 발생하던 문제를 수정. #101885 (Pablo Marcos). - 주기적 갱신 중 ZooKeeper 세션이 만료될 때 UDF 레지스트리가 손실되는 문제를 수정했습니다. 이 문제로 인해 전체 갱신이 성공할 때까지 모든 사용자 정의 함수를 사용할 수 없게 될 수 있었습니다. #101891 (Nikita Fomichev).
AES_256_GCM_SIV에 대한system.codecs설명이AES-128대신AES-256을 표시하도록 수정했습니다. #101917 (Jimmy Aguilar Mena).- JSON 컬럼에 생성된 MinMax 인덱스에서 잘못된 최솟값과 최댓값을 사용해 잘못된 쿼리 결과가 나오던 문제를 수정했습니다. #101700을 해결합니다. #101918 (Pavel Kruglov).
splitByString토크나이저는 이제 빈 구분자 문자열을 허용하지 않습니다. #101928 (Robert Schulze).materialize_skip_indexes_on_merge=false에서 머지 중 텍스트(전문 검색) 인덱스 생성을 억제하지 못하던 문제를 수정했습니다. 이전에는 텍스트가 아닌 스킵 인덱스(minmax, set, bloom_filter)만 억제되었고, 텍스트 인덱스는 계속 생성되어 CPU와 I/O를 낭비했습니다. #101932 (Groene AI).sparseGrams토크나이저가 지정된 최대 길이보다 긴 토큰을 생성하던 문제를 수정했습니다(구현에+2가 하드코딩되어 있었기 때문입니다). #101934 (Elmi Ahmadov).addStreams중 스트림 생성자에서 예외가 발생해column_streams에 null 항목이 남는 경우,MergeTreeDataPartWriterWide::cancel에서 발생하던 SIGSEGV를 수정했습니다. #101936 (Antonio Andelic).query_plan_direct_read_from_text_index가 활성화된 상태에서, 전문 인덱스가 있는 Merge 또는 분산 테이블에 대해has*Tokens와 LIKE가 혼합된 결합 필터 조건으로 쿼리할 때 발생하던 예외를 수정했습니다. #101939 (Jimmy Aguilar Mena).- 잘못된
QueryProcessingStage값이 포함된 네이티브 프로토콜 쿼리 패킷을 파싱할 때 발생할 수 있는 정의되지 않은 동작을 수정했습니다. #101972 (Raúl Marín). - 초기 쿼리 구문 분석 중 예외가 발생하면, 동기화가 어긋난 스트림에서 잘못된 데이터를 읽지 않도록 TCP 연결을 닫습니다. #101989 (Raúl Marín).
- 파일 시스템 캐시 26.1+에서 공간 예약 관련 논리 오류를 일으킬 수 있는 SLRU 경쟁 상태 버그를 수정했습니다. 디버그 빌드에서는 다음과 같은 assertion 실패가 발생할 수도 있습니다:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.. #101991 (Kseniia Sumarokova). - 뒤에 데이터가 남아 있는 문자열을 빈
Tuple()으로 캐스팅할 때 발생하던 예외를 수정했습니다. #102011 (Alexey Milovidov). - ORDER BY와 grace_hash 조인 알고리즘을 사용하는 쿼리에서 행이 잘못된 순서로 정렬되던 문제를 수정했습니다. 영향을 받는 쿼리는 결과를 잘못된 순서로 반환해, 별다른 경고 없이 잘못된 출력이 생성될 수 있었습니다. #102036 (János Benjamin Antal).
max_bytes_in_join설정이 적용된 RIGHT JOIN 및 FULL JOIN 쿼리에서 발생할 수 있던 LOGICAL ERROR(Unexpected size of index type)를 수정했습니다. #102042 (Jimmy Aguilar Mena).- 음수 값을 가진 Time을 DateTime과 비교할 때 잘못된 결과가 반환되던 문제를 수정했습니다. #101670을 해결합니다. #102056 (Yarik Briukhovetskyi).
ZooKeeperRetriesControl이 오래된(만료된) ZooKeeper 세션을 갱신하지 않은 채 재시도하면서 발생하던 UDF 갱신 중 충돌을 수정했습니다. #102059 (Nikita Fomichev).- unlock snapshot을 포맷할 때 누락되던 공백 문제를 수정했습니다. https://github.com/clickhouse/clickhouse/issues/101723 이슈를 해결했습니다. #102063 (Han Fei).
- WHERE 절이 있는 뷰를 쿼리할 때, 내부 쿼리에서 뷰 메타데이터와 타입이 다른 컬럼(예:
join_use_nulls를 사용하는 LEFT JOIN으로 인해 생성된 널 허용(Nullable) 컬럼)이 생성되면 발생하던 크래시(SIGSEGV)를 수정했습니다. #102085 (Miсhael Stetsyuk). - 캐시 키가 일치하지 않아 part 제거 후에도
VectorSimilarityIndexCache항목이 제거되지 않던 문제를 수정했습니다. #102152 (Seva Potapov). - rabbitmq storage 사용 시 손상된 메시지에 NACK를 보냅니다. #102157 (Seva Potapov).
- 잘못된 빈 튜플 문자열을 파싱할 때의 논리 오류를 수정했습니다. #102289 (Nihal Z. Miaji).
- GROUP BY 컬럼의 순서가 테이블의 정렬 키와 다를 때
optimize_aggregation_in_order=1을 사용하면 잘못된 집계 결과(중복된 행)가 발생하던 문제를 수정했습니다. #102299 (Groene AI). - Avro 포맷 사용 시 직렬화 전에
LowCardinality/Nullable래퍼 타입이 해제되지 않아 발생하던IcebergLocalALTER TABLE ... UPDATE크래시를 수정했습니다. #102337 (Desel72). - 표현식이 없는 materialized 컬럼의 뮤테이션에서 발생하던 세그멘테이션 폴트를 수정했습니다. #102185를 해결합니다. #102342 (zoomxi).
- 배열 유형 관련 Coalescing merge tree 문제를 수정했습니다. 이로써 #89509이 해결되었습니다. #102384 (Konstantin Vedernikov).
- 블룸 필터 푸시다운이 활성화되어 있고 WHERE 절에 등호/부등호 조건이 있는 상태에서 Parquet 파일을 읽을 때 발생하던 segfault(또는 디버그 빌드의 LOGICAL_ERROR)를 수정했습니다. 이 충돌은 Parquet 프리페처가 블룸 필터 데이터를 가져오는 과정에서 범위를 벗어난 메모리에 접근해 발생했으며, 비결정적으로 잘못된 쿼리 결과를 반환할 수도 있었습니다. #102385 (Groene AI).
- 하위 큐 간에 공유된 eviction 통계와 실패한 후보에 대한 잘못된 복구 경로로 인해 SLRU 파일 시스템 캐시를 동적으로 크기 조정하는 중 발생하던
LOGICAL_ERROR중단 문제를 수정했습니다. #102396 (Antonio Andelic). - Replicated 데이터베이스에서 대상 테이블이 없는 별칭 테이블이 새 레플리카에서 초기화에 실패하던 문제를 수정했습니다. #101320을 해결합니다. #102397 (Nikolay Degterinsky).
- null byte만으로 이루어진 검색 문자열을 찾을 때 문자열 검색 함수(
countSubstrings,position등)에서 발생하는 범위를 벗어난 읽기를 수정했습니다. #102401 (Raúl Marín). - 풀 텍스트 인덱스 설정(
enable_full_text_index,allow_experimental_full_text_index,use_skip_indexes_on_data_read)은 이제compatibility설정이 26.1보다 이전 버전을 가리키는 경우에도 더 이상 비활성화되지 않습니다. 이전에는 이로 인해SharedDatabaseCatalog가 텍스트 인덱스가 있는 테이블을 생성하지 못할 수 있었습니다. #102422 (Nikita Fomichev). - 끝에
%가 있는printf에서 메모리 범위를 벗어나 읽는 문제를 수정했습니다. #102472 (Raúl Marín). - rewind가 buffer 취소 플래그를 재설정하지 않아 발생하던 AsynchronousMetrics의 디버그 빌드 내 chassert 예외
ReadBuffer is canceled를 수정했습니다. #102524 (Yuri Fedoseev). - 구분자만으로 이루어진 needle(예:
'()','!!!')에 대해, 텍스트 인덱스가 있는 컬럼에서hasToken/hasTokenOrNull이 올바르게 동작하도록 수정되었습니다. 이전에는BAD_ARGUMENTS를 발생시켜야 하는 경우(hasToken) 또는NULL을 반환해야 하는 경우(hasTokenOrNull)에도, 인덱스가 모든 그래뉼을 조용히 건너뛰었습니다. #102544 (Jimmy Aguilar Mena). - Keeper의 대규모 multi 요청에서 발생하는 OOM을 수정했습니다. OpenTelemetry tracing에서는
ZooKeeperRequest객체의 OpenTelemetry 스팬에 대해 무조건 1KiB가 넘는 메모리를 할당했기 때문에, 매우 큰 multi 요청의 경우 추가로 10GiB가 넘는 메모리를 할당하려고 했습니다. 이를 해결하기 위해 이제 shared data를 정적 메모리에 유지하고,ZooKeeperOpentelemetrySpans에서는std::optional대신std::unique_ptr를 사용합니다. #102586 (Miсhael Stetsyuk). - 기존 컬렉션에
CREATE NAMED COLLECTION IF NOT EXISTS를 실행할 때NamedCollection의 CurrentMetric이 부풀려지던 문제와, 시작 시 config 또는 SQL storage에서 로드된 컬렉션에 대해 CurrentMetric이 초기화되지 않던 문제를 수정했습니다. #102507을 해결합니다. #102598 (Pablo Marcos). - 동시 DDL로 인해 로컬 세그먼트가 빈 컬럼을 반환할 경우
getStructureOfRemoteTable에서 발생하는 예외를 수정했습니다. #102604 (Alexey Milovidov). - Shared 데이터베이스에서 동시에 실행되는 여러
CREATE TABLE IF NOT EXISTS쿼리가 동일한S3Queue테이블을 대상으로 할 때 발생하던LOGICAL_ERROR예외를 수정했습니다. #102610 (Nikita Taranov). - WHERE 필터가 적용된 널 허용 컬럼을 읽을 때 네이티브 Parquet V3 리더에서 발생하던 LOGICAL_ERROR 충돌 “Unexpected number of rows in column subchunk”를 수정했습니다. #102628 (Groene AI).
AzureWriteMicrosecondsprofile 이벤트 설명에 “write” 대신 “read”라고 잘못 표기된 문제를 수정했습니다. #102639 (Miсhael Stetsyuk).- 일부 특수한 경우 행 정책에서 ‘Not found column in block’ 예외가 발생하는 버그입니다. #102648 (Yarik Briukhovetskyi).
- config에 정의된 정적 클러스터에 일시적으로 활성 상태인 노드가 없을 때 ClusterDiscovery에서 발생하던 server 예외를 수정했습니다. #102661 (Kseniia Sumarokova).
- 시간대 조정 후 오버플로우가 발생할 때 날짜 데이터 타입을 잘못 추론하던 문제를 수정했습니다. #102601을 해결했습니다. #102674 (Pavel Kruglov).
SYSTEM WAIT VIEW대기 중에 갱신 가능 구체화 뷰가 삭제되면 영원히 멈추는 문제를 수정했습니다. #102681 (Nikolay Degterinsky).- 모든 행에서 ELSE를 반환하던 Dynamic 표현식이 포함된 CASE를 수정했습니다. #102511을 해결합니다. #102684 (Pavel Kruglov).
- binary로 인코딩된 데이터 타입에서 평탄화된 Dynamic 타입 직렬화 문제를 수정했습니다. #101911을 해결합니다. #102692 (Pavel Kruglov).
- format_schema_source=‘query’가 여러 행 결과를 조용히 무시하는 문제를 수정했습니다. #101905를 해결합니다. #102698 (Pavel Kruglov).
- 모든 오류를
1로 매핑하는 대신 SSH 클라이언트를 통해 실제 종료 코드를 보고합니다. #101741을 해결합니다. #102700 (Konstantin Bogdanov). - 동적/사전 정의 쿼리 핸들러에서 HTTP 헤더가 유실되는 문제를 수정했습니다. #101846를 해결합니다. #102706 (Konstantin Bogdanov).
- 축약된 jemalloc heap profile에 Poisson 샘플링 보정을 적용해 jeprof 출력과 일치하도록 했습니다. 이전에는 축약 포맷이 샘플링 확률을 반영하지 않아 실제 메모리 할당 크기를 과소평가했습니다. #102759 (Antonio Andelic).
- 함수
hasPhrase에NULL인수가 전달될 때 발생하던 충돌을 수정했습니다. #102802 (Nikita Taranov). - 재귀적 스키마에 순환하는 심볼릭 타입 참조가 포함된 Avro 파일을 읽을 때 발생하던 서버 충돌(SIGSEGV)을 수정했습니다. 이제 이러한 스키마는 충돌을 일으키는 대신 감지되어 명확한 오류 메시지와 함께 거부됩니다. #102853 (Groene AI).
FunctionVariantAdaptor에서 결과를 캐스팅하는 동안Variant컬럼의 함수가 메모리 한도에 걸리거나 타입 변환 이외의 다른 예외를 만나면 발생하던 서버 충돌(LOGICAL_ERROR assertion)을 수정했습니다. 이제 이 예외는 내부 오류로 잘못 분류되지 않고 올바르게 전파됩니다. #102855 (Groene AI).- 스키마 추론 중
std::length_error가 발생할 때(예: 비정상적으로 큰input_format_msgpack_number_of_columns값이나 손상된 입력 데이터로 인해) 디버그/새니타이저 빌드에서 서버가 충돌하는 문제를 수정했습니다. #102859 (Groene AI). - 복제된 컬럼과 희소 컬럼의 직렬화에서 NULL 표현이 설정(예: format_tsv_null_representation)을 준수하도록 개선했습니다. #102888 (Hechem Selmi).
- #103499에서 백포트됨: socket 계층의 짧은 쓰기를 Poco
BufferedStreamBuf::flushBuffer가 처리하지 못해 S3 요청이 재시도되지 않고ios_base::clear: unspecified iostream_category error오류로 실패하던 문제를 수정했습니다. #102894 (Sema Checherinda). - 경량한 삭제 후, 경량한 삭제 마스크가 있는 모든 파트가 머지되어 사라진 뒤에도
minmax_count_projection및 단순한COUNT(*)최적화가 영구적으로 비활성화된 상태로 남는 문제를 수정했습니다. #102900 (Anton Popov). - LTO로 인해 jemalloc에서 간헐적으로 발생하던 충돌을 수정했습니다. #102913 (Azat Khuzhin).
- 새 분석기에서 행 정책 OR 체인을 IN으로 최적화했습니다. #102915 (Azat Khuzhin).
- 잘못된 정렬로 페이지 캐시가 해제되면서 발생할 수 있는 jemalloc 메타데이터 손상을 수정해, 충돌로 이어질 수 있는 문제를 해결했습니다. #102918 (Azat Khuzhin).
- materialized view가 없는 일반 INSERT는 이제 더 이상 과도한 ConcurrencyControl 슬롯과 스레드(
max_insert_threads대신max_threads)를 요청하지 않으므로, INSERT 처리량이 높은 클러스터에서 CC 슬롯 고갈과 스레드 수 폭증을 방지합니다. #102961 (Sema Checherinda). - 커널 OOM을 방지할 수 있도록 MEMORY_LIMIT_EXCEEDED 예외를 발생시키기 위해 ArrowMemoryPool을 다시 도입했습니다. #102999 (Azat Khuzhin).
CAST로Nullable(DateTime)에 변환할 때cast_string_to_date_time_mode가 무시되던 문제를 수정했습니다. #101840를 해결합니다. #103035 (Pavel Kruglov).- 텍스트 인덱스 직접 읽기 최적화에
ALIAS컬럼 지원이 추가되었습니다. #103037 (Anton Popov). - #103454에 백포트됨: 집계 프로젝션이 쿼리와 일치하고 테이블의 일부 파트에 프로젝션 데이터가 없는 경우(예: 이미 데이터가 있는 테이블에 프로젝션을 추가했지만
MATERIALIZE PROJECTION을 실행하지 않은 경우)SELECT DISTINCT가 불완전한 결과를 아무 경고 없이 반환하던 문제를 수정했습니다. #102951을 닫습니다. #103052 (Nihal Z. Miaji). WHERE x AND toNullable(N)이MergeTree테이블에서N이UInt8보다 큰 정수형(예:256,65535,2147483648또는 임의의 음수 정수)일 때 잘못된 결과를 반환하던 문제를 수정했습니다.splitFilterNodeForAllowedInputs가 축약된AND의Nullable나머지를 불리언으로 변환하는 과정에서NULL0을 사용해, 3값 논리에서 비교 결과가NULL로 평가되면서 filter가 모든 행을 잘못 걸러내고 있었습니다. #103077 (Groene AI).- 인수가 뒤바뀐 순서로 전달될 때(
function_locate_has_mysql_compatible_argument_order = 1인 경우locate(needle, haystack)) 문자열 검색 함수(예:locate,position)의 오류 메시지에 잘못된 인수 유형이 표시되던 문제를 수정했습니다. #103102 (Alex Kuleshov). - failpoint에서 일시 중지된 스레드가 없을 때 disableFailPoint를 호출하면 waitForPause가 무기한 대기 상태에 빠지는 문제를 수정했습니다. #103119 (Shaohua Wang).
- 인증 전 TCP Hello 패킷 문자열의 크기를 64 KB로 제한하고, 전체 핸드셰이크 시간을 제한하는
handshake_timeout_millisecondsserver setting을 추가하여 인증되지 않은 클라이언트가 과도한 메모리를 소비하거나 스레드를 무기한 점유하는 것을 방지합니다. #103284 (Sema Checherinda). - Parquet ColumnIndex 통계에서 String 컬럼의 min_value가 max_value보다 크게 표시되던 문제를 수정했습니다. #103334 (Saurabh Kumar Ojha).
- Native 형식에서 잘못된 평탄화 Dynamic 데이터를 검사합니다. #103392 (Pavel Kruglov).
url테이블 함수에서_time컬럼을 채우도록 했습니다. #103437 (Nikita Taranov).- 사용할 수 없는 경우 SVE 명령어를 사용하던 SVE 감지 문제를 수정했습니다. #103568 (Raúl Marín).
빌드/테스트/패키징 개선
- Libstemmer (Snowball) 종속성은 이제 더 최신 버전인 v3.0.1을 사용합니다. #99256 (Jimmy Aguilar Mena).
- clickhouse-test에서 설정
use_skip_indexes_for_top_k,use_top_k_dynamic_filtering,query_plan_max_limit_for_top_k_optimization를 무작위화했습니다. #91782 (Nikita Fomichev). - 함수의 다양한 속성이 올바른지 확인하는 스트레스 테스트를 구현했습니다. #93543 (Michael Kolupaev).
- 업스트림의 것을 가져오는 대신
llvm-project용 자체 CMake 구성을 제공합니다. #97453 (Konstantin Bogdanov). - 쿼리 최적화 패스의 커버리지를 높이기 위해 테스트 인프라에서 더 많은
optimize_*설정을 무작위화했습니다. #97547 (Alexey Milovidov). - Rust toolchain으로 nightly-2026-03-22를 사용합니다. #98602 (Konstantin Bogdanov).
wasmtimev42.0.1을 사용하도록 변경했습니다. #98603 (Konstantin Bogdanov).llvm-project22.1.1을 사용하도록 변경했습니다. #98882 (Konstantin Bogdanov).- 야간 테스트별 커버리지 파이프라인을 위해
SANITIZE_COVERAGE(사용자 정의 새니타이저 콜백, 심볼 단위 세분화 수준)을 LLVM 소스 기반 커버리지(WITH_COVERAGE,-fprofile-instr-generate -fcoverage-mapping)로 대체합니다. 이제 서버는 시작 시 ELF 섹션에서 자체 커버리지 매핑을 읽고, 새로운SYSTEM SET COVERAGE TEST 'name'명령을 통해 테스트별(file, line_start, line_end)튜플을 수집합니다. 대상 CI 체크의 테스트 선택은 새로운checks_coverage_linesCIDB 테이블에 대한 줄 범위 쿼리를 사용하며, 변경된 diff 줄을 얼마나 많이 커버하는지에 따라 후보 테스트의 순위를 매깁니다. #99513 (Nikita Fomichev). - -O0 빌드 시 발생하는 llvm-libc 링크 오류 수정. #100023 (Zheguang Zhao).
- 구성에
logger.log및logger.errorlog설정이 포함되어 있지 않은 경우(예: 모든 로그 메시지가 STDOUT/STDERR로 출력되도록 설정된 경우) 컨테이너 시작 시 나타나던 두 개의 오류 메시지를 수정했습니다. #100239 (Simon). - macOS builds에서는 Apple의
ld(cctools-port ld64)보다ld64.lld를 우선 사용합니다. cctools-port의 ld64는-ffunction-sections및-dead_strip옵션과 함께 사용할 때 매우 느리므로, 이를 통해 Darwin 링크 시간이 크게 줄어듭니다.ld64.lld를 사용할 수 없으면ld로 대체됩니다. #100275 (Alexey Milovidov). - 디렉터리에 어떤 민감한 정보도 등록되지 않도록 보장하는 테스트(REST + Glue). #100307 (Konstantin Vedernikov).
- 최근 수정된 테스트를 서로 다른 무작위 설정으로 반복 실행합니다. #100385 (Alexey Milovidov).
- CMake에서
#embed파일 의존성을 추적하고, 올바르게 다시 빌드되도록 ccache depend mode를 활성화했습니다. #100411 (Alexey Milovidov). - TPC-H 쿼리에 대한 정확성 검사를 추가했습니다. #100580 (Raufs Dunamalijevs).
aws-sdk-cpp1.11.771을 사용하도록 변경했습니다. #100582 (Konstantin Bogdanov).- 성능 테스트 XML에서 file 속성을 통해 외부 SQL 쿼리 파일과 설정을 참조할 수 있게 했습니다. #100747 (Raufs Dunamalijevs).
LowerUpperImpl.h에 누락된TargetSpecific.hinclude를 추가해-march=x86-64-v4에서 컴파일되도록 수정했습니다. #100932 (Alexey Milovidov).- cxxflags에 —no-default-config를 추가해 Gentoo에서의 빌드 문제를 수정했습니다. #100973 (Isak Ellmer).
utils/auto-bisect/가 추가되었습니다 — 로컬에서 빌드할 필요 없이 사전 구축된 CI 바이너리를 다운로드하고 사용자가 제공한 테스트 스크립트를 실행해 회귀를 처음 발생시킨 커밋을 찾는 셸 기반 이분 탐색 프레임워크입니다. #100989 (Nikita Fomichev).- CMake에서 기본적으로 ThinLTO를 비활성화해 로컬 개발자 빌드에서 더 이상 암묵적으로 활성화되지 않도록 했습니다. CI 릴리스 빌드는
-DENABLE_THINLTO=1를 명시적으로 전달하므로 영향을 받지 않습니다. #101041 (Alexey Milovidov). - 성능 테스트에 TPC-DS SF1 벤치마크를 추가했습니다. #101209 (Raufs Dunamalijevs).
has_lightweight_delete플래그의 수명 주기,optimize_trivial_count_query에서의COUNT(*)정확성,MATERIALIZED/DEFAULT컬럼 무결성,ReplicatedMergeTree플래그 복구, 삭제된 행이 있을 때의read_in_order, 여러 삭제/머지 사이클,_row_exists컬럼 숨김, 다양한 프레디케이트,ALTER DELETE에 대한 RBAC 강제 적용을 다루는 MergeTree 경량 삭제 stateless 테스트를 추가했습니다. #101792 (Nikita Fomichev).- 이제 태그된 릴리스용 Distroless Docker 이미지가 ubuntu 및 alpine 버전으로도 게시됩니다. #101941 (Rahul Nair).
- 이제 스택 트레이스에는 빌드 디렉터리가 포함된 경로(예:
./ci/tmp/fast_build/./src/Common/Exception.cpp) 대신 깔끔한 상대 경로(예:src/Common/Exception.cpp)가 표시됩니다. #102000 (Raúl Marín). - 리포지토리에 커밋된 5 MB 초과 파일을 거부하는 CI 스타일 check를 추가하고, 기존의 정상적인 테스트 데이터는 허용 목록에 포함합니다. 사용되지 않는 14 MB
zookeeper_log.parquet를 제거합니다. #102080 (Raúl Marín). - 컴파일 시간을 줄이기 위해 헤더에서 사용되지 않는
#include지시문 약 400개를 제거했습니다. #102585 (Raúl Marín). wasmtimev43.0.1을 사용하도록 변경했습니다. #102603 (Konstantin Bogdanov).- 3.5.6 버전의
openssl을 사용합니다. #102606 (Konstantin Bogdanov). xz5.8.3을 사용하도록 변경했습니다. #102607 (Konstantin Bogdanov).- distroless Docker image 기반을 Debian 12 (glibc 2.36, OpenSSL 3.0)에서 Debian 13 (glibc 2.41, OpenSSL 3.5)으로 업그레이드하여, 도달 가능한 취약점 기준 CVE 노출 범위를 0건으로 줄였습니다. #101678 (Rahul Nair).
하위 호환되지 않는 변경 사항
- 업그레이드 후 다운그레이드하면 데이터 손실이 발생할 수 있습니다. 데이터 타입 직렬화 버전이 중첩 데이터 타입에도 전파됩니다. 예를 들어, 이전에는 String 직렬화 버전
with_size_stream이 최상위 String 컬럼과 Tuple 요소에만 적용되었습니다. 이제는Array/Map/Variant/JSON/기타와 같은 모든 중첩 타입 내부의 모든 String 타입에도 적용됩니다. 이 동작은 현재 기본적으로 활성화된 MergeTree settingpropagate_types_serialization_versions_to_nested_types로 제어됩니다. 이 변경 이후 새로 생성된 데이터 파트는 이전 버전에서 읽을 수 없지만, 기존 파트는 새 버전에서도 문제없이 읽을 수 있습니다. 업그레이드는 안전하지만 다운그레이드는 안전하지 않습니다. 즉, 26.3으로 업그레이드한 후 롤백해야 한다면 중첩 타입이 있는 컬럼에 26.3이 기록한 데이터는 읽을 수 없게 됩니다! 자세한 내용은 #101429를 참조하십시오. #94859 (Pavel Kruglov). hypothesis스킵 인덱스 유형을 제거합니다. 이는 실용성이 제한적이었던 잘 알려지지 않은 Experimental 기능이었습니다. 이제INDEX ... TYPE hypothesis로 테이블을 생성하면 오류가 발생합니다. #96874 (Alexey Milovidov).- 실험적
detectProgrammingLanguage함수를 제거했습니다. #99567 (Alexey Milovidov). - SQL 표준에 맞도록
NOT연산자 우선순위를 수정했습니다. 이제NOT은IS NULL,BETWEEN,LIKE및 산술 연산자보다 낮은 우선순위로 바인딩됩니다. 예를 들어, 이제NOT (x) IS NULL은(NOT x) IS NULL이 아니라NOT (x IS NULL)로 파싱됩니다. 이 변경으로 인해 이전의 비표준 동작에 의존하던 쿼리 결과가 달라질 수 있습니다. #97680 (Alexey Milovidov). - 일반 프로젝션의 메타데이터를 수정하여 다중 컬럼 정렬 키를 사용하는 프로젝션을 올바르게 인식할 수 있도록 했습니다. #90429를 기반으로 합니다. #91352 (Amos Bird).
- replace_long_file_name_to_hash 설정을 따르지 않던 스킵 인덱스 파일 문제를 수정했습니다. 이 문제로 이름이 긴 인덱스에서 “File name too long” 오류가 발생하고 인덱스 읽기가 깨졌습니다. 이제 스킵 인덱스 파일 이름은 컬럼 파일과 마찬가지로 max_file_name_length를 초과하면 해시 처리됩니다. 이는 하위 호환됩니다(새 서버는 기존 파트를 읽을 수 있음). 하지만 다운그레이드하거나 롤링 업그레이드 중에 이전 서버를 사용하는 경우 이름이 긴 인덱스가 무시될 수 있습니다. #97128 (Raúl Marín).
- async insert가 기본적으로 활성화됩니다. 이제 ClickHouse는 모든 소규모 삽입을 기본적으로 배칭합니다. 이 설정은 compatibility에서 지정됩니다.
compatibility=<version less than 26.2>로 설정하면 기본값은 이전과 같은false가 됩니다. async inserts는 여러 수준에서 끄거나 켤 수 있습니다. 즉, 사용자 profile의 config, session, 쿼리 또는 MergeTree table에서 설정할 수 있습니다. #97590 (Sema Checherinda). mysql_datatypes_support_level의 기본값을 빈 값에서decimal,datetime64,date2Date32로 변경해, 기본적으로 MySQLDATE는Date32에,DECIMAL/NUMERIC은Decimal에, 정밀도가 있는DATETIME/TIMESTAMP는DateTime64에 올바르게 매핑되도록 했습니다. 이전에는 MySQLDATE컬럼이 1970-01-01 이전 날짜를 표현할 수 없는Date에 매핑되어 데이터 손상이 발생했습니다. #97716 (Alexey Milovidov).- regexp는 느리기 때문에
mergeTreeAnalyzeIndexes{,UUID}에서 regexp 대신 파트 이름 배열을 받도록 했습니다 (실험적 기능). #98474 (Azat Khuzhin). - 실행형 UDFs의 기본
stderr_reaction값을throw에서log_last로 변경했습니다. stderr로 경고를 출력하는 UDFs는 이제 종료 코드가 0인 경우 더 이상 실패하지 않습니다. 이제 종료 코드 예외에 stderr 내용도 포함됩니다. #99232 (Xu Jia).
새로운 기능
- MergeTree에서 맵 컬럼에 대한 버킷 기반 직렬화가 추가되었습니다(
map_serialization_version = 'with_buckets'). 키는 hash 기반 버킷으로 분할되므로, 단일 키(m['key'])를 읽을 때 전체 컬럼 대신 하나의 버킷만 읽어도 되어 맵 크기에 따라 단일 키 lookup 속도가 2~49배 향상됩니다. 버킷 수와 버킷팅 전략은 새로운 MergeTree 설정인map_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficient,map_buckets_min_avg_size로 제어할 수 있습니다. #99200 (Pavel Kruglov). - 구체화된 CTE(materialized CTE)를 지원합니다. 쿼리 실행 중 CTE를 한 번만 평가하고 그 결과를 임시 테이블에 저장할 수 있도록 합니다. #53449를 해결했습니다. #94849 (Dmitry Novik).
- 호환성을 위해
NOW와 같은 일부 SQL 표준 함수는 괄호 없이도 사용할 수 있도록 허용합니다. #52102을 해결합니다. #95949 (Aly Kafoury). - 이제 자연 정렬 키 함수는
naturalSortKey(s)로 사용할 수 있습니다. #90322 (Nazarii Piontko). - 이제 JSONExtract 함수에서 네이티브 JSON/Object 입력을 사용할 수 있습니다. #88370을 해결합니다. #96711 (Fisnik Kastrati).
Nullable유형의 쿼리 매개변수가 지정되지 않으면 해당 값은NULL로 간주합니다. #93869 (Vikash Kumar).Replicated데이터베이스용 보조 ZooKeeper를 지원합니다. #95590 (RinChanNOW).- 맵과 마찬가지로 JSON 타입에서 경로의 존재 여부를 확인하는
has함수를 지원합니다. #96927 (DQ). mergeTreeTextIndex(database, table, index)테이블 함수가 추가되어 텍스트 인덱스에서 데이터를 직접 읽을 수 있게 되었습니다. 이 함수는 내부 검사에 사용하거나 텍스트 인덱스 데이터를 기반으로 집계를 수행하는 데 사용할 수 있습니다. #97003 (Anton Popov).table_readonlyMergeTree setting을 추가해 테이블을 읽기 전용으로 표시하고 삽입 및 수정을 방지할 수 있게 했습니다. #97652 (Alexey Milovidov).- 새로운 설정
use_partition_pruning과 별칭use_partition_key가 추가되었습니다. 이를false로 설정하면 파티션 키 기반 파티션 프루닝이 비활성화됩니다. #97888 (Nihal Z. Miaji). - Iceberg 테이블에서
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')를 지원합니다. #97904 (murphy-4o). #99130 <protocols>의 각type=http항목에서 별도의<http_handlers_*>구성 섹션을 가리키는 사용자 지정<handlers>키를 지정할 수 있도록 하여, 포트별로 서로 다른 HTTP 라우팅 규칙을 적용할 수 있게 했습니다. #98414 (Amos Bird).EXPLAIN에pretty=1옵션을 추가해 트리 스타일의 들여쓰기 출력을 제공하고,compact=1로Expression단계를 접어 쿼리 계획을 더 읽기 쉽게 만듭니다. #98500 (Kirill Kopnev).restore_access_entities_with_current_grants서버 설정을 추가했습니다. 이 설정을 활성화하면 백업에서 복원된 사용자/역할에 대한 권한 부여는 복원을 수행하는 사용자가 부여할 수 있는 범위로 제한되며(GRANT CURRENT GRANTS와 동일한 의미),ACCESS_DENIED오류로 실패하지 않습니다. #98795 (pufit).- 유니코드 대소문자 폴딩과 발음 구별 부호 제거를 위한
caseFoldUTF8및removeDiacriticsUTF8함수를 추가했습니다. #98973 (George Larionov). - NFKC 정규화와 대소문자 접기를 결합한 NFKC_Casefold 유니코드 정규화를 지원하는
normalizeUTF8NFKCCasefold문자열 함수를 추가했습니다. #99276 (George Larionov). - 전문 검색 인덱스와
tokens함수에unicode_word토크나이저를 추가했습니다. 이 토크나이저는 유니코드 단어 경계 규칙에 따라 텍스트를 분할합니다. ASCII 단어는 연결 문자(밑줄, 콜론, 점, 작은따옴표)를 포함해 구성되고, 비ASCII 유니코드 문자는 한 글자씩 토큰화됩니다. 참고: 26.3에서는 이 토크나이저를unicode_word라는 이름으로만 사용할 수 있으며, 26.4에서asciiCJK로 이름이 변경되었습니다. #99357 (Amos Bird). skip_unavailable_shards가 활성화된 경우 자동으로 건너뛸 수 있는 세그먼트 수를 제한하는max_skip_unavailable_shards_num및max_skip_unavailable_shards_ratio설정이 추가되었습니다. 사용 불가능한 세그먼트의 수 또는 비율이 구성된 임계값을 초과하면, 조용히 불완전한 결과를 반환하는 대신 예외가 발생합니다. #99369 (Alexey Milovidov).- 이제 하위 쿼리 표현식에서
SOME키워드를 사용할 수 있습니다. 이는ANY와 동일하게 동작합니다. #99842 (Artem Kytkin). - 텍스트 출력 형식에서
FixedString값의 후행 null byte를 제거할 수 있도록output_format_trim_fixed_string설정이 추가되었습니다. #97558 (NeedmeFordev). - FROM 절에서 괄호로 묶은 테이블 JOIN 표현식을 지원합니다. 예:
SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov). - 함수
toDaysInMonth를 구현했습니다. 지정한 날짜가 속한 월의 일수를 반환합니다. #99227 (Vitaly Baranov).
실험적 기능
- WebAssembly 기반 사용자 정의 함수(UDF)에 대한 실험적 지원을 추가했습니다. 이제 사용자 정의 함수 로직을 WebAssembly로 구현해 ClickHouse 내에서 실행할 수 있습니다. Wasmtime 백엔드 지원에 기여한 Alexey Smirnov에게 특별히 감사드립니다. #88747 (Vladimir Cherkasov). 또한 WASM UDF 지원도 점진적으로 개선되었습니다. #99373 (Vasily Chekalkin).
polyglot라이브러리를 사용해 외부 SQL 방언 지원을 추가했습니다. #99496 (Alexey Milovidov).ALP부동소수점 Compression 코덱을 추가했습니다(압축되지 않는 double에 대해서는ALP_rd폴백 없음). #91362 (Nazarii Piontko).JSON컬럼에 대한 실험적 지연 타입 힌트 지원을 추가했습니다.allow_experimental_json_lazy_type_hints로 활성화하면, 타입 힌트만 추가하거나 수정하는ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)는 과거 데이터를 다시 쓰지 않고 메타데이터 전용 작업으로 즉시 완료됩니다. 타입 힌트는 기존 파트에는 쿼리 시점에 적용되고, INSERT 및 백그라운드 머지 중에 구체화됩니다. #97412 (tanner-bruce).- YTsaurus 테이블 엔진의 병렬 읽기를 활성화했습니다. #97343 (MikhailBurdukov).
성능 개선
- 데이터 레이크의 성능을 개선했습니다. 이전 버전에서는 객체 스토리지에서 읽을 때 파이프라인이 처리 스레드 수에 맞게 조정되지 않았습니다. 그 결과 멀티코어 머신에서 성능이 대폭 향상되었습니다(~40배). #99548 (Alexey Milovidov).
- 이제
enable_parallel_replicas와automatic_parallel_replicas_mode의 관계는 다음과 같습니다.enable_parallel_replicas > 0인 경우에만 쿼리에서 병렬 레플리카를 사용할 수 있습니다. 또한automatic_parallel_replicas_mode=1이면, 병렬 레플리카 사용 여부는 이전에 수집된 통계를 바탕으로 계획 단계에서 결정됩니다.automatic_parallel_replicas_mode=0이면, 통계와 무관하게 지원되는 모든 쿼리에서 병렬 레플리카가 사용됩니다. 주목할 만한 예외 중 하나는 병렬 레플리카를 사용하는 분산 insert-select입니다. 이 경우 쿼리는 항상automatic_parallel_replicas_mode=0인 것처럼 실행됩니다. #97517 (Nikita Taranov). - 프레디케이트에 비교 연산자(
=,<,>,!=) 중 하나가 포함되고 파티션 키가 결정적 함수 체인으로 감싸진 경우 파티션 프루닝을 허용합니다(예:PARTITION BY x이고cityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026, 또는toYYYYMM(x) != 2026와 같은 프레디케이트는 모두 프루닝에 파티션 키를 사용합니다). #28800을 해결합니다. #98432 (Nihal Z. Miaji). CAST대상 유형이Nullable이고 변환이 단조적이면 read-in-order 최적화와 프라이머리 키 프루닝을 사용할 수 있도록 합니다. 예를 들어PRIMARY KEY x인 경우 ClickHouse는ORDER BY x::Nullable(UInt64)에 read-in-order 최적화를 사용할 수 있으며,WHERE x::Nullable(UInt64) > 500000와 같은 프레디케이트에는 프라이머리 키 프루닝을 적용할 수 있습니다. #98482 (Nihal Z. Miaji).- 정수형 컬럼을 부동소수점 리터럴과 비교할 때 인덱스 프루닝과 필터 푸시다운을 허용합니다. 예를 들어 이제
WHERE x < 10.5와 같은 프레디케이트는 프루닝에 프라이머리 키를 사용할 수 있으며,prime < 1e9또는number < 1e5와 같은 필터는 무한정 실행을 유발하는 대신primes()및numbers()테이블 함수로 푸시다운됩니다. #85167을 해결합니다. #98516 (Nihal Z. Miaji). - 메타데이터만 읽기 위해 파일을 다시 다운로드할 필요가 없도록 Parquet 메타데이터용 새 SLRU 캐시를 추가하여 읽기 성능을 개선했습니다. #98140 (Grant Holly).
- 옵티마이저 통계를 기반으로 ANTI, SEMI 및 FULL 조인의 좌우를 바꿀 수 있도록 지원합니다. #97498 (Hechem Selmi).
- 대형 Polygon에서
pointInPolygon의 그래뉼 스키핑을 최적화하고, 기본 키(primary key) 프루닝 중pointInPolygon인덱스 분석이 예외를 발생시키던 문제를 수정했습니다. #91633 (Nihal Z. Miaji). levenshteinDistance함수의 성능이 개선되었습니다. #94543 (Joanna Hulboj).- 요소별 함수 호출을 피하여 배치 decimal 유형 변환을 최적화했습니다. #95923 (Konstantin Bogdanov).
- 이제 Iceberg 테이블은
iceberg_metadata_async_prefetch_period_ms테이블 설정을 통해 비동기 메타데이터 프리페치를 지원하며, 이 설정은 메타데이터 캐시를 주기적으로 미리 채웁니다. 또한iceberg_metadata_staleness_ms쿼리 설정을 사용하면 지정된 staleness 기준보다 최신인 캐시된 메타데이터를 SELECT 쿼리에서 사용할 수 있으므로, 요청 처리 중 Iceberg 카탈로그를 호출할 필요가 없어집니다. #96191 (Arsen Muk). S3Queueordered 모드는 전체 prefix 이력을 다시 나열하지 않도록 S3 ListObjectsV2 StartAfter를 사용해 ListObjects 호출을 줄입니다. #96370 (Venkata Vineel ).- 삽입 중복 제거 시 메모리 사용량 감소. 일반적으로 중복 제거를 위해서는 원본 block이 필요하지만, 동기 삽입에서는 이를 생략해 메모리를 크게 절약할 수 있게 되었습니다. #96661 (Sema Checherinda).
- 하드코딩된 64 대신 cache line 크기에는 아키텍처별 값을 사용합니다. #97357 (Nikita Taranov).
- 텍스트 인덱스 딕셔너리 읽기를 소폭 최적화해 텍스트 인덱스 분석의 전반적인 성능을 개선했습니다. #97519 (Anton Popov).
- ARM에서 16바이트 블록의
LZ4압축 해제 속도를 개선했습니다. #97774 (Raúl Marín). - 기존 iterator 스타일 API를 대체해 SIMD 및 상태 유지형 토크나이저를 지원하는 새로운 고성능 인터페이스로 토큰화를 리팩터링했습니다. #90268의 일부입니다. #97871 (Amos Bird).
- 인덱스된 컬럼과 인덱스되지 않은 컬럼이 함께 포함된 결합 조건이 있는 쿼리에서 텍스트 인덱스 분석 성능이 개선되었습니다. 이전에는 이런 경우 인덱스 분석 중 조기 종료 최적화가 잘못 비활성화되었습니다. #98096 (Anton Popov).
- 매우 긴 배열이나 맵을 생성하는 상수 표현식이 포함된 쿼리의 성능이 개선되었습니다. #98287 (Alexey Milovidov).
- 정수 상수와 비교할 때의
DateTime64기본 키(primary key) 키 조건 분석을 수정해, 이전에는 전혀 이루어지지 않던 granule 프루닝이 가능해졌습니다. #98410 (Amos Bird). - 설정
optimize_syntax_fuse_functions은 기본적으로 활성화되어 있습니다. #98424 (Alexey Milovidov). - 로컬 누산기를 사용하고 각 행마다 집계 상태를 거치는 store-forwarding 대신
avgWeighted집계 함수를 최적화하여, 널 허용 입력에서 성능을 최대 27%까지 향상했습니다. #98793 (Antonio Andelic). - 특정 시나리오에서 병렬 윈도우 함수의 성능을 높이고 메모리 사용량을 줄이며, 대규모 배열을 사용하는
arrayFold워크로드의 성능도 개선합니다. 또한 해당 쿼리에서 페이지 폴트로 인한 부담을 줄이고, 메모리 제한이 엄격한 환경에서 안정성을 높일 수 있습니다. #98892 (filimonov). - 정렬 머지 성능을 개선했습니다. #99013 (Artem Zuikov).
INTERSECT ALL및EXCEPT ALL을 최적화했습니다. #99097 (Raufs Dunamalijevs).- 역순 읽기에서도
read_in_order_use_virtual_row최적화를 지원합니다. #99198 (Vladimir Cherkasov). - 쓰기 전에 JoinUsedFlags 설정 여부를 확인해
RIGHT및FULLJOIN의 캐시 경합을 줄였습니다. #99274 (Hechem Selmi). - 부동소수점 연산을 순수한 정수 산술로 대체해
PrefetchingHelper::calcPrefetchLookAhead를 최적화하고, 명령어 캐시 배치를 개선하며 집계 루프 중 사이클 오버헤드를 줄였습니다. #99327 (Riyane El Qoqui). - 노드의 자식 저장에
absl::flat_hash_set대신CompactChildrenSet를 사용해 Keeper의 메모리 사용량을 줄였습니다. 새 컨테이너는 힙 할당 없이 0~1개의 자식을 인라인으로 저장할 수 있으며, 이는 대부분의 Keeper 노드에 해당합니다. 이로써KeeperMemNode의 크기가 144바이트에서 128바이트로 줄어듭니다. #99860 (Antonio Andelic). - 이제 집계 프로젝션이 뷰에서 올바르게 지원됩니다. #32753를 수정했습니다. #88798 (Amos Bird).
join_use_nulls와 함께 OUTER join을 INNER join으로 변환하는 최적화를 지원합니다. #90978를 해결했습니다. #95968 (Vladimir Cherkasov).- 읽기 전에 크기를 정확히 계산하도록 개선해 서브컬럼 읽기 성능을 높였습니다. 이를 통해 메모리 사용량을 줄이고 서브컬럼 읽기 속도를 향상했습니다. #96251 (Pavel Kruglov).
- 수명이 짧은 메모리 할당, 즉 쿼리 및 요청용 할당이 캐시용 장수명 할당과 섞일 때 발생하는 메모리 단편화를 방지할 수 있도록, mark 캐시, 비압축 캐시, 페이지 캐시가 각각 별도의 jemalloc arena를 사용하도록 했습니다. #96812 (Seva Potapov). #98812. #99021
DELETE TTL규칙이 적용된 테이블에서도 이제 수직 병합 알고리즘을 사용할 수 있습니다. #97332 (murphy-4o).- 분산 인덱스 분석 시 데이터 스키핑 인덱스를 적용합니다. #97767 (Azat Khuzhin).
prewarm_mark_cache설정이 활성화되면 이제 보조 인덱스의 마크도 예열됩니다(data part를 fetch할 때와 테이블 시작 시 인덱스 마크 캐시에 로드됨). #97772 (Anton Popov).- 접근 제어 시 잠금을 줄였습니다. #97894 (Nikita Taranov).
- apply_row_policy_after_final 또는 apply_prewhere_after_final이 활성화되면, 이제 행 정책과 PREWHERE의 복합 AND 조건을 분해해 프라이머리 키 인덱스 분석에 사용할 정렬 키 원자를 추출합니다. 이전에는 지연된 필터에 정렬 키 프레디케이트와 비정렬 키 프레디케이트가 섞여 있으면(예: x > 1 AND y != ‘foo’), 전체 표현식이 인덱스 분석 대상에서 제외되었습니다. 이제는 중첩된 AND 표현식에서도 정렬 키 원자(예: x > 1)를 추출해 granule 프루닝에 활용합니다. #98513 (Yarik Briukhovetskyi).
- 락을 획득하지 않고도 작업 리소스가 해제되도록 변경해 MergeTreeBackgroundExecutor의 락 경합을 줄였습니다. #93620을 해결합니다. #98604 (Dmitry Novik).
- ArrowStream 리더가 처음 몇 바이트를 매우 큰 메타데이터 길이로 잘못 해석해 발생하던, Arrow가 아닌 데이터를 읽을 때(예: 명시적 포맷 없이
url또는file에서 읽는 JSON) 포맷 자동 감지 과정의 과도한 메모리 사용량(~514 MiB) 문제를 수정했습니다. #98893 (Konstantin Bogdanov).
개선 사항
- 동일한 컬럼에 서로 다른 Geo 유형이 포함된 GeoParquet 파일도 파싱할 수 있게 되었습니다. #97851 (Mark Needham).
- 와일드카드 의미를 유지한 채 LIKE 패턴을 토큰화하는
tokensForLikePatternSQL 함수를 도입했습니다.%와_는 와일드카드로 처리되고, 이스케이프된 와일드카드(\%,\_)는 리터럴로 처리되며, 이스케이프되지 않은 와일드카드에 인접한 토큰은 제외됩니다. #97872 (Amos Bird). - S3 테이블 엔진에
{_schema_hash}플레이스홀더를 추가하여 테이블의 컬럼 정의 해시가 S3 경로에 삽입되도록 했습니다. #98265 (Miсhael Stetsyuk). SymbolIndex,addressToSymbol,system.symbols,buildId는 이제 Mach-O 심볼 테이블을 파싱해 macOS에서도 작동합니다. #99014 (Alexey Milovidov).- 이제
system.stack_trace테이블이 macOS에서도 작동하여 모든 서버 스레드의 스택 트레이스를 내부 검사할 수 있습니다. #98982 (Alexey Milovidov). - LDAP 클라이언트가 referral을 따라갈지 여부를 제어할 수 있도록 server별 LDAP 구성 옵션
<follow_referrals>(기본값false)이 추가되었습니다. referral 추적을 비활성화하면 Active Directory domain-root base DN에서 검색할 때 발생하는 timeout과 멈춤 현상을 방지할 수 있습니다. referral 관련 log messages는warn에서trace로 변경되었습니다. #96765 (paf91). - 이제 쿼리 실행 중 사용된 모든 데이터 스키핑 인덱스를
query_log테이블의skip_indices라는 새 컬럼에 기록합니다. #78676을 수정했습니다. 원 작성자는 @pheepa입니다. #87862 (Grant Holly). - ACCESS_DENIED 힌트는 이제 사용자가 필요한 모든 컬럼을 볼 수 있는 경우가 아니면 컬럼 이름을 더 이상 노출하지 않으며, 데이터베이스/테이블 이름은 계속 힌트에 표시됩니다. #91067 (filimonov).
- 머지 부하가 큰 상황에서도 정리가 지연되지 않도록 MergeTree에 전용 정리 thread를 추가했습니다. 이로써 #86181이 해결되었습니다. #91574 (Amos Bird).
- 임의의 호스트의 IP가 아니라 로컬 서버(server)의 호스트명에 대한 IP가 변경된 경우에만 클러스터 설정을 다시 로드합니다. #81215, #70156, #65268를 수정했습니다. #93726 (Zhigao Hong).
- optimize_aggregators_of_group_by_keys가 GROUPING SETS 쿼리에서 집계 함수를 제대로 최적화할 수 있도록 개선했습니다. #93935 (Xiaozhe Yu).
- Keeper-bench: 메트릭에 오류를 보고하고 —input-request-log 모드용 JSON 메트릭 파일을 생성합니다. #95748 (Mohammad Lareb Zafar).
- CREATE USER에 ROLE 절이 새로 추가되었습니다. #97074 (Vitaly Baranov).
- 이제 복제된 데이터베이스로 생성된 클러스터에서 internal_replication 설정을 지정할 수 있습니다. #97228 (Pervakov Grigorii).
- 새로운 설정
allow_nullable_tuple_in_extracted_subcolumns은Tuple,Variant,Dynamic,JSON에서 추출한Tuple(...)서브컬럼을Nullable(Tuple(...))(누락된 행에는NULL)로 반환할지, 또는Tuple(...)(누락된 행에는 기본Tuple값)로 반환할지를 제어합니다. 이 설정은 기본적으로 비활성화되어 있으며, 변경하려면 서버를 재시작해야 합니다. #97299 (Nihal Z. Miaji). - EXPLAIN 쿼리 출력에 deferred filter 정보를 별도 항목으로 추가했습니다(Row Policies/PREWHERE와 함께 FINAL을 사용할 때). 관련: #91065. #97374 (Yarik Briukhovetskyi).
- 기본적으로
type_json_allow_duplicated_key_with_literal_and_nested_object를 활성화합니다. 이를 통해 원본 JSON 데이터{"a" : 42, "a.b" : 42}를 ClickHouse가{"a" : 42, "a" : {"b" : 42}}와 같은 JSON으로 포맷할 때 발생할 수 있는, 파싱 중 중복 키 관련 오류를 피할 수 있습니다. #97423 (Pavel Kruglov). - Keeper 개선:
find_super_nodes는 Keeper에서 노드 수가 예상치 않게 증가하는 문제를 디버깅할 때 매우 유용한 명령입니다. 하지만 super node가 여러 개 있으면, 명령이 처음 발견한 super node의 하위 노드를 영원히 순회하느라 둘 이상을 찾는 것이 거의 불가능합니다. 이 PR은 super node의 하위 노드를 순회하지 않도록 합니다. #97819 (pufit). clickhouse-keeper-client에 초기 자동 완성 기능이 추가되었습니다. #97828 (Konstantin Bogdanov).- 충돌이 발생할 경우 비동기 로깅 버퍼를 플러시합니다. #97836 (Azat Khuzhin).
- 기본값으로 impersonate 기능을 활성화합니다(EXECUTE AS target_user 참조). #97870 (Vitaly Baranov).
- SQLite 테이블 엔진에서 KILL QUERY와 clickhouse-client의 쿼리 취소(Ctrl+C)를 통한 쿼리 취소 기능이 개선되었습니다. #97944 (Roman Vasin).
- jemalloc의
lg_prof_sample을 제어하는 서버 설정jemalloc_profiler_sampling_rate를 추가하고, 이를jemalloc.prof.lg_sample비동기 메트릭으로 노출했습니다. #97945 (Antonio Andelic). - 동시 실행이 가능한 크기 제한 큐 구현에서 가중치를 지원합니다. #97962 (Daniil Ivanik).
- PostgreSQL 딕셔너리 소스에서 허용되는 키에 sslmode를 추가했습니다. 이전에는 PostgreSQLDictionarySource.cpp의 dictionary_allowed_keys 허용 목록에 sslmode가 포함되어 있지 않아 PostgreSQL 딕셔너리 연결의 SSL 모드를 설정할 수 없었습니다. 그 결과, 딕셔너리가 SSL을 요구하는 PostgreSQL 서버(예: 기본적으로 SSL을 강제하는 AWS RDS)에 연결할 수 없었습니다. 연결 시 TLS 협상이 실패하고, 서버가 암호화되지 않은 폴백 연결을 거부했기 때문입니다. #98014 (mcalfin).
- 혼란을 주는 일반적인 메시지 대신, 존재하지 않는 파일 경로를
clickhouse또는clickhouse-local에 전달할 때 명확한 “해당 파일이 없습니다” 오류를 표시합니다. #98048 (Raúl Marín). - 이제
Nullable([Fixed]String)및Array(Nullable([Fixed]String))컬럼에서도 텍스트 인덱스를 생성할 수 있습니다. #98118 (Jimmy Aguilar Mena). - 딕셔너리 소스가 의존하는 이름이 지정된 컬렉션이 삭제되지 않도록 했습니다. #98127 (Pablo Marcos).
- 합계가 포함된 쿼리에
grace_hash조인 알고리즘을 활성화했습니다. #98144 (János Benjamin Antal). - 일반 shared merge tree의 DROP DATABASE 시 백그라운드 머지를 조기에 취소합니다. #98161 (Shaohua Wang).
- clickhouse-client에서 KILL QUERY 및 cancel query(Ctrl+C)를 사용한 MongoDB와 MySQL 쿼리 취소를 개선했습니다. #98187 (Roman Vasin).
- NetlinkMetricsProvider를 제거하고, 스레드별 taskstats 메트릭 수집에는 procfs만 사용합니다. Netlink 기반 수집은 컨테이너 환경에서 문제가 있고, 경합 시 꼬리 지연 시간이 더 나빠집니다. #98229 (Amos Bird).
- manifest 파일 캐싱 문제를 해결하기 위해 Iceberg manifest 파일 처리 로직을 리팩터링했습니다. #98231 (Daniil Ivanik).
- 이제 테이블의 정렬 키가
toDate(time)와 같은 표현식일 수 있는 경우도 고려하며, 이러한 표현식이 filter의 일부인 경우에는 표현식 지연을 하지 않도록 판단할 수 있습니다. #98237 (Yarik Briukhovetskyi). - ZooKeeper의 임시 잠금 znode에 할당된 최대 순차 번호를 나타내는 새
MaxAllocatedEphemeralLockSequentialNumber메트릭을 추가했습니다. #98243 (Miсhael Stetsyuk). - ClickStack를 버전 2.20.0으로 업데이트합니다. #98252 (Aaron Knudtson).
- 다중 요청 내 각 하위 요청을 개별 요청으로 집계하는 새로운 profile event
KeeperRequestTotalWithSubrequests가 추가되어, 실제 Keeper 작업 부하를 더 잘 파악할 수 있게 되었습니다. 기존KeeperRequestTotal이벤트는 계속해서 각 다중 요청을 단일 요청으로 집계합니다. #98348 (Antonio Andelic). SYSTEM RELOAD DICTIONARIES는 이제 사전을 위상 정렬 순서대로 다시 로드하므로, 다른 사전을 소스로 사용하는 사전에서도 다시 로드 후 최신 데이터를 반영해 볼 수 있습니다. #98356 (Alexey Milovidov).- MergeTree 설정을 변경한 후 통계 캐시를 재시작합니다. #98520 (Han Fei).
- 연결할 수 있는 “alive” 레플리카만 분산 인덱스 분석에 참여합니다. #98521 (Azat Khuzhin).
- SQL로 정의된 사용자에 대해 구성 파일에 정의된 설정 프로필(
default프로필 제외)의 사용을 금지하는 설정access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users이 추가되었습니다(기본적으로 disabled/allowed). #98662 (Alexander Tokmakov). - 자동 병렬 레플리카 휴리스틱에서 사용하는 노드 수의 상한을,
max_parallel_replicas설정만 기준으로 삼는 대신 클러스터의 실제 노드 수에 맞춰 제한합니다. #98668 (Nikita Taranov). - 분산 인덱스 분석을 위해 헤지 요청과 비동기 읽기를 구현했습니다. #98724 (Azat Khuzhin).
- 바이너리
AggregateFunction상태의 역직렬화는 이제 입력 전체를 끝까지 소비해야 합니다. 불필요한 후행 바이트가 추가로 있으면 ClickHouse는 잘못된 형식의 상태 데이터를 허용하지 않고 예외를 발생시킵니다. #98786 (Nihal Z. Miaji). - TRUNCATE DATABASE가 쿼리 취소에 반응하도록 했습니다. #98828 (Shaohua Wang).
- 요청 파이프라이닝, 워밍업 기간, 연산별 통계, 재현 가능한 시드, 더 나은 오류 처리를 추가하여
keeper-bench를 개선했습니다. #98906 (Antonio Andelic). - 분산 인덱스 분석에서 SAMPLE 절을 사용할 수 있도록 지원합니다. #98931 (Azat Khuzhin).
- 쿼리가 빈 결과를 반환하거나 오류가 발생해도 대시보드에 차트 제목이 표시되도록 개선했습니다. #98975 (Yash ).
- 분석기 오류 메시지에서 더 이상 테이블의 모든 컬럼을 한꺼번에 출력하지 않습니다(이로 인해 150KB가 넘는 예외가 발생할 수 있었습니다). 이제 컬럼 목록은 최대 10개 항목까지만 표시됩니다. #99002 (Yash ).
- 조인이 포함된 하위 쿼리의 컬럼 통계를 올바르게 반환해, 상위 쿼리에서 이를 조인 재정렬에 활용할 수 있도록 했습니다. #99096 (Alexander Gololobov).
- send 스레드가 종료될 때까지 기다리지 않고, 종료 처리가 시작되면 즉시 ZooKeeper 세션을 만료된 상태로 표시합니다. 이렇게 하면 다른 스레드가 지체 없이 새 세션을 설정할 수 있습니다. #99102 (Raúl Marín).
- LLVM-libc의 수학 함수
exp,exp2,expm1,fabs,fabsl,floor,fmodl,log,log2,logf,pow,scalbn,scalbnl,copysignl,nan,nanf,nanl과explogxf공유 상수를 더 폭넓게 사용합니다. #99118 (Konstantin Bogdanov). - 메모리 사용량을 줄이고
system.jemalloc_profile_textcollapsed 포맷의 잠재적인 중복 출력 문제를 수정합니다. #99121 (Antonio Andelic). system.aggregated_zookeeper_log에is_subrequest컬럼을 추가하여 독립형 요청과 Multi/MultiRead 요청 내 하위 요청을 구분할 수 있게 했습니다. 이전에는 하위 요청이 독립형 요청과 동일한 버킷에 집계되었고, 각 하위 작업이 전체 multi-request 기간으로 기록되었기 때문에 평균 지연 시간이 오해를 불러일으킬 수 있었습니다. 이제 하위 요청의 지연 시간은 0입니다. #99169 (Miсhael Stetsyuk).- 컬럼 타입을 지정하지 않아도
ALTER TABLE MODIFY COLUMN x TTL ...명령을 허용합니다. #99208 (Nikolay Degterinsky). - 이미 연결이 끊어진 세션에 대한 오래된 Keeper 요청은 건너뛰어 불필요한 Raft 왕복을 방지합니다. 추적되는 종료된 세션 수는
max_finished_sessions_cache_sizecoordination 설정으로 제한됩니다. #99246 (Antonio Andelic). IN연산자에서mapValues(map)기반 텍스트 인덱스를 지원합니다. #99286 (Anton Popov).- clickhouse keeper-client에서 셸과 유사한 자동 완성을 지원합니다(따옴표로 묶인 인수의 자동 완성 처리, 예:
'foo ba', 이스케이프된 인수 처리, 예:foo\ ba, 공백이 있는 노드는ls에서 따옴표로 묶어 출력). #99312 (Azat Khuzhin). - 잠금 경합으로 인해 Keeper
mntr명령이 중단되는 문제를 방지합니다. #99472 (Antonio Andelic). - 콜백 호출과 읽기 요청 디스패치를 뮤텍스 범위 밖에서 수행하여 Keeper 디스패처의 락 경합을 줄이고, 관측성을 위해 프로파일링된 락 가드를 추가했습니다. #99751 (Antonio Andelic).
- Parquet 파일의 마지막 블록 끝에 패딩이 누락되어 있어도 허용합니다. #99857 (Seva Potapov).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- 정규화된 전체 이름으로 지정되지 않은 경우 Alias 테이블의 대상이 DDL 종속성으로 저장되는 방식을 수정했습니다. 이제 세션 데이터베이스 대신 Alias 테이블의 데이터베이스에 저장됩니다. #95175 (Enric Calabuig).
- ALIAS 컬럼의 서브컬럼을 읽는 중 잘못된 결과가 반환되거나 예외가 발생하는 문제를 수정했습니다. #95408 (Pavel Kruglov).
- 이전 분석기에서 JOIN에 비표준 식별자 별칭을 사용할 때 발생하던 컬럼 누락 문제를 수정합니다. #25594, #47288, #53263를 해결합니다. #95679 (Zhigao Hong).
- 인수가 비어 있을 때 Kusto 방언 함수
bin(),bin_at(),extract(),indexof()에서 발생하던 충돌을 수정합니다. #95736 (NeedmeFordev). - clickhouse-client에서 user_files_path 이외의 위치에는 local_object_storage(로컬 파일 시스템 기반 datalake와 LocalDisk에서 사용될 수 있음)를 마운트할 수 없도록 합니다. #96201 (Daniil Ivanik).
DeltaLake테이블 엔진에서 스냅샷 버전 변경 시 발생하는 논리적 경쟁 상태를 수정하고, 불필요하게 비용이 큰 스냅샷 재로드를 제거했습니다. #96226 (Kseniia Sumarokova).- DETACH와 ATTACH 사이에 part 이름이 여러 차례 연속으로 변경된 경우, MergeTree에서 part를 ATTACH할 때 발생하던 논리 오류를 수정했습니다. #96351 (Alexey Milovidov).
- 동일한 요청에서
compatibility와 함께 전송된 명시적 설정의 값이 서버 기본값과 같을 경우, 해당 설정이 별다른 표시 없이 무시될 수 있던 버그를 수정했습니다. #97078 (Raufs Dunamalijevs). - 병렬 파싱이 적용된 INSERT에서 잘못된 데이터를 만나면 클라이언트가 실제 파싱 오류(정확한 행 번호 포함) 대신
NETWORK_ERROR를 보고하던 문제를 수정했습니다. #97339 (Alexey Milovidov). Nullable(Tuple)도입 이후sumCount집계 함수가 기존에 직렬화된 상태를 읽지 못하던 문제를 수정했습니다. #97370을 해결합니다. #97502 (Nihal Z. Miaji).Nothing타입 요소(예:NULL튜플 요소와 비교하는 경우)가 포함된 튜플 비교를GROUPING SETS및ORDER BY와 함께 사용할 때 발생하던 예외를 수정했습니다. #97509 (Alexey Milovidov).- 여러 압축 코덱을 사용할 때 Compact MergeTree 파트에서 비결정적으로 계산되던
uncompressed_hash를 수정하여, 잘못된 중복 제거 동작이 발생할 수 있던 문제를 해결했습니다. #97522 (Alexey Milovidov). - shared data의 버킷 및 JSON을 사용하는 INSERT SELECT에서 누락된 스트림 관련 논리 오류를 수정했습니다. #97331을 해결합니다. #97523 (Pavel Kruglov).
- SummingMergeTree 및 CoalescingMergeTree 머지 중
MEMORY_LIMIT_EXCEEDED예외가CORRUPTED_DATA로 잘못 보고되는 문제를 수정했습니다. #97537 (János Benjamin Antal). url()과 같은 테이블 함수를 포함한 상관 서브쿼리에서 발생하는 “Context has expired” 예외를 수정했습니다. #97544 (Alexey Milovidov).optimize_syntax_fuse_functions에서 집계 프로젝션, Date 타입, 컬럼 이름 보존과 관련된 예외 및 비정상 동작을 수정했습니다. #97545 (Alexey Milovidov).- 정규식이 일치하지 않을 때 잘못된 결과를 내던
replaceRegexpOne→extract쿼리 재작성을 제거하고,replaceRegexpOne을GROUP BY ... WITH CUBE및group_by_use_nulls=1과 함께 사용할 때 발생하던 예외도 수정했습니다. #97546 (Alexey Milovidov). DROP DATABASE에서 쿼리가 강제 종료될 때database_atomic_wait_for_drop_and_detach_synchronously가 무기한 멈추는 문제를 수정했습니다. #97586 (Alexey Milovidov).KILL QUERY가WITH FILL생성 과정,dictGet을 통한 딕셔너리 로딩, 또는ReplicatedMergeTree에서mutations_sync=1로 실행되는ALTER DELETE에 멈춰 있는 쿼리를 종료하지 못하던 문제를 수정했습니다. #97589 (Alexey Milovidov).loop테이블 함수는 행 정책, 컬럼 수준 권한, 기타 보안 검사가 적용되는 인터프리터 계층을 거치지 않고inner_storage->read()를 직접 호출하고 있었습니다. 이로 인해 행 정책으로 제한된 사용자도 직접 SELECT에서는 행이 전혀 반환되지 않더라도loop(table)를 통해 모든 행을 읽을 수 있었습니다. #97682 (pufit).toDate()함수를 사용할 때 epoch 이전 DateTime64에서 발생하던 잘못된 파티션 프루닝을 수정했습니다. #97746 (Yarik Briukhovetskyi).- 이 패치 이후에는 데이터 파트 집합에 더 높은 파티션 ID를 가진 다른 파티션이 존재할 경우
hasPartitionId가 false를 반환합니다. #97748 (Mikhail Artemenko). - JSON의 고급 shared data에서 빈 그래뉼을 읽을 때 발생할 수 있는 충돌을 수정했습니다. #97563을 해결했습니다. #97778 (Pavel Kruglov).
DROP와INSERT사이의 경합 상태로 인해Distributed에INSERT할 때 발생하던Cannot schedule a fileLOGICAL_ERROR를 수정했습니다. #97822 (Azat Khuzhin).tokenbf_v1스킵 인덱스와 함께mapContainsKey/mapContainsKeyLike를 호출할 때 발생하던 ClickHouse 서버 크래시/assert 문제를 수정했습니다. #97826 (Shankar Iyer).- 복합 타입(
Variant,Dynamic,Tuple) 내부의LowCardinality로 인해concatWithSeparator,format,IN서브쿼리,GLOBAL IN, 런타임 필터가 적용된 조인에서 발생하던 LOGICAL_ERROR 예외를 수정했습니다. #97831 (Raúl Marín). GROUP BY와 함께 여러 분산 테이블에 결합된merge()테이블 함수에서ARRAY JOIN을 사용할 때 발생하던LOGICAL_ERROR예외Chunk info was not set for chunk in MergingAggregatedTransform를 수정했습니다. #97838 (Raúl Marín).- 높은 동시성에서 연결 그룹의 하드 제한에 도달할 경우, HTTP 연결 풀 소멸자에서 포착되지 않은 예외로 인해 서버가 크래시(
std::terminate)하던 문제를 수정했습니다. 연결을 풀로 다시 반환하는 과정에서HTTP_CONNECTION_LIMIT_REACHED예외가~PooledConnection밖으로 전파되어SIGABRT로 이어질 수 있었습니다. #97850 (Antonio Andelic). grace_hash알고리즘을 비등가 조인과 함께 사용할 때, 조인 결과의 크기 제약으로 인해 왼쪽 블록을 끝까지 처리하지 못하는 경우 잘못된 결과가 반환되던 문제를 수정했습니다. #97866 (János Benjamin Antal).- #96686에서 도입된 DeltaLake 메타데이터 스캔의 성능 저하 문제를 수정했습니다. #97880 (Kseniia Sumarokova).
- ZooKeeper 클라이언트에서 sendThread와 receiveThread 사이의 데이터 레이스를 수정했습니다. #97887 (Pablo Marcos).
- 분산 INSERT SELECT에서 CTE를 사용할 수 없던 버그를 수정했습니다. https://github.com/ClickHouse/ClickHouse/pull/87789의 후속 작업입니다. #95837을 해결합니다. #97889 (Yarik Briukhovetskyi).
CachedOnDiskReadBufferFromFile::readBigAt에서 발생하는 예외를 수정했습니다. #97325를 해결합니다. #97890 (Kseniia Sumarokova).- 컬럼 불일치로 인해
Alias엔진에서 materialized 컬럼 사용 시 발생하던LOGICAL_ERROR예외를 수정했습니다. #97907을 해결합니다. #97921 (Kai Zhu). - 로그 저장소에
s3_plain메타데이터를 사용하면서 Azure Blob Storage를 사용할 때, 재시작 후 Keeper 데이터가 손실되던 문제를 수정했습니다. #97987 (Antonio Andelic). Int8보다 큰 정수 타입에서sign함수의 JIT 오컴파일을 수정했습니다. -128..127 범위를 벗어나는 값에서 잘못된 부호가 반환될 수 있었습니다. #98012 (Alexey Milovidov).- 이름에 점이 포함된 struct 필드(예:
STRUCT<`a.foo`: STRING, `b.foo`: STRING>)가 있는 상태에서 컬럼 매핑 “name” 모드를 사용하는 Delta Lake 테이블을 읽을 때 발생하던DUPLICATE_COLUMN예외와, 경고 없이 NULL이 반환되던 문제가 수정되었습니다. #98013 (Caio Ishizaka Costa). - 경량 업데이트 및 보조 인덱스 이후의 mutation 문제를 수정했습니다. #98044 (Raúl Marín).
- 기본 키(primary key) 기반 스킵 인덱스와 비기본 키 스킵 인덱스를 함께 사용할 때 FINAL 쿼리 결과가 잘못되던 문제를 수정했습니다. #98097 (Raúl Marín).
- 스칼라
file()및DESCRIBE TABLE file()에READ ON FILE검사를 적용합니다. #98115 (Nikolay Degterinsky). - glob pattern(예:
file('dir/**', 'LineAsString'))으로 파일에 쿼리할 때 디렉터리에 끊어진 심볼릭 링크가 있으면 처리되지 않은 파일 시스템 예외(STD_EXCEPTION)가 발생해 충돌하던 문제를 수정했습니다. 이제 끊어진 심볼릭 링크는 조용히 건너뛰고, 쿼리는 모든 유효한 파일의 결과를 반환합니다. #98143 (Mark Andreev). - 필터 표현식에서
arrayJoin을 사용할 때 외부 조인을 내부 조인으로 변환하는 쿼리 계획 최적화 과정에서 발생하던 세그폴트를 수정했습니다. #98147 (Alexey Milovidov). - 메시지 간에 읽기 상태가 재설정되지 않아
ProtobufList포맷이 Kafka 엔진에서 작동하지 않던 문제를 수정했습니다. #98151 (Alexey Milovidov). - analyzer_compatibility_join_using_top_level_identifier 및 ARRAY JOIN 관련 논리 오류를 수정하고, #98164를 해결했습니다. #98179 (Vladimir Cherkasov).
aggregated_zookeeper_log의 watch 응답에서Watchcomponent를 비워 두지 않고 설정합니다. #98202 (Antonio Andelic).- 파티션 키 컬럼이 정렬 키에 포함되지 않으면, 파티션 프루닝으로 인해 FINAL 중복 제거 과정에서 “최종적으로 남아야 하는” 행이 들어 있는 파티션이 잘못 건너뛰어질 수 있습니다. #98242 (Yarik Briukhovetskyi).
- 상수 배열을 인수로 전달해 호출할 때
kql_array_sort_asc/kql_array_sort_desc에서 발생하던 논리 오류 “Bad cast from type DB::ColumnConst to DB::ColumnArray”를 수정했습니다. #98251 (Alexey Milovidov). extremes = 1이 enabled된 경우 크래시를 일으킬 수 있던ColumnConst::getExtremes의 범위 밖 접근 문제를 수정했습니다. #98263 (Alexey Milovidov).- 동일한 테이블 쌍에 대해 반대 방향으로 두 개의 concurrent
MOVE PARTITION작업이 수행될 때 발생할 수 있는 잠재적 데드락을 수정했습니다. #98264 (Alexey Milovidov). - 이제 HTTP server는 잘못된 headers로 인해 발생한 400 Bad Request 응답에 대해 빈 본문 대신 응답 본문에 오류 메시지를 반환합니다. #98268 (Alexey Milovidov).
- 분산 인덱스 분석(실험적 기능) 및 쿼리 조건 캐시에서 잘못된 결과를 반환하던 문제를 수정했습니다. #98269 (Azat Khuzhin).
- 65535 경계를 넘는 데이터가 포함된 키 컬럼에서
toDate변환으로 인해 트리거된 LOGICAL_ERROR 예외 “MergeTreeSetIndex의 이진 검색 결과가 잘못되었습니다”를 수정했습니다. #98276 (Alexey Milovidov). - legacy join 단계의 코드 경로에서
query_plan_join_swap_table최적화가 CROSS JOIN으로 감싸진 RIGHT JOIN의 테이블 순서를 바꿀 때 발생하던LOGICAL_ERROR예외를 수정했습니다. #98279 (Alexey Milovidov). - 손상된
quantilesDD집계 함수 상태를 읽을 때 세그멘테이션 폴트, 예외, 무한 루프, OOM이 발생하지 않도록DDSketch역직렬화 중 손상된 데이터를 검증합니다. #98284 (Alexey Milovidov). - 외부 쿼리의 연관 컬럼을
arrayMap과 같은 람다 함수 내부에서 참조할 때 발생하던 LOGICAL_ERROR “Trying to execute PLACEHOLDER action”를 수정했습니다. #98285 (Alexey Milovidov). CASE표현식에materialize(NULL)또는 다른Nullable(Nothing)인수가 포함된 경우caseWithExpression에서 발생하던 논리 오류 예외를 수정했습니다. #98290 (Alexey Milovidov).merge테이블 함수에서_table가상 컬럼을 필터링할 때 발생하는 잘못된 형변환 예외를 수정했습니다. #98291 (Alexey Milovidov).blocks/및deduplication_hashes/ZooKeeper 디렉터리 간 정리 순서가 일관되지 않아 재삽입이 잘못 중복 제거되던 간헐적 중복 제거 실패 문제를 수정했습니다. #98293 (Alexey Milovidov).ORDER BY ... WITH FILL을LIMIT BY와 함께 사용할 때 예외가 발생하던 문제를 수정했습니다. #98361 (Alexey Milovidov).- Parquet/Arrow
Date컬럼을Enum컬럼에 삽입할 때 발생하던 드러나지 않는 데이터 손상을 수정했습니다 — 이제 잘못된 Enum 값을 저장하는 대신, 호환되지 않는 유형 변환을 올바르게 거부합니다. #98364 (Alexey Milovidov). Array컬럼이 있는 Arrow 파일을Nested컬럼이 있는 테이블로 읽어들일 때 발생하던 예외를 수정했습니다. #98365 (Alexey Milovidov).- 인덱스 또는 프로젝션이 뮤테이션이 완료되기 전에 삭제되면
MATERIALIZE INDEX및MATERIALIZE PROJECTION뮤테이션이 중단되던 문제를 수정했습니다. #98369 (Alexey Milovidov). Nullable(Tuple(...))에서 읽는 중 Tuple 요소 이름이 Nullablenull하위 컬럼과 충돌할 때 발생하던 예외를 수정했습니다. #98372 (Alexey Milovidov).Merge테이블(Distributed테이블로 래핑된)을 다른 테이블과 조인할 때 발생하던 예외 “Column … query tree node does not have valid source node”를 수정했습니다. #98376 (Alexey Milovidov).- 문자열 표현이 아니라 원시 바이트를 생성하던 네이티브 V3 리더의 잘못된 Parquet
Bool→FixedString변환을 수정했습니다. #98378 (Alexey Milovidov). tryGetColumnDescription이 다른 컬럼 조회 메서드와 일관되게 상위 컬럼 종류를 기준으로 서브컬럼을 필터링하도록 수정했습니다. #98391 (Alexey Milovidov).- HTTP Basic Auth에서 패딩이 없는 base64 자격 증명도 허용합니다. 일부 HTTP 클라이언트는
Authorization: Basic헤더에서 끝의=패딩을 생략하는데, 이로 인해 이전에는 인증에 실패했습니다. #98392 (Amos Bird). - 잘못된 MinMax 인덱스 경계값으로 인해
Nullable파티션 키 컬럼이 있는 파트를 병합한 뒤 파티션 프루닝 결과가 잘못되던 문제를 수정했습니다. #98405 (Amos Bird). - 파이프라인 실행기에서 드물게 발생하는 예외를 수정했습니다. 파이프라인 확장과 쿼리 취소가 경합할 때 이 예외가
Received signal 6으로 나타날 수 있었습니다(디버그 빌드에서만 해당). #98428 (Alexey Milovidov). count_distinct_optimization을QUALIFY절과 함께 사용할 때 발생하는 “컬럼 식별자가 이미 등록되어 있습니다” 예외를 해결했습니다. #98433 (Alexey Milovidov).LowCardinality컬럼 인수와 함께IN/NOT IN을 사용할 때 발생하는 “cannot be inside Nullable type” 예외를 수정했습니다(예:a가LowCardinality(String)일 때a NOT IN (b)). #98443 (Alexey Milovidov).FilterBySetOnTheFly최적화가MergeJoinTransform과 순환 의존성을 형성할 때PingPongProcessor에서 발생한 교착 상태로 인해full_sorting_merge조인에서 발생하던 “Pipeline stuck” 예외를 수정했습니다. #98454 (Alexey Milovidov).- 모든 행을 삭제하는 TTL과 상수
GROUP BY키를 사용하는 집계 프로젝션이 있는 파트를 병합할 때 발생하는LOGICAL_ERROR예외 “Projection cannot increase the number of rows in a block”를 수정했습니다. #98458 (Alexey Milovidov). CROSS JOIN을INNER JOIN USING과 함께 사용할 때 발생하던 논리 오류 예외를 수정했습니다. #98459 (Alexey Milovidov).- 키 인수가
Nullable일 때dictGetOrDefault에서 발생하는 널 포인터 역참조 문제를 수정했습니다. #98460 (Alexey Milovidov). - 집계 프로젝션을 사용할 때
materialize로 인해 쿼리와 프로젝션 간에LowCardinality유형 차이가 생겨DISTINCT쿼리에서 예외가 발생하던 문제를 수정했습니다. #98462 (Alexey Milovidov). - OUTER JOIN과
join_use_nulls가 활성화된 상태에서 필터 표현식에arrayJoin을 사용할 때 발생하던 LOGICAL_ERROR 예외를 수정했습니다. #98464 (Alexey Milovidov). optimize_aggregation_in_order를 사용해 병렬 레플리카를 사용할 때 발생하던 논리 오류 예외 “Replica decided to read in WithOrder mode, not in ReverseOrder”를 수정했습니다. #98467 (Alexey Milovidov).addWatch요청 후 ClickHouse Keeper가 Java ZooKeeper 클라이언트의 연결을 끊는 문제를 수정했습니다. Java 클라이언트는addWatch응답에서 4바이트ErrorResponse본문을 기대하지만, Keeper는 빈 본문을 보내EOFException을 발생시키고 세션 연결 해제를 유발했습니다. 이로 인해 Apache Curator의CuratorCache와 영구 watch를 사용하는 모든 Java 애플리케이션이 정상적으로 동작하지 않았습니다. #98079를 수정합니다. #98499 (Antonio Andelic).- 팔로워가 다운될 때
zk_followers및zk_synced_followersKeeper 메트릭이 감소하지 않던 문제를 수정했습니다.mntrfour-letter-word 명령에 새로운zk_learners및zk_synced_non_voting_followers메트릭을 추가했습니다. #54173을 수정합니다. #98504 (Antonio Andelic). - MergeTree 트랜잭션 사용 시
TRUNCATE TABLE과OPTIMIZE TABLE이 동시에 실행될 때renameAndCommitEmptyParts에서 발생할 수 있던LOGICAL_ERROR예외 문제를 수정했습니다. #98508 (Alexey Milovidov). - Keeper’s secure raft port가
openSSL구성의cipherList와dhParamsFile을 무시하고, 사용자 지정 값 대신 항상 기본값을 사용하던 문제를 수정했습니다. #51188을 해결했습니다. #98509 (Antonio Andelic). - “Receiving request for session X took 9963 ms”와 같이 오해를 살 수 있는 Keeper 로그 메시지를 수정했습니다. 보고된 시간은 실제 작업 수행 시간이 아니라, 하트비트 사이에
poll()에서 유휴 상태로 대기한 시간이었습니다. #79026를 수정했습니다. #98510 (Antonio Andelic). - read_in_order_use_virtual_row 및 단조 함수에서 예기치 않은 결과가 발생하는 문제를 수정하고, #97837을 해결했습니다. #98514 (Vladimir Cherkasov).
- MergeTree 테이블에서
IN서브쿼리와 함께PREWHERE를 사용할 때 발생하던LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'오류를 수정했습니다. #98522 (Alexey Milovidov). - 종료 신호에 응답하지 않아 서버가 정상적으로 종료되지 않던 Keeper TCP 연결 문제를 수정했습니다. #98525 (Alexey Milovidov).
query_plan_merge_expressions = 0인 상태에서query_plan_convert_join_to_in이 활성화되면 발생하는 “ActionsDAG 출력에서 정렬 컬럼을 찾을 수 없습니다” 예외를 수정했습니다. #98526 (Alexey Milovidov).- 명명된 컬렉션 사용 시 실패하던 MongoDB 딕셔너리 소스 문제를 수정했습니다. #97840를 해결했습니다. #98528 (Pablo Marcos).
- 매개변수 치환 후 Identifier가 비어 있을 때 발생하는 LOGICAL_ERROR를 수정했습니다. #98530 (Pervakov Grigorii).
sort_overflow_mode = 'break'를 윈도우 함수와 함께 사용할 때 발생하던 파이프라인 데드락을 수정했습니다. #98543 (Alexey Milovidov).- 새 block을 추가하는 도중 예외가 발생했을 때 Buffer 엔진의 컬럼 롤백을 수정했습니다. 이전 로직은 컬럼의 메모리 내 상태를 손상시킬 수 있었습니다. #98551 (Pavel Kruglov).
- const
Dynamic또는Variant컬럼과NULL에 대한 null-safe 비교(<=>/IS NOT DISTINCT FROM)에서 발생하던 예외Bad cast from type ColumnConst to ColumnDynamic를 수정했습니다. 또한Dynamic/Variant와NULL간의IS DISTINCT FROM이 항상 0을 잘못 반환하던 문제도 수정했습니다. #98553 (Alexey Milovidov). - text index를 다른 스킵 인덱스와 함께 사용할 때 발생하던 문제를 수정했습니다. 이전에는 쿼리 필터에서 text index와 다른 일반 스킵 인덱스를 동시에 사용하면 “Trying to get non-existing mark”와 같은 논리 오류가 발생할 수 있었습니다. #98555 (Anton Popov).
- 동일한 쿼리 범위에서 별칭이 지정된 테이블 함수가 여러 번 나타날 때(예:
PREWHERE절과QUALIFY절 모두에서) 발생하는 논리 오류 “TABLE_FUNCTION is not allowed in expression context”를 수정했습니다. #98557 (Alexey Milovidov). - PK에서 컬럼뿐 아니라 표현식도 사용하는 분산 인덱스 분석을 수정했습니다(이로 인해 원격 레플리카에서 중복 그래뉼이 전혀 필터링되지 않던 문제가 있었습니다). #98561 (Azat Khuzhin).
- 서브컬럼이 다른 컬럼의 기본값/별칭 표현식에서 사용되는 경우 해당 컬럼을 삭제할 수 없도록 하고,
ALTER DROP COLUMN에서 기본값 표현식에 분석기를 사용합니다. #98569 (Nikita Mikhaylov). - HTTP 클라이언트에서 재시도할 수 없는 오류(
HTTP_CONNECTION_LIMIT_REACHED포함) 발생 시 S3 요청이 잘못 재시도되는 문제를 수정했습니다. #98598 (Sema Checherinda). - DateTime64에서 파티션 프루닝 시 발생하는 Decimal 오버플로우를 수정했습니다. #98628 (Yarik Briukhovetskyi).
- JIT 표현식 컴파일의 두 가지 버그를 수정했습니다.
nativeCast타입 검사에 있던 복사 붙여넣기 오류로 인해 정수→정수 및 부동소수점→부동소수점 CAST 분기에 도달할 수 없던 문제와, LLVMPassBuilder에 잘못된nullptrTargetMachine이 전달되어 대상별 최적화 패스가 등록되지 않던 문제를 해결했습니다. #98660 (Alexey Milovidov). - 사용자가
SHOW_COLUMNS권한 없이도 localhost를 대상으로 하는remote(),remoteSecure(),cluster(), 또는clusterAllReplicas()를 통해 임의의 테이블을 DESCRIBE할 수 있었던 RBAC 우회를 수정했습니다. #98669 (pufit). - filter push-down 최적화로 공유 DAG 노드가 손상되면서, 불리언이 아닌 표현식(예:
sin(col))이 JOIN과 함께 WHERE와 SELECT 양쪽에서 사용될 때 발생하던BAD_GET예외와 잘못된 쿼리 결과를 수정했습니다. #98681 (Alexey Milovidov). - 병렬 레플리카에서
read_in_order_through_join를 사용할 때 발생하는 LOGICAL_ERROR “Replica decided to read in Default mode, not in WithOrder” 오류를 수정했습니다. #98685 (Alexey Milovidov). input테이블 함수를remote의 인수로 사용할 때 발생하는 “Bad cast from typeDB::TableFunctionNodetoDB::QueryNode” 예외를 수정했습니다. #98694 (Alexey Milovidov).- 빈 covering parts를 잘못 정리해 발생한 오래된 데이터 파트의 재등장 문제를 수정했습니다. #98698 (Shaohua Wang).
equals비교에서 불리언 함수가Variant타입을 반환할 때LogicalExpressionOptimizerPass에서 발생하는 예외를 수정했습니다. #98712 (Alexey Milovidov).- 월/요일 이름의 프리픽스로 시작하는 단어를
parseDateTimeBestEffort가 잘못 파싱하는 문제를 수정했습니다. #97965를 해결합니다. #98742 (Pavel Kruglov). - 새 분석기가 활성화된 상태에서, 서로 다른 매개변수(예: 서로 다른
SKIP필드)를 가진 JSON 컬럼이 있고 JSON 하위 경로를 참조하는 ALIAS 컬럼도 포함된 테이블에 대해merge()테이블 함수 또는Merge엔진으로 쿼리할 때 발생하던UNKNOWN_IDENTIFIER예외를 수정했습니다. #97812을 해결합니다. #98753 (Pavel Kruglov). - 분석기 사용 시
View에서Distributed스토리지를 사용하는 경우optimize_skip_unused_shards최적화가 올바르게 동작하지 않던 문제를 수정했습니다. #98754 (Nikolai Kochetov). clickhouse-client에서--external로 전달된 외부 테이블의 Tuple 하위 컬럼에 이름으로 접근하는 동작(예:Tuple(a UUID, b Int32)에 대해SELECT x.a)을 수정했습니다. #96925를 해결합니다. #98755 (Pavel Kruglov).- 유효하지 않은(중간에 잘린) UTF-8 입력에서
reverseUTF8예외가 발생하던 문제를 수정했습니다. #98770 (Alexey Milovidov). - false와 OR로 결합된 프레디케이트(즉, or(x, 0))에서 set 스킵 인덱스의 유용성 감지를 수정했습니다. #98776 (Azat Khuzhin).
FINAL+PREWHERE+ 상수WHERE표현식 +count()와 같은 컬럼과 무관한 집계 함수 조합에서 발생할 수 있던LOGICAL_ERROR예외(removeUnusedColumns에서 block 구조 불일치)를 수정했습니다. #98778 (Alexey Milovidov).- ClickHouse 딕셔너리의 자동 재로드 시 생성되는
system.trace_log항목에 비어 있지 않은 쿼리 ID가 포함되도록 합니다. #98784 (Miсhael Stetsyuk). IDatabaseTablesIterator::table()호출에서 테이블 스냅샷을 생성한 시점부터 이후 반복 과정에서 다른 스레드가 테이블을 변경하는 시점 사이에 만들어진 시스템 테이블(system tables)에서 NULL 포인터를 역참조하면서 발생하던 크래시를 수정했습니다. #98792 (Grant Holly).SYSTEM START REPLICATED VIEW가 갱신 작업을 다시 시작하지 못하던 문제를 수정했습니다. #98797 (Pablo Marcos).view()테이블 함수에 조인이 포함되어 있고 이를 다른 JOIN 안에서 사용할 때 발생하는 “Inconsistent table names” 예외를 수정했습니다(이전 분석기에서만 해당). #98809 (Alexey Milovidov).pending_signals를 통한 RLIMIT_SIGPENDING 조정 문제를 수정했습니다. #98829 (Azat Khuzhin).- cluster 테이블 함수와
loop를 함께 사용할 때 발생하던 예외를 수정했습니다. #98860 (Konstantin Bogdanov). enable_join_runtime_filters=1(기본값)일 때 여러 개의 조인 키 컬럼을 사용하는 LEFT ANTI JOIN이 잘못된 결과를 반환하던 문제가 수정되었습니다. #98871 (Alexander Gololobov).- 데이터를 여러 청크에서 읽을 때(예:
index_granularity가 작을 때)WITH FILL STALENESS가 추가로 채워진 행을 생성하는 문제를 수정했습니다. #98895 (Alexey Milovidov). - “RPNBuilderFunctionTreeNode에 A개의 인수가 있는데, B 인덱스의 인수를 가져오려고 했습니다” LOGICAL_ERROR를 수정했습니다. #98900 (Azat Khuzhin).
- 실패한 메모리 할당이 롤백되지 않아 발생한 메모리 추적 오차,
nallocx(0)의 정의되지 않은 동작, 전역 피크 추적에서 1만큼 어긋나는 문제를 수정했습니다. 추적 범위를io_uring링 버퍼까지 확장했습니다. #98915 (Antonio Andelic). - 사용자 경로 외부의 로컬 데이터 레이크 테이블은 생성뿐만 아니라 ATTACH도 금지합니다. #98936 (Daniil Ivanik).
urlCluster또는 이와 유사한 클러스터 테이블 함수를 사용하는 쿼리에서 “ReadBuffer is canceled” 예외를 발생시킬 수 있는 경쟁 상태를 수정했습니다. #98955 (Alexey Milovidov).BFloat16유형의 인수가 전달될 때 재무 함수(financialNetPresentValue,financialInternalRateOfReturn등)에서 발생하는LOGICAL_ERROR예외를 수정했습니다. #98958 (Alexey Milovidov).- 쿼리 계획 표현식 머지가 비활성화된 경우(query_plan_merge_expressions = 0 또는 query_plan_enable_optimizations = 0), ALIAS 컬럼에 대해 스킵 인덱스(및 프라이머리 키 조건)가 적용되지 않던 문제를 수정했습니다. #98960 (Peng).
- async 삽입 시
InsertQueryProfileEvent가 증가하도록 했습니다. #98626을 해결합니다. #98962 (Narasimha Pakeer). - 기본 키(primary key)에 NaN 부동소수점 값이 포함된 경우,
accurateLess와accurateEquals가 ClickHouse 정렬 순서에 맞게 NaN을 일관되게 처리하도록 하여 디버그 빌드에서 발생하던 예외 “Inconsistent KeyCondition behavior”를 수정했습니다. #98075를 해결했습니다. #98964 (Alexey Milovidov). - SummingMergeTree는 이제 Bool(및 기타 도메인 유형) 컬럼을 더 이상 합산하지 않습니다. Bool 값은 산술적으로 합산되는 대신 그대로 유지됩니다. #98976 (Yash ).
optimize_const_name_size가 설정되고enable_scalar_subquery_optimization= 0인 상태에서 원격 세그먼트에 대해 쿼리할 때 발생하던Scalar doesn't exist예외를 수정했습니다. 원격 쿼리에서__getScalar참조로 대체된 큰 상수들이 세그먼트로 전송되지 않아 쿼리가 실패하던 문제가 있었습니다. #98979 (andriibeee).GROUP BY와 역방향 딕셔너리 조회,Date/DateTime변환 비교, 튜플 비교가 포함된 표현식이 있는 일부 쿼리에서NOT_FOUND_COLUMN_IN_BLOCK문제를 수정했습니다. #98888를 해결합니다. #98980 (Nihal Z. Miaji).- MergeTree 엔진에서 version/sign/is_deleted 컬럼을
EPHEMERAL또는ALIAS로 변경할 때 발생하던 정의되지 않은 동작(널 포인터 역참조)을 수정했습니다. 이제 이러한 변경은 올바르게 거부됩니다. #98985 (Alexey Milovidov). system.grants가access_object컬럼에서URL및S3권한 부여의 정규식 매개변수를 빠뜨리던 문제를 수정했습니다. #98987 (DQ).- Iceberg BigLake 읽기 관련 문제가 수정되었습니다. 이제 ADC 자격 증명이 GCS S3 클라이언트로 전달되어 403 오류가 해결되고, OAuth2 자격 증명은 전송 전에 URL 인코딩되어 특수 문자가 포함된 토큰에서 발생하던 인증 실패가 해결되며, 네임스페이스 순회도 더 이상 BigLake HTTP 400 응답에서 중단되지 않습니다. #98998 (Nikita Fomichev).
clickhouse-client에서TZ환경 변수가 POSIX 파일 경로 구문(예:TZ=:/etc/localtime)을 사용할 때 시간대를 변경하지 못하던 문제를 수정했습니다. #99000 (Yash ).startsWith,LIKE,NOT LIKE를FixedString컬럼과 함께 사용할 때 발생하던 잘못되거나 충분하지 않던 프루닝을 수정했습니다. 또한 이제FixedString에서String으로 변환하는 CAST 함수는 키 컬럼에 적용된 경우 그래뉼을 프루닝할 수 있습니다. #98940을 해결합니다. #99001 (Nihal Z. Miaji).- 중복 이벤트가 발생했을 때
strict_deduplication을 사용하는windowFunnel이 잘못된 레벨을 반환하던 문제를 수정했습니다. #99003 (Yash ). - 서브쿼리에서 EXISTS가 LIMIT 및 OFFSET 절을 무시하던 버그를 수정했습니다. 이 버그로 인해 OFFSET이 적용되었거나 LIMIT이 0이어서 서브쿼리가 행을 반환하지 않는 경우 잘못된 결과가 발생했습니다. #88722을 닫습니다. #99005 (andriibeee).
GROUPING SETS와 함께 필터 푸시다운 최적화 과정에서 상수로 단락 평가되는 AND 표현식을 만나면 발생하던 “Block structure mismatch” 예외를 수정했습니다. #99010 (Alexey Milovidov).- 쿼리 계획에
_part_offset컬럼이 없을 때 패치 파트(경량 업데이트)를 읽는 과정에서 발생하던 예외를 수정했습니다. #99023 (Alexey Milovidov). pk_id가 primary key이고String유형일 때,SELECT * FROM table WHERE pk_id = ''와 같은 쿼리는 이제 그래뉼을 필터링할 때 primary key 인덱스를 올바르게 사용합니다. #99027 (Shankar Iyer).- 백그라운드 스레드가 데이터를 스트리밍하는 중에 materialized view가 분리되면 Kafka 엔진에서 발생하던
DEPENDENCIES_NOT_FOUND예외를 수정했습니다. #99028 (Alexey Milovidov). - 가상 컬럼과 같은 이름의
EPHEMERAL컬럼(예:_part_offset)이 있는 테이블을 생성할 때 발생하던 예외를 해결했습니다. #99031 (Alexey Milovidov). - 글롭 패턴을 사용하는
url()테이블 함수로 존재하지 않는 압축 파일을 읽을 때 표시되던 오해의 소지가 있는 “inflate failed: buffer error”를 수정했습니다. 이제http_skip_not_found_url_for_globs가 활성화된 경우 예상대로 빈 결과를 반환합니다. #99034 (Alexey Milovidov). - 스키마(schema) 변경(예: ADD COLUMN) 이후 패치 파트에서
ALTER TABLE ... DROP PART를 실행할 때 발생하던 서버 충돌(std::terminate)을 수정했습니다. 이 충돌은 빈 커버리지 파트 메타데이터에서 시스템 컬럼(_part)이 누락되면서 NOEXCEPT_SCOPE 내부에서 예외가 처리되지 않은 것이 원인이었습니다. #99036 (Peng). - 캐시된 디스크 읽기 중 메모리 한도 초과 예외가 발생하면 ClickHouse 서버 프로세스가 비정상 종료될 수 있었습니다. 이 문제가 수정되었습니다. #99042 (Shankar Iyer).
dictGet을 사용해 ROW POLICY와 ALIAS 컬럼이 모두 있는 테이블을 쿼리할 때 발생하던LOGICAL_ERROR를 수정했습니다. 이 문제는 새로운 분석기에서 ALIAS 컬럼을 해석하는 과정에서 테이블 표현식에 너무 이르게 접근해 발생했습니다. #99065 (Peng).- 데이터 포맷이 Avro인 Iceberg 테이블에서 사용자가 가상 컬럼(virtual columns)만 쿼리하려고 할 때 발생하는 범위 이탈 오류를 수정했습니다. 매우 드문 시나리오이므로 치명적 문제로 표시하지 않았습니다. #88238을 해결했습니다. #99080 (alesapin).
remote()+view()를 사용하는 재귀 CTE에서 발생하던 세그멘테이션 폴트를 수정했습니다. #99081 (Konstantin Bogdanov).- read-in-order 최적화가 적용된 경우 불필요한 추가 인덱스 분석을 건너뜁니다. #99084 (Vladimir Cherkasov).
- patch part를 적용하는 중 메모리 제한 예외가 발생해 일어나던 충돌을 수정했습니다. #99086 (Anton Popov).
- 재초기화 복구 과정에서 ZooKeeper 항목이 삭제된 뒤 오래된
first_failed_task_name때문에 발생하던DDLWorker의 디버그 어설션을 수정했습니다. #99099 (Antonio Andelic). - TTL이 적용된 머지 시 텍스트 인덱스 재구축 문제를 수정했습니다. #99107 (Anton Popov).
- Iceberg 테이블 엔진의
ALTER TABLE ... REMOVE SETTINGS쿼리에서 발생하는 충돌을 수정했습니다. #86330를 해결합니다. #99108 (alesapin). query_plan_convert_any_join_to_semi_or_anti_join최적화에서 일치하지 않는 행에 대해 잘못된 결과를 반환하던 버그를 수정했습니다. 관련: https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi).ASTColumnsExceptTransformer::transform에서 발생하는 LOGICAL_ERROR 예외를 해결했습니다. #99119 (Pablo Marcos).- 필요한 소스 접근 권한 없이 사용자가 테이블 함수(
mysql(),postgresql(),sqlite(),arrowFlight(),jdbc(),odbc()등)에서DESCRIBE TABLE또는CREATE TABLE AS를 통해 테이블 구조를 확인할 수 있게 했던 RBAC 우회를 수정했습니다. 원격 서버에서 스키마를 추론하는 함수의 경우, 이 문제로 인해 권한 없이 아웃바운드 연결(SSRF)을 유발할 수도 있었습니다. #99122 (pufit). - 동적 재구성과 리더십 이전 중 발생하던 Keeper 충돌(NuRaft의 세그멘테이션 오류)을 수정했습니다. #99133 (JIaQi Tang).
- 대상에서 이를 지원하지 않는 경우, SAMPLE과 함께 Buffer 테이블을 사용할 때 발생하던 충돌을 수정했습니다. #99141 (Kseniia Sumarokova).
- patch parts 컬럼 순서가 일치하지 않아 발생한 LOGICAL_ERROR를 수정했습니다. #99164 (Pablo Marcos).
- Iceberg 테이블에 서로 다른 포맷(ORC 및 Parquet)의 파일이 함께 포함된 경우 발생하던 매우 드문 크래시를 수정했습니다. #88126를 수정합니다. #99168 (alesapin).
- 백업/복원에 max_execution_time이 적용되지 않던 문제를 수정했습니다. #99205 (Kseniia Sumarokova).
ORDER BY ALL이 없는INSERT SELECT쿼리에서insert_deduplication_token이 조용히 무시되던 문제를 수정했습니다. 이전에는 정렬되지 않은INSERT SELECT에서 명시적인 사용자 token이 제공된 경우에도 중복 제거가 완전히 비활성화되었습니다. 이제는insert_deduplication_token만 제공하면ORDER BY ALL유무와 관계없이 중복 제거가 활성화됩니다. #99206 (Desel72).InverseDictionaryLookupPass최적화 중 과도하게 수행되던 접근 권한 검사를 수정했습니다. 이제 방문하는 모든 노드마다CREATE_TEMPORARY_TABLE권한을 확인하는 대신, 패스를 실행하기 전에 한 번만 확인합니다. #99210 (Mikhail Artemenko).- 스킵 인덱스 타입, 압축 코덱 이름, 데이터베이스 엔진 이름, 딕셔너리 레이아웃/소스 정의를 난독화하면서
clickhouse format --obfuscate가 유효하지 않은 SQL을 생성하는 문제를 수정했습니다. #99260 (Raúl Marín). - 일부 경우 Time[64] 타입과 DateTime[64] 타입을 비교할 때 혼동을 초래하던 버그를 수정했습니다. 이제 이런 경우에는
1970-01-01을 날짜 부분으로 추가해 Time[64] 값을 DateTime[64]로 승격합니다. #99267 (Yarik Briukhovetskyi). - 분산 DDL 쿼리의 DDL worker에서 설정 제약 범위를 제한합니다. #99317 (Pablo Marcos).
- TOTP 인증 관련 사소한 문제를 수정했습니다: 비밀번호가 비어 있을 때의
--one-time-passwordCLI 옵션 처리와<digits>및<period>구성 값 검증입니다. #99322 (Vladimir Cherkasov). - enum 정의에 없는 값을 가진
Enum8/Enum16컬럼을 직렬화할 때 Avro 출력 형식에서 발생하던 논리적 오류unordered_map::at: key not found를 수정했습니다. #99332 (Desel72). - Dynamic이 포함된 Tuple 내부의 희소 직렬화에서 CHECK TABLE 문제를 수정했습니다. #96588을 해결합니다. #99351 (Pavel Kruglov).
- 텍스트 인덱스 전처리기의 지나치게 엄격한 검증을 수정했습니다. #99359 (Anton Popov).
- 25.10에서 이후 버전으로 암시적 minmax 인덱스가 있는 복제된 테이블(Replicated Tables)을 업그레이드할 때 발생하는 호환성 문제를 수정했습니다. #99392 (Raúl Marín).
- 텍스트 인덱스 분석에서 부정형 함수(
notEquals,notLike,notIn) 지원을 제거했습니다. 이러한 함수는 어떤 그래뉼도 건너뛸 수 없으므로, 이 함수들에 대해 인덱스를 분석해도 이점 없이 오버헤드만 늘어났습니다. #99393 (Anton Popov). Distributed테이블이 IN 하위 쿼리 내부에서 사용된 경우를 처리하기 위해 새 분석기에서optimize_skip_unused_shards를 수정했습니다. #99436 (Nikolai Kochetov).- 쿼리 결과에 중복된 컬럼 이름이 포함될 때
INTERSECT/EXCEPT에서 발생하던 heap-use-after-free 문제를 수정했습니다. #99471 (Alexey Milovidov). ALTER TABLE ... DROP PART에서 파트 이름으로 타입이 지정된 쿼리 매개변수를 사용할 때 발생하는 논리 오류를 수정했습니다. #99489 (Alexey Milovidov).- 별칭으로
SELECT와WHERE절 모두에서 텍스트 인덱스 프레디케이트(예:hasAllTokens)를 참조할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #99504 (Anton Popov). - 서로 별도의 텍스트 인덱스가 있는 컬럼들에 걸쳐 OR로
hasAllTokens를 사용할 때 잘못된 결과가 반환되는 문제를 수정했습니다. #99505 (Anton Popov). page_cache_max_size설정이 적용되도록clickhouse-local에서 페이지 캐시를 초기화하도록 했습니다. #99510 (Alexey Milovidov).- 드물게
DETACH/ATTACH TABLE쿼리 후 데이터 파트가 손상된 것으로 잘못 표시되어 분리되던 문제를 수정했습니다. #99529 (Anton Popov). - HTTP 인터페이스를 통해 Pretty 형식으로 비어 있는 시스템 테이블을 쿼리할 때
std::length_error예외가 발생하던 문제를 수정했습니다. #99541 (Alexey Milovidov). - 가상 컬럼(예:
_part_offset)과 같은 이름의EPHEMERAL컬럼을 만들기 위해ALTER TABLE ADD COLUMN을 사용할 때 발생하던LOGICAL_ERROR를 수정했습니다. #99549 (Alexey Milovidov). - 캐시 키 불일치로 인해 part 제거 후에도
VectorSimilarityIndexCache항목이 퇴출되지 않던 문제를 수정했습니다. #99575 (Seva Potapov). - 로컬 파일에서 Google 자격 증명을 읽지 못하게 합니다. 파일 경로를 알고 있으면 다른 자격 증명도 읽을 수 있으므로 이 설정은 안전하지 않습니다. #99584 (Konstantin Vedernikov).
- 분석기의 성능 저하 문제를 수정했습니다. ARRAY JOIN에서 사용되지 않는 컬럼을 제거했습니다. #99587 (Dmitry Novik).
- 기존 경량한 삭제와 행 정책이 있는 테이블에서 텍스트 인덱스를 읽을 수 있도록 수정했습니다. #99661 (Anton Popov).
- filter-in-decoder 경로에서 필터링으로 제외된 페이지를 만날 때 Parquet 리더에서 발생하는 nullptr 역참조를 수정했습니다. #99676를 해결합니다. #99677 (Alexey Milovidov).
- O_DIRECT 사용 시 AsynchronousReadBufferFromFileDescriptor에서 발생하는 잘못된 seek 동작을 수정했습니다. #99358를 해결했습니다. #99678 (Pavel Kruglov).
- 손상된 압축 데이터를 압축 해제할 때
CompressionCodecT64에서 발생하던 힙 버퍼 오버플로우와CompressionCodecMultiple에서 발생하던 프로세스 강제 종료 문제를 수정했습니다. 두 문제는 모두 새로운 libFuzzer 타깃에서 발견되었습니다. 이제 코덱은 비정상 종료되는 대신 예외를 발생시킵니다. #99680 (Rahul). - 서버가 모든 테이블의 로딩을 완료할 때까지 처리를 지연합니다. #99700 (Seva Potapov).
- 인라인 DDL 매개변수에서
RemoteHostFilter를 우회하는 MySQL 딕셔너리 소스 문제를 수정했습니다. #99720 (Shaohua Wang). system.tables에서 데이터 레이크 테이블을 순회할 때 발생하는 논리 오류를 수정했습니다. #99739 (Konstantin Vedernikov).- 전처리기가 적용된 텍스트 인덱스에서
IN함수와 함께 사용하는 프레디케이트 분석 문제를 수정했습니다. 또한 텍스트 인덱스에서 검색된 토큰 간 충돌 문제를 수정했으며, 이 문제로 인해 잘못된 결과가 반환될 수 있었습니다. #99755 (Anton Popov). - shape 차원이 음수인
Npy포맷 파일을 읽을 때 발생하던 무한 루프를 수정했습니다. #99812 (Desel72). - 쿼리 계획 헤더를 계산할 때 0개의 행에 대해 평가되는 경우
FixedString인수의CRC32함수에서 발생하는 global-buffer-overflow를 수정했습니다. #99835 (Alexey Milovidov). - Iceberg 테이블에서
ALTER TABLE ... MODIFY COLUMN ... COMMENT실행 시 발생하던 크래시(NULL 포인터 역참조)를 수정했습니다. #99838 (Desel72). aggregate_functions_null_for_empty설정이Array또는Map처럼 널 허용이 아닌 타입을 반환하는 집계 함수(예:groupArray,sumMap)에서도 작동하도록 수정했습니다. #99839 (Alexey Milovidov).- 부호 있는 정수 타입과 부호 없는 정수 타입이 혼합된 상태에서
midpoint함수를 호출할 때 발생하던 LOGICAL_ERROR 예외를 수정했습니다. #99867 (Alexey Milovidov). - HAVING 절이 있는 쿼리에서 필터 표현식에 NULL을 반환하는 함수로 감싼 집계와
materialize(0)가 함께 포함된 경우 발생하던 “Block structure mismatch” 예외를 수정했습니다. #99915 (Alexey Milovidov). - 데이터 인수가 배열 키 또는 기타 중첩 배열 타입을 포함한 맵인 경우
sipHash128Keyed(및 유사한 키 지정 해시 함수)에서 발생하던 assertion failure를 수정했습니다. #99921 (Alexey Milovidov). convertAnyJoinToSemiOrAntiJoin를 사용하는 쿼리 계획 최적화 중IN함수에서 발생하던LOGICAL_ERROR예외 “Not-ready Set”를 수정했습니다. #99939 (Alexey Milovidov).
빌드/테스트/패키징 개선
- 무거운 헤더 include를 제거하고 비용이 큰 Template 인스턴스화를 헤더 밖으로 옮겨 컴파일 시간을 줄였습니다. #97893 (Raúl Marín).
- Template 디스패치 매트릭스를 축소하고 무거운 include를 제거해 산술 함수와 관련 헤더의 컴파일 시간을 줄였습니다. #98204 (Raúl Marín).
mongo-c-driver2.2.2를 사용합니다. #98304 (Konstantin Bogdanov).postgresREL_18_3을 사용합니다. #98306 (Konstantin Bogdanov).- glibc malloc의 비효율적인 메모리 회수 동작으로 인한 RSS 누적을 방지하기 위해 UBSan 빌드에서 jemalloc allocator를 활성화했습니다. #98444 (Alexey Milovidov).
- parser combinator 라이브러리로 인한 심볼 이름 비대화를 줄이기 위해 Rust v0 심볼 맹글링을 사용하고 PRQL 라이브러리에서 내부 심볼을 제거했습니다. #98446 (Alexey Milovidov).
tests/benchmarks에 TPC-H 벤치마크 스위트와 TPC-DS README를 추가했습니다. #98495 (Raufs Dunamalijevs).- 99개 TPC-DS 쿼리 전체에 대한 정합성 테스트를 추가했습니다. #99204 (Raufs Dunamalijevs).
- 오프라인 레플리카 버그가 있는 DDL CREATE TABLE + ALTER를 재현하는 통합 테스트를 추가하고, 이를 예상된 실패로 표시했습니다 (#44070). #99259 (Raufs Dunamalijevs).
je_prefix를 사용하도록 jemalloc을 통합하고 링커의 —wrap 사용을 제거했습니다. #99342 (Azat Khuzhin).
하위 호환되지 않는 변경 사항
- 모든 삽입에 대해 기본적으로 중복 제거가 활성화됩니다. 이전에는 비동기 삽입과 MV’s에는 비활성화되어 있었고, 동기 삽입에는 활성화되어 있었습니다. 목적은 두 삽입 방식의 기본값을 동일하게 맞추는 것입니다. 클러스터에서 중복 제거를 명시적으로 비활성화한 경우, 기존 동작을 유지하려면
deduplicate_insert='backward_compatible_choice'를 명시적으로 설정해야 합니다.deduplicate_blocks_in_dependent_materialized_views도 마찬가지입니다. #95970 (Sema Checherinda). - 통계 저장 포맷이 개선되었습니다. 이제 모든 통계가 단일 파일에 저장됩니다. #93414 (Anton Popov). 테이블 통계를 명시적으로 활성화하지 않았다면 이 항목은 무시해도 됩니다.
- S3(Azure)Queue의 인메모리 메타데이터를 제한합니다. 시스템 테이블 이름이
azure_queue에서azure_queue_metadata_cache로,system.s3queue에서s3queue_metadata_cache로 변경되었습니다. #95809 (Kseniia Sumarokova). - 이전에는
Variant컬럼에 함수를 적용할 때 Variant 하위 유형이 해당 함수와 호환되지 않으면 아무 경고 없이 NULL을 반환했지만, 이제는 예외를 발생시키므로 이러한 NULL 동작에 의존하던 쿼리가 중단될 수 있습니다. #95811 (Bharat Nallan). - PostgreSQL의
DATE컬럼은 이제 ClickHouse에서Date32로 추론됩니다(이전 버전에서는Date로 추론되었고, 이로 인해 좁은 범위를 벗어나는 값에서 오버플로우가 발생했습니다). 이제Date32값을 PostgreSQL에 다시 삽입할 수 있습니다. #73084를 해결합니다. #95999 (Alexey Milovidov). do_not_merge_across_partitions_select_final설정의 의미가 더 명확해졌습니다. 이전에는 구성 파일에서 이 설정을 명시적으로 지정하지 않더라도 해당 기능이 자동으로 활성화될 수 있었습니다. 이로 인해 반복적으로 혼란이 발생했고, 안타깝게도 프로덕션 환경에서 몇 가지 문제로 이어졌습니다. 이제 규칙은 더 단순합니다.do_not_merge_across_partitions_select_final=1이면 이 기능이 무조건 활성화됩니다.do_not_merge_across_partitions_select_final=0이면 새로운 설정enable_automatic_decision_for_merging_across_partitions_for_final=1일 때만 자동 결정이 사용되며, 그렇지 않으면 사용되지 않습니다. 기존 동작을 최대한 유지하기 위해 기본값은do_not_merge_across_partitions_select_final=0및enable_automatic_decision_for_merging_across_partitions_for_final=1로 설정되었습니다. #96110 (Nikita Taranov).- 명시적으로 컬럼을 지정해 S3 테이블을 생성할 때, 이제 ClickHouse는 해당 컬럼 이름이 원격 파일의 스키마(schema)에 실제로 존재하는지 검증합니다. 이전에는 컬럼 이름이 일치하지 않아도 작동하던 쿼리가 이제는 테이블 생성 시점에 실패합니다. 이 변경으로 #96089가 해결되었습니다. #96194 (Konstantin Vedernikov).
- ORDER BY 및 기타 테이블 키 표현식에서 서브쿼리 사용을 금지합니다. #96847 (Alexey Milovidov).
- 기본적으로
apply_row_policy_after_final을 활성화합니다. 원래는optimize_move_to_prewhere_if_final=0일 때 ROW POLICY와 PREWHERE가 모두 FINAL을 준수하며 FINAL 이후에 적용되었습니다. 하지만 #87303에서 ROW POLICY filter에 대해서는optimize_move_to_prewhere_if_final이 무시되면서 이 동작이 깨졌습니다. 이를 해결하기 위해 이 PR에서는 #91065에서 도입된apply_row_policy_after_finalsetting을 활성화합니다.apply_row_policy_after_final이 활성화되면 ROW POLICY는 이전과 마찬가지로 기본적으로 계속 FINAL을 준수합니다. 이 PR은optimize_move_to_prewhere_if_final=1일 때의 동작을 변경하므로 하위 호환되지 않는 변경입니다. 이제 ROW POLICY를 FINAL 이전에 적용하려면optimize_move_to_prewhere_if_final대신apply_row_policy_after_final을 사용해야 합니다. #97279 (Nikolai Kochetov). Date유형은 이제 Arrow/ArrowStream 포맷에서uint16대신 Arrow의 네이티브date32유형으로 직렬화됩니다. 이제 PyArrow와 같은 도구는 해당 컬럼을 날짜 유형으로 올바르게 인식합니다. 이전 동작은output_format_arrow_date_as_uint16설정으로 복원할 수 있습니다.Date컬럼에uint16을 사용한 이전 Arrow 파일을 읽는 기능도 계속 지원됩니다. #96860 (Alexey Milovidov).
새로운 기능
- 이제 ClickHouse에서 ClickStack(관측성 UI)을 직접 사용할 수 있어 디버깅과 로컬 개발에 유용합니다. #96597 (Aaron Knudtson).
- 인증 메서드로 TOTP(시간 기반 일회용 비밀번호)를 지원합니다. #71273 (Vladimir Cherkasov).
lazy_load_tables데이터베이스 설정을 추가했습니다. 활성화되면 데이터베이스 시작 시 테이블을 로드하지 않고, 대신 경량StorageTableProxy가 생성되며 실제 테이블 엔진은 처음 접근할 때 구체화됩니다. #96283 (xiaohuanlin).- 타임아웃이 발생하면 데이터 블록을 내보내도록
input_format_max_block_wait_ms설정을 추가하고, HTTP connection이 예기치 않게 종료되어도 남은 데이터를 처리할 수 있도록 했습니다. #94509 (Mostafa Mohamed Salah). - Google BigLake 카탈로그 통합. 이로써 #95339가 해결됩니다. #97104 (Konstantin Vedernikov).
- 사용 가능한 모든 토크나이저를 표시하는 시스템 테이블(system table)
system.tokenizers가 추가되었습니다. #96753 (Robert Schulze). - UDF의 로딩 상태와 구성을 모니터링할 수 있도록 새 시스템 테이블(system table)
system.user_defined_functions을 추가했습니다. #90340 (Xu Jia). malloc_stats_print를 통해 jemalloc로 빌드된 서버의 메모리 사용량을 진단할 수 있도록, jemalloc 메모리 할당자 통계를 노출하는system.jemalloc_stats테이블을 추가했습니다. 또한 이러한 통계를 대화형으로 시각화할 수 있도록 ClickHouse HTTP 인터페이스에/jemalloc.htmlHTTP 엔드포인트를 추가했습니다. #97077 (Antonio Andelic).- jemalloc 힙 프로파일을 읽고 분석하기 위한
system.jemalloc_profile_text테이블이 추가되었습니다. 출력 형식은jemalloc_profile_text_output_format설정으로 제어됩니다(raw, symbolized 또는 collapsed이며, 기본값은 collapsed). 인라인 프레임 해상도는jemalloc_profile_text_symbolize_with_inline으로 제어됩니다(활성화되면 심볼화 속도가 느려지는 대신 인라인 프레임이 포함되고, 비활성화되면 더 빠른 출력을 위해 인라인 프레임을 건너뜁니다). collapsed 포맷의 경우jemalloc_profile_text_collapsed_use_count는 스택 가중치를 live allocation count(true) 기준으로 할지, live bytes(false, 기본값) 기준으로 할지 제어합니다. 이를 통해 jemalloc 힙 프로파일에 대한 메모리 프로파일링과 flame graph 시각화가 한층 쉬워집니다. #93248을 수정했습니다. #97218 (Antonio Andelic). default_dictionary_database설정이 추가되었습니다. 이 설정을 사용하면 ClickHouse가 데이터베이스 한정자 없이 참조된 외부 딕셔너리를 지정된 기본 데이터베이스에서 해석할 수 있습니다. 이를 통해 XML로 정의된 전역 딕셔너리에서 SQL로 정의된 데이터베이스별 딕셔너리로의 마이그레이션이 간소화되며, 기존 딕셔너리 쿼리(예:dictGet('name', …))를 수정하지 않고도 계속 사용할 수 있습니다. #91412 (Dmitrii Plotnikov).DatabaseReplicated에서 보조 Zookeeper를 지원합니다. #91683 (RinChanNOW).- 새로운 테이블 함수
primes와 소수를 오름차순으로 포함하는 새로운 시스템 테이블(system table)system.primes를 구현했습니다. #90839를 해결했습니다. #92776 (Nihal Z. Miaji). - Async inserts는 병렬 quorum을 지원합니다. 삽입된 데이터는 quorum까지 복제됩니다. 중복이 발견되면 이전에 삽입된 데이터도 복제될 때까지 쿼리는 대기합니다. #93356 (Sema Checherinda).
- sRGB와 OKLAB 사이에서 값을 상호 변환하는 함수
colorOKLABToSRGB,colorSRGBToOKLAB가 추가되었습니다. #93361 (Pranav Tiwari). - 새로운
deduplicate_insert설정이 추가되었으며, 이 설정은insert_deduplicate및async_insert_deduplicate보다 우선 적용됩니다. #94413 (Sema Checherinda). - 서버 설정
insert_deduplication_version으로 통합된 중복 제거 해시 기반 마이그레이션이 가능해졌습니다. #95409 (Sema Checherinda). xxh3_128해싱 함수를 추가했습니다. #96055 (Raúl Marín).- 결과 파트를 커밋하지 않고 머지를 시뮬레이션할 수 있는
OPTIMIZE <table> DRY RUN PARTS <part names>쿼리가 추가되었습니다. 이 기능은 테스트 용도로 유용합니다. 예를 들어 새 버전에서 머지의 정확성을 검증하고, 머지 관련 버그를 결정적으로 재현하며, 머지 성능을 신뢰성 있게 벤치마크할 수 있습니다. #96122 (Anton Popov). - 테이블에서 사용 중인 이름이 지정된 컬렉션이 삭제되는 것을 방지하기 위해,
check_named_collection_dependencies설정으로 기본 활성화되는 새 검사를 추가했습니다. #96181 (Pablo Marcos). - 서버에 있는 기존 failpoint와 각 failpoint의 활성화 여부를 확인할 수 있도록
system.fail_points가 추가되었습니다. 이는 테스트 자동화에 도움이 됩니다. #96762 (Pedro Ferreira). - Glue catalog에 역할 기반 접근이 추가되었습니다.
aws_role_arn설정을 사용하고, 필요에 따라aws_role_session_name도 사용할 수 있습니다. #90825 (Antonio Andelic). add_minmax_index_for_temporal_columns설정이 추가되었습니다. 이 설정을 활성화하면 모든Date,Date32,Time,Time64,DateTime,DateTime64컬럼에 대해 MinMax 인덱스를 자동으로 생성합니다. #93355 (Michael Jarrett).- JOIN을 위한 확장 테이블 별칭을 지원합니다(
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b와 같은 쿼리). #95131을 종료했습니다. #95331 (Yarik Briukhovetskyi). - Iceberg 테이블에서
ALTER TABLE RENAME COLUMN이 지원되도록 추가되었습니다. 이전에는ADD COLUMN, DROP COLUMN, and MODIFY COLUMN만 지원되었습니다. #97455 (murphy-4o).
실험적 기능
- 텍스트 인덱스가 이제 일반 제공됩니다. #96794 (Robert Schulze).
- 양자화된 비트 패킹 벡터 저장(근사 최근접 이웃 검색에 사용됨)을 위한
QBit데이터 타입이 이제 일반 제공되며, 더 이상 실험적 설정을 활성화할 필요가 없습니다. #95358 (Raufs Dunamalijevs). - 이제 ClickHouse의 벡터 검색은 클러스터의 레플리카를 사용해 부하를 분산 하고 벡터 인덱스 파트에 대한 검색도 분산할 수 있습니다. 이를 통해 ClickHouse는 단일 VM의 메모리 용량을 초과하는 대규모 벡터 인덱스를 지원할 수 있습니다. #95876 (Shankar Iyer).
ast_fuzzer_runs및ast_fuzzer_any_query설정으로 제어되는 서버 측 AST 퍼저를 추가했습니다. 활성화하면 서버는 각 쿼리를 정상적으로 실행한 뒤, 해당 쿼리에 무작위 뮤테이션을 적용한 쿼리를 실행하고 결과는 버립니다. #97568 (Alexey Milovidov).- 실험적 KQL 방언에
iif함수를 추가했습니다. #94790 (happyso). - 이제 스키마 추론은
allow_experimental_nullable_tuple_type설정을 반영합니다. 활성화하면 추론된 튜플 타입이Nullable(Tuple(...))가 될 수 있으므로, 누락된 중첩 객체는NULL요소로 이루어진 튜플이 아니라NULL이 될 수 있습니다. #95525 (Nihal Z. Miaji). - 이제
use_statistics_cache설정이 기본적으로 활성화되므로, 컬럼 통계가 메모리에 캐시되어 각 파트에서 다시 로드하지 않아도 쿼리 최적화 속도가 빨라집니다. #95950 (Han Fei).
성능 개선
- 기본 키의 모든 결정적 표현식을 데이터 스키핑에 사용할 수 있습니다(예:
ORDER BY cityHash64(user_id)/ORDER BY length(user_id)). 결정적 표현식의 경우 ClickHouse는 쿼리 상수에 해당 표현식을 적용하고, 그 결과를=,IN,has와 같은 프레디케이트에 대해 기본 키 인덱스에서 사용할 수 있습니다. 표현식이 추가로 단사적이기도 하면(예:ORDER BY hex(p)또는ORDER BY reverse(tuple(reverse(p), hex(p)))), 부정된 형태인!=,NOT IN,NOT has에도 인덱스를 효과적으로 사용할 수 있습니다. #10685를 해결합니다. #82161를 해결합니다. #92952 (Nihal Z. Miaji). - 통계 저장 형식을 개선했습니다. 이제 모든 통계가 하나의 파일에 저장됩니다. #93414 (Anton Popov).
- 파일 시스템 캐시에서 원격 테이블 엔진/함수의 병렬 읽기를 허용합니다. #71781 (Kseniia Sumarokova).
- 로컬 파일과 객체 스토리지 테이블 함수에서 사용자 공간 페이지 캐시를 사용할 수 있게 했습니다. #77874 (Michael Kolupaev).
- 사용자 공간 페이지 캐시에서 불필요한 memcpy를 제거했습니다. #77884 (Michael Kolupaev).
concurrent_threads_scheduler의 기본값이 이제fair_round_robin대신max_min_fair로 변경되었습니다. 이 변경으로 할당된 슬롯 수가 적은 쿼리를 우선 처리해 높은 부하 상황에서도 공정성이 향상되며, 그 결과 짧게 실행되는 쿼리가 오래 실행되는 쿼리 때문에 불이익을 받지 않게 됩니다. #95300 (Sergei Trifonov).FINAL쿼리가 필터링에 기본 키(primary key) 조건을 사용하고 다른 조건에는 스킵 인덱스를 사용하는 경우, 이제PrimaryKeyExpand처리 단계에서는 초기에 선별된 기본 키 범위에 대해서만 교차 여부를 확인합니다. #94903 (Shankar Iyer).- 이제
s3(...)와 같은 테이블 함수에 병렬 레플리카를 사용할 때, 테이블 함수를 감싸는 단일 서브쿼리가 포함된 쿼리도 레플리카 전체에 자동으로 병렬화됩니다. 이전에는 테이블 함수를 직접 참조하는 경우에만 병렬화되었습니다. #92264를 해결했습니다. #96332 (phulv94). - 캐시에 있는 데이터와 시스템 파일을 별도의 세그먼트로 나눌 수 있도록 했습니다. #87834 (MikhailBurdukov).
- 일부 해시 조인 작업에서
ColumnVector::replicate에 동적 디스패치를 구현해 성능을 개선했습니다. #79573 (Raúl Marín). - 복잡한 프레디케이트가 있는 경우 병렬 해시 조인의 성능이 개선되었습니다. 이전에는 조인되지 않은 행을 하나의 스레드에서 처리했는데, 이는 비효율적이었습니다. 이번 최적화는 조인되지 않은 행 처리를 여러 스레드에 걸쳐 병렬화하는 것입니다.
parallel_non_joined_rows_processing설정으로 전환할 수 있습니다. 기본적으로 활성화되어 있습니다. #92068 (Yarik Briukhovetskyi). - JSON 타입 파싱 성능을 약간 개선했습니다. #93614 (Pavel Kruglov).
- AST의 메모리 사용량을 개선했습니다. 하이라이팅을 사용하지 않고 VALUES 파싱도 없는 경우에는 필드를 사용하지 않으므로, 이 최적화는 의미가 있습니다. #93974 (Ilya Yatsishin).
- named Tuple AST 객체의 메모리 사용량을 최적화했습니다. 컬럼 이름을 일반 AST 리터럴 노드에 두는 대신 tuple 객체 내 문자열로 배치했습니다. #94704 (Ilya Yatsishin).
- 추가 링커 옵션으로 디버추얼라이제이션이 개선되었습니다. #94737 (Nikita Taranov).
- ZooKeeper 요청을 배칭해 파트가 많은 ReplicatedMergeTree 테이블의 레플리카 클론 성능을 개선했습니다. #94847 (c-end).
- 읽기 단계에 이미 PREWHERE 필터가 있으면 새 필터를 추가할 수 없었습니다. 이번 변경으로 PREWHERE 최적화를 JOIN 런타임 필터 최적화 이후로 미뤄, 런타임 필터도 PREWHERE로 푸시할 수 있게 했습니다. #95838 (Alexander Gololobov).
- x86에서 동적 디스패치를 사용해
T64코덱 압축 성능을 개선했습니다. #95881 (Raúl Marín). - 가능한 경우(NULL이 아니고,
-If가 아니며, GROUP BY가 없고, IPv6나 String이 아닌 경우) 삽입을 배칭하여 숫자 타입에 대한uniq를 더 빠르게 처리합니다. #95904 (Raúl Marín). - Keeper를 위한 저수준 최적화:
ZooKeeper::observeOperations가 ZooKeeper 수신 스레드 CPU 사용량의 >20%를 차지하는 것으로 확인되었습니다. 이번 변경에서는 이를 다음과 같이 개선했습니다. 1.AggregatedZooKeeperLog::stats에는SipHash대신 10배 이상 더 빠른CityHash64를 사용합니다. 2.Coordination::ErrorCounter에는std::unordered_map과std::mutex대신std::array<std::atomic<UInt32>, N>를 사용합니다. #95962 (Miсhael Stetsyuk). - 메모리 절약을 위해 ProfileEvents::Counter의 64바이트 정렬을 제거했습니다. #96097 (Azat Khuzhin).
- 메모리 최적화:
CachedOnDiskReadBufferFromFile구조체 크기를 50배 줄였습니다. #96098 (Azat Khuzhin). - 비어 있는 해시 테이블의 크기를 조정할 때는 기존 데이터를 복사하지 않도록 했습니다. #96180 (Raúl Marín).
RIGHT OUTERJOIN에서도 JOIN runtime filters를 지원합니다. #96183 (Hechem Selmi).- 최적화 옵션
enable_join_runtime_filters가 이제 기본적으로 활성화됩니다. #89314 (Alexey Milovidov). - 이전에는 모든 파트에 구체화된 텍스트 인덱스가 있을 때만 텍스트 인덱스 직접 읽기 최적화가 적용되었습니다. 이 PR에서는 부분 지원이 추가되었습니다. 즉, 일부 파트에 구체화된 텍스트 인덱스가 있으면 해당 파트에서는 이를 사용하고, 구체화된 텍스트 인덱스가 없는 파트에서는 원래 필터 표현식을 실행하는 방식으로 처리됩니다. #96411 (Anton Popov).
- 필터링 속도를 높이기 위해 시스템 로그 테이블의 시간 컬럼에
minmax보조 인덱스를,query_id/initial_query_id컬럼에bloom_filter인덱스를 추가했습니다. #96712 (Alexey Milovidov). - 이제 지연 머티리얼라이즈 최적화가
UNION ALL쿼리의 첫 번째 분기뿐 아니라 모든 분기에 적용됩니다. 이제 서로 다른MergeTree테이블에서 정렬 및 LIMIT가 적용된 여러 읽기를UNION ALL로 결합하는 쿼리는 모든 분기에서 컬럼 읽기를 지연할 수 있어 I/O가 줄어듭니다. #96832 (Federico Ginosa). - 불필요한 데이터 복사를 제거하고 숫자 컬럼에 벡터화된 최소/최대 계산을 적용해 INSERT 시 minmax 스킵 인덱스 계산을 최적화했습니다. #97392 (Raúl Marín).
- 스토리지
DeltaLake가 이제 delta lake 메타데이터의count()결과를 사용해 system.tables에 정확한 테이블 통계(총 바이트 수/행 수)를 표시합니다. #96190 (Kseniia Sumarokova). - 사용되지 않는 컬럼은 MergeTree에서 읽을 때 읽기 단계에서도 제거됩니다. 이는 특히 필터가
PREWHERE로 푸시다운될 때 유용합니다. #89982 (János Benjamin Antal). - 테이블 이름만 가져오도록
SHOW TABLES쿼리 처리를 개선하고, getLightweightTablesIterator가 테이블 이름만 포함된 구조를 반환하도록 개선했습니다. #93835를 해결합니다. #94467 (Smita Kulkarni). - 키 컬럼이 이러한 함수로 감싸진 경우에도 범위 프레디케이트에서 프라이머리 키(primary key) 및 스킵 인덱스 프루닝을 사용할 수 있도록
assumeNotNull,coalesce,ifNull을 개선했습니다. #94689를 해결합니다. #94754 (Nihal Z. Miaji). - getChildren Keeper 요청에 with_data 및 with_stat 확장 기능을 추가했습니다. 이제 단일 작업으로 자식 목록뿐만 아니라 각 항목의
stat및/또는data도 함께 가져올 수 있습니다. #94826 (Nikolay Degterinsky). - 최종적으로 로컬 계획을 실행하든 병렬 레플리카가 포함된 계획을 실행하든 관계없이, 인덱스 분석은 (대부분의 경우) 한 번만 수행됩니다. #94854 (Nikita Taranov).
- 파트 수(
distributed_index_analysis_min_parts_to_activate)와 인덱스 크기(distributed_index_analysis_min_indexes_size_to_activate)에 따라 분산 인덱스 분석을 활성화할 수 있도록 했습니다. #95216 (Azat Khuzhin). - Iceberg 테이블에서 PREWHERE 최적화를 사용할 수 있도록 했습니다. #95476 (Konstantin Vedernikov).
- 일부 AST 클래스의 메모리 점유량을 줄였습니다. #95514 (Raúl Marín).
split_intersecting_parts_ranges_into_layers를 활성화했을 때 생성되는 pipeline 스트림 수를 제한합니다. 과도한 메모리 사용을 방지하는 데 도움이 됩니다. #96478 (Nikita Taranov).- 다중 조인에 대해 equivalent sets 최적화를 구현했습니다. 이제 여러 개의 연속된
INNER JOIN연산이 있는 쿼리는 개선된 필터 푸시다운 최적화의 이점을 누릴 수 있습니다. 테이블이 동등한 컬럼을 기준으로 조인되는 경우(예:t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), 체인 내 어느 테이블에 적용된 필터든 자동으로 모든 테이블에 푸시다운됩니다. #96550을 해결했습니다. #96596 (Vladimir Cherkasov). - delta lake 메타데이터 스캔을 최적화했습니다. delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827의 변경 사항을 반영했습니다. #96686 (Kseniia Sumarokova).
- 복제된 데이터베이스에서 더미 쿼리가 실행될 때마다 캐시된 클러스터를 업데이트하지 않도록 개선했습니다. #96897 (Tuan Pham Anh).
- 접두사가 ASCII 문자로만 이루어진 경우
startsWithUTF8로 필터링할 때 기본 키 인덱스를 사용합니다. #97055 (vkcku).
개선 사항
- Keeper 요청에 OpenTelemetry 추적 기능을 추가했습니다. #91332 (Miсhael Stetsyuk).
- ClickHouse 시작 시와 종료 시의 콘솔 로그 수준을 각각 재정의할 수 있는 새로운 구성 옵션:
logger.startup_console_level및logger.shutdown_console_level. #95919 (Garrett Thomas). - 구성을 다시 로드할 때 명령줄 재정의 사항을 적용합니다. #80294를 해결합니다. #80295 (Alexey Milovidov).
mongodb테이블 함수에서 명명된 컬렉션 매개변수의 키-값 재정의를 허용합니다. #89616 (vanchaklar).- 이제 Iceberg 테이블의 읽기 순서 최적화는 단순한 컬럼 참조뿐 아니라
icebergBucket,icebergTruncate와 같은 복잡한 정렬 함수에도 적용됩니다. #90256 (Konstantin Vedernikov). - 진단을 개선하기 위해 system.mutations에 parts_postpone_reasons라는 새 컬럼을 추가했습니다. 이 컬럼은 파트가 연기되는 사유를 보여줍니다. #92206 (Shaohua Wang).
DataflowStatisticsCache에서 읽어야 할 행 수의 변화를 추적합니다(삽입/삭제 또는 쿼리 조건 캐시 사용으로 인해 발생). #93636 (Nikita Taranov).- SYSTEM RESET DDL WORKER [ON CLUSTER] 쿼리를 지원합니다. 이 쿼리는 DDLWorker의 메인 스레드에 상태 재설정을 요청합니다. host ID가 업데이트될 때 레플리카 활성 상태를 갱신하는 데 유용합니다. #93780 (Tuan Pham Anh).
MUTATE_PART및MUTATE_PART_START이벤트 유형에 대해system.part_log에서mutation_ids를 지원하도록 했습니다. #93811 (Shaohua Wang).- 이제 백그라운드 작업(Mutate, Merge)은 ‘background’ 프로필로 일반 쿼리와 분리해 독립적으로 설정할 수 있습니다. 이전에는 이러한 작업이 ‘default’ 프로필을 통해 일반 쿼리와 같은 설정을 사용했습니다. #93905 (Arsen Muk).
system.crash_log에 더 자세한 정보를 추가했습니다. #94112 #95857 (Miсhael Stetsyuk).- 실행 중인 비내부 쿼리 수를 추적하기 위해 새로운
QueryNonInternal메트릭이 추가되었습니다. 이 메트릭은ClickHouseMetrics_QueryNonInternal로 노출되며, 비내부 쿼리에만 적용되는max_concurrent_queries제한에 대해 쿼리 동시성을 모니터링하는 데 도움이 됩니다. #94284 (Ashwath Singh). RuntimeDataflowStatisticsCacheUpdater에서 compact part의 컬럼에 대한 입력 바이트 통계 수집을 지원합니다. #94626 (Nikita Taranov).- Keeper의 잘못된 구성으로 인해 클러스터 구성에 실패하는 문제를 확인하는 검사를 추가했습니다. #60932를 해결합니다. #94682 (Konstantin Bogdanov).
- 파트 로딩 시 JSON 프리픽스 역직렬화를 개선했습니다. #94848 (Pavel Kruglov).
- 대상 테이블의 materialized view가 트리거되도록 전체 INSERT 파이프라인을 사용해 쓰기 경로를 리팩터링했습니다. #94890 (Kai Zhu).
- 벡터 유사도 검색 계획 최적화는 검색 대상 컬럼에 인덱스가 있는 경우에만 적용됩니다. #94998 (Eduard Karacharov).
- 사용자 인증 전에 총 메모리 한도를 확인하고, 총 한도가 허용치를 초과하면
(total) memory limit exceeded오류를 발생시킵니다. #95003 (Nikolai Kochetov). throw_on_unmatched_row_policies구성 옵션이 추가되었습니다. 이 옵션을 활성화하면 사용자가 행 정책(row policies)이 있는 테이블(table)을 쿼리할 때 해당 사용자에게 적용되는 정책이 하나도 없으면 예외를 발생시킵니다. 이를 통해 access control 구성 오류로 인해 모든 행이 반환되는 모호한 동작을 방지합니다. #95014 (Vitaly Baranov).- Unity Catalog을 사용하는 장기 실행 쿼리에서 S3 액세스 토큰을 동적으로 갱신합니다. 이로써 #93981이 해결되었습니다. #95069 (Konstantin Vedernikov).
- ClickHouse가
memory_worker_decay_adjustment_period_ms밀리초 동안 지속적으로 메모리 압박을 받으면 jemalloc의 더티 페이지 감쇠를 비활성화합니다. ClickHouse가 동일한 시간 동안 정상 상태로 동작하면 jemalloc의 더티 페이지 감쇠를 다시 활성화합니다. #95145 (Antonio Andelic). - s3Queue의
keeper_path설정을 사용하는 S3Queue용 보조 Zookeeper 지원. #95203 (Diego Nieto). - TTL 삭제 파트 병합에서
max_parts_to_merge_at_once를 준수하도록 했습니다. #95315 (Kseniia Sumarokova). - 물리적 연결을 반영할 수 있도록 query_log에
connection_address와connection_port를 추가합니다(address와port는 프록시를 통해 연결되고 auth_use_forwarded_address=1이 설정된 경우 대체됨). #95471 (Yakov Olkhovskiy). - 쿼리 조건 캐시의 잘못된 메모리 사용량 계산을 수정했습니다. 핵심 문제는 여러 문자열(예: part_name, 테이블 ID, 전체 SQL 조건)로 구성된 캐시 키를 고려하지 않았다는 점이었습니다. #95478 (Nikita Mikhaylov).
- 내장 구성으로 시작한 서버에서는 일반 구성과 마찬가지로 사용자와 권한 부여를 관리하고 이를
access디렉터리에 저장할 수 있습니다. 이로써 테스트가 더 용이해집니다. 또한 내장 구성과 clickhouse-local에서 모든 access_control_improvements를 활성화했습니다. #95481 (Alexey Milovidov). - 액세스가 거부될 경우 자격 증명을 확인하라는 안내를 포함하도록 S3 authentication 오류 메시지를 개선했습니다. #95648 (Gerald Latkovic).
- 통계 캐시를 활성화하고 캐시 업데이트 주기를 300초로 설정했습니다. #95841 (Han Fei).
system.aggregated_zookeeper_log에 컴포넌트 이름을 추가했습니다. #95882 (Antonio Andelic).system.tables에서DeltaLake테이블을 조회할 때 객체 스토리지 읽기를 생략합니다. #95899 (Antonio Andelic).compatibility설정이26.2이상인 경우, 기본적으로enable_max_bytes_limit_for_min_age_to_force_merge가 활성화됩니다. #95917 (Christoph Wurm).- 이제 macOS에서 Delta Lake를 사용할 수 있습니다. #95979를 해결합니다. #95985 (Alexey Milovidov).
- 이전 버전에서는 UPDATE 및 RENAME COLUMN과 충돌하는 ALTER 표현식을 함께 사용할 때, 적절한 예외 대신 논리 오류가 발생했습니다. #70678을 해결했습니다. #96022 (Alexey Milovidov).
- 모든 ClickHouse 애플리케이션의 도움말 출력을 개선하고, 몇 가지 수정 사항과 함께
--no-sudo옵션을 추가했습니다. 이는 Ilya Yatsishin이 진행한 #58244의 후속 작업입니다. #96025 (Alexey Milovidov). - 다른 모든 거리 함수에 이미 이런 형식의 alias가 있으므로
cosineDistance의 alias로distanceCosine을 추가했습니다. #96065 (Raufs Dunamalijevs). with_dataKeeper 확장 기능을 지원하여 Database Replicated에서 테이블 가져오기를 개선했습니다. #96090 (Nikolay Degterinsky).- chdig를 v26.2.1로 업데이트했습니다(새 기능 추가 및 MacOS 지원). #96113 (Azat Khuzhin).
numbers및primes의 filter pushdown을 개선했습니다. 이제 ClickHouse는 정확한 범위를 추론할 수 없는 경우에도WHERE조건에서 보수적인 값 범위를 추론하고, 그에 따라 시퀀스 생성을 제한할 수 있습니다(예를 들어WHERE number % 5 < 2 AND number > 100 AND number < 300의 경우 ClickHouse는 100에서 300 사이의 숫자만 생성한 뒤 프레디케이트를 적용함). 이를 통해 무제한 스캔을 방지합니다. #84853를 해결했습니다. #93913를 해결했습니다. #96115 (Nihal Z. Miaji).- 이전에는 파싱 모호성을 해소하기 위해
COMMENT절이 있으면 formatter가 SELECT를 괄호로 감쌌습니다. 이제는 괄호 없이도 모호성이 없도록AS SELECT앞에COMMENT를 출력합니다. #96293 (Alexey Milovidov). allow_impersonate_user구성 설정은 이제 독립적인 server setting이 아니라access_control_improvements섹션 내에 위치합니다. #96451 (Vitaly Baranov).core_dump.size_limit구성 설정을 핫 리로드할 수 있도록 개선하여, 구성 변경 사항을 적용하기 위해 server를 다시 시작할 필요가 없게 했습니다. #96524 (Miсhael Stetsyuk).- socket timeout 발생 시 CPU 및 실시간 프로파일러의 상호 운용성을 개선합니다. #96601 (Sergei Trifonov).
- DROP COLUMN mutation 직후 ADD COLUMN을 빠르게 실행할 때 삭제된 데이터가 다시 되살아나는 현상을 방지합니다. #96713 (Alexey Milovidov).
system.instrumentation의function_id타입을 LowCardinality(Int32)에서 Int32로 변경했습니다. #96726 (Copilot).- 뮤테이션을 동기적으로 기다리는 경우 쿼리 취소와 시간 제한이 적용됩니다. #96756 (Alexey Milovidov).
- 디버깅에 유용할 수 있는 delta-kernel 로깅을 변경할 수 있도록 시스템 명령
SYSTEM RELOAD DELTA KERNEL TRACING <level>을 추가했습니다. #96763 (Kseniia Sumarokova). - IP 주소 패밀리별 필터링, 즉
dns_allow_resolve_names_to_ipv4/ipv6설정은 DNS 캐시가 비활성화되어 있어도 적용됩니다. #96810 (c-end). - jemalloc 내부 검사 개선. #96840 (Azat Khuzhin).
/playWeb UI에서 시스템 테이블을 쿼리할 때QUERY_CACHE_USED_WITH_SYSTEM_TABLE오류가 발생하던 문제를 수정했습니다. #96869 (Alexey Milovidov).- Web UI 개선: 실행 중인 쿼리 상태를 나타내도록 파비콘을 변경하고, 조용히 무시하던 보조 쿼리(데이터베이스 및 테이블 로딩) 오류를 표시합니다. #85055를 닫습니다. #96883 (Alexey Milovidov).
- 데이터베이스 목록을 표시하거나 숨길 수 있도록
/playUI의 왼쪽 패널을 클릭할 수 있게 했습니다. #96884 (Alexey Milovidov). DROP DATABASE는 이제 종속성의 역순으로 테이블을 삭제하므로, 데이터베이스에 로딩 종속성이 있는 테이블(예:joinGet를 사용하는Distributed테이블)이 포함된 경우 크래시 안전성이 향상됩니다. #97057 (Alexey Milovidov).- 유효하지 않은 YAML이 건너뛰어지지 않도록 yaml-cpp 버전을 올렸습니다. #97333 (Azat Khuzhin).
play.html사이드바에서 테이블을 불러오는 동안 로딩 표시기를 보여줍니다. #97531 (Alexey Milovidov).- 내장 웹 UI(play.html)에 원본 쿼리 결과를 클립보드로 복사하는 버튼을 추가했습니다. #97532 (Alexey Milovidov).
- 더 다양한 경우에도 파싱할 수 있는 SQL을 생성하도록 쿼리 난독화기(
clickhouse-format --obfuscate)를 수정했습니다. #97584 (Alexey Milovidov).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- 메타데이터만 변경하는 ALTER 후, 예를 들어 Enum 요소를 확장한 경우 프로젝션을 활용한 집계 최적화 과정에서 예외가 발생할 수 있습니다. #84143 (Alexey Milovidov).
- 구체화된 뷰(Materialized View)는 이제 생성된 데이터베이스를 실행 컨텍스트로 사용합니다. 이는 다음을 의미합니다. - 뷰의 SELECT 쿼리에서 참조하는 이름에 대해 명시적인 데이터베이스 지정은 생략할 수 있습니다. - 명시적인 데이터베이스 지정이 없으면 구체화된 뷰가 생성된 동일한 데이터베이스를 사용하는 것으로 간주합니다. #88193 (Dmitry Kovalev).
- ON CLUSTER 사용 시 CREATE USER 인증 메서드에서 쿼리 매개변수 치환이 올바르게 이루어지도록 수정했습니다. 인증 메서드의 쿼리 매개변수(예: password)가 치환되지 않아 원격 노드에서 UNKNOWN_QUERY_PARAMETER 오류가 발생했습니다. #92777 (xiaohuanlin).
has,mapContainsKey,mapContainsValue함수의 텍스트 인덱스 분석에서 발생하던 불일치가 수정되었습니다. 이전에는 이러한 함수를 사용하는 쿼리가 표현식을 텍스트 인덱스로 평가하는지 여부에 따라 서로 다른 결과를 반환할 수 있었습니다. #93578 (Anton Popov).- 스택 언와인딩 과정에서
dropReplicationSlot이 예외를 throw할 때, 테이블을MaterializedPostgreSQL데이터베이스에 ATTACH하면 발생하던 크래시를 수정했습니다. #96871 (Alexey Milovidov). - 동일한 파일을 두고 경합하는 동시 백업을 많이 수행하면 server가 중단될 수 있었습니다. #93659 (Alexey Milovidov).
- 병렬 레플리카와 non-MT 테이블 간 JOIN을 수행하는 쿼리를 수정합니다. #92056를 해결합니다. #93902 (Igor Nikonov).
- 이름에 점이 포함된 Iceberg 컬럼의 값이 NULL로 반환되던 문제를 수정했습니다. #94335 (Mikhail Koviazin).
stringJaccardIndexUTF8의 UTF8 문자열 처리 방식을 수정하고 성능을 개선했습니다. #94613 (Joanna Hulboj).WITH FILL STALENESS에서 발생할 수 있는 오버플로우를 수정했습니다(이로 인해 UB 및/또는 무한 루프가 발생할 수 있음). 큰 점프 때문에 발생할 수 있는 무한 루프를 수정했습니다. 구 분석기 지원을 추가했습니다(주로 스트레스 테스트용). #94663 (Azat Khuzhin).- 호스트명이 여러 주소로 해석되고 원격 레플리카가 멈춘 경우 분산 쿼리가 멈춘 채로 남을 수 있는 문제를 수정했습니다. #94726 (c-end).
- 가장 왼쪽 테이블 표현식이
-Cluster테이블 함수일 때 여러 테이블 표현식을 조인하는 과정에서 잘못된 결과가 나오는 문제를 수정했습니다. #89996를 해결합니다. #94748 (Konstantin Bogdanov). toWeek,toYearWeek,toStartOfWeek,toLastDayOfWeek,toDayOfWeek가 포함된 프레디케이트에서 잘못된 기본 키(primary key) 및 스킵 인덱스 프루닝을 수정하고,LowCardinality(String)를 사용하는 유효한 쿼리에서 이러한 함수 일부가 발생시키던 예외를 수정했습니다. #94816 (Nihal Z. Miaji).- SQL Security가 설정된 뷰의
ATTACH쿨리에서 불필요한 permissions check 건너뛰기를 제거했습니다. 이를 통해 필요한 접근 권한을 검증하지 않은 상태에서 사용자가 definer가 있는 뷰를 attach할 때 발생할 수 있는 잠재적인 권한 상승을 방지합니다. #94865 (pufit). delete_tmp_*디렉터리가 동시에 제거되면서 발생하던ReplicatedMergeTree시작 시 크래시를 수정했습니다. #94892 (myeongjun).- materialized view가 있는 Iceberg 테이블에
INSERT할 때 중복 제거 정보가 유실되어 예외가 발생하던 문제를 수정했습니다. #94938 (Daniil Ivanik). SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>가 클러스터 전체의 쿼리 캐시를 삭제하던 버그를 수정했습니다. #94978 (Rory Crispin).- 수직 병합 후에도 상수 인덱스 세분화 수준(use_const_adaptive_granularity)을 유지합니다(Nested 수정이 포함된 v2이며, 전반적으로도 적용됩니다). #95013 (Azat Khuzhin).
- [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764) 이후 26.1 버전의 파일 시스템 캐시에서 발생한 경쟁 상태 문제를 수정했습니다. #95042 (Kseniia Sumarokova).
- clickhouse-client에서 KILL QUERY 및 쿼리 취소(Ctrl+C)로 postgresql() 테이블 함수를 취소할 수 없던 문제를 수정했습니다. #95136 (Roman Vasin).
- 여러 개의 조인에서
USING절을 사용할 때 원본 테이블의 한정된 컬럼에 대한 타입 추론을 수정했습니다. 이전에는 이후 조인이 해당 컬럼을 사용하지 않는 경우에도, 하위 원본 컬럼의 타입이 공통 상위 타입으로 잘못 갱신되었습니다(예:SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a)에서t2.a컬럼은 첫 번째 조인에서만 사용되므로, 그 타입은t3.a를 제외한t1.a와t2.a의 상위 타입이어야 합니다). 이로 인해 함수가 실제 실행 계획에 나타나는 타입과 다른 컬럼 타입을 예상할 경우 논리 오류나 충돌이 발생할 수 있었습니다. #95157 (Vladimir Cherkasov). - 매니페스트의 .avro 목록과 파일 내용을 가져올 때 컬럼 변환을 한 번만 수행하도록 수정했습니다. #95164 (Daniil Ivanik).
- 과도한 메모리 사용이나 잘못된 컬럼 통계를 초래할 수 있었던 JSON 컬럼 크기 계산 오류를 수정했습니다. #95207 (Azat Khuzhin).
- 경량 업데이트 후 대형 패치 파트를 적용할 때 메모리 사용량 집계가 부정확하던 문제를 수정했습니다. 이전에는 큰 패치를 적용하면 메모리를 과도하게 사용할 수 있었고, 그 결과 서버 프로세스가 OOM killer에 의해 종료될 수 있었습니다. #95231 (Anton Popov).
max_parallel_replicas를 사용하는 분산 쿼리가 인덱스 분석 중 로컬 레플리카로 폴백될 때 잘못된 결과나 예외를 일으킬 수 있던 정의되지 않은 동작을 수정했습니다. #95263 (Azat Khuzhin).group_by_overflow_mode를any로 설정한 경우sum및 시계열에서 희소 컬럼 집계가 올바르게 동작하도록 수정했습니다. #95301 (Mikhail Koviazin).plain_rewritable디스크 정책에서 메타데이터 파일을 unlink하는 도중 네트워크 오류가 발생하면 스토리지가 불일치 상태로 남을 수 있던 신뢰성 문제를 수정했습니다. #95302 (Mikhail Artemenko).- Iceberg에서 Date를 Date32로 대체합니다. #95322 (Konstantin Vedernikov).
redis테이블 함수의 비밀번호 인수는 이제 로그와 시스템 테이블(system tables)(예:query_log)에서 마스킹됩니다. #95325 (János Benjamin Antal).- 분산 쿼리가 해당 테이블을 대상으로 아직 실행 중인데도 테이블이 삭제되거나 변경되어 예외가 발생하거나 잘못된 결과가 반환될 수 있던 버그를 수정했습니다. #95356 (Azat Khuzhin).
- 분산 쿼리에서 음수
LIMIT/OFFSET를 사용할 때 일부 경우에 발생하던 논리 오류를 수정했습니다. #95357 (Nihal Z. Miaji). - ssh를 사용해 연결할 때 clickhouse-client가 비밀번호를 두 번 묻던 버그를 수정했습니다. #95372 (Isak Ellmer).
- storage S3(Azure)Queue의 데이터 레이스를 수정했습니다. #95385 (Kseniia Sumarokova).
- prewhere 내 람다 표현식으로 인해 발생한 필터 오류를 수정했습니다. #95395 (Xiaozhe Yu).
- 집계 인수가
Nullable인 경우optimize_syntax_fuse_functions가sum/count/avg를sumCount()로 재작성하지 않도록 수정했습니다. #95390을 해결합니다. #95441 (Nihal Z. Miaji). - 취소 시 분산 쿼리에서 발생할 수 있는 충돌을 방지했습니다. #95466 (Aleksandr Musorin).
- S3(Azure)Queue engine의 스트리밍 중복 제거를 수정했습니다. #95467 (Kseniia Sumarokova).
- 분산 쿼리에서 초기 사용자에게 할당된 행 정책이 업데이트되지 않던 문제를 수정했습니다. #95469 (Vitaly Baranov).
- plain_rewritable 위의 암호화된 디스크에 대한 검사 수정(동일한 객체 스토리지 prefix를 사용하는 여러 plain-rewritable 디스크를 등록할 수 없는
It is not possible to register multiple plain-rewritable disks with the same object storage prefix문제가 발생할 수 있는 현상을 수정합니다). #95470 (Azat Khuzhin). mergeTreeProjection테이블 함수에 접근 검사(access check)가 누락되어 있어, 테이블에 대한 SELECT 권한은 없지만 테이블 함수 권한은 있는 사용자가 해당 프로젝션에서 데이터를 읽을 수 있었습니다. 이번 수정으로mergeTreeIndex및mergeTreeAnalyzeIndexes에 이미 적용되어 있는 것과 동일한 접근 검사가 추가되었습니다. #95480 (Alexey Milovidov).- Dynamic/JSON 타입의 동적 서브컬럼에서 size 서브컬럼을 읽을 때 발생할 수 있는 논리 오류를 수정했습니다. #95573 (Pavel Kruglov).
- #94262에서 도입된 (Experimental) zero‑copy 복제의 회귀 문제를 수정했습니다. 이 문제로 인해 다른 레플리카가 공유 파트를 모두 가져오기 전에 해당 파트가 삭제될 수 있었습니다. #95597 (filimonov).
- JSON 배열에
tupleElement를 적용할 때 발생하는 충돌을 수정했습니다. #95581을 해결합니다. #95647 (Pavel Kruglov). - USING이 있는 JOIN의 VALUES 절에서 람다 함수 내부에 매처(
*)를 사용할 때 발생하던 논리 오류 예외를 수정했습니다. #93675를 해결했습니다. #95661 (Vladimir Cherkasov). - 분산 DDL을 기다리는 동안 복제된 데이터베이스를 동시에 삭제할 때 발생하던
There was an error: Cannot obtain error message논리 오류를 수정했습니다. #95539을 해결했습니다. #95664 (Alexander Tokmakov). transform_null_in이 활성화된 상태에서NULL값에 대해IN함수가 잘못된 결과를 반환하던 문제를 수정했습니다. #65776을 해결합니다. #95674 (Nihal Z. Miaji).- 설정
cast_keep_nullable가 활성화된 경우CAST에서 LowCardinality 널 허용 타입을 올바르게 처리하도록 수정했습니다. #95670을 해결했습니다. #95747 (Alexey Milovidov). - 파티션된 Delta Lake 데이터의 squashing 문제를 수정했습니다. #95773 (Kseniia Sumarokova).
- 런타임 필터의 널 허용 조인 컬럼에서 발생하던 경쟁 상태를 수정했습니다. #95775 (Hechem Selmi).
USING컬럼의 타입이 테이블과 SELECT 목록에서 서로 다를 때, matcher(*,table.*) 및analyzer_compatibility_join_using_top_level_identifier가 있는 쿼리에서 발생할 수 있는 논리적 오류를 수정했습니다. #90477를 해결했습니다. #95808 (Vladimir Cherkasov).- 작업 스케줄링 중 오류가 발생하면 예외가 발생할 수 있었던 병렬 스레드 풀 작업(백업, 집계, 분산 쿼리)의 메모리 안전성 버그를 수정했습니다. #95818 (Raúl Marín).
- 삭제 중인 워크로드를 사용하는 쿼리와 동시에 실행될 때
DROP WORKLOAD에서 발생하던 크래시를 수정했습니다. #95856 (Alexey Milovidov). - 여러 데이터베이스에 대해 제한된 권한만 가진 사용자가 시스템 테이블을 조회할 때 성능이 느려지는 문제를 수정했습니다. #89371을 해결합니다. #95874 (pufit).
- 중첩된 경로가 있는 JSON에 대해
tupleElement를 실행할 때 발생하던 문제를 수정했습니다. 이전에는 이 문제로 인해 잘못된 쿼리 결과가 나올 수 있었습니다. #95907 (Pavel Kruglov). - 빈 MergeTree 테이블에서
direct조인 알고리즘을 사용할 때 발생할 수 있는NOT_SUPPORTED오류를 수정했습니다. #95935 (Vladimir Cherkasov). - 클라이언트가 설정 별칭을 제안하거나 자동 완성하지 않던 문제를 수정했으며, #92190를 해결했습니다. #95945 (phulv94).
- system.asynchronous_metric_log의 event_date 문제를 수정했습니다. #95947 (Raúl Marín).
- JSON 데이터 타입의 경로 스키핑을 수정했습니다. 이전에는
JSON(SKIP path)를 사용하면 접두사path를 가진 모든 JSON 키가 스키핑되어"pathpath"같은 키까지 제외되었고, 그 결과 삽입 시 이러한 경로의 데이터가 손실될 수 있었습니다. 이제는"path"키만 스키핑되도록 수정되었습니다. #95948 (Pavel Kruglov). - 알 수 없는 프로젝션이 있는 파트를 영구 손실로 표시해서는 안 됩니다. #95952 (Mikhail Artemenko).
Nullable(String)키를 사용하는Join테이블에서 빈 문자열이NULL로 처리되던 문제를 수정했습니다. #71414을 해결했습니다. #96002 (Alexey Milovidov).- 이제 PostgreSQL engine이
BOOLEAN[]를 올바르게 읽을 수 있습니다. #72754를 해결했습니다. #96006 (Alexey Milovidov). - 빈 파일에서 읽을 때 발생하던
ProtobufList포맷 문제를 수정했습니다. #70059를 해결합니다. #96007 (Alexey Milovidov). - 빈 테이블에서 유령 레코드를 생성하던
ProtobufList포맷 문제를 수정했습니다. #72596를 해결합니다. #96010 (Alexey Milovidov). - 유형 추론 시 분산 쿼리와 PREWHERE가 함께 사용되는 드문 경우에
UInt64와Int32간if함수의 유형 불일치를 수정했습니다. #70017을 해결합니다. #96012 (Alexey Milovidov). Bool타입이 포함된JIT컴파일 쿼리 문제를 수정했습니다. #96013 (Alexey Milovidov).- SQLite TEXT 컬럼에서 UUID 컬럼을 읽을 때 발생하던 논리적 오류를 수정했습니다. #71263를 해결합니다. #96016 (Alexey Milovidov).
DateTime,Date,UUID및 기타 타입에 대한 SQLite engine의 형 변환 문제를 수정했습니다. #73481을 해결했습니다. #96017 (Alexey Milovidov).FixedString값이 외부 데이터베이스인 SQLite 및 PostgreSQL에 대한 쿼리에서 잘못 이스케이프되던 문제를 수정했습니다. #73519을 해결합니다. @jh0x와 공동 작성했습니다. #96019 (Alexey Milovidov).- 큰 PRECEDING 오프셋에서 발생하던 WindowTransform의 assertion failure를 수정했습니다. #75852를 해결했습니다. #96026 (Alexey Milovidov).
- 동시에 수행되는 async 삽입에서 동일한 매개변수 이름을 사용하지만 값은 서로 다른 경우 발생할 수 있는 데이터 손상 버그를 수정했습니다. #96035 (Seva Potapov).
- 전역 프로파일러의 주기(
global_profiler_real_time_period_ns및global_profiler_cpu_time_period_ns로 제어됨)를 수정했습니다. 설정된 값이 아니라 잘린 값이 사용되어 프로파일러가 의도한 것보다 더 자주 깨어나는 문제가 있었습니다. #96048 (Antonio Andelic). - 이전에는 position delete에 대한 Iceberg manifest 파일에서 항목에 reference data file이 존재하지만 null인 경우, 해당 data files의 올바른 범위를 가져오지 못했습니다. 이 PR은 이 버그를 수정합니다. #96061 (Daniil Ivanik).
- 기본 역할 해제 시 발생하던 문제를 수정했습니다. #96103 (Vitaly Baranov).
- 드물게 발생하는,
use_primary_key가 비활성화되어 있고 인덱스를 사용하는 조건의 논리합이 매우 많은 경우 인덱스 분석 중 발생하던 use-after-free를 수정했습니다. #96112 (Alexey Milovidov). - 명시적으로 지정된 크기가 데이터 타입 크기와 일치하지 않고 버퍼 크기가 너무 작은 경우 발생하는
Gorilla코덱 회귀 문제를 수정했습니다. 이전 버전에서는 압축 해제 시 예외가 발생했습니다. #78253를 해결합니다. #96118 (Alexey Milovidov). - 딕셔너리 로드 시, 한 딕셔너리가 자신을 재귀적으로 참조하는 Merge 테이블을 참조할 때 발생할 수 있는 교착 상태를 방지했습니다. #78360을 해결했습니다. #96120 (Alexey Milovidov).
- MySQL 및 JODA 스타일처럼 고정 폭이 아닌 서식 지정자를 사용할 때
formatDateTime에서 초기화되지 않은 값을 사용하는 문제를 수정했습니다. #96133 (Alexey Milovidov). - 설정
use_const_adaptive_granularity와index_granularity_bytes의 조합(즉, “비적응형 세분화 수준”)으로 인해 읽어야 하는 행 수가 잘못 계산되면서 예외가 발생했습니다. #96143 (Alexey Milovidov). - S3 및 Azure와 같은 객체 스토리지의 파일 기반 테이블에서 잘못된 ALTER UPDATE mutation을 실행하면 nullptr 역참조가 발생할 수 있었습니다. #92994를 해결했습니다. #96162 (Alexey Milovidov).
AccessRights::contains가 부분 REVOKE 사용 시 잘못된 결과를 반환하던 문제를 수정했습니다. #96170 (pufit).- 잘못된 쿼리 결과를 초래할 수 있었던 CTE의 상수 폴딩과 관련된 쿼리 조건 캐시 해시 충돌을 수정했습니다. #96060을 해결합니다. #96172 (Alexey Milovidov).
- ProcessList에서 발생할 수 있는 교착 상태를 수정했습니다. 작업을 cancellation checker에 추가하는 도중 메모리 오버커밋 트래커가 트리거되면 잠금 순서 역전으로 인해 이런 문제가 발생할 수 있습니다. #96182 (Antonio Andelic).
- 여러 개의 INNER JOIN과 함께 외부 조인(LEFT, RIGHT 또는 FULL)이 포함된 쿼리에서, 허용되지 않는 조인 재정렬로 인해 잘못된 결과가 반환될 수 있던 버그를 수정했습니다. 외부 조인의 ON 조건이 앞서 조인된 여러 테이블의 컬럼을 참조할 때, 옵티마이저가 모든 테이블 간 의존성을 제대로 반영하지 못해 조인을 잘못 재정렬할 수 있었고, 그 결과 일부 행이 누락되었습니다. Close #95972. #96193 (Vladimir Cherkasov).
- 테이블에 정의된 통계 정보가 없으면 ClickHouse는 이를 로드하려고 시도하지 않습니다. 이렇게 하면 통계 파일의 존재 여부를 확인하는 데 드는 일부 오버헤드(100ms+)를 줄일 수 있습니다. (issue #96068). #96233 (Han Fei).
- 집계 인수가
LowCardinality(Nullable)인 경우optimize_syntax_fuse_functions가sum/count/avg를sumCount()로 재작성하지 않도록 수정했습니다. #95390을 해결합니다. #96239 (Nihal Z. Miaji). - 일부 경우
not IN및not has함수에서 잘못된 파티션 프루닝을 수정했습니다. #96241 (Nihal Z. Miaji). - 벡터 유사도 인덱스에서 발생하던
stack-use-after-scope문제를 수정했습니다. #96259 (Alexey Milovidov). - 쿼리 앞에 SQL 주석이 있을 때 테스트 러너가 오류 힌트 주석을 인식하지 못하는 문제를 수정했습니다. #96336 (Yakov Olkhovskiy).
- 테이블의 프라이머리 키가 널 허용이고, 쿼리에서 첫 번째 인수가 상수인
coalesce함수를 사용할 때 KeyCondition에서 발생하는 논리 오류를 수정했습니다. #96340 (Alexey Milovidov). GROUPING SETS,group_by_use_nulls, 그리고 내부에LowCardinality를 포함한Tuple데이터 타입이 상호작용하면서 쿼리 파이프라인에서 예상치 못한 block 구조가 생성되어 논리 오류가 발생할 수 있었습니다. 이 문제는NullableTuple이 도입된 이후 나타났습니다. #96358 (Alexey Milovidov).- 빈 표현식
()을 인덱스로 한 테이블을 생성할 수 있었고, 이로 인해 유효하지 않은 메모리 접근이 발생했습니다. #96363 (Alexey Milovidov). - 기존 분석기에서 JOIN과 중복된 별칭이 함께 있을 때 발생하던 충돌을 수정했습니다. #96405 (Ilya Golshtein).
- Variant 컬럼에 대한 잘못된 in-place 필터링 최적화로 인해 발생한
Nested columns sizes are inconsistent with local_discriminators오류를 수정했습니다. #96410 (Alexey Milovidov). - 원본 테이블의 전체 수식자를 무시하던
CREATE TABLE ... CLONE AS ...문제를 수정했습니다. #96415 (Hasyimi Bahrudin). - clickhouse-client에서
mysql테이블 함수가 KILL QUERY 또는 쿼리 취소(Ctrl+C)로 취소되지 않던 문제를 수정했습니다. #96437 (Roman Vasin). max_execution_time값이 큰 쿼리에서 취소 확인 스레드의 라이브락 문제를 수정했습니다. #96450 (Sergei Trifonov).- 분산 쿼리에서 소수값
LIMIT/OFFSET을 사용할 때 일부 경우에 발생하던 논리 오류를 수정했습니다. #96475 (Nihal Z. Miaji). - 람다 함수가 포함된 특정 표현식에서 NULL 포인터 역참조 문제를 수정했습니다. #96479 (Alexey Milovidov).
LowCardinality컬럼이Nullable로 변환될 때 잘못된 결과가 나오던 문제를 수정했습니다. #96483 (Nihal Z. Miaji).- 존재하지 않는 컬럼을 참조하거나 위치 인수를 사용하는
ORDER BY절이 포함된 Iceberg 테이블을 생성할 때 발생하는 충돌을 수정했습니다. #93280을 해결합니다. #96484 (Konstantin Vedernikov). - 널 허용 하위 필드가 있는 Tuple 컬럼에서 발생하던 런타임 필터 예외를 수정했습니다. #96509 (Alexey Milovidov).
PREWHEREfilter 컬럼에 불리언이 아닌 UInt8 값이 있을 때 Parquet V3 네이티브 리더에서 발생하는LOGICAL_ERROR예외를 수정했습니다. #96594 (Alexey Milovidov).- 메타데이터 변경 시 복제된 테이블에서 인덱스가 암시적으로 다시 생성되던 문제를 수정했습니다. #96600 (Raúl Marín).
- DROP WORKLOAD 시 발생하는 데이터 레이스를 수정했습니다. #96614 (Sergei Trifonov).
- Iceberg 테이블 쓰기에서 파티션된 삽입으로 인해 파티션 파일 전반에 데이터가 잘못 분산될 수 있던 버그를 수정했습니다. #96620 (Konstantin Vedernikov).
- constraints가 있는
CREATE TABLE에서 발생하던heap-use-after-free문제를 수정했습니다. #96669 (Nikita Taranov). - 버퍼 오버플로우를 방지하기 위해 bech32의 witness 버전을 검증하도록 수정했습니다. #96671 (Raúl Marín).
- 유효하지 않은
auth_header설정으로 데이터 레이크 REST 카탈로그를 생성했을 때system.tables에서 오류가 반환되던 문제를 수정했습니다. #96680 (Han Fei). - TTL 머지 후 블록의 모든 행이 필터링된 경우
_minmax_count_projection을 통해min(timestamp)가 epoch(1970-01-01)를 반환하던 문제를 수정했습니다. #96703 (Raquel Barbadillo). iceberg_metadata_file_path설정의 유효성 검사를 개선하여 경로 탐색을 방지하고, 지정된 메타데이터 파일이 테이블 디렉터리 내에 있는지 확인합니다. #96754 (Daniil Ivanik).GROUP BY에서Variant인수를 사용할 때 발생하던ifNull충돌을 수정했습니다. #96790 (Alexey Milovidov).table_disk=1설정이 적용된 테이블 간 캐시 키 충돌을 수정했습니다. #96818 (Raufs Dunamalijevs).- 경쟁 상태로 인해 MemoryWorker의 정리 스레드가 멈춰 있던 문제를 수정했습니다. #96819 (Antonio Andelic).
- Iceberg 카탈로그에서 자격 증명이 포함된 데이터가 로그에 남지 않도록 수정했습니다. #96831 (Konstantin Vedernikov).
- 서버 오류 발생 후 clickhouse-client의 종료 상태 코드를 수정했습니다. #96841 (Vitaly Baranov).
- CROSS JOIN과 사용 설정된 병렬 레플리카를 사용하는 쿼리에서 잘못된 결과가 반환될 수 있었습니다. #74337을 수정했습니다. #96848 (Igor Nikonov).
- 이전에 동일한 컬럼에 경량 업데이트가 수행된 뒤
ALTER TABLE DROP COLUMN쿼리가 실패하던 문제를 수정했습니다. #96861 (Anton Popov). plain_rewritable객체 스토리지 디스크에서 아카이브 기반 백업(.zip,.tzst)을 생성할 때 발생하던 스택 오버플로우(충돌) 문제를 수정했습니다. #96872 (Alexey Milovidov).- 대상 파일 시스템에서 디스크 공간 부족이나 기타 I/O 오류로 백업이 실패할 때 발생하던 server 충돌을 수정했습니다. #96873 (Alexey Milovidov).
EXCEPT ALL및INTERSECT ALL이 행의 중복 개수를 무시하고 해당DISTINCT구문처럼 동작하던 문제를 수정했습니다. #96876 (Alexey Milovidov).- 호환되지 않는 타입(예: 정수 검색값으로
IPv4배열을 검색하는 경우)으로 호출할 때indexOfAssumeSorted에서 발생하는std::terminate예외를 수정했습니다. #96877 (Alexey Milovidov). - 윈도우 함수와
group_by_use_nulls = 1, CUBE/ROLLUP/GROUPING SETS를 사용할 때 발생하는 예외Bad cast from type DB::ColumnNullable to DB::ColumnString를 수정했습니다. #96878 (Alexey Milovidov). - JIT로 컴파일된 표현식에서
DateTime을DateTime64로 변환할 때(CASE/if/multiIf에서 DateTime 타입이 혼합된 경우 등) 잘못된 결과가 발생하던 문제를 수정했습니다. 값이 적절히 스케일 조정되지 않고 재해석되어, 표현식 컴파일이 적용된 뒤 잘못된 타임스탬프가 생성되었습니다. #96879 (Alexey Milovidov). - 스킵 인덱스 표현식이 상수 컬럼을 반환할 때(예: 정수 컬럼의
ifNotFinite(1, c0)에 대한bloom_filter)CoalescingMergeTree에서 발생하는 논리 오류 예외를 수정했습니다. #96880 (Alexey Milovidov). - HTTP로 TLS가 활성화된 네이티브 프로토콜 포트에 실수로 연결할 때 오류 메시지에 잘못된 포트 번호가 표시되는 문제를 수정했습니다. #96881 (Alexey Milovidov).
- CTE와 서브쿼리에서
file과 같은 테이블 함수에 서브쿼리별SETTINGS가 적용되지 않던 문제를 해결했습니다. #96882 (Alexey Milovidov). - X509 인증서를 읽을 때 BIO 객체에서 발생하는 메모리 누수를 해결했습니다. #96885 (Alexey Milovidov).
- 구체적인 값이 필요한 곳(예:
arrayFold의 accumulator 인수)에 람다 표현식이 전달될 때 쿼리 분석기에서 발생하던LOGICAL_ERROR예외를 수정했습니다. #96892 (Alexey Milovidov). - 복잡한 중첩 타입(Nullable Enum 값을 갖는 Map을 포함한 Nullable Tuple의 Array)을 캐스팅할 때 발생하는
ColumnNullable is not compatible with original예외를 수정했습니다. #96924 (Alexey Milovidov). - 세그먼트된
HASHED딕셔너리의 병렬 로딩 중 간헐적으로 일부 행이 로드되지 않을 수 있던 경쟁 조건을 수정했습니다. #96953 (Alexey Milovidov). REPLACE PARTITION과 백그라운드 뮤테이션 사이의 경쟁 상태를 수정해, REPLACE 이후 이전 데이터와 새 데이터가 모두 보일 수 있던 문제를 해결했습니다. #96955 (Alexey Milovidov).- INNER JOIN 및 WHERE 절과 함께 사용할 때
arrayJoin함수가 중복 행을 생성하던 문제를 수정했습니다. 이 문제는 부분 프레디케이트 푸시다운 최적화에서arrayJoin이 포함된 필터를 JOIN 아래로 잘못 푸시했기 때문에 발생했습니다. #96989 (Alexey Milovidov). BlockIO::operator=가query_metadata_cache를 이동하지 않아 캐시된 스토리지 스냅샷이 너무 일찍 파기되고, 그 결과MergeTreeData스토리지에서 해제 후 사용(use-after-free)이 발생해clearCaches에서 크래시(SEGFAULT)가 발생하던 문제를 수정했습니다. #96995 (Alexey Milovidov).if또는transform함수가Nullable(String)을 반환할 때IfTransformStringsToEnumPass에서 발생하는 assertion failure를 수정했습니다(예:GROUP BY ... WITH CUBE와group_by_use_nulls = true를 사용하는 경우). #97002 (Alexey Milovidov).INSERT ... SELECT에서UNION ALL및JOIN을 사용할 때 block squashing 후 상수 문자열 컬럼에 잘못된 값이 들어가 잘못된 데이터가 기록되던 문제를 수정했습니다. #97019 (Hasyimi Bahrudin).ALTER TABLE MODIFY COLUMN으로 컬럼 유형이 변경된 뒤 컬럼 통계를 생성할 때 발생하던assert_cast예외(또는 릴리스 빌드에서 조용히 발생하는 데이터 손상)를 수정했습니다. #97027 (Alexey Milovidov).- Azure Blob Storage, SSH 프로토콜 및 Arrow Flight 인터페이스에서 초기화되지 않은 메모리를 읽는 버그를 수정했습니다. #97053 (Alexey Milovidov).
- ROW POLICY/PREWHERE 및 FINAL이 있는 쿼리 결과에 인덱스가 영향을 미치던 문제를 수정했습니다. #97076 (Yarik Briukhovetskyi).
MergeTree테이블에서REPLACE PARTITION과 백그라운드 뮤테이션 사이에 남아 있던 race condition을 수정해, 오래된 데이터가 다시 나타날 수 있던 문제를 해결했습니다. #97105 (Alexey Milovidov).- 별칭 컬럼이 있는 암시적 인덱스를 수정하고, 생성 전에 전체 유효성 검사를 수행합니다. #97115 (Raúl Marín).
arrayROCAUC처럼 상수 인수가 필요한 함수에서FunctionVariantAdaptor의 논리 오류를 수정했습니다. #97116 (Bharat Nallan).- 이미 뮤테이션된 파트에 대해
PartCheckThread가GET_PART를 다시 큐에 넣어parts_to_do에 유령 항목이 남는 문제로 인해 정체되던 뮤테이션을 수정했습니다. #97162 (Alexey Milovidov). ORDER BY ... LIMIT가 있는 서브쿼리의 쿼리 계획 행 수 추정을 수정하여, 옵티마이저가 비최적의 조인 순서를 선택할 수 있던 문제를 해결했습니다. #97193 (Alexander Gololobov).- Variant 컬럼을 처리하는 함수가
Nothing타입을 반환할 때FunctionVariantAdaptor에서 발생하는LOGICAL_ERROR예외를 수정했습니다. 이는UNION ALL쿼리에서 빈 배열이 있을 경우 발생할 수 있습니다. #97213 (Alexey Milovidov). - 동시 접근 시 예외가 발생할 수 있었던 S3 multipart copy 작업(예: S3로
BACKUP/RESTORE수행 중)의 데이터 레이스를 수정했습니다. #97227 (Azat Khuzhin). WHERE절에서arrayJoin이JOIN양쪽의 컬럼을 모두 참조할 때 발생하는LOGICAL_ERROR예외를 수정했습니다. #97239 (Alexey Milovidov).- PREWHERE를 사용하는 Tuple에서 희소
Nullable(String)의.size하위 컬럼을 읽을 때 발생하는LOGICAL_ERROR예외를 수정했습니다. #97264 (Alexey Milovidov). ORDER BY ... LIMIT를 사용해 비적응형 인덱스 세분화 수준(index_granularity_bytes = 0)을 사용하는 테이블에서 읽을 때LazyMaterializingTransform에서 발생하던 “지연 청크의 행 수가 오프셋 개수와 일치하지 않습니다” 예외를 수정했습니다. #97270 (Alexey Milovidov).SYSTEM RESTART REPLICA에서 테이블 재생성이 ZooKeeper 이외의 예외(예: 메모리 제한)로 실패할 경우 데이터베이스에서 테이블이 사라져DatabaseReplicated의 메타데이터 다이제스트 불일치가 발생하던 문제를 수정했습니다. #97276 (Alexey Milovidov).system.merge_tree_settings의 필드readonly가 이제 특정 MergeTree 설정(예:index_granularity)이 항상 읽기 전용임을 올바르게 반영합니다. #97277 (Robert Schulze).- 데이터 없이 스토리지 스냅샷이 생성된 경우
MergeTree테이블에서count()최적화 중 발생하던 충돌을 수정했습니다. #97281 (Pablo Marcos). - 스택 트레이스용 디버그 정보에서 함수 이름을 해석할 때 발생할 수 있는 크래시를 수정했습니다. #97294 (Azat Khuzhin).
- analyzer_compatibility_join_using_top_level_identifier 및 ALIAS 컬럼에서 발생하는 논리 오류를 수정했습니다. #96228을 해결했습니다. #97297 (Vladimir Cherkasov).
- 텍스트 인덱스가 적용된 컬럼을
QUALIFY절과 함께 사용할 때applyOrder에서 발생하는LOGICAL_ERROR예외를 수정했습니다. #97313 (Alexey Milovidov). - 시스템 테이블
system.functions는 이제 내부 함수의 경우categories = ''대신categories = 'Internal'로 표시됩니다. #97315 (Robert Schulze). - RIGHT JOIN 체인이 포함된 쿼리에서 병렬 레플리카가 활성화된 경우 잘못된 결과가 나올 수 있습니다. #74341을 수정했습니다. #97316 (Igor Nikonov).
- 갱신 가능 구체화 뷰 및 테이블 이름이 변경되는 기타 상황에서 발생할 수 있던 불필요한
TABLE_UUID_MISMATCH오류를 수정했습니다. #97323 (Azat Khuzhin). - 지연 백업 배치에서 유효하지 않은 스토리지 포인터를 참조하는 use-after-free로 인해 발생하던
StorageKeeperMap백업 segfault를 수정했습니다. #97336 (Alexey Milovidov). mutations_execute_subqueries_on_initiator가 활성화된 경우ALTER UPDATE/DELETE내부의 스칼라 서브쿼리에서 사용되는exists함수를 수정했습니다. 스칼라 서브쿼리가 잘못 평가되어 오류가 발생하거나 손상된 뮤테이션 명령이 생성될 수 있었고, 이로 인해 다음 server 재시작 시 table을 로드할 수 없게 될 수 있었습니다. #97347 (Kirill Kopnev).- LowCardinality 타입이 포함된 Variant 컬럼과 NULL을 비교할 때 발생하던 논리 예외
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8)))를 수정했습니다. #97379 (Alexey Milovidov). - 세그먼트별 쿼리 캐시가 활성화된 상태에서
EXCHANGE TABLES가 병렬로 실행될 때 발생할 수 있는 경쟁 상태(race condition)를 수정했습니다. #97411 (Konstantin Vedernikov). - 바깥쪽
Tuple래퍼의nullable_source가 변환된 배열 컬럼을 맞지 않는 컬럼 유형으로 대체할 때 발생하던Array-to-QBit변환의LOGICAL_ERROR예외를 수정했습니다. #97389를 해결합니다. #97413 (Alexey Milovidov). - 괄호 안에 있는 별칭이 지정된 튜플 리터럴의 AST 포맷팅 라운드트립 불일치 문제를 수정했습니다. 예를 들어
(('a', 'b') AS x)가 잘못하여tuple(('a', 'b') AS x)로 재포맷되던 문제입니다. #97418 (Alexey Milovidov). - 파싱 오류로 인해 행이 0개인 빈 block이 생성될 때, 중복 제거가 적용된 비동기 삽입에서 발생하던 예외를 수정했습니다. #97460 (Sema Checherinda).
ORDER BY ... LIMIT를 사용해 비적응형 인덱스 세분화 수준(index_granularity_bytes = 0) 테이블을 읽을 때LazyMaterializingTransform에서 발생하던 “lazy 청크의 행 수가 오프셋 수와 일치하지 않습니다” 예외를 수정했습니다. #97482 (Alexey Milovidov).- Iceberg 삽입 관련 설정을 수정했습니다.
allow_experimental_insert_into_iceberg설정의 별칭을 추가했습니다. #97483 (Konstantin Vedernikov). optimize_inverse_dictionary_lookup최적화가dictGet(...)프레디케이트를 재작성할 때CREATE TEMPORARY TABLE권한이 없는 사용자에게 발생하던ACCESS_DENIED문제를 수정했습니다. 이제 ClickHouse는 재작성을 건너뛰고 원래 표현식을 실행합니다. #97269을 해결합니다. #97484 (Nihal Z. Miaji).- 내부 희소 서브컬럼이 있는 컬럼(예: 희소 직렬화 프로필이 서로 다른 MergeTree 파트의
Tuple컬럼)을 처리할 때Set및MergeTreeIndexSet에서 발생하던 assertion failure(디버그/새니타이저 빌드에서는 예외 발생)를 수정했습니다. #97493 (Alexey Milovidov). - StorageKafka2에서 발생할 수 있는 use-after-free 문제를 해결했습니다. #97520 (Bharat Nallan).
- 출력 경로에 디렉터리가 포함된 경우
TRUNCATE및into_outfile_create_parent_directories설정과 함께INTO OUTFILE이 올바르게 동작하지 않던 문제를 수정했습니다. #97549 (Alexey Milovidov). - 분석기가 활성화된 상태에서
merge()테이블 함수를 통해 ALIAS 컬럼 안에 람다 표현식이 포함된 테이블을 쿼리할 때 발생하던BAD_ARGUMENTS오류를 수정했습니다. #97551 (Alexey Milovidov). - Keeper zxid가 0일 때
system.zookeeper_info에서 발생하는 예외를 수정했습니다. #97553 (Alexey Milovidov). - 키 유형이 String이 아닐 때
ip_trie딕셔너리에서 발생할 수 있는 논리 오류를 수정했습니다. #97555 (Bharat Nallan). - 기본
RestCatalog에서 REST 카탈로그 OAuth 인증이 작동하지 않던 문제를 수정했습니다(OneLakeCatalog와 같은 파생 카탈로그에서만 작동했습니다). 이로 인해 BigLake 카탈로그 도입 후 기본 REST 카탈로그가 동작하지 않게 되었습니다. #97561 (Konstantin Vedernikov). - 이제 Geometry 함수(
perimeterSpherical,areaSpherical등)는Geometryvariant 타입에 더해 개별 지오메트리 하위 타입(Polygon,Ring,Point등)도 허용합니다. #97571 (Alexey Milovidov). Nullable(Tuple(... Nullable(T) ...))타입의 서브컬럼에isNull/isNotNull을 사용할 때LOGICAL_ERROR예외가 발생하던 문제를 수정했습니다. #97224를 해결합니다. #97582 (Alexey Milovidov).- 경량 업데이트 중 패치 파트를 적용할 때 발생하는 널 포인터 역참조를 수정했습니다. #97583 (Alexey Milovidov).
BaseSettings::readBinary는accessor.find에서 받은 인덱스를 찾지 못했음을 나타내는 센티널 값(즉,-1)인지 확인하지 않은 채field_infos[]에 전달하므로,std::vector경계 밖 접근이 발생할 수 있습니다. 이 문제는 libcxx 하드닝 덕분에 발견되었습니다. 이는 더 최신 server가 더 오래된 server가 알지 못하는 설정을 보낼 때, 아마도 쿼리 계획 역직렬화 중에 발생한 것으로 보입니다. 문자열 기반 읽기 메서드는 이미 이를 올바르게 처리하고 있었지만,readBinary에는 같은 확인이 빠져 있었습니다. #97585 (Miсhael Stetsyuk).- 한 브랜치에 상수 false 프레디케이트가 있는
UNION ALL쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. 해당 브랜치는 아무것도 반환하지 않아야 했지만, 잘못하여 데이터를 읽고 있었습니다. #97620 (Bharat Nallan). - 단일 컬럼 참조가 포함된
IN (col)이UNSUPPORTED_METHOD오류와 함께 실패하던 문제를 수정했습니다. #97646 (Alexey Milovidov). GROUP BY ... WITH ROLLUP/CUBE수행 중 키에Nullable(Tuple(...))내부의LowCardinality(Nullable(...))가 포함된 경우 발생하는 논리 오류 예외를 수정했습니다. #97647 (Alexey Milovidov).- 디버그 빌드에서
LOGICAL_ERROR를 유발할 수 있던NOT (1, 1, 1)의 AST 포맷 불일치를 수정했습니다. #97653 (Alexey Milovidov). - 비어 있는 ZooKeeper 트랜잭션 로그 파일을 처리할 때 발생하던
keeper-converter예외를 수정했습니다. #97673 (Alexey Milovidov).
빌드/테스트/패키징 개선
- ClickHouse를 clang-23(master)로 빌드할 수 있습니다. #95578 (Alexey Milovidov).
bind_host가 구성된 경우is_local을 강제로 false로 설정하도록 수정하고, 이를 통합 테스트로 대체했습니다. #74741에 대한 후속 조치입니다. #93109 #96018 (Zhigao Hong).- 스트레스 테스트: CI에서 스트레스 테스트와 업그레이드 테스트를 수정했습니다.
no-{build}태그는 무시하도록 했습니다. 호환성 무작위화를 추가했습니다. #94693 (Nikita Fomichev). - 빌드 결과물로 parser_memory_profiler 바이너리를 게시했습니다. 이 도구는 AST의 메모리 사용량을 분석하는 데 사용할 수 있습니다. #95826 (Ilya Yatsishin).
- 결과에 해석된 심볼이 포함된
.heap.sym파일을 생성하는parser_memory_profiler도구에--symbolize플래그를 추가했습니다. #96477 (Ilya Yatsishin). - 통합 테스트에서 사용하는 타사 Docker 이미지를 특정 버전으로 고정합니다. #96500 (Alexey Milovidov).
OpenSSL을 동적으로 링크하는 기능을 다시 복원했습니다. 이는 권장되지 않으며 어떤 프로덕션 빌드에서도 사용되지 않지만, 인터넷상의 애호가들을 위해 이 옵션은 여전히 남아 있습니다. #96506 (Govind R Nair).Coordination::OpNum에 타입별 특수화를 적용해magic_enum범위를 [-100, 1000]에서 기본값인 [-128, 127]로 줄이고, 빌드 시간을 개선했습니다. #96632 (Alexey Milovidov).- 빌드 시간을 줄이기 위해 Function 클래스에서 불필요한 C++ 템플릿을 제거했습니다. #96646 (Alexey Milovidov).
- 빌드 병렬성을 향상하기 위해
StorageSystemLicenses생성 시점을 configure 단계로 옮겼습니다. #96697 (Alexey Milovidov). - 라이선스 스캔을 병렬로 수행합니다. #96727 (Raúl Marín).
- SSH 프로토콜 지원에 대한 stateless 기능 테스트를 추가했습니다. #96996 (Alexey Milovidov).
- Kafka 3.9.0을 stateless 기능 테스트 인프라에 추가하여, ZooKeeper 역할로 ClickHouse Keeper를 사용하면서 Kafka 및 Kafka2 테이블 엔진을 직접 테스트할 수 있게 했습니다. 새로 추가된 6개의 stateless 테스트는 기본적인 produce/consume, 가상 컬럼(virtual columns), INSERT, 여러 포맷, 손상된 메시지 처리, 그리고 Keeper 기반 offset 저장을 다룹니다. #96997 (Alexey Milovidov).
- PGO+BOLT 최적화 clang toolchain을 빌드하는 CI 워크플로를 추가합니다. #96991 (Alexey Milovidov).
- CI에서 PGO로 최적화된 LLVM/Clang 빌드를 사용해 빌드 속도가 20..30% 향상됩니다. #97031 (Alexey Milovidov).
- glibc의 수학 관련 함수를 llvm-libc 구현으로 대체합니다. #90151 (Konstantin Bogdanov).
- Boost를 1.83에서 1.90으로 업데이트하여 디버그 빌드에서
devector어설션이 실패하던 문제를 수정했습니다. #97037 (Alexey Milovidov). postgres를 REL_18_1로 업데이트했습니다. #95189 (Konstantin Bogdanov).libexpat2.7.3을 사용하도록 변경했습니다. #95218 (Konstantin Bogdanov).OpenSSL3.5.5를 사용하도록 변경했습니다. #95345 (Konstantin Bogdanov).simdjsonv4.2.4를 사용하도록 변경했습니다. #97129 (Konstantin Bogdanov).libarchive3.8.5를 사용하도록 변경했습니다. #97131 (Konstantin Bogdanov).fast_floatv8.2.3을 사용하도록 변경했습니다. #97133 (Konstantin Bogdanov).abseil-cpp는 20260107.1을,s2geometry는 v0.13.1을 사용합니다. #97134 (Konstantin Bogdanov).libxml2를 2.15.1로 업데이트했습니다. #95574 (Robert Schulze).- 지원이 종료(EOL)되었거나 제거된 베이스 이미지를 기반으로 하던 Tier-3 통합 테스트용 Docker 이미지 7개를 현재 지원되는 버전으로 업그레이드했습니다. #97314 (Rahul).
- TPC-DS 벤치마크 쿼리를 추가했습니다. #97349 (Raufs Dunamalijevs).
- 개별 x86 명령어 세트 cmake 옵션(
ENABLE_SSSE3,ENABLE_AVX2,NO_SSE3_OR_HIGHER,ARCH_NATIVE등)을, 런타임 디스패치 시스템에서 이미 사용 중인 표준 x86-64 마이크로아키텍처 수준에 맞는 단일 숫자X86_ARCH_LEVEL옵션(1/2/3/4)으로 대체합니다. #97354 (Raúl Marín). FunctionBinaryArithmetic에서 나눗셈이 아닌 연산에는division_by_nullable=trueTemplate Variant를 인스턴스화하지 않도록 해 컴파일 시간과 바이너리 크기를 줄였습니다. #97496 (Raúl Marín).typeid_cast.h,assert_cast.h,Context_fwd.h,IDataType.h및 여러 Column 헤더처럼 광범위하게 참조되는 헤더에서Exception.h를 제거해Exception.h의 include 의존성 범위를 줄였습니다. #97497 (Raúl Marín).- 항상 호스트 컴파일러의 헤더 대신 번들된
compiler-rt헤더(새니타이저 및 XRay 인터페이스)를 사용하고, 기본값으로compiler-rt라이브러리를 소스에서 빌드합니다. #97499 (Raúl Marín). - 충분한
long double를 지원하는 플랫폼에서는wide_integer_impl.h에 boost/multiprecision 헤더를 포함하지 않도록 해 빌드 시간을 단축했습니다. #96633 (Alexey Milovidov). - LLVM Code Coverage job을 구현하고, 우선 master 브랜치에서 활성화했습니다. #90952 (Alexey Bakharew).
- 릴리스 빌드에서 빠른 libcxx 강화 기능을 활성화했습니다. 이는 주로 범위 초과(out-of-bounds) 검사에 필요합니다. 성능 테스트 결과를 보면, 눈에 띄는 성능 저하는 없을 것으로 예상됩니다. #94757 (Miсhael Stetsyuk).
하위 호환되지 않는 변경 사항
- formatter에서 alias가 잘못 치환되어 발생한 포맷 불일치 문제를 수정했습니다. 이로써 #82833이 해결되었습니다. 이로써 #82832가 해결되었습니다. 이로써 #68296가 해결되었습니다. 이 변경으로 인해 잠재적으로 하위 호환성이 깨질 수 있습니다. 분석기가 비활성화되어 있으면, 별칭을 참조하는 IN 절이 있는 일부 CREATE VIEW 쿼리를 처리할 수 없습니다. 이러한 비호환성을 방지하려면 분석기를 활성화하십시오(24.3부터 기본적으로 활성화됨). #82838 (Alexey Milovidov).
- 코덱
DEFLATE_QPL및ZSTD_QAT이 제거되었습니다. 업그레이드 전에DEFLATE_QPL또는ZSTD_QAT으로 압축된 기존 데이터를 다른 코덱으로 변환하는 것이 좋습니다. 코덱을 사용하려면 설정enable_deflate_qpl_codec및enable_zstd_qat_codec를 활성화해야 했다는 점에 유의하십시오. #92150 (Robert Schulze). system.query_log.exception에서 stderr 캡처를 활성화해 UDF 디버깅을 개선했습니다. 이전에는 UDF stderr가 파일에만 기록되고 query logs에는 노출되지 않아 디버깅이 불가능했습니다. 이제 stderr는 기본적으로 예외를 발생시키며, 예외를 발생시키기 전에 전체 내용이 완전히 누적되고(최대 1MB), 그 결과 전체 Python traceback과 오류 메시지가system.query_log.exception에 표시되어 효과적으로 문제를 해결할 수 있습니다. #92209 (Xu Jia).JOIN USING ()절에서 빈 컬럼 목록은 이제 구문 오류로 간주됩니다. 이전에는 쿼리 실행 중INVALID_JOIN_ON_EXPRESSION으로 처리되어야 했습니다.Join스토리지와 join하는 경우와 같은 일부 상황에서는LOGICAL_ERROR가 발생했습니다. #82502을 해결합니다. #92371 (Vladimir Cherkasov).- 기본적으로 JSON 타입에서 SKIP REGEXP에 부분 일치를 사용하도록 변경했습니다. #79250을 해결했습니다. #92847 (Pavel Kruglov).
- “단순 ALIAS 컬럼에 대한 INSERT 허용”을 되돌렸습니다(ClickHouse/ClickHouse#84154의 되돌림). 사용자 지정 포맷에서는 작동하지 않고, 이를 제어하는 설정도 없습니다. #92849 (Azat Khuzhin).
- 데이터 레이크 카탈로그가 객체 스토리지에 접근할 수 없을 때 오류를 발생시키는 설정. #93606 (Konstantin Vedernikov).
Lazy데이터베이스 엔진이 제거되어 이제 더 이상 사용할 수 없습니다. #91231 이슈가 종료되었습니다. #93627 (Alexey Milovidov).- 버그 때문에 사용할 수 없는
metric_log의transposed_with_wide_view모드를 제거했습니다. 이제 이 모드로system.metric_log를 정의할 수 없습니다. 이는 #78412을 부분적으로 되돌리는 변경입니다. #93867 (Alexey Milovidov). - 워크로드용 CPU 스케줄링은 이제 기본적으로 선점형으로 동작합니다.
cpu_slot_preemption서버 설정을 참조하십시오. #94060 (Sergei Trifonov). - 손상된 파트를 방지하기 위해 인덱스 파일 이름을 이스케이프 처리합니다. 이 변경으로 인해 이전 버전에서 생성된 인덱스 중 이름에 ASCII 이외의 문자가 포함된 인덱스는 ClickHouse에서 로드되지 않습니다. 이를 처리하려면 MergeTree 설정
escape_index_filenames를 사용할 수 있습니다. #94079 (Raúl Marín). - 포맷 설정
exact_rows_before_limit,rows_before_aggregation,cross_to_inner_join_rewrite,regexp_dict_allow_hyperscan,regexp_dict_flag_case_insensitive,regexp_dict_flag_dotall,dictionary_use_async_executor는 이제 일반 설정(포맷 설정 아님)으로 변경되었습니다. 이는 순전히 내부적인 변경이므로, Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog, NATS 테이블 엔진 정의에서 이러한 설정을 지정한 (드문) 경우를 제외하면 사용자에게 눈에 띄는 영향은 없습니다. 이러한 경우에는 이전까지는 이 설정들이 무시되었지만, 이제는 해당 정의에서 오류가 발생합니다. #94106 (Robert Schulze). - 이제
joinGet/joinGetOrNull함수는 기반 Join 테이블의SELECT권한을 적용합니다. 이 변경 이후joinGet('db.table', 'column', key)를 실행하려면 사용자는 Join 테이블에 정의된 키 컬럼과 조회하는 속성 컬럼 모두에 대해SELECT권한을 보유해야 합니다. 이러한 권한이 없는 쿼리는ACCESS_DENIED와 함께 실패합니다. 마이그레이션하려면 전체 테이블 접근에는GRANT SELECT ON db.join_table TO user를 사용하고, 컬럼 단위 접근에는GRANT SELECT(key_col, attr_col) ON db.join_table TO user를 사용하여 필요한 권한을 부여하십시오. 이 변경은 이전에 명시적인SELECT권한 부여를 구성하지 않은 상태에서joinGet/joinGetOrNull에 의존하던 모든 사용자와 애플리케이션에 영향을 줍니다. #94307 (Vladimir Cherkasov). CREATE TABLE ... AS ...쿼리에 대해SHOW COLUMNS를 확인하도록 했습니다. 이전에는SHOW TABLES를 확인했지만, 이런 유형의 권한 검사에는 올바르지 않은 grant입니다. #94556 (pufit).Hash출력 형식이 블록 크기에 영향을 받지 않도록 변경했습니다. #94503 (Alexey Milovidov). 이 변경으로 인해 이전 버전과 비교하면 출력 해시 값이 달라집니다.
새로운 기능
- ClickHouse Keeper용 HTTP API 및 내장 웹 UI. #78181 (pufit 및 speeedmaster).
- 이제 async insert 중복 제거가 의존하는 materialized view와도 함께 작동합니다. block_id 충돌이 발생하면 원래 block을 필터링하여 block_id와 연결된 행을 제거하고, 남은 행에는 관련된 모든 materialized view의 SELECT 쿼리가 적용되며, 그 결과 충돌하는 행이 제외된 원래 block이 다시 구성됩니다. #89140 (Sema Checherinda). materialized view가 포함된 경우 async inserts와 함께 중복 제거를 사용할 수 있습니다. #93957 (Sema Checherinda).
- 프로젝션 인덱스 기능을 간소화하고 확장하기 위한 새로운 구문과 프레임워크를 도입했습니다. 이는 https://github.com/ClickHouse/ClickHouse/pull/81021의 후속 작업입니다. #91844 (Amos Bird).
Array컬럼에 텍스트 인덱스 지원 추가. #89895 (Jimmy Aguilar Mena).- 기본적으로
use_variant_as_common_type가 활성화되어,Array안,UNION쿼리, 그리고if/multiIf/case의 분기에서 서로 호환되지 않는 타입도 사용할 수 있습니다. #90677 (Alexey Milovidov). - 새 system table
zookeeper_info. #88014을 구현했습니다. #90809 (Smita Kulkarni). - 모든 함수에서
Variant유형을 지원하도록 했습니다. #90900 (Bharat Nallan). - 주로 버전 정보가 포함된
ClickHouse_Info메트릭을 Prometheus/metrics엔드포인트에 추가하여, 시간 경과에 따른 상세 버전 정보를 추적하는 차트를 만들 수 있게 했습니다. #91125 (Christoph Wurm). - 클러스터 구성을 변경할 수 있는 Keeper용 새 4문자
rcfg명령을 도입했습니다. 이 명령은 표준reconfigure요청보다 더 폭넓게 구성을 변경할 수 있습니다. 이 명령은json문자열을 인수로 받습니다. TCP 인터페이스로 전송되는 전체 바이트 시퀀스는 다음과 같은 형식이어야 합니다:rcfg{json_string_length_big_endian}{json_string}. 명령 예시는 다음과 같습니다:{"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin). - 지정된 구분자를 기준으로 문자열을 나눈 부분 문자열들의 순서를 뒤집는
reverseBySeparator함수를 추가했습니다. #91463를 해결했습니다. #91780 (Xuewei Wang). - 삽입되는 블록의 생성 방식을 더 세밀하게 제어할 수 있는 새로운 설정
max_insert_block_size_bytes를 추가했습니다. #92833 (Kirill Kopnev). ignore_on_cluster_for_replicated_database설정이 활성화되어 있으면 복제된 데이터베이스에서ON CLUSTER절을 사용해 DDL 쿼리를 실행할 수 있습니다. 이 경우 클러스터 이름은 무시됩니다. #92872 (Kirill).mergeTreeAnalyzeIndexes함수를 추가했습니다. #92954 (Azat Khuzhin).- 새로운 설정
use_primary_key를 추가했습니다. 기본 키(primary key) 기반 granule 프루닝을 비활성화하려면false로 설정하십시오. #93319 (Nihal Z. Miaji). icebergLocalCluster테이블 함수가 추가되었습니다. #93323 (Anton Ivashkin).- 두 점 사이의 코사인 거리를 근사하는
cosineDistanceTransposed함수가 추가되었습니다. #93621 (Raufs Dunamalijevs). - 각 데이터 파트에 포함된 파일 수를 보여주는
files컬럼이 system.parts 테이블에 추가되었습니다. #94337 (Match). - 동시성 제어를 위한 max-min 공정 스케줄러를 추가했습니다. 많은 쿼리가 제한된 CPU 슬롯을 두고 경쟁하는 높은 과구독 상황에서 더 나은 공정성을 제공합니다. 짧게 실행되는 쿼리는 시간이 지남에 따라 더 많은 슬롯을 누적한 장시간 실행 쿼리 때문에 불이익을 받지 않습니다.
concurrent_threads_scheduler서버 설정을max_min_fair값으로 지정하면 활성화됩니다. #94732 (Sergei Trifonov). - ClickHouse client가 서버에 연결할 때 TLS SNI를 재정의할 수 있도록 하는 기능이 추가되었습니다. #89761 (Matt Klein).
joinGet함수 호출에서 임시 테이블 지원이 추가되었습니다. #92973 (Eduard Karacharov).DeltaLake테이블 엔진이 삭제 벡터를 지원합니다. #93852 (Kseniia Sumarokova).deltaLakeCluster에서 삭제 벡터를 지원합니다. #94365 (Kseniia Sumarokova).- 데이터 레이크용 Google Cloud Storage 지원. #93866 (Konstantin Vedernikov).
실험적 기능
QBit을 Experimental에서 베타로 이동했습니다. #93816 (Raufs Dunamalijevs).Nullable(Tuple)지원을 추가했습니다. 활성화하려면allow_experimental_nullable_tuple_type = 1로 설정하십시오. #89643 (Nihal Z. Miaji).- https://github.com/ClickHouse/ClickHouse/pull/84423에 이어 Paimon REST 카탈로그를 지원합니다. #92011 (JIaQi Tang).
성능 개선
- 이제
use_skip_indexes_on_data_read설정이 기본적으로 활성화되어 있습니다. 이 설정을 사용하면 읽는 동시에 스트리밍 방식으로 필터링할 수 있어 쿼리 성능과 시작 시간이 개선됩니다. #93407 (Shankar Iyer). LowCardinality컬럼에서DISTINCT성능을 개선했습니다. #5917을 해결했습니다. #91639 (Nihal Z. Miaji).distinctJSONPaths집계 함수가 전체 JSON 컬럼이 아니라 데이터 파트의 JSON 경로만 읽도록 최적화했습니다. #92196 (Pavel Kruglov).- 더 많은 필터가 조인까지 푸시다운되도록 개선되었습니다. #85556 (Nikita Taranov).
- filter가 한쪽 입력만 사용할 때, 조인 ON 조건에서 더 많은 경우에 push down을 지원합니다.
ANY,SEMI,ANTI조인을 지원합니다. #92584 (Dmitry Novik). - 동등한 Set을 사용해
SEMI JOIN의 filter를 push down할 수 있게 했습니다. #85239을 해결했습니다. #92837 (Dmitry Novik). - 오른쪽이 비어 있으면 해시 조인의 왼쪽을 읽지 않습니다. 이전에는 비어 있지 않은 첫 번째 block이 나올 때까지 왼쪽을 읽었는데, 필터링이나 집계가 많은 경우 상당한 작업이 발생할 수 있었습니다. #94062 (Alexander Gololobov).
- 쿼리 파이프라인 내부에서 데이터를 파티셔닝하는 데 “fastrange” (Daniel Lemire) 메서드를 사용합니다. 이를 통해 병렬 정렬과 조인이 개선될 수 있습니다. #93080 (Alexey Milovidov).
- PARTITION BY가 정렬 키와 일치하거나 정렬 키의 접두사인 경우 윈도우 함수의 성능을 개선했습니다. #87299 (Nikita Taranov).
- 외부 필터가 뷰까지 푸시다운되어 로컬 및 원격 노드에서 PREWHERE를 적용할 수 있습니다. #88189을 해결합니다. #88316 (Igor Nikonov).
- 더 많은 함수에 JIT 컴파일을 적용합니다. #73509를 해결합니다. #88770 (Alexey Milovidov, Taiyang Li와 함께).
FINAL쿼리에서 사용되는 스킵 인덱스가 프라이머리 키(primary key)를 구성하는 컬럼에 있는 경우, 다른 파트에서 프라이머리 키의 교집합을 확인하는 추가 단계는 불필요하므로 이제 수행하지 않습니다. #85897을 해결합니다. #93899 (Shankar Iyer).- 소수값
LIMIT및OFFSET의 성능과 메모리 사용량을 최적화했습니다. #91167 (Ahmed Gouda). - Parquet 리더 V3 프리페처가 더 빠른 랜덤 읽기 로직을 사용하도록 수정했습니다. #90890를 해결합니다. #91435 (Arsen Muk).
icebergCluster의 성능을 향상했습니다. #91462를 해결했습니다. #91537 (Yang Jiang).- 상수 필터에서는 가상 컬럼을 기준으로 필터링하지 않습니다. #91588 (c-end).
- 적응형 쓰기 버퍼를 활성화해 열 수가 매우 많은 테이블에서 와이드 파트를 사용할 때 INSERT/머지의 메모리 사용량을 줄였습니다. 또한 암호화된 디스크에 대한 적응형 쓰기 버퍼 지원을 추가했습니다. #92250 (Azat Khuzhin).
- 인덱스에서 검색하는 토큰 수를 줄여
text index와sparseGrams토크나이저를 사용하는 전문 검색 성능을 개선했습니다. #93078 (Anton Popov). - 함수
isValidASCII는 참인 경우, 즉 입력 값이 모두 ASCII인 경우에 최적화되었습니다. #93347 (Robert Schulze). - 이제 read-in-order 최적화는 WHERE 조건 때문에 ORDER BY 컬럼이 상수로 고정되는 경우를 인식하여, 역순 읽기를 효율적으로 수행할 수 있습니다. 그 결과
WHERE tenant='42' ORDER BY tenant, event_time DESC와 같은 멀티 테넌트 쿼리는 전체 정렬 없이도 InReverseOrder를 사용할 수 있습니다.”. #94103 (matanper). - 메모리 사용량을 최적화하기 위해 값 매개변수를 ASTLiteral 자식 노드 대신 (string, integer) 쌍으로 저장하는 Enum AST 전용 클래스를 도입했습니다. #94178 (Ilya Yatsishin).
- 여러 레플리카에서의 분산 인덱스 분석입니다. 공유 스토리지와 클러스터 내 대규모 데이터에 유용합니다. 이는 SharedMergeTree(ClickHouse Cloud)에 적용되며, 공유 스토리지를 사용하는 다른 유형의 MergeTree 테이블에도 적용될 수 있습니다. #86786 (Azat Khuzhin).
- 다음 경우에는 join 런타임 필터를 비활성화하여 오버헤드를 줄였습니다: - 블룸 필터에서 설정된 비트 수가 너무 많은 경우 - 런타임에 걸러지는 행이 너무 적은 경우. #91578 (Alexander Gololobov).
- 상관 서브쿼리 입력에 인메모리 버퍼를 사용해 중복 평가를 방지했습니다. #79890의 일부입니다. #91205 (Dmitry Novik).
- 병렬 레플리카 읽기에서 모든 레플리카가 고아 상태의 range를 병렬로 가져갈 수 있도록 허용합니다. 이를 통해 부하 분산이 개선되고 롱테일 지연 시간이 줄어듭니다. #91374 (zoomxi).
- 이제 외부 집계/정렬/조인이 모든 Context에서 쿼리 설정
temporary_files_codec을 따릅니다. grace hash join에서 누락되었던 프로필 이벤트를 수정했습니다. #92388 (Vladimir Cherkasov). - 집계/정렬 중 디스크 스필 시 쿼리 메모리 사용량 감지를 더욱 안정적으로 개선했습니다. #92500 (Azat Khuzhin).
- 집계 키 컬럼의 총 행 수와 NDV(고유 값 개수) 통계를 추정합니다. #92812 (Alexander Gololobov).
- simdcomp를 사용해 postings list 압축을 최적화했습니다. #92871 (Peng Jian).
- 버킷을 활용해 S3Queue Ordered 모드 처리를 리팩터링했습니다. 이를 통해 성능도 개선되고 Keeper 요청 수도 줄어들 것으로 기대됩니다. #92889 (Kseniia Sumarokova).
- 이제
mapContainsKeyLike및mapContainsValueLike함수는 각각mapKeys()또는mapValues()에 대한 텍스트 인덱스를 활용할 수 있습니다. #93049 (Michael Jarrett). - Linux 이외의 시스템에서 메모리 사용량을 줄였습니다(jemalloc 더티 페이지의 즉시 퍼지를 활성화). #93360 (Eduard Karacharov).
- dirty 페이지 크기와
max_server_memory_usage의 비율이memory_worker_purge_dirty_pages_threshold_ratio를 초과하면 jemalloc 아레나를 강제로 정리합니다. #93500 (Eduard Karacharov). - AST의 메모리 사용량을 줄였습니다. #93601 (Nikolai Kochetov).
- 일부 경우에는 테이블을 읽을 때 ClickHouse가 메모리 제한을 제대로 준수하지 않는 문제가 있었습니다. 이 동작은 수정되었습니다. #93715 (Nikita Mikhaylov).
- 기본적으로
CHECK_STAT및TRY_REMOVEKeeper 확장 기능이 활성화됩니다. #93886 (Mikhail Artemenko). - Iceberg manifest 파일 항목에서 position delete에 해당하는 파일 이름의 하한 및 상한 경계를 파싱해, 해당 데이터 파일을 더 정확하게 선택할 수 있도록 개선했습니다. #93980 (Daniil Ivanik).
- JSON 컬럼의 동적 서브컬럼 최대 개수를 제어하는 설정 2개를 추가했습니다. 첫 번째는 MergeTree 설정
merge_max_dynamic_subcolumns_in_compact_part이며(기존에 추가된merge_max_dynamic_subcolumns_in_wide_part와 유사), Compact part로 머지하는 동안 생성되는 동적 서브컬럼 수를 제한합니다. 두 번째는 쿼리 수준 설정max_dynamic_subcolumns_in_json_type_parsing으로, JSON 데이터를 파싱하는 동안 생성되는 동적 서브컬럼 수를 제한하며, 삽입 시 이 제한을 지정할 수 있게 합니다. #94184 (Pavel Kruglov). - 일부 경우 JSON 컬럼 스쿼싱을 약간 더 최적화했습니다. #94247 (Pavel Kruglov).
- 실제 운영 경험을 바탕으로 스레드 풀 큐 크기를 줄였습니다. MergeTree에서 데이터를 읽기 전에 메모리 사용량을 명시적으로 확인하는 검사를 추가했습니다. #94692 (Nikita Mikhaylov).
- CPU 기아 상황에서는 스케줄러가 MemoryWorker 스레드를 우선적으로 선택하도록 하여, ClickHouse 프로세스를 존립을 위협하는 상황으로부터 보호합니다. #94864 (Nikita Mikhaylov).
- jemalloc 더티 페이지 정리를 MemoryWorker의 메인 스레드와 별도의 스레드에서 실행합니다. 정리가 느리면 RSS 사용량 업데이트가 지연되어 프로세스가 메모리 부족(OOM)으로 종료될 수 있습니다. 총 메모리 사용량 비율에 따라 더티 페이지 정리를 시작하는 새 설정
memory_worker_purge_total_memory_threshold_ratio를 추가했습니다. #94902 (Antonio Andelic).
개선 사항
- 이제 Azure Blob Storage에서
system.blob_storage_log를 사용할 수 있습니다. #93105 (Alexey Milovidov). - Local 및 HDFS에
blob_storage_log를 구현했습니다.S3Queue가blob_storage_log에 로깅할 때 디스크 이름이 아닌 다른 값을 사용하면 발생하던 오류를 수정했습니다.blob_storage_log에error_code컬럼을 추가했습니다. 로컬 테스트를 단순화하기 위해 테스트 설정 파일을 분리했습니다. #93106 (Alexey Milovidov). clickhouse-client및clickhouse-local은 입력 중 숫자 리터럴 내 자릿수 그룹(천, 백만 등)을 강조 표시합니다. 이로써 #93100이 해결되었습니다. #93108 (Alexey Milovidov).clickhouse-client에서 등호 기호 앞뒤에 공백이 있는 명령줄 인수를 지원하도록 추가했습니다. #93077를 해결했습니다. #93174 (Cole Smith).<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>를 사용하면 이제 CLI 클라이언트가 이전처럼 일반 검색 시 Ctrl-R로 돌아가고, Ctrl-T는 퍼지 검색을 수행할 수 있습니다. #87785 (Larry Snizek).- 캐시를 지우는 구문
SYSTEM DROP [...] CACHE는 이 구문이 캐시를 비활성화하는 것처럼 오해하게 만들었습니다. 이제 ClickHouse는 더 의미가 분명한 구문인SYSTEM CLEAR [...] CACHE를 지원합니다. 기존 구문도 계속 사용할 수 있습니다. #93727 (Pranav Tiwari). EmbeddedRocksDB에서 여러 컬럼을 기본 키(primary key)로 지원합니다. 관련 이슈 #32819를 해결했습니다. #33917 (usurai).- 이제 스칼라 값에 대해 비상수 IN을 사용할 수 있습니다(
val1 NOT IN if(cond, val2, val3)와 같은 쿼리). #93495 (Yarik Briukhovetskyi). - 지원되지 않으므로
x-amz-server-side-encryption헤더가HeadObject,UploadPart&CompleteMultipartUploadS3 요청으로 전달되지 않도록 방지합니다. #64577 (Francisco J. Jurado Moreno). - S3Queue의 ordered mode에서 Hive 파티셔닝 추적을 지원합니다. #71161을 해결합니다. #81040 (Anton Ivashkin).
- 파일 시스템 캐시의 공간 예약을 최적화합니다.
FileCache::collectCandidatesForEviction는 배타 잠금 없이 실행됩니다. #82764 (Kseniia Sumarokova). - 서버 로그에 대해 복합 로테이션 전략(크기 + 시간)을 지원합니다. #87620 (Jianmei Zhang).
- 이제 CLI 클라이언트에서는 명령줄 옵션
--no-warnings대신<warnings>false</warnings>를 지정할 수 있습니다. #87783 (Larry Snizek). - Date, DateTime, Time 값을 인수로 사용하는
avg집계 함수 지원이 추가되었습니다. #82267이 해결되었습니다. #87845 (Yarik Briukhovetskyi). - 최적화
use_join_disjunctions_push_down은 기본적으로 활성화되어 있습니다. #89313 (Alexey Milovidov). - 상관 서브쿼리에서 더 많은 테이블 엔진과 데이터 소스 유형을 지원합니다. #80775를 해결합니다. #90175 (Dmitry Novik).
- 매개변수화된 뷰의 스키마를 명시적으로 지정한 경우 해당 스키마가 표시됩니다. #88875, #81385가 해결되었습니다. #90220 (Grigorii Sokolik).
- 로그가 마지막으로 커밋된 인덱스 이전에 있는 경우 Keeper 로그 항목의 누락 구간을 올바르게 처리합니다. #90403 (Antonio Andelic).
- JBOD 볼륨에서
min_free_disk_bytes_to_perform_insert설정이 제대로 작동하도록 개선했습니다. #90878 (Aleksandr Musorin). S3테이블 엔진과s3테이블 함수용 이름이 지정된 컬렉션에서storage_class_name설정을 지정할 수 있게 했습니다. #91926 (János Benjamin Antal).system.zookeeper를 통해 보조 ZooKeeper에 삽입하는 기능을 지원합니다. #92092 (RinChanNOW).- Keeper에
KeeperChangelogWrittenBytes,KeeperChangelogFileSyncMicroseconds,KeeperSnapshotWrittenBytes,KeeperSnapshotFileSyncMicrosecondsprofile events와KeeperBatchSizeElements,KeeperBatchSizeBytes히스토그램 메트릭이 새로 추가되었습니다. #92149 (Miсhael Stetsyuk). - 새로운 설정
trace_profile_events_list를 추가했습니다. 이 설정은trace_profile_event를 사용하는 tracing을 지정된 이벤트 이름 목록으로 제한합니다. 이를 통해 대규모 workload에서 데이터를 더욱 정밀하게 수집할 수 있습니다. #92298 (Alexey Milovidov). - 일시 중지 가능한 failpoint용 SYSTEM NOTIFY FAILPOINT를 지원합니다. - SYSTEM WAIT FAILPOINT fp PAUSE/RESUME를 지원합니다. #92368 (Shaohua Wang).
system.data_skipping_indices에creation(implicit/explicit) 컬럼이 추가되었습니다. #92378 (Raúl Marín).- YTsaurus dyn 테이블의 컬럼 설명을 딕셔너리 소스에 전달할 수 있도록 했습니다. #92391 (MikhailBurdukov).
- #63985에서는 포트별로 TLS 구성에 필요한 모든 매개변수를 지정할 수 있게 했습니다(composable protocols 참조). 따라서 더 이상 전역 TLS 구성에 의존할 필요가 없습니다. 하지만 현재 구현에서는 여전히 전역
openSSL.server구성 섹션이 암묵적으로 필요하며, 이로 인해 포트마다 서로 다른 TLS 구성이 필요한 환경과 충돌합니다. 예를 들어 keeper-in-server 배포에서는 inter-keeper 통신과 clickhouse client 연결에 대해 각각 별도의 TLS 구성이 필요합니다. #92457 (Miсhael Stetsyuk). - 악의적인 페이로드를 방지하기 위해 바이너리 형식에서 디코딩할 수 있는 전체 타입 노드 수를 제한하는 새로운 설정
input_format_binary_max_type_complexity를 도입했습니다. #92519 (Raufs Dunamalijevs). - 실행 중인 작업이
system.background_schedule_pool{,_log}에 반영되도록 했습니다. 문서를 추가했습니다. #92587 (Azat Khuzhin). - 클라이언트에서 Ctrl+R로 검색할 때 일치하는 이력이 없으면 현재 쿼리를 실행합니다. #92749 (Azat Khuzhin).
EXPLAIN indices = 1을EXPLAIN indexes = 1의 별칭(alias)으로 지원합니다. #92483를 해결합니다. #92774 (Pranav Tiwari).- 이제 Parquet 리더에서 Tuple 또는 맵 컬럼을 JSON으로 읽을 수 있습니다. 즉,
f.parquet에서 컬럼x의 타입이 tuple 또는 map이어도select x from file(f.parquet, auto, 'x JSON')가 정상적으로 작동합니다. #92864 (Michael Kolupaev). - Parquet 리더에서 빈 튜플을 지원하도록 개선했습니다. #92868 (Michael Kolupaev).
- Azure Blob Storage에서 네이티브 복사가 BadRequest(예: 잘못된 블록 목록)로 실패할 경우 읽기-쓰기 복사로 폴백합니다. 이전에는 blob을 서로 다른 스토리지 계정으로 복사할 때 발생하는 인증되지 않음 오류에 대해서만 이렇게 처리했습니다. 하지만 “지정된 블록 목록이 잘못되었습니다” 오류도 간헐적으로 발생합니다. 이에 따라 이제 모든 네이티브 복사 실패 시 읽기 & 쓰기 방식으로 폴백하도록 조건을 업데이트했습니다. #92888 (Smita Kulkarni).
- EC2 인스턴스 프로필 자격 증명을 사용해 동시에 많은 S3 쿼리를 실행할 때 발생하던 EC2 메타데이터 엔드포인트 스로틀링 문제를 수정했습니다. 이전에는 각 쿼리가 자체
AWSInstanceProfileCredentialsProvider를 생성해 EC2 메타데이터 서비스로 동시 요청을 보내면서 타임아웃 및HTTP response code: 403오류가 발생할 수 있었습니다. 이제 자격 증명 공급자는 캐시되어 모든 쿼리에서 공유됩니다. #92891 (Sav). - 하위 호환성을 유지할 수 있도록
insert_select_deduplicate설정을 개선했습니다. #92951 (Sema Checherinda). - 작업 로그가 지나치게 많이 기록되는 것을 방지하기 위해 평균보다 느린 백그라운드 작업만 로그에 기록합니다 (
background_schedule_pool_log.duration_threshold_milliseconds=30). #92965 (Azat Khuzhin). - 이전 버전에서는 일부 C++ 함수 이름이
system.trace_log와system.symbols에 잘못(“mangled”) 표시되었고,demangle함수도 이를 제대로 처리하지 못했습니다. #93074를 해결했습니다. #93075 (Alexey Milovidov). - 갱신 가능 구체화 뷰를 백업에서 제외할 수 있도록
backup_data_from_refreshable_materialized_view_targets백업 설정을 도입했습니다. 항상 백업되는 APPEND 갱신 전략의 RMV는 예외입니다. #93076 (Julia Kartseva). #93658 (Julia Kartseva) - 함수처럼 처리가 무거운 번역 단위에는 디버그 정보를 전혀 사용하지 않는 대신 최소한의 디버그 정보를 사용합니다. #93079 (Alexey Milovidov).
- MinIO 전용 오류에 대한 오류 코드 매핑을 구현하여 AWS S3 C++ SDK에 MinIO 호환성 지원을 추가했습니다. 이 변경으로 AWS S3 대신 MinIO 배포를 사용할 때 ClickHouse가 MinIO 서버 오류를 올바르게 처리하고 재시도할 수 있게 되어, 자체 호스팅 MinIO 클러스터에서 객체 스토리지를 운영하는 사용자의 신뢰성이 향상됩니다. #93082 (XiaoBinMu).
- 심볼화된 jemalloc 프로파일을 기록합니다(힙 프로파일 생성 시 바이너리가 필요 없도록). #93099 (Azat Khuzhin).
- 대규모 커밋과 잘못된 커밋에서 동작하지 않던
clickhouse git-import도구를 다시 사용할 수 있게 했습니다. https://presentations.clickhouse.com/2020-matemarketing/ 를 참조하십시오. #93202 (Alexey Milovidov). - URL 스토리지 비밀번호를 쿼리 로그에 표시하지 않습니다. #93245 (Konstantin Vedernikov).
flipCoordinates에Geometry유형 지원을 추가했습니다. #93303 (Bharat Nallan).- SYSTEM INSTRUMENT ADD/REMOVE의 UX 개선: 함수 이름에 String 리터럴을 사용하고, 일치하는 모든 함수에 패치를 적용하며,
REMOVE에서 function_name을 사용할 수 있도록 했습니다. #93345 (Pablo Marcos). - 머지 과정에서 통계 구체화를 활성화하거나 비활성화하는 새로운 설정
materialize_statistics_on_merge를 추가했습니다. 기본값은1입니다. #93379 (Han Fei). - 이제 ClickHouse는
DESCRIBE SELECT쿼리에서 괄호 없이도SELECT를 파싱할 수 있습니다. #58382를 해결했습니다. #93429 (Yarik Briukhovetskyi). - 확률에 따라 캐시 정확성 검사를 무작위로 수행하도록 추가했습니다. #93439 (Kseniia Sumarokova).
- JSON에서 하나는 리터럴이고 다른 하나는 중첩 객체인 중복 경로를 허용하기 위해
type_json_allow_duplicated_key_with_literal_and_nested_object설정이 추가되었습니다. 예:{"a" : 42, "a" : {"b" : 42}}. 중복 경로에 대한 이 제한이 https://github.com/ClickHouse/ClickHouse/pull/79317 에 추가되기 전에 일부 데이터가 생성되었을 수 있으며, 이제 이러한 데이터를 추가로 처리하면 오류가 발생할 수 있습니다. 이 설정을 사용하면 이러한 기존 데이터도 오류 없이 계속 사용할 수 있습니다. #93604 (Pavel Kruglov). - Pretty JSON에서 단순 타입 값은 별도 줄에 출력하지 않도록 했습니다. #93836 (Pavel Kruglov).
alter table ... modify setting ...SQL 문이 많으면 5초 동안 잠금을 획득하지 못할 수 있습니다. 이 경우logical error대신timeout을 반환하는 편이 더 낫습니다. #93856 (Han Fei).- 구문 오류 발생 시 과도한 출력이 나오지 않도록 했습니다. 이 변경 전에는 전체 SQL 스크립트를 출력했는데, 여기에는 많은 쿼리가 포함될 수 있었습니다. #93876 (Alexey Milovidov).
- Keeper에서 통계가 포함된
check요청의 바이트 크기를 올바르게 계산하도록 수정했습니다. #93907 (Mikhail Artemenko). - 조인 재정렬 시 런타임 해시 테이블 크기 통계를 사용할지 제어하는
use_hash_table_stats_for_join_reordering설정이 추가되었습니다. 이 설정은 기본적으로 활성화되어 있어collect_hash_table_stats_during_joins의 기존 동작을 유지합니다. #93912 (Vladimir Cherkasov). - 이제
system.server_settings테이블에서 중첩된 전역 서버 설정(예:logger.level)을 일부 확인할 수 있습니다. 이는 고정된 구조를 가진 설정에만 해당합니다(목록, 열거형, 반복 등은 제외). #94001 (Hechem Selmi). - 이제
QBit에 대해 동등 비교를 수행할 수 있습니다. #94078 (Raufs Dunamalijevs). - Keeper가 손상된 스냅샷 또는 일관되지 않은 변경 로그를 감지하면, 수동으로 중단하거나 파일을 자동으로 정리하는 대신 예외를 발생시킵니다. 이렇게 하면 Keeper가 수동 개입에 의존하는 더 안전한 방식으로 동작하게 됩니다. #94168 (Antonio Andelic).
CREATE TABLE실패 시 남을 수 있는 잔여물 문제를 수정했습니다. #94174 (Azat Khuzhin).- 암호로 보호된 TLS 개인 키를 사용할 때 발생하는 초기화되지 않은 메모리 접근 문제(OpenSSL 버그)를 수정했습니다. #94182 (Konstantin Bogdanov).
- chdig를 v26.1.1로 업데이트했습니다. #94290 (Azat Khuzhin).
- S3Queue ordered mode에서 더 범용적인 파티셔닝을 지원합니다. #94321 (Bharat Nallan).
- 설정
allow_statistics_optimize의 별칭으로use_statistics가 추가되었습니다. 이는 기존 설정use_primary_key,use_skip_indexes와의 일관성을 높입니다. #94366 (Robert Schulze). - 요소의 존재 여부를 확인할 수 있도록 Numbers에서 Enums로 변환할 때
input_format_numbers_enum_on_conversion_error설정을 활성화했습니다. #94384 (Elmi Ahmadov). - S3(Azure)Queue ordered mode에서 추적 한도를 기준으로 실패한 노드를 정리하도록 개선했습니다(이전에는 실패한 항목과 처리된 항목 모두에 대해 Unordered mode에서만 정리했지만, 이제는 Ordered mode에서도 실패한 노드에 한해 정리합니다). #94412 (Kseniia Sumarokova).
- clickhouse-local에서
default사용자의 액세스 관리를 활성화했습니다.clickhouse-local의 기본 사용자에게access_management권한이 없어, 제한이 없어야 하는 사용자임에도DROP ROW POLICY IF EXISTS같은 작업이ACCESS_DENIED오류와 함께 실패했습니다. #94501 (Alexey Milovidov). - YTsaurus 딕셔너리 및 테이블에서 명명된 컬렉션을 사용할 수 있도록 합니다. #94582 (MikhailBurdukov).
- S3 및 Azure Blob Storage용 BACKUP/RESTORE에서 SQL로 정의된 이름이 지정된 컬렉션을 지원하도록 했습니다. #94604를 해결했습니다. #94605 (Pablo Marcos).
- S3Queue의 ordered 모드에서 파티션 키 기반 버킷팅을 지원합니다. #94698 (Bharat Nallan).
- 가장 오래 실행 중인 머지의 경과 시간을 나타내는 비동기 메트릭을 추가했습니다. #94825 (Raúl Marín).
- IcebergBitmapPositionDeleteTransform을 사용해 position delete를 적용하기 전에 대상 파일을 확인하는 절차를 추가했습니다. #94897 (Yang Jiang).
- 이제
view_duration_ms는 그룹이 활성 상태였던 시간을 표시하며, 그 안에 있는 스레드 실행 시간의 합계는 표시하지 않습니다. #94966 (Sema Checherinda). hasAnyTokens및hasAllTokens함수에서 최대 검색 토큰 수 제한을 제거했습니다. 기존에는 64개로 제한되어 있었습니다. 예시:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);검색 토큰이 65개이므로 이 쿼리는BAD_ARGUMENTS오류를 발생시켰습니다. 이 PR에서는 해당 제한이 완전히 제거되어 동일한 쿼리가 오류 없이 실행됩니다. #95152 (Elmi Ahmadov).- Numbers에서 Enum으로 변환할 때 요소의 존재 여부를 확인할 수 있는 설정
input_format_numbers_enum_on_conversion_error를 추가했습니다. 해결: #56144. #56240 (Nikolay Degterinsky). - 메모리 할당을 줄이기 위해 Iceberg 테이블에서 데이터 파일과 포지션 삭제 파일을 읽는 과정에 포맷 파서 리소스를 공유하도록 개선했습니다. #94701 (Yang Jiang).
버그 수정(공식 안정 릴리스에서 사용자에게 영향을 주는 오동작)
- 미리 정의된 쿼리 핸들러에서 삽입 중 후행 공백이 데이터로 해석되던 버그를 수정했습니다. #83604 (Fabian Ponce).
- Join storage에서 outer to inner join optimization이 적용될 때 발생하던 INCOMPATIBLE_TYPE_OF_JOIN 오류를 수정했습니다. #80794를 해결합니다. #84292 (Vladimir Cherkasov).
allow_experimental_join_right_table_sorting이 활성화된 상태에서 해시 조인을 사용할 때 발생하는 “Invalid number of rows in Chunk” 예외를 수정했습니다. #86440 (yanglongwei).- 파일 시스템이 대소문자를 구분하지 않으면 MergeTree에서 파일 이름을 항상 hash로 대체합니다. 이전에는 대소문자를 구분하지 않는 파일 시스템(MacOS 등)을 사용하는 시스템에서 여러 컬럼/하위 컬럼 이름이 대소문자만 다른 경우 데이터 손상이 발생할 수 있었습니다. #86559 (Pavel Kruglov).
- materialized view 내부의 기반 쿼리에 대해 생성 단계에서 전체 권한 검사를 수행하도록 추가합니다. #89180 (pufit).
- 상수 인수에서 발생하던
icebergHash함수 충돌 문제를 수정했습니다. #90335 (Michael Kolupaev). - 트랜잭션 없이 실행된 mutation이 최종적으로 롤백되는 활성 트랜잭션의 파트를 변경할 때 발생하던 논리 오류를 수정했습니다. #90469 (Shaohua Wang).
- 일반 데이터베이스를 atomic 데이터베이스로 변환한 후
system.warnings가 올바르게 갱신되도록 수정했습니다. #90473 (sdk2). - Parquet 파일을 읽을 때 prewhere 표현식의 일부가 쿼리의 다른 부분에서도 사용되는 경우 발생하던 assertion을 수정했습니다. #90635 (Max Kainov).
- split-by-buckets 모드에서 Iceberg를 읽을 때 단일 노드 cluster에서 발생하던 충돌을 수정했습니다. 이 수정으로 #90913이 해결되었습니다. #91553 (Konstantin Vedernikov).
- 서브컬럼 읽기 중 Log 엔진에서 발생할 수 있는 논리 오류를 수정했습니다. #91710을 해결합니다. #91711 (Pavel Kruglov).
- 논리 오류 수정: ATTACH AS REPLICATED 중 ‘Storage does not support transaction’ 오류. #91772 (Shaohua Wang).
- LEFT ANTI JOIN에 추가 사후 조건이 있을 때 런타임 필터가 잘못 동작하던 문제를 수정했습니다. #91824 (Alexander Gololobov).
- Nothing 타입이 포함된 null-safe 비교에서 발생하는 오류를 수정합니다. #91834를 해결합니다. #84870를 해결합니다. #91821를 해결합니다. #91884 (Yarik Briukhovetskyi).
- 네이티브 Parquet 리더에서 매우 반복적인 문자열 데이터에 영향을 주는 DELTA_BYTE_ARRAY 디코딩 버그를 수정했습니다. #91929 (Daniel Muino).
- 스키마 추론 중 글롭 패턴에서는 모든 파일이 아니라, 스키마가 추론된 해당 파일에 대해서만 스키마를 캐시합니다. #91745를 해결합니다. #92006 (Pavel Kruglov).
- 잘못된 아카이브 항목 크기 헤더로 인해 발생하던
Couldn't pack tar archive: Failed to write all bytes오류를 수정했습니다. #89075를 해결합니다. #92122 (Julia Kartseva). insert select에서 HTTP connection이 닫히지 않도록 요청 stream을 해제합니다. #92175 (Sema Checherinda).- 여러 조인과
USING절,join_use_nulls를 사용하는 쿼리에서 발생하는 논리 오류를 수정했습니다. #92251 (Vladimir Cherkasov). - join_use_nulls를 사용하는 join 재정렬 과정에서 발생하던 논리 오류를 수정하고, https://github.com/clickhouse/clickhouse/issues/90795를 종료했습니다. #92289 (Vladimir Cherkasov).
- negate 리터럴이 포함된 arrayElement의 일관되지 않은 AST 포맷팅을 수정했습니다. 해결 #92288 해결 #92212 해결 #91832 해결 #91789 해결 #91735 해결 #88495 해결 #92386. #92293 (Pavel Kruglov).
join_on_disk_max_files_to_merge설정에서 발생할 수 있는 충돌을 수정했습니다. #92335 (Bharat Nallan).- 관련 이슈: #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
SYSTEM SYNC FILE CACHE의 누락된 접근 권한 검사를 수정했습니다. #92101을 해결합니다. #92372 (Kseniia Sumarokova).- 윈도 함수와 여러 인수에 적용되는
count_distinct_optimization패스를 수정했습니다. #92376 (Raúl Marín). - 특정 집계 함수를 윈도우 함수와 함께 사용할 때 발생하는 “finalized buffer에 쓸 수 없음” 오류를 수정했습니다. #91415를 해결합니다. #92395 (Jimmy Aguilar Mena).
CREATE TABLE ... AS urlCluster()및 데이터베이스 엔진Replicated와 관련된 논리적 오류를 수정했습니다. #92216을 해결했습니다. #92418 (Kseniia Sumarokova).- MergeTree에서 mutation 수행 중 원본 part의 serialization 정보 설정을 상속하도록 했습니다. 이로써 데이터 타입 serialization이 변경된 후 mutation된 part에 대한 쿼리에서 잘못된 결과가 나올 수 있던 문제를 해결했습니다. #92419 (Pavel Kruglov).
- 같은 이름의 컬럼과 서브컬럼 간에 발생할 수 있는 충돌을 수정하여, 잘못된 직렬화가 사용되거나 쿼리가 실패하는 문제를 해결했습니다. #90219을 종료합니다. #85161을 종료합니다. #92453 (Pavel Kruglov).
- 외부 조인을 내부 조인으로 변환할 때 쿼리 계획(query plan)이 원치 않게 변경되어 발생하던
LOGICAL_ERROR를 수정했습니다. 또한 조인 중 집계 키에 단사 함수가 적용되는 경우에도 이 최적화를 적용할 수 있도록 최적화 요건을 완화했습니다. #92503 (János Benjamin Antal). - 빈 튜플 컬럼을 정렬할 때 발생할 수 있는 오류
SIZES_OF_COLUMNS_DOESNT_MATCH를 수정했습니다. #92422를 해결합니다. #92520 (Pavel Kruglov). - JSON 타입에서 호환되지 않는 타입 지정 경로가 있는지 확인합니다. #91577을 해결했습니다. #92539 (Pavel Kruglov).
- Backup 데이터베이스의 SHOW CREATE DATABASE에서 발생하던 교착 상태를 수정했습니다. #92541 (Azat Khuzhin).
- hypothesis 인덱스를 검증할 때 적절한 오류 코드를 사용합니다. #92559 (Raúl Marín).
- 분석기에서 컬럼 별칭 내 동적 서브컬럼 해상도 문제를 수정했습니다. 이전에는 컬럼 별칭의 동적 서브컬럼이
getSubcolumn으로 감싸져 있었고, 경우에 따라 아예 해상되지 않을 수 있었습니다. #91434를 해결합니다. #92583 (Pavel Kruglov). - 두 번째 인수가 NULL일 때
tokens()에서 발생할 수 있는 충돌을 방지합니다. #92586 (Raúl Marín). - 기반 const PREWHERE 컬럼을 제자리에서 수정하면서 발생할 수 있는 잠재적 비정상 종료 문제를 수정했습니다. 이 문제는 컬럼을 축소(
IColumn::shrinkToFit)하거나 필터링(IColumn::filter)할 때 발생할 수 있었으며, 여러 스레드에서 동시에 트리거될 수 있었습니다. #92588 (Arsen Muk). - 대용량 파트(4,294,967,295개 행 초과)를 포함한 테이블에서는 텍스트 인덱스를 생성하거나 구체화하는 기능이 일시적으로 비활성화되었습니다. 현재 인덱스 구현은 아직 이처럼 큰 파트를 지원하지 않으므로, 이 제한은 잘못된 쿼리 결과를 방지합니다. #92644 (Anton Popov).
- JOIN 실행 중 발생하는 논리적 오류
Too large size (A) passed to allocator를 수정했습니다. #92043를 해결합니다. #92667 (Yarik Briukhovetskyi). - ngram 길이(첫 번째 매개변수)가 8보다 큰
ngrambf_v1인덱스에서 예외가 발생하던 버그를 수정했습니다. #92672 (Robert Schulze). - zookeeper storage를 사용할 때 백그라운드에서 이름이 지정된 컬렉션을 다시 로드하는 과정에서 발생하던 처리되지 않은 예외를 수정했습니다. https://github.com/ClickHouse/clickhouse-private/issues/44180 를 해결합니다. #92717 (Kseniia Sumarokova).
- 와일드카드 권한 부여에 대한 접근 권한 검사 로직의 오류를 수정했습니다. 이전 시도인 https://github.com/ClickHouse/ClickHouse/pull/90928에서는 심각한 취약점을 해결했지만, 지나치게 제한적으로 적용되는 바람에 관련 없는 권한 취소로 인해 일부 와일드카드
GRANTSQL 문이 실패했습니다. #92725 (pufit). WHERE에서not match(...)를 사용할 때 데이터 스키핑 로직에 버그가 있어 잘못된 결과가 발생하던 문제를 수정했습니다. #92492를 닫습니다. #92726 (Nihal Z. Miaji).- 읽기 전용 디스크에 MergeTree 테이블이 생성된 경우, 시작 시 임시 디렉터리 삭제를 시도하지 않도록 했습니다. #92748 (Alexey Milovidov).
- ALTER TABLE REWRITE PARTS (v2)에서 발생하던 “빈 ExpressionActionsChain에 action을 추가할 수 없음” 오류를 수정했습니다. #92754 (Azat Khuzhin).
- 연결이 끊긴
Connection에서 읽을 때 발생하는 비정상 종료를 방지합니다. #92807 (Raufs Dunamalijevs). Ordered모드의S3Queue스토리지에서 발생하던 논리 오류Failed to set file processing within 100 retries를 수정했습니다. 이제 이 오류는 경고로 대체되었습니다. 이 오류는 Keeper 세션이 만료되면 25.10 버전 이전에 발생할 수 있었지만,Ordered모드에서 처리 동시성이 높을 경우 이론적으로는 여전히 발생할 수 있으므로 25.10+ 버전에서도 경고로 유지됩니다. #92814 (Kseniia Sumarokova).- 이전에는 조건이 false인 PK 세그먼트 분할을 사용하는 일부 쿼리가 실패했습니다. 이제는 더 이상 실패하지 않습니다. https://github.com/ClickHouse/ClickHouse/pull/89313에 필요합니다. #92815 (Yarik Briukhovetskyi).
system.parts테이블에서 텍스트 인덱스의 압축되지 않은 크기 계산을 바로잡았습니다. #92832 (Anton Popov).WHERE절 프레디케이트에 서브쿼리가 있는IN절을 포함한 경량 업데이트에서 프라이머리 인덱스 사용을 수정했습니다. #92838 (Anton Popov).- JSON에서 경로 ‘skip’의 타입 힌트 생성 문제를 수정했습니다. #92731을 해결합니다. #92842 (Pavel Kruglov).
- S3 테이블 엔진에서는 비결정적 함수가 있는 경우 파티션 키를 캐시하지 않아야 합니다. #92844 (Miсhael Stetsyuk).
ratio_of_defaults_for_sparse_serialization=0.0에서 희소 컬럼에 mutation을 수행한 후 발생할 수 있는FILE_DOESNT_EXIST오류를 수정했습니다. #92633를 해결합니다. #92860 (Pavel Kruglov).- 기존 Parquet 리더(기본적으로 사용되지 않음)에서 JSON 컬럼이 튜플 컬럼 뒤에 오는 경우의 Parquet 스키마 추론 문제를 수정했습니다. 빈 튜플에서 실패하던 기존 Parquet 리더(기본적으로 사용되지 않음) 문제를 수정했습니다. #92867 (Michael Kolupaev).
- 상수 조건과
join_use_nulls를 사용하는 여러 조인에서 발생하는 논리 오류를 수정하고 #92640을 해결했습니다. #92892 (Vladimir Cherkasov). - 파티션 표현식에 하위 컬럼이 포함된 테이블에 삽입할 때 발생할 수 있는 오류
NOT_FOUND_COLUMN_IN_BLOCK를 수정했습니다. #93210을 닫습니다. #83406을 닫습니다. #92905 (Pavel Kruglov). - 별칭이 있는 테이블에 대한 Merge engine에서
NO_SUCH_COLUMN_IN_TABLE오류를 수정했습니다. #88665를 해결합니다. #92910 (Pavel Kruglov). - LowCardinality(Nullable(T)) 컬럼에서 full_sorting_join의 NULL != NULL 문제를 수정했습니다. #92924 (Vladimir Cherkasov).
MergeTree테이블에서 텍스트 인덱스를 머지하는 동안 발생하던 여러 크래시를 수정했습니다. #92925 (Anton Popov).- 테이블 최적화 중 예외를 방지하기 위해, TTL 집계 시 필요한 경우 SET 표현식 결과에 LowCardinality 래퍼를 복원합니다. #92971 (Seva Potapov).
- 빈 배열을
has함수에 사용할 때 인덱스 분석 중 발생하던 논리 오류를 수정했습니다. #92906을 해결합니다. #92995 (Nihal Z. Miaji). - 종료 중인 백그라운드 스케줄 풀에서 발생할 수 있는 멈춤 현상을 수정했습니다(종료 시 server가 멈출 수 있음). #93008 (Azat Khuzhin).
- ALTER를 통해
ratio_of_defaults_for_sparse_serialization설정을1.0으로 변경한 뒤 희소 컬럼 mutation 중 발생할 수 있는 FILE_DOESNT_EXIST 오류를 수정했습니다. #93016 (Pavel Kruglov). - WHERE에서
not materialize(...)또는not CAST(...)를 사용할 때 데이터 스키핑 로직에 발생하던 버그를 수정해 잘못된 결과가 반환되던 문제를 해결했습니다. #88536을 닫습니다. #93017 (Nihal Z. Miaji). - 공유 파트에서 TOCTOU 경쟁 상태로 인해 오래된 파트가 사용될 수 있던 문제를 수정했습니다. #93022 (Azat Khuzhin).
- 범위를 벗어난 오프셋을 포함한 잘못된
groupConcat집계 상태를 역직렬화할 때 발생하는 충돌을 수정했습니다. #93028 (Raufs Dunamalijevs). - 분산 쿼리를 사전 취소한 뒤 연결이 손상된 상태로 남는 문제를 수정했습니다. #93029 (Azat Khuzhin).
- 오른쪽 조인 키가 희소 컬럼인 경우 JOIN 결과가 올바르게 나오도록 수정했습니다. 이 변경으로 #92920를 해결합니다. 이 버그는
set compatibility='23.3'에서만 재현됩니다. 백포트해야 할지는 확실하지 않습니다. #93038 (Amos Bird). estimateCompressionRatio()에서 발생할 수 있는Cannot finalize buffer after cancellation문제를 해결했습니다. 수정 사항: #87380. #93068 (Azat Khuzhin).- 복잡한 표현식(예:
concat(col1, col2))을 기반으로 생성된 텍스트 인덱스가 머지될 때 발생하던 문제를 수정했습니다. #93073 (Anton Popov). - 필터에 서브컬럼이 포함된 경우에도 프로젝션이 적용되도록 수정했습니다. #92882를 해결했습니다. #93141 (Pavel Kruglov).
- JOIN 런타임 필터가 쿼리 계획에 추가될 때 일부 경우에 발생하던 논리 오류를 수정했습니다. 이 문제는 JOIN 한쪽에서 중복된 const 컬럼을 잘못 반환해 발생했습니다. #93144 (Alexander Gololobov).
- JOIN 런타임 필터에서 사용하는 특수 함수
__applyFilter가 일부 정상적인 경우에도 ILLEGAL_TYPE_OF_ARGUMENT를 반환하던 문제가 있었습니다. #93187 (Alexander Gololobov). - 보간된 컬럼이 사실상 동일한 컬럼의 별칭인 경우, 블록에서 서로 다른 보간된 컬럼이 하나의 동일한 컬럼으로 합쳐지는 현상을 방지했습니다. #93197 (Yakov Olkhovskiy).
- 이미 채워진 오른쪽 테이블과 join할 때는 런타임 필터를 추가하지 않도록 했습니다. #93211 (Alexander Gololobov).
- 비정상 종료된 session 이후 Keeper 영구 watch 정리 문제를 수정했습니다. 이로써 #92480가 해결됩니다. #93213 (Konstantin Vedernikov).
- Iceberg의 ORDER BY tuple 관련 문제를 수정했습니다. 이로써 #92977가 해결되었습니다. #93225 (Konstantin Vedernikov).
- S3Queue 설정
s3queue_migrate_old_metadata_to_buckets관련 버그를 수정했습니다. #93392, #93196, #81739를 해결합니다. #93232 (Kseniia Sumarokova). - 머지 중 프로젝션을 다시 빌드할 때 사용하지 않는 컬럼을 제거합니다. 이렇게 하면 메모리 사용량이 줄고 임시 파트 생성도 감소합니다. #93233 (Nikolai Kochetov).
- 스칼라 상관 서브쿼리가 있는 상황에서 서브쿼리의 미사용 컬럼이 제거되는 문제를 수정했습니다. 수정 전에는 상관 서브쿼리에서만 사용되는 컬럼이 제거될 수 있었고, 그 결과 쿼리가
NOT_FOUND_COLUMN_IN_BLOCK오류로 실패했습니다. #93273 (Dmitry Novik). - 원본 테이블 ALTER 시 MV에서 하위 컬럼(subcolumn)이 누락될 수 있는 문제를 수정했습니다. #93231를 해결했습니다. #93276 (Pavel Kruglov).
- 로컬 테이블과 원격/분산 테이블을 함께 머지할 때
hostName()에 대해 ILLEGAL_COLUMN이 발생할 수 있었던, 분석기의Merge테이블 엔진 쿼리 계획 수립 문제를 수정했습니다. #92059를 해결합니다. #93286 (Jinlin). - 비상수 배열 인수를 사용하는 NOT IN이 잘못된 값을 반환하던 문제를 수정하고, 비상수 배열 함수 지원을 추가합니다. #14980을 해결합니다. #93314 (Yarik Briukhovetskyi).
use_top_k_dynamic_filtering최적화에서 발생하던Not found column문제를 수정했습니다. #93186를 해결합니다. #93316 (Nikolai Kochetov).- 서브컬럼에 생성된 텍스트 인덱스의 재구축 문제를 수정했습니다. #93326 (Anton Popov).
hasAllTokens및hasAnyTokens함수에서 두 번째 인수인 빈 배열 처리 방식을 수정했습니다. #93328 (Anton Popov).- 오른쪽 테이블에 대한 합계가 있는 쿼리에서 런타임 필터를 사용할 때 발생하는 논리 오류를 수정했습니다. #93330 (Alexander Gololobov).
- 함수
tokens를 비상수 토크나이저 매개변수(2번째, 3번째, 4번째 매개변수)와 함께 호출해도(예:SELECT tokens(NULL, 1, materialize(1))) 서버가 더 이상 충돌하지 않습니다. #93383 (Robert Schulze). - 악의적으로 조작된 집계 상태로 인해 메모리 안전성 문제가 발생할 수 있었던
groupConcat상태 역직렬화의 정수 오버플로우 취약점을 수정했습니다. #93426 (Raufs Dunamalijevs). - 인덱스에 토큰이 전혀 없는 경우(모든 배열이 비어 있거나 모든 토큰이 토크나이저에 의해 건너뛰어지는 경우) 배열 컬럼의 텍스트 인덱스 분석 문제를 수정했습니다. #93457 (Anton Popov).
- 사용자 이름/비밀번호가 connection string에 포함된 경우 ClickHouse Client에서 OAuth 로그인을 건너뜁니다. #93459 (Krishna Mannem).
- DataLakeCatalog에서 Azure ADLS Gen2의 제공된 자격 증명 지원을 수정했습니다 - Iceberg REST 카탈로그에서
adls.sas-token.*키를 파싱하고 ABFSS URL 파싱을 수정했습니다. #93477 (Karun Anantharaman). - 분석기 사용 시 GLOBAL IN 지원 문제를 수정했습니다(이전에는 Set이 원격 노드에 다시 생성되었습니다). #93507 (Azat Khuzhin).
- 역직렬화 과정에서 subcolumn을 희소 컬럼에 직접 추출하던 문제를 수정했습니다. #93512 (Pavel Kruglov).
- 중복된 검색 쿼리에서 텍스트 인덱스의 직접 읽기가 제대로 동작하지 않던 문제를 수정했습니다. #93516 (Anton Popov).
- 런타임 필터가 활성화된 상태에서 JOIN된 테이블이 동일한 컬럼을 여러 번 반환할 때(예: SELECT a, a, a FROM t) 발생하는 NOT_FOUND_COLUMN_IN_BLOCK 오류를 수정했습니다. #93526 (Alexander Gololobov).
- ssh를 사용해 연결할 때 clickhouse-client가 비밀번호를 두 번 물어보던 버그를 수정했습니다. #93547 (Isak Ellmer).
- 종료 시 zookeeper가 확실히 마무리되도록 하여, 극히 드문 경우 종료 과정이 멈출 수 있는 문제를 수정했습니다. #93602 (Azat Khuzhin).
- 중복 제거 경쟁 상태로 인해 ReplicatedMergeTree 복원 시 발생하는 LOGICAL_ERROR를 수정했습니다. #93612 (Pablo Marcos).
- 일부 입력 형식에서 희소 컬럼으로 직접 역직렬화할 때 TTL 업데이트에 희소 컬럼을 사용하던 문제를 수정했습니다. 이 수정으로
Unexpected type of result TTL column논리 오류가 발생할 가능성을 해결합니다. #93619 (Pavel Kruglov). - 잘못된 입력값으로 호출될 때 H3 인덱스 함수가 때때로 충돌하거나 멈추는 문제를 수정했습니다. #93657 (Michael Kolupaev).
- UTF-8이 아닌 데이터에
ngram_bf인덱스를 사용하면 초기화되지 않은 메모리를 읽을 수 있었고, 그 결과 해당 인덱스 구조에 포함될 수 있는 값이 노출될 수 있었습니다. #92576을 해결합니다. #93663 (Alexey Milovidov). - 압축 해제된 버퍼 크기가 예상대로인지 확인합니다. #93690 (Raúl Marín).
merge테이블 엔진 사용 시SHOW COLUMNS권한을 확인하지 않고는 테이블의 컬럼 목록을 가져올 수 없도록 했습니다. #93695 (János Benjamin Antal).- 서브컬럼 위에 생성된 스킵 인덱스의 머티리얼라이즈 문제를 수정했습니다. #93708 (Anton Popov).
PipelineExecutor가 살아 있는 동안IStorage객체가 파괴되지 않도록 스토리지의 공유 포인터를QueryPipeline::resources::storage_holders에 저장합니다. #93746 (Miсhael Stetsyuk).- 재시작 후 interserver host가 변경된 경우 Replicated DB를 ATTACH할 때 발생하던 문제를 수정했습니다. #93779 (Tuan Pham Anh).
- cache가 활성화된 경우 발생하던
ReadBufferFromS3의 assert!read_until_position를 수정했습니다. #93809 (Kseniia Sumarokova). - 빈 Tuple이
Map컬럼과 함께 사용될 때 드물게 발생하던 논리 오류를 수정했습니다. #93784를 해결했습니다. #93814 (Nihal Z. Miaji). - 머지 중 프로젝션을 재구축할 때 발생하던
_part_offset손상을 수정하고,_part_offset컬럼의 불필요한 읽기를 피하며 프로젝션 계산에서 필요 없는 컬럼을 건너뛰도록 해 프로젝션 처리를 최적화했습니다. 이는 #93233에서 도입된 최적화를 이어갑니다. #93827 (Amos Bird). - ‘Bad version’ 처리 로직 제거. #93843 (Anton Ivashkin).
- 키가 부호 있는 정수형일 때 분산 쿼리에서
optimize_inverse_dictionary_lookup가 작동하지 않던 문제를 수정했습니다. #93259를 해결합니다. #93848 (Nihal Z. Miaji). - 분산
remote()쿼리에서lag/lead가 작동하지 않던 문제를 수정했습니다. #90014를 해결했습니다. #93858 (Nihal Z. Miaji). - system instrument 디스패치 관련 버그를 수정했습니다. #93937 (Pablo Marcos).
- https://github.com/ClickHouse/ClickHouse/pull/89173에서
TraceSender가 내부 파이프를 통해 전송하는 구조에 필드를 하나 추가했습니다. 하지만 버퍼 크기는 업데이트되지 않았고(여기 참조), 그 결과buffer_size를 초과하는 데이터를 버퍼에 쓰게 되어 플러시가 여러 번 발생합니다. 또한TraceSender::send는 여러 스레드에서 호출되므로 각 스레드의 플러시가 서로 뒤섞일 수 있고, 이로 인해 수신 측인TraceCollector가 의존하는 불변식이 깨집니다. #93966 (Miсhael Stetsyuk). - 스토리지
Join에서USING절을 사용하는 join 연산 중 super type으로의 형 변환을 수정했습니다. #91672을 해결합니다. #78572를 해결합니다. #94000 (Dmitry Novik). - join 런타임 필터가 Merge 테이블에 적용된 경우 FilterStep이 올바르게 추가되지 않던 문제를 수정했습니다. #94021 (Alexander Gololobov).
- 블룸 필터 스킵 인덱스가 적용된 여러 컬럼 프레디케이트와
OR,NOT조건이 모두 포함된SELECT쿼리는 일관성 없는 결과를 반환할 수 있었습니다. 이제 이 문제가 수정되었습니다. #94026 (Shankar Iyer). - 종속 인덱스가 있는 컬럼에서 CLEAR 동작을 수정했습니다. #94057 (Raúl Marín).
ReadWriteBufferFromHTTP에서 초기화되지 않은 값을 사용하는 문제를 수정했습니다. #94058 (Alexey Milovidov).- JSON에서 타입이 지정된 경로에 대한 잘못된 검사 로직을 수정했습니다. 이 검사는 https://github.com/ClickHouse/ClickHouse/pull/92842 에서 도입되었으며, 기존 테이블 시작 시 오류를 유발할 수 있습니다. #94070 (Pavel Kruglov).
- OUTER JOIN이 있는 경우 필터 분석 중 발생하는 크래시를 수정했습니다. #90979를 해결했습니다. #94080 (Dmitry Novik).
- 병렬 환경에서 UInt8 집계 키를 사용할 때(
max_threads> 1 - 기본값)uniqTheta의 정확도 문제를 수정했습니다. #94095 (Azat Khuzhin). SCOPE_EXIT내부의socket.setBlocking(true)호출에서 발생한 예외로 인해 생기던 크래시를 수정했습니다. #94100 (Miсhael Stetsyuk).- ReplicatedMergeTree에서
DROP PARTITION이 이후 로그 엔트리에서 생성된 파트를 삭제하면서 발생하던 데이터 손실 문제를 수정했습니다. #94123 (Tuan Pham Anh). - 페이지 경계를 넘는 배열을 Parquet 리더 v3가 잘못 처리하던 문제가 수정되었습니다. 이는 예를 들어 Arrow가 페이지 통계나 페이지 인덱스를 활성화하지 않은 상태로 작성한 파일에서 발생합니다. 영향은 Array 데이터 타입의 컬럼에만 미칩니다. 대표적인 증상은 데이터 약 1 MB마다 배열 하나가 잘리는 것입니다. 이 수정이 적용되기 전에는 우회책으로 다음 설정을 사용하십시오:
input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev). - Log entry를 기다리는 동안 ReplicatedMergeTree에서 watch가 과도하게 생성되던 문제를 수정했습니다. #94133 (Azat Khuzhin).
- 함수
arrayShuffle,arrayPartialShuffle,arrayRandomSample에서 const 컬럼을 구체화해 각 행마다 다른 결과를 반환하도록 했습니다. #94134 (Joanna Hulboj). - materialized view에서 테이블 함수를 평가할 때 발생하던 데이터 레이스를 수정했습니다. #94171 (Alexey Milovidov).
- 쿼리가 잘못된 경우
PostgreSQL데이터베이스 엔진에서 발생하는 nullptr 역참조 문제를 수정했습니다. #92887를 해결합니다. #94180 (Alexey Milovidov). - 여러 서브쿼리가 있는
SELECT쿼리를 사용하는 갱신 가능 구체화 뷰의 메모리 누수를 수정했습니다. #94200 (Antonio Andelic). DataPartStorageOnDiskBase::remove와system.parts사이의 경쟁 상태(data race)를 수정했습니다. #49076를 해결합니다. #94262 (Alexey Milovidov).- 메모리 예외 발생 시 크래시(
std::terminate)를 유발할 수 있는 HashTable 복사 대입의 잘못된noexcept지정자를 제거했습니다. #94275 (Nikita Taranov). - 이전에는 GROUP BY에 중복된 컬럼이 있는 프로젝션(예:
GROUP BY c0, c0)을 생성하고 데이터를 삽입하면,optimize_row_order가 활성화된 경우std::length_error가 발생했습니다. #94065를 해결합니다. #94277 (Alexey Milovidov). - 연결 시 멈춤 및 크래시를 유발하던 ZooKeeper 클라이언트의 발견하기 어려운 버그를 수정했습니다. #94320 (Azat Khuzhin).
- 서브컬럼에 적용되지 않던 function to subcolumns 최적화 문제를 수정했습니다. #94323 (Pavel Kruglov).
enable_lazy_columns_replication이 활성화된 상태에서 중첩된 RIGHT JOIN에서 발생할 수 있던 잘못된 결과를 수정했습니다. 이 버그로 인해 복제된 컬럼의 모든 행이 각기 다른 값 대신 동일한 값을 잘못 반환했습니다. #93891을 해결했습니다. #94339 (Vladimir Cherkasov).- 등가 집합을 사용하는 SEMI JOIN의 필터 pushdown을 수정했습니다. 인수 타입이 변경된 경우에는 필터를 pushdown하지 않습니다. #93264를 수정했습니다. #94340 (Dmitry Novik).
- DataLake 데이터베이스 엔진에서 DeltaLake CDF 사용을 수정했습니다(delta lake catalogs 통합). #94122를 해결했습니다. #94342 (Kseniia Sumarokova).
SLRU캐시 정책 사용 시 현재 메트릭FilesystemCacheSizeLimit의 값이 잘못 표시되던 문제를 수정했습니다. #94363 (Kseniia Sumarokova).- 이제 2개 미만의 인수로 Backup 데이터베이스 엔진을 생성하면
std::out_of_range: InlinedVector::at(size_type) const failed bounds check.대신Wrong number of arguments라는 더 명확한 오류 메시지가 반환됩니다. #94374 (Robert Schulze). - grant option이 있는 권한에 대해 데이터베이스 수준에서 전역 권한을 취소할 수 없는 경우 이를 무시합니다. #94386 (pufit).
- compact 파트에서 희소 오프셋을 읽을 때 발생하던 문제를 수정했습니다. #94385를 해결했습니다. #94399 (Pavel Kruglov).
alter_column_secondary_index_mode의throw모드를 사용하더라도, 암시적 인덱스를 사용하는 컬럼에 대한 ALTER를 막지 않습니다. #94425 (Raúl Marín).- 여러
receivePacketsExpectQuery호출에서Protocol::Client::IgnoredPartUUIDs를 읽을 때TCPHandler가 크래시 나는 문제를 수정했습니다. #94434 (Miсhael Stetsyuk). system.functions에서 민감한 데이터 마스킹 문제를 수정했습니다. #94436 (Vitaly Baranov).- 비활성화된
send_profile_events에서 발생하던 nullptr 역참조 문제를 수정했습니다. 이 기능은 최근 ClickHouse Python driver에 도입되었습니다. #92488을 해결합니다. #94466 (Alexey Milovidov). - 머지 중 발생하는 text index .mrk 비호환성 문제를 수정했습니다. #94494 (Peng Jian).
read_in_order_use_virtual_row가 활성화되면, 인덱스가 잘렸는지 확인하지 않은 상태에서 코드가 전체 프라이머리 키(primary key) 크기를 기준으로 인덱스 컬럼에 접근해 use-after-free / 초기화되지 않은 메모리 문제가 발생했습니다. #85596를 해결합니다. #94500 (Alexey Milovidov).- 타입이 널 허용(Nullable)인 경우, GLOBAL IN을 사용하는 서브쿼리에 외부 테이블(external table)을 전송할 때 발생하던 타입 불일치 오류를 수정했습니다. #94097를 해결합니다. #94511 (Alexey Milovidov).
- 이전 버전에서는 동일한 표현식에 대해 여러 인덱스 조건을 사용하는 쿼리에서
Not found column예외가 잘못 발생할 수 있습니다. #60660을 해결했습니다. #94515 (Alexey Milovidov). - 런타임 필터에서 널 허용 조인 컬럼이 잘못 처리되던 문제를 수정했습니다. #94555 (Alexander Gololobov).
- 현재 사용 중인 다른 워크로드 내에서 워크로드를 생성해도 더 이상 비정상 종료가 발생하지 않습니다. #94599 (Sergei Trifonov).
- 존재하지 않는 컬럼에 대해
isNotNull을 평가할 때 ANY LEFT JOIN 최적화 중 발생하던 충돌을 수정했습니다. #94600 (Molly). - 계산된 기본값이 설정된 다른 컬럼을 참조할 때 기본 표현식 평가가 올바르게 이루어지지 않던 문제를 수정했습니다. #94615 (Alexey Milovidov).
- BACKUP/RESTORE 작업에서 발생하던 권한 문제를 수정했습니다. #94617 (Pablo Marcos).
- 데이터 타입이
Nullable(DateTime64)인 경우 잘못된 타입 변환으로 인해 발생하는 충돌을 수정했습니다. #94627 (Miсhael Stetsyuk). ORDER BY가 포함된 특정 분산 쿼리에서ALIAS컬럼의 값이 서로 뒤바뀌어 반환되던 버그(즉, 컬럼a에 컬럼b의 데이터가 표시되고 그 반대도 발생하는 문제)를 수정했습니다. #94644 (filimonov).- keeper-bench 결과를 파일로 저장하는 문제를 수정했습니다. #94654 (Antonio Andelic).
- 컬럼에 음수 부동소수점 값이 포함된 경우 MinMax 유형 통계에서 발생하는 잘못된 추정치를 수정했습니다. #94665 (zoomxi).
- 맵의 key가 struct인 경우 Parquet 파일을 읽지 못하던 문제를 수정했습니다. #94670 (Konstantin Vedernikov).
- 복잡한 ON 조건을 사용할 때 발생할 수 있는 잘못된 RIGHT JOIN 결과를 수정했습니다. #92913를 해결했습니다. #94680 (Vladimir Cherkasov).
- 수직 병합 후에도 일정한 인덱스 세분화 수준(use_const_adaptive_granularity)이 유지되도록 했습니다. #94725 (Azat Khuzhin).
- 스칼라 서브쿼리와 테이블 의존성과 관련된 mutation 버그를 수정했습니다. 테이블에 특정 컬럼에 대한 의존성(인덱스 또는 프로젝션)이 있으면 스칼라 서브쿼리가 데이터 없이 평가되어 캐시될 수 있었고, 이로 인해 잘못된 변경이 발생할 수 있었습니다. #94731 (Raúl Marín).
- 오류 발생 시 AsynchronousMetrics cpu_pressure 폴백이 올바르게 동작하도록 수정했습니다. #94827 (Raúl Marín).
getURLHostRFC함수는 포인터를 역참조하기 전에 경계 검사(bounds check)가 없었습니다. 빈 문자열이domainRFC에 전달되면 초기화되지 않은 메모리를 읽게 되어 MSan 오류가 발생했습니다. #94851 (Alexey Milovidov).- 암호화된 디스크가 읽기 전용으로 처리되던 문제를 수정했습니다. #94852 (Azat Khuzhin).
- 분산 테이블에서 이전 분석기를 사용할 때 소수형
LIMIT/OFFSET에 발생하던 논리 오류를 수정했습니다. #94712을 해결합니다. #94999 (Ahmed Gouda). - 기본적으로 JOIN 런타임 필터가 활성화된 경우 일부 조건에서 발생하던 충돌을 수정했습니다. #95000 (Alexander Gololobov).
- 테이블 엔진
URL()및 테이블 함수url()에서 사용하는 URL의 비밀번호 마스킹을 개선했습니다. #95006 (Vitaly Baranov). - 함수
toStartOfInterval은 이제enable_extended_results_for_datetime_functions가 활성화되어 있을 때,X가Day, Week, Month, Quarter, Year인 경우toStartOfX와 동일하게 동작합니다. #95011 (Kirill Kopnev). - 상수 문자열 비교에서 설정
cast_string_to_date_time_mode,bool_true_representation,bool_false_representation,input_format_null_as_default가 반영되지 않던 문제를 수정했습니다. #91681를 해결합니다. #95040 (Nihal Z. Miaji). - 파일 시스템 캐시의 데이터 레이스 문제를 수정합니다. #95064 (Alexey Milovidov).
- Parquet 리더에서 드물게 발생하던 경쟁 상태 문제를 수정했습니다. #95068 (Alexey Milovidov).
LIMIT가 0일 때 top K 최적화에서 발생하던 충돌을 수정했습니다. #93893를 해결합니다. #95072 (Alexey Milovidov).- DateTime/정수에서 Time64로 변환할 때는 단조 함수가 아닌
toTime을 사용해 하루 중 시간 부분을 추출합니다.ToDateTimeMonotonicity템플릿이 이 변환이 단조적이라고 잘못 판단하여, 디버그 빌드에서 “Invalid binary search result in MergeTreeSetIndex” 예외가 발생했습니다. #95125 (Alexey Milovidov). - 필요한 경우에만 manifest 파일 항목 목록을 다시 생성하도록 했습니다(이전에는 반복할 때마다 다시 생성되었습니다). #95162 (Daniil Ivanik).
빌드/테스트/패키징 개선
- jemalloc의 힙 프로파일링 기능을 사용해 ClickHouse SQL 파서의 메모리 할당을 프로파일링하는 도구 모음을 추가했습니다. #94072 (Ilya Yatsishin).
- 파서의 메모리 할당 디버깅을 간소화하는 도구를 추가했습니다. 이 도구는 쿼리를 AST 표현으로 파싱하기 전후의 jemalloc
stats.allocated메트릭을 사용해 무엇이 할당되었는지 보여줍니다. 또한, 할당이 발생한 위치에 대한 보고서를 만들 수 있도록 전후 시점의 프로필을 덤프하는 메모리 프로파일링 모드도 지원합니다. #93523 (Ilya Yatsishin). - 전이적으로 포함되는 libc++ include를 제거했습니다. #92523 (Raúl Marín).
- 일부 순차 테스트를 병렬로 실행되도록 변경했습니다: https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df. #93030 (Nikita Fomichev).
- 일부 빌드 플래그를 정리했습니다. #93679 (Raúl Marín).
- c-ares를 v1.34.5에서 v1.34.6으로 올렸습니다. 이는 ClickHouse와 관련 없는 c-ares의
CVE-2025-62408문제를 해결합니다. #94129 (Govind R Nair). curl8.18.0을 사용합니다. #94742 (Konstantin Bogdanov).