Обсуждение: BUG #15766: discard plans bug. database CRASH
The following bug has been logged on the website:
Bug reference: 15766
Logged by: Zhou Digoal
Email address: digoal@126.com
PostgreSQL version: 11.1
Operating system: CENTOS 7.X X64
Description:
discard plans bug. database CRASH
for exp:
```
postgres=# create table tc (id int ,c1 int, c2 int);
CREATE TABLE
postgres=# insert into tc values (1,1,1);
INSERT 0 1
postgres=# prepare x (int) as select * from tc where id=$1;
PREPARE
postgres=# execute x(1);
id | c1 | c2
----+----+----
1 | 1 | 1
(1 row)
postgres=# alter table tc add column c3 int;
ALTER TABLE
postgres=# execute x(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
postgres=# \h discard
Command: DISCARD
Description: discard session state
Syntax:
DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }
postgres=# discard plans;
DISCARD PLANS
```
and then reexecute , database will crash.
```
postgres=# execute x(1);
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
^CCancel request sent
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!> \q
```
best regards,
digoal
PG Bug reporting form <noreply@postgresql.org> writes:
> PostgreSQL version: 11.1
> discard plans bug. database CRASH
This seems to be fixed already; I just get additional reports of
ERROR: cached plan must not change result type
in all branches. I didn't go through the git logs to try to
identify the relevant fix, so possibly it was post-11.2.
regards, tom lane
Thank you , it's likely a bug caused by pg_hint_plan extension , it's not a pg's bug.
i comment the pg_hint_plan , and will not crash now.
```
#shared_preload_libraries = 'oracle_fdw,pg_hint_plan' # (change requires restart)
restart pg.
postgres=# prepare a(int) as select * from tf where id=$1;
PREPARE
postgres=# \d tf
Table "public.tf"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+--------------------------------
id | integer | | not null | nextval('tf_id_seq'::regclass)
postgres=# execute a(1);
id
----
(0 rows)
postgres=# insert into tf values (1);
INSERT 0 1
postgres=# insert into tf values (2);
INSERT 0 1
postgres=# execute a(1);
id
----
1
(1 row)
postgres=# alter table tf add column c1 int;
ALTER TABLE
postgres=# execute a(1);
ERROR: cached plan must not change result type
postgres=# \set VERBOSITY verbose
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
postgres=# discard plans;
DISCARD PLANS
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
PREPARE
postgres=# \d tf
Table "public.tf"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+--------------------------------
id | integer | | not null | nextval('tf_id_seq'::regclass)
postgres=# execute a(1);
id
----
(0 rows)
postgres=# insert into tf values (1);
INSERT 0 1
postgres=# insert into tf values (2);
INSERT 0 1
postgres=# execute a(1);
id
----
1
(1 row)
postgres=# alter table tf add column c1 int;
ALTER TABLE
postgres=# execute a(1);
ERROR: cached plan must not change result type
postgres=# \set VERBOSITY verbose
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
postgres=# discard plans;
DISCARD PLANS
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
postgres=# execute a(1);
ERROR: 0A000: cached plan must not change result type
LOCATION: RevalidateCachedQuery, plancache.c:723
```
best regards,
digoal.
------------------------------------------------------------------发件人:Tom Lane <tgl@sss.pgh.pa.us>发送时间:2019年4月18日(星期四) 01:09收件人:digoal <digoal@126.com>抄 送:pgsql-bugs <pgsql-bugs@lists.postgresql.org>主 题:Re: BUG #15766: discard plans bug. database CRASHPG Bug reporting form <noreply@postgresql.org> writes:
> PostgreSQL version: 11.1
> discard plans bug. database CRASH
This seems to be fixed already; I just get additional reports of
ERROR: cached plan must not change result type
in all branches. I didn't go through the git logs to try to
identify the relevant fix, so possibly it was post-11.2.
regards, tom lane