Re: Misleading error message in logical decoding for binary plugins - Mailing list pgsql-hackers

From Andres Freund
Subject Re: Misleading error message in logical decoding for binary plugins
Date
Msg-id 20140829143957.GB10109@awork2.anarazel.de
Whole thread Raw
In response to Re: Misleading error message in logical decoding for binary plugins  (Michael Paquier <michael.paquier@gmail.com>)
Responses Re: Misleading error message in logical decoding for binary plugins
List pgsql-hackers
On 2014-08-29 23:31:49 +0900, Michael Paquier wrote:
> On Fri, Aug 29, 2014 at 11:15 PM, Andres Freund <andres@2ndquadrant.com>
> wrote:
> 
> > No, a textual output plugin is *NOT* allowed to produce binary
> > output. That'd violate e.g. pg_logical_slot_peek_changes's return type
> > because it's only declared to return text.
> >
> 
> A textual output plugin can call pg_logical_slot_peek_binary_changes and
> pg_logical_slot_peek_changes as well,

Well, for one a output plugin doesn't call
pg_logical_slot_peek_binary_changes, it's the other way round. And sure:
Every text is also "binary". So that's just fine.

> and a binary output plugin can only call
> pg_logical_slot_peek_binary_changes, and will error out with
> pg_logical_slot_peek_changes:
> =# select pg_create_logical_replication_slot('foo', 'test_decoding');
>  pg_create_logical_replication_slot
> ------------------------------------
>  (foo,0/16C6880)
> (1 row)
> =# create table aa as select 1;
> SELECT 1
> =# select substring(encode(data, 'escape'), 1, 20),
>                substring(data, 1, 20)
>      FROM pg_logical_slot_peek_binary_changes('foo', NULL, NULL);
>       substring       |                 substring
> ----------------------+--------------------------------------------
>  BEGIN 1000           | \x424547494e2031303030
>  table public.aa: INS | \x7461626c65207075626c69632e61613a20494e53
>  COMMIT 1000          | \x434f4d4d49542031303030
> (3 rows)
> =# select pg_logical_slot_peek_changes('foo', NULL, NULL, 'force-binary',
> 'true');
> ERROR:  0A000: output plugin cannot produce binary output
> LOCATION:  pg_logical_slot_get_changes_guts, logicalfuncs.c:404
> =# select substring(data, 1, 20)
>     from pg_logical_slot_peek_binary_changes('foo', NULL, NULL,
> 'force-binary', 'true');
>                  substring
> --------------------------------------------
>  \x424547494e2031303030
>  \x7461626c65207075626c69632e61613a20494e53
>  \x434f4d4d49542031303030
> (3 rows)
> 
> Is that expected?

Yes. The output plugin declares whether it requires the *output method*
to support binary data. pg_logical_slot_peek_changes *can not* support
binary data because it outputs data as
text. pg_logical_slot_peek_binary_changes *can* support binary data
because it returns bytea (and thus it also can output text, because
that's essentially a subset of binary data).

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Question about coding of free space map
Next
From: Andrew Dunstan
Date:
Subject: Re: Removing dependency to wsock32.lib when compiling code on WIndows