Обсуждение: BUG #17464: Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot be intercepted.

Поиск
Список
Период
Сортировка

BUG #17464: Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot be intercepted.

От
PG Bug reporting form
Дата:
The following bug has been logged on the website:

Bug reference:      17464
Logged by:          Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot
be intercepted.
Email address:      dafoer_x@163.com
PostgreSQL version: 13.2
Operating system:   centos7.6 x86
Description:

Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot
be intercepted.
Because texteq cannot accept null input parameters,
op->d.domainCheck.checknull is set to the wrong value .

detail:
postgres=# call f3_basic('男');
NOTICE:  a_xb = 男
CALL
postgres=# call  f3_basic('她');
NOTICE:  a_xb = 她
CALL


eg.
drop domain xb;
CREATE DOMAIN xb AS TEXT CHECK
(
   VALUE = '男'
   OR VALUE ='女'
   OR VALUE = null
 );
drop procedure if exists f3_basic(a_xb xb);
CREATE OR REPLACE procedure f3_basic (a_xb xb)  AS
$$
BEGIN
 RAISE NOTICE 'a_xb = %',a_xb;
END;
$$
LANGUAGE PLPGSQL;
-- success
call f3_basic('男');
-- expected error
call  f3_basic('她');
drop procedure if exists f3_basic(a_xb xb);
drop domain xb;


Re: BUG #17464: Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot be intercepted.

От
"David G. Johnston"
Дата:
On Tue, Apr 12, 2022 at 7:16 AM PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged on the website:

Bug reference:      17464
Logged by:          Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot
be intercepted.
Email address:      dafoer_x@163.com
PostgreSQL version: 13.2
Operating system:   centos7.6 x86
Description:       

Domain type. If the value field(CREATE DOMAIN) is set to null, errors cannot
be intercepted.
Because texteq cannot accept null input parameters,
op->d.domainCheck.checknull is set to the wrong value .

I'm not really following, and don't have time to investigate this right now, but:

CREATE DOMAIN xb AS TEXT CHECK
(
   VALUE = '男'
   OR VALUE ='女'
   OR VALUE = null
 );


"VALUES = null" is simply wrong.  That isn't how one checks for null.  Use "IS NULL".  If that restores the correct behavior I'm unsure what we'd be willing to do to behave differently in the presence of the improper null test form.

David J.

"David G. Johnston" <david.g.johnston@gmail.com> writes:
> "VALUES = null" is simply wrong.  That isn't how one checks for null.  Use
> "IS NULL".  If that restores the correct behavior I'm unsure what we'd be
> willing to do to behave differently in the presence of the improper null
> test form.

There's already transform_null_equals, which does work if you turn it on
while executing this incorrect CREATE DOMAIN command.  But the better
answer is to fix your SQL.

regression=# set transform_null_equals = 1;
SET
regression=# CREATE DOMAIN xb AS TEXT CHECK
regression-# (
regression(#    VALUE = '男'
regression(#    OR VALUE ='女'
regression(#    OR VALUE = null
regression(#  );
CREATE DOMAIN
regression=# \dD+ xb
                                                                       List of domains
 Schema | Name | Type | Collation | Nullable | Default |                               Check
   | Access privileges | Description  

--------+------+------+-----------+----------+---------+--------------------------------------------------------------------+-------------------+-------------
 public | xb   | text |           |          |         | CHECK (VALUE = '男'::text OR VALUE = '女'::text OR VALUE IS
NULL)|                   |  
(1 row)


            regards, tom lane