Обсуждение: some dead code in functioncmds.c
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
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
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
>
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
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
>
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.