[SCM] PostGIS branch stable-3.4 updated. 3.4.4-2-ga02435c79

git at osgeo.org git at osgeo.org
Fri Jan 17 20:19:51 PST 2025


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, stable-3.4 has been updated
       via  a02435c7900f515956c51ae4f6b2860f998c668a (commit)
      from  d24398171b12d75344dd7d5fb3e46912aa4696d4 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a02435c7900f515956c51ae4f6b2860f998c668a
Author: Regina Obe <lr at pcorp.us>
Date:   Mon Jan 13 10:34:47 2025 -0500

    BRIN Merge Support
    
      - Add merge AM support function (11) for all BRIN operator class
        families. Supports parallel BRIN build on PG17+
        and in general should fix some longstanding low-probability crash
        cases related to BRIN.
    
     - Add upgrade logic to shimmy in the brin_inclusion_merge functions
     - Add crash tests
    
    Closes #5564 for PostGIS 3.4.5

diff --git a/NEWS b/NEWS
index 0b22aa5e3..c20a1d818 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ Proj 6.1+ required.
 
 * Bug Fixes *
 
+  - #5564, BRIN crash fix and support for parallel in PG17+
+          (Paul Ramsey, Regina Obe)
+
 
 PostGIS 3.4.4
 2024/12/22
diff --git a/postgis/brin_2d.c b/postgis/brin_2d.c
index 6b584fdc5..1399fc097 100644
--- a/postgis/brin_2d.c
+++ b/postgis/brin_2d.c
@@ -89,3 +89,30 @@ geom2d_brin_inclusion_add_value(PG_FUNCTION_ARGS)
 
 	PG_RETURN_BOOL(true);
 }
+
+
+PG_FUNCTION_INFO_V1(geom2d_brin_inclusion_merge);
+Datum
+geom2d_brin_inclusion_merge(PG_FUNCTION_ARGS)
+{
+	BOX2DF *box_key = (BOX2DF *) PG_GETARG_POINTER(0);
+	BOX2DF *box_geom = (BOX2DF *) PG_GETARG_POINTER(1);
+
+	/*
+	 * Check if the stored bounding box already contains the geometry's one.
+	 *
+	 * If not, enlarge the stored box2df to make it contains the current
+	 * geometry.
+	 */
+	if (!box2df_contains(box_key, box_geom))
+	{
+	    box_key->xmin = Min(box_key->xmin, box_geom->xmin);
+	    box_key->xmax = Max(box_key->xmax, box_geom->xmax);
+	    box_key->ymin = Min(box_key->ymin, box_geom->ymin);
+	    box_key->ymax = Max(box_key->ymax, box_geom->ymax);
+	}
+
+	PG_RETURN_POINTER(box_key);
+}
+
+
diff --git a/postgis/brin_nd.c b/postgis/brin_nd.c
index 1e0c93368..246be78de 100644
--- a/postgis/brin_nd.c
+++ b/postgis/brin_nd.c
@@ -11,8 +11,12 @@
  * FunctionCallInvoke machinery for each heap tuple.
  */
 
