aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-05-05 14:51:00 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-05-05 14:51:00 -0400
commit7a622b2731db5d0f6db8a3d0af88177f96d1cb2e (patch)
tree50391a3012587c3882cd87d5b7a3ab4738cb87a7
parentc311f7887376f7f3ce24c4c0dac4f9cb6ad3bee3 (diff)
downloadpostgresql-7a622b2731db5d0f6db8a3d0af88177f96d1cb2e.tar.gz
postgresql-7a622b2731db5d0f6db8a3d0af88177f96d1cb2e.zip
Rename pgbench min/max to least/greatest, and fix handling of double args.
These functions behave like the backend's least/greatest functions, not like min/max, so the originally-chosen names invite confusion. Per discussion, rename to least/greatest. I also took it upon myself to make them return double if any input is double. The previous behavior of silently coercing all inputs to int surely does not meet the principle of least astonishment. Copy-edit some of the other new functions' documentation, too.
-rw-r--r--doc/src/sgml/ref/pgbench.sgml25
-rw-r--r--src/bin/pgbench/exprparse.y8
-rw-r--r--src/bin/pgbench/pgbench.c64
-rw-r--r--src/bin/pgbench/pgbench.h4
4 files changed, 67 insertions, 34 deletions
diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml
index a6c69ff344d..e6c7c94fe25 100644
--- a/doc/src/sgml/ref/pgbench.sgml
+++ b/doc/src/sgml/ref/pgbench.sgml
@@ -935,14 +935,15 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
<row>
<entry><literal><function>abs(<replaceable>a</>)</></></>
<entry>same as <replaceable>a</></>
- <entry>integer or double absolute value</>
+ <entry>absolute value</>
<entry><literal>abs(-17)</></>
<entry><literal>17</></>
</row>
<row>
<entry><literal><function>debug(<replaceable>a</>)</></></>
<entry>same as <replaceable>a</> </>
- <entry>print to <systemitem>stderr</systemitem> the given argument</>
+ <entry>print <replaceable>a</> to <systemitem>stderr</systemitem>,
+ and return <replaceable>a</></>
<entry><literal>debug(5432.1)</></>
<entry><literal>5432.1</></>
</row>
@@ -961,23 +962,23 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
<entry><literal>9</></>
</row>
<row>
- <entry><literal><function>max(<replaceable>i</> [, <replaceable>...</> ] )</></></>
- <entry>integer</>
- <entry>maximum value</>
- <entry><literal>max(5, 4, 3, 2)</></>
+ <entry><literal><function>greatest(<replaceable>a</> [, <replaceable>...</> ] )</></></>
+ <entry>double if any <replaceable>a</> is double, else integer</>
+ <entry>largest value among arguments</>
+ <entry><literal>greatest(5, 4, 3, 2)</></>
<entry><literal>5</></>
</row>
<row>
- <entry><literal><function>min(<replaceable>i</> [, <replaceable>...</> ] )</></></>
- <entry>integer</>
- <entry>minimum value</>
- <entry><literal>min(5, 4, 3, 2)</></>
- <entry><literal>2</></>
+ <entry><literal><function>least(<replaceable>a</> [, <replaceable>...</> ] )</></></>
+ <entry>double if any <replaceable>a</> is double, else integer</>
+ <entry>smallest value among arguments</>
+ <entry><literal>least(5, 4, 3, 2.1)</></>
+ <entry><literal>2.1</></>
</row>
<row>
<entry><literal><function>pi()</></></>
<entry>double</>
- <entry>value of the PI constant</>
+ <entry>value of the constant PI</>
<entry><literal>pi()</></>
<entry><literal>3.14159265358979323846</></>
</row>
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
index 64c29dcfa7b..0cc665b75b4 100644
--- a/src/bin/pgbench/exprparse.y
+++ b/src/bin/pgbench/exprparse.y
@@ -131,7 +131,7 @@ make_op(yyscan_t yyscanner, const char *operator,
* List of available functions:
* - fname: function name
* - nargs: number of arguments
- * -1 is a special value for min & max meaning #args >= 1
+ * -1 is a special value for least & greatest meaning #args >= 1
* - tag: function identifier from PgBenchFunction enum
*/
static const struct
@@ -162,10 +162,10 @@ static const struct
"abs", 1, PGBENCH_ABS
},
{
- "min", -1, PGBENCH_MIN
+ "least", -1, PGBENCH_LEAST
},
{
- "max", -1, PGBENCH_MAX
+ "greatest", -1, PGBENCH_GREATEST
},
{
"debug", 1, PGBENCH_DEBUG
@@ -274,7 +274,7 @@ make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
expr_yyerror_more(yyscanner, "unexpected number of arguments",
PGBENCH_FUNCTIONS[fnumber].fname);
- /* check at least one arg for min & max */
+ /* check at least one arg for least & greatest */
if (PGBENCH_FUNCTIONS[fnumber].nargs == -1 &&
elist_length(args) == 0)
expr_yyerror_more(yyscanner, "at least one argument expected",
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 076fbd38afe..2a9063a3453 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -1298,31 +1298,63 @@ evalFunc(TState *thread, CState *st,
return true;
}
- /* variable number of int arguments */
- case PGBENCH_MIN:
- case PGBENCH_MAX:
+ /* variable number of arguments */
+ case PGBENCH_LEAST:
+ case PGBENCH_GREATEST:
{
- int64 extremum;
+ bool havedouble;
int i;
- Assert(nargs >= 1);
- if (!coerceToInt(&vargs[0], &extremum))
- return false;
+ Assert(nargs >= 1);
- for (i = 1; i < nargs; i++)
+ /* need double result if any input is double */
+ havedouble = false;
+ for (i = 0; i < nargs; i++)
{
- int64 ival;
+ if (vargs[i].type == PGBT_DOUBLE)
+ {
+ havedouble = true;
+ break;
+ }
+ }
+ if (havedouble)
+ {
+ double extremum;
- if (!coerceToInt(&vargs[i], &ival))
+ if (!coerceToDouble(&vargs[0], &extremum))
return false;
-
- if (func == PGBENCH_MIN)
- extremum = extremum < ival ? extremum : ival;
- else if (func == PGBENCH_MAX)
- extremum = extremum > ival ? extremum : ival;
+ for (i = 1; i < nargs; i++)
+ {
+ double dval;
+
+ if (!coerceToDouble(&vargs[i], &dval))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, dval);
+ else
+ extremum = Max(extremum, dval);
+ }
+ setDoubleValue(retval, extremum);
}
+ else
+ {
+ int64 extremum;
- setIntValue(retval, extremum);
+ if (!coerceToInt(&vargs[0], &extremum))
+ return false;
+ for (i = 1; i < nargs; i++)
+ {
+ int64 ival;
+
+ if (!coerceToInt(&vargs[i], &ival))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, ival);
+ else
+ extremum = Max(extremum, ival);
+ }
+ setIntValue(retval, extremum);
+ }
return true;
}
diff --git a/src/bin/pgbench/pgbench.h b/src/bin/pgbench/pgbench.h
index 7dcb67f5203..58baad8ee67 100644
--- a/src/bin/pgbench/pgbench.h
+++ b/src/bin/pgbench/pgbench.h
@@ -67,8 +67,8 @@ typedef enum PgBenchFunction
PGBENCH_MOD,
PGBENCH_DEBUG,
PGBENCH_ABS,
- PGBENCH_MIN,
- PGBENCH_MAX,
+ PGBENCH_LEAST,
+ PGBENCH_GREATEST,
PGBENCH_INT,
PGBENCH_DOUBLE,
PGBENCH_PI,