Обсуждение: plpgsql: remove a field from a record?

Поиск
Список
Период
Сортировка

plpgsql: remove a field from a record?

От
Ray O'Donnell
Дата:
Hi all,

In a plpgsql function, is it possible to remove a field from a RECORD value?

My specific use-case is that I have a row returned from a MERGE 
operation into a variable, declared as type RECORD, which will then be 
logged; and I want to remove some potentially sensitive stuff from it 
before it gets logged.

I could manually redact the sensitive items (e.g. set them to null); but 
it'd be tidier just to remove them altogether if I can.

Thanks in advance,

Ray.

-- 
Ray O'Donnell // Galway // Ireland
ray@rodonnell.ie




Re: plpgsql: remove a field from a record?

От
Adrian Klaver
Дата:
On 12/27/25 08:01, Ray O'Donnell wrote:
> Hi all,
> 
> In a plpgsql function, is it possible to remove a field from a RECORD 
> value?
> 
> My specific use-case is that I have a row returned from a MERGE 
> operation into a variable, declared as type RECORD, which will then be 
> logged; and I want to remove some potentially sensitive stuff from it 
> before it gets logged.
> 
> I could manually redact the sensitive items (e.g. set them to null); but 
> it'd be tidier just to remove them altogether if I can.

A record 'type' supports record_name.field_name notation. Not sure how 
many fields you want to log, but you could log only the non-sensitive 
fields explicitly e.g. record_name.fld1, record_name.fld3, 
record_name.fld4, etc.

> 
> Thanks in advance,
> 
> Ray.
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com



Re: plpgsql: remove a field from a record?

От
Pavel Stehule
Дата:
Hi

so 27. 12. 2025 v 17:01 odesílatel Ray O'Donnell <ray@rodonnell.ie> napsal:
Hi all,

In a plpgsql function, is it possible to remove a field from a RECORD value?

My specific use-case is that I have a row returned from a MERGE
operation into a variable, declared as type RECORD, which will then be
logged; and I want to remove some potentially sensitive stuff from it
before it gets logged.

I could manually redact the sensitive items (e.g. set them to null); but
it'd be tidier just to remove them altogether if I can.

Thanks in advance,

I think so it is not possible - not directly. Maybe you can use jsonb or hstore 

(2025-12-27 17:12:06) postgres=# create type t as (a int, b int);
(2025-12-27 17:12:24) postgres=# select * from jsonb_to_record(row_to_json(row(10,20)::t)::jsonb - 'a') as (b int);
┌────┐
│ b  │
╞════╡
│ 20 │
└────┘
(1 row)


Regards

Pavel
 

Ray.

--
Ray O'Donnell // Galway // Ireland
ray@rodonnell.ie



Re: plpgsql: remove a field from a record?

От
Ray O'Donnell
Дата:
On 27/12/2025 16:13, Adrian Klaver wrote:

> On 12/27/25 08:01, Ray O'Donnell wrote:
>> Hi all,
>>
>> In a plpgsql function, is it possible to remove a field from a RECORD 
>> value?
>>
>> My specific use-case is that I have a row returned from a MERGE 
>> operation into a variable, declared as type RECORD, which will then 
>> be logged; and I want to remove some potentially sensitive stuff from 
>> it before it gets logged.
>>
>> I could manually redact the sensitive items (e.g. set them to null); 
>> but it'd be tidier just to remove them altogether if I can.
>
> A record 'type' supports record_name.field_name notation. Not sure how 
> many fields you want to log, but you could log only the non-sensitive 
> fields explicitly e.g. record_name.fld1, record_name.fld3, 
> record_name.fld4, etc.


Aargh - I was being silly - of course I can return only the items I want 
to log from the MERGE.

Thanks Adrian, and apologies for the noise!

Ray.





>
>>
>> Thanks in advance,
>>
>> Ray.
>>
>
>
-- 
Ray O'Donnell // Galway // Ireland
ray@rodonnell.ie