Re: extend pgbench expressions with functions - Mailing list pgsql-hackers

From Fabien COELHO
Subject Re: extend pgbench expressions with functions
Date
Msg-id alpine.DEB.2.10.1601161619480.18181@sto
Whole thread Raw
In response to Re: extend pgbench expressions with functions  (Michael Paquier <michael.paquier@gmail.com>)
Responses Re: extend pgbench expressions with functions  (Michael Paquier <michael.paquier@gmail.com>)
Re: extend pgbench expressions with functions  (Robert Haas <robertmhaas@gmail.com>)
List pgsql-hackers
Hello Michaël,

> +       <entry>uniformly-distributed random integer in <literal>[lb,ub]</></>

> Nitpick: when defining an interval like that, you may want to add a
> space after the comma.

Why not.

> +      /* beware that the list is reverse in make_func */
> s/reverse/reversed/?

Indeed.

> +
> #ifdef DEBUG
> Some noise.

Ok.

> With this example:
> \set cid debug(sqrt(-1))
> I get that:
> debug(script=0,command=1): double nan
> An error would be more logical, no?

If "sqrt(-1)" as a double is Nan for the computer, I'm fine with that. It 
makes the code simpler to just let the math library do its stuff and not 
bother.

> You want to emulate with complex numbers instead?

Nope.

> The basic operator functions also do not check for integer overflows.

This is a feature. I think that they should not check for overflow, as in 
C, this is just int64_t arithmetic "as is".

Moreover, it would be a new feature to add such a check if desirable, so 
it would belong to another patch, it is not related to adding functions.
The addition already overflows in the current code.

Finally I can think of good reason to use overflows deliberately, so I 
think it would argue against such a change.

> Those three ones are just overflowing:
> \set cid debug(9223372036854775807 + 1)
> \set cid debug(-9223372036854775808 - 1)
> \set cid debug(9223372036854775807 * 9223372036854775807)
> debug(script=0,command=1): int -9223372036854775807
> debug(script=0,command=2): int 9223372036854775807
> debug(script=0,command=3): int 1

All these results are fine from my point of view.

> And this one generates a core dump:
> \set cid debug(-9223372036854775808 / -1)
> Floating point exception: 8 (core dumped)

This one is funny, but it is a fact of int64_t life: you cannot divide 
INT64_MIN by -1 because the result cannot be represented as an int64_t.
This is propably hardcoded in the processor. I do not think it is worth 
doing anything about it for pgbench.

> A more general comment: what about splitting all the execution
> functions into a separate file exprexec.c? evaluateExpr (renamed as
> execExpr) is the root function, but then we have a set of static
> sub-functions for each node, like execExprFunc, execExprVar,
> execExprConst, etc?

I do not see a strong case for renaming. The function part could be split 
because of the indentation, though.

> This way we would save a bit of tab-indentation, this patch making the 
> new code lines becoming larger than 80 characters because of all the 
> switch/case stuff that gets more complicated.

I agree that the code is pretty ugly, but this is partly due to postgres 
indentation rules for switch which are *NOT* reasonnable, IMO.

I put the function evaluation in a function in the attached version.

-- 
Fabien.

pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: WIP: Rework access method interface
Next
From: Steve Singer
Date:
Subject: Re: pglogical - logical replication contrib module