#include "postgres.h"
#include "tsearch/ts_utils.h"
#include "miscadmin.h"
Go to the source code of this file.
Data Structures | |
struct | QTN2QTState |
Functions | |
QTNode * | QT2QTN (QueryItem *in, char *operand) |
void | QTNFree (QTNode *in) |
int | QTNodeCompare (QTNode *an, QTNode *bn) |
static int | cmpQTN (const void *a, const void *b) |
void | QTNSort (QTNode *in) |
bool | QTNEq (QTNode *a, QTNode *b) |
void | QTNTernary (QTNode *in) |
void | QTNBinary (QTNode *in) |
static void | cntsize (QTNode *in, int *sumlen, int *nnode) |
static void | fillQT (QTN2QTState *state, QTNode *in) |
TSQuery | QTN2QT (QTNode *in) |
QTNode * | QTNCopy (QTNode *in) |
void | QTNClearFlags (QTNode *in, uint32 flags) |
static int cmpQTN | ( | const void * | a, | |
const void * | b | |||
) | [static] |
Definition at line 135 of file tsquery_util.c.
References QTNodeCompare().
Referenced by QTNSort().
{ return QTNodeCompare(*(QTNode *const *) a, *(QTNode *const *) b); }
static void cntsize | ( | QTNode * | in, | |
int * | sumlen, | |||
int * | nnode | |||
) | [static] |
Definition at line 263 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, i, QueryOperand::length, QTNode::nchild, QI_OPR, QueryItem::qoperand, QueryItem::type, and QTNode::valnode.
Referenced by QTN2QT().
static void fillQT | ( | QTN2QTState * | state, | |
QTNode * | in | |||
) | [static] |
Definition at line 290 of file tsquery_util.c.
References Assert, check_stack_depth(), QTNode::child, QTN2QTState::curitem, QTN2QTState::curoperand, QueryOperand::distance, QueryOperator::left, QueryOperand::length, QTNode::nchild, QTN2QTState::operand, QI_OPR, QI_VAL, QueryItem::qoperand, QueryItem::qoperator, QueryItem::type, QTNode::valnode, and QTNode::word.
Referenced by QTN2QT().
{ /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (in->valnode->type == QI_VAL) { memcpy(state->curitem, in->valnode, sizeof(QueryOperand)); memcpy(state->curoperand, in->word, in->valnode->qoperand.length); state->curitem->qoperand.distance = state->curoperand - state->operand; state->curoperand[in->valnode->qoperand.length] = '\0'; state->curoperand += in->valnode->qoperand.length + 1; state->curitem++; } else { QueryItem *curitem = state->curitem; Assert(in->valnode->type == QI_OPR); memcpy(state->curitem, in->valnode, sizeof(QueryOperator)); Assert(in->nchild <= 2); state->curitem++; fillQT(state, in->child[0]); if (in->nchild == 2) { curitem->qoperator.left = state->curitem - curitem; fillQT(state, in->child[1]); } } }
Definition at line 21 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QueryOperand::distance, QueryOperator::left, QTNode::nchild, OP_NOT, QueryOperator::oper, palloc0(), QI_OPR, QueryItem::qoperand, QueryItem::qoperator, QT2QTN(), QTNode::sign, QueryItem::type, QueryOperand::valcrc, QTNode::valnode, and QTNode::word.
Referenced by CompareTSQ(), join_tsqueries(), QT2QTN(), tsa_rewrite_accum(), tsquery_not(), tsquery_rewrite(), and tsquery_rewrite_query().
{ QTNode *node = (QTNode *) palloc0(sizeof(QTNode)); /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); node->valnode = in; if (in->type == QI_OPR) { node->child = (QTNode **) palloc0(sizeof(QTNode *) * 2); node->child[0] = QT2QTN(in + 1, operand); node->sign = node->child[0]->sign; if (in->qoperator.oper == OP_NOT) node->nchild = 1; else { node->nchild = 2; node->child[1] = QT2QTN(in + in->qoperator.left, operand); node->sign |= node->child[1]->sign; } } else if (operand) { node->word = operand + in->qoperand.distance; node->sign = ((uint32) 1) << (((unsigned int) in->qoperand.valcrc) % 32); } return node; }
Definition at line 327 of file tsquery_util.c.
References cntsize(), COMPUTESIZE, QTN2QTState::curitem, QTN2QTState::curoperand, fillQT(), GETOPERAND, GETQUERY, QTN2QTState::operand, palloc0(), SET_VARSIZE, and TSQueryData::size.
Referenced by tsa_rewrite_accum(), tsquery_and(), tsquery_not(), tsquery_or(), tsquery_rewrite(), and tsquery_rewrite_query().
{ TSQuery out; int len; int sumlen = 0, nnode = 0; QTN2QTState state; cntsize(in, &sumlen, &nnode); len = COMPUTESIZE(nnode, sumlen); out = (TSQuery) palloc0(len); SET_VARSIZE(out, len); out->size = nnode; state.curitem = GETQUERY(out); state.operand = state.curoperand = GETOPERAND(out); fillQT(&state, in); return out; }
void QTNBinary | ( | QTNode * | in | ) |
Definition at line 219 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QTNode::flags, i, QTNode::nchild, QueryOperator::oper, palloc0(), QI_OPR, QueryItem::qoperator, QTNBinary(), QTNode::sign, QueryItem::type, and QTNode::valnode.
Referenced by QTNBinary(), tsa_rewrite_accum(), tsquery_rewrite(), and tsquery_rewrite_query().
{ int i; /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (in->valnode->type != QI_OPR) return; for (i = 0; i < in->nchild; i++) QTNBinary(in->child[i]); if (in->nchild <= 2) return; while (in->nchild > 2) { QTNode *nn = (QTNode *) palloc0(sizeof(QTNode)); nn->valnode = (QueryItem *) palloc0(sizeof(QueryItem)); nn->child = (QTNode **) palloc0(sizeof(QTNode *) * 2); nn->nchild = 2; nn->flags = QTN_NEEDFREE; nn->child[0] = in->child[0]; nn->child[1] = in->child[1]; nn->sign = nn->child[0]->sign | nn->child[1]->sign; nn->valnode->type = in->valnode->type; nn->valnode->qoperator.oper = in->valnode->qoperator.oper; in->child[0] = nn; in->child[1] = in->child[in->nchild - 1]; in->nchild--; } }
Definition at line 385 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QTNode::flags, i, QTNode::nchild, QI_VAL, QTNClearFlags(), QueryItem::type, and QTNode::valnode.
Referenced by QTNClearFlags(), and tsquery_rewrite_query().
{ /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); in->flags &= ~flags; if (in->valnode->type != QI_VAL) { int i; for (i = 0; i < in->nchild; i++) QTNClearFlags(in->child[i], flags); } }
Definition at line 350 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QTNode::flags, i, QueryOperand::length, QTNode::nchild, palloc(), QI_VAL, QueryItem::qoperand, QTNCopy(), QueryItem::type, QTNode::valnode, and QTNode::word.
Referenced by findeq(), and QTNCopy().
{ QTNode *out; /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); out = (QTNode *) palloc(sizeof(QTNode)); *out = *in; out->valnode = (QueryItem *) palloc(sizeof(QueryItem)); *(out->valnode) = *(in->valnode); out->flags |= QTN_NEEDFREE; if (in->valnode->type == QI_VAL) { out->word = palloc(in->valnode->qoperand.length + 1); memcpy(out->word, in->word, in->valnode->qoperand.length); out->word[in->valnode->qoperand.length] = '\0'; out->flags |= QTN_WORDFREE; } else { int i; out->child = (QTNode **) palloc(sizeof(QTNode *) * in->nchild); for (i = 0; i < in->nchild; i++) out->child[i] = QTNCopy(in->child[i]); } return out; }
Definition at line 158 of file tsquery_util.c.
References QTNodeCompare(), QTNode::sign, and sign.
Referenced by findeq().
void QTNFree | ( | QTNode * | in | ) |
Definition at line 54 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QTNode::flags, i, QTNode::nchild, pfree(), QI_OPR, QI_VAL, QTN_NEEDFREE, QTN_WORDFREE, QTNFree(), QueryItem::type, QTNode::valnode, and QTNode::word.
Referenced by CompareTSQ(), dropvoidsubtree(), findeq(), QTNFree(), tsa_rewrite_accum(), tsquery_and(), tsquery_not(), tsquery_or(), tsquery_rewrite(), and tsquery_rewrite_query().
{ if (!in) return; /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (in->valnode->type == QI_VAL && in->word && (in->flags & QTN_WORDFREE) != 0) pfree(in->word); if (in->child) { if (in->valnode) { if (in->valnode->type == QI_OPR && in->nchild > 0) { int i; for (i = 0; i < in->nchild; i++) QTNFree(in->child[i]); } if (in->flags & QTN_NEEDFREE) pfree(in->valnode); } pfree(in->child); } pfree(in); }
Definition at line 86 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, elog, ERROR, i, QueryOperand::length, QTNode::nchild, QueryOperator::oper, QI_OPR, QI_VAL, QueryItem::qoperand, QueryItem::qoperator, QTNodeCompare(), tsCompareString(), QueryItem::type, QueryOperand::valcrc, QTNode::valnode, and QTNode::word.
Referenced by cmpQTN(), CompareTSQ(), QTNEq(), and QTNodeCompare().
{ /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (an->valnode->type != bn->valnode->type) return (an->valnode->type > bn->valnode->type) ? -1 : 1; if (an->valnode->type == QI_OPR) { QueryOperator *ao = &an->valnode->qoperator; QueryOperator *bo = &bn->valnode->qoperator; if (ao->oper != bo->oper) return (ao->oper > bo->oper) ? -1 : 1; if (an->nchild != bn->nchild) return (an->nchild > bn->nchild) ? -1 : 1; { int i, res; for (i = 0; i < an->nchild; i++) if ((res = QTNodeCompare(an->child[i], bn->child[i])) != 0) return res; } return 0; } else if (an->valnode->type == QI_VAL) { QueryOperand *ao = &an->valnode->qoperand; QueryOperand *bo = &bn->valnode->qoperand; if (ao->valcrc != bo->valcrc) { return (ao->valcrc > bo->valcrc) ? -1 : 1; } return tsCompareString(an->word, ao->length, bn->word, bo->length, false); } else { elog(ERROR, "unrecognized QueryItem type: %d", an->valnode->type); return 0; /* keep compiler quiet */ } }
void QTNSort | ( | QTNode * | in | ) |
Definition at line 141 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, cmpQTN(), i, QTNode::nchild, QI_OPR, qsort, QTNSort(), QueryItem::type, and QTNode::valnode.
Referenced by findeq(), QTNSort(), tsa_rewrite_accum(), tsquery_rewrite(), and tsquery_rewrite_query().
void QTNTernary | ( | QTNode * | in | ) |
Definition at line 176 of file tsquery_util.c.
References check_stack_depth(), QTNode::child, QTNode::flags, i, memmove, QTNode::nchild, QueryOperator::oper, pfree(), QI_OPR, QueryItem::qoperator, QTN_NEEDFREE, QTNTernary(), repalloc(), QueryItem::type, and QTNode::valnode.
Referenced by QTNTernary(), tsa_rewrite_accum(), tsquery_rewrite(), and tsquery_rewrite_query().
{ int i; /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); if (in->valnode->type != QI_OPR) return; for (i = 0; i < in->nchild; i++) QTNTernary(in->child[i]); for (i = 0; i < in->nchild; i++) { QTNode *cc = in->child[i]; if (cc->valnode->type == QI_OPR && in->valnode->qoperator.oper == cc->valnode->qoperator.oper) { int oldnchild = in->nchild; in->nchild += cc->nchild - 1; in->child = (QTNode **) repalloc(in->child, in->nchild * sizeof(QTNode *)); if (i + 1 != oldnchild) memmove(in->child + i + cc->nchild, in->child + i + 1, (oldnchild - i - 1) * sizeof(QTNode *)); memcpy(in->child + i, cc->child, cc->nchild * sizeof(QTNode *)); i += cc->nchild - 1; if (cc->flags & QTN_NEEDFREE) pfree(cc->valnode); pfree(cc); } } }