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 type must 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")));
/* Alternative possibility: 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
Show quoted text
--
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
Show quoted text
--
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.