Skip to content

Commit 3bc3ed9

Browse files
committed
PG 17 이전 버전 호환성 확보
1 parent d3d1a6b commit 3bc3ed9

File tree

4 files changed

+223
-45
lines changed

4 files changed

+223
-45
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ EXTENSION = pg_store_plans
1010

1111
PG_VERSION := $(shell pg_config --version | sed "s/^PostgreSQL //" | sed "s/\.[0-9]*$$//")
1212

13-
DATA = pg_store_plans--1.9.sql
13+
DATA = pg_store_plans--1.9.sql \
14+
pg_store_plans--1.8--1.9.sql
1415

1516
REGRESS = convert store
1617
REGRESS_OPTS = --temp-config=regress.conf

pg_store_plans--1.8--1.9.sql

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* pg_store_plans/pg_store_plans--1.8--1.9.sql
3+
*
4+
* 업그레이드 스크립트: pg_store_plans 1.8 -> 1.9
5+
*
6+
* - 기존 함수 및 뷰 삭제
7+
* - PostgreSQL 17 이상/미만 버전별 함수(분기 처리) 재생성
8+
* - 뷰 생성 및 권한 부여
9+
*/
10+
11+
-- psql에서 직접 실행되는 것을 방지 (CREATE EXTENSION을 통해서만 실행)
12+
\echo Use "CREATE EXTENSION pg_store_plans" to load this file. \quit
13+
14+
-- 기존 뷰 및 함수 삭제 (업그레이드 전 정리)
15+
DROP VIEW pg_store_plans;
16+
DROP FUNCTION pg_store_plans();
17+
18+
-- PostgreSQL 버전에 따라 메인 함수 생성 (17 이상/미만 분기)
19+
DO
20+
$$
21+
BEGIN
22+
IF (SELECT split_part(setting,'.',1) FROM pg_settings WHERE name = 'server_version')::int >= 17 THEN
23+
-- PostgreSQL 17 이상: shared/local 블록 시간 컬럼 분리
24+
CREATE FUNCTION pg_store_plans(
25+
OUT userid oid,
26+
OUT dbid oid,
27+
OUT queryid int8,
28+
OUT planid int8,
29+
OUT plan text,
30+
OUT calls int8,
31+
OUT total_time float8,
32+
OUT min_time float8,
33+
OUT max_time float8,
34+
OUT mean_time float8,
35+
OUT stddev_time float8,
36+
OUT rows int8,
37+
OUT shared_blks_hit int8,
38+
OUT shared_blks_read int8,
39+
OUT shared_blks_dirtied int8,
40+
OUT shared_blks_written int8,
41+
OUT local_blks_hit int8,
42+
OUT local_blks_read int8,
43+
OUT local_blks_dirtied int8,
44+
OUT local_blks_written int8,
45+
OUT temp_blks_read int8,
46+
OUT temp_blks_written int8,
47+
OUT shared_blk_read_time float8,
48+
OUT shared_blk_write_time float8,
49+
OUT local_blk_read_time float8,
50+
OUT local_blk_write_time float8,
51+
OUT temp_blk_read_time float8,
52+
OUT temp_blk_write_time float8,
53+
OUT first_call timestamptz,
54+
OUT last_call timestamptz
55+
)
56+
RETURNS SETOF record
57+
AS 'MODULE_PATHNAME', 'pg_store_plans_1_9'
58+
LANGUAGE C
59+
VOLATILE PARALLEL SAFE;
60+
ELSE
61+
-- PostgreSQL 17 미만: blk_read_time, blk_write_time 사용
62+
CREATE FUNCTION pg_store_plans(
63+
OUT userid oid,
64+
OUT dbid oid,
65+
OUT queryid int8,
66+
OUT planid int8,
67+
OUT plan text,
68+
OUT calls int8,
69+
OUT total_time float8,
70+
OUT min_time float8,
71+
OUT max_time float8,
72+
OUT mean_time float8,
73+
OUT stddev_time float8,
74+
OUT rows int8,
75+
OUT shared_blks_hit int8,
76+
OUT shared_blks_read int8,
77+
OUT shared_blks_dirtied int8,
78+
OUT shared_blks_written int8,
79+
OUT local_blks_hit int8,
80+
OUT local_blks_read int8,
81+
OUT local_blks_dirtied int8,
82+
OUT local_blks_written int8,
83+
OUT temp_blks_read int8,
84+
OUT temp_blks_written int8,
85+
OUT blk_read_time float8,
86+
OUT blk_write_time float8,
87+
OUT temp_blk_read_time float8,
88+
OUT temp_blk_write_time float8,
89+
OUT first_call timestamptz,
90+
OUT last_call timestamptz
91+
)
92+
RETURNS SETOF record
93+
AS 'MODULE_PATHNAME', 'pg_store_plans_1_7'
94+
LANGUAGE C
95+
VOLATILE PARALLEL SAFE;
96+
END IF;
97+
END
98+
$$ LANGUAGE plpgsql;
99+
100+
-- 메인 함수에 대한 뷰 생성 (사용 편의성 제공)
101+
CREATE VIEW pg_store_plans AS
102+
SELECT * FROM pg_store_plans();
103+
104+
-- 모든 사용자에게 SELECT 권한 부여
105+
GRANT SELECT ON pg_store_plans TO PUBLIC;

