I searching a reason why result of plpgsql_check's regress tests are different when its executed from regress tests or interactive.
This is simple test
drop table testtable;
create table testtable(a int, b int);
create or replace function test() returns int as $$ declare r testtable; begin select * into r from testtable; return r.a; end; $$ language plpgsql;
alter table testtable drop column b; select * from plpgsql_check_function('test()');
this test should to return 0 rows, and it is working when I run it as test. But when I execute it in psql I got
┌───────────────────────────────────────────────────────────────────────┐ │ plpgsql_check_function │ ╞═══════════════════════════════════════════════════════════════════════╡ │ warning:00000:4:SQL statement:too few attributes for target variables │ │ Detail: There are more target variables than output columns in query. │ │ Hint: Check target variables in SELECT INTO statement. │ └───────────────────────────────────────────────────────────────────────┘ (3 rows)
In interactive mode, the build_row_from_class has unrefreshed metadata. But why this behave I see only in psql and not in my regress tests?