[PostGIS] #5951: server process was terminated by signal 11: Segmentation fault, postgis topology
PostGIS
trac at osgeo.org
Thu Jul 24 05:01:40 PDT 2025
#5951: server process was terminated by signal 11: Segmentation fault, postgis
topology
--------------------------------+---------------------------
Reporter: Lars Aksel Opsahl | Owner: strk
Type: defect | Status: new
Priority: medium | Milestone: PostGIS 3.6.0
Component: topology | Version: master
Resolution: | Keywords:
--------------------------------+---------------------------
Comment (by Lars Aksel Opsahl):
After running test_01.sql postgresql core dumps after this set off SQL's
{{{
CREATE table grunnkart_03_topo_error_1_small_all_1_2 AS
SELECT
s.edge_id,
s.face_id,
s.face_area,
s.table_input_order,
s.edge_geoms
FROM
(
SELECT
unnest(edge_ids) edge_id, -- the
list of edges around the face
face_area,
face_id,
table_input_order,
edge_geoms
FROM
unnest('{"({630},-1,8,-1,)","({630},-1,8,-1,)","({633},-1,38,-1,)","({636},-1,300,-1,)","({636},-1,300,-1,)","({639},-1,39,-1,)","({639},-1,301,-1,)","({639},-1,39,-1,)","({639},-1,301,-1,)","({642},-1,157,-1,)","({642},-1,157,-1,)","({645},-1,303,-1,)","({645},-1,303,-1,)","({648},-1,304,-1,)","({648},-1,304,-1,)","({651},-1,305,-1,)","({651},-1,305,-1,)","({654},-1,306,-1,)","({654},-1,306,-1,)","({657},-1,307,-1,)","({657},-1,307,-1,)","({660},-1,308,-1,)","({663},-1,309,-1,)","({663},-1,309,-1,)","({666},-1,261,-1,)","({666},-1,310,-1,)","({666},-1,261,-1,)","({666},-1,310,-1,)","({669},-1,310,-1,)","({669},-1,310,-1,)","({672},-1,159,-1,)","({672},-1,159,-1,)","({675},-1,313,-1,)","({675},-1,314,-1,)","({675},-1,313,-1,)","({675},-1,314,-1,)","({678},-1,314,-1,)","({678},-1,314,-1,)","({681},-1,313,-1,)","({681},-1,315,-1,)","({681},-1,313,-1,)","({681},-1,315,-1,)","({684},-1,316,-1,)","({684},-1,316,-1,)","({687},-1,317,-1,)","({687},-1,317,-1,)","({690},-1,193,-1,)","({690},-1,193,-1,)","({693},-1,319,-1,)","({693},-1,319,-1,)","({695},-1,39,-1,)","({698},-1,191,-1,)","({698},-1,191,-1,)","({701},-1,292,-1,)","({701},-1,292,-1,)","({704},-1,323,-1,)"}'::add_border_lines_faces_to_remove[])
) s;
CREATE INDEX ON grunnkart_03_topo_error_1_small_all_1_2
(table_input_order);
CREATE INDEX ON grunnkart_03_topo_error_1_small_all_1_2 (edge_id);
CREATE INDEX ON grunnkart_03_topo_error_1_small_all_1_2 (face_id);
ANALYZE grunnkart_03_topo_error_1_small_all_1_2;
CREATE table grunnkart_03_topo_error_1_small_selected_1_2 AS
WITH unique_face_id AS (
SELECT
table_input_order min_table_input_order,
face_id,
edge_id
FROM
grunnkart_03_topo_error_1_small_all_1_2
GROUP BY table_input_order, face_id,
edge_id
ORDER BY table_input_order, face_id,
edge_id
),
edge_delete_short AS (
SELECT
abs((topology.ST_GetFaceEdges('grunnkart_03_topo_error_1',eshort.face_id)).edge)
edge_id,
face_id,
min_table_input_order table_input_order
FROM
unique_face_id eshort
WHERE eshort.min_table_input_order = -1
),
new_edge_delete_short AS (
SELECT
sh.face_id,
sh.edge_id,
e.left_face,
e.right_face,
1000 table_input_order,
CASE when e.left_face = 0 OR e.right_face
= 0 then 1
ELSE 0
END AS outer_face_edge,
CASE when e.left_face > 1 AND e.right_face
> 1 then 1
ELSE 0
END AS inner_face_edge,
e.geom
FROM
edge_delete_short sh,
grunnkart_03_topo_error_1.edge_data e
WHERE e.edge_id = sh.edge_id AND
NOT EXISTS ( SELECT TRUE FROM
unique_face_id ee WHERE sh.edge_id = ee.edge_id AND
ee.min_table_input_order = -1)
),
new_edge_delete_other AS (
SELECT
ot.face_id,
ot.edge_id,
e.left_face,
e.right_face,
ot.table_input_order,
CASE when e.left_face = 0 OR right_face =
0 then 1
ELSE 0
END AS outer_face_edge,
CASE when e.left_face > 0 AND right_face >
0 then 1
ELSE 0
END AS inner_face_edge,
e.geom
FROM
grunnkart_03_topo_error_1_small_all_1_2
ot,
grunnkart_03_topo_error_1.edge_data e
WHERE ot.table_input_order > -1 AND
e.edge_id = ot.edge_id AND
(e.left_face = ot.face_id OR e.right_face
= ot.face_id)
),
edges_to_delete AS (
SELECT face_id,edge_id,table_input_order,
outer_face_edge, inner_face_edge, geom, left_face, right_face
FROM new_edge_delete_short
UNION ALL
SELECT
face_id,edge_id,table_input_order,outer_face_edge,inner_face_edge, geom,
left_face, right_face
FROM new_edge_delete_other
),
distinct_face_id AS (
SELECT DISTINCT ON (ed.face_id)
ed.face_id, ed.left_face, ed.right_face,
ed.table_input_order,ed.inner_face_edge, ed.outer_face_edge, ed.edge_id,
ed.geom
FROM edges_to_delete ed
ORDER BY ed.face_id desc,
ed.table_input_order desc, ed.outer_face_edge, ed.inner_face_edge,
ST_Length(ed.geom,true) desc
)
SELECT DISTINCT ON (ed.edge_id)
ed.face_id,
ed.left_face,
ed.right_face,
ed.table_input_order,
ed.inner_face_edge,
ed.outer_face_edge,
ed.edge_id, ed.geom,
CASE WHEN (ed.left_face > 0 AND ed.right_face > 0) ANd ed.left_face !=
ed.right_face THEN TRUE
ELSE FALSE END AS is_ok_now
FROM distinct_face_id ed
ORDER BY ed.edge_id desc, ed.table_input_order desc, ed.outer_face_edge,
ed.inner_face_edge , ed.face_id desc, ST_Length(ed.geom,true) desc;
}}}
--
Ticket URL: <https://trac.osgeo.org/postgis/ticket/5951#comment:2>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-tickets
mailing list