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.1512170939070.4487@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
List pgsql-hackers
Hello Michael,

Thanks for your remarks.

> +      double constants such as <literal>3.14156</>,
> You meant perhaps 3.14159 :)

Indeed!

> +       <entry><literal><function>max(<replaceable>i</>,
> <replaceable>...</>)</></></>
> +       <entry>integer</>
> Such function declarations are better with optional arguments listed
> within brackets.

Why not. I did it that way because this is the standard C syntax for 
varargs.

> +      <row>
> +       <entry><literal><function>double(<replaceable>i</>)</></></>
> +       <entry>double</>
> +       <entry>cast to double</>
> +       <entry><literal>double(5432)</></>
> +       <entry><literal>5432.0</></>
> +      </row>
> +      <row>
> +       <entry><literal><function>int(<replaceable>x</>)</></></>
> +       <entry>integer</>
> +       <entry>cast to int</>
> +       <entry><literal>int(5.4 + 3.8)</></>
> +       <entry><literal>9</></>
> +      </row>
> If there are cast functions, why doesn't this patch introduces the
> concept of the data type for a variable defined in a script?

Because this would be a pain and this is really useless as far as pgbench 
scripts are concerned, it really just needs integers.

> Both concepts are linked, and for now as I can see the allocation of a 
> \set variable is actually always an integer.

Yes.

> In consequence, sqrt behavior is a bit surprising, for example this script:
> \set aid sqrt(2.0)
> SELECT :aid;
> returns that:
> SELECT 1;
> Shouldn't a user expect 1.414 instead? Fabien, am I missing a trick?

There is no trick. There are only integer variables in pgbench, so 1.4 is 
rounded to 1 by the assignment.

> It seems to me that this patch would gain in clarity by focusing a bit
> more on the infrastructure first and remove a couple of things that
> are not that mandatory for now...

This is more or less what I did in the beginning, and then someone said 
"please show a complete infra with various examples to show that the infra 
is really extensible". Now you say the reverse. This is *tiring* and is 
not a good use of the little time I can give.

> So the following things are not necessary as of now:

> - cast functions from/to int/double, because a result variable of a
> \set does not include the idea that a result variable can be something
> else than an integer. At least no options is given to the user to be
> able to make a direct use of a double value.
> - functions that return a double number: sqrt, pi
> - min and max have value because they allow a user to specify the
> expression once as a variable instead of writing it perhaps multiple
> times in SQL, still is it enough to justify having them as a set of
> functions available by default? I am not really sure either.

AFAICR this is because I was *ASKED* to show an infra which would deal 
with various cases: varargs, double/int functions/operators, overloading, 
so I added some example in each category, hence the current list of 
functions in the patch.

> Really, I like this patch, and I think that it is great to be able to
> use a set of functions and methods within a pgbench script because
> this clearly can bring more clarity for a developer, still it seems
> that this patch is trying to do too many things at the same time:
> 1) Add infrastructure to support function calls and refactor the
> existing functions to use it. This is the FUNCTION stuff in the
> expression scanner.
> 2) Add the concept of double return type, this could be an extension
> of \set with a data type, or a new command like \setdouble. This
> should include as well the casting routines I guess. This is the
> DOUBLE stuff in the expression scanner.
> 3) Introduce new functions, as needed.

Yep. I started with (1), and was *ASKED* to do the others.

Adding double variables in pretty useless in my opinion, and potentially 
lead to issues in various places, so I'm not in a hurry to do that.

> 1) and 2) seem worthwhile to me. 3) may depend on the use cases we'd
> like to have.. sqrt has for example value if a variable can be set
> double as a double type.

Sure. This is just an example of a double function so that if someone 
wants to add another one they can just update where it make sense. Maybe 
log/exp would make more sense for pgbench.

> In conclusion, for this CF the patch doing the documentation fixes is
> "Ready for committer", the second patch introducing the function
> infrastructure should focus more on its core structure and should be
> marked as "Returned with feedback". Opinions are welcome.

My opinion is that to do and unddo work because of random thoughts on the 
list is tiring.

What I can do is:

(1) fix the doc and bugs if any, obviously.

(2a) remove double stuff, just keep integer functions.     I would rather keep min/max, though.

(2b) keep the patch with both int & double as is.

What I will *NOT* do is to add double variables without a convincing use 
case.

-- 
Fabien.



pgsql-hackers by date:

Previous
From: Ashutosh Bapat
Date:
Subject: Re: Getting sorted data from foreign server for merge join
Next
From: Thomas Munro
Date:
Subject: Re: Making tab-complete.c easier to maintain