Re: Change COPY ... ON_ERROR ignore to ON_ERROR ignore_row
jian he <jian.universality@gmail.com>
From: jian he <jian.universality@gmail.com>
To: Kirill Reshke <reshkekirill@gmail.com>
Cc: Fujii Masao <masao.fujii@oss.nttdata.com>,
Jim Jones <jim.jones@uni-muenster.de>, "David G. Johnston" <david.g.johnston@gmail.com>,
Yugo NAGATA <nagata@sraoss.co.jp>, torikoshia <torikoshia@oss.nttdata.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2024-11-16T08:26:00Z
Lists: pgsql-hackers
Attachments
- v8-0001-COPY-option-on_error-set_to_null.patch (text/x-patch) patch v8-0001
On Sat, Nov 9, 2024 at 8:55 PM Kirill Reshke <reshkekirill@gmail.com> wrote: > > > > But while I was trying to implement that, I realized that I don't > > > understand v4 of this patch. My misunderstanding is about > > > `t_on_error_null` tests. We are allowed to insert a NULL value for the > > > first column of t_on_error_null using COPY ON_ERROR SET_TO_NULL. Why > > > do we do that? My thought is we should try to execute > > > InputFunctionCallSafe with NULL value (i mean, here [1]) for the > > > column after we failed to insert the input value. And, if this second > > > call is successful, we do replacement, otherwise we count the row as > > > erroneous. > > > > Your concern is valid. Allowing NULL to be stored in a column with a NOT NULL > > constraint via COPY ON_ERROR=SET_TO_NULL does seem unexpected. As you suggested, > > NULL values set by SET_TO_NULL should probably be re-evaluated. > > Thank you. I updated the patch with a NULL re-evaluation. > take me sometime to understand your change with InputFunctionCallSafe. it actually works fine with domain, i think mainly because domain_in proisstrict is false and all other type input function proisstrict is true! --case1 create table t1(a dnn); copy t1 from stdin(on_error set_to_null); A \. --case2 create table t2(a int not null); copy t2 from stdin(on_error set_to_null); A \. I think it should be to either let domains with not-null behave the same as column level not-null or just insert NULL to a column with domain not-null constraint. in doc[1], we already mentioned that a column with a not-null domain is possible to have null value . https://www.postgresql.org/docs/current/sql-createdomain.html attached v8, based on your v7, main change it NextCopyFrom, InputFunctionCallSafe. The idea is when InputFunctionCallSafe fails, on_error set_to_null needs to check if this is a type as not-null domain. pass NULL string to InputFunctionCallSafe again to check if this type allows null or not. If not allow null then error out (ereport(ERROR)). i think this will align with column level not-null constraint, what do you guys think? i am mainly change copyfromparse.c's for now. other places no change, same as v7.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
file_fdw: Add regression test for file_fdw with ON_ERROR='set_null'
- d8879d34b9dd 19 (unreleased) landed
-
Add COPY (on_error set_null) option
- 2a525cc97e19 19 (unreleased) landed
-
Add REJECT_LIMIT option to the COPY command.
- 4ac2a9beceb1 18.0 cited
-
Add log_verbosity = 'silent' support to COPY command.
- e7834a1a251d 18.0 cited
-
Add new COPY option LOG_VERBOSITY.
- f5a227895e17 17.0 cited