#ifndef __QUERY_UTIL_H__
#define __QUERY_UTIL_H__

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

#include "query.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
