static void plainnode(PLAINTREE *state, NODE *node) { /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (state->cur == state->len) { state->len *= 2; state->ptr = (QueryItem *) repalloc((void *) state->ptr, state->len * sizeof(QueryItem)); } memcpy((void *) &(state->ptr[state->cur]), (void *) node->valnode, sizeof(QueryItem)); if (node->valnode->type == QI_VAL) state->cur++; else if (node->valnode->qoperator.oper == OP_NOT) { state->ptr[state->cur].qoperator.left = 1; state->cur++; plainnode(state, node->right); } else { int cur = state->cur; state->cur++; plainnode(state, node->right); state->ptr[cur].qoperator.left = state->cur - cur; plainnode(state, node->left); } pfree(node); }
/* * make plain view of tree from a NODE-tree representation */ static QueryItem * plaintree(NODE *root, int *len) { PLAINTREE pl; pl.cur = 0; pl.len = 16; if (root && (root->valnode->type == QI_VAL || root->valnode->type == QI_OPR)) { pl.ptr = (QueryItem *) palloc(pl.len * sizeof(QueryItem)); plainnode(&pl, root); } else pl.ptr = NULL; *len = pl.cur; return pl.ptr; }
/* * make plain view of tree from 'normal' view of tree */ static ITEM * plaintree(NODE * root, int4 *len) { PLAINTREE pl; pl.cur = 0; pl.len = 16; if (root && (root->valnode->type == VAL || root->valnode->type == OPR)) { pl.ptr = (ITEM *) palloc(pl.len * sizeof(ITEM)); plainnode(&pl, root); } else pl.ptr = NULL; *len = pl.cur; return pl.ptr; }