- IF p.rank_search < 30 OR p.osm_type != 'N' OR p.address is not null THEN
- result.address := p.address;
- ELSE
- -- The additional && condition works around the misguided query
- -- planner of postgis 3.0.
- SELECT placex.address || hstore('_inherited', '') INTO result.address
- FROM placex
- WHERE ST_Covers(geometry, p.centroid)
- and geometry && p.centroid
- and placex.address is not null
- and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
- and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
- LIMIT 1;
+ IF p.rank_search = 30 AND p.osm_type = 'N' THEN
+ IF p.address is null THEN
+ -- The additional && condition works around the misguided query
+ -- planner of postgis 3.0.
+ SELECT placex.address || hstore('_inherited', '') INTO result.address
+ FROM placex
+ WHERE ST_Covers(geometry, p.centroid)
+ and geometry && p.centroid
+ and placex.address is not null
+ and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
+ and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
+ LIMIT 1;
+ ELSE
+ -- See if we can inherit additional address tags from an interpolation.
+ -- These will become permanent.
+ FOR location IN
+ SELECT (address - 'interpolation'::text - 'housenumber'::text) as address
+ FROM place, planet_osm_ways w
+ WHERE place.osm_type = 'W' and place.address ? 'interpolation'
+ and place.geometry && p.geometry
+ and place.osm_id = w.id
+ and p.osm_id = any(w.nodes)
+ LOOP
+ result.address := location.address || result.address;
+ END LOOP;
+ END IF;