象と戯れ

 | 

2008-07-23

ドはまりした

20:29 | ドはまりした - 象と戯れ を含むブックマーク はてなブックマーク - ドはまりした - 象と戯れ

pallocを二度呼ぶと同じポインタ値が返る。おかしい。pallocのバグだ。

と思ったら、犯人はexecTuplesMatchだった。

/*
 * execTuplesMatch
 *		Return true if two tuples match in all the indicated fields.
 *
 * This actually implements SQL's notion of "not distinct".  Two nulls
 * match, a null and a not-null don't match.
 *
 * slot1, slot2: the tuples to compare (must have same columns!)
 * numCols: the number of attributes to be examined
 * matchColIdx: array of attribute column numbers
 * eqFunctions: array of fmgr lookup info for the equality functions to use
 * evalContext: short-term memory context for executing the functions
 *
 * NB: evalContext is reset each time!
 */
bool
execTuplesMatch(TupleTableSlot *slot1,
				TupleTableSlot *slot2,
				int numCols,
				AttrNumber *matchColIdx,
				FmgrInfo *eqfunctions,
				MemoryContext evalContext)

最後の引数のevalContextにCurrentMemoryContextを渡していたのだが、よくよく見ると、

{
	MemoryContext oldContext;
	bool		result;
	int			i;

	/* Reset and switch into the temp context. */
	MemoryContextReset(evalContext);
	oldContext = MemoryContextSwitchTo(evalContext);

evalContextをリセットしてやがんの。早く言えっての。

おかげで5時間ぐらいハマってましたorz

 |