http://www.postgresql.org/docs/8.3/interactive/xplang-install.html http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html http://www.postgresql.org/docs/8.3/interactive/plpgsql-declarations.html CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql' LANGUAGE C; CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '$libdir/plpgsql' LANGUAGE C; CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator; CREATE VIEW benchview AS SELECT * FROM lineitem, part where l_partkey = p_partkey; CREATE OR REPLACE FUNCTION bench() RETURNS integer AS $$ DECLARE rr RECORD; cnt integer; BEGIN cnt = 0; FOR rr IN SELECT * FROM benchview LOOP cnt = cnt + 1; END LOOP; RETURN cnt; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION benchtime() RETURNS integer AS $BODY$ DECLARE rr RECORD; cnt integer; starttime timestamp; curtime timestamp; timediff interval; BEGIN cnt = 0; starttime := timeofday()::timestamp; RAISE NOTICE 'START: %',starttime; FOR rr IN SELECT * FROM benchview LOOP cnt = cnt + 1; IF cnt = 100 THEN curtime := timeofday()::timestamp; RAISE NOTICE '100 results: %',curtime; ELSIF cnt = 1000 THEN curtime := timeofday()::timestamp; RAISE NOTICE '1000 results: %',curtime; END IF; END LOOP; curtime := timeofday()::timestamp; timediff = curtime - starttime; RAISE NOTICE 'DONE: %',curtime; RAISE NOTICE 'RUNTIME: %',timediff; --RAISE NOTICE 'RUNTIME: %',to_char(timediff, 'SSSS'); RAISE NOTICE 'Generated results: %',cnt; RETURN cnt; END; $BODY$ LANGUAGE 'plpgsql';