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 1wS5LR-002wUD-03 for pgsql-hackers@arkaria.postgresql.org; Wed, 27 May 2026 03:54:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wS5LO-006y5R-35 for pgsql-hackers@arkaria.postgresql.org; Wed, 27 May 2026 03:54:11 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wS5LO-006y5I-26 for pgsql-hackers@lists.postgresql.org; Wed, 27 May 2026 03:54:11 +0000 Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wS5LN-00000001d8Q-1SWV for pgsql-hackers@lists.postgresql.org; Wed, 27 May 2026 03:54:11 +0000 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-8383fb7143aso4963969b3a.3 for ; Tue, 26 May 2026 20:54:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779854047; cv=none; d=google.com; s=arc-20240605; b=R634bsT3+GJvtPyKguUavoMTKvZmDeIsgcfu96dYQcl6OXOF5cMF7TYNj5z7pnPw/u w9E3OzQrrW6OigTCbYZvCkwUaskh7iea9TpGNS23TKfuLZGCRSkabl2vZoXuYo38RMiX BLkXKjQIUGsCaKLBT2+dYjHQV7tePn+8WpKiN008Sn8epiFozLka5A1Y4hzXSvj3rzQJ 9e0ltzL4NyZIBTAdNMsXCLQjjJpXu1XEexOK/r+0byRi9e6S3ZJGgeNeyNlgKzb2ehrI 95jU5VIGmlpdsw1f2QgWzG2bynKyyrJBzsL1ZV1y6LnXxhEJlGR0sZulbTMyf5FKMzgh LXAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=o5jwYCQk3QEleR041s0mmIpx7XlYM4cMtnqrf8FNob4=; fh=ihDdDlopXT7anY+yHFwHVlPtvLKX/w/308ntXMxPC6M=; b=bpDZX8Ng2aA8ITasd7Tqwv4xZEj2dDPN9XstdE9k+MtF/RE97mSoI7eyrceZfCU2jj mIxu/udQlK/KyftJTNG1Y+TZhjyy0OXWYO8gm1GlCycP1opUCyZ7vWJCOBkKgv5Rc1Lr HDRUTjEgN4oRjKCGg26ByDRTYkAJ15G+MF6IbMxzq3sA1xAJocJ9DMWohCX/jaQnA6qv g7AzwSbyBnpWB86tTaZxoc9WenkFu3KWxq//qLZWsg/wkRcSByVcswxc+u82lKsvmq4j isIatWw9KE8DZcOv+BDrbSVdJZufDztKIADCtvtQUmClrPtKjwX9mDRbluxSVUvUAZyZ bagg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779854047; x=1780458847; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=o5jwYCQk3QEleR041s0mmIpx7XlYM4cMtnqrf8FNob4=; b=mwaYk/8SkBX8/Jd3NmFuRAhQ/9Xsyt7ydklkotwWXGGx+O1Y/jgdMtQbN8m62KeLAa SgLurjWHgU1DaOPRZwNSq6kge82Z80Q6ulxElT7LmGmjTLv/Dwup4z+hPAxq8gIFNIxJ Hdf+XLitWDJll/evhlMyXldkVFbfPGqc456P4VCUg2TNtWU8q1c6K5Wv1xmxyoVFp3WL hgYZEwtenmIF0Fv+u1jkOYs2VWwOl0vIztLQmb4fKYnbW7QLphAXsKBJb69REyRUmA8S xvYfvnNkPQqk0y0NcgtvZdfxw7zeB3uzVJbE9VdM3kiSfeUcXlQpdVq24mwFxN76EMvh fdmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779854047; x=1780458847; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=o5jwYCQk3QEleR041s0mmIpx7XlYM4cMtnqrf8FNob4=; b=C8K7Q7h4MXPx01XBGTGYMfdVAouPIhXC6N3KYG5taN5VeixGuZjWKnYNZDeESTvkvo VyQDVZSfueZUyYZyskkFykXjootkwzAltX+kn9twYfsBJaKnRewETe9LybGahUWYpSfg 2UgI08JjAAytsBlQAy2KYlQZhND1VNKm0v+05XPzCmV9kgxKYHoRz2NDmohiMQyeSQPu 3OztknMlY6UOWFSbZXa+y2YCzIAze+WXKbsYEPZAN8O1uU2UFM5rHkrFYLxNxiUlWWsT TF5HX8PZQy2lnPukkEqlodKKkeirn08wKVgO79o12kee02Pqv0rjPEACI70eH290MVrv 2W8w== X-Forwarded-Encrypted: i=1; AFNElJ9HDeOlrRypGR6i06N7N6yllaSW/KNsbFphwqqFjrVrOLW2CdwQv9a5ZQkC73gL08p/9iuTKXMByVIELAYN@lists.postgresql.org X-Gm-Message-State: AOJu0Ywu3ZDWX/UGbYBaeznnBailDkppjeG6nXsdbWAya1WTdWoOkXYk LgsHGWR54mfIzxeQ6YBrzjDfUeVyWL3zd5Vqwq/qA19bjqNm/XgcXfWIsAcluRJaaxd+bT/ZfjU JB9s/z/tfY8niRupGzWQt99rtb7HdVtg= X-Gm-Gg: Acq92OFgZqNsM/P0Zanjw1izhwJyDbMS7J9N6HYuCVHvb1SZ7yV6wc9swzc4mn0qwF1 ljQglMyALkr0vGvvmIiOHp9Uo2V8DYL0fwOHOOq1f//my2HSPeqLek+sVaURme6KlReOhgecoDs 6K/J8nNUtzsrGEb6MxFj7qDKsJOdfAjdmDVrE6C9gBKQKJJUcBOIhY85pWztejN4ZSomgRjDg2l TdTsLFKBUVGL2IEdayJA7jV9xA67AQZMP6bKuCoSwP9uvQ3NxUKyrizWRaKhTGsZTBevDJXTss4 YH28h2ae3VkJlutt/fqXg7CcPznwmfRUT3fynaVa91/3yBW5TUTp X-Received: by 2002:a05:6a00:2e1f:b0:82f:5c3f:94c6 with SMTP id d2e1a72fcca58-8415f5a60f1mr20205464b3a.28.1779854046971; Tue, 26 May 2026 20:54:06 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: shveta malik Date: Wed, 27 May 2026 09:23:54 +0530 X-Gm-Features: AVHnY4KIaMQiL4kERMJm77IemOD-k2yw1Fb3jHmS4foFII31eykz9dD_7iFfaGE Message-ID: Subject: Re: [PATCH] Release replication slot on error in SQL-callable slot functions To: SATYANARAYANA NARLAPURAM Cc: vignesh C , Fujii Masao , PostgreSQL Hackers , shveta malik Content-Type: multipart/mixed; boundary="0000000000003920060652c49032" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003920060652c49032 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, May 26, 2026 at 1:41=E2=80=AFPM SATYANARAYANA NARLAPURAM wrote: > > Hi, > > On Mon, May 25, 2026 at 10:50=E2=80=AFPM shveta malik wrote: >> >> On Tue, May 26, 2026 at 10:06=E2=80=AFAM shveta malik wrote: >> > >> > On Tue, May 26, 2026 at 12:31=E2=80=AFAM SATYANARAYANA NARLAPURAM >> > wrote: >> > > >> > > Hi, >> > > >> > > On Mon, May 25, 2026 at 2:58=E2=80=AFAM shveta malik wrote: >> > >> >> > >> On Mon, May 25, 2026 at 12:42=E2=80=AFPM SATYANARAYANA NARLAPURAM >> > >> wrote: >> > >> > >> > >> > Hi >> > >> > >> > >> > On Fri, May 22, 2026 at 2:16=E2=80=AFAM shveta malik wrote: >> > >> >> >> > >> >> Thanks for reporting the issue. I could reproduce the same issue= with >> > >> >> all these as well: >> > >> >> >> > >> >> pg_logical_slot_peek_changes >> > >> >> pg_logical_slot_get_binary_changes >> > >> >> pg_logical_slot_peek_binary_changes >> > >> > >> > >> > >> > >> > Please find the attached v2 patch that addressed these three case= s as well. >> > >> > >> > >> >> > >> Thank You for addressuing these cases. A few comments: >> > >> >> > >> 1) >> > >> >> > >> +-- Test 2: session remains usable after the error (MyReplicationSl= ot cleared) >> > >> >> > >> It shoudl be part of 'Test 1' itself and thus should not be named a= s 'Test 2' >> > >> >> > >> 2) >> > >> -------- >> > >> +-- Test 4: copy_replication_slot with max_replication_slots exceed= ed. >> > >> +-- We reduce max_replication_slots artificially by filling all rem= aining slots. >> > >> +-- Instead, trigger an error by copying to an already-existing nam= e. >> > >> +DO $$ >> > >> +BEGIN >> > >> + PERFORM pg_copy_logical_replication_slot('regression_slot_t3', >> > >> 'regression_slot_t3'); >> > >> +EXCEPTION WHEN OTHERS THEN >> > >> + RAISE NOTICE 'caught: %', SQLERRM; >> > >> +END; >> > >> +$$; >> > >> +-- The original slot must still exist and be usable >> > >> +SELECT count(*) =3D 1 AS orig_slot_ok FROM pg_replication_slots >> > >> + WHERE slot_name =3D 'regression_slot_t3'; >> > >> ----------- >> > >> >> > >> I don't think we can hit the Assert with above test (at-least I cou= ld >> > >> not). Since creation of slot itself will fail as the slot with >> > >> same-name already exists, MyReplicationSlot will never be set and t= hus >> > >> Assert will not be hit. A better testcase will be below which fail= s >> > >> during LoadOutputPlugin() after slot-creation and MyReplicationSlot= is >> > >> set already. >> > >> >> > >> SELECT pg_create_logical_replication_slot('src_slot', 'test_decodin= g'); >> > >> >> > >> DO $$ >> > >> BEGIN >> > >> PERFORM pg_copy_logical_replication_slot('src_slot', 'dst_slot', >> > >> false, 'nonexistent_plugin'); >> > >> EXCEPTION WHEN others THEN >> > >> RAISE NOTICE 'caught: %', SQLERRM; >> > >> END $$; >> > >> >> > >> SELECT count(*) FROM pg_logical_slot_get_changes('src_slot', NULL, = NULL); >> > >> >> > >> 3) >> > >> So overall these are the problematic APIs: >> > >> >> > >> pg_create_logical_replication_slot >> > >> pg_replication_slot_advance >> > >> pg_copy_logical_replication_slot >> > >> pg_logical_slot_peek_binary_changes >> > >> pg_logical_slot_peek_changes >> > >> pg_logical_slot_get_changes >> > >> pg_logical_slot_get_binary_changes >> > >> >> > >> First 3 are are mutually exclusive fixes fow which we have added >> > >> testcases. Last 4 are addressed by fixing common function >> > >> pg_logical_slot_get_changes_guts(). I think we should add a test ca= se >> > >> for at-least any one of these APIs to cover >> > >> pg_logical_slot_get_changes_guts(). >> > > >> > > >> > > Thanks for reviewing. Please review the attached v3 patch. >> > > >> > >> > A few trivial things: >> > >> > 1) >> > pg_replication_slot_advance: >> > + PG_TRY(); >> > + { >> > + /* Acquire the slot so we "own" it */ >> > + ReplicationSlotAcquire(NameStr(*slotname), true, true); >> > + /* A slot whose restart_lsn has never been reserved cannot be advanc= ed */ >> > + if (!XLogRecPtrIsValid(MyReplicationSlot->data.restart_lsn)) >> > >> > >> > We can have a blank line after ReplicationSlotAcquire for better reada= bility. >> > >> > 2) >> > >> > +SELECT 'init' FROM >> > pg_create_logical_replication_slot('regression_slot_t3', >> > 'test_decoding', true); >> > +SELECT count(*) =3D 1 AS slot_exists FROM pg_replication_slots >> > + WHERE slot_name =3D 'regression_slot_t3'; >> > >> > The intent is not clear why are we checking existence of >> > regression_slot_t3? I think we can skip it (or else add a comment if >> > really needed). The success of previous >> > pg_create_logical_replication_slot is enough to confirm that session >> > is healthy to run other slot related queries. >> > >> > 3) >> > +SELECT pg_drop_replication_slot('regression_slot_phy'); >> > + >> > +-- cleanup >> > +SELECT pg_drop_replication_slot('regression_slot_t3'); >> > >> > We can move drop of 'regression_slot_phy' too under '-- cleanup' >> > >> > ~~ >> > >> > I have no further comments other than the trivial things mentioned abo= ve. >> > >> >> Missed to inform this earlier, I am not able to apply any version of >> the patches shared so far with 'git am'. It gives error, 'patch -p1' >> works. >> >> git am v3-0001-Release-replication-slot-on-error-in-slot-SQL-functions.p= atch >> Patch format detection failed. > > Thanks , Shveta! Please find the attached v4 patch that addressed your co= mments. > Thank You for the patch. I noticed that we are creating regression_slot_t3 as a a temporary slot, is that intentional? I think creating a permanent slot here will be a better testcase. I have made a few cosmetic changes for better readability along with creating the 'permanent' regression_slot_t3 slot. Please incorporate what you think is okay. I have no more comments. thanks Shveta --0000000000003920060652c49032 Content-Type: text/plain; charset="US-ASCII"; name="0001-top-up-changes.patch.txt" Content-Disposition: attachment; filename="0001-top-up-changes.patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpnj4jw80 RnJvbSBmZDRlOGY3MzFmYmZhNWNjZWY4ODMzOGQ2ZmEzOWZlMmIyYTE4MjBiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTaHZldGEgTWFsaWsgPHNodmV0YS5tYWxpa0BnbWFpbC5jb20+ CkRhdGU6IFdlZCwgMjcgTWF5IDIwMjYgMDk6MTg6NTAgKzA1MzAKU3ViamVjdDogW1BBVENIXSB0 b3AtdXAgY2hhbmdlcwoKLS0tCiBjb250cmliL3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3FsICB8 IDExICsrKysrKysrKy0tCiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3MuYyB8ICAz ICsrKwogMiBmaWxlcyBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdF9kZWNvZGluZy9zcWwvc2xvdC5zcWwgYi9jb250cmli L3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3FsCmluZGV4IGVhYmJlMDVjYzkwLi5kOGUwYWRjY2Jm YiAxMDA2NDQKLS0tIGEvY29udHJpYi90ZXN0X2RlY29kaW5nL3NxbC9zbG90LnNxbAorKysgYi9j b250cmliL3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3FsCkBAIC0yMDYsMTQgKzIwNiwxOCBAQCBF WENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgogICAgIFJBSVNFIE5PVElDRSAnY2F1Z2h0OiAlJywg U1FMRVJSTTsKIEVORDsKICQkOworCistLSB0aGUgY29uY2VybmVkIHNsb3QgbXVzdCBub3QgZXhp c3QgKGl0IHdhcyBkcm9wcGVkIG9uIGVycm9yKQogU0VMRUNUIGNvdW50KCopID0gMCBBUyBzbG90 X3dhc19kcm9wcGVkIEZST00gcGdfcmVwbGljYXRpb25fc2xvdHMKICAgICBXSEVSRSBzbG90X25h bWUgPSAncmVncmVzc2lvbl9zbG90X2Vycm9yJzsKIAotU0VMRUNUICdpbml0JyBGUk9NIHBnX2Ny ZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3QoJ3JlZ3Jlc3Npb25fc2xvdF90MycsICd0ZXN0 X2RlY29kaW5nJywgdHJ1ZSk7CistLSB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB1c2FibGUKK1NFTEVD VCAnaW5pdCcgRlJPTSBwZ19jcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNz aW9uX3Nsb3RfdDMnLCAndGVzdF9kZWNvZGluZycsIGZhbHNlKTsKIAogLS0gcGdfcmVwbGljYXRp b25fc2xvdF9hZHZhbmNlOiBlcnJvciBhZnRlciBhY3F1aXJpbmcgdGhlIHNsb3Qgc2hvdWxkCiAt LSByZWxlYXNlIGl0IHNvIHRoZSBzZXNzaW9uIHN0YXlzIHVzYWJsZS4KIFNFTEVDVCBzbG90X25h bWUgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoJ3JlZ3Jlc3Npb25fc2xvdF90Mycs IHBnX2N1cnJlbnRfd2FsX2xzbigpKTsKKwogRE8gJCQKIEJFR0lOCiAgICAgUEVSRk9STSBwZ19y ZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoJ3JlZ3Jlc3Npb25fc2xvdF90MycsICcwLzEnKTsKQEAg LTIyMSw3ICsyMjUsOCBAQCBFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgogICAgIFJBSVNFIE5P VElDRSAnY2F1Z2h0IGV4cGVjdGVkIGVycm9yJzsKIEVORDsKICQkOwotLS0gdGhlIHNlc3Npb24g aXMgc3RpbGwgaGVhbHRoeQorCistLSB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB1c2FibGUKIFNFTEVD VCBzbG90X25hbWUgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoJ3JlZ3Jlc3Npb25f c2xvdF90MycsIHBnX2N1cnJlbnRfd2FsX2xzbigpKTsKIAogLS0gcGdfY29weV9sb2dpY2FsX3Jl cGxpY2F0aW9uX3Nsb3Q6IGVycm9yIGFmdGVyIGNyZWF0aW5nIHRoZSBkZXN0aW5hdGlvbgpAQCAt MjMzLDkgKzIzOCwxMSBAQCBFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgogICAgIFJBSVNFIE5P VElDRSAnY2F1Z2h0OiAlJywgU1FMRVJSTTsKIEVORDsKICQkOworCiAtLSB0aGUgZGVzdGluYXRp b24gc2xvdCBtdXN0IG5vdCBleGlzdCAoaXQgd2FzIGRyb3BwZWQgb24gZXJyb3IpCiBTRUxFQ1Qg Y291bnQoKikgPSAwIEFTIGRzdF9zbG90X2Ryb3BwZWQgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90 cwogICAgIFdIRVJFIHNsb3RfbmFtZSA9ICdyZWdyZXNzaW9uX3Nsb3RfZHN0JzsKKwogLS0gdGhl IHNlc3Npb24gaXMgc3RpbGwgdXNhYmxlCiBTRUxFQ1QgY291bnQoKikgPj0gMCBBUyBjaGFuZ2Vz X29rIEZST00gcGdfbG9naWNhbF9zbG90X2dldF9jaGFuZ2VzKCdyZWdyZXNzaW9uX3Nsb3RfdDMn LCBOVUxMLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vc2xv dGZ1bmNzLmMgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3MuYwppbmRleCA5YmE5 YmQ4OTJlNi4uZDMyZTkxODdiOTUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9u L3Nsb3RmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3RmdW5jcy5jCkBA IC0xOTQsNiArMTk0LDcgQEAgY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChjaGFyICpu YW1lLCBjaGFyICpwbHVnaW4sCiAJCSAqLwogCQlpZiAoTXlSZXBsaWNhdGlvblNsb3QgIT0gTlVM TCkKIAkJCVJlcGxpY2F0aW9uU2xvdERyb3BBY3F1aXJlZCgpOworCiAJCVBHX1JFX1RIUk9XKCk7 CiAJfQogCVBHX0VORF9UUlkoKTsKQEAgLTYzMyw2ICs2MzQsNyBAQCBwZ19yZXBsaWNhdGlvbl9z bG90X2FkdmFuY2UoUEdfRlVOQ1RJT05fQVJHUykKIAl7CiAJCWlmIChNeVJlcGxpY2F0aW9uU2xv dCAhPSBOVUxMKQogCQkJUmVwbGljYXRpb25TbG90UmVsZWFzZSgpOworCiAJCVBHX1JFX1RIUk9X KCk7CiAJfQogCVBHX0VORF9UUlkoKTsKQEAgLTg5Niw2ICs4OTgsNyBAQCBjb3B5X3JlcGxpY2F0 aW9uX3Nsb3QoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sIGJvb2wgbG9naWNhbF9zbG90KQogCQkg Ki8KIAkJaWYgKE15UmVwbGljYXRpb25TbG90ICE9IE5VTEwpCiAJCQlSZXBsaWNhdGlvblNsb3RE cm9wQWNxdWlyZWQoKTsKKwogCQlQR19SRV9USFJPVygpOwogCX0KIAlQR19FTkRfVFJZKCk7Ci0t IAoyLjM0LjEKCg== --0000000000003920060652c49032--