Re: CHECK that involves a function call behaves differently during bulk load?
David G. Johnston <david.g.johnston@gmail.com>
From: "David G. Johnston" <david.g.johnston@gmail.com>
To: Kirk Parker <khp@equatoria.us>
Cc: PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2025-03-13T21:05:19Z
Lists: pgsql-bugs
On Thursday, March 13, 2025, Kirk Parker <khp@equatoria.us> wrote:
>
>
> CREATE FUNCTION public.valid_upc_ean(target character varying) RETURNS
> boolean
> LANGUAGE plpgsql
> AS $$
> DECLARE
> len integer;
> holder varchar;
>
> begin
> if target is null then
> return true;
> end if;
> len = length(trim(target));
> if len = 12 then
> holder := target::upc;
> return true;
> elsif len = 13 then
> holder := target::ean13;
> return true;
> elsif len = 0 then
> return true;
> else
> return false;
> end if;
> exception when others then
> return false;
> end;
> $$;
>
> It's used like this:
>
> CREATE TABLE public.inv_variant
> (
> id integer NOT NULL,
> prod_id integer NOT NULL,
> sku character varying(126) NOT NULL,
> upc character varying(14),
> ...
> CONSTRAINT var_upc_check CHECK (public.valid_upc_ean(upc))
> );
>
> As mentioned about, the function fires and works perfectly once the data
> is loaded, but the bulk load gives this error:
>
> ERROR: new row for relation "inv_variant" violates check constraint
> "var_upc_check"
> DETAIL: Failing row contains (2264, 2170, BOX-1, 012345678912, ...
>
> Every row with NULL in this column inserts successfully, every one with
> data fails in this way. The data itself is valid -- I can copy the text
> starting with the '(' from the DETAIL: Failing row... message, paste it
> after "insert into inv_variant", and it executes perfectly--this in the
> very same psql where that exact set of insert data is failing on the
> redirected dump-file input.
>
> I am quite at a loss about how to even go about troubleshooting this.
>
Not discarding useful error messages as you do in the exception block is a
good start.
>
> Since valid_upc_ean() is a pure function with no side effects or
> references to anything other than the table in question,
>
>
And two non-core data types that lack schema qualifications.
David J.