From: Sarah Hoffmann Date: Fri, 18 Nov 2022 16:26:56 +0000 (+0100) Subject: drop illegal values for addr:interpolation on update X-Git-Tag: v4.2.0~8^2 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/c9ff7d213051d40583d0b629e95839ce223557e2?ds=sidebyside drop illegal values for addr:interpolation on update --- diff --git a/lib-sql/functions/interpolation.sql b/lib-sql/functions/interpolation.sql index fb822033..9bb91021 100644 --- a/lib-sql/functions/interpolation.sql +++ b/lib-sql/functions/interpolation.sql @@ -84,27 +84,35 @@ CREATE OR REPLACE FUNCTION reinsert_interpolation(way_id BIGINT, addr HSTORE, DECLARE existing BIGINT[]; BEGIN - -- Get the existing entry from the interpolation table. - SELECT array_agg(place_id) INTO existing - FROM location_property_osmline WHERE osm_id = way_id; - - IF existing IS NULL or array_length(existing, 1) = 0 THEN - INSERT INTO location_property_osmline (osm_id, address, linegeo) - VALUES (way_id, addr, geom); + IF addr is NULL OR NOT addr ? 'interpolation' + OR NOT (addr->'interpolation' in ('odd', 'even', 'all') + or addr->'interpolation' similar to '[1-9]') + THEN + -- the new interpolation is illegal, simply remove existing entries + DELETE FROM location_property_osmline WHERE osm_id = way_id; ELSE - -- Update the interpolation table: - -- The first entry gets the original data, all other entries - -- are removed and will be recreated on indexing. - -- (An interpolation can be split up, if it has more than 2 address nodes) - UPDATE location_property_osmline - SET address = addr, - linegeo = geom, - startnumber = null, - indexed_status = 1 - WHERE place_id = existing[1]; - IF array_length(existing, 1) > 1 THEN - DELETE FROM location_property_osmline - WHERE place_id = any(existing[2:]); + -- Get the existing entry from the interpolation table. + SELECT array_agg(place_id) INTO existing + FROM location_property_osmline WHERE osm_id = way_id; + + IF existing IS NULL or array_length(existing, 1) = 0 THEN + INSERT INTO location_property_osmline (osm_id, address, linegeo) + VALUES (way_id, addr, geom); + ELSE + -- Update the interpolation table: + -- The first entry gets the original data, all other entries + -- are removed and will be recreated on indexing. + -- (An interpolation can be split up, if it has more than 2 address nodes) + UPDATE location_property_osmline + SET address = addr, + linegeo = geom, + startnumber = null, + indexed_status = 1 + WHERE place_id = existing[1]; + IF array_length(existing, 1) > 1 THEN + DELETE FROM location_property_osmline + WHERE place_id = any(existing[2:]); + END IF; END IF; END IF; diff --git a/test/bdd/db/import/interpolation.feature b/test/bdd/db/import/interpolation.feature index b34d5adb..56ca4cc1 100644 --- a/test/bdd/db/import/interpolation.feature +++ b/test/bdd/db/import/interpolation.feature @@ -433,3 +433,26 @@ Feature: Import of address interpolations And W10 expands to interpolation | start | end | parent_place_id | | 12 | 14 | W2 | + + + Scenario Outline: Bad interpolation values are ignored + Given the grid with origin 1,1 + | 1 | | 9 | | 2 | + Given the places + | osm | class | type | housenr | + | N1 | place | house | 2 | + | N2 | place | house | 6 | + And the places + | osm | class | type | addr+interpolation | geometry | + | W1 | place | houses | | 1,2 | + And the ways + | id | nodes | + | 1 | 1,2 | + When importing + Then W1 expands to no interpolation + + Examples: + | value | + | foo | + | x | + | 12-2 | diff --git a/test/bdd/db/update/interpolation.feature b/test/bdd/db/update/interpolation.feature index ac6b8a44..421fdc01 100644 --- a/test/bdd/db/update/interpolation.feature +++ b/test/bdd/db/update/interpolation.feature @@ -391,3 +391,29 @@ Feature: Update of address interpolations | parent_place_id | start | end | | W1 | 4 | 6 | + Scenario: Legal interpolation type changed to illegal one + Given the grid + | 1 | | 2 | + | 3 | | 4 | + And the places + | osm | class | type | name | geometry | + | W1 | highway | unclassified | Cloud Street | 1, 2 | + And the ways + | id | nodes | + | 2 | 3,4 | + And the places + | osm | class | type | addr+interpolation | geometry | + | W2 | place | houses | even | 3,4 | + And the places + | osm | class | type | housenr | + | N3 | place | house | 2 | + | N4 | place | house | 6 | + When importing + Then W2 expands to interpolation + | parent_place_id | start | end | + | W1 | 4 | 4 | + When updating places + | osm | class | type | addr+interpolation | geometry | + | W2 | place | houses | 12-2 | 3,4 | + Then W2 expands to no interpolation +