When a ROW variable having NULL value is assigned to a RECORD variable, it gives no structure to the RECORD type variable. Let's consider the following example.
create table t1(a int, b text);
insert into t1 values(1, 'str1');
create or replace function f1() returns void as $$ declare row t1%ROWTYPE; rec RECORD; begin row := NULL; rec := row; raise info 'rec.a = %, rec.b = %', rec.a, rec.b; end; $$ language plpgsql;
In above example as 'row' variable is having NULL value, assigning this to 'rec' didn't give any structure to it although 'row' is having a predefined structure. Here is the error observed when above function is executed.
select f1(); ERROR: record "rec" is not assigned yet
This started happening from the following git commit onwards,
commit 4b93f57999a2ca9b9c9e573ea32ab1aeaa8bf496 Author: Tom Lane <tgl@sss.pgh.pa.us> Date: Tue Feb 13 18:52:21 2018 -0500
Make plpgsql use its DTYPE_REC code paths for composite-type variables.
I know this is expected to happen considering the changes done in above commit because from this commit onwards, NULL value assigned to any row variable represents a true NULL composite value before this commit it used to be a tuple with each column having null value in it. But, the point is, even if the row variable is having a NULL value it still has a structure associated with it. Shouldn't that structure be transferred to RECORD variable when it is assigned with a ROW type variable ? Can we consider this behaviour change as a side effect of the improvement done in the RECORD type of variable?
From:
Ashutosh Sharma Date: Subject:
Assigning ROW variable having NULL value to RECORD type variabledoesn't give any structure to the RECORD variable.