Skip to content

Commit

Permalink
Use standard librart sqrt function in pg_stat_statements
Browse files Browse the repository at this point in the history
The stddev calculation included a faster but unportable sqrt function.
This is not worth the extra effort, and won't work everywhere. If the
standard library function is good enough for the SQL function it
should be good enough here too.
  • Loading branch information
adunstan committed Mar 28, 2015
1 parent 3a20b0e commit cfe1276
Showing 1 changed file with 2 additions and 19 deletions.
21 changes: 2 additions & 19 deletions contrib/pg_stat_statements/pg_stat_statements.c
Expand Up @@ -57,6 +57,7 @@
*/
#include "postgres.h"

#include <math.h>
#include <sys/stat.h>
#include <unistd.h>

Expand Down Expand Up @@ -326,7 +327,6 @@ static char *generate_normalized_query(pgssJumbleState *jstate, const char *quer
int *query_len_p, int encoding);
static void fill_in_constant_lengths(pgssJumbleState *jstate, const char *query);
static int comp_location(const void *a, const void *b);
static inline double sqrtd(const double x);


/*
Expand Down Expand Up @@ -1583,7 +1583,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo,
*/
if (tmp.calls > 1)
values[i++] =
Float8GetDatum(sqrtd(tmp.sum_var_time / tmp.calls));
Float8GetDatum(sqrt(tmp.sum_var_time / tmp.calls));
else
values[i++] = Float8GetDatum(0.0);
}
Expand Down Expand Up @@ -2968,20 +2968,3 @@ comp_location(const void *a, const void *b)
else
return 0;
}

/*
* fast sqrt algorithm: reference from Fast inverse square root algorithms.
*/
static inline double
sqrtd(const double x)
{
double x_half = 0.5 * x;
long long int tmp = 0x5FE6EB50C7B537AAl - ( *(long long int*)&x >> 1);
double x_result = * (double*)&tmp;

x_result *= (1.5 - (x_half * x_result * x_result));
/* If retry this calculation, it becomes higher precision at sqrt */
x_result *= (1.5 - (x_half * x_result * x_result));

return x_result * x;
}

0 comments on commit cfe1276

Please sign in to comment.