Assign TupleTableSlot->tts_tableOid duplicated in tale AM. - Mailing list pgsql-hackers

From Wenchao Zhang
Subject Assign TupleTableSlot->tts_tableOid duplicated in tale AM.
Date
Msg-id CAEyNz8rNMNz5+YoPXq50fmFaEJtiL3YySmL9Dk0YJETne8fxtQ@mail.gmail.com
Whole thread Raw
Responses Re: Assign TupleTableSlot->tts_tableOid duplicated in tale AM.
List pgsql-hackers
Hi hackers,

Recently, we discover that the field of tts_tableOid of TupleTableSlot is assigned duplicated in table AM's interface which is not necessary. For example, in table_scan_getnextslot,

```
static inline bool
table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
{
        slot->tts_tableOid = RelationGetRelid(sscan->rs_rd);

        /*
         * We don't expect direct calls to table_scan_getnextslot with valid
         * CheckXidAlive for catalog or regular tables.  See detailed comments in
         * xact.c where these variables are declared.
         */
        if (unlikely(TransactionIdIsValid(CheckXidAlive) && !bsysscan))
                elog(ERROR, "unexpected table_scan_getnextslot call during logical decoding");

        return sscan->rs_rd->rd_tableam->scan_getnextslot(sscan, direction, slot);
}
```

we can see that it assigns tts_tableOid, while calling sscan->rs_rd->rd_tableam->scan_getnextslot which implemented by heap_getnextslot also assigns tts_tableOid in the call of ExecStoreBufferHeapTuple.

```
TupleTableSlot *
ExecStoreBufferHeapTuple(HeapTuple tuple,
                                                 TupleTableSlot *slot,
                                                 Buffer buffer)
{
        /*
         * sanity checks
         */
        Assert(tuple != NULL);
        Assert(slot != NULL);
        Assert(slot->tts_tupleDescriptor != NULL);
        Assert(BufferIsValid(buffer));

        if (unlikely(!TTS_IS_BUFFERTUPLE(slot)))
                elog(ERROR, "trying to store an on-disk heap tuple into wrong type of slot");
        tts_buffer_heap_store_tuple(slot, tuple, buffer, false);

        slot->tts_tableOid = tuple->t_tableOid;

        return slot;
}
```

We can get the two assigned values are same by reading codes. Maybe we should remove one?

What's more, we find that maybe we assign slot->tts_tableOid in outer interface like table_scan_getnextslot may be better and more friendly when we import other pluggable storage formats. It can avoid duplicated assignments in every implementation of table AM's interfaces.

Regards,
Wenchao

pgsql-hackers by date:

Previous
From: Marina Polyakova
Date:
Subject: Re: ICU for global collation
Next
From: Michael Paquier
Date:
Subject: Re: Refactor backup related code (was: Is it correct to say, "invalid data in file \"%s\"", BACKUP_LABEL_FILE in do_pg_backup_stop?)