Re: pl/pgperl Patch for adding $_FN detail just like triggers have for $_TD - Mailing list pgsql-hackers

From Mark Murawski
Subject Re: pl/pgperl Patch for adding $_FN detail just like triggers have for $_TD
Date
Msg-id 102c0925-7ba5-4aec-9160-945d4b5ee4bf@intellasoft.net
Whole thread Raw
In response to Re: pl/pgperl Patch for adding $_FN detail just like triggers have for $_TD  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: pl/pgperl Patch for adding $_FN detail just like triggers have for $_TD
List pgsql-hackers

On 8/29/24 11:56, Andrew Dunstan wrote:
>
> On 2024-08-28 We 5:53 PM, Mark Murawski wrote:
>> Hi Hackers!
>>
>> This would be version v1 of this feature
>>
>> Basically, the subject says it all: pl/pgperl Patch for being able to 
>> tell which function you're in.
>> This is a hashref so it will be possible to populate new and exciting 
>> other details in the future as the need arises
>>
>> This also greatly improves logging capabilities for things like 
>> catching warnings,  Because as it stands right now, there's no 
>> information that can assist with locating the source of a warning 
>> like this:
>>
>> # tail -f /var/log/postgresql.log
>> ******* GOT A WARNING - Use of uninitialized value $prefix in 
>> concatenation (.) or string at (eval 531) line 48.
>>
>> Now, with $_FN you can do this:
>>
>>
>> CREATE OR REPLACE FUNCTION throw_warning() RETURNS text LANGUAGE 
>> plperlu AS $function$
>>
>> use warnings;
>> use strict;
>> use Data::Dumper;
>>
>> $SIG{__WARN__} = sub {
>>   elog(NOTICE, Dumper($_FN));
>>
>>   print STDERR "In Function: $_FN->{name}: $_[0]\n";
>> };
>>
>> my $a;
>> print "$a"; # uninit!
>>
>> return undef;
>>
>> $function$
>> ;
>>
>> This patch is against 12 which is still our production branch. This 
>> could easily be also patched against newer releases as well.
>>
>> I've been using this code in production now for about 3 years, it's 
>> greatly helped track down issues.  And there shouldn't be anything 
>> platform-specific here, it's all regular perl API
>>
>> I'm not sure about adding testing.  This is my first postgres patch, 
>> so any guidance on adding regression testing would be appreciated.
>>
>> The rationale for this has come from the need to know the source 
>> function name, and we've typically resorted to things like this in 
>> the past:
>>
>> CREATE OR REPLACE FUNCTION throw_warning() RETURNS text LANGUAGE 
>> plperlu AS $function$
>> my $function_name = 'throw_warning';
>> $SIG{__WARN__} = sub { print STDERR "In Function: $function_name: 
>> $_[0]\n"; }
>> $function$
>> ;
>>
>> We've literally had to copy/paste this all over and it's something 
>> that postgres should just 'give you' since it knows the name already, 
>> just like when triggers pass you $_TD with all the pertinent information
>>
>> A wishlist item would be for postgres plperl to automatically prepend 
>> the function name and schema when throwing perl warnings so you don't 
>> have to do your own __WARN__ handler, but this is the next best thing.
>
>
>
> I'm not necessarily opposed to this, but the analogy to $_TD isn't 
> really apt.  You can't know the trigger data at compile time, whereas 
> you can know the function's name at compile time, using just the 
> mechanism you find irksome.
>
> And if we're going to do it for plperl, shouldn't we do it for other PLs?
>
>
> cheers
>
>
> andrew
>
>
> -- 
> Andrew Dunstan
> EDB: https://www.enterprisedb.com
>
>
>

Hi Andrew,


Thanks for the feedback.


1) Why is this not similar to _TD?  It literally operates identically. 
At run-time it passes you $_TD  for triggers.    Same her for 
functions.  This is all run-time.   What exactly is the issue you're 
trying to point out?


2) I would agree that other PLs should get the same detail.  I don't 
know the other ones as I've been only working in pl/perl.





pgsql-hackers by date:

Previous
From: "bigbro_wq@hotmail.com"
Date:
Subject: bt Scankey in another contradictory case
Next
From: Peter Geoghegan
Date:
Subject: Re: Showing primitive index scan count in EXPLAIN ANALYZE (for skip scan and SAOP scans)