mirror of https://github.com/postgres/postgres
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.3 KiB
67 lines
2.3 KiB
--
|
|
-- Cache-behavior-dependent test cases
|
|
--
|
|
-- These tests logically belong in plpgsql_record.sql, and perhaps someday
|
|
-- can be merged back into it. For now, however, their results are different
|
|
-- depending on debug_discard_caches, so we must have two expected-output
|
|
-- files to cover both cases. To minimize the maintenance effort resulting
|
|
-- from that, this file should contain only tests that do have different
|
|
-- results under debug_discard_caches.
|
|
--
|
|
-- check behavior with changes of a named rowtype
|
|
create table c_mutable(f1 int, f2 text);
|
|
create function c_sillyaddone(int) returns int language plpgsql as
|
|
$$ declare r c_mutable; begin r.f1 := $1; return r.f1 + 1; end $$;
|
|
select c_sillyaddone(42);
|
|
c_sillyaddone
|
|
---------------
|
|
43
|
|
(1 row)
|
|
|
|
alter table c_mutable drop column f1;
|
|
alter table c_mutable add column f1 float8;
|
|
-- currently, this fails due to cached plan for "r.f1 + 1" expression
|
|
-- (but if debug_discard_caches is on, it will succeed)
|
|
select c_sillyaddone(42);
|
|
ERROR: type of parameter 4 (double precision) does not match that when preparing the plan (integer)
|
|
CONTEXT: PL/pgSQL function c_sillyaddone(integer) line 1 at RETURN
|
|
-- but it's OK if we force plan rebuilding
|
|
discard plans;
|
|
select c_sillyaddone(42);
|
|
c_sillyaddone
|
|
---------------
|
|
43
|
|
(1 row)
|
|
|
|
-- check behavior with changes in a record rowtype
|
|
create function show_result_type(text) returns text language plpgsql as
|
|
$$
|
|
declare
|
|
r record;
|
|
t text;
|
|
begin
|
|
execute $1 into r;
|
|
select pg_typeof(r.a) into t;
|
|
return format('type %s value %s', t, r.a::text);
|
|
end;
|
|
$$;
|
|
select show_result_type('select 1 as a');
|
|
show_result_type
|
|
----------------------
|
|
type integer value 1
|
|
(1 row)
|
|
|
|
-- currently this fails due to cached plan for pg_typeof expression
|
|
-- (but if debug_discard_caches is on, it will succeed)
|
|
select show_result_type('select 2.0 as a');
|
|
ERROR: type of parameter 5 (numeric) does not match that when preparing the plan (integer)
|
|
CONTEXT: SQL statement "select pg_typeof(r.a)"
|
|
PL/pgSQL function show_result_type(text) line 7 at SQL statement
|
|
-- but it's OK if we force plan rebuilding
|
|
discard plans;
|
|
select show_result_type('select 2.0 as a');
|
|
show_result_type
|
|
------------------------
|
|
type numeric value 2.0
|
|
(1 row)
|
|
|
|
|