diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out new file mode 100644 index 0000000000000000000000000000000000000000..b0056f6cea056709515a9d0d72758de9f71f2d9b --- /dev/null +++ b/src/test/regress/expected/stats.out @@ -0,0 +1,79 @@ +-- +-- Test Statistics Collector +-- +-- Must be run after tenk2 has been created (by create_table), +-- populated (by create_misc) and indexed (by create_index). +-- +-- conditio sine qua non +SHOW stats_start_collector; -- must be on + stats_start_collector +----------------------- + on +(1 row) + +-- save counters +CREATE TEMP TABLE prevstats AS +SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, + (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, + (b.idx_blks_read + b.idx_blks_hit) AS idx_blks + FROM pg_catalog.pg_stat_user_tables AS t, + pg_catalog.pg_statio_user_tables AS b + WHERE t.relname='tenk2' AND b.relname='tenk2'; +-- enable statistics +SET stats_block_level = on; +SET stats_row_level = on; +-- helper function +CREATE FUNCTION sleep(interval) RETURNS integer AS ' +DECLARE + endtime timestamp; +BEGIN + endtime := timeofday()::timestamp + $1; + WHILE timeofday()::timestamp < endtime LOOP + END LOOP; + RETURN 0; +END; +' LANGUAGE 'plpgsql'; +-- do something +SELECT count(*) FROM tenk2; + count +------- + 10000 +(1 row) + +SELECT count(*) FROM tenk2 WHERE unique1 = 1; + count +------- + 1 +(1 row) + +-- let stats collector catch up +SELECT sleep('0:0:2'::interval); + sleep +------- + 0 +(1 row) + +-- check effects +SELECT st.seq_scan >= pr.seq_scan + 1, + st.seq_tup_read >= pr.seq_tup_read + cl.reltuples, + st.idx_scan >= pr.idx_scan + 1, + st.idx_tup_fetch >= pr.idx_tup_fetch + 1 + FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + ?column? | ?column? | ?column? | ?column? +----------+----------+----------+---------- + t | t | t | t +(1 row) + +SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages, + st.idx_blks_read + st.idx_blks_hit >= pr.idx_blks + 1 + FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +-- clean up +DROP FUNCTION sleep(interval); +-- End of Stats Test diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 974dd2ee65761d3110ff473e442a48866445f64a..a2e34d0f2ab53ec2afd36ee97c821f627b1c37e3 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -74,4 +74,4 @@ test: select_views portals_p2 rules foreign_key cluster # The sixth group of parallel test # ---------- # "plpgsql" cannot run concurrently with "rules" -test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism +test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism stats diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index c3a9fd726b132830180c1e3a73a46f29dead54a5..133c175aec2b92059dbffad53fcd41662b2ef35c 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -1,4 +1,4 @@ -# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.21 2003/08/26 18:32:23 momjian Exp $ +# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.22 2003/09/13 16:44:48 momjian Exp $ # This should probably be in an order similar to parallel_schedule. test: boolean test: char @@ -93,3 +93,4 @@ test: truncate test: alter_table test: sequence test: polymorphism +test: stats diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql new file mode 100644 index 0000000000000000000000000000000000000000..948a81f0c40bb062d9c63483fbe5623111cd14a6 --- /dev/null +++ b/src/test/regress/sql/stats.sql @@ -0,0 +1,58 @@ +-- +-- Test Statistics Collector +-- +-- Must be run after tenk2 has been created (by create_table), +-- populated (by create_misc) and indexed (by create_index). +-- + +-- conditio sine qua non +SHOW stats_start_collector; -- must be on + +-- save counters +CREATE TEMP TABLE prevstats AS +SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, + (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, + (b.idx_blks_read + b.idx_blks_hit) AS idx_blks + FROM pg_catalog.pg_stat_user_tables AS t, + pg_catalog.pg_statio_user_tables AS b + WHERE t.relname='tenk2' AND b.relname='tenk2'; + +-- enable statistics +SET stats_block_level = on; +SET stats_row_level = on; + +-- helper function +CREATE FUNCTION sleep(interval) RETURNS integer AS ' +DECLARE + endtime timestamp; +BEGIN + endtime := timeofday()::timestamp + $1; + WHILE timeofday()::timestamp < endtime LOOP + END LOOP; + RETURN 0; +END; +' LANGUAGE 'plpgsql'; + +-- do something +SELECT count(*) FROM tenk2; +SELECT count(*) FROM tenk2 WHERE unique1 = 1; + +-- let stats collector catch up +SELECT sleep('0:0:2'::interval); + +-- check effects +SELECT st.seq_scan >= pr.seq_scan + 1, + st.seq_tup_read >= pr.seq_tup_read + cl.reltuples, + st.idx_scan >= pr.idx_scan + 1, + st.idx_tup_fetch >= pr.idx_tup_fetch + 1 + FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; +SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages, + st.idx_blks_read + st.idx_blks_hit >= pr.idx_blks + 1 + FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr + WHERE st.relname='tenk2' AND cl.relname='tenk2'; + +-- clean up +DROP FUNCTION sleep(interval); + +-- End of Stats Test