From 6c61b0d93cd5378bfb64959b9e738fe02413cefe Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 23 Jul 2005 14:18:57 +0000
Subject: [PATCH] In the stats test, delay for the stats collector to catch up
 using a function that actually sleeps, instead of busy-waiting.  Perhaps this
 will resolve some of the intermittent stats failures we keep seeing.

---
 src/test/regress/expected/stats.out           | 21 ++++---------------
 .../regress/input/create_function_1.source    | 15 ++++++++-----
 .../regress/output/create_function_1.source   | 14 ++++++++-----
 src/test/regress/regress.c                    | 19 ++++++++++++++++-
 src/test/regress/sql/stats.sql                | 17 +--------------
 5 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out
index e366f76cb9c..55c52139668 100644
--- a/src/test/regress/expected/stats.out
+++ b/src/test/regress/expected/stats.out
@@ -24,17 +24,6 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
 -- 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 
@@ -49,10 +38,10 @@ SELECT count(*) FROM tenk2 WHERE unique1 = 1;
 (1 row)
 
 -- let stats collector catch up
-SELECT sleep('0:0:2'::interval);
- sleep 
--------
-     0
+SELECT do_sleep(2);
+ do_sleep 
+----------
+ 
 (1 row)
 
 -- check effects
@@ -76,6 +65,4 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
  t        | t
 (1 row)
 
--- clean up
-DROP FUNCTION sleep(interval);
 -- End of Stats Test
diff --git a/src/test/regress/input/create_function_1.source b/src/test/regress/input/create_function_1.source
index f657e3740cd..14b90ca1a1b 100644
--- a/src/test/regress/input/create_function_1.source
+++ b/src/test/regress/input/create_function_1.source
@@ -5,22 +5,22 @@
 CREATE FUNCTION widget_in(cstring)
    RETURNS widget
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 
 CREATE FUNCTION widget_out(widget)
    RETURNS cstring
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 
 CREATE FUNCTION int44in(cstring)
    RETURNS city_budget
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 
 CREATE FUNCTION int44out(city_budget)
    RETURNS cstring
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 
 CREATE FUNCTION check_primary_key ()
 	RETURNS trigger
@@ -50,7 +50,12 @@ CREATE FUNCTION ttdummy ()
 CREATE FUNCTION set_ttdummy (int4)
         RETURNS int4
         AS '@abs_builddir@/regress@DLSUFFIX@'
-        LANGUAGE 'C';
+        LANGUAGE 'C' STRICT;
+
+CREATE FUNCTION do_sleep (int4)
+        RETURNS void
+        AS '@abs_builddir@/regress@DLSUFFIX@'
+        LANGUAGE 'C' STRICT;
 
 -- Things that shouldn't work:
 
diff --git a/src/test/regress/output/create_function_1.source b/src/test/regress/output/create_function_1.source
index 62fcb01d093..7511c3f8d67 100644
--- a/src/test/regress/output/create_function_1.source
+++ b/src/test/regress/output/create_function_1.source
@@ -4,24 +4,24 @@
 CREATE FUNCTION widget_in(cstring)
    RETURNS widget
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 NOTICE:  type "widget" is not yet defined
 DETAIL:  Creating a shell type definition.
 CREATE FUNCTION widget_out(widget)
    RETURNS cstring
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 NOTICE:  argument type widget is only a shell
 CREATE FUNCTION int44in(cstring)
    RETURNS city_budget
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 NOTICE:  type "city_budget" is not yet defined
 DETAIL:  Creating a shell type definition.
 CREATE FUNCTION int44out(city_budget)
    RETURNS cstring
    AS '@abs_builddir@/regress@DLSUFFIX@'
-   LANGUAGE 'c';
+   LANGUAGE 'C' STRICT;
 NOTICE:  argument type city_budget is only a shell
 CREATE FUNCTION check_primary_key ()
 	RETURNS trigger
@@ -46,7 +46,11 @@ CREATE FUNCTION ttdummy ()
 CREATE FUNCTION set_ttdummy (int4)
         RETURNS int4
         AS '@abs_builddir@/regress@DLSUFFIX@'
-        LANGUAGE 'C';
+        LANGUAGE 'C' STRICT;
+CREATE FUNCTION do_sleep (int4)
+        RETURNS void
+        AS '@abs_builddir@/regress@DLSUFFIX@'
+        LANGUAGE 'C' STRICT;
 -- Things that shouldn't work:
 CREATE FUNCTION test1 (int) RETURNS int LANGUAGE sql
     AS 'SELECT ''not an integer'';';
diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c
index 97f2ea713f4..b0421332f8b 100644
--- a/src/test/regress/regress.c
+++ b/src/test/regress/regress.c
@@ -1,5 +1,5 @@
 /*
- * $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.62 2004/10/21 19:28:36 tgl Exp $
+ * $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.63 2005/07/23 14:18:56 tgl Exp $
  */
 
 #include "postgres.h"
@@ -26,6 +26,8 @@ extern char *reverse_name(char *string);
 extern int	oldstyle_length(int n, text *t);
 extern Datum int44in(PG_FUNCTION_ARGS);
 extern Datum int44out(PG_FUNCTION_ARGS);
+extern Datum do_sleep(PG_FUNCTION_ARGS);
+
 
 /*
  * Distance from a point to a path
@@ -733,3 +735,18 @@ int44out(PG_FUNCTION_ARGS)
 	*--walk = '\0';
 	PG_RETURN_CSTRING(result);
 }
+
+/*
+ * do_sleep - delay for N seconds
+ */
+PG_FUNCTION_INFO_V1(do_sleep);
+
+Datum
+do_sleep(PG_FUNCTION_ARGS)
+{
+	int32		secs = PG_GETARG_INT32(0);
+
+	pg_usleep(secs * 1000000L);
+
+	PG_RETURN_VOID();
+}
diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql
index d5dcbd92cee..4af2d700e4d 100644
--- a/src/test/regress/sql/stats.sql
+++ b/src/test/regress/sql/stats.sql
@@ -24,24 +24,12 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
 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);
+SELECT do_sleep(2);
 
 -- check effects
 SELECT st.seq_scan >= pr.seq_scan + 1,
@@ -55,7 +43,4 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
   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
-- 
GitLab