Comparing Datum's at aminsert() stage
Hi!
For bitmaps, I need to search each value being inserted (for each column of
the index) in the list of already existing values (stored in index's header
area). To do that I need:
1) create Datum from PageItem's value (I store each value in it's own
PageItem);
2) compare newly inserted Datum with on-disk existing one.
For hash access method (maybe others too, haven't checked), this is done
via index_keytest() function. But it uses ScanKey, there's no such
at aminsert() stage.
So, I'd like to ask -- what is the "reverse" function for heap_fill_tuple(),
is it OK to use index_getattr()?
And how do I compare 2 Datums? I need FmgrInfo pointer for the equality
operator of the corresponding data type. Are there any API calls to obtain one?
Thank you.
--
Victor Y. Yegorov
"Victor Y. Yegorov" <viy@mits.lv> writes:
So, I'd like to ask -- what is the "reverse" function for heap_fill_tuple(),
is it OK to use index_getattr()?
That's probably what you *have* to use, since the normal deconstructors
assume they are working with heap tuples, which are different. But I
don't understand why you are waiting till after the index tuple is
formed. The aminsert function gets an array of Datums to start with.
Why not do it there?
And how do I compare 2 Datums? I need FmgrInfo pointer for the equality
operator of the corresponding data type. Are there any API calls to obtain one?
Look at the array comparison functions for some ideas. Be wary about
memory leaks: index AM code generally runs in a context that won't get
cleaned up until query end, so if you leak a little bit of memory per
call, you will have a problem you won't notice until it goes into the
field.
regards, tom lane
* Tom Lane <tgl@sss.pgh.pa.us> [19.04.2005 19:48]:
That's probably what you *have* to use, since the normal deconstructors
assume they are working with heap tuples, which are different. But I
don't understand why you are waiting till after the index tuple is
formed. The aminsert function gets an array of Datums to start with.
Why not do it there?
Well, I need that exactly in aminsert.
Each value is stored only once in the index (along with it's own
series-of-bits). Thus, I need to compare each Datum from aminsert()'s
array with the existing ones.
Also, I cannot form tuple the ordinary way (I need all values separated),
so I copy each TuplDesc->attrs[i] into temporary TupleDesc (1 attribute big)
and call heap_fill_tuple(). Actually, I'm not sure this is the right way...
I think, storing some kind of hash-value from the Datum is a good idea, but
it's need to be unique. Is it possible with any existing API?
--
Victor Y. Yegorov