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.94.2) (envelope-from ) id 1tOaFT-007LDd-Jn for pgsql-general@arkaria.postgresql.org; Fri, 20 Dec 2024 10:28:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tOaFS-009Fwm-R2 for pgsql-general@arkaria.postgresql.org; Fri, 20 Dec 2024 10:28:46 +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.94.2) (envelope-from ) id 1tOKzj-00FjMH-UX for pgsql-general@lists.postgresql.org; Thu, 19 Dec 2024 18:11:31 +0000 Received: from zproxy5.mail3d.it ([212.78.3.138]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tOKzf-000Q73-4l for pgsql-general@lists.postgresql.org; Thu, 19 Dec 2024 18:11:30 +0000 Received: from zproxy5.mail3d.it (localhost.localdomain [127.0.0.1]) by zproxy5.mail3d.it (Postfix) with ESMTPS id 2007160B68; Thu, 19 Dec 2024 19:11:24 +0100 (CET) Received: from localhost (localhost.localdomain [127.0.0.1]) by zproxy5.mail3d.it (Postfix) with ESMTP id 03A9B60BA5; Thu, 19 Dec 2024 19:11:24 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.10.3 zproxy5.mail3d.it 03A9B60BA5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cleistech.it; s=1D99BE42-E8ED-11ED-9278-A8004466375A; t=1734631884; bh=0QCgkzroE7qKDweXDOxVLESKxkHvmubgHwPWfPcvoCM=; h=Message-ID:Date:MIME-Version:From:To; b=PZox+87xI8md95czcOoThTvtnybYk8480L2CRTzDCg/er1C4qfGuR7CPSWjuAAG6v b+ynxnTLb4aapMDgrg/xkihIMMzknhopjR5GDESaI/oUOK9LXjyd8zu9q/+QNOAHsH 5BUMHp8bA+TxbD3V7N8URoBfxb7/l8GE2eiDurkqkDB2OBUDoeWdtCjWdGo0gvBKDR VYfidGf8X43QRDj7VNnQJ7NKwPasGCQSXKDh0X6rOzwet0HKUbWb/j0KLbyS0bTF9V uG5FbVJtJjWUK+eClu9U5+AScC7SubCv+dHI2W2b7/Xk0j7UghQbCrHlFtaCqrBSAy YnqiKFQLrWrvQ== Received: from zproxy5.mail3d.it ([127.0.0.1]) by localhost (zproxy5.mail3d.it [127.0.0.1]) (amavis, port 10026) with ESMTP id IS_6ABYiRj6j; Thu, 19 Dec 2024 19:11:23 +0100 (CET) Received: from [192.168.0.50] (host-87-9-123-144.retail.telecomitalia.it [87.9.123.144]) by zproxy5.mail3d.it (Postfix) with ESMTPSA id 80A3D60B68; Thu, 19 Dec 2024 19:11:23 +0100 (CET) Content-Type: multipart/alternative; boundary="------------nQv9pCmnKGg0r4h0QT7BhSzZ" Message-ID: <282c2a48-bb12-4486-b03d-563523cac81b@cleistech.it> Date: Thu, 19 Dec 2024 19:11:23 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Enrico Schenone Subject: Re: Intermittent errors when fetching cursor rows on PostgreSQL 16 To: Adrian Klaver , pgsql-general@lists.postgresql.org Cc: Massimo Catti , Livio Pizzolo References: <446423eb-4a4e-4135-bbb8-4d0e5c7aac3b@cleistech.it> <25d5fb16-9bb2-4ad1-969c-eaca03ccbaaf@aklaver.com> <6ce80aaa-970b-4432-938a-39a07f811599@cleistech.it> <9f60eb26-7d34-4228-bd78-74c6deb90e54@aklaver.com> Content-Language: it In-Reply-To: <9f60eb26-7d34-4228-bd78-74c6deb90e54@aklaver.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------nQv9pCmnKGg0r4h0QT7BhSzZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Good day, Adrian. I get the error inside the program by catching the exception and logging=20 it with diagnostic info provided by the DVM (a runtime interpreter=20 similar in concept to a JVM) that embed the PG driver. This is the fragment of the source code=C2=A0 where the error occurs ...=20 comments are in blue color # composing the query string with hardcoded WHERE part. In other cases=20 the query is parametric and values are passed with the FOREACH (FOREACH=20 ... USING ...) LET l_qry =3D "SELECT * FROM quote_forn "|| =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 " WHE= RE evento_id=C2=A0 =3D "||t_qtf.evento_id|| =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 " and= bt_id =3D "||idhh_bt PREPARE q_stm FROM l_qry DECLARE c_cur CURSOR FOR q_stm TRY =C2=A0=C2=A0=C2=A0 LET c_qtf =3D ar_qtforn.getLength() =C2=A0=C2=A0=C2=A0 LET j =3D c_qtf # FOREACH is a code structure who simplifies the OPEN/FETCH/CLOSE=20 structure. It is translated at runtime to OPEN cursor ... FETCH rows ...=20 CLOSE cursor. =C2=A0=C2=A0=C2=A0 FOREACH c_cur INTO r_qtf.* =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FOR v =3D 1 TO c_qtf =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 IF ..= . ... THEN ... ... END IF =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 END FOR =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LET j =3D j + 1 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LET ar_qtforn[j].id=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D r_qtf.id =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... ... =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ... ... =C2=A0=C2=A0=C2=A0 END FOREACH CATCH =C2=A0=C2=A0=C2=A0 LET str_msg =3D "Some error message ... event: ", t_q= tf.evento_id, "=20 has failed. ", SQLERRMESSAGE, " - SQLSTATE: ", SQLSTATE # SQLSTATE is a=20 predefined variable containing the native PG SQLSTATE # Write an application log line (the one I have sent to you inside the=20 cross log comparison along the timeline) =C2=A0=C2=A0=C2=A0 CALL GesLog(NULL, 1, str_msg) END TRY ... ... ... ... After that the program tries a single-row SELECT on a table just to=20 check if it is still able to get data from DB, and it fails with=20 *SQLSTATE XX000* (what you see into the log fragment one millisecond=20 after the server log reports error *08003*). In some cases the query can be very complex and in other very simple, it=20 seems doesn't matters. As you can see the code is very simple, but 999 times it works fine and=20 one time it fail returning *XX001* for minutes, and in the meantime a=20 lot of SQL operations including FETCH cursor works well. I can't give you info on what the DVM does at low level, but I can send=20 you the distinct full session log fragment at server side, where it is=20 quite easy to understand how the DVM translates the program's SQL=20 queries end what PostgreSQL does. May I give you any other info ? Do you think it can be useful to include in this thread the 4Js Suppory=20 guys ? Thanks again and best regards. Enrico *Enrico Schenone* Software Architect *Cleis Tech s.r.l.* - www.gruppocleis.it Sede di Genova, Via Paolo Emilio Bensa, 2 - 16124 Genova, ITALY Tel: +39-0104071400 =C2=A0 Fax: +39-0104073276 Mobile: +39-320 7709352 E-mail: eschenone@cleistech.it Il 19/12/24 17:34, Adrian Klaver ha scritto: > On 12/18/24 23:52, Enrico Schenone wrote: >> Good day, Adrian. >> First of all I thank-you for you answer. > >> At the time the error occurs, dozens of other SQL sessions are active=20 >> & running on DB server, and no-one is reporting any error at-all (not=20 >> only fetch errors). >> This happens sometimes also in system with no (or low) stress=20 >> situations. >> >> One of things I don't understand is why at client side I get the=20 >> XX001 error on the FETCH (normally the first fetch) while at server=20 >> side I heve no error related to the fetch forward ? > > Where are you fetching the client error messages from? > >> Another is why in the meantime no other client application report an=20 >> error, considering that there may be several parallel instances of=20 >> the same client application ? >> And finally why after seconds or minutes the same process newly=20 >> instantiated works with no more errors ? > > Answers to this and the below is going to need the client code. > >> >> I can suppose that the client closes the connection once got the=20 >> XX001 error, but I can't say why it receives this error while it is=20 >> not reported at server side and not block i/o error is reported. >> Is it a false positive or what ? >> >> Four Js support said > vendor. In the case of PostgreSQL, we use the C API client -=20 >> https://www.postgresql.org/docs/current/libpq.html > >> >> At client side I have installed the following PostgreSQL packages ... >> >> =C2=A0=C2=A0=C2=A0=C2=A0 postgresql-client-16:amd64/jammy-pgdg 16.5-1.= pgdg22.04+1=20 >> upgradeable to 16.6-1.pgdg22.04+1 >> =C2=A0=C2=A0=C2=A0=C2=A0 postgresql-client-common:all/jammy-pgdg 262.p= gdg22.04+1=20 >> upgradeable to 267.pgdg22.04+1 >> >> Best regards. >> Enrico >> >> >> *Enrico Schenone* >> Software Architect >> >> *Cleis Tech s.r.l.* - www.gruppocleis.it >> Sede di Genova, Via Paolo Emilio Bensa, 2 - 16124 Genova, ITALY >> Tel: +39-0104071400 =C2=A0 Fax: +39-0104073276 >> Mobile: +39-320 7709352 >> E-mail: eschenone@cleistech.it >> >> >> >> >> >> Il 19/12/24 00:11, Adrian Klaver ha scritto: >>> On 12/17/24 08:30, Enrico Schenone wrote: >>>> Good day. >>>> My name is Enrico Schenone, from Genoa, Italy. >>>> I'm a software achitect working at Cleis Tech - Genoa - Italy=C2=A0 = -=20 >>>> http://gruppocleis.it >>>> Me and my team are using PostgreSQL v12 to v16 on Debian 10-12 and=20 >>>> Ubuntu Server 22.04 LTS with no-cluster configuration. >>>> Our applications are developed with 4Js Genero platform (classified=20 >>>> as LCAP) - https://4js.com >>>> >>>> I whish to report an issue where I can't say if it happens at=20 >>>> server or client side (or both as well). >>> >>> This: >>> >>> "unexpected EOF on client connection " >>> >>> makes me believe this is on client side. >>> >>> To be clear the client is running on Ubuntu Server 22.04, correct? >>> >>> Have you looked at the OS system log for relevant entries at the=20 >>> time the error occurs? >>> >>> If so what are they? >>> >>> This only happens in production environment, is there anything in it=20 >>> that is materially different from where you ran the test below? >>> >>> >>>> Hoping you can help me or address to someone who can do it. >>>> Thanks in advance. >>>> Enrico >>>> --=20 >>>> >>>> *Enrico Schenone* >>>> Software Architect >>>> >>> >> > --------------nQv9pCmnKGg0r4h0QT7BhSzZ Content-Type: multipart/related; boundary="------------z94O7T1orr8yaaQs0F9oPwgj" --------------z94O7T1orr8yaaQs0F9oPwgj Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Good day, Adrian.
I get the error inside the program by catching the exception and logging it with diagnostic info provided by the DVM (a runtime interpreter similar in concept to a JVM) that embed the PG driver.
This is the fragment of the source code=C2=A0 where the error occurs = ... comments are in blue color

# composi= ng the query string with hardcoded WHERE part. In other cases the query is parametric and values are passed with the FOREACH (FOREACH ... USING <argument list> ...)
LET l_qry =3D "SELECT * FROM quote_forn "||
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= " WHERE evento_id=C2=A0 =3D "||t_qtf.evento_id||
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= " and bt_id =3D "||idhh_bt
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0
PREPARE q_stm FROM l_qry
DECLARE c_cur CURSOR FOR q_stm
TRY =C2=A0
=C2=A0=C2=A0=C2=A0 LET c_qtf =3D ar_qtforn.getLength()
=C2=A0=C2=A0=C2=A0 LET j =3D c_qtf

=C2=A0=C2=A0=C2=A0 # FOREACH is a code st= ructure who simplifies the OPEN/FETCH/CLOSE structure. It is translated at runtime to OPEN cursor ... FETCH rows ... CLOSE cursor.<= br> =C2=A0=C2=A0=C2=A0 FOREACH c_cur INTO r_qtf.*
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FOR v =3D 1 TO c_qtf =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= IF ... ... THEN ... ... END IF
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 END FOR
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LET j =3D j + 1
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LET ar_qtforn[j].id=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D r_qtf.id
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... ...
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ... ...
=C2=A0=C2=A0=C2=A0 END FOREACH=C2=A0 =C2=A0

CATCH
=C2=A0=C2=A0=C2=A0 LET str_msg =3D "Some error message ... event:= ", t_qtf.evento_id, " has failed. ", SQLERRMESSAGE, " - SQLSTATE: ", SQLSTATE # SQLSTATE is a predefined variable containing the native PG SQLSTATE
=C2=A0=C2=A0=C2=A0 # Write an application= log line (the one I have sent to you inside the cross log comparison along the timeline)
=C2=A0=C2=A0=C2=A0 CALL GesLog(NULL, 1, str_msg)

END TRY
... ...
... ...

After that the program tries a single-row SELECT on a table just to check if it is still able to get data from DB, and it fails with SQLSTATE XX000 (what you see into the log fragment
one millisecond aft= er the server log reports error 08003<= font face=3D"monospace">).

In some cases the query can be very complex and in other very simple, it seems doesn't matters.
As you can see the code is very simple, but 999 times it works fine and one time it fail returning XX001 for minutes, and in the meantime a lot of SQL operations including FETCH cursor works well.
I can't give you info on what the DVM does at low level, but I can send you the distinct full session log fragment at server side, where it is quite easy to understand how the DVM translates the program's SQL queries end what PostgreSQL does.
May I give you any other info ?
Do you think it can be useful to include in this thread the 4Js Suppory guys ?

Thanks again and best regards.
Enrico


Enrico Schenone=
Software Architect

Cleis Tech s.r.l. - www.gruppocleis.it
Sede di Genova, Via Pao= lo Emilio Bensa, 2 - 16124 Genova, ITALY
Tel: +39-0104071400 =C2=A0 Fax: +39-0104073276
Mobile: +39-320 7709352
E-mail: eschenone@cleistech.it

Il 19/12/24 17:34, Adrian Klaver ha scritto:
On 12/18/24 23:52, Enrico Schenone wrote:
Good day, Adrian.
First of all I thank-you for you answer.

At the time the error occurs, dozens of other SQL sessions are active & running on DB server, and no-one is reporting any error at-all (not only fetch errors).
This happens sometimes also in system with no (or low) stress situations.

One of things I don't understand is why at client side I get the XX001 error on the FETCH (normally the first fetch) while at server side I heve no error related to the fetch forward ?

Where are you fetching the client error messages from?

Another is why in the meantime no other client application report an error, considering that there may be several parallel instances of the same client application ?
And finally why after seconds or minutes the same process newly instantiated works with no more errors ?

Answers to this and the below is going to need the client code.


I can suppose that the client closes the connection once got the XX001 error, but I can't say why it receives this error while it is not reported at server side and not block i/o error is reported.
Is it a false positive or what ?

Four Js support said <We use the standard C API provided by the DB vendor. In the case of PostgreSQL, we use the C API client - https://www.postgresql.org/docs/cu= rrent/libpq.html >

At client side I have installed the following PostgreSQL packages ...

=C2=A0=C2=A0=C2=A0=C2=A0 postgresql-client-16:amd64/jammy-pgdg 16= .5-1.pgdg22.04+1 upgradeable to 16.6-1.pgdg22.04+1
=C2=A0=C2=A0=C2=A0=C2=A0 postgresql-client-common:all/jammy-pgdg = 262.pgdg22.04+1 upgradeable to 267.pgdg22.04+1

Best regards.
Enrico


*Enrico Schenone*
Software Architect

*Cleis Tech s.r.l.* - www.gruppocleis.it
Sede di Genova, Via Paolo Emilio Bensa, 2 - 16124 Genova, ITALY
Tel: +39-0104071400 =C2=A0 Fax: +39-0104073276
Mobile: +39-320 7709352
E-mail: eschenone@cleistech.it

<https://gruppocleis.it><https://ibm.biz/BdqAJh>

<https://ibm.biz/BdqAJh>
<https://ibm.biz/BdqAJh>
Il 19/12/24 00:11, Adrian Klaver ha scritto:
On 12/17/24 08:30, Enrico Schenone wrote:
Good day.
My name is Enrico Schenone, from Genoa, Italy.
I'm a software achitect working at Cleis Tech - Genoa - Italy=C2=A0 - http://gruppocleis.it
Me and my team are using PostgreSQL v12 to v16 on Debian 10-12 and Ubuntu Server 22.04 LTS with no-cluster configuration.
Our applications are developed with 4Js Genero platform (classified as LCAP) - https://4js.com

I whish to report an issue where I can't say if it happens at server or client side (or both as well).

This:

"unexpected EOF on client connection "

makes me believe this is on client side.

To be clear the client is running on Ubuntu Server 22.04, correct?

Have you looked at the OS system log for relevant entries at the time the error occurs?

If so what are they?

This only happens in production environment, is there anything in it that is materially different from where you ran the test below?


Hoping you can help me or address to someone who can do it.
Thanks in advance.
Enrico
--=C2=A0

*Enrico Schenone*
Software Architect





--------------z94O7T1orr8yaaQs0F9oPwgj Content-Type: image/jpeg; name="LogoCleis" Content-Disposition: inline; filename="LogoCleis" Content-Id: Content-Transfer-Encoding: base64 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 4NIbBxd5at1id9z29vGzw//Z --------------z94O7T1orr8yaaQs0F9oPwgj Content-Type: image/png; name="HTTPS://IBM.BIZ/BDQAJH" Content-Disposition: inline; filename="HTTPS://IBM.BIZ/BDQAJH" Content-Id: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABmJLR0QA/wD/AP+gvaeTAAAA CXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsREAoxoj9qugAAABl0RVh0Q29tbWVudABD cmVhdGVkIHdpdGggR0lNUFeBDhcAAANiSURBVHja7d1LbuQwDEDB8cD3v7KzyCYJAqMtiAzJ rtqnPzYe1OBo5OO6rusf8Kv/LgEIBAQCAgGBgEBAICAQEAgIBBAIvOZ8+gfHcbT/0nfbz+6+ X/a2texrvXpdJtx3Kwj4iQUCAYGAQEAg0Ne588Uq/e/dSmPJiM9S6VpPvu9WEBAICAQEAgIB gUB9Z9YbTRh1ru70rbR7uNL7dbjvVhAQCAgEBAICAYFAfadLsEfE+HTCQQlWEBAICAQQCAgE BALRjHl/6HI+rdGxFQQEAgIBgYBAQCDAp7Qxb6XzW+90eexZpUfFTbjvVhAQCAgEBAICAYFA X1vHvNN3ikbs9F0d105/xJwVBAQCAgGBgEAAgcCrjqv7dssqF3Jx1Blx+IJbagUBgYBAQCAg EBAIvJPHu3krjTNXZY9BI3blrr5mxHfvsiN55btbQUAgIBAQCAgEBAL1Pd7NO2Hsuvr9sj/n hGvdfYxtBQGBgEBAICAQEAjUt/XQhohdndm7QbN33obc1ELXpfv1tIKAQEAgIBAQCAgE6ksb 867KPmQg+3O+82i8wwjYCgICAYGAQEAgIBCoL+3Qhkpn865651FuxDVzNi/4iQUCAYEAAgGB wA7nzherdMZulx2mXXblroo4R9fZvOAnFggEBAICAYEAXz0e81baldtlp+jqZ8neBZx9/5zN C35igUBAIIBAQCCww9azeW/faMDIssvjxLocrOFsXvATCwQCAgEEAgKBHR7v5jXOrP+a2dez y/2zgoBAQCAgEBAICARmStvN2+aCDD/zNnusXGmMbQUBgYBAQCAgEBAIzJS2m7eSu/Fil6l3 pZ2+k/+lwAoCAgGBgEBAICAQqO/c+WKVxn3Zjz2L+JyVrmelQzcyv4MVBAQCAgGBgEBAIFDf mfVGXQ5DWP0OEQcldHmUmhUEBAIIBAQCAgGBwF86XYLvVseuXUbAEd999TXvVBk5W0FAICAQ EAgIBAQC9RnzPhAxAr7T5e8iRrlVHiNnBQGBgEBAICAQEAjUlzbm7fKYruyzcrN3+kaMZCN2 3trNC35igUBAICAQQCDwqq1j3ulnu0bsdu1yzSqdg7z6dx7BBn5igUBAICAQEAjMdFxdttmC FQQEAgIBgYBAQCCAQEAgIBAQCAgEBAItfQAWP4GprOsaxgAAAABJRU5ErkJggg== --------------z94O7T1orr8yaaQs0F9oPwgj-- --------------nQv9pCmnKGg0r4h0QT7BhSzZ--