aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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,