Re: Missing Column names with multi-insert

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: Missing Column names with multi-insert
Дата
Msg-id 20190218194721.j5l4kthn3gkr3hiy@alap3.anarazel.de
обсуждение исходный текст
Ответ на Missing Column names with multi-insert  (Liz Frost <web@stillinbeta.com>)
Список 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


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: speeding up planning with partitions
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Missing Column names with multi-insert