Thread
Commits
-
Collect dependency information for parsed CallStmts.
- dc8d72c1c213 17.0 landed
- 055f786ea6a8 16.1 landed
- fdc7cf73b424 11.22 landed
- 8cfc3e80b612 13.13 landed
- 5cff431bc9b8 14.10 landed
- 4435a8d5dbab 12.17 landed
- 0e59266a5daf 15.5 landed
-
BUG #18131: PL/pgSQL: regclass procedure parameter wrongly memoized(?)
The Post Office <noreply@postgresql.org> — 2023-09-22T19:22:34Z
The following bug has been logged on the website: Bug reference: 18131 Logged by: Christian Stork Email address: cstork+postgresql@gmail.com PostgreSQL version: 14.9 Operating system: Ubuntu 22.04 Description: The following condensed recipe reproduces the error: create procedure callee(t regclass) language plpgsql as $body$ begin raise notice 'callee: oid = %', t::oid; execute 'table ' || t; end; $body$; create procedure caller() language plpgsql as $body$ begin create table table_name (); raise notice 'caller: oid = %', 'table_name'::regclass::oid; call callee('table_name'); drop table table_name; end; $body$; call caller(); -- OK call caller(); -- ERROR: callee executed with OID of previous invocation! -- Relevant output (Ubuntu 14.9-1.pgdg22.04+1): -- ... -- NOTICE: caller: oid = 24769724 -- NOTICE: callee: oid = 24769724 -- CALL <---- first statement completed successfully -- NOTICE: caller: oid = 24769727 -- NOTICE: callee: oid = 24769724 <---- should be the same as line above -- ERROR: syntax error at or near "24769724" -- LINE 1: table 24769724 <---- no more table with this OID in pg_catalog, hence OID instead of table name, I assume -- ... -
Re: BUG #18131: PL/pgSQL: regclass procedure parameter wrongly memoized(?)
Christian Stork <cstork+postgresql@gmail.com> — 2023-09-22T21:32:15Z
I forgot to mention that the problem disappears when call callee('table_name'); is replaced by table_oid = 'table_name'::regclass; call callee(table_oid); -Chris -
Re: BUG #18131: PL/pgSQL: regclass procedure parameter wrongly memoized(?)
Tom Lane <tgl@sss.pgh.pa.us> — 2023-09-23T16:39:04Z
PG Bug reporting form <noreply@postgresql.org> writes: > The following condensed recipe reproduces the error: > create procedure callee(t regclass) > language plpgsql as > $body$ > begin > raise notice 'callee: oid = %', t::oid; > execute 'table ' || t; > end; > $body$; > create procedure caller() > language plpgsql as > $body$ > begin > create table table_name (); > raise notice 'caller: oid = %', 'table_name'::regclass::oid; > call callee('table_name'); > drop table table_name; > end; > $body$; > call caller(); -- OK > call caller(); -- ERROR: callee executed with OID of previous invocation! Hmm. It's not just regclass: we're failing to track *any* dependencies of the compiled CallStmt. So you can also break it by, say, dropping and recreating the "callee" procedure. The attached quick hack fixes the reported symptoms, but I wonder if there is a better place to do it. regards, tom lane