Re: Hash index todo list item - Mailing list pgsql-hackers

From Kenneth Marshall
Subject Re: Hash index todo list item
Date
Msg-id 20071115001255.GJ11020@it.is.rice.edu
Whole thread Raw
In response to Hash index todo list item  (Kenneth Marshall <ktm@rice.edu>)
List pgsql-hackers
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
containnull 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);
returnresult;
 
}

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
> 
> 


pgsql-hackers by date:

Previous
From: "Jignesh K. Shah"
Date:
Subject: Re: LDC - Load Distributed Checkpoints with PG8.3b2 on Solaris
Next
From: Tom Lane
Date:
Subject: Re: LDC - Load Distributed Checkpoints with PG8.3b2 on Solaris