Re: POC PATCH: copy from ... exceptions to: (was Re: VLDB Features) - Mailing list pgsql-hackers

From torikoshia
Subject Re: POC PATCH: copy from ... exceptions to: (was Re: VLDB Features)
Date
Msg-id 16e09747fcfbb21c30e4c1009c416aa4@oss.nttdata.com
Whole thread Raw
In response to Re: POC PATCH: copy from ... exceptions to: (was Re: VLDB Features)  (Andres Freund <andres@anarazel.de>)
Responses Re: POC PATCH: copy from ... exceptions to: (was Re: VLDB Features)  (torikoshia <torikoshia@oss.nttdata.com>)
List pgsql-hackers
On 2023-03-23 02:50, Andres Freund wrote:
> Hi,
> 
> Tom, see below - I wonder if should provide one more piece of 
> infrastructure
> around the saved error stuff...
> 
> 
> Have you measured whether this has negative performance effects when 
> *NOT*
> using the new option?
> 
> 
> As-is this does not work with FORMAT BINARY - and converting the binary 
> input
> functions to support soft errors won't happen for 16. So I think you 
> need to
> raise an error if BINARY and IGNORE_DATATYPE_ERRORS are specified.
> 
> 
> On 2023-03-22 22:34:20 +0900, torikoshia wrote:
>> @@ -985,9 +986,28 @@ CopyFrom(CopyFromState cstate)
>> 
>>          ExecClearTuple(myslot);
>> 
>> +        if (cstate->opts.ignore_datatype_errors)
>> +        {
>> +            escontext.details_wanted = true;
>> +            cstate->escontext = escontext;
>> +        }
> 
> I think it might be worth pulling this out of the loop. That does mean 
> you'd
> have to reset escontext.error_occurred after an error, but that doesn't 
> seem
> too bad, you need to do other cleanup anyway.
> 
> 
>> @@ -956,10 +957,20 @@ NextCopyFrom(CopyFromState cstate, ExprContext 
>> *econtext,
>>                  values[m] = ExecEvalExpr(defexprs[m], econtext, &nulls[m]);
>>              }
>>              else
>> -                values[m] = InputFunctionCall(&in_functions[m],
>> -                                              string,
>> -                                              typioparams[m],
>> -                                              att->atttypmod);
>> +                /* If IGNORE_DATATYPE_ERRORS is enabled skip rows with datatype 
>> errors */
>> +                if (!InputFunctionCallSafe(&in_functions[m],
>> +                                           string,
>> +                                           typioparams[m],
>> +                                           att->atttypmod,
>> +                                           (Node *) &cstate->escontext,
>> +                                           &values[m]))
>> +                {
>> +                    cstate->ignored_errors++;
>> +
>> +                    ereport(WARNING,
>> +                            errmsg("%s", cstate->escontext.error_data->message));
> 
> That isn't right - you loose all the details of the message. As is 
> you'd also
> leak the error context.
> 
> I think the best bet for now is to do something like
>     /* adjust elevel so we don't jump out */
>     cstate->escontext.error_data->elevel = WARNING;
>     /* despite the name, this won't raise an error if elevel < ERROR */
>     ThrowErrorData(cstate->escontext.error_data);

Thanks for your reviewing!
I'll try to fix it this way for the time being.

> I wonder if we ought to provide a wrapper for this? It could e.g. know 
> to
> mention the original elevel and such?

-- 
Regards,

--
Atsushi Torikoshi
NTT DATA CORPORATION



pgsql-hackers by date:

Previous
From: Peter Smith
Date:
Subject: Re: PGdoc: add missing ID attribute to create_subscription.sgml
Next
From: gkokolatos@pm.me
Date:
Subject: Re: Add LZ4 compression in pg_dump