Обсуждение: 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