Datum ltq_regex(PG_FUNCTION_ARGS) { ltree *tree = PG_GETARG_LTREE(0); lquery *query = PG_GETARG_LQUERY(1); bool res = false; if (query->flag & LQUERY_HASNOT) { FieldNot fn; fn.q = NULL; res = checkCond(LQUERY_FIRST(query), query->numlevel, LTREE_FIRST(tree), tree->numlevel, &fn); } else { res = checkCond(LQUERY_FIRST(query), query->numlevel, LTREE_FIRST(tree), tree->numlevel, NULL); } PG_FREE_IF_COPY(tree, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(res); }
Datum _ltq_regex(PG_FUNCTION_ARGS) { ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); lquery *query = PG_GETARG_LQUERY(1); bool res = array_iterator(la, ltq_regex, (void *) query, NULL); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_BOOL(res); }
Datum _ltq_extract_regex(PG_FUNCTION_ARGS) { ArrayType *la = PG_GETARG_ARRAYTYPE_P(0); lquery *query = PG_GETARG_LQUERY(1); ltree *found, *item; if (!array_iterator(la, ltq_regex, (void *) query, &found)) { PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_NULL(); } item = (ltree *) palloc(VARSIZE(found)); memcpy(item, found, VARSIZE(found)); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_POINTER(item); }
Datum lquery_out(PG_FUNCTION_ARGS) { lquery *in = PG_GETARG_LQUERY(0); char *buf, *ptr; int i, j, totallen = 1; lquery_level *curqlevel; lquery_variant *curtlevel; curqlevel = LQUERY_FIRST(in); for (i = 0; i < in->numlevel; i++) { totallen++; if (curqlevel->numvar) totallen += 1 + (curqlevel->numvar * 4) + curqlevel->totallen; else totallen += 2 * 11 + 4; curqlevel = LQL_NEXT(curqlevel); } ptr = buf = (char *) palloc(totallen); curqlevel = LQUERY_FIRST(in); for (i = 0; i < in->numlevel; i++) { if (i != 0) { *ptr = '.'; ptr++; } if (curqlevel->numvar) { if (curqlevel->flag & LQL_NOT) { *ptr = '!'; ptr++; } curtlevel = LQL_FIRST(curqlevel); for (j = 0; j < curqlevel->numvar; j++) { if (j != 0) { *ptr = '|'; ptr++; } memcpy(ptr, curtlevel->name, curtlevel->len); ptr += curtlevel->len; if ((curtlevel->flag & LVAR_SUBLEXEME)) { *ptr = '%'; ptr++; } if ((curtlevel->flag & LVAR_INCASE)) { *ptr = '@'; ptr++; } if ((curtlevel->flag & LVAR_ANYEND)) { *ptr = '*'; ptr++; } curtlevel = LVAR_NEXT(curtlevel); } } else { if (curqlevel->low == curqlevel->high) { sprintf(ptr, "*{%d}", curqlevel->low); } else if (curqlevel->low == 0) { if (curqlevel->high == 0xffff) { *ptr = '*'; *(ptr + 1) = '\0'; } else sprintf(ptr, "*{,%d}", curqlevel->high); } else if (curqlevel->high == 0xffff) { sprintf(ptr, "*{%d,}", curqlevel->low); } else sprintf(ptr, "*{%d,%d}", curqlevel->low, curqlevel->high); ptr = strchr(ptr, '\0'); } curqlevel = LQL_NEXT(curqlevel); } *ptr = '\0'; PG_FREE_IF_COPY(in, 0); PG_RETURN_POINTER(buf); }