Thread: Assignment to composite type variable fails inside function but running query separately yields correct type & value ?
Assignment to composite type variable fails inside function but running query separately yields correct type & value ?
From
Tobias Gierke
Date:
Hi, I'm probably just missing some nitty-gritty detail here but I've bashed by head against this one for ages and still couldn't make sense of it. This is on PostgreSQL 12.2 (on CentOS 7 but PostgreSQL compiled from sources): voip=# CREATE TYPE version_num AS (major bigint, minor bigint); CREATE TYPE voip=# CREATE TYPE version_num_text AS (major text, minor text); CREATE TYPE voip=# voip=# CREATE TEMPORARY TABLE test_table ( a_major bigint, a_minor bigint ); CREATE TABLE voip=# INSERT INTO test_table VALUES (1,1); INSERT 0 1 voip=# voip=# CREATE OR REPLACE FUNCTION test_func( _id version_num_text ) voip-# RETURNS void AS voip-# $BODY$ voip$# DECLARE voip$# _myid version_num; voip$# BEGIN voip$# SELECT (t1.a_major, t1.a_minor )::version_num INTO _myid FROM test_table t1 WHERE (t1.a_major,t1.a_minor)::version_num_text = _id; voip$# END; voip$# $BODY$ LANGUAGE plpgsql; CREATE FUNCTION voip=# voip=# SELECT test_func( ('1','1')::version_num_text ); ERROR: invalid input syntax for type bigint: "(1,1)" CONTEXT: PL/pgSQL function test_func(version_num_text) line 5 at SQL statement voip=# CREATE TEMPORARY TABLE dbg_table AS SELECT (t1.a_major, t1.a_minor )::version_num FROM test_table t1 WHERE (t1.a_major,t1.a_minor)::version_num_text = ('1','1')::version_num_text; SELECT 1 voip=# \d dbg_table Table "pg_temp_189.dbg_table" Column | Type | Collation | Nullable | Default --------+-------------+-----------+----------+--------- row | version_num | | | Bug or feature ? Cheers, Tobias
Re: Assignment to composite type variable fails inside function but running query separately yields correct type & value ?
From
"David G. Johnston"
Date:
On Tue, Jan 26, 2021 at 5:56 AM Tobias Gierke <tobias.gierke@code-sourcery.de> wrote:
voip$# SELECT (t1.a_major, t1.a_minor )::version_num INTO _myid
Bug or feature ?
Feature. The first column of the select result gets placed into the first field of _myid, the second column of the select result gets placed into the second field of _myid. This is how assignment to row-typed variables (and record-typed too) works in pl/pgsql.
David J.
Re: Assignment to composite type variable fails inside function but running query separately yields correct type & value ?
From
Tobias Gierke
Date:
Thanks for the hint & sorry for the noise, it's working now !
On Tue, Jan 26, 2021 at 5:56 AM Tobias Gierke <tobias.gierke@code-sourcery.de> wrote:voip$# SELECT (t1.a_major, t1.a_minor )::version_num INTO _myid
Bug or feature ?Feature. The first column of the select result gets placed into the first field of _myid, the second column of the select result gets placed into the second field of _myid. This is how assignment to row-typed variables (and record-typed too) works in pl/pgsql.David J.