On Thu, Sep 13, 2007 at 02:02:14PM -0700, Neil Conway wrote:
> On Fri, 2007-09-07 at 08:29 -0500, Kenneth Marshall wrote:
> > This is a great starting point. I would appreciate it if you have the
> > time and could make it apply cleanly to HEAD.
> 
> Just to give you an update on this, I'll try to find the time to get it
> done soon, but my day job is keeping me really busy these days, so I'm
> not sure when I'll be able to get to it...
> 
> -Neil
> 
Neil,

I have been working on putting an updated version of your
patch into the current source. My first try was to try and
put your patch in directly, but it differed so much from the
current build that it was not obvious how to address things
like the current hash_index sorted build patch, which I need
to be able to test with indexes of any size at all. My current
try is to replace the _hash_formitem() calls with a function
called _hash_form_tuple() that actually returns an IndexTuple
and not an HashItem. This will allow it to be used quite
naturally with the current sorted build patch. Here is what
it looks like now:

/*
 * _hash_form_tuple -- construct index tuple using hash(value) not value
 */
IndexTuple
_hash_form_tuple(IndexTuple itup, Relation rel)
{
        IndexTuple      result;
        Size            size;
        uint32          hashkey;
        Datum           datum;
        bool            isnull;

        /* disallow nulls in hash keys */
        if (IndexTupleHasNulls(itup))
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("hash indexes cannot contain null keys")
));

        if (rel->rd_rel->relnatts != 1)
                elog(ERROR, "hash indexes support only one index key");

        /* hash the tuple; we only store the hash value in the index */
        datum = index_getattr(itup, 1, RelationGetDescr(rel), &isnull);
        Assert(!isnull);
        hashkey = _hash_datum2hashkey(rel, datum);

        size = IndexTupleSize(itup);
        result = (IndexTuple) palloc(size);
        memcpy(result, itup, size);
        return result;
}

I am not currently doing anything other than returning the current
IndexTuple that was created with index_form_tuple(). Am I daft, or
can I just memcpy() the 6 bytes of TID, add the 2 bytes of t_info
(everything 0 and the size set to 6 + 2 + sizeof(hash) = 10), and
the 4 bytes of hash. This will allow me to handle 8-byte hashes
in the future. If you see a problem with this approach, please
let me know. I would appreciate any feedback you can give.

Regards,
Ken
> 
> 

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to