pgbench: Remove \setrandom.
authorRobert Haas <rhaas@postgresql.org>
Tue, 29 Mar 2016 16:08:49 +0000 (12:08 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 29 Mar 2016 16:08:49 +0000 (12:08 -0400)
You can now do the same thing via \set using the appropriate function,
either random(), random_gaussian(), or random_exponential(), depending
on the desired distribution.  This is not backward-compatible, but per
discussion, it's worth it to avoid having the old syntax hang around
forever.

Fabien Coelho, reviewed by Michael Paquier, and adjusted by me.

doc/src/sgml/ref/pgbench.sgml
src/bin/pgbench/pgbench.c

index 4ceddae681b63a05bf7f093dfd01cdd41f5dd256..c5399ff952a8a7e477b01f9caae0c8fe698710cc 100644 (file)
@@ -836,60 +836,6 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
     </listitem>
    </varlistentry>
 
-   <varlistentry>
-    <term>
-     <literal>\setrandom <replaceable>varname</> <replaceable>min</> <replaceable>max</> [ uniform | { gaussian | exponential } <replaceable>parameter</> ]</literal>
-     </term>
-
-    <listitem>
-     <para>
-      Sets variable <replaceable>varname</> to a random integer value
-      between the limits <replaceable>min</> and <replaceable>max</> inclusive.
-      Each limit can be either an integer constant or a
-      <literal>:</><replaceable>variablename</> reference to a variable
-      having an integer value.
-     </para>
-
-     <para>
-      <itemizedlist>
-       <listitem>
-        <para>
-         <literal>\setrandom n 1 10</> or <literal>\setrandom n 1 10 uniform</>
-         is equivalent to <literal>\set n random(1, 10)</> and uses a uniform
-         distribution.
-        </para>
-       </listitem>
-
-      <listitem>
-       <para>
-        <literal>\setrandom n 1 10 exponential 3.0</> is equivalent to
-        <literal>\set n random_exponential(1, 10, 3.0)</> and uses an
-        exponential distribution.
-       </para>
-      </listitem>
-
-      <listitem>
-       <para>
-        <literal>\setrandom n 1 10 gaussian 2.0</> is equivalent to
-        <literal>\set n random_gaussian(1, 10, 2.0)</>, and uses a gaussian
-        distribution.
-       </para>
-      </listitem>
-     </itemizedlist>
-
-       See the documentation of these functions below for further information
-       about the precise shape of these distributions, depending on the value
-       of the parameter.
-     </para>
-
-     <para>
-      Example:
-<programlisting>
-\setrandom aid 1 :naccounts gaussian 5.0
-</programlisting></para>
-    </listitem>
-   </varlistentry>
-
    <varlistentry>
     <term>
      <literal>\sleep <replaceable>number</> [ us | ms | s ]</literal>
index 4cd5513fc62538ce9f45c66125fb378e21141c01..90e538cedc92714ac0758fa07252c3f162a3bcf5 100644 (file)
@@ -1941,148 +1941,7 @@ top:
            fprintf(stderr, "\n");
        }
 