-Datum gidx_brin_inclusion_add_value(BrinDesc *bdesc, BrinValues *column, Datum
-		newval, bool isnull, int max_dims);
+static Datum gidx_brin_inclusion_add_value(
+	BrinDesc *bdesc, BrinValues *column,
+	Datum newval, bool isnull, int max_dims);
+
+static GIDX * gidx_brin_inclusion_merge(
+	GIDX *gidx_key, GIDX *gidx_geom);
 
 /*
  * As for the GiST case, geographies are converted into GIDX before
@@ -58,7 +62,7 @@ geom4d_brin_inclusion_add_value(PG_FUNCTION_ARGS)
 					4));
 }
 
-Datum
+static Datum
 gidx_brin_inclusion_add_value(__attribute__((__unused__)) BrinDesc *bdesc,
 		BrinValues *column, Datum newval, bool isnull, int max_dims)
 {
@@ -186,3 +190,52 @@ gidx_brin_inclusion_add_value(__attribute__((__unused__)) BrinDesc *bdesc,
 
 	PG_RETURN_BOOL(true);
 }
+
+
+static GIDX *
+gidx_brin_inclusion_merge(GIDX *gidx_key, GIDX *gidx_geom)
+{
+	if (!gidx_contains(gidx_key, gidx_geom))
+	{
+		for (uint32_t i = 0; i < GIDX_NDIMS(gidx_key); i++)
+		{
+			/* Adjust minimums */
+			GIDX_SET_MIN(gidx_key, i,
+					Min(GIDX_GET_MIN(gidx_key,i),GIDX_GET_MIN(gidx_geom,i)));
+			/* Adjust maximums */
+			GIDX_SET_MAX(gidx_key, i,
+					Max(GIDX_GET_MAX(gidx_key,i),GIDX_GET_MAX(gidx_geom,i)));
+		}
+	}
+
+	return gidx_key;
+}
+
+PG_FUNCTION_INFO_V1(geog_brin_inclusion_merge);
+Datum geog_brin_inclusion_merge(PG_FUNCTION_ARGS)
+{
+	GIDX *key = (GIDX *) PG_GETARG_POINTER(0);
+	GIDX *geom = (GIDX *) PG_GETARG_POINTER(1);
+
+	PG_RETURN_POINTER(gidx_brin_inclusion_merge(key, geom));
+}
+
+PG_FUNCTION_INFO_V1(geom3d_brin_inclusion_merge);
+Datum geom3d_brin_inclusion_merge(PG_FUNCTION_ARGS)
+{
+	GIDX *key = (GIDX *) PG_GETARG_POINTER(0);
+	GIDX *geom = (GIDX *) PG_GETARG_POINTER(1);
+
+	PG_RETURN_POINTER(gidx_brin_inclusion_merge(key, geom));
+}
+
+PG_FUNCTION_INFO_V1(geom4d_brin_inclusion_merge);
+Datum geom4d_brin_inclusion_merge(PG_FUNCTION_ARGS)
+{
+	GIDX *key = (GIDX *) PG_GETARG_POINTER(0);
+	GIDX *geom = (GIDX *) PG_GETARG_POINTER(1);
+
+	PG_RETURN_POINTER(gidx_brin_inclusion_merge(key, geom));
+}
+
+
diff --git a/postgis/geography_brin.sql.in b/postgis/geography_brin.sql.in
index 928a85547..694e0aa92 100644
--- a/postgis/geography_brin.sql.in
+++ b/postgis/geography_brin.sql.in
@@ -54,9 +54,16 @@ CREATE OPERATOR && (
 --------------------------------
 
 -- Availability: 2.3.0
-CREATE OR REPLACE FUNCTION geog_brin_inclusion_add_value(internal, internal, internal, internal) RETURNS boolean
+CREATE OR REPLACE FUNCTION geog_brin_inclusion_add_value(internal, internal, internal, internal)
+RETURNS boolean
         AS 'MODULE_PATHNAME','geog_brin_inclusion_add_value'
-        LANGUAGE 'c';
+        LANGUAGE 'c' PARALLEL SAFE;
+
+-- Availability: 3.6.0
+CREATE OR REPLACE FUNCTION geog_brin_inclusion_merge(internal, internal)
+RETURNS internal
+        AS 'MODULE_PATHNAME','geog_brin_inclusion_merge'
+        LANGUAGE 'c' PARALLEL SAFE;
 
 -- Availability: 2.3.0
 CREATE OPERATOR CLASS brin_geography_inclusion_ops
@@ -66,6 +73,7 @@ CREATE OPERATOR CLASS brin_geography_inclusion_ops
     FUNCTION      2        geog_brin_inclusion_add_value(internal, internal, internal, internal),
     FUNCTION      3        brin_inclusion_consistent(internal, internal, internal),
     FUNCTION      4        brin_inclusion_union(internal, internal, internal),
+    FUNCTION      11       geog_brin_inclusion_merge(internal, internal),
     OPERATOR      3        &&(geography, geography),
     OPERATOR      3        &&(geography, gidx),
     OPERATOR      3        &&(gidx, geography),
diff --git a/postgis/postgis_after_upgrade.sql b/postgis/postgis_after_upgrade.sql
index 7469567eb..3db8446e9 100644
--- a/postgis/postgis_after_upgrade.sql
+++ b/postgis/postgis_after_upgrade.sql
@@ -258,3 +258,232 @@ IF _postgis_scripts_pgsql_version()::integer >= 96 THEN
 END IF;
 END;
 $$;
+
+-- #5564 fix up the brin op classes for upgrades
+DO language plpgsql
+$$
+BEGIN
+    -- Check if the function is already associated with any operator class
+    IF NOT EXISTS (
+        SELECT 1 FROM pg_catalog.pg_amproc
+        WHERE amproc::text = 'geom2d_brin_inclusion_merge' AND
+              amprocfamily IN (
+                  SELECT oid FROM pg_catalog.pg_opfamily
+                  WHERE opfname = 'brin_geometry_inclusion_ops_2d'
+              )
+    ) THEN
+        BEGIN
+            -- Create a temporary operator class for 'brin_geometry_inclusion_ops_2d_temp'
+            CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d_temp
+                FOR TYPE geometry USING brin AS
+                    FUNCTION 11 geom2d_brin_inclusion_merge(internal, internal);
+
+            -- find current and new operator family OIDs
+            WITH a AS (
+                SELECT n.oid AS oid_nfamily, o.oid AS oid_ofamily
+                FROM pg_catalog.pg_opfamily AS n
+                CROSS JOIN (
+                    SELECT oid
+                    FROM pg_catalog.pg_opfamily
+                    WHERE opfname = 'brin_geometry_inclusion_ops_2d_temp'
+                ) AS o
+                WHERE n.opfname = 'brin_geometry_inclusion_ops_2d'
+            ),
+            -- Update the amprocfamily in pg_amproc
+            amupdate AS (
+                UPDATE pg_catalog.pg_amproc AS amp
+                SET amprocfamily = a.oid_nfamily
+                FROM a
+                WHERE amp.amprocfamily = a.oid_ofamily AND
+                      amp.amproc::text = 'geom2d_brin_inclusion_merge'
+                RETURNING amp.*
+            )
+            -- Update dependencies in pg_depend to the existing operator class
+            UPDATE pg_depend AS d
+            SET refobjid = (
+                SELECT n.oid
+                FROM pg_catalog.pg_opclass AS n
+                WHERE opcname = 'brin_geometry_inclusion_ops_2d'
+            )
+            FROM amupdate
+            WHERE d.objid = amupdate.oid AND
+                  refobjid = (
+                      SELECT o.oid
+                      FROM pg_catalog.pg_opclass AS o
+                      WHERE opcname = 'brin_geometry_inclusion_ops_2d_temp'
+                  );
+
+            -- Drop the temporary operator family after use
+            DROP OPERATOR FAMILY brin_geometry_inclusion_ops_2d_temp USING brin;
+        EXCEPTION WHEN OTHERS THEN
+            RAISE EXCEPTION
+                'Could not add geom2d_brin_inclusion_merge to brin_geometry_inclusion_ops_2d class: %',
+                SQLERRM;
+        END;
+    END IF;
+
+    -- Check if the function is already associated with any operator class
+    IF NOT EXISTS (
+        SELECT 1
+        FROM pg_catalog.pg_amproc
+        WHERE amproc::text = 'geom3d_brin_inclusion_merge'
+    ) THEN
+        BEGIN
+            -- Create a temporary operator class with the new function
+            CREATE OPERATOR CLASS brin_geometry_inclusion_ops_3d_temp
+            FOR TYPE geometry USING brin AS
+                FUNCTION 11 geom3d_brin_inclusion_merge(internal, internal);
+
+            -- Change the pg_amproc association to the existing opclass
+             WITH a AS (
+                SELECT n.oid AS oid_nfamily, o.oid AS oid_ofamily
+                FROM pg_catalog.pg_opfamily AS n
+                CROSS JOIN (
+                    SELECT oid FROM pg_catalog.pg_opfamily
+                    WHERE opfname = 'brin_geometry_inclusion_ops_3d_temp'
+                ) AS o
+                WHERE n.opfname = 'brin_geometry_inclusion_ops_3d'
+            ), amupdate AS (
+                UPDATE pg_catalog.pg_amproc AS amp
+                SET amprocfamily = a.oid_nfamily
+                FROM a
+                WHERE
+                    amp.amprocfamily = a.oid_ofamily
+                    AND amp.amproc::text = 'geom3d_brin_inclusion_merge'
+                RETURNING amp.*
+            )
+            -- Change the opclass dependency to the existing one
+            UPDATE pg_depend AS d
+            SET refobjid = (
+                SELECT n.oid
+                FROM pg_catalog.pg_opclass AS n
+                WHERE opcname = 'brin_geometry_inclusion_ops_3d'
+            )
+            FROM amupdate
+            WHERE d.objid = amupdate.oid AND
+                  refobjid = (
+                    SELECT o.oid
+                    FROM pg_catalog.pg_opclass AS o
+                    WHERE opcname = 'brin_geometry_inclusion_ops_3d_temp'
+                );
+
+            -- Dropping the autogenerated temporary family which cascades to temporary class
+            DROP OPERATOR FAMILY brin_geometry_inclusion_ops_3d_temp USING brin;
+        EXCEPTION WHEN OTHERS THEN
+            RAISE EXCEPTION 'Could not add geom3d_brin_inclusion_merge to brin_geometry_inclusion_ops_3d class: %', SQLERRM;
+        END;
+    END IF;
+
+    -- Check if the function is already associated with any operator class
+    IF NOT EXISTS (
+        SELECT 1
+        FROM pg_catalog.pg_amproc
+        WHERE amproc::text = 'geom4d_brin_inclusion_merge'
+    ) THEN
+        BEGIN
+            -- Create a temporary operator class with the new function
+            CREATE OPERATOR CLASS brin_geometry_inclusion_ops_4d_temp
+            FOR TYPE geometry USING brin AS
+                FUNCTION 11 geom4d_brin_inclusion_merge(internal, internal);
+
+            -- Change the pg_amproc association to the existing opclass
+             WITH a AS (
+                SELECT n.oid AS oid_nfamily, o.oid AS oid_ofamily
+                FROM pg_catalog.pg_opfamily AS n
+                CROSS JOIN (
+                    SELECT oid FROM pg_catalog.pg_opfamily
+                    WHERE opfname = 'brin_geometry_inclusion_ops_4d_temp'
+                ) AS o
+                WHERE n.opfname = 'brin_geometry_inclusion_ops_4d'
+            ) , amupdate AS (
+                UPDATE pg_catalog.pg_amproc AS amp
+                SET amprocfamily = a.oid_nfamily
+                FROM a
+                WHERE
+                    amp.amprocfamily = a.oid_ofamily
+                    AND amp.amproc::text = 'geom4d_brin_inclusion_merge'
+                RETURNING amp.*
+            )
+            -- Change the opclass dependency to the existing one
+            UPDATE pg_depend AS d
+            SET refobjid = (
+                SELECT n.oid
+                FROM pg_catalog.pg_opclass AS n
+                WHERE opcname = 'brin_geometry_inclusion_ops_4d'
+            )
+            FROM amupdate
+            WHERE d.objid = amupdate.oid AND
+                  refobjid = (
+                    SELECT o.oid
+                    FROM pg_catalog.pg_opclass AS o
+                    WHERE opcname = 'brin_geometry_inclusion_ops_4d_temp'
+                );
+
+            -- Dropping the autogenerated temporary family also drops the temporary class
+            DROP OPERATOR FAMILY brin_geometry_inclusion_ops_4d_temp USING brin;
+        EXCEPTION WHEN OTHERS THEN
+            RAISE EXCEPTION
+                'Could not add geom4d_brin_inclusion_merge to brin_geometry_inclusion_ops_4d class: %',
+                SQLERRM;
+        END;
+    END IF;
+
+-- geography brin
+    -- Check if the function 'geog_brin_inclusion_merge' already exists
+    IF NOT EXISTS (
+        SELECT 1
+        FROM pg_catalog.pg_amproc
+        WHERE amproc::text = 'geog_brin_inclusion_merge'
+    ) THEN
+        BEGIN
+            -- Create a temporary operator class for 'brin_geography_inclusion_ops_temp'
+            CREATE OPERATOR CLASS brin_geography_inclusion_ops_temp
+                FOR TYPE geography USING brin AS
+                    FUNCTION 11 geog_brin_inclusion_merge(internal, internal);
+
+            -- find current and new operator family OIDs
+            WITH a AS (
+                SELECT n.oid AS oid_nfamily, o.oid AS oid_ofamily
+                FROM pg_catalog.pg_opfamily AS n
+                CROSS JOIN (
+                    SELECT oid
+                    FROM pg_catalog.pg_opfamily
+                    WHERE opfname = 'brin_geography_inclusion_ops_temp'
+                ) AS o
+                WHERE n.opfname = 'brin_geography_inclusion_ops'
+            ),
+            -- Update the amprocfamily in pg_amproc
+            amupdate AS (
+                UPDATE pg_catalog.pg_amproc AS amp
+                SET amprocfamily = a.oid_nfamily
+                FROM a
+                WHERE amp.amprocfamily = a.oid_ofamily AND
+                      amp.amproc::text = 'geog_brin_inclusion_merge'
+                RETURNING amp.*
+            )
+            -- Update dependencies in pg_depend to the existing operator class
+            UPDATE pg_depend AS d
+            SET refobjid = (
+                SELECT n.oid
+                FROM pg_catalog.pg_opclass AS n
+                WHERE opcname = 'brin_geography_inclusion_ops'
+            )
+            FROM amupdate
+            WHERE d.objid = amupdate.oid AND
+                  refobjid = (
+                      SELECT o.oid
+                      FROM pg_catalog.pg_opclass AS o
+                      WHERE opcname = 'brin_geography_inclusion_ops_temp'
+                  );
+
+            -- Drop the temporary operator family after use
+            DROP OPERATOR FAMILY brin_geography_inclusion_ops_temp USING brin;
+        EXCEPTION WHEN OTHERS THEN
+            RAISE EXCEPTION
+                'Could not add geog_brin_inclusion_merge to brin_geography_inclusion_ops class: %',
+                SQLERRM;
+        END;
+    END IF;
+END;
+
+$$;
diff --git a/postgis/postgis_brin.sql.in b/postgis/postgis_brin.sql.in
index 340dd1f8d..9009a7420 100644
--- a/postgis/postgis_brin.sql.in
+++ b/postgis/postgis_brin.sql.in
@@ -192,18 +192,36 @@ RETURNS boolean
 AS 'MODULE_PATHNAME','geom2d_brin_inclusion_add_value'
 LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
 
+-- Availability: 3.6.0
+CREATE OR REPLACE FUNCTION geom2d_brin_inclusion_merge(internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME','geom2d_brin_inclusion_merge'
+LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
+
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION geom3d_brin_inclusion_add_value(internal, internal, internal, internal)
 RETURNS boolean
 AS 'MODULE_PATHNAME','geom3d_brin_inclusion_add_value'
 LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
 
+-- Availability: 3.6.0
+CREATE OR REPLACE FUNCTION geom3d_brin_inclusion_merge(internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME','geom3d_brin_inclusion_merge'
+LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
+
 -- Availability: 2.3.0
 CREATE OR REPLACE FUNCTION geom4d_brin_inclusion_add_value(internal, internal, internal, internal)
 RETURNS boolean
 AS 'MODULE_PATHNAME','geom4d_brin_inclusion_add_value'
 LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
 
+-- Availability: 3.6.0
+CREATE OR REPLACE FUNCTION geom4d_brin_inclusion_merge(internal, internal)
+RETURNS internal
+AS 'MODULE_PATHNAME','geom4d_brin_inclusion_merge'
+LANGUAGE 'c' PARALLEL SAFE _COST_DEFAULT;
+
 -- Availability: 2.3.0
 CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d
   DEFAULT FOR TYPE geometry
@@ -212,6 +230,7 @@ CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d
     FUNCTION      2        geom2d_brin_inclusion_add_value(internal, internal, internal, internal),
     FUNCTION      3        brin_inclusion_consistent(internal, internal, internal),
     FUNCTION      4        brin_inclusion_union(internal, internal, internal),
+    FUNCTION      11       geom2d_brin_inclusion_merge(internal, internal),
     OPERATOR      3         &&(box2df, box2df),
     OPERATOR      3         &&(box2df, geometry),
     OPERATOR      3         &&(geometry, box2df),
@@ -226,6 +245,7 @@ CREATE OPERATOR CLASS brin_geometry_inclusion_ops_2d
     OPERATOR      8        @(geometry, geometry),
   STORAGE box2df;
 
+
 		-------------
 		-- 3D case --
 		-------------
@@ -238,6 +258,7 @@ CREATE OPERATOR CLASS brin_geometry_inclusion_ops_3d
     FUNCTION      2        geom3d_brin_inclusion_add_value(internal, internal, internal, internal),
     FUNCTION      3        brin_inclusion_consistent(internal, internal, internal),
     FUNCTION      4        brin_inclusion_union(internal, internal, internal),
+    FUNCTION      11       geom3d_brin_inclusion_merge(internal, internal),
     OPERATOR      3        &&&(geometry, geometry),
     OPERATOR      3        &&&(geometry, gidx),
     OPERATOR      3        &&&(gidx, geometry),
@@ -256,6 +277,7 @@ CREATE OPERATOR CLASS brin_geometry_inclusion_ops_4d
     FUNCTION      2        geom4d_brin_inclusion_add_value(internal, internal, internal, internal),
     FUNCTION      3        brin_inclusion_consistent(internal, internal, internal),
     FUNCTION      4        brin_inclusion_union(internal, internal, internal),
+    FUNCTION      11       geom4d_brin_inclusion_merge(internal, internal),
     OPERATOR      3        &&&(geometry, geometry),
     OPERATOR      3        &&&(geometry, gidx),
     OPERATOR      3        &&&(gidx, geometry),
diff --git a/regress/core/regress_brin_index.sql b/regress/core/regress_brin_index.sql
index 30f04280e..6e952c3c9 100644
--- a/regress/core/regress_brin_index.sql
+++ b/regress/core/regress_brin_index.sql
@@ -171,8 +171,15 @@ SELECT 'scan_idx', qnodes('select count(*) from test where the_geom &&& ''BOX3D(
 
 DROP INDEX brin_4d;
 
+-- #5564
+SET max_parallel_workers TO 2;
+CREATE TABLE random_points AS
+SELECT ST_MakePoint(0, 0) AS geom FROM generate_series(1, 130562);
+CREATE INDEX ON random_points USING brin(geom);
+
 -- cleanup
 DROP TABLE test;
+DROP TABLE random_points;
 DROP FUNCTION qnodes(text);
 
 set enable_indexscan = on;
diff --git a/regress/core/regress_brin_index_3d.sql b/regress/core/regress_brin_index_3d.sql
index 60753615b..ccfc87403 100644
--- a/regress/core/regress_brin_index_3d.sql
+++ b/regress/core/regress_brin_index_3d.sql
@@ -246,8 +246,15 @@ SELECT 'scan_idx', qnodes('select * from test where the_geom && ''BOX(1 1, 5 5)'
 
 DROP INDEX brin_4d;
 
+-- #5564
+SET max_parallel_workers TO 2;
+CREATE TABLE random_points AS
+SELECT ST_MakePoint(0, 0, 0) AS geom FROM generate_series(1, 130562);
+CREATE INDEX ON random_points USING brin(geom);
+
 -- cleanup
 DROP TABLE test;
+DROP TABLE random_points;
 DROP FUNCTION qnodes(text);
 
 set enable_indexscan = on;
diff --git a/regress/core/regress_brin_index_geography.sql b/regress/core/regress_brin_index_geography.sql
index 697547cea..6ba5e1f41 100644
--- a/regress/core/regress_brin_index_geography.sql
+++ b/regress/core/regress_brin_index_geography.sql
@@ -55,8 +55,15 @@ SELECT '#4608-2', count(*) FROM test where ST_CoveredBy(the_geog, ST_GeogFromTex
 
 DROP INDEX brin_geog;
 
+-- #5564
+SET max_parallel_workers TO 2;
+CREATE TABLE random_points AS
+SELECT ST_MakePoint(0, 0)::geography AS geog FROM generate_series(1, 130562);
+CREATE INDEX ON random_points USING brin(geog);
+
 -- cleanup
 DROP TABLE test;
+DROP TABLE random_points;
 DROP FUNCTION qnodes(text);
 
 set enable_indexscan = on;

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                          |   3 +
 postgis/brin_2d.c                             |  27 +++
 postgis/brin_nd.c                             |  59 ++++++-
 postgis/geography_brin.sql.in                 |  12 +-
 postgis/postgis_after_upgrade.sql             | 229 ++++++++++++++++++++++++++
 postgis/postgis_brin.sql.in                   |  22 +++
 regress/core/regress_brin_index.sql           |   7 +
 regress/core/regress_brin_index_3d.sql        |   7 +
 regress/core/regress_brin_index_geography.sql |   7 +
 9 files changed, 368 insertions(+), 5 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list