From 19b8b9cd659363fcf32a5967546d5d7aa57fc57f Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Tue, 5 Sep 2017 20:37:59 +0000 Subject: [PATCH 1/2] Support PgSQL 10 on PostGIS 2.3 git-svn-id: http://svn.osgeo.org/postgis/branches/2.3@15630 b70326c6-7e19-0410-871a-916f4a2858ee --- configure.ac | 9 + libpgcommon/gserialized_gist.c | 4 + postgis/gserialized_estimate.c | 65 +- postgis/gserialized_gist_nd.c | 3 + raster/rt_pg/rtpostgis.sql.in | 2 +- raster/test/regress/rt_union.sql | 8 +- raster/test/regress/rt_union_expected | 3 - regress/regress_selectivity.sql | 2147 ++++++++++++++++++++++++++- topology/sql/topogeometry/totopogeom.sql.in | 31 +- topology/test/regress/copytopology.sql | 14 +- topology/test/regress/copytopology_expected | 14 +- 11 files changed, 2239 insertions(+), 61 deletions(-) diff --git a/configure.ac b/configure.ac index df6dd88ad..ebf8eb402 100644 --- a/configure.ac +++ b/configure.ac @@ -433,6 +433,15 @@ if test "x$LIBLWGEOM_ONLY" = "xno"; then PGSQL_MAJOR_VERSION=`echo $PGSQL_FULL_VERSION | sed 's/[[^0-9]]*\([[0-9]]*\).*/\1/'` PGSQL_MINOR_VERSION=`echo $PGSQL_FULL_VERSION | sed 's/[[^\.]]*\.\([[0-9]]*\).*/\1/'` PGSQL_MINOR_VERSION=`echo $PGSQL_MINOR_VERSION | sed 's/.*devel.*/0/'` + + if test $PGSQL_MAJOR_VERSION -gt 9; then + dnl ================================================================== + dnl Starting with PostgreSQL 10, major is the new minor + dnl This is to prevent things like 10.31 ranking higher than 11.0 + dnl=================================================================== + PGSQL_MINOR_VERSION=0 + fi + POSTGIS_PGSQL_VERSION="$PGSQL_MAJOR_VERSION$PGSQL_MINOR_VERSION" PGSQL_PKGLIBDIR=`$PG_CONFIG --pkglibdir` diff --git a/libpgcommon/gserialized_gist.c b/libpgcommon/gserialized_gist.c index d379fb26a..ec2585d6a 100644 --- a/libpgcommon/gserialized_gist.c +++ b/libpgcommon/gserialized_gist.c @@ -22,6 +22,10 @@ #include "lwgeom_pg.h" /* For debugging macros. */ #include "gserialized_gist.h" +#if POSTGIS_PGSQL_VERSION >= 100 +#include +#endif + #define FLAGS_NDIMS_GIDX(f) ( FLAGS_GET_GEODETIC(f) ? 3 : \ FLAGS_GET_M(f) ? 4 : \ FLAGS_GET_Z(f) ? 3 : 2 ) diff --git a/postgis/gserialized_estimate.c b/postgis/gserialized_estimate.c index 5f967059b..ea343495b 100644 --- a/postgis/gserialized_estimate.c +++ b/postgis/gserialized_estimate.c @@ -827,31 +827,52 @@ nd_increment(ND_IBOX *ibox, int ndims, int *counter) static ND_STATS* pg_nd_stats_from_tuple(HeapTuple stats_tuple, int mode) { - int stats_kind = STATISTIC_KIND_ND; - int rv, nvalues; + int stats_kind = STATISTIC_KIND_ND; + int rv; + ND_STATS *nd_stats; + + /* If we're in 2D mode, set the kind appropriately */ + if ( mode == 2 ) stats_kind = STATISTIC_KIND_2D; + + /* Then read the geom status histogram from that */ + +#if POSTGIS_PGSQL_VERSION < 100 float4 *floatptr; - ND_STATS *nd_stats; - - /* If we're in 2D mode, set the kind appropriately */ - if ( mode == 2 ) stats_kind = STATISTIC_KIND_2D; - - /* Then read the geom status histogram from that */ - rv = get_attstatsslot(stats_tuple, 0, 0, stats_kind, InvalidOid, - NULL, NULL, NULL, &floatptr, &nvalues); - if ( ! rv ) { - POSTGIS_DEBUGF(2, - "no slot of kind %d in stats tuple", stats_kind); - return NULL; - } + int nvalues; - /* Clone the stats here so we can release the attstatsslot immediately */ - nd_stats = palloc(sizeof(float) * nvalues); - memcpy(nd_stats, floatptr, sizeof(float) * nvalues); - - /* Clean up */ - free_attstatsslot(0, NULL, 0, floatptr, nvalues); + rv = get_attstatsslot(stats_tuple, 0, 0, stats_kind, InvalidOid, + NULL, NULL, NULL, &floatptr, &nvalues); + + if ( ! rv ) { + POSTGIS_DEBUGF(2, + "no slot of kind %d in stats tuple", stats_kind); + return NULL; + } + + /* Clone the stats here so we can release the attstatsslot immediately */ + nd_stats = palloc(sizeof(float) * nvalues); + memcpy(nd_stats, floatptr, sizeof(float) * nvalues); + + /* Clean up */ + free_attstatsslot(0, NULL, 0, floatptr, nvalues); +#else /* PostgreSQL 10 or higher */ + AttStatsSlot sslot; + rv = get_attstatsslot(&sslot, stats_tuple, stats_kind, InvalidOid, + ATTSTATSSLOT_NUMBERS); + if ( ! rv ) { + POSTGIS_DEBUGF(2, + "no slot of kind %d in stats tuple", stats_kind); + return NULL; + } + + /* Clone the stats here so we can release the attstatsslot immediately */ + nd_stats = palloc(sizeof(float4) * sslot.nnumbers); + memcpy(nd_stats, sslot.numbers, sizeof(float4) * sslot.nnumbers); + + free_attstatsslot(&sslot); +#endif - return nd_stats; + return nd_stats; } /** diff --git a/postgis/gserialized_gist_nd.c b/postgis/gserialized_gist_nd.c index 4fc5fa476..e8c16c5ad 100644 --- a/postgis/gserialized_gist_nd.c +++ b/postgis/gserialized_gist_nd.c @@ -52,6 +52,9 @@ #include +#if POSTGIS_PGSQL_VERSION >= 100 +#include +#endif /* Fall back to older finite() if necessary */ #ifndef HAVE_ISFINITE diff --git a/raster/rt_pg/rtpostgis.sql.in b/raster/rt_pg/rtpostgis.sql.in index 295892d22..9175705d2 100644 --- a/raster/rt_pg/rtpostgis.sql.in +++ b/raster/rt_pg/rtpostgis.sql.in @@ -7037,7 +7037,7 @@ CREATE OR REPLACE FUNCTION _raster_constraint_info_blocksize(rastschema name, ra SELECT CASE WHEN strpos(s.consrc, 'ANY (ARRAY[') > 0 THEN - split_part((regexp_matches(s.consrc, E'ARRAY\\[(.*?){1}\\]'))[1], ',', 1)::integer + split_part((substring(s.consrc FROM E'ARRAY\\[(.*?){1}\\]')), ',', 1)::integer ELSE regexp_replace( split_part(s.consrc, '= ', 2), diff --git a/raster/test/regress/rt_union.sql b/raster/test/regress/rt_union.sql index 8b47e877f..a64b23a1c 100644 --- a/raster/test/regress/rt_union.sql +++ b/raster/test/regress/rt_union.sql @@ -143,13 +143,13 @@ INSERT INTO raster_union_out SELECT uniontype, - x, - y, - val + (pp).x, + (pp).y, + (pp).val FROM ( SELECT uniontype, - (ST_PixelAsPoints(rast)).* + (ST_PixelAsPoints(rast)) AS pp FROM raster_union_out ) foo ORDER BY uniontype, y, x; diff --git a/raster/test/regress/rt_union_expected b/raster/test/regress/rt_union_expected index ac32ef69d..51cc3e3d2 100644 --- a/raster/test/regress/rt_union_expected +++ b/raster/test/regress/rt_union_expected @@ -53,9 +53,6 @@ SUM|3|2|2 SUM|2|3|2 SUM|3|3|2 NOTICE: No pixels found for band 1 -NOTICE: No pixels found for band 1 -NOTICE: No pixels found for band 1 -NOTICE: No pixels found for band 1 COUNT|1|1|1 COUNT|2|1|1 COUNT|3|1|1 diff --git a/regress/regress_selectivity.sql b/regress/regress_selectivity.sql index 82c5e70d8..ca7f2722d 100644 --- a/regress/regress_selectivity.sql +++ b/regress/regress_selectivity.sql @@ -1,3 +1,2140 @@ +-- Make example data + +CREATE TABLE regular_overdots_ab ( + a integer, + b integer +); + +COPY regular_overdots_ab (a, b) FROM stdin; +1 1 +1 1 +1 2 +1 1 +1 2 +1 3 +1 1 +1 2 +1 3 +1 4 +1 1 +1 2 +1 3 +1 4 +1 5 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 10 +1 1 +2 1 +1 1 +2 2 +1 1 +2 2 +1 3 +2 1 +1 2 +2 3 +1 1 +2 2 +1 3 +2 4 +1 1 +2 2 +1 3 +2 4 +1 5 +2 1 +1 2 +2 3 +1 4 +2 5 +1 1 +2 2 +1 3 +2 4 +1 5 +2 6 +1 1 +2 2 +1 3 +2 4 +1 5 +2 6 +1 7 +2 1 +1 2 +2 3 +1 4 +2 5 +1 6 +2 7 +1 1 +2 2 +1 3 +2 4 +1 5 +2 6 +1 7 +2 8 +1 1 +2 2 +1 3 +2 4 +1 5 +2 6 +1 7 +2 8 +1 9 +2 1 +1 2 +2 3 +1 4 +2 5 +1 6 +2 7 +1 8 +2 9 +1 1 +2 2 +1 3 +2 4 +1 5 +2 6 +1 7 +2 8 +1 9 +2 10 +1 1 +2 1 +3 1 +1 1 +2 2 +3 1 +1 2 +2 1 +3 2 +1 1 +2 2 +3 3 +1 1 +2 2 +3 3 +1 4 +2 1 +3 2 +1 3 +2 4 +3 1 +1 2 +2 3 +3 4 +1 1 +2 2 +3 3 +1 4 +2 5 +3 1 +1 2 +2 3 +3 4 +1 5 +2 1 +3 2 +1 3 +2 4 +3 5 +1 1 +2 2 +3 3 +1 4 +2 5 +3 6 +1 1 +2 2 +3 3 +1 4 +2 5 +3 6 +1 7 +2 1 +3 2 +1 3 +2 4 +3 5 +1 6 +2 7 +3 1 +1 2 +2 3 +3 4 +1 5 +2 6 +3 7 +1 1 +2 2 +3 3 +1 4 +2 5 +3 6 +1 7 +2 8 +3 1 +1 2 +2 3 +3 4 +1 5 +2 6 +3 7 +1 8 +2 1 +3 2 +1 3 +2 4 +3 5 +1 6 +2 7 +3 8 +1 1 +2 2 +3 3 +1 4 +2 5 +3 6 +1 7 +2 8 +3 9 +1 1 +2 2 +3 3 +1 4 +2 5 +3 6 +1 7 +2 8 +3 9 +1 10 +2 1 +3 2 +1 3 +2 4 +3 5 +1 6 +2 7 +3 8 +1 9 +2 10 +3 1 +1 2 +2 3 +3 4 +1 5 +2 6 +3 7 +1 8 +2 9 +3 10 +1 1 +2 1 +3 1 +4 1 +1 1 +2 2 +3 1 +4 2 +1 1 +2 2 +3 3 +4 1 +1 2 +2 3 +3 1 +4 2 +1 3 +2 1 +3 2 +4 3 +1 1 +2 2 +3 3 +4 4 +1 1 +2 2 +3 3 +4 4 +1 5 +2 1 +3 2 +4 3 +1 4 +2 5 +3 1 +4 2 +1 3 +2 4 +3 5 +4 1 +1 2 +2 3 +3 4 +4 5 +1 1 +2 2 +3 3 +4 4 +1 5 +2 6 +3 1 +4 2 +1 3 +2 4 +3 5 +4 6 +1 1 +2 2 +3 3 +4 4 +1 5 +2 6 +3 7 +4 1 +1 2 +2 3 +3 4 +4 5 +1 6 +2 7 +3 1 +4 2 +1 3 +2 4 +3 5 +4 6 +1 7 +2 1 +3 2 +4 3 +1 4 +2 5 +3 6 +4 7 +1 1 +2 2 +3 3 +4 4 +1 5 +2 6 +3 7 +4 8 +1 1 +2 2 +3 3 +4 4 +1 5 +2 6 +3 7 +4 8 +1 9 +2 1 +3 2 +4 3 +1 4 +2 5 +3 6 +4 7 +1 8 +2 9 +3 1 +4 2 +1 3 +2 4 +3 5 +4 6 +1 7 +2 8 +3 9 +4 1 +1 2 +2 3 +3 4 +4 5 +1 6 +2 7 +3 8 +4 9 +1 1 +2 2 +3 3 +4 4 +1 5 +2 6 +3 7 +4 8 +1 9 +2 10 +3 1 +4 2 +1 3 +2 4 +3 5 +4 6 +1 7 +2 8 +3 9 +4 10 +1 1 +2 1 +3 1 +4 1 +5 1 +1 1 +2 2 +3 1 +4 2 +5 1 +1 2 +2 1 +3 2 +4 1 +5 2 +1 1 +2 2 +3 3 +4 1 +5 2 +1 3 +2 1 +3 2 +4 3 +5 1 +1 2 +2 3 +3 1 +4 2 +5 3 +1 1 +2 2 +3 3 +4 4 +5 1 +1 2 +2 3 +3 4 +4 1 +5 2 +1 3 +2 4 +3 1 +4 2 +5 3 +1 4 +2 1 +3 2 +4 3 +5 4 +1 1 +2 2 +3 3 +4 4 +5 5 +1 1 +2 2 +3 3 +4 4 +5 5 +1 6 +2 1 +3 2 +4 3 +5 4 +1 5 +2 6 +3 1 +4 2 +5 3 +1 4 +2 5 +3 6 +4 1 +5 2 +1 3 +2 4 +3 5 +4 6 +5 1 +1 2 +2 3 +3 4 +4 5 +5 6 +1 1 +2 2 +3 3 +4 4 +5 5 +1 6 +2 7 +3 1 +4 2 +5 3 +1 4 +2 5 +3 6 +4 7 +5 1 +1 2 +2 3 +3 4 +4 5 +5 6 +1 7 +2 1 +3 2 +4 3 +5 4 +1 5 +2 6 +3 7 +4 1 +5 2 +1 3 +2 4 +3 5 +4 6 +5 7 +1 1 +2 2 +3 3 +4 4 +5 5 +1 6 +2 7 +3 8 +4 1 +5 2 +1 3 +2 4 +3 5 +4 6 +5 7 +1 8 +2 1 +3 2 +4 3 +5 4 +1 5 +2 6 +3 7 +4 8 +5 1 +1 2 +2 3 +3 4 +4 5 +5 6 +1 7 +2 8 +3 1 +4 2 +5 3 +1 4 +2 5 +3 6 +4 7 +5 8 +1 1 +2 2 +3 3 +4 4 +5 5 +1 6 +2 7 +3 8 +4 9 +5 1 +1 2 +2 3 +3 4 +4 5 +5 6 +1 7 +2 8 +3 9 +4 1 +5 2 +1 3 +2 4 +3 5 +4 6 +5 7 +1 8 +2 9 +3 1 +4 2 +5 3 +1 4 +2 5 +3 6 +4 7 +5 8 +1 9 +2 1 +3 2 +4 3 +5 4 +1 5 +2 6 +3 7 +4 8 +5 9 +1 1 +2 2 +3 3 +4 4 +5 5 +1 6 +2 7 +3 8 +4 9 +5 10 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +1 1 +2 2 +3 1 +4 2 +5 1 +6 2 +1 1 +2 2 +3 3 +4 1 +5 2 +6 3 +1 1 +2 2 +3 3 +4 4 +5 1 +6 2 +1 3 +2 4 +3 1 +4 2 +5 3 +6 4 +1 1 +2 2 +3 3 +4 4 +5 5 +6 1 +1 2 +2 3 +3 4 +4 5 +5 1 +6 2 +1 3 +2 4 +3 5 +4 1 +5 2 +6 3 +1 4 +2 5 +3 1 +4 2 +5 3 +6 4 +1 5 +2 1 +3 2 +4 3 +5 4 +6 5 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +1 7 +2 1 +3 2 +4 3 +5 4 +6 5 +1 6 +2 7 +3 1 +4 2 +5 3 +6 4 +1 5 +2 6 +3 7 +4 1 +5 2 +6 3 +1 4 +2 5 +3 6 +4 7 +5 1 +6 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +1 7 +2 8 +3 1 +4 2 +5 3 +6 4 +1 5 +2 6 +3 7 +4 8 +5 1 +6 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +1 7 +2 8 +3 9 +4 1 +5 2 +6 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +1 7 +2 8 +3 9 +4 10 +5 1 +6 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +1 9 +2 10 +3 1 +4 2 +5 3 +6 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 10 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +1 1 +2 2 +3 1 +4 2 +5 1 +6 2 +7 1 +1 2 +2 1 +3 2 +4 1 +5 2 +6 1 +7 2 +1 1 +2 2 +3 3 +4 1 +5 2 +6 3 +7 1 +1 2 +2 3 +3 1 +4 2 +5 3 +6 1 +7 2 +1 3 +2 1 +3 2 +4 3 +5 1 +6 2 +7 3 +1 1 +2 2 +3 3 +4 4 +5 1 +6 2 +7 3 +1 4 +2 1 +3 2 +4 3 +5 4 +6 1 +7 2 +1 3 +2 4 +3 1 +4 2 +5 3 +6 4 +7 1 +1 2 +2 3 +3 4 +4 1 +5 2 +6 3 +7 4 +1 1 +2 2 +3 3 +4 4 +5 5 +6 1 +7 2 +1 3 +2 4 +3 5 +4 1 +5 2 +6 3 +7 4 +1 5 +2 1 +3 2 +4 3 +5 4 +6 5 +7 1 +1 2 +2 3 +3 4 +4 5 +5 1 +6 2 +7 3 +1 4 +2 5 +3 1 +4 2 +5 3 +6 4 +7 5 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 1 +7 2 +1 3 +2 4 +3 5 +4 6 +5 1 +6 2 +7 3 +1 4 +2 5 +3 6 +4 1 +5 2 +6 3 +7 4 +1 5 +2 6 +3 1 +4 2 +5 3 +6 4 +7 5 +1 6 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +1 8 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +1 7 +2 8 +3 1 +4 2 +5 3 +6 4 +7 5 +1 6 +2 7 +3 8 +4 1 +5 2 +6 3 +7 4 +1 5 +2 6 +3 7 +4 8 +5 1 +6 2 +7 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 1 +7 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +1 8 +2 9 +3 1 +4 2 +5 3 +6 4 +7 5 +1 6 +2 7 +3 8 +4 9 +5 1 +6 2 +7 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +7 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +1 9 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +1 7 +2 8 +3 9 +4 1 +5 2 +6 3 +7 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 1 +7 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +1 8 +2 9 +3 10 +4 1 +5 2 +6 3 +7 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 10 +7 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +1 9 +2 10 +3 1 +4 2 +5 3 +6 4 +7 5 +1 6 +2 7 +3 8 +4 9 +5 10 +6 1 +7 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +1 10 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +1 7 +2 8 +3 9 +4 10 +5 1 +6 2 +7 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +7 10 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +1 1 +2 2 +3 1 +4 2 +5 1 +6 2 +7 1 +8 2 +1 1 +2 2 +3 3 +4 1 +5 2 +6 3 +7 1 +8 2 +1 3 +2 1 +3 2 +4 3 +5 1 +6 2 +7 3 +8 1 +1 2 +2 3 +3 1 +4 2 +5 3 +6 1 +7 2 +8 3 +1 1 +2 2 +3 3 +4 4 +5 1 +6 2 +7 3 +8 4 +1 1 +2 2 +3 3 +4 4 +5 5 +6 1 +7 2 +8 3 +1 4 +2 5 +3 1 +4 2 +5 3 +6 4 +7 5 +8 1 +1 2 +2 3 +3 4 +4 5 +5 1 +6 2 +7 3 +8 4 +1 5 +2 1 +3 2 +4 3 +5 4 +6 5 +7 1 +8 2 +1 3 +2 4 +3 5 +4 1 +5 2 +6 3 +7 4 +8 5 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 1 +8 2 +1 3 +2 4 +3 5 +4 6 +5 1 +6 2 +7 3 +8 4 +1 5 +2 6 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 1 +8 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 1 +7 2 +8 3 +1 4 +2 5 +3 6 +4 7 +5 1 +6 2 +7 3 +8 4 +1 5 +2 6 +3 7 +4 1 +5 2 +6 3 +7 4 +8 5 +1 6 +2 7 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +1 7 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +1 9 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +1 8 +2 9 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +1 7 +2 8 +3 9 +4 1 +5 2 +6 3 +7 4 +8 5 +1 6 +2 7 +3 8 +4 9 +5 1 +6 2 +7 3 +8 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 1 +7 2 +8 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +7 1 +8 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +8 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +8 9 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +1 9 +2 10 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +1 7 +2 8 +3 9 +4 10 +5 1 +6 2 +7 3 +8 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 10 +7 1 +8 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +8 10 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +1 1 +2 2 +3 1 +4 2 +5 1 +6 2 +7 1 +8 2 +9 1 +1 2 +2 1 +3 2 +4 1 +5 2 +6 1 +7 2 +8 1 +9 2 +1 1 +2 2 +3 3 +4 1 +5 2 +6 3 +7 1 +8 2 +9 3 +1 1 +2 2 +3 3 +4 4 +5 1 +6 2 +7 3 +8 4 +9 1 +1 2 +2 3 +3 4 +4 1 +5 2 +6 3 +7 4 +8 1 +9 2 +1 3 +2 4 +3 1 +4 2 +5 3 +6 4 +7 1 +8 2 +9 3 +1 4 +2 1 +3 2 +4 3 +5 4 +6 1 +7 2 +8 3 +9 4 +1 1 +2 2 +3 3 +4 4 +5 5 +6 1 +7 2 +8 3 +9 4 +1 5 +2 1 +3 2 +4 3 +5 4 +6 5 +7 1 +8 2 +9 3 +1 4 +2 5 +3 1 +4 2 +5 3 +6 4 +7 5 +8 1 +9 2 +1 3 +2 4 +3 5 +4 1 +5 2 +6 3 +7 4 +8 5 +9 1 +1 2 +2 3 +3 4 +4 5 +5 1 +6 2 +7 3 +8 4 +9 5 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 1 +8 2 +9 3 +1 4 +2 5 +3 6 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 1 +9 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 1 +7 2 +8 3 +9 4 +1 5 +2 6 +3 7 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +1 7 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +9 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 1 +8 2 +9 3 +1 4 +2 5 +3 6 +4 7 +5 1 +6 2 +7 3 +8 4 +9 5 +1 6 +2 7 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +8 1 +9 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 1 +8 2 +9 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 1 +7 2 +8 3 +9 4 +1 5 +2 6 +3 7 +4 8 +5 1 +6 2 +7 3 +8 4 +9 5 +1 6 +2 7 +3 8 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +1 7 +2 8 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +1 8 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +9 8 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +1 10 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +9 8 +1 9 +2 10 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +1 8 +2 9 +3 10 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +1 7 +2 8 +3 9 +4 10 +5 1 +6 2 +7 3 +8 4 +9 5 +1 6 +2 7 +3 8 +4 9 +5 10 +6 1 +7 2 +8 3 +9 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 10 +7 1 +8 2 +9 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +7 10 +8 1 +9 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +8 10 +9 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +8 9 +9 10 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +10 1 +1 1 +2 2 +3 1 +4 2 +5 1 +6 2 +7 1 +8 2 +9 1 +10 2 +1 1 +2 2 +3 3 +4 1 +5 2 +6 3 +7 1 +8 2 +9 3 +10 1 +1 2 +2 3 +3 1 +4 2 +5 3 +6 1 +7 2 +8 3 +9 1 +10 2 +1 3 +2 1 +3 2 +4 3 +5 1 +6 2 +7 3 +8 1 +9 2 +10 3 +1 1 +2 2 +3 3 +4 4 +5 1 +6 2 +7 3 +8 4 +9 1 +10 2 +1 3 +2 4 +3 1 +4 2 +5 3 +6 4 +7 1 +8 2 +9 3 +10 4 +1 1 +2 2 +3 3 +4 4 +5 5 +6 1 +7 2 +8 3 +9 4 +10 5 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 1 +8 2 +9 3 +10 4 +1 5 +2 6 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 1 +10 2 +1 3 +2 4 +3 5 +4 6 +5 1 +6 2 +7 3 +8 4 +9 5 +10 6 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 1 +9 2 +10 3 +1 4 +2 5 +3 6 +4 7 +5 1 +6 2 +7 3 +8 4 +9 5 +10 6 +1 7 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +9 1 +10 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 1 +7 2 +8 3 +9 4 +10 5 +1 6 +2 7 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +10 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 1 +8 2 +9 3 +10 4 +1 5 +2 6 +3 7 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +10 7 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 1 +10 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 1 +8 2 +9 3 +10 4 +1 5 +2 6 +3 7 +4 8 +5 1 +6 2 +7 3 +8 4 +9 5 +10 6 +1 7 +2 8 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +10 8 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 +8 9 +9 1 +10 2 +1 3 +2 4 +3 5 +4 6 +5 7 +6 8 +7 9 +8 1 +9 2 +10 3 +1 4 +2 5 +3 6 +4 7 +5 8 +6 9 +7 1 +8 2 +9 3 +10 4 +1 5 +2 6 +3 7 +4 8 +5 9 +6 1 +7 2 +8 3 +9 4 +10 5 +1 6 +2 7 +3 8 +4 9 +5 1 +6 2 +7 3 +8 4 +9 5 +10 6 +1 7 +2 8 +3 9 +4 1 +5 2 +6 3 +7 4 +8 5 +9 6 +10 7 +1 8 +2 9 +3 1 +4 2 +5 3 +6 4 +7 5 +8 6 +9 7 +10 8 +1 9 +2 1 +3 2 +4 3 +5 4 +6 5 +7 6 +8 7 +9 8 +10 9 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +\. + -- Check for error messages create table no_stats ( g geometry, id integer ); @@ -8,15 +2145,12 @@ select _postgis_join_selectivity('no_stats', 'g', 'no_stats_join', 'g'); insert into no_stats (g, id) values ('POINT(0 0)', 0); analyze no_stats; select _postgis_join_selectivity('no_stats', 'g', 'no_stats_join', 'g'); -drop table no_stats; -drop table no_stats_join; +drop table if exists no_stats; +drop table if exists no_stats_join; -- Table with uniformly variable density, highest at 1,1, lowest at 10,10 create table regular_overdots as -with -ij as ( select i, j from generate_series(1, 10) i, generate_series(1, 10) j), -iijj as (select generate_series(1, i) as a, generate_series(1, j) b from ij) -select st_makepoint(a, b) as g from iijj; + select st_makepoint(a, b) as g from regular_overdots_ab; -- Generate the stats analyze regular_overdots; @@ -49,4 +2183,5 @@ select 'selectivity_09', 'estimated', _postgis_selectivity('regular_overdots','g -- Clean drop table if exists regular_overdots; +drop table if exists regular_overdots_ab; diff --git a/topology/sql/topogeometry/totopogeom.sql.in b/topology/sql/topogeometry/totopogeom.sql.in index 79520c64e..6d3192de0 100644 --- a/topology/sql/topogeometry/totopogeom.sql.in +++ b/topology/sql/topogeometry/totopogeom.sql.in @@ -139,6 +139,7 @@ DECLARE tolerance FLOAT8; alayer INT; atopology TEXT; + var_dims integer; BEGIN #ifdef POSTGIS_TOPOLOGY_DEBUG @@ -230,23 +231,31 @@ BEGIN 'Unexpected feature dimension %', ST_Dimension(ageom); END IF; + -- Now that we have an empty topogeometry, we loop over distinct components -- and add them to the definition of it. We add them as soon -- as possible so that each element can further edit the -- definition by splitting FOR rec IN SELECT id(tg), alayer as lyr, - geom, ST_Dimension(geom) as dims - FROM (SELECT (ST_Dump(ageom)).geom) as f - WHERE NOT ST_IsEmpty(geom) + geom, ST_Dimension(gd.geom) as dims + FROM ST_Dump(ageom) AS gd + WHERE NOT ST_IsEmpty(gd.geom) LOOP - FOR rec2 IN SELECT CASE - WHEN rec.dims = 0 THEN - topology.topogeo_addPoint(atopology, rec.geom, tolerance) - WHEN rec.dims = 1 THEN - topology.topogeo_addLineString(atopology, rec.geom, tolerance) - WHEN rec.dims = 2 THEN - topology.topogeo_addPolygon(atopology, rec.geom, tolerance) - END as primitive + -- NOTE: Switched from using case to this because of PG 10 behavior change + -- Using a UNION ALL only one will be processed because of the WHERE + -- Since the WHERE clause will be processed first + FOR rec2 IN SELECT primitive + FROM + ( + SELECT topology.topogeo_addPoint(atopology, rec.geom, tolerance) + WHERE rec.dims = 0 + UNION ALL + SELECT topology.topogeo_addLineString(atopology, rec.geom, tolerance) + WHERE rec.dims = 1 + UNION ALL + SELECT topology.topogeo_addPolygon(atopology, rec.geom, tolerance) + WHERE rec.dims = 2 + ) AS f(primitive) LOOP elem := ARRAY[rec.dims+1, rec2.primitive]::text; IF elems @> ARRAY[elem] THEN diff --git a/topology/test/regress/copytopology.sql b/topology/test/regress/copytopology.sql index 414e01993..182ff493c 100644 --- a/topology/test/regress/copytopology.sql +++ b/topology/test/regress/copytopology.sql @@ -39,13 +39,13 @@ WHERE l.topology_id = t.id and t.name = 'CITY_data_UP_down' ORDER BY l.layer_id; -- Check sequences -SELECT * from "CITY_data_UP_down".node_node_id_seq; -SELECT * from "CITY_data_UP_down".edge_data_edge_id_seq; -SELECT * from "CITY_data_UP_down".face_face_id_seq; -SELECT sequence_name, last_value, start_value, increment_by, max_value, min_value, cache_value, is_cycled, is_called from "CITY_data_UP_down".layer_id_seq; -SELECT * from "CITY_data_UP_down".topogeo_s_1; -SELECT * from "CITY_data_UP_down".topogeo_s_2; -SELECT * from "CITY_data_UP_down".topogeo_s_3; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".node_node_id_seq; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".edge_data_edge_id_seq; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".face_face_id_seq; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".layer_id_seq; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".topogeo_s_1; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".topogeo_s_2; +SELECT tableoid::regclass AS sequence_name, last_value, is_called from "CITY_data_UP_down".topogeo_s_3; SELECT topology.DropTopology('CITY_data_UP_down'); SELECT topology.DropTopology('city_data'); diff --git a/topology/test/regress/copytopology_expected b/topology/test/regress/copytopology_expected index 95083dbbf..ffdb1316b 100644 --- a/topology/test/regress/copytopology_expected +++ b/topology/test/regress/copytopology_expected @@ -19,13 +19,13 @@ layers|3 1|CITY_data_UP_down|LAYER1| 2|CITY_data_UP_down|LAYER2| 3|CITY_data_UP_down|LAYER3| -node_node_id_seq|22|1|1|9223372036854775807|1|1|0|f|t -edge_data_edge_id_seq|26|1|1|9223372036854775807|1|1|0|f|t -face_face_id_seq|9|1|1|9223372036854775807|1|1|0|f|t -layer_id_seq|1|1|1|9223372036854775807|1|1|f|f -topogeo_s_1|9|1|1|9223372036854775807|1|1|0|f|t -topogeo_s_2|8|1|1|9223372036854775807|1|1|0|f|t -topogeo_s_3|8|1|1|9223372036854775807|1|1|0|f|t +"CITY_data_UP_down".node_node_id_seq|22|t +"CITY_data_UP_down".edge_data_edge_id_seq|26|t +"CITY_data_UP_down".face_face_id_seq|9|t +"CITY_data_UP_down".layer_id_seq|1|f +"CITY_data_UP_down".topogeo_s_1|9|t +"CITY_data_UP_down".topogeo_s_2|8|t +"CITY_data_UP_down".topogeo_s_3|8|t Topology 'CITY_data_UP_down' dropped Topology 'city_data' dropped #2184.1|t -- 2.13.6