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;
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
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
LOOP
addr_place := get_address_place(in_partition, geometry,
@ -456,10 +457,12 @@ BEGIN
address_havelevel := array_fill(false, ARRAY[maxrank]);
FOR location IN
SELECT (get_address_place(partition, geometry, from_rank, to_rank,
extent, token_info, key)).*, key
FROM (SELECT (get_addr_tag_rank(key, country)).*, key
FROM token_get_address_keys(token_info) as key) x
SELECT apl.*, key
FROM (SELECT extra.*, key
FROM token_get_address_keys(token_info) as key,
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
LOOP
IF location.place_id is null THEN

View File

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

View File

@ -590,7 +590,7 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
continue
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))
full, part = cur.fetchone()

View File

@ -515,7 +515,7 @@ class _TokenInfo:
simple_list = list(set(simple_list))
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()