#ifndef __QUERY_UTIL_H__
#define __QUERY_UTIL_H__

#include "postgres.h"
#include "utils/memutils.h"

#include "query.h"
#include "executor/spi.h"

typedef struct QTNode
{
	ITEM	   *valnode;
	uint32		flags;
	int4		nchild;
	char	   *word;
	uint32		sign;
	struct QTNode **child;
}	QTNode;

#define QTN_NEEDFREE	0x01
#define QTN_NOCHANGE	0x02
#define QTN_WORDFREE	0x04

typedef enum
{
	PlainMemory,
	SPIMemory,
	AggMemory
}	MemoryType;

QTNode	   *QT2QTN(ITEM * in, char *operand);
QUERYTYPE  *QTN2QT(QTNode * in, MemoryType memtype);
void		QTNFree(QTNode * in);
void		QTNSort(QTNode * in);
void		QTNTernary(QTNode * in);
void		QTNBinary(QTNode * in);
int			QTNodeCompare(QTNode * an, QTNode * bn);
QTNode	   *QTNCopy(QTNode * in, MemoryType memtype);
bool		QTNEq(QTNode * a, QTNode * b);


extern MemoryContext AggregateContext;

#define MEMALLOC(us, s)			( ((us)==SPIMemory) ? SPI_palloc(s) : ( ( (us)==PlainMemory ) ? palloc(s) : MemoryContextAlloc(AggregateContext, (s)) ) )
#define MEMFREE(us, p)			( ((us)==SPIMemory) ? SPI_pfree(p) : pfree(p) )

#endif