Обсуждение: error messages VERY misleading...!
with postgresql 7.0.3 (debian/potato)--
<bitchmode attitude=on volume=really-loud>
CREATE DATABASE testorama;
\c testorama
CREATE FUNCTION int(float8) RETURNS int4 AS '
SELECT to_number(to_char( $1 , ''9999999999'') , ''9999999999'')::int4;
' LANGUAGE 'sql';
CREATE FUNCTION showage(datetime) RETURNS varchar AS '
DECLARE
val int4;
BEGIN
-- minutes
val := int( date_part(''epoch'',current_timestamp - $1) / 60 ) ;
IF val < 60 THEN
val := val / 5; -- round down to 5-minute chunks
IF val < 1
val := 1;
END IF;
return (val * 5) || '' min'';
END IF;
-- other time chunks follow
END;
' LANGUAGE 'plpgsql';
do you see the problem? i sure didn't, not for SEVEN HOURS
(thankyouverymuch). here's why:
psql=> SELECT showage( CURRENT_TIMESTAMP );
ERROR: parser: parse error at or near "$2"
now WHO in their right mind would expect anyone to interpret
'parse error at $2' as '"IF" needs a "THEN", bubba; where's the
"THEN", hmm?'?
what $2? there's barely a $1! $2? WTF?
AAUGH!
</bitchmode>
now, i know parsing for compilers/interpreters is a daunting
task, and meaningful error messages aren't easy to generate...
in postgresql plpgperl, you're lucky to get a relative line
number. but i gotta admit, 'near $2' takes the cake! WOW.
--
will@serensoft.com
http://newbieDoc.sourceforge.net/ -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!
On Wed, 21 Mar 2001, will trillich wrote:
> DECLARE
> val int4;
> BEGIN
> -- minutes
> val := int( date_part(''epoch'',current_timestamp - $1) / 60 ) ;
> IF val < 60 THEN
> val := val / 5; -- round down to 5-minute chunks
> IF val < 1
> val := 1;
> END IF;
> return (val * 5) || '' min'';
> END IF;
> -- other time chunks follow
> END;
> ' LANGUAGE 'plpgsql';
>
>
> do you see the problem? i sure didn't, not for SEVEN HOURS
> (thankyouverymuch). here's why:
>
>
> psql=> SELECT showage( CURRENT_TIMESTAMP );
> ERROR: parser: parse error at or near "$2"
>
>
> now WHO in their right mind would expect anyone to interpret
> 'parse error at $2' as '"IF" needs a "THEN", bubba; where's the
> "THEN", hmm?'?
>
> what $2? there's barely a $1! $2? WTF?
>
> AAUGH!
>
> </bitchmode>
>
> now, i know parsing for compilers/interpreters is a daunting
> task, and meaningful error messages aren't easy to generate...
> in postgresql plpgperl, you're lucky to get a relative line
> number. but i gotta admit, 'near $2' takes the cake! WOW.
My guess is that the variables are treated as $ things
($1 in this case is your argument, $2 == val)
So it's complaining at the val:=1 line.
Yeah, those messages could use help.
On Wed, Mar 21, 2001 at 06:46:44AM -0800, Stephan Szabo wrote:
>
> On Wed, 21 Mar 2001, will trillich wrote:
>
> > DECLARE
> > val int4;
> > BEGIN
> > -- minutes
> > val := int( date_part(''epoch'',current_timestamp - $1) / 60 ) ;
> > IF val < 60 THEN
> > val := val / 5; -- round down to 5-minute chunks
> > IF val < 1
> > val := 1;
> > END IF;
> > return (val * 5) || '' min'';
> > END IF;
> > -- other time chunks follow
> > END;
> > ' LANGUAGE 'plpgsql';
> >
> >
> > do you see the problem? i sure didn't, not for SEVEN HOURS
> > (thankyouverymuch). here's why:
> >
> >
> > psql=> SELECT showage( CURRENT_TIMESTAMP );
> > ERROR: parser: parse error at or near "$2"
>
> My guess is that the variables are treated as $ things
> ($1 in this case is your argument, $2 == val)
>
> So it's complaining at the val:=1 line.
>
> Yeah, those messages could use help.
they need an industrial crane, lemme tellya.
even a line number or a snapshot from context would be nice:
ERROR: parser: parse error at or near "$2" in line 9 of 'proc'
ERROR: parser: parse error at or near "$2" in "val := 1;"
ah well.
--
It is always hazardous to ask "Why?" in science, but it is often
interesting to do so just the same.
-- Isaac Asimov, 'The Genetic Code'
will@serensoft.com
http://newbieDoc.sourceforge.net/ -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!