Thread: function body error checking issues
Bruce, here is a example: (there is a simple error in the function that does not get caught when running the query in 8.0) CREATE or REPLACE FUNCTION annual.get_ratio( float8, float8) RETURNS pg_catalog.float8 AS $BODY$ DECLARE execptioncount_in alias for $1; questioncount_in alias for $2; ratio_out float8; BEGIN IF (execptioncount_in >0) AND (questioncount_in >0) THEN RATIO_OUT = execptioncount_in / questioncount_in; ELSE --this variable is not declared, yet when I run this query no error is raised EXCEPTIONRATIO_OUT = 0; END IF; return ratio_out; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; > > From: Bruce Momjian <pgman@candle.pha.pa.us> > Date: 2005/02/21 Mon AM 10:47:35 EST > To: tony_caduto@amsoftwaredesign.com > CC: pgsql-general@postgresql.org > Subject: Re: [GENERAL] is there anyway to get the backends IP address from > > Tony Caduto wrote: > > Bruce, > > On another note, is there plans to improve the type checking of stored > > functions during the save/compile? > > Currently I can pretty much make tons of mistakes (on purpose of course > > :-) and they are not flagged as errors until runtime. > > The biggest complaint I see from other DBAs (MS SQL, Oracle) is that > > Postgres does little to no pre-runtime type checking. > > We have no plans to improve that. We do have 'check_function_bodies' > which defaults to true and does some checking. Would you give us a > particular example you would like improved? > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 359-1001 > + If your life is a hard drive, | 13 Roberts Road > + Christ can be your backup. | Newtown Square, Pennsylvania 19073 >
tony_caduto@amsoftwaredesign.com wrote: > Bruce, > here is a example: > (there is a simple error in the function that does not get caught when running the query in 8.0) > > CREATE or REPLACE FUNCTION annual.get_ratio( float8, float8) > RETURNS pg_catalog.float8 AS > $BODY$ > DECLARE > execptioncount_in alias for $1; > questioncount_in alias for $2; > ratio_out float8; > > BEGIN > IF (execptioncount_in >0) AND (questioncount_in >0) THEN > > RATIO_OUT = execptioncount_in / questioncount_in; > > ELSE > --this variable is not declared, yet when I run this query no error is raised > EXCEPTIONRATIO_OUT = 0; > END IF; > return ratio_out; > END; > $BODY$ > LANGUAGE 'plpgsql' VOLATILE Syntax error reporting has been improved in our code so 8.1 might be better and catching such errors. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian wrote: > Syntax error reporting has been improved in our code so 8.1 might be > better and catching such errors. Yes, current sources catches this at definition-time: % psql -f test.sql psql:test.sql:21: ERROR: syntax error at or near "EXCEPTIONRATIO_OUT" at character 1 QUERY: EXCEPTIONRATIO_OUT = 0 CONTEXT: SQL statement in PL/PgSQL function "get_ratio" near line 13 psql:test.sql:21: LINE 1: EXCEPTIONRATIO_OUT = 0 psql:test.sql:21: ^ If folks have more suggestions for improving pl/pgsql compile-time error checking, speak up. I'm also planning to implement trivially-dead-code detection (like statements that follow a RETURN, and so on), although that's not in HEAD yet. -Neil