Thread

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Fix parse_cte.c's failure to examine sub-WITHs in DML statements.

  1. BUG #18878: PostgreSQL triggers Assertion Failure in Debug build

    PG Bug reporting form <noreply@postgresql.org> — 2025-04-04T19:15:14Z

    The following bug has been logged on the website:
    
    Bug reference:      18878
    Logged by:          Yu Liang
    Email address:      luy70@psu.edu
    PostgreSQL version: 17.4
    Operating system:   Ubuntu 24.04 LTS ARM64 VM
    Description:        
    
    In the debug build of PostgreSQL 17.4, compiled with `configure
    --enable-debug --prefix=$(pwd) --exec-prefix=$(pwd) --enable-cassert`,
    triggered Assertion Failure when executing the following statement: 
    
    ```sql
    WITH RECURSIVE ta01 AS NOT MATERIALIZED ( WITH RECURSIVE any_cte_name AS
    MATERIALIZED ( TABLE ta01 ) DELETE FROM v00 RETURNING *, CASE WHEN FALSE
    THEN TRUE WHEN FALSE THEN TRUE ELSE TRUE END IDENT ) SELECT FROM JSON_ARRAY
    ( TABLE v00 ORDER BY CASE WHEN FALSE THEN TRUE END NULLS FIRST FOR READ
    ONLY) GROUP BY ROLLUP ( CASE WHEN FALSE NOT BETWEEN ASYMMETRIC CASE WHEN
    FALSE THEN TRUE END AND FALSE <> CASE WHEN EXISTS ( SELECT GROUP BY ALL ( )
    FOR READ ONLY ) > CASE WHEN FALSE THEN TRUE END THEN FALSE END IS NULL THEN
    ARRAY ( ( TABLE ta01 ) ) ELSE CASE WHEN TRUE BETWEEN EXISTS ( SELECT GROUP
    BY ALL ( ) FOR READ ONLY ) AND TRUE IS NOT FALSE > EXISTS ( SELECT ALL GROUP
    BY ( ) FOR READ ONLY ) THEN TRUE END > CASE WHEN FALSE THEN TRUE END END )
    FOR READ ONLY;
    ```
    
    The triggered assertion is: "cte->cterecursive || !rte->self_reference".
    "src/backend/parser/parse_relation.c", Line: 2338.
    
    
  2. Re: BUG #18878: PostgreSQL triggers Assertion Failure in Debug build

    Tom Lane <tgl@sss.pgh.pa.us> — 2025-04-05T19:07:28Z

    PG Bug reporting form <noreply@postgresql.org> writes:
    > In the debug build of PostgreSQL 17.4, compiled with `configure
    > --enable-debug --prefix=$(pwd) --exec-prefix=$(pwd) --enable-cassert`,
    > triggered Assertion Failure when executing the following statement: 
    
    > ```sql
    > WITH RECURSIVE ta01 AS NOT MATERIALIZED ( WITH RECURSIVE any_cte_name AS
    > MATERIALIZED ( TABLE ta01 ) DELETE FROM v00 RETURNING *, CASE WHEN FALSE
    > THEN TRUE WHEN FALSE THEN TRUE ELSE TRUE END IDENT ) SELECT FROM JSON_ARRAY
    > ( TABLE v00 ORDER BY CASE WHEN FALSE THEN TRUE END NULLS FIRST FOR READ
    > ONLY) GROUP BY ROLLUP ( CASE WHEN FALSE NOT BETWEEN ASYMMETRIC CASE WHEN
    > FALSE THEN TRUE END AND FALSE <> CASE WHEN EXISTS ( SELECT GROUP BY ALL ( )
    > FOR READ ONLY ) > CASE WHEN FALSE THEN TRUE END THEN FALSE END IS NULL THEN
    > ARRAY ( ( TABLE ta01 ) ) ELSE CASE WHEN TRUE BETWEEN EXISTS ( SELECT GROUP
    > BY ALL ( ) FOR READ ONLY ) AND TRUE IS NOT FALSE > EXISTS ( SELECT ALL GROUP
    > BY ( ) FOR READ ONLY ) THEN TRUE END > CASE WHEN FALSE THEN TRUE END END )
    > FOR READ ONLY;
    > ```
    
    This can be reduced to
    
    WITH RECURSIVE ta01 AS (
      WITH any_cte_name AS ( TABLE ta01 )
      DELETE FROM v00 RETURNING * )
    TABLE ta01;
    
    That should be rejected, because ta01 has a self-reference and is not
    in the allowed form "base-case UNION query-with-self-reference".
    However, we managed to miss the appearance of the self-reference
    because the code in charge of detecting it hadn't been taught that
    WITH is now allowed in INSERT/UPDATE/DELETE.  (Which is a bit
    disheartening, but there you have it.)
    
    Fixed, thanks for the report!
    
    			regards, tom lane