Re: BUG #18722: Processing arrays with plpgsql raises errors
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: exclusion@gmail.com
Cc: pgsql-bugs@lists.postgresql.org
Date: 2024-11-24T01:42:00Z
Lists: pgsql-bugs
Attachments
- bug-18722-fix-wip.patch (text/x-diff) patch
PG Bug reporting form <noreply@postgresql.org> writes: > The following script: > CREATE FUNCTION make_ia() RETURNS int[] LANGUAGE plpgsql AS > 'declare x int[]; begin x := array[0]; return x; end'; > CREATE FUNCTION ia_eq(int[], int[]) RETURNS boolean LANGUAGE plpgsql AS > 'begin return array_eq($1, $2); end'; > CREATE OPERATOR = (procedure = ia_eq, leftarg = int[], rightarg = int[]); > SELECT NULLIF(make_ia(), array[1]::int[]); > fails with: > ERROR: cache lookup failed for type 2139062143 Nice catch! What is happening here is that make_ia returns a read/write pointer to an expanded array object. The EEOP_NULLIF code passes that pointer straight on to the equality function. Which in this case is a plpgsql function that will suppose it can take ownership of the expanded object, resulting in said object being freed before return. (Neither function has done anything wrong.) The problem is that EEOP_NULLIF then returns the original Datum pointer, which is now pointing at garbage. The different failures you get depending on what is done next with the Datum are not too surprising. What EEOP_NULLIF needs to do is pass a read-only pointer to the equality function, so that the object is not modified and remains available to return if we want to do so. Attached is a quick WIP patch to handle that. It is missing a test case, but the real omission is that llvm_compile_expr()'s EEOP_NULLIF handling also needs to be fixed, and I'm pretty unsure how to do that. I'm wondering now if any of our other conditional expressions have similar bugs ... regards, tom lane
Commits
-
Fix NULLIF()'s handling of read-write expanded objects.
- 48a6cd1ae636 13.19 landed
- a1168855e0df 14.16 landed
- 97be02ad0015 17.3 landed
- 80cd33bad172 15.11 landed
- 4aba56adcd29 16.7 landed
- 5b8728cd7f9d 18.0 landed