Thread: wrong error message related to unsupported feature

wrong error message related to unsupported feature

From
Pavel Stehule
Date:
Hi

I am playing with new features in Postgres 18.

Maybe I found a bug

(2025-03-18 19:28:06) postgres=# create table foo(a int constraint gzero check(a > 10) NOT ENFORCED);
CREATE TABLE
(2025-03-18 19:29:37) postgres=# insert into foo values(0);
INSERT 0 1
(2025-03-18 19:29:49) postgres=# insert into foo values(6);
INSERT 0 1
(2025-03-18 19:29:55) postgres=# alter table foo alter constraint gzero enforced;
ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
LINE 1: alter table foo alter constraint gzero enforced;

I know so altering enforcing constraint is not supported yet, but the error message is surely wrong

gzero is not foreign key constraint

Regards

Pavel

Re: wrong error message related to unsupported feature

From
Álvaro Herrera
Date:
On 2025-Mar-18, Pavel Stehule wrote:

> Maybe I found a bug
> 
> (2025-03-18 19:28:06) postgres=# create table foo(a int constraint gzero
> check(a > 10) NOT ENFORCED);
> CREATE TABLE
> (2025-03-18 19:29:37) postgres=# insert into foo values(0);
> INSERT 0 1
> (2025-03-18 19:29:49) postgres=# insert into foo values(6);
> INSERT 0 1
> (2025-03-18 19:29:55) postgres=# alter table foo alter constraint gzero
> enforced;
> ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
> LINE 1: alter table foo alter constraint gzero enforced;
> 
> I know so altering enforcing constraint is not supported yet, but the error
> message is surely wrong

Yep, this is a bug all right -- I reported this and related problems a
few days ago [1].  There's a proposal in that thread for how to fix this
(see Amul's email [2] and my followup), but I haven't had time to fully
implement it.  If you want to give it a couple of hours to complete it,
that'd be great.  I have a couple of patches that I need to handle
before coming back to that.

[1] https://postgr.es/m/202503041822.aobpqke3igvb@alvherre.pgsql
[2] https://postgr.es/m/CAAJ_b97hd-jMTS7AjgU6TDBCzDx_KyuKxG+K-DtYmOieg+giyQ@mail.gmail.com

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/



Re: wrong error message related to unsupported feature

From
Pavel Stehule
Date:
Hi

út 18. 3. 2025 v 21:33 odesílatel Álvaro Herrera <alvherre@alvh.no-ip.org> napsal:
On 2025-Mar-18, Pavel Stehule wrote:

> Maybe I found a bug
>
> (2025-03-18 19:28:06) postgres=# create table foo(a int constraint gzero
> check(a > 10) NOT ENFORCED);
> CREATE TABLE
> (2025-03-18 19:29:37) postgres=# insert into foo values(0);
> INSERT 0 1
> (2025-03-18 19:29:49) postgres=# insert into foo values(6);
> INSERT 0 1
> (2025-03-18 19:29:55) postgres=# alter table foo alter constraint gzero
> enforced;
> ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
> LINE 1: alter table foo alter constraint gzero enforced;
>
> I know so altering enforcing constraint is not supported yet, but the error
> message is surely wrong

Yep, this is a bug all right -- I reported this and related problems a
few days ago [1].  There's a proposal in that thread for how to fix this
(see Amul's email [2] and my followup), but I haven't had time to fully
implement it.  If you want to give it a couple of hours to complete it,
that'd be great.  I have a couple of patches that I need to handle
before coming back to that.

[1] https://postgr.es/m/202503041822.aobpqke3igvb@alvherre.pgsql
[2] https://postgr.es/m/CAAJ_b97hd-jMTS7AjgU6TDBCzDx_KyuKxG+K-DtYmOieg+giyQ@mail.gmail.com

I am looking this issue, and I am not sure if proposed way is the best

cannot we change processCASbits just like ?

   
    if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
    {
        if (deferrable)
            *deferrable = true;
        else if (constrType)
            ereport(ERROR,
                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
            /* translator: %s is CHECK, UNIQUE, or similar */
                     constrType ?
                     errmsg("%s constraints cannot be marked DEFERRABLE",
                            constrType) :
                     errmsg("constraint cannot be marked DEFERRABLE"),
                     parser_errposition(location)));
    }
    ...

Probably can be better to not try to read from catalog in this moment, and then we can accept so we don't know constraint type

Regards

Pavel
   








--
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/

Re: wrong error message related to unsupported feature

From
Pavel Stehule
Date:


čt 20. 3. 2025 v 22:30 odesílatel Pavel Stehule <pavel.stehule@gmail.com> napsal:
Hi

út 18. 3. 2025 v 21:33 odesílatel Álvaro Herrera <alvherre@alvh.no-ip.org> napsal:
On 2025-Mar-18, Pavel Stehule wrote:

> Maybe I found a bug
>
> (2025-03-18 19:28:06) postgres=# create table foo(a int constraint gzero
> check(a > 10) NOT ENFORCED);
> CREATE TABLE
> (2025-03-18 19:29:37) postgres=# insert into foo values(0);
> INSERT 0 1
> (2025-03-18 19:29:49) postgres=# insert into foo values(6);
> INSERT 0 1
> (2025-03-18 19:29:55) postgres=# alter table foo alter constraint gzero
> enforced;
> ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
> LINE 1: alter table foo alter constraint gzero enforced;
>
> I know so altering enforcing constraint is not supported yet, but the error
> message is surely wrong

Yep, this is a bug all right -- I reported this and related problems a
few days ago [1].  There's a proposal in that thread for how to fix this
(see Amul's email [2] and my followup), but I haven't had time to fully
implement it.  If you want to give it a couple of hours to complete it,
that'd be great.  I have a couple of patches that I need to handle
before coming back to that.

[1] https://postgr.es/m/202503041822.aobpqke3igvb@alvherre.pgsql
[2] https://postgr.es/m/CAAJ_b97hd-jMTS7AjgU6TDBCzDx_KyuKxG+K-DtYmOieg+giyQ@mail.gmail.com

I am looking this issue, and I am not sure if proposed way is the best

cannot we change processCASbits just like ?

   
    if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
    {
        if (deferrable)
            *deferrable = true;
        else if (constrType)
            ereport(ERROR,
                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
            /* translator: %s is CHECK, UNIQUE, or similar */
                     constrType ?
                     errmsg("%s constraints cannot be marked DEFERRABLE",
                            constrType) :
                     errmsg("constraint cannot be marked DEFERRABLE"),
                     parser_errposition(location)));
    }
    ...

Probably can be better to not try to read from catalog in this moment, and then we can accept so we don't know constraint type

something like attached patch

Regards

Pavel
 

Regards

Pavel
   








--
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/
Attachment