pg_store_plans--1.9.sql

Lines changed: 97 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
/* pg_store_plans/pg_store_plans--1.9.sql */
1+
/*
2+
* pg_store_plans/pg_store_plans--1.9.sql
3+
*
4+
* 확장 설치용 SQL 스크립트 (버전 1.9)
5+
*
6+
* - 주요 함수 및 뷰 생성
7+
* - PostgreSQL 17 이상/미만 버전별 함수(분기 처리) 생성
8+
* - 권한 부여
9+
*/
210

3-
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
11+
-- psql에서 직접 실행되는 것을 방지 (CREATE EXTENSION을 통해서만 실행)
412
\echo Use "CREATE EXTENSION pg_store_plans" to load this file. \quit
513

6-
--- Define pg_store_plans_info
14+
--- pg_store_plans_info 함수 및 뷰 정의 (통계 정보 제공)
715
CREATE FUNCTION pg_store_plans_info(
816
OUT dealloc bigint,
917
OUT stats_reset timestamp with time zone
@@ -17,7 +25,7 @@ CREATE VIEW pg_store_plans_info AS
1725

1826
GRANT SELECT ON pg_store_plans_info TO PUBLIC;
1927

20-
-- Register functions.
28+
-- 주요 기능 함수 등록 (플랜 리셋, 쿼리 축약, 정규화, 다양한 포맷 변환 등)
2129
CREATE FUNCTION pg_store_plans_reset()
2230
RETURNS void
2331
AS 'MODULE_PATHNAME'
@@ -57,48 +65,95 @@ RETURNS oid
5765
AS 'MODULE_PATHNAME'
5866
LANGUAGE C
5967
RETURNS NULL ON NULL INPUT PARALLEL SAFE;
60-
CREATE FUNCTION pg_store_plans(
61-
OUT userid oid,
62-
OUT dbid oid,
63-
OUT queryid int8,
64-
OUT planid int8,
65-
OUT plan text,
66-
OUT calls int8,
67-
OUT total_time float8,
68-
OUT min_time float8,
69-
OUT max_time float8,
70-
OUT mean_time float8,
71-
OUT stddev_time float8,
72-
OUT rows int8,
73-
OUT shared_blks_hit int8,
74-
OUT shared_blks_read int8,
75-
OUT shared_blks_dirtied int8,
76-
OUT shared_blks_written int8,
77-
OUT local_blks_hit int8,
78-
OUT local_blks_read int8,
79-
OUT local_blks_dirtied int8,
80-
OUT local_blks_written int8,
81-
OUT temp_blks_read int8,
82-
OUT temp_blks_written int8,
83-
OUT shared_blk_read_time float8,
84-
OUT shared_blk_write_time float8,
85-
OUT local_blk_read_time float8,
86-
OUT local_blk_write_time float8,
87-
OUT temp_blk_read_time float8,
88-
OUT temp_blk_write_time float8,
89-
OUT first_call timestamptz,
90-
OUT last_call timestamptz
91-
)
92-
RETURNS SETOF record
93-
AS 'MODULE_PATHNAME', 'pg_store_plans_1_9'
94-
LANGUAGE C
95-
VOLATILE PARALLEL SAFE;
9668

97-
-- Register a view on the function for ease of use.
69+
-- PostgreSQL 버전에 따라 메인 함수 생성 (17 이상/미만 분기)
70+
DO
71+
$$
72+
BEGIN
73+
IF (SELECT split_part(setting,'.',1) FROM pg_settings WHERE name = 'server_version')::int >= 17 THEN
74+
-- PostgreSQL 17 이상: shared/local 블록 시간 컬럼 분리
75+
CREATE FUNCTION pg_store_plans(
76+
OUT userid oid,
77+
OUT dbid oid,
78+
OUT queryid int8,
79+
OUT planid int8,
80+
OUT plan text,
81+
OUT calls int8,
82+
OUT total_time float8,
83+
OUT min_time float8,
84+
OUT max_time float8,
85+
OUT mean_time float8,
86+
OUT stddev_time float8,
87+
OUT rows int8,
88+
OUT shared_blks_hit int8,
89+
OUT shared_blks_read int8,
90+
OUT shared_blks_dirtied int8,
91+
OUT shared_blks_written int8,
92+
OUT local_blks_hit int8,
93+
OUT local_blks_read int8,
94+
OUT local_blks_dirtied int8,
95+
OUT local_blks_written int8,
96+
OUT temp_blks_read int8,
97+
OUT temp_blks_written int8,
98+
OUT shared_blk_read_time float8,
99+
OUT shared_blk_write_time float8,
100+
OUT local_blk_read_time float8,
101+
OUT local_blk_write_time float8,
102+
OUT temp_blk_read_time float8,
103+
OUT temp_blk_write_time float8,
104+
OUT first_call timestamptz,
105+
OUT last_call timestamptz
106+
)
107+
RETURNS SETOF record
108+
AS 'MODULE_PATHNAME', 'pg_store_plans_1_9'
109+
LANGUAGE C
110+
VOLATILE PARALLEL SAFE;
111+
ELSE
112+
-- PostgreSQL 17 미만: blk_read_time, blk_write_time 사용
113+
CREATE FUNCTION pg_store_plans(
114+
OUT userid oid,
115+
OUT dbid oid,
116+
OUT queryid int8,
117+
OUT planid int8,
118+
OUT plan text,
119+
OUT calls int8,
120+
OUT total_time float8,
121+
OUT min_time float8,
122+
OUT max_time float8,
123+
OUT mean_time float8,
124+
OUT stddev_time float8,
125+
OUT rows int8,
126+
OUT shared_blks_hit int8,
127+
OUT shared_blks_read int8,
128+
OUT shared_blks_dirtied int8,
129+
OUT shared_blks_written int8,
130+
OUT local_blks_hit int8,
131+
OUT local_blks_read int8,
132+
OUT local_blks_dirtied int8,
133+
OUT local_blks_written int8,
134+
OUT temp_blks_read int8,
135+
OUT temp_blks_written int8,
136+
OUT blk_read_time float8,
137+
OUT blk_write_time float8,
138+
OUT temp_blk_read_time float8,
139+
OUT temp_blk_write_time float8,
140+
OUT first_call timestamptz,
141+
OUT last_call timestamptz
142+
)
143+
RETURNS SETOF record
144+
AS 'MODULE_PATHNAME', 'pg_store_plans_1_7'
145+
LANGUAGE C
146+
VOLATILE PARALLEL SAFE;
147+
END IF;
148+
END
149+
$$ LANGUAGE plpgsql;
150+
151+
-- 메인 함수에 대한 뷰 생성 (사용 편의성 제공)
98152
CREATE VIEW pg_store_plans AS
99153
SELECT * FROM pg_store_plans();
100154

155+
-- 모든 사용자에게 SELECT 권한 부여
101156
GRANT SELECT ON pg_store_plans TO PUBLIC;
102157

103-
-- Don't want this to be available to non-superusers.
158+
-- superuser가 아닌 사용자에게는 리셋 함수 권한 제한
104159
REVOKE ALL ON FUNCTION pg_store_plans_reset() FROM PUBLIC;

pg_store_plans.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,21 +1712,38 @@ pg_store_plans_internal(FunctionCallInfo fcinfo,
17121712
values[i++] = Int64GetDatumFast(tmp.local_blks_written);
17131713
values[i++] = Int64GetDatumFast(tmp.temp_blks_read);
17141714
values[i++] = Int64GetDatumFast(tmp.temp_blks_written);
1715-
values[i++] = Float8GetDatumFast(tmp.shared_blk_read_time);
1716-
values[i++] = Float8GetDatumFast(tmp.shared_blk_write_time);
17171715

17181716
if (api_version >= PGSP_V1_9)
17191717
{
17201718
#if PG_VERSION_NUM >= 170000
1719+
values[i++] = Float8GetDatumFast(tmp.shared_blk_read_time);
1720+
values[i++] = Float8GetDatumFast(tmp.shared_blk_write_time);
17211721
values[i++] = Float8GetDatumFast(tmp.local_blk_read_time);
17221722
values[i++] = Float8GetDatumFast(tmp.local_blk_write_time);
17231723
#else
17241724
values[i++] = Float8GetDatumFast(0.0);
17251725
values[i++] = Float8GetDatumFast(0.0);
1726+
values[i++] = Float8GetDatumFast(0.0);
1727+
values[i++] = Float8GetDatumFast(0.0);
17261728
#endif
17271729
}
17281730
if (api_version >= PGSP_V1_7)
17291731
{
1732+
#if PG_VERSION_NUM >= 170000
1733+
if (api_version < PGSP_V1_9)
1734+
{
1735+
values[i++] = Float8GetDatumFast(tmp.shared_blk_read_time+
1736+
tmp.local_blk_read_time);
1737+
values[i++] = Float8GetDatumFast(tmp.shared_blk_write_time+
1738+
tmp.local_blk_write_time);
1739+
}
1740+
#else
1741+
if (api_version < PGSP_V1_9)
1742+
{
1743+
values[i++] = Float8GetDatumFast(tmp.blk_read_time);
1744+
values[i++] = Float8GetDatumFast(tmp.blk_write_time);
1745+
}
1746+
#endif
17301747
values[i++] = Float8GetDatumFast(tmp.temp_blk_read_time);
17311748
values[i++] = Float8GetDatumFast(tmp.temp_blk_write_time);
17321749
}

0 commit comments

Comments
 (0)