use a typed record for place info in get_addressdata

Older versions of Postgresql cannot handle an untyped record
for INTO.

Fixes #2100.
This commit is contained in:
Sarah Hoffmann
2020-12-12 14:46:34 +01:00
parent a338ba695b
commit 5cf573c340

View File

@@ -79,6 +79,18 @@ END;
$$ $$
LANGUAGE plpgsql STABLE; LANGUAGE plpgsql STABLE;
DROP TYPE IF EXISTS addressdata_place;
CREATE TYPE addressdata_place AS (
place_id BIGINT,
country_code VARCHAR(2),
housenumber TEXT,
postcode TEXT,
class TEXT,
type TEXT,
name HSTORE,
address HSTORE,
centroid GEOMETRY
);
-- Compute the list of address parts for the given place. -- Compute the list of address parts for the given place.
-- --
@@ -87,7 +99,7 @@ CREATE OR REPLACE FUNCTION get_addressdata(in_place_id BIGINT, in_housenumber IN
RETURNS setof addressline RETURNS setof addressline
AS $$ AS $$
DECLARE DECLARE
place RECORD; place addressdata_place;
location RECORD; location RECORD;
current_rank_address INTEGER; current_rank_address INTEGER;
location_isaddress BOOLEAN; location_isaddress BOOLEAN;
@@ -98,9 +110,9 @@ BEGIN
-- first query osmline (interpolation lines) -- first query osmline (interpolation lines)
IF in_housenumber >= 0 THEN IF in_housenumber >= 0 THEN
SELECT parent_place_id as place_id, country_code, SELECT parent_place_id as place_id, country_code,
in_housenumber::text as housenumber, postcode, in_housenumber as housenumber, postcode,
'place' as class, 'house' as type, 'place' as class, 'house' as type,
null::hstore as name, null::hstore as address, null as name, null as address,
ST_Centroid(linegeo) as centroid ST_Centroid(linegeo) as centroid
INTO place INTO place
FROM location_property_osmline FROM location_property_osmline
@@ -111,10 +123,10 @@ BEGIN
--then query tiger data --then query tiger data
-- %NOTIGERDATA% IF 0 THEN -- %NOTIGERDATA% IF 0 THEN
IF place IS NULL AND in_housenumber >= 0 THEN IF place IS NULL AND in_housenumber >= 0 THEN
SELECT parent_place_id as place_id, 'us'::varchar(2) as country_code, SELECT parent_place_id as place_id, 'us' as country_code,
in_housenumber::text as housenumber, postcode, in_housenumber as housenumber, postcode,
'place' as class, 'house' as type, 'place' as class, 'house' as type,
null::hstore as name, null::hstore as address, null as name, null as address,
ST_Centroid(linegeo) as centroid ST_Centroid(linegeo) as centroid
INTO place INTO place
FROM location_property_tiger FROM location_property_tiger
@@ -125,10 +137,10 @@ BEGIN
-- %NOAUXDATA% IF 0 THEN -- %NOAUXDATA% IF 0 THEN
IF place IS NULL THEN IF place IS NULL THEN
SELECT parent_place_id as place_id, 'us'::varchar(2) as country_code, SELECT parent_place_id as place_id, 'us' as country_code,
housenumber, postcode, housenumber, postcode,
'place' as class, 'house' as type, 'place' as class, 'house' as type,
null::hstore as name, null::hstore as address, null as name, null as address,
centroid centroid
INTO place INTO place
FROM location_property_aux FROM location_property_aux
@@ -141,8 +153,8 @@ BEGIN
SELECT parent_place_id as place_id, country_code, SELECT parent_place_id as place_id, country_code,
null::text as housenumber, postcode, null::text as housenumber, postcode,
'place' as class, 'postcode' as type, 'place' as class, 'postcode' as type,
null::hstore as name, null::hstore as address, null as name, null as address,
null::geometry as centroid null as centroid
INTO place INTO place
FROM location_postcode FROM location_postcode
WHERE place_id = in_place_id; WHERE place_id = in_place_id;
@@ -167,8 +179,8 @@ BEGIN
select coalesce(linked_place_id, place_id) as place_id, country_code, select coalesce(linked_place_id, place_id) as place_id, country_code,
housenumber, postcode, housenumber, postcode,
class, type, class, type,
null::hstore as name, address, null as name, address,
null::geometry as centroid null as centroid
INTO place INTO place
FROM placex where place_id = in_place_id; FROM placex where place_id = in_place_id;
END IF; END IF;