Re: Binary support for pgoutput plugin
Dave Cramer <davecramer@gmail.com>
From: Dave Cramer <davecramer@gmail.com>
To: Petr Jelinek <petr@2ndquadrant.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Michael Paquier <michael@paquier.xyz>, Alvaro Herrera <alvherre@2ndquadrant.com>,
Dmitry Dolgov <9erthalion6@gmail.com>, Thomas Munro <thomas.munro@gmail.com>,
Tomas Vondra <tomas.vondra@2ndquadrant.com>, Petr Jelinek <petr.jelinek@2ndquadrant.com>,
Andres Freund <andres@anarazel.de>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2020-04-03T20:44:11Z
Lists: pgsql-hackers
On Fri, 3 Apr 2020 at 03:43, Petr Jelinek <petr@2ndquadrant.com> wrote:
> Hi,
>
> On 08/03/2020 00:18, Dave Cramer wrote:
> > On Fri, 6 Mar 2020 at 08:54, Petr Jelinek <petr@2ndquadrant.com
> > <mailto:petr@2ndquadrant.com>> wrote:
> >
> > Hi Dave,
> >
> > On 29/02/2020 18:44, Dave Cramer wrote:
> > >
> > >
> > > rebased and removed the catversion bump.
> >
> > Looked into this and it generally seems okay, but I do have one
> > gripe here:
> >
> > > + tuple->values[i].data =
> > palloc(len + 1);
> > > + /* and data */
> > > +
> > > + pq_copymsgbytes(in,
> > tuple->values[i].data, len);
> > > + tuple->values[i].len = len;
> > > + tuple->values[i].cursor = 0;
> > > + tuple->values[i].maxlen =
> len;
> > > + /* not strictly necessary
> > but the docs say it is required */
> > > + tuple->values[i].data[len]
> > = '\0';
> > > + break;
> > > + }
> > > + case 't': /* text
> > formatted value */
> > > + {
> > > + tuple->changed[i] = true;
> > > + int len = pq_getmsgint(in,
> > 4); /* read length */
> > >
> > > /* and data */
> > > - tuple->values[i] =
> > palloc(len + 1);
> > > - pq_copymsgbytes(in,
> > tuple->values[i], len);
> > > - tuple->values[i][len] =
> '\0';
> > > + tuple->values[i].data =
> > palloc(len + 1);
> > > + pq_copymsgbytes(in,
> > tuple->values[i].data, len);
> > > + tuple->values[i].data[len]
> > = '\0';
> > > + tuple->values[i].len = len;
> >
> > The cursor should be set to 0 in the text formatted case too if this
> is
> > how we chose to encode data.
> >
> > However I am not quite convinced I like the StringInfoData usage
> here.
> > Why not just change the struct to include additional array of lengths
> > rather than replacing the existing values array with StringInfoData
> > array, that seems generally both simpler and should have smaller
> memory
> > footprint too, no?
> >
> >
> > Can you explain this a bit more? I don't really see a huge difference in
> > memory usage.
> > We still need length and the data copied into LogicalRepTupleData when
> > sending the data in binary, no?
> >
>
> Yes but we don't need to have fixed sized array of 1600 elements that
> contains maxlen and cursor positions of the StringInfoData struct which
> we don't use for anything AFAICS.
>
OK, I can see an easy way to only allocate the number of elements required
but since OidReceiveFunctionCall takes
StringInfo as one of it's arguments it seems like an easy path unless there
is something I am missing ?
Dave
Commits
-
Weaken type-OID-matching checks in array_recv and record_recv.
- 670c0a1d474b 14.0 landed
-
Fix construction of updated-columns bitmap in logical replication.
- e8de627a3e05 11.9 landed
- d5daae47db5e 14.0 landed
- 71e561bd4bc2 12.4 landed
- 39d6aec1927c 10.14 landed
- 2f1f189cf880 13.0 landed
-
Allow logical replication to transfer data in binary format.
- 9de77b545313 14.0 landed
-
Phase 2 pgindent run for v12.
- 8255c7a5eeba 12.0 cited