do not expand records in select list

An expression of the form 'SELECT (func()).*' will be expanded
by Postgresql _before_ execution with the result that the function
will be called as many times as there are fields in the record.
This is not what we want. The function call needs to go into
the FROM clause instead.
This commit is contained in:
Sarah Hoffmann
2022-03-01 08:54:15 +01:00
parent 92bc3cd0a7
commit 15beeef6ce
4 changed files with 14 additions and 10 deletions

View File

@@ -342,9 +342,10 @@ BEGIN
WHERE s.place_id = parent_place_id; WHERE s.place_id = parent_place_id;
FOR addr_item IN FOR addr_item IN
SELECT (get_addr_tag_rank(key, country)).*, key, SELECT ranks.*, key,
token_get_address_search_tokens(token_info, key) as search_tokens token_get_address_search_tokens(token_info, key) as search_tokens
FROM token_get_address_keys(token_info) as key FROM token_get_address_keys(token_info) as key,
LATERAL get_addr_tag_rank(key, country) as ranks
WHERE not token_get_address_search_tokens(token_info, key) <@ parent_address_vector WHERE not token_get_address_search_tokens(token_info, key) <@ parent_address_vector
LOOP LOOP
addr_place := get_address_place(in_partition, geometry, addr_place := get_address_place(in_partition, geometry,
@@ -456,10 +457,12 @@ BEGIN
address_havelevel := array_fill(false, ARRAY[maxrank]); address_havelevel := array_fill(false, ARRAY[maxrank]);
FOR location IN FOR location IN
SELECT (get_address_place(partition, geometry, from_rank, to_rank, SELECT apl.*, key
extent, token_info, key)).*, key FROM (SELECT extra.*, key
FROM (SELECT (get_addr_tag_rank(key, country)).*, key FROM token_get_address_keys(token_info) as key,
FROM token_get_address_keys(token_info) as key) x LATERAL get_addr_tag_rank(key, country) as extra) x,
LATERAL get_address_place(partition, geometry, from_rank, to_rank,
extent, token_info, key) as apl
ORDER BY rank_address, distance, isguess desc ORDER BY rank_address, distance, isguess desc
LOOP LOOP
IF location.place_id is null THEN IF location.place_id is null THEN

View File

@@ -45,8 +45,9 @@ class AbstractPlacexRunner:
@staticmethod @staticmethod
def get_place_details(worker, ids): def get_place_details(worker, ids):
worker.perform("""SELECT place_id, (placex_indexing_prepare(placex)).* worker.perform("""SELECT place_id, extra.*
FROM placex WHERE place_id IN %s""", FROM placex, LATERAL placex_indexing_prepare(placex) as extra
WHERE place_id IN %s""",
(tuple((p[0] for p in ids)), )) (tuple((p[0] for p in ids)), ))

View File

@@ -590,7 +590,7 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
continue continue
with self.conn.cursor() as cur: with self.conn.cursor() as cur:
cur.execute("SELECT (getorcreate_full_word(%s, %s)).*", cur.execute("SELECT * FROM getorcreate_full_word(%s, %s)",
(token_id, variants)) (token_id, variants))
full, part = cur.fetchone() full, part = cur.fetchone()

View File

@@ -515,7 +515,7 @@ class _TokenInfo:
simple_list = list(set(simple_list)) simple_list = list(set(simple_list))
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute("SELECT (create_housenumbers(%s)).* ", (simple_list, )) cur.execute("SELECT * FROM create_housenumbers(%s)", (simple_list, ))
self.data['hnr_tokens'], self.data['hnr'] = cur.fetchone() self.data['hnr_tokens'], self.data['hnr'] = cur.fetchone()