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