The "random" regression test uses a function called oidrand(), which
authorBruce Momjian
Thu, 13 Feb 2003 05:24:04 +0000 (05:24 +0000)
committerBruce Momjian
Thu, 13 Feb 2003 05:24:04 +0000 (05:24 +0000)
takes two parameters, an OID x and an integer y, and returns "true" with
probability 1/y (the OID argument is ignored). This can be useful -- for
example, it can be used to select a random sampling of the rows in a
table (which is what the "random" regression test uses it for).

This patch removes that function, because it was old and messy. The old
function had the following problems:

- it was undocumented

- it was poorly named

- it was designed to workaround an optimizer bug that no longer exists
(the OID argument is to ensure that the optimizer won't optimize away
calls to the function; AFAIK marking the function as 'volatile' suffices
nowadays)

- it used a different random-number generation technique than the other
PSRNG-related functions in the backend do (it called random() like they
do, but it had its own logic for setting a set and deciding when to
reseed the RNG).

Ok, this patch removes oidrand(), oidsrand(), and userfntest(), and
improves the SGML docs a little bit (un-commenting the setseed()
documentation).

Neil Conway

doc/src/sgml/func.sgml
src/backend/utils/adt/misc.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/test/regress/expected/random.out
src/test/regress/sql/random.sql

index a3e66eabc34a701d04be5a9d5df9a46b5dfb6fe3..f2d84a969aa7f4a6634e75241aedbc48ee4296da 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -682,14 +682,15 @@ PostgreSQL documentation
        round(42.4382, 2)
        42.44
       
-
+
+      
+       setseed(dp)
+       int32
+       set seed for subsequent random() calls
+       setseed(0.54823)
+       1177314959
+      
+
       
        sign(dp or numeric)
        (same as input)
@@ -955,7 +956,8 @@ PostgreSQL documentation
        substring(string from pattern for escape)
        text
        
-        Extract substring matching SQL regular expression
+        Extract substring matching SQL regular
+        expression
         
          substring
         
@@ -1168,7 +1170,7 @@ PostgreSQL documentation
        text
        
         Return the given string suitably quoted to be used as an identifier
-   in an SQL query string.
+   in an SQL query string.
    Quotes are added only if necessary (i.e., if the string contains
    non-identifier characters or would be case-folded).
    Embedded quotes are properly doubled.
@@ -1182,7 +1184,7 @@ PostgreSQL documentation
        text
        
         Return the given string suitably quoted to be used as a literal
-   in an SQL query string.
+   in an SQL query string.
    Embedded quotes and backslashes are properly doubled.
        
        quote_literal('O\'Reilly')
@@ -2511,14 +2513,15 @@ PostgreSQL documentation
      SUBSTRING(string FROM
      pattern FOR
      escape), provides
