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


Reply via email to