Re: [PATCH] Improve geometric types

Emre Hasegeli <emre@hasegeli.com>

From: Emre Hasegeli <emre@hasegeli.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>, Robert Haas <robertmhaas@gmail.com>, Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>, Aleksander Alekseev <a.alekseev@postgrespro.ru>, "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2017-11-05T14:54:19Z
Lists: pgsql-hackers

Attachments

> I am not sure how useful NaNs are in geometric types context, but we
> allow them, so inconsistent hypot() would be a problem.  I will change
> my patches to keep pg_hypot().

New versions of the patches are attached with 2 additional ones.  The
new versions leave pg_hypot() in place.  One of the new patches
improves the test coverage.  The line coverage of geo_ops.c increases
from 55% to 81%.  The other one fixes -0 values to 0 on float
operators.  I am not sure about performance implication of this, so
kept it separate.  It may be a better idea to check this only on the
platforms that has tendency to produce -0.

While working on the tests, I found some unreachable code and removed
it.  I also found that lseg ## lseg operator returning wrong results.
It is defined as "closest point to first segment on the second
segment", but:

> # select '[(1,2),(3,4)]'::lseg ## '[(0,0),(6,6)]'::lseg;
>  ?column?
> ----------
>  (1,2)
> (1 row)

I appended the fix to the patches.  This is also effecting lseg ## box operator.

I also changed recently band-aided point ## lseg operator to return
the point instead of NULL when it cannot find the correct result to
avoid the operators depending on this one to crash.

Commits

  1. Improve test coverage of geometric types

  2. Fix problems in handling the line data type

  3. Use the built-in float datatypes to implement geometric types

  4. Remove remaining GEODEBUG references from geo_ops.c

  5. Provide separate header file for built-in float types

  6. Refactor geometric functions and operators

  7. Fix crash in close_ps() for NaN input coordinates.

  8. Fix GiST index build for NaN values in geometric types.

  9. Enable building with Visual Studion 2013.

  10. Suppress -0 in the C field of lines computed by line_construct_pts().