-     extraction of a substring that matches a SQL99 regular expression
-     pattern.  As with SIMILAR TO, the specified pattern
-     must match to the entire data string, else the function fails and
-     returns null.  To indicate the part of the pattern that should be
-     returned on success, SQL99 specifies that the pattern must
-     contain two occurrences of the escape character followed by
-     double quote (").  The text matching the portion of
-     the pattern between these markers is returned.
+     extraction of a substring that matches a SQL99
+     regular expression pattern.  As with SIMILAR TO, the
+     specified pattern must match to the entire data string, else the
+     function fails and returns null.  To indicate the part of the
+     pattern that should be returned on success,
+     SQL99 specifies that the pattern must contain
+     two occurrences of the escape character followed by double quote
+     (").  The text matching the portion of the pattern
+     between these markers is returned.
     
 
    
@@ -6025,11 +6028,11 @@ SELECT TIMESTAMP 'now';
    
 
   
-   For largely historical reasons, the sequence to be operated on by
-   a sequence-function call is specified by a text-string argument.
-   To achieve some compatibility with the handling of ordinary SQL
-   names, the sequence functions convert their argument to lower case
-   unless the string is double-quoted.  Thus
+   For largely historical reasons, the sequence to be operated on by a
+   sequence-function call is specified by a text-string argument.  To
+   achieve some compatibility with the handling of ordinary
+   SQL names, the sequence functions convert their
+   argument to lower case unless the string is double-quoted.  Thus
 
 nextval('foo')      operates on sequence foo
 nextval('FOO')      operates on sequence foo
@@ -6480,7 +6483,8 @@ SELECT NULLIF(value, '(none)') ...
    
     The current_setting is used to obtain the current
     value of the setting_name setting, as a query
-    result. It is the equivalent to the SQL SHOW command.
+    result. It is the equivalent to the SQL
+    SHOW command.
     For example:
 
 select current_setting('DateStyle');
@@ -6497,8 +6501,8 @@ select current_setting('DateStyle');
     If is_local is set to true,
     the new value will only apply to the current transaction. If you want
     the new value to apply for the current session, use
-    false instead. It is the equivalent to the SQL
-    SET command. For example:
+    false instead. It is the equivalent to the
+    <acronym>SQL <command>SET command. For example:
 
 select set_config('show_statement_stats','off','f');
  set_config
index 6b105fdef4d81a2286a165ea00fb6e1e9d52e3e8..1f85e4f499211f5e3c78194df4061440f46ea4d0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.27 2002/09/04 20:31:28 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.28 2003/02/13 05:24:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,75 +43,6 @@ nonnullvalue(PG_FUNCTION_ARGS)
    PG_RETURN_BOOL(true);
 }
 
-/*
- * oidrand (oid o, int4 X)-
- *   Takes in an oid and a int4 X, and will return 'true' about 1/X of
- *   the time.  If X == 0, this will always return true.
- *   Useful for doing random sampling or subsetting.
- *
- * Example use:
- *    select * from TEMP where oidrand(TEMP.oid, 10)
- * will return about 1/10 of the tuples in TEMP
- *
- * NOTE: the OID input is not used at all. It is there just because of
- * an old optimizer bug: a qual expression containing no variables was
- * mistakenly assumed to be a constant.  Pretending to access the row's OID
- * prevented the optimizer from treating the oidrand() result as constant.
- */
-
-static bool random_initialized = false;
-
-Datum
-oidrand(PG_FUNCTION_ARGS)
-{
-#ifdef NOT_USED
-   Oid         o = PG_GETARG_OID(0);
-#endif
-   int32       X = PG_GETARG_INT32(1);
-   bool        result;
-
-   if (X == 0)
-       PG_RETURN_BOOL(true);
-
-   /*
-    * We do this because the cancel key is actually a random, so we don't
-    * want them to be able to request random numbers using our postmaster
-    * seeded value.
-    */
-   if (!random_initialized)
-   {
-       srandom((unsigned int) time(NULL));
-       random_initialized = true;
-   }
-
-   result = (random() % X == 0);
-   PG_RETURN_BOOL(result);
-}
-
-/*
-   oidsrand(int32 X) -
-     seeds the random number generator
-     always returns true
-*/
-Datum
-oidsrand(PG_FUNCTION_ARGS)
-{
-   int32       X = PG_GETARG_INT32(0);
-
-   srandom((unsigned int) X);
-   random_initialized = true;
-   PG_RETURN_BOOL(true);
-}
-
-
-Datum
-userfntest(PG_FUNCTION_ARGS)
-{
-   int32       i = PG_GETARG_INT32(0);
-
-   PG_RETURN_INT32(i);
-}
-
 /*
  * current_database()
  * Expose the current database to the user
index df4347633f2699baad6861401d52ce69e3e82b26..230f1e277acf08b5f7bc98e5d7f293e524baf172 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catversion.h,v 1.175 2003/02/03 21:15:44 tgl Exp $
+ * $Id: catversion.h,v 1.176 2003/02/13 05:24:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 200302031
+#define CATALOG_VERSION_NO 200302131
 
 #endif
index d7b13a762ebbdde928115e96070760ffcda0cd3f..f32715284b0e79887359621ae38cad154228cd0f 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.282 2003/01/28 22:13:36 tgl Exp $
+ * $Id: pg_proc.h,v 1.283 2003/02/13 05:24:02 momjian Exp $
  *
  * NOTES
  *   The script catalog/genbki.sh reads this file and generates .bki
@@ -944,12 +944,6 @@ DESCR("greater-than");
 /* OIDS 700 - 799 */
 DATA(insert OID = 710 (  getpgusername    PGNSP PGUID 12 f f t f s 0 19 "" current_user - _null_ ));
 DESCR("deprecated -- use current_user");
-DATA(insert OID = 711 (  userfntest           PGNSP PGUID 12 f f t f i 1 23 "23"  userfntest - _null_ ));
-DESCR("");
-DATA(insert OID = 713 (  oidrand          PGNSP PGUID 12 f f t f v 2 16 "26 23"    oidrand - _null_ ));
-DESCR("random");
-DATA(insert OID = 715 (  oidsrand         PGNSP PGUID 12 f f t f v 1 16 "23"  oidsrand - _null_ ));
-DESCR("seed random number generator");
 DATA(insert OID = 716 (  oidlt            PGNSP PGUID 12 f f t f i 2 16 "26 26"    oidlt - _null_ ));
 DESCR("less-than");
 DATA(insert OID = 717 (  oidle            PGNSP PGUID 12 f f t f i 2 16 "26 26"    oidle - _null_ ));
index df20f4ad499a1ce093e6c7dc937cfcdfcf45524d..e956f54fef6527c591c4f6cc5f78aa1cfb059539 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.207 2003/02/06 20:25:33 tgl Exp $
+ * $Id: builtins.h,v 1.208 2003/02/13 05:24:04 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -315,9 +315,6 @@ extern Datum float84ge(PG_FUNCTION_ARGS);
 /* misc.c */
 extern Datum nullvalue(PG_FUNCTION_ARGS);
 extern Datum nonnullvalue(PG_FUNCTION_ARGS);
-extern Datum oidrand(PG_FUNCTION_ARGS);
-extern Datum oidsrand(PG_FUNCTION_ARGS);
-extern Datum userfntest(PG_FUNCTION_ARGS);
 extern Datum current_database(PG_FUNCTION_ARGS);
 
 /* not_in.c */
index 0f4dce0bbe1805c1548203af6fd3300d3935b97f..583be02be09fe3ac907f25ef1dc35c635666108d 100644 (file)
@@ -15,11 +15,11 @@ SELECT count(*) FROM onek;
 --  have a regression test which can pass/fail
 -- - thomas 1998-08-17
 SELECT count(*) AS random INTO RANDOM_TBL
-  FROM onek WHERE oidrand(onek.oid, 10);
+  FROM onek WHERE random() < 1.0/10;
 -- select again, the count should be different
 INSERT INTO RANDOM_TBL (random)
   SELECT count(*)
-  FROM onek WHERE oidrand(onek.oid, 10);
+  FROM onek WHERE random() < 1.0/10;
 -- now test the results for randomness in the correct range
 SELECT random, count(random) FROM RANDOM_TBL
   GROUP BY random HAVING count(random) > 1;
index 1279a8b0f488c5ab632de19131226e94a43f99b7..e2333b985f83a191ac7edd6e24168ef45cd0e626 100644 (file)
@@ -12,12 +12,12 @@ SELECT count(*) FROM onek;
 --  have a regression test which can pass/fail
 -- - thomas 1998-08-17
 SELECT count(*) AS random INTO RANDOM_TBL
-  FROM onek WHERE oidrand(onek.oid, 10);
+  FROM onek WHERE random() < 1.0/10;
 
 -- select again, the count should be different
 INSERT INTO RANDOM_TBL (random)
   SELECT count(*)
-  FROM onek WHERE oidrand(onek.oid, 10);
+  FROM onek WHERE random() < 1.0/10;
 
 -- now test the results for randomness in the correct range
 SELECT random, count(random) FROM RANDOM_TBL