Hi, the buildfarm seems to be mostly happy so far, so I've taken a quick look at the remaining two parts. The patches still apply, but I'm getting plenty of failures in regression tests, due to 0.0 being replaced by -0.0.
This reminds me 74294c7301, except that these patches don't seem to remove any such checks by mistake. Instead it seems to be caused by simply switching to float8_ methods. The attached patch fixes the issue for me, although I'm not claiming it's the right way to fix it. Another thing I noticed is the last few lines from line_interpt_line are actually unreachable, because there's now 'else return false' branch. regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index e0a9a0fa4f..97b3349ff8 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -1251,6 +1251,14 @@ line_interpt_line(Point *result, LINE *l1, LINE *l2) float8_mi(float8_mul(l1->A, l2->B), float8_mul(l2->A, l1->B))); y = float8_div(-float8_pl(float8_mul(l1->A, x), l1->C), l1->B); + + /* on some platforms, the preceding expression tends to produce -0 */ + if (x == 0.0) + x = 0.0; + + /* on some platforms, the preceding expression tends to produce -0 */ + if (y == 0.0) + y = 0.0; } else if (!FPzero(l2->B)) { @@ -1262,6 +1270,14 @@ line_interpt_line(Point *result, LINE *l1, LINE *l2) float8_mi(float8_mul(l2->A, l1->B), float8_mul(l1->A, l2->B))); y = float8_div(-float8_pl(float8_mul(l2->A, x), l2->C), l2->B); + + /* on some platforms, the preceding expression tends to produce -0 */ + if (x == 0.0) + x = 0.0; + + /* on some platforms, the preceding expression tends to produce -0 */ + if (y == 0.0) + y = 0.0; } else return false; @@ -1798,6 +1814,12 @@ point_send(PG_FUNCTION_ARGS) static inline void point_construct(Point *result, float8 x, float8 y) { + if (x == 0.0) + x = 0.0; + + if (y == 0.0) + y = 0.0; + result->x = x; result->y = y; }