-       /*
-        * Note: this section could be removed, as the same functionnality
-        * is available through \set xxx random_gaussian(...)
-        */
-       if (pg_strcasecmp(argv[0], "setrandom") == 0)
-       {
-           char       *var;
-           int64       min,
-                       max;
-           double      parameter = 0;
-           char        res[64];
-
-           if (*argv[2] == ':')
-           {
-               if ((var = getVariable(st, argv[2] + 1)) == NULL)
-               {
-                   fprintf(stderr, "%s: undefined variable \"%s\"\n",
-                           argv[0], argv[2]);
-                   st->ecnt++;
-                   return true;
-               }
-               min = strtoint64(var);
-           }
-           else
-               min = strtoint64(argv[2]);
-
-           if (*argv[3] == ':')
-           {
-               if ((var = getVariable(st, argv[3] + 1)) == NULL)
-               {
-                   fprintf(stderr, "%s: undefined variable \"%s\"\n",
-                           argv[0], argv[3]);
-                   st->ecnt++;
-                   return true;
-               }
-               max = strtoint64(var);
-           }
-           else
-               max = strtoint64(argv[3]);
-
-           if (max < min)
-           {
-               fprintf(stderr, "%s: \\setrandom maximum is less than minimum\n",
-                       argv[0]);
-               st->ecnt++;
-               return true;
-           }
-
-           /*
-            * Generate random number functions need to be able to subtract
-            * max from min and add one to the result without overflowing.
-            * Since we know max > min, we can detect overflow just by
-            * checking for a negative result. But we must check both that the
-            * subtraction doesn't overflow, and that adding one to the result
-            * doesn't overflow either.
-            */
-           if (max - min < 0 || (max - min) + 1 < 0)
-           {
-               fprintf(stderr, "%s: \\setrandom range is too large\n",
-                       argv[0]);
-               st->ecnt++;
-               return true;
-           }
-
-           if (argc == 4 ||    /* uniform without or with "uniform" keyword */
-               (argc == 5 && pg_strcasecmp(argv[4], "uniform") == 0))
-           {
-#ifdef DEBUG
-               printf("min: " INT64_FORMAT " max: " INT64_FORMAT " random: " INT64_FORMAT "\n", min, max, getrand(thread, min, max));
-#endif
-               snprintf(res, sizeof(res), INT64_FORMAT, getrand(thread, min, max));
-           }
-           else if (argc == 6 &&
-                    ((pg_strcasecmp(argv[4], "gaussian") == 0) ||
-                     (pg_strcasecmp(argv[4], "exponential") == 0)))
-           {
-               if (*argv[5] == ':')
-               {
-                   if ((var = getVariable(st, argv[5] + 1)) == NULL)
-                   {
-                       fprintf(stderr, "%s: invalid parameter: \"%s\"\n",
-                               argv[0], argv[5]);
-                       st->ecnt++;
-                       return true;
-                   }
-                   parameter = strtod(var, NULL);
-               }
-               else
-                   parameter = strtod(argv[5], NULL);
-
-               if (pg_strcasecmp(argv[4], "gaussian") == 0)
-               {
-                   if (parameter < MIN_GAUSSIAN_PARAM)
-                   {
-                       fprintf(stderr, "gaussian parameter must be at least %f (not \"%s\")\n", MIN_GAUSSIAN_PARAM, argv[5]);
-                       st->ecnt++;
-                       return true;
-                   }
-#ifdef DEBUG
-                   printf("min: " INT64_FORMAT " max: " INT64_FORMAT " random: " INT64_FORMAT "\n",
-                          min, max,
-                          getGaussianRand(thread, min, max, parameter));
-#endif
-                   snprintf(res, sizeof(res), INT64_FORMAT,
-                            getGaussianRand(thread, min, max, parameter));
-               }
-               else if (pg_strcasecmp(argv[4], "exponential") == 0)
-               {
-                   if (parameter <= 0.0)
-                   {
-                       fprintf(stderr,
-                               "exponential parameter must be greater than zero (not \"%s\")\n",
-                               argv[5]);
-                       st->ecnt++;
-                       return true;
-                   }
-#ifdef DEBUG
-                   printf("min: " INT64_FORMAT " max: " INT64_FORMAT " random: " INT64_FORMAT "\n",
-                          min, max,
-                          getExponentialRand(thread, min, max, parameter));
-#endif
-                   snprintf(res, sizeof(res), INT64_FORMAT,
-                            getExponentialRand(thread, min, max, parameter));
-               }
-           }
-           else    /* this means an error somewhere in the parsing phase... */
-           {
-               fprintf(stderr, "%s: invalid arguments for \\setrandom\n",
-                       argv[0]);
-               st->ecnt++;
-               return true;
-           }
-
-           if (!putVariable(st, argv[0], argv[1], res))
-           {
-               st->ecnt++;
-               return true;
-           }
-
-           st->listen = true;
-       }
-       else if (pg_strcasecmp(argv[0], "set") == 0)
+       if (pg_strcasecmp(argv[0], "set") == 0)
        {
            char        res[64];
            PgBenchExpr *expr = commands[st->state]->expr;
@@ -2880,43 +2739,7 @@ process_backslash_command(PsqlScanState sstate, const char *source)
                                                  start_offset,
                                                  end_offset);
 
-   if (pg_strcasecmp(my_command->argv[0], "setrandom") == 0)
-   {
-       /*--------
-        * parsing:
-        *   \setrandom variable min max [uniform]
-        *   \setrandom variable min max (gaussian|exponential) parameter
-        */
-
-       if (my_command->argc < 4)
-           syntax_error(source, lineno, my_command->line, my_command->argv[0],
-                        "missing arguments", NULL, -1);
-
-       if (my_command->argc == 4 ||    /* uniform without/with "uniform"
-                                        * keyword */
-           (my_command->argc == 5 &&
-            pg_strcasecmp(my_command->argv[4], "uniform") == 0))
-       {
-           /* nothing to do */
-       }
-       else if (               /* argc >= 5 */
-                (pg_strcasecmp(my_command->argv[4], "gaussian") == 0) ||
-                (pg_strcasecmp(my_command->argv[4], "exponential") == 0))
-       {
-           if (my_command->argc < 6)
-               syntax_error(source, lineno, my_command->line, my_command->argv[0],
-                            "missing parameter", NULL, -1);
-           else if (my_command->argc > 6)
-               syntax_error(source, lineno, my_command->line, my_command->argv[0],
-                            "too many arguments", NULL,
-                            offsets[6] - start_offset);
-       }
-       else    /* unrecognized distribution argument */
-           syntax_error(source, lineno, my_command->line, my_command->argv[0],
-                        "unexpected argument", my_command->argv[4],
-                        offsets[4] - start_offset);
-   }
-   else if (pg_strcasecmp(my_command->argv[0], "sleep") == 0)
+   if (pg_strcasecmp(my_command->argv[0], "sleep") == 0)
    {
        if (my_command->argc < 2)
            syntax_error(source, lineno, my_command->line, my_command->argv[0],