Repository navigation
Release Notes: pg_store_plans 1.10e1
주요 변경 사항
1. PostgreSQL 버전별 지원 및 호환성 보강
- 업그레이드 경로
- 1.9e1 → 1.10e1 업그레이드 지원 (
pg_store_plans--1.9e1--1.10e1.sql제공)
- 1.9e1 → 1.10e1 업그레이드 지원 (
- 지원 버전
- 1.10e1: PostgreSQL 14~18 전 버전에 걸친 호환성 안정화
- 1.9e1: PostgreSQL 16 이하 및 17 모두 지원
- PostgreSQL 18 토큰 타입 분리 (upstream 1.10 결함 수정)
- upstream 1.10이 PG17 분기를 PG18까지 그대로 확장하여 PG18에서
NULL,TRUE,FALSE,LOCALTIME(STAMP)상수의 정규화에 실패, 동일 logical plan에 대해planid가 불안정해져 중복 plan entry가 생성됨 - 1.10e1은 PG17/PG18 분기를 분리하고 PG18 전용 토큰 값을 적용하여 정규화 동작 복원
- upstream 1.10이 PG17 분기를 PG18까지 그대로 확장하여 PG18에서
- PG14~17용 대체 expected 파일 갱신
- 1.10의 PG18 지원 커밋이
store.out만 갱신하고store_2.out에 staleAsync Capable: false라인을 남겨 PG14~17 빌드에서make check가 실패 - PG14~17 환경에서 캡처한 출력으로
store_2.out교체
- 1.10의 PG18 지원 커밋이
2. 1.9e1 보고 결함 중 upstream 1.10에 미반영되어 재이식한 항목
1.9e1에서 보고·수정한 결함들이 upstream 1.10에는 반영되지 않아 동일 결함이 잔존함. 1.10e1은 다음 패치들을 1.10 코드 베이스에 다시 이식함.
-
Coverity가 검출한 메모리 누수 수정 (1.9e1의
ff976a5→ 1.10e1의da27333)- 1.9e1 시점의 누수 패턴이 1.10에도 여전히 존재하여 동일 위치들에 재적용
pgsp_shmem_startup의num범위 검증,pgsp_shmem_shutdown및pg_store_plans_internal의pbufferfree 보강
-
해시 키 초기화되지 않은 메모리 사용 수정 (1.9e1의
53101a1→ 1.10e1의bfeecba)- upstream에 미반영 상태로 1.10에서도 동일 잠재 결함이 잔존
pgsp_store의 키 할당 직전memset으로 padding까지 0 초기화
참고로 다음 1.9e1 패치는 upstream에서 동등한 형태로 처리되어 1.10e1에서는 별도 재이식이 불필요했음.
- plan text read 실패 방지(
c3557f8) → upstreamd92665d("Guard against NULL result from ptext fetch")로 동일 위치에 동일한 NULL 가드가 추가됨 - PG 17 이전 버전 호환성 확보(
1c38939) → upstream 1.10이 PG14~18 다중 버전 지원을 자체적으로 재구성 (a92efda+0200b32+e54c9f1)
3. 1.10e1에서 신규로 발견 및 수정한 결함
-
GROUPING SETS의 sort key 메모리 누수 수정 (
68e0977)pgsp_json_text.c의json_text_objend에서 sort key를 libcstrdup으로 복사- 상위
grouping_set은 palloc 메모리 컨텍스트로 관리되어 컨텍스트 reset 시 해제되지만,sort_keys는 컨텍스트 외부의 malloc 영역이라 함께 해제되지 않고 누수 - GROUPING SETS와 ORDER BY를 함께 사용하는 plan에 대해
pg_store_plans조회마다 누수 발생 - 동일 함수 내 다른 세 군데와 동일하게
pstrdup으로 변경하여 해결
-
_PG_fini에서shmem_request_hook복원 누락 수정 (d0f9a5c)- PG15 이상에서
_PG_init이 이전shmem_request_hook을 보관하고pgsp_shmem_request를 설치하지만,_PG_fini에 대응되는 복원 코드가 없었음 - 모듈 언로드 후에도 hook chain이 사라진 함수를 가리켜 dangling pointer가 되는 문제 발생 가능
_PG_fini에 동일 PG15+ 가드(PG_VERSION_NUM >= 150000)로shmem_request_hook = prev_shmem_request_hook추가
- PG15 이상에서
-
macOS 빌드 및 in-tree
make check수정 (393390f)- macOS의
ld는--build-id를 지원하지 않으므로Darwin에서 해당 LDFLAG 제외 (기존 SunOS 제외 분기에 추가) - 회귀 테스트의
regress.conf가shared_preload_libraries에pg_stat_statements를 요구하므로, in-tree 빌드 시 자동 설치되도록EXTRA_INSTALL = contrib/pg_stat_statements선언 - 빌드 산출물과 테스트 출력 제외를 위한
.gitignore추가
- macOS의
4. 다운스트림 운영 정책에 따른 기본값 변경 (a601bd0)
결함 수정이 아닌, downstream 운영 환경에 맞춘 기본값 조정. 1.9e1에서 적용한 정책을 1.10 코드 베이스에 그대로 이어감.
pg_store_plans.max: 1000 → 5000pg_store_plans.min_duration: 0ms → 10mspg_store_plans.log_timing: on → off- 회귀 테스트가 새 기본 필터의 영향을 받지 않도록
regress.conf에pg_store_plans.min_duration = 0추가
업그레이드 절차
-
PostgreSQL에서 아래 명령 실행
ALTER EXTENSION pg_store_plans UPDATE TO '1.10e1';
-
업그레이드 시 내부 동작
- 기존
pg_store_plans()함수를 1.10 C 진입점(pg_store_plans_1_10)에 재바인딩 CREATE OR REPLACE FUNCTION을 사용하므로 기존 뷰(pg_store_plans)와 사용자 정의 종속 객체(뷰, 함수)는 그대로 유지- PostgreSQL 버전에 따라 적절한 컬럼 시그니처로 함수 재정의
- PostgreSQL 17 이상:
shared_blk_read_time,shared_blk_write_time,local_blk_read_time,local_blk_write_time,temp_blk_read_time,temp_blk_write_time컬럼 포함 - PostgreSQL 16 이하: 기존 통합
blk_read_time,blk_write_time컬럼 유지
- PostgreSQL 17 이상:
- 기존