Thread: some dead code in functioncmds.c

some dead code in functioncmds.c

From
Pavel Stehule
Date:
Hello

I found some strange code. Is code in "ELSE" part dead, or its bug?
if (stmt->returnType){    /* explicit RETURNS clause */    compute_return_type(stmt->returnType, languageOid,
            &prorettype, &returnsSet);    if (OidIsValid(requiredResultType) && prorettype != requiredResultType)
ereport(ERROR,                (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),                 errmsg("function result
typemust be %s because of OUT parameters",                        format_type_be(requiredResultType))));}else if
(OidIsValid(requiredResultType)){   /* default RETURNS clause from OUT parameters */    prorettype =
requiredResultType;   returnsSet = false;}else{    ereport(ERROR,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),            errmsg("function result type must be specified")));    /*
Alternativepossibility: default to RETURNS VOID */
 

/* WHY FOLOWING LINES? */    prorettype = VOIDOID;    returnsSet = false;}

Regards
Pavel


Re: some dead code in functioncmds.c

From
Heikki Linnakangas
Date:
Pavel Stehule wrote:
>     else
>     {
>         ereport(ERROR,
>                 (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
>                  errmsg("function result type must be specified")));
>         /* Alternative possibility: default to RETURNS VOID */
> 
> /* WHY FOLOWING LINES? */
>         prorettype = VOIDOID;
>         returnsSet = false;
>     }

To keep the compiler quiet about using the variables uninitialized. The
compiler doesn't know that ereport(ERROR) never returns.

--  Heikki Linnakangas EnterpriseDB   http://www.enterprisedb.com


Re: some dead code in functioncmds.c

From
Pavel Stehule
Date:
2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
> Pavel Stehule wrote:
>>       else
>>       {
>>               ereport(ERROR,
>>                               (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
>>                                errmsg("function result type must be specified")));
>>               /* Alternative possibility: default to RETURNS VOID */
>>
>> /* WHY FOLOWING LINES? */
>>               prorettype = VOIDOID;
>>               returnsSet = false;
>>       }
>
> To keep the compiler quiet about using the variables uninitialized. The
> compiler doesn't know that ereport(ERROR) never returns.
>

Should be similar code little bit commented?

Pavel

> --
>  Heikki Linnakangas
>  EnterpriseDB   http://www.enterprisedb.com
>


Re: some dead code in functioncmds.c

From
Heikki Linnakangas
Date:
Pavel Stehule wrote:
> 2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
>> Pavel Stehule wrote:
>>>       else
>>>       {
>>>               ereport(ERROR,
>>>                               (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
>>>                                errmsg("function result type must be specified")));
>>>               /* Alternative possibility: default to RETURNS VOID */
>>>
>>> /* WHY FOLOWING LINES? */
>>>               prorettype = VOIDOID;
>>>               returnsSet = false;
>>>       }
>> To keep the compiler quiet about using the variables uninitialized. The
>> compiler doesn't know that ereport(ERROR) never returns.
> 
> Should be similar code little bit commented?

*shrug*, maybe, often we do put a "/* keep compiler quiet */" comment on
such places.

On closer look, the "Alternative possibility: default to RETURNS VOID"
comment suggests that besides keeping the compiler quiet, those lines
demonstrate an alternative behavior that was considered.

--  Heikki Linnakangas EnterpriseDB   http://www.enterprisedb.com


Re: some dead code in functioncmds.c

From
Pavel Stehule
Date:
2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
> Pavel Stehule wrote:
>> 2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
>>> Pavel Stehule wrote:
>>>>       else
>>>>       {
>>>>               ereport(ERROR,
>>>>                               (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
>>>>                                errmsg("function result type must be specified")));
>>>>               /* Alternative possibility: default to RETURNS VOID */
>>>>
>>>> /* WHY FOLOWING LINES? */
>>>>               prorettype = VOIDOID;
>>>>               returnsSet = false;
>>>>       }
>>> To keep the compiler quiet about using the variables uninitialized. The
>>> compiler doesn't know that ereport(ERROR) never returns.
>>
>> Should be similar code little bit commented?
>
> *shrug*, maybe, often we do put a "/* keep compiler quiet */" comment on
> such places.
>
> On closer look, the "Alternative possibility: default to RETURNS VOID"
> comment suggests that besides keeping the compiler quiet, those lines
> demonstrate an alternative behavior that was considered.

I prefere "keep compiler quiet". It is cleaner - and it is used more times.

Pavel
>
> --
>  Heikki Linnakangas
>  EnterpriseDB   http://www.enterprisedb.com
>


Re: some dead code in functioncmds.c

From
Peter Eisentraut
Date:
On fre, 2009-10-30 at 19:08 +0100, Pavel Stehule wrote:
> 2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
> > Pavel Stehule wrote:
> >> 2009/10/30 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>:
> >>> To keep the compiler quiet about using the variables uninitialized. The
> >>> compiler doesn't know that ereport(ERROR) never returns.
> >>
> >> Should be similar code little bit commented?
> >
> > *shrug*, maybe, often we do put a "/* keep compiler quiet */" comment on
> > such places.
> >
> > On closer look, the "Alternative possibility: default to RETURNS VOID"
> > comment suggests that besides keeping the compiler quiet, those lines
> > demonstrate an alternative behavior that was considered.
> 
> I prefere "keep compiler quiet". It is cleaner - and it is used more times.

A while ago a patch was discussed (in the "clang checker" threat) that
would teach the compiler that elog(>=ERROR) does not return, but I think
it's not portable without further work.