Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w90Kp-0016cR-1R for pgsql-bugs@arkaria.postgresql.org; Sat, 04 Apr 2026 12:42:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w90Km-00GJlY-2S for pgsql-bugs@arkaria.postgresql.org; Sat, 04 Apr 2026 12:42:41 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w90Km-00GJlQ-0N for pgsql-bugs@lists.postgresql.org; Sat, 04 Apr 2026 12:42:40 +0000 Received: from forwardcorp1d.mail.yandex.net ([2a02:6b8:c41:1300:1:45:d181:df01]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w90Kj-00000000WIE-0fgo for pgsql-bugs@lists.postgresql.org; Sat, 04 Apr 2026 12:42:39 +0000 Received: from mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:65a0:0:640:e1de:0]) by forwardcorp1d.mail.yandex.net (Yandex) with ESMTPS id A73568065A; Sat, 04 Apr 2026 15:42:31 +0300 (MSK) Received: from smtpclient.apple (unknown [2a02:6bf:8080:1b::1:38]) by mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id UgdHBi0Kx0U0-V9DmxB1b; Sat, 04 Apr 2026 15:42:31 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1775306551; bh=ed5A/QC1ZEJJl77J6EwaQ/s6sBNqLGOMgwgF9eEU9ns=; h=References:To:Cc:In-Reply-To:Date:From:Message-Id:Subject; b=fgK+yUPqiHoYEmNK3tblv0EBgiZuAPOZXurTVAR1IjWufiKM1mT0kR4Tjswxxoeh5 spKzPQMwhY/7U+UCtuv8jQOTV5UPAmSfW5MwU2Hoj6n65ND9l7QAJfAI5ICQrx22wP r/dtyV+rd8UNVCKgMKQvk05avpi0EuFswXLz7+VM= Authentication-Results: mail-nwsmtp-smtp-corp-main-56.klg.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Andrey Borodin Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_AB639944-270B-4535-846D-7DC23B29410F" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Re: BUG #19382: Server crash at __nss_database_lookup Date: Sat, 4 Apr 2026 17:42:20 +0500 In-Reply-To: Cc: songjinzhou , dllggyx , pgsql-bugs To: surya poondla References: <19382-4c2060ffee72759b@postgresql.org> X-Mailer: Apple Mail (2.3864.400.21) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_AB639944-270B-4535-846D-7DC23B29410F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii > On 3 Apr 2026, at 04:14, surya poondla = wrote: >=20 > <0004-Fix-bug-19382-server-crash-when-ALTER-TYPE-is-used-m.patch> Hi Surya, Thanks for the updated patch. I noticed it checks er_tupdesc_id of the outermost record variable, but does not recurse into nested composite = types. The server still crashes when only an inner type is altered: CREATE TYPE inner_t AS (x INT, y INT); CREATE TYPE outer_t AS (a INT, b inner_t); CREATE OR REPLACE FUNCTION test_nested() RETURNS record LANGUAGE plpgsql = AS $$ DECLARE r1 outer_t; r2 outer_t; BEGIN r1 :=3D ROW(1, ROW(10, power(2,30)::int4)::inner_t)::outer_t; ALTER TYPE inner_t ALTER ATTRIBUTE y TYPE TEXT; r2 :=3D r1; RETURN r2; END; $$; SELECT test_nested(); -- server crash The same gap exists on the cursor side independently of your patch, and = I have a fix for that part that walks the type tree recursively. IMO the PL/pgSQL assignment path will need a similar recursive check. I'm definitely not a big fan of checking types on every FETCH, but I see = no other ways around. Best regards, Andrey Borodin. --Apple-Mail=_AB639944-270B-4535-846D-7DC23B29410F Content-Disposition: attachment; filename=v2026-04-04-0001-Fix-incorrect-results-when-composite-typ.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v2026-04-04-0001-Fix-incorrect-results-when-composite-typ.patch" Content-Transfer-Encoding: quoted-printable =46rom=20bd2f4aff350aab947ab66cdad7afa910f1ede7a1=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Andrey=20Borodin=20=0ADate:=20= Sat,=204=20Apr=202026=2010:26:44=20+0500=0ASubject:=20[PATCH=20= v2026-04-04]=20Fix=20incorrect=20results=20when=20composite=20type=20is=0A= =20altered=20mid-cursor-scan=0A=0AHeapTuples=20carry=20only=20the=20type=20= OID,=20not=20a=20schema=20version.=20=20If=20ALTER=20TYPE=0Achanges=20a=20= composite=20type=20between=20FETCHes,=20the=20stored=20tuples=20are=0A= interpreted=20with=20the=20wrong=20definition.=0A=0AAt=20cursor=20open,=20= record=20the=20tupDesc_identifier=20of=20every=20composite=20type=0A= reachable=20from=20the=20result=20columns=20(including=20nested=20ones).=20= =20Reject=20the=0AFETCH=20with=20ERRCODE_INVALID_CURSOR_STATE=20if=20any=20= identifier=20has=20changed.=0A=0AReported-by:=20Yuxiao=20Guo=20= =0ADiscussion:=20= https://www.postgresql.org/message-id/CAOVWO5oRGPd7mA3d85jNYmjLNfeBAca5oDc= HTfRFxbAwPLxs5g@mail.gmail.com=0A---=0A=20src/backend/tcop/pquery.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20|=20130=20+++++++++++++++++++++++++=0A= =20src/include/utils/portal.h=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20= =205=20+=0A=20src/test/regress/expected/rowtypes.out=20|=20=2054=20= ++++++++++=0A=20src/test/regress/sql/rowtypes.sql=20=20=20=20=20=20|=20=20= 36=20+++++++=0A=204=20files=20changed,=20225=20insertions(+)=0A=0Adiff=20= --git=20a/src/backend/tcop/pquery.c=20b/src/backend/tcop/pquery.c=0A= index=20d8fc75d0bb9..07cbf288936=20100644=0A---=20= a/src/backend/tcop/pquery.c=0A+++=20b/src/backend/tcop/pquery.c=0A@@=20= -25,8=20+25,12=20@@=0A=20#include=20"pg_trace.h"=0A=20#include=20= "tcop/pquery.h"=0A=20#include=20"tcop/utility.h"=0A+#include=20= "catalog/pg_type_d.h"=0A+#include=20"utils/builtins.h"=0A+#include=20= "utils/lsyscache.h"=0A=20#include=20"utils/memutils.h"=0A=20#include=20= "utils/snapmgr.h"=0A+#include=20"utils/typcache.h"=0A=20=0A=20=0A=20/*=0A= @@=20-425,6=20+429,103=20@@=20FetchStatementTargetList(Node=20*stmt)=0A=20= =20*=20On=20return,=20portal=20is=20ready=20to=20accept=20PortalRun()=20= calls,=20and=20the=20result=0A=20=20*=20tupdesc=20(if=20any)=20is=20= known.=0A=20=20*/=0A+=0A+/*=0A+=20*=20CollectCompositeTypeVersions=0A+=20= *=09=09Record=20typid's=20tupDesc_identifier,=20then=20recurse=20into=20= its=20composite-type=0A+=20*=09=09attributes.=20=20Duplicate=20OIDs=20= are=20skipped.=20=20Arrays=20are=20repalloc'd=20as=0A+=20*=09=09needed;=20= n/alloc=20are=20updated=20in=20place.=0A+=20*/=0A+static=20void=0A= +CollectCompositeTypeVersions(Oid=20typid,=0A+=09=09=09=09=09=09=09=20= Oid=20**oids,=20uint64=20**versions,=0A+=09=09=09=09=09=09=09=20int=20= *n,=20int=20*alloc)=0A+{=0A+=09TypeCacheEntry=20*typentry;=0A+=09= TupleDesc=09tupdesc;=0A+=0A+=09for=20(int=20i=20=3D=200;=20i=20<=20*n;=20= i++)=09/*=20skip=20if=20already=20recorded=20*/=0A+=09=09if=20= ((*oids)[i]=20=3D=3D=20typid)=0A+=09=09=09return;=0A+=0A+=09typentry=20=3D= =20lookup_type_cache(typid,=20TYPECACHE_TUPDESC);=0A+=0A+=09if=20(*n=20= >=3D=20*alloc)=0A+=09{=0A+=09=09*alloc=20*=3D=202;=0A+=09=09*oids=20=3D=20= repalloc(*oids,=20*alloc=20*=20sizeof(Oid));=0A+=09=09*versions=20=3D=20= repalloc(*versions,=20*alloc=20*=20sizeof(uint64));=0A+=09}=0A+=0A+=09= (*oids)[*n]=20=3D=20typid;=0A+=09(*versions)[*n]=20=3D=20= typentry->tupDesc_identifier;=0A+=09(*n)++;=0A+=0A+=09tupdesc=20=3D=20= typentry->tupDesc;=0A+=09if=20(tupdesc=20=3D=3D=20NULL)=0A+=09=09return;=0A= +=0A+=09for=20(int=20i=20=3D=200;=20i=20<=20tupdesc->natts;=20i++)=0A+=09= {=0A+=09=09Form_pg_attribute=20attr=20=3D=20TupleDescAttr(tupdesc,=20i);=0A= +=0A+=09=09if=20(!attr->attisdropped=20&&=0A+=09=09=09attr->atttypid=20= !=3D=20RECORDOID=20&&=0A+=09=09=09get_typtype(attr->atttypid)=20=3D=3D=20= TYPTYPE_COMPOSITE)=0A+=09=09=09= CollectCompositeTypeVersions(attr->atttypid,=0A+=09=09=09=09=09=09=09=09=09= =09=20oids,=20versions,=20n,=20alloc);=0A+=09}=0A+}=0A+=0A+/*=0A+=20*=20= InitPortalCompositeTypeVersions=0A+=20*=09=09Snapshot=20= tupDesc_identifier=20for=20every=20named=20composite=20type=20reachable=0A= +=20*=09=09from=20portal->tupDesc=20(including=20nested=20types).=20=20= Called=20once=20at=20cursor=0A+=20*=09=09open;=20checked=20at=20each=20= FETCH=20to=20detect=20mid-scan=20ALTER=20TYPE.=0A+=20*/=0A+static=20void=0A= +InitPortalCompositeTypeVersions(Portal=20portal)=0A+{=0A+=09TupleDesc=09= tupdesc=20=3D=20portal->tupDesc;=0A+=09MemoryContext=20oldcxt;=0A+=09int=09= =09=09alloc=20=3D=208;=0A+=09int=09=09=09n=20=3D=200;=0A+=09Oid=09=09=20=20= =20*oids;=0A+=09uint64=09=20=20=20*versions;=0A+=0A+=09if=20(tupdesc=20= =3D=3D=20NULL)=0A+=09=09return;=0A+=0A+=09oldcxt=20=3D=20= MemoryContextSwitchTo(portal->portalContext);=0A+=09oids=20=3D=20= palloc(alloc=20*=20sizeof(Oid));=0A+=09versions=20=3D=20palloc(alloc=20*=20= sizeof(uint64));=0A+=0A+=09for=20(int=20i=20=3D=200;=20i=20<=20= tupdesc->natts;=20i++)=0A+=09{=0A+=09=09Form_pg_attribute=20attr=20=3D=20= TupleDescAttr(tupdesc,=20i);=0A+=0A+=09=09if=20(!attr->attisdropped=20&&=0A= +=09=09=09attr->atttypid=20!=3D=20RECORDOID=20&&=0A+=09=09=09= get_typtype(attr->atttypid)=20=3D=3D=20TYPTYPE_COMPOSITE)=0A+=09=09=09= CollectCompositeTypeVersions(attr->atttypid,=0A+=09=09=09=09=09=09=09=09=09= =09=20&oids,=20&versions,=20&n,=20&alloc);=0A+=09}=0A+=0A+=09= MemoryContextSwitchTo(oldcxt);=0A+=0A+=09if=20(n=20>=200)=0A+=09{=0A+=09=09= portal->nCursorCompositeTypes=20=3D=20n;=0A+=09=09= portal->cursorCompositeTypeOids=20=3D=20oids;=0A+=09=09= portal->cursorCompositeTypeVersions=20=3D=20versions;=0A+=09}=0A+=09else=0A= +=09{=0A+=09=09pfree(oids);=0A+=09=09pfree(versions);=0A+=09}=0A+}=0A+=0A= =20void=0A=20PortalStart(Portal=20portal,=20ParamListInfo=20params,=0A=20= =09=09=09int=20eflags,=20Snapshot=20snapshot)=0A@@=20-522,6=20+623,13=20= @@=20PortalStart(Portal=20portal,=20ParamListInfo=20params,=0A=20=09=09=09= =09=20*/=0A=20=09=09=09=09portal->tupDesc=20=3D=20queryDesc->tupDesc;=0A=20= =0A+=09=09=09=09/*=0A+=09=09=09=09=20*=20Record=20type-cache=20versions=20= for=20any=20named=20composite-type=0A+=09=09=09=09=20*=20result=20= columns=20so=20that=20FETCH=20can=20detect=20mid-scan=20ALTER=0A+=09=09=09= =09=20*=20TYPE.=0A+=09=09=09=09=20*/=0A+=09=09=09=09= InitPortalCompositeTypeVersions(portal);=0A+=0A=20=09=09=09=09/*=0A=20=09= =09=09=09=20*=20Reset=20cursor=20position=20data=20to=20"start=20of=20= query"=0A=20=09=09=09=09=20*/=0A@@=20-1383,6=20+1491,28=20@@=20= PortalRunFetch(Portal=20portal,=0A=20=0A=20=09= Assert(PortalIsValid(portal));=0A=20=0A+=09/*=0A+=09=20*=20Reject=20the=20= fetch=20if=20any=20composite=20type=20in=20the=20result=20has=20been=20= altered=0A+=09=20*=20since=20the=20cursor=20was=20opened;=20HeapTuples=20= carry=20no=20type-version=20tag=20so=0A+=09=20*=20the=20mismatch=20= cannot=20be=20caught=20later.=0A+=09=20*/=0A+=09if=20= (portal->nCursorCompositeTypes=20>=200)=0A+=09{=0A+=09=09for=20(int=20i=20= =3D=200;=20i=20<=20portal->nCursorCompositeTypes;=20i++)=0A+=09=09{=0A+=09= =09=09Oid=09=09=09typid=20=3D=20portal->cursorCompositeTypeOids[i];=0A+=09= =09=09TypeCacheEntry=20*typentry=20=3D=0A+=09=09=09=09= lookup_type_cache(typid,=20TYPECACHE_TUPDESC);=0A+=0A+=09=09=09if=20= (typentry->tupDesc_identifier=20!=3D=20= portal->cursorCompositeTypeVersions[i])=0A+=09=09=09=09ereport(ERROR,=0A= +=09=09=09=09=09=09(errcode(ERRCODE_INVALID_CURSOR_STATE),=0A+=09=09=09=09= =09=09=20errmsg("cursor=20scan=20cannot=20continue=20after=20composite=20= type=20\"%s\"=20was=20altered",=0A+=09=09=09=09=09=09=09=09= format_type_be(typid)),=0A+=09=09=09=09=09=09=20errhint("Close=20and=20= reopen=20the=20cursor=20after=20ALTER=20TYPE.")));=0A+=09=09}=0A+=09}=0A= +=0A=20=09/*=0A=20=09=20*=20Check=20for=20improper=20portal=20use,=20and=20= mark=20portal=20active.=0A=20=09=20*/=0Adiff=20--git=20= a/src/include/utils/portal.h=20b/src/include/utils/portal.h=0Aindex=20= a7bedb12c18..a8d725a35ad=20100644=0A---=20a/src/include/utils/portal.h=0A= +++=20b/src/include/utils/portal.h=0A@@=20-160,6=20+160,11=20@@=20= typedef=20struct=20PortalData=0A=20=09/*=20and=20these=20are=20the=20= format=20codes=20to=20use=20for=20the=20columns:=20*/=0A=20=09int16=09=20= =20=20*formats;=09=09/*=20a=20format=20code=20for=20each=20column=20*/=0A= =20=0A+=09/*=20tupDesc_identifier=20snapshots=20for=20composite=20types=20= in=20the=20result=20columns=20*/=0A+=09int=09=09=09= nCursorCompositeTypes;=09/*=200=20if=20none=20*/=0A+=09Oid=09=09=20=20=20= *cursorCompositeTypeOids;=0A+=09uint64=09=20=20=20= *cursorCompositeTypeVersions;=0A+=0A=20=09/*=0A=20=09=20*=20Outermost=20= ActiveSnapshot=20for=20execution=20of=20the=20portal's=20queries.=20=20= For=0A=20=09=20*=20all=20but=20a=20few=20utility=20commands,=20we=20= require=20such=20a=20snapshot=20to=20exist.=0Adiff=20--git=20= a/src/test/regress/expected/rowtypes.out=20= b/src/test/regress/expected/rowtypes.out=0Aindex=20= 956bc2d02fc..7f4c0567fce=20100644=0A---=20= a/src/test/regress/expected/rowtypes.out=0A+++=20= b/src/test/regress/expected/rowtypes.out=0A@@=20-1408,3=20+1408,57=20@@=20= ERROR:=20=20column=20"oid"=20not=20found=20in=20data=20type=20= compositetable=0A=20LINE=201:=20SELECT=20(NULL::compositetable).oid;=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20^=0A=20DROP=20TABLE=20= compositetable;=0A+--=20ALTER=20TYPE=20mid-cursor-scan=20must=20be=20= detected=20and=20raise=20an=20error.=0A+CREATE=20TYPE=20mycomptype=20AS=20= (a=20INT,=20b=20INT);=0A+BEGIN;=0A+DECLARE=20cur1=20CURSOR=20FOR=0A+=20=20= =20=20SELECT=20(i,=20i=20*=20100)::mycomptype=20FROM=20= generate_series(1,=205)=20i;=0A+FETCH=20cur1;=0A+=20=20=20row=20=20=20=0A= +---------=0A+=20(1,100)=0A+(1=20row)=0A+=0A+ALTER=20TYPE=20mycomptype=20= ALTER=20ATTRIBUTE=20b=20TYPE=20TEXT;=0A+FETCH=20cur1;=0A+ERROR:=20=20= cursor=20scan=20cannot=20continue=20after=20composite=20type=20= "mycomptype"=20was=20altered=0A+HINT:=20=20Close=20and=20reopen=20the=20= cursor=20after=20ALTER=20TYPE.=0A+COMMIT;=0A+DROP=20TYPE=20mycomptype;=0A= +--=20Same=20check=20applies=20when=20a=20nested=20composite=20type=20is=20= altered.=0A+CREATE=20TYPE=20myinnertype=20AS=20(x=20INT,=20y=20INT);=0A= +CREATE=20TYPE=20myoutertype=20AS=20(a=20INT,=20b=20myinnertype);=0A= +BEGIN;=0A+DECLARE=20cur2=20CURSOR=20FOR=0A+=20=20=20=20SELECT=20(i,=20= (i=20*=2010,=20i=20*=20100)::myinnertype)::myoutertype=0A+=20=20=20=20= FROM=20generate_series(1,=205)=20i;=0A+FETCH=20cur2;=0A+=20=20=20=20=20=20= row=20=20=20=20=20=20=20=0A+----------------=0A+=20(1,"(10,100)")=0A+(1=20= row)=0A+=0A+ALTER=20TYPE=20myinnertype=20ALTER=20ATTRIBUTE=20y=20TYPE=20= TEXT;=0A+FETCH=20cur2;=0A+ERROR:=20=20cursor=20scan=20cannot=20continue=20= after=20composite=20type=20"myinnertype"=20was=20altered=0A+HINT:=20=20= Close=20and=20reopen=20the=20cursor=20after=20ALTER=20TYPE.=0A+COMMIT;=0A= +DROP=20TYPE=20myoutertype;=0A+DROP=20TYPE=20myinnertype;=0A+--=20MOVE=20= goes=20through=20the=20same=20portal=20path=20and=20must=20also=20be=20= rejected.=0A+CREATE=20TYPE=20mycomptype2=20AS=20(a=20INT,=20b=20INT);=0A= +BEGIN;=0A+DECLARE=20cur3=20CURSOR=20FOR=0A+=20=20=20=20SELECT=20(i,=20= i)::mycomptype2=20FROM=20generate_series(1,=2010)=20i;=0A+FETCH=20cur3;=0A= +=20=20row=20=20=0A+-------=0A+=20(1,1)=0A+(1=20row)=0A+=0A+ALTER=20TYPE=20= mycomptype2=20ALTER=20ATTRIBUTE=20b=20TYPE=20TEXT;=0A+MOVE=20cur3;=0A= +ERROR:=20=20cursor=20scan=20cannot=20continue=20after=20composite=20= type=20"mycomptype2"=20was=20altered=0A+HINT:=20=20Close=20and=20reopen=20= the=20cursor=20after=20ALTER=20TYPE.=0A+COMMIT;=0A+DROP=20TYPE=20= mycomptype2;=0Adiff=20--git=20a/src/test/regress/sql/rowtypes.sql=20= b/src/test/regress/sql/rowtypes.sql=0Aindex=20174b062144a..4fad2bc1719=20= 100644=0A---=20a/src/test/regress/sql/rowtypes.sql=0A+++=20= b/src/test/regress/sql/rowtypes.sql=0A@@=20-562,3=20+562,39=20@@=20= SELECT=20(NULL::compositetable).a;=0A=20SELECT=20= (NULL::compositetable).oid;=0A=20=0A=20DROP=20TABLE=20compositetable;=0A= +=0A+--=20ALTER=20TYPE=20mid-cursor-scan=20must=20be=20detected=20and=20= raise=20an=20error.=0A+CREATE=20TYPE=20mycomptype=20AS=20(a=20INT,=20b=20= INT);=0A+BEGIN;=0A+DECLARE=20cur1=20CURSOR=20FOR=0A+=20=20=20=20SELECT=20= (i,=20i=20*=20100)::mycomptype=20FROM=20generate_series(1,=205)=20i;=0A= +FETCH=20cur1;=0A+ALTER=20TYPE=20mycomptype=20ALTER=20ATTRIBUTE=20b=20= TYPE=20TEXT;=0A+FETCH=20cur1;=0A+COMMIT;=0A+DROP=20TYPE=20mycomptype;=0A= +=0A+--=20Same=20check=20applies=20when=20a=20nested=20composite=20type=20= is=20altered.=0A+CREATE=20TYPE=20myinnertype=20AS=20(x=20INT,=20y=20= INT);=0A+CREATE=20TYPE=20myoutertype=20AS=20(a=20INT,=20b=20= myinnertype);=0A+BEGIN;=0A+DECLARE=20cur2=20CURSOR=20FOR=0A+=20=20=20=20= SELECT=20(i,=20(i=20*=2010,=20i=20*=20100)::myinnertype)::myoutertype=0A= +=20=20=20=20FROM=20generate_series(1,=205)=20i;=0A+FETCH=20cur2;=0A= +ALTER=20TYPE=20myinnertype=20ALTER=20ATTRIBUTE=20y=20TYPE=20TEXT;=0A= +FETCH=20cur2;=0A+COMMIT;=0A+DROP=20TYPE=20myoutertype;=0A+DROP=20TYPE=20= myinnertype;=0A+=0A+--=20MOVE=20goes=20through=20the=20same=20portal=20= path=20and=20must=20also=20be=20rejected.=0A+CREATE=20TYPE=20mycomptype2=20= AS=20(a=20INT,=20b=20INT);=0A+BEGIN;=0A+DECLARE=20cur3=20CURSOR=20FOR=0A= +=20=20=20=20SELECT=20(i,=20i)::mycomptype2=20FROM=20generate_series(1,=20= 10)=20i;=0A+FETCH=20cur3;=0A+ALTER=20TYPE=20mycomptype2=20ALTER=20= ATTRIBUTE=20b=20TYPE=20TEXT;=0A+MOVE=20cur3;=0A+COMMIT;=0A+DROP=20TYPE=20= mycomptype2;=0A--=20=0A2.51.2=0A=0A= --Apple-Mail=_AB639944-270B-4535-846D-7DC23B29410F--