|
abs(a>)>>>
same as a>>
- integer or double absolute value>
+ absolute value>
abs(-17)>>
17>>
|
debug(a>)>>>
same as a> >
- print to stderr the given argument>
+ print a> to stderr,
+ and return a>>
debug(5432.1)>>
5432.1>>
9>>
|
- max(i> [, ...> ] )>>>
- integer>
- maximum value>
- max(5, 4, 3, 2)>>
+ greatest(a> [, ...> ] )>>>
+ double if any a> is double, else integer>
+ largest value among arguments>
+ greatest(5, 4, 3, 2)>>
5>>
|
- min(i> [, ...> ] )>>>
- integer>
- minimum value>
- min(5, 4, 3, 2)>>
- 2>>
+ least(a> [, ...> ] )>>>
+ double if any a> is double, else integer>
+ smallest value among arguments>
+ least(5, 4, 3, 2.1)>>
+ 2.1>>
|
pi()>>>
double>
- value of the PI constant>
+ value of the constant PI>
pi()>>
3.14159265358979323846>>
* 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
"abs", 1, PGBENCH_ABS
},
{
- "min", -1, PGBENCH_MIN
+ "least", -1, PGBENCH_LEAST
},
{
- "max", -1, PGBENCH_MAX
+ "greatest", -1, PGBENCH_GREATEST
},
{
"debug", 1, PGBENCH_DEBUG
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",
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;
}