Declaring a field that is also an out parameter in a function

Started by Michael Nolanalmost 2 years ago13 messagesgeneral
Jump to latest
#1Michael Nolan
htfoot@gmail.com

In the following short code, the out parameter d3 is also declared, so
its value will be null in the output.

create or replace function public.test_function(in varchar, in char, in date, ou
t d1 text, out d2 integer, out d3 char, out d4 date )
stable as $$

DECLARE

wk_intxt alias for $1;
wk_inchar alias for $2;
wk_indate alias for $3;
d3 char;

BEGIN

d1 := 'foo,bar';
d2 := 15;
d3 := 'X';
d4 := current_date;

END

$$ language 'plpgsql';

Here's what happens in 16.1:

psql (16.1)
Type "help" for help.

uscf=> select test_function('1234','a','2024-01-01')
uscf-> \g
test_function
----------------------------
("foo,bar",15,,2024-07-06)
(1 row)

Shouldn't declaring a field that is also an OUT parameter throw an error?

Mike Nolan
htfoot@gmail.com

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Nolan (#1)
Re: Declaring a field that is also an out parameter in a function

Michael Nolan <htfoot@gmail.com> writes:

Shouldn't declaring a field that is also an OUT parameter throw an error?

No. The DECLARE is a block nested within the function,
and the parameter is declared at function scope.
So this is a standard case of an inner declaration masking
an outer one.

Possibly plpgsql_check can be set to complain about such cases,
but they're legal according to the language specification.

regards, tom lane

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#2)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 0:14 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal:

Michael Nolan <htfoot@gmail.com> writes:

Shouldn't declaring a field that is also an OUT parameter throw an error?

No. The DECLARE is a block nested within the function,
and the parameter is declared at function scope.
So this is a standard case of an inner declaration masking
an outer one.

Possibly plpgsql_check can be set to complain about such cases,
but they're legal according to the language specification.

yes, it does

(2024-07-07 09:27:14) postgres=# select * from
plpgsql_check_function('test_function');
┌───────────────────────────────────────────────────────────────┐
│ plpgsql_check_function │
╞═══════════════════════════════════════════════════════════════╡
│ warning:00000:10:statement block:parameter "d3" is overlapped │
│ Detail: Local variable overlap function parameter. │
│ warning extra:00000:8:DECLARE:never read variable "d3" │
│ warning extra:00000:unused parameter "$1" │
│ warning extra:00000:unused parameter "$2" │
│ warning extra:00000:unused parameter "$3" │
│ warning extra:00000:unmodified OUT variable "d3" │
└───────────────────────────────────────────────────────────────┘
(7 rows)

but looks so there are false alarms related to using an alias. It is
interesting so I have not any report about this issue, so probably using
aliases is not too common today.

Regards

Pavel

Show quoted text

regards, tom lane

#4Pavel Stehule
pavel.stehule@gmail.com
In reply to: Pavel Stehule (#3)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 9:31 odesílatel Pavel Stehule <pavel.stehule@gmail.com>
napsal:

ne 7. 7. 2024 v 0:14 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal:

Michael Nolan <htfoot@gmail.com> writes:

Shouldn't declaring a field that is also an OUT parameter throw an

error?

No. The DECLARE is a block nested within the function,
and the parameter is declared at function scope.
So this is a standard case of an inner declaration masking
an outer one.

Possibly plpgsql_check can be set to complain about such cases,
but they're legal according to the language specification.

yes, it does

(2024-07-07 09:27:14) postgres=# select * from
plpgsql_check_function('test_function');
┌───────────────────────────────────────────────────────────────┐
│ plpgsql_check_function │
╞═══════════════════════════════════════════════════════════════╡
│ warning:00000:10:statement block:parameter "d3" is overlapped │
│ Detail: Local variable overlap function parameter. │
│ warning extra:00000:8:DECLARE:never read variable "d3" │
│ warning extra:00000:unused parameter "$1" │
│ warning extra:00000:unused parameter "$2" │
│ warning extra:00000:unused parameter "$3" │
│ warning extra:00000:unmodified OUT variable "d3" │
└───────────────────────────────────────────────────────────────┘
(7 rows)

but looks so there are false alarms related to using an alias. It is
interesting so I have not any report about this issue, so probably using
aliases is not too common today.

I was blind, plpgsql_check is correct

Regards

Pavel

Show quoted text

Regards

Pavel

regards, tom lane

#5Michael Nolan
htfoot@gmail.com
In reply to: Pavel Stehule (#4)
Re: Declaring a field that is also an out parameter in a function

On Sun, Jul 7, 2024 at 4:13 AM Pavel Stehule <pavel.stehule@gmail.com> wrote:

but looks so there are false alarms related to using an alias. It is interesting so I have not any report about this issue, so probably using aliases is not too common today.

I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability.

Mike Nolan

#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Pavel Stehule (#3)
Re: Declaring a field that is also an out parameter in a function

Pavel Stehule <pavel.stehule@gmail.com> writes:

(2024-07-07 09:27:14) postgres=# select * from
plpgsql_check_function('test_function');
┌───────────────────────────────────────────────────────────────┐
│ plpgsql_check_function │
╞═══════════════════════════════════════════════════════════════╡
│ warning:00000:10:statement block:parameter "d3" is overlapped │
│ Detail: Local variable overlap function parameter. │

Nice! FWIW, I think the standard terminology is "local variable
shadows function parameter".

regards, tom lane

#7Pavel Stehule
pavel.stehule@gmail.com
In reply to: Michael Nolan (#5)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 15:01 odesílatel Michael Nolan <htfoot@gmail.com> napsal:

On Sun, Jul 7, 2024 at 4:13 AM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

but looks so there are false alarms related to using an alias. It is

interesting so I have not any report about this issue, so probably using
aliases is not too common today.

I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability.

it is obsolete - aliases were used when Postgres doesn't support named
arguments.

I don't know any good reason why one variable can use more than one name.

There can be an exception when argument names are very long, but generally
they are not used.

Show quoted text

Mike Nolan

#8David G. Johnston
david.g.johnston@gmail.com
In reply to: Michael Nolan (#5)
Re: Declaring a field that is also an out parameter in a function

On Sunday, July 7, 2024, Michael Nolan <htfoot@gmail.com> wrote:

On Sun, Jul 7, 2024 at 4:13 AM Pavel Stehule <pavel.stehule@gmail.com>
wrote:

but looks so there are false alarms related to using an alias. It is

interesting so I have not any report about this issue, so probably using
aliases is not too common today.

I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability.

Mostly because you should just name variables correctly the first time. It
improves readability if you use $n parameter names, which you should not.
As noted in 43.3.2, sometimes you don’t have a choice, though new and old
aren’t usually problematic enough to warrant aliasing.

David J.

#9Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Pavel Stehule (#7)
Re: Declaring a field that is also an out parameter in a function

On 7/7/24 07:42, Pavel Stehule wrote:

I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability.

it is obsolete - aliases were used when Postgres doesn't support named
arguments.

Is that was what it was complaining about or the fact they where
declared and never used?

I  don't know any good reason why one variable can use more than one name.

Section 43.3.2. ALIAS provides the pros/cons.

There can be an exception when argument names are very long, but
generally they are not used.

Mike Nolan

--
Adrian Klaver
adrian.klaver@aklaver.com

#10Pavel Stehule
pavel.stehule@gmail.com
In reply to: Adrian Klaver (#9)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 16:48 odesílatel Adrian Klaver <adrian.klaver@aklaver.com>
napsal:

On 7/7/24 07:42, Pavel Stehule wrote:

I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability.

it is obsolete - aliases were used when Postgres doesn't support named
arguments.

Is that was what it was complaining about or the fact they where
declared and never used?

I am not sure if I understand the question. My reply was related to
generic usage of aliases.

Report from plpgsql_check was correct - and related variables were not
used.

Show quoted text

I don't know any good reason why one variable can use more than one

name.

Section 43.3.2. ALIAS provides the pros/cons.

There can be an exception when argument names are very long, but
generally they are not used.

Mike Nolan

--
Adrian Klaver
adrian.klaver@aklaver.com

#11Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#6)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 16:37 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal:

Pavel Stehule <pavel.stehule@gmail.com> writes:

(2024-07-07 09:27:14) postgres=# select * from
plpgsql_check_function('test_function');
┌───────────────────────────────────────────────────────────────┐
│ plpgsql_check_function │
╞═══════════════════════════════════════════════════════════════╡
│ warning:00000:10:statement block:parameter "d3" is overlapped │
│ Detail: Local variable overlap function parameter. │

Nice! FWIW, I think the standard terminology is "local variable
shadows function parameter".

fixed

Show quoted text

regards, tom lane

#12Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Pavel Stehule (#10)
Re: Declaring a field that is also an out parameter in a function

On 7/7/24 07:53, Pavel Stehule wrote:

ne 7. 7. 2024 v 16:48 odesílatel Adrian Klaver
<adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> napsal:

On 7/7/24 07:42, Pavel Stehule wrote:

     I'm not sure why there's a warning about using an alias.

43.3.1 says

     to use them for improved readability.

it is obsolete - aliases were used when Postgres doesn't support

named

arguments.

Is that was what it was complaining about or the fact they where
declared and never used?

I am not sure if I understand the question. My  reply was related to
generic usage of aliases.

The conversation was:

Mike Nolan

"I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability."

Pavel Stehule

"it is obsolete - aliases were used when Postgres doesn't support named
arguments."

I was just trying to confirm that the warning was not for ALIAS being
declared. That it was for what you state below.

Report from plpgsql_check was correct - and related variables were not
used.

I  don't know any good reason why one variable can use more than

one name.

Section 43.3.2. ALIAS provides the pros/cons.

There can be an exception when argument names are very long, but
generally they are not used.

     Mike Nolan

--
Adrian Klaver
adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>

--
Adrian Klaver
adrian.klaver@aklaver.com

#13Pavel Stehule
pavel.stehule@gmail.com
In reply to: Adrian Klaver (#12)
Re: Declaring a field that is also an out parameter in a function

ne 7. 7. 2024 v 17:00 odesílatel Adrian Klaver <adrian.klaver@aklaver.com>
napsal:

On 7/7/24 07:53, Pavel Stehule wrote:

ne 7. 7. 2024 v 16:48 odesílatel Adrian Klaver
<adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> napsal:

On 7/7/24 07:42, Pavel Stehule wrote:

I'm not sure why there's a warning about using an alias.

43.3.1 says

to use them for improved readability.

it is obsolete - aliases were used when Postgres doesn't support

named

arguments.

Is that was what it was complaining about or the fact they where
declared and never used?

I am not sure if I understand the question. My reply was related to
generic usage of aliases.

The conversation was:

Mike Nolan

"I'm not sure why there's a warning about using an alias. 43.3.1 says
to use them for improved readability."

Pavel Stehule

"it is obsolete - aliases were used when Postgres doesn't support named
arguments."

I was just trying to confirm that the warning was not for ALIAS being
declared. That it was for what you state below.

ok

Show quoted text

Report from plpgsql_check was correct - and related variables were not
used.

I don't know any good reason why one variable can use more than

one name.

Section 43.3.2. ALIAS provides the pros/cons.

There can be an exception when argument names are very long, but
generally they are not used.

Mike Nolan

--
Adrian Klaver
adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>

--
Adrian Klaver
adrian.klaver@aklaver.com