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)
|
| 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: