I've noticed a trend in the PostgreSQL code base - for some reason, we tend to avoid initializing automatic variables (actually, the code base is pretty mixed on this point).

For example in _bt_check_unique() we have:

static TransactionId
_bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
                 Buffer buf, ScanKey itup_scankey)
{
    TupleDesc    itupdesc = RelationGetDescr(rel);
    int          natts = rel->rd_rel->relnatts;
    OffsetNumber offset,
                 maxoff;
    Page         page;
    BTPageOpaque opaque;
    Buffer       nbuf = InvalidBuffer;

    page = BufferGetPage(buf);
    opaque = (BTPageOpaque) PageGetSpecialPointer(page);
    maxoff = PageGetMaxOffsetNumber(page);
    offset = _bt_binsrch(rel, buf, natts, itup_scankey, false);
	...




Notice that four variables are not initialized; instead we assign values to them immediately after declaring them.

I would probably write that as:

static TransactionId
_bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
                 Buffer buf, ScanKey itup_scankey)
{
    TupleDesc    itupdesc = RelationGetDescr(rel);
    int          natts    = rel->rd_rel->relnatts;
    Page         page     = BufferGetPage(buf);
    OffsetNumber maxoff   = PageGetMaxOffsetNumber(page);
    BTPageOpaque opaque   = (BTPageOpaque) PageGetSpecialPointer(page);
    OffsetNumber offset   = _bt_binsrch(rel, buf, natts, itup_scankey, false);
    Buffer       nbuf     = InvalidBuffer;
	...



I'm not trying to be pedantic (it just comes naturally), but is there some reason that the first form would be better?  I know that there is no difference in the resulting code, so this is purely a style/maintainability question.

I guess the first form let's you intersperse comments (which is good). 

On the other hand, the second form makes it easy to see which variables are un-initialized.  The second form also prevents you from adding any code between declaring the variable and assigning a value to it (which is good in complicated code; you might introduce a reference to an unitialized variable).

Just curious.

            -- Korry

Reply via email to