Re: Missing Column names with multi-insert

From: Andres Freund <andres(at)anarazel(dot)de>
To: Liz Frost <web(at)stillinbeta(dot)com>
Cc: pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Missing Column names with multi-insert
Date: 2019-02-18 19:47:21
Message-ID: 20190218194721.j5l4kthn3gkr3hiy@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2019-02-18 14:34:43 -0500, Liz Frost wrote:
> I'm working on a foreign data wrapper that uses INSERT, and I noticed some
> odd behaviour. If I insert just one row, the
> TupleDesc->attr[0]->attname.data has the column names in it. However, in a
> multi-row string, all those are empty strings:
>
> I added this debugging code to BeginForeignInsert in
> https://bitbucket.org/adunstan/blackhole_fdw on postgres 10.
>
> int i;
> FormData_pg_attribute *attr;
> TupleDesc tupleDesc;
>
> tupleDesc = slot->tts_tupleDescriptor;
>
> for (i = 0; i < tupleDesc -> natts; i++) {
> attr = tupleDesc->attrs[i];
> elog(WARNING, "found column '%s'", attr->attname.data);
> }
>
> Now with a single row insert, this works as you'd expect:
>
> liz=# INSERT INTO bhtable (key, value) VALUES ('hello', 'world');
> WARNING: found column 'key'
> WARNING: found column 'value'
> INSERT 0 1
>
> But with a multi-row, all the column names are empty:
> liz=# INSERT INTO bhtable (key, value) VALUES ('hello', 'world'),
> ('goodmorning', 'world');
> WARNING: found column ''
> WARNING: found column ''
> WARNING: found column ''
> WARNING: found column ''
> INSERT 0 2
>
> It doesn't seem unreasonable to me that this data wouldn't be duplicated,
> but there's no mention of how I would go about retriving these column names
> for my individual rows

I think you might be looking at the wrong tuple descriptor. You ought to
look at the tuple descriptor from the target relation, not the one from
the input slot. It's more or less an accident / efficiency hack that
the slot in the first case actually carries the column names.

The callback should have a ResultRelInfo as a paramter, I think
something like
Relation rel = resultRelInfo->ri_RelationDesc;
TupleDesc tupdesc = RelationGetDescr(rel);

ought to give you the tuple descriptor you want.

> , and most foreign data wrappers I can find are write-only.

Did you mean read-only? If not, I'm unfortunately not following...

Greetings,

Andres Freund

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2019-02-18 19:49:29 Re: Missing Column names with multi-insert
Previous Message Tom Lane 2019-02-18 19:42:52 Re: speeding up planning with partitions