Re: BUG #18203: Logical Replication initial sync failure

vignesh C <vignesh21@gmail.com>

From: vignesh C <vignesh21@gmail.com>
To: zzzzz.graf@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2023-11-20T09:23:16Z
Lists: pgsql-bugs

Attachments

On Sat, 18 Nov 2023 at 18:10, PG Bug reporting form
<noreply@postgresql.org> wrote:
>
> The following bug has been logged on the website:
>
> Bug reference:      18203
> Logged by:          Justin G
> Email address:      zzzzz.graf@gmail.com
> PostgreSQL version: 15.2
> Operating system:   Ubuntu 20
> Description:
>
> We’ve found an edge case that breaks logical replication.
>
> Procedure:
>
> alter system set wal_level to 'logical' ;
>
> create database source;  --pg 11
> create database destin; --pg 15
>
> create table no_col(); -- pg 11
>
> insert into no_col default values;
> insert into no_col default values;
> insert into no_col default values;
> insert into no_col default values;
> insert into no_col default values;
>
> CREATE PUBLICATION no_col_pub for table no_col;
>
> create table no_col(); --pg 15
>
> CREATE SUBSCRIPTION no_col_sub --pg15
>     CONNECTION
>         'host=<hostname/ip>
>         port=5432
>         user=<set username>
>         dbname=source
>         password=<set the password>'
>     PUBLICATION no_col_pub
>     WITH (
>         CREATE_SLOT    = TRUE,
>         ENABLED        = TRUE,
>         COPY_DATA    = TRUE
>         );
>
>
> We now have a table with 5 null rows. This is a valid table, pg_dump will
> dump it and restore it. count(*) will return 5.
>
> The dump file produced by pg_dump version 15 generates this SQL
> COPY public.no_col  FROM stdin;
>
> However, the copy command from PG 15 using logical replication includes (),
> which normally has a list of columns between the parentheses.
>
> COPY public.no_col () TO STDOUT
>
> Logical replication worker returns with the following error:
> 2023-11-17 20:40:16.141 UTC [151084] ERROR:  could not start initial
> contents copy for table "public.no_col": ERROR:  syntax error at or near
> ")"
>     LINE 1: COPY public.no_col () TO STDOUT

Thanks for reporting this issue, I was able to reproduce the issue.
This issue is happening because we are trying to specify the column
list while the table sync worker is copying data for the table.
I felt we should not specify the column list when the table has no columns.
Attached patch has the changes to handle the same.

Regards,
Vignesh

Commits

  1. Fix the initial sync tables with no columns.