Re: BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands
Date
Msg-id YtCrjN0HLew0w4Ss@momjian.us
Whole thread Raw
In response to BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
Did we make any decision on this?

---------------------------------------------------------------------------

On Fri, Mar 11, 2022 at 11:11:54AM +0000, PG Bug reporting form wrote:
> The following bug has been logged on the website:
> 
> Bug reference:      17434
> Logged by:          Yugo Nagata
> Email address:      nagata@sraoss.co.jp
> PostgreSQL version: 14.2
> Operating system:   Ubuntu
> Description:        
> 
> CREATE/DROP DATABASE can be executed in the same transaction with other
> commands when we use pipeline mode in pgbench or libpq API. If the
> transaction aborts, this causes an inconsistency between the system catalog
> and base directory.
> 
> Here is an example using the pgbench /startpipeline meta command.
> 
> ----------------------------------------------------
> (1)  Confirm that there are four databases from psql and directories in
> base.
> 
> $ psql -l
>                                  List of databases
>    Name    | Owner  | Encoding |   Collate   |    Ctype    |   Access
> privileges   
> -----------+--------+----------+-------------+-------------+-----------------------
>  postgres  | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
>  template0 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  template1 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  test0     | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
> (4 rows)
> 
> $ ls data/base/
> 1  13014  13015  16409  pgsql_tmp
> 
> (2) Execute CREATE DATABASE in a transaction, and the transaction fails.
> 
> $ cat pipeline_createdb.sql 
> \startpipeline
> create database test;
> select 1/0;
> \endpipeline
> 
> $ pgbench -t 1 -f pipeline_createdb.sql -M extended
> pgbench (14.2)
> starting vacuum...end.
> pgbench: error: client 0 script 0 aborted in command 3 query 0: 
> ....
> 
> (3) There are still four databases but a new directory was created in
> base.
> 
> $ psql -l
>                                  List of databases
>    Name    | Owner  | Encoding |   Collate   |    Ctype    |   Access
> privileges   
> -----------+--------+----------+-------------+-------------+-----------------------
>  postgres  | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
>  template0 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  template1 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  test0     | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
> (4 rows)
> 
> $ ls data/base/
> 1  13014  13015  16409  16411  pgsql_tmp
> 
> (4) Next, execute DROP DATABASE in a transaction, and the transaction
> fails.
> 
> $ cat pipeline_dropdb.sql 
> \startpipeline
> drop database test0;
> select 1/0;
> \endpipeline
> 
> $ pgbench -t 1 -f pipeline_dropdb.sql -M extended
> pgbench (14.2)
> starting vacuum...end.
> pgbench: error: client 0 script 0 aborted in command 3 query 0:
> ...
> 
> (5) There are still four databases but the corresponding directory was
> deleted in base.
> 
> $ psql -l
>                                  List of databases
>    Name    | Owner  | Encoding |   Collate   |    Ctype    |   Access
> privileges   
> -----------+--------+----------+-------------+-------------+-----------------------
>  postgres  | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
>  template0 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  template1 | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"    
>      +
>            |        |          |             |             |
> "yugo-n"=CTc/"yugo-n"
>  test0     | yugo-n | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
> (4 rows)
> 
> $ ls data/base/
> 1  13014  13015  16411  pgsql_tmp
> 
> (6) We cannot connect the database "test0".
> 
> $ psql test0
> psql: error: connection to server on socket "/tmp/.s.PGSQL.25435" failed:
> FATAL:  database "test0" does not exist
> DETAIL:  The database subdirectory "base/16409" is missing.
> ----------------------------------------------------
> 
> Detailed discussions are here;
> https://www.postgresql.org/message-id/20220301151704.76adaaefa8ed5d6c12ac3079@sraoss.co.jp
> 


-- 
  Bruce Momjian  <bruce@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

  Indecision is a decision.  Inaction is an action.  Mark Batterson




pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: BUG #17496: to_char function resets if interval exceeds 23 hours 59 minutes
Next
From: Jeff Davis
Date:
Subject: [15] Custom WAL resource managers, single user mode, and recovery