plancache.out

来自「postgresql8.3.4源码,开源数据库」· OUT 代码 · 共 262 行

OUT
262
字号
---- Tests to exercise the plan caching/invalidation mechanism--CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl;-- create and use a cached planPREPARE prepstmt AS SELECT * FROM pcachetest;EXECUTE prepstmt;        q1        |        q2         ------------------+-------------------              123 |               456              123 |  4567890123456789 4567890123456789 |               123 4567890123456789 |  4567890123456789 4567890123456789 | -4567890123456789(5 rows)-- and one with parametersPREPARE prepstmt2(bigint) AS SELECT * FROM pcachetest WHERE q1 = $1;EXECUTE prepstmt2(123); q1  |        q2        -----+------------------ 123 |              456 123 | 4567890123456789(2 rows)-- invalidate the plans and see what happensDROP TABLE pcachetest;EXECUTE prepstmt;ERROR:  relation "pcachetest" does not existEXECUTE prepstmt2(123);ERROR:  relation "pcachetest" does not exist-- recreate the temp table (this demonstrates that the raw plan is-- purely textual and doesn't depend on OIDs, for instance)CREATE TEMP TABLE pcachetest AS SELECT * FROM int8_tbl ORDER BY 2;EXECUTE prepstmt;        q1        |        q2         ------------------+------------------- 4567890123456789 | -4567890123456789 4567890123456789 |               123              123 |               456              123 |  4567890123456789 4567890123456789 |  4567890123456789(5 rows)EXECUTE prepstmt2(123); q1  |        q2        -----+------------------ 123 |              456 123 | 4567890123456789(2 rows)-- prepared statements should prevent change in output tupdesc,-- since clients probably aren't expecting that to change on the flyALTER TABLE pcachetest ADD COLUMN q3 bigint;EXECUTE prepstmt;ERROR:  cached plan must not change result typeEXECUTE prepstmt2(123);ERROR:  cached plan must not change result type-- but we're nice guys and will let you undo your mistakeALTER TABLE pcachetest DROP COLUMN q3;EXECUTE prepstmt;        q1        |        q2         ------------------+------------------- 4567890123456789 | -4567890123456789 4567890123456789 |               123              123 |               456              123 |  4567890123456789 4567890123456789 |  4567890123456789(5 rows)EXECUTE prepstmt2(123); q1  |        q2        -----+------------------ 123 |              456 123 | 4567890123456789(2 rows)-- Try it with a view, which isn't directly used in the resulting plan-- but should trigger invalidation anywayCREATE TEMP VIEW pcacheview AS  SELECT * FROM pcachetest;PREPARE vprep AS SELECT * FROM pcacheview;EXECUTE vprep;        q1        |        q2         ------------------+------------------- 4567890123456789 | -4567890123456789 4567890123456789 |               123              123 |               456              123 |  4567890123456789 4567890123456789 |  4567890123456789(5 rows)CREATE OR REPLACE TEMP VIEW pcacheview AS  SELECT q1, q2/2 AS q2 FROM pcachetest;EXECUTE vprep;        q1        |        q2         ------------------+------------------- 4567890123456789 | -2283945061728394 4567890123456789 |                61              123 |               228              123 |  2283945061728394 4567890123456789 |  2283945061728394(5 rows)-- Check basic SPI plan invalidationcreate function cache_test(int) returns int as $$declare total int;begin	create temp table t1(f1 int);	insert into t1 values($1);	insert into t1 values(11);	insert into t1 values(12);	insert into t1 values(13);	select sum(f1) into total from t1;	drop table t1;	return total;end$$ language plpgsql;select cache_test(1); cache_test ------------         37(1 row)select cache_test(2); cache_test ------------         38(1 row)select cache_test(3); cache_test ------------         39(1 row)-- Check invalidation of plpgsql "simple expression"create temp view v1 as  select 2+2 as f1;create function cache_test_2() returns int as $$begin	return f1 from v1;end$$ language plpgsql;select cache_test_2(); cache_test_2 --------------            4(1 row)create or replace temp view v1 as  select 2+2+4 as f1;select cache_test_2(); cache_test_2 --------------            8(1 row)create or replace temp view v1 as  select 2+2+4+(select max(unique1) from tenk1) as f1;select cache_test_2(); cache_test_2 --------------        10007(1 row)--- Check that change of search_path is ignored by replanscreate schema s1  create table abc (f1 int);create schema s2  create table abc (f1 int);insert into s1.abc values(123);insert into s2.abc values(456);set search_path = s1;prepare p1 as select f1 from abc;execute p1; f1  ----- 123(1 row)set search_path = s2;select f1 from abc; f1  ----- 456(1 row)execute p1; f1  ----- 123(1 row)alter table s1.abc add column f2 float8;   -- force replanexecute p1; f1  ----- 123(1 row)drop schema s1 cascade;NOTICE:  drop cascades to table s1.abcdrop schema s2 cascade;NOTICE:  drop cascades to table abcreset search_path;-- Check that invalidation deals with regclass constantscreate temp sequence seq;prepare p2 as select nextval('seq');execute p2; nextval ---------       1(1 row)drop sequence seq;create temp sequence seq;execute p2; nextval ---------       1(1 row)-- Check DDL via SPI, immediately followed by SPI plan re-use-- (bug in original coding)create function cachebug() returns void as $$declare r int;begin  drop table if exists temptable cascade;  create temp table temptable as select * from generate_series(1,3) as f1;  create temp view vv as select * from temptable;  for r in select * from vv loop    raise notice '%', r;  end loop;end$$ language plpgsql;select cachebug();NOTICE:  table "temptable" does not exist, skippingCONTEXT:  SQL statement "drop table if exists temptable cascade"PL/pgSQL function "cachebug" line 3 at SQL statementNOTICE:  1NOTICE:  2NOTICE:  3 cachebug ---------- (1 row)select cachebug();NOTICE:  drop cascades to rule _RETURN on view vvCONTEXT:  SQL statement "drop table if exists temptable cascade"PL/pgSQL function "cachebug" line 3 at SQL statementNOTICE:  drop cascades to view vvCONTEXT:  SQL statement "drop table if exists temptable cascade"PL/pgSQL function "cachebug" line 3 at SQL statementNOTICE:  1NOTICE:  2NOTICE:  3 cachebug ---------- (1 row)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?