pgsql: Fix an ancient logic error in plpgsql's exec_stmt_block: it

From: tgl(at)postgresql(dot)org (Tom Lane)
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix an ancient logic error in plpgsql's exec_stmt_block: it
Date: 2007-02-08 18:38:31
Message-ID: 20070208183831.F1CC79FB2B2@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Log Message:
-----------
Fix an ancient logic error in plpgsql's exec_stmt_block: it thought it could
get away with not (re)initializing a local variable if the variable is marked
"isconst" and not "isnull". Unfortunately it makes this decision after having
already freed the old value, meaning that something like

for i in 1..10 loop
declare c constant text := 'hi there';

leads to subsequent accesses to freed memory, and hence probably crashes.
(In particular, this is why Asif Ali Rehman's bug leads to crash and not
just an unexpectedly-NULL value for SQLERRM: SQLERRM is marked CONSTANT
and so triggers this error.)

The whole thing seems wrong on its face anyway: CONSTANT means that you can't
change the variable inside the block, not that the initializer expression is
guaranteed not to change value across successive block entries. Hence,
remove the "optimization" instead of trying to fix it.

Tags:
----
REL7_3_STABLE

Modified Files:
--------------
pgsql/src/pl/plpgsql/src:
pl_exec.c (r1.65.2.4 -> r1.65.2.5)
(http://developer.postgresql.org/cvsweb.cgi/pgsql/src/pl/plpgsql/src/pl_exec.c.diff?r1=1.65.2.4&r2=1.65.2.5)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2007-02-08 19:36:45 Re: pgsql: Win32 regression test fixes: For win32 in general, this makes it
Previous Message Tom Lane 2007-02-08 18:38:28 pgsql: Rearrange use of plpgsql_add_initdatums() so that only the