From: Bruce Momjian Date: Tue, 22 Nov 2005 18:17:34 +0000 (+0000) Subject: Re-run pgindent, fixing a problem where comment lines after a blank X-Git-Tag: REL8_2_BETA1~1887 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=436a2956d80db29ac1dff640b631620d856b4f70;p=postgresql Re-run pgindent, fixing a problem where comment lines after a blank comment line where output as too long, and update typedefs for /lib directory. Also fix case where identifiers were used as variable names in the backend, but as typedefs in ecpg (favor the backend for indenting). Backpatch to 8.1.X. --- diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index bb646807c5..4da66a4b4d 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -60,9 +60,9 @@ typedef struct remoteConn { - PGconn *conn; /* Hold the remote connection */ + PGconn *conn; /* Hold the remote connection */ int openCursorCount; /* The number of open cursors */ - bool newXactForCursor; /* Opened a transaction for a cursor */ + bool newXactForCursor; /* Opened a transaction for a cursor */ } remoteConn; /* @@ -85,8 +85,8 @@ static Oid get_relid_from_relname(text *relname_text); static char *generate_relation_name(Oid relid); /* Global */ -static remoteConn *pconn = NULL; -static HTAB *remoteConnHash = NULL; +static remoteConn *pconn = NULL; +static HTAB *remoteConnHash = NULL; /* * Following is list that holds multiple remote connections. @@ -347,7 +347,7 @@ dblink_open(PG_FUNCTION_ARGS) else conn = rconn->conn; - /* If we are not in a transaction, start one */ + /* If we are not in a transaction, start one */ if (PQtransactionStatus(conn) == PQTRANS_IDLE) { res = PQexec(conn, "BEGIN"); @@ -1505,7 +1505,7 @@ get_text_array_contents(ArrayType *array, int *numitems) else { values[i] = DatumGetCString(DirectFunctionCall1(textout, - PointerGetDatum(ptr))); + PointerGetDatum(ptr))); ptr = att_addlength(ptr, typlen, PointerGetDatum(ptr)); ptr = (char *) att_align(ptr, typalign); } @@ -1717,7 +1717,7 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka key = -1; if (key > -1) - val = tgt_pkattvals[key] ? pstrdup(tgt_pkattvals[key]) : NULL; + val = tgt_pkattvals[key] ? pstrdup(tgt_pkattvals[key]) : NULL; else val = SPI_getvalue(tuple, tupdesc, i + 1); @@ -1744,7 +1744,7 @@ get_sql_update(Oid relid, int2vector *pkattnums, int16 pknumatts, char **src_pka quote_ident_cstr(NameStr(tupdesc->attrs[pkattnum - 1]->attname))); if (tgt_pkattvals != NULL) - val = tgt_pkattvals[i] ? pstrdup(tgt_pkattvals[i]) : NULL; + val = tgt_pkattvals[i] ? pstrdup(tgt_pkattvals[i]) : NULL; else val = SPI_getvalue(tuple, tupdesc, pkattnum); diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c index 1e26bcef28..8f6dab69fe 100644 --- a/contrib/intarray/_int_gist.c +++ b/contrib/intarray/_int_gist.c @@ -39,7 +39,7 @@ g_int_consistent(PG_FUNCTION_ARGS) if (strategy == BooleanSearchStrategy) PG_RETURN_BOOL(execconsistent((QUERYTYPE *) query, (ArrayType *) DatumGetPointer(entry->key), - GIST_LEAF(entry))); + GIST_LEAF(entry))); /* XXX are we sure it's safe to scribble on the query object here? */ /* XXX what about toasted input? */ @@ -97,7 +97,7 @@ g_int_union(PG_FUNCTION_ARGS) for (i = 0; i < entryvec->n; i++) { - ArrayType *ent = GETENTRY(entryvec, i); + ArrayType *ent = GETENTRY(entryvec, i); CHECKARRVALID(ent); totlen += ARRNELEMS(ent); @@ -108,8 +108,8 @@ g_int_union(PG_FUNCTION_ARGS) for (i = 0; i < entryvec->n; i++) { - ArrayType *ent = GETENTRY(entryvec, i); - int nel; + ArrayType *ent = GETENTRY(entryvec, i); + int nel; nel = ARRNELEMS(ent); memcpy(ptr, ARRPTR(ent), nel * sizeof(int4)); @@ -143,10 +143,10 @@ g_int_compress(PG_FUNCTION_ARGS) CHECKARRVALID(r); PREPAREARR(r); - if (ARRNELEMS(r)>= 2 * MAXNUMRANGE) - elog(NOTICE,"Input array is too big (%d maximum allowed, %d current), use gist__intbig_ops opclass instead", - 2 * MAXNUMRANGE - 1, ARRNELEMS(r)); - + if (ARRNELEMS(r) >= 2 * MAXNUMRANGE) + elog(NOTICE, "Input array is too big (%d maximum allowed, %d current), use gist__intbig_ops opclass instead", + 2 * MAXNUMRANGE - 1, ARRNELEMS(r)); + retval = palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE); @@ -154,12 +154,14 @@ g_int_compress(PG_FUNCTION_ARGS) PG_RETURN_POINTER(retval); } - /* leaf entries never compress one more time, only when entry->leafkey ==true, - so now we work only with internal keys */ + /* + * leaf entries never compress one more time, only when entry->leafkey + * ==true, so now we work only with internal keys + */ r = (ArrayType *) PG_DETOAST_DATUM(entry->key); CHECKARRVALID(r); - if (ARRISVOID(r)) + if (ARRISVOID(r)) { if (r != (ArrayType *) DatumGetPointer(entry->key)) pfree(r); diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index c6d95dc0cc..cac391e231 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.45 2005/10/29 19:38:07 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.46 2005/11/22 18:17:04 momjian Exp $ * * pgbench: a simple benchmark program for PostgreSQL * written by Tatsuo Ishii @@ -1110,7 +1110,8 @@ main(int argc, char **argv) fprintf(stderr, "Use limit/ulimt to increase the limit before using pgbench.\n"); exit(1); } -#endif /* #if !(defined(__CYGWIN__) || defined(__MINGW32__)) */ +#endif /* #if !(defined(__CYGWIN__) || + * defined(__MINGW32__)) */ break; case 'C': is_connect = 1; diff --git a/contrib/pgcrypto/pgp-decrypt.c b/contrib/pgcrypto/pgp-decrypt.c index 63f832e2ce..77973a5c31 100644 --- a/contrib/pgcrypto/pgp-decrypt.c +++ b/contrib/pgcrypto/pgp-decrypt.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-decrypt.c,v 1.6 2005/10/15 02:49:06 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-decrypt.c,v 1.7 2005/11/22 18:17:04 momjian Exp $ */ #include "postgres.h" @@ -269,14 +269,14 @@ prefix_init(void **priv_p, void *arg, PullFilter * src) * The original purpose of the 2-byte check was to show user a * friendly "wrong key" message. This made following possible: * - * "An Attack on CFB Mode Encryption As Used By OpenPGP" by Serge Mister - * and Robert Zuccherato + * "An Attack on CFB Mode Encryption As Used By OpenPGP" by Serge + * Mister and Robert Zuccherato * - * To avoid being 'oracle', we delay reporting, which basically means we - * prefer to run into corrupt packet header. + * To avoid being 'oracle', we delay reporting, which basically means + * we prefer to run into corrupt packet header. * - * We _could_ throw PXE_PGP_CORRUPT_DATA here, but there is possibility - * of attack via timing, so we don't. + * We _could_ throw PXE_PGP_CORRUPT_DATA here, but there is + * possibility of attack via timing, so we don't. */ ctx->corrupt_prefix = 1; } diff --git a/contrib/pgcrypto/pgp-pgsql.c b/contrib/pgcrypto/pgp-pgsql.c index afb926c528..ec215a9167 100644 --- a/contrib/pgcrypto/pgp-pgsql.c +++ b/contrib/pgcrypto/pgp-pgsql.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-pgsql.c,v 1.6 2005/10/15 02:49:06 momjian Exp $ + * $PostgreSQL: pgsql/contrib/pgcrypto/pgp-pgsql.c,v 1.7 2005/11/22 18:17:04 momjian Exp $ */ #include "postgres.h" @@ -125,8 +125,8 @@ add_entropy(text *data1, text *data2, text *data3) /* * Try to make the feeding unpredictable. * - * Prefer data over keys, as it's rather likely that key is same in several - * calls. + * Prefer data over keys, as it's rather likely that key is same in + * several calls. */ /* chance: 7/8 */ diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index 7f67f37b00..0d8a17ea61 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -547,8 +547,8 @@ crosstab(PG_FUNCTION_ARGS) * Get the next category item value, which is alway * attribute number three. * - * Be careful to sssign the value to the array index based on - * which category we are presently processing. + * Be careful to sssign the value to the array index based + * on which category we are presently processing. */ values[1 + i] = SPI_getvalue(spi_tuple, spi_tupdesc, 3); @@ -870,8 +870,8 @@ get_crosstab_tuplestore(char *sql, /* * The provided SQL query must always return at least three columns: * - * 1. rowname the label for each row - column 1 in the final result 2. - * category the label for each value-column in the final result 3. + * 1. rowname the label for each row - column 1 in the final result + * 2. category the label for each value-column in the final result 3. * value the values used to populate the value-columns * * If there are more than three columns, the last two are taken as diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c index e312cf6af7..de6d96ed52 100644 --- a/contrib/tsearch2/query.c +++ b/contrib/tsearch2/query.c @@ -178,7 +178,7 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 state->state = WAITOPERATOR; return VAL; } - else if ( state->state == WAITFIRSTOPERAND ) + else if (state->state == WAITFIRSTOPERAND) return END; else ereport(ERROR, @@ -206,13 +206,13 @@ gettoken_query(QPRS_STATE * state, int4 *val, int4 *lenval, char **strval, int2 return ERR; break; case WAITSINGLEOPERAND: - if ( *(state->buf) == '\0' ) + if (*(state->buf) == '\0') return END; *strval = state->buf; - *lenval = strlen( state->buf ); - state->buf += strlen( state->buf ); + *lenval = strlen(state->buf); + state->buf += strlen(state->buf); state->count++; - return VAL; + return VAL; default: return ERR; break; @@ -600,7 +600,7 @@ findoprnd(ITEM * ptr, int4 *pos) * input */ static QUERYTYPE * -queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain) + queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int cfg_id, bool isplain) { QPRS_STATE state; int4 i; @@ -637,12 +637,13 @@ queryin(char *buf, void (*pushval) (QPRS_STATE *, int, char *, int, int2), int c /* parse query & make polish notation (postfix, but in reverse order) */ makepol(&state, pushval); pfree(state.valstate.word); - if (!state.num) { + if (!state.num) + { elog(NOTICE, "Query doesn't contain lexem(s)"); - query = (QUERYTYPE*)palloc( HDRSIZEQT ); + query = (QUERYTYPE *) palloc(HDRSIZEQT); query->len = HDRSIZEQT; query->size = 0; - return query; + return query; } /* make finish struct */ @@ -928,9 +929,9 @@ to_tsquery(PG_FUNCTION_ARGS) str = text2char(in); PG_FREE_IF_COPY(in, 1); - query = queryin(str, pushval_morph, PG_GETARG_INT32(0),false); - - if ( query->size == 0 ) + query = queryin(str, pushval_morph, PG_GETARG_INT32(0), false); + + if (query->size == 0) PG_RETURN_POINTER(query); res = clean_fakeval_v2(GETQUERY(query), &len); @@ -984,8 +985,8 @@ plainto_tsquery(PG_FUNCTION_ARGS) PG_FREE_IF_COPY(in, 1); query = queryin(str, pushval_morph, PG_GETARG_INT32(0), true); - - if ( query->size == 0 ) + + if (query->size == 0) PG_RETURN_POINTER(query); res = clean_fakeval_v2(GETQUERY(query), &len); @@ -1023,4 +1024,3 @@ plainto_tsquery_current(PG_FUNCTION_ARGS) Int32GetDatum(get_currcfg()), PG_GETARG_DATUM(0))); } - diff --git a/contrib/tsearch2/query.h b/contrib/tsearch2/query.h index 3a84afc9c0..9eff69cc71 100644 --- a/contrib/tsearch2/query.h +++ b/contrib/tsearch2/query.h @@ -17,7 +17,7 @@ typedef struct ITEM int4 val; /* user-friendly value, must correlate with WordEntry */ uint32 - istrue:1, /* use for ranking in Cover */ + istrue:1, /* use for ranking in Cover */ length:11, distance:20; } ITEM; diff --git a/contrib/tsearch2/query_gist.c b/contrib/tsearch2/query_gist.c index c14ece0112..d87a5d8d01 100644 --- a/contrib/tsearch2/query_gist.c +++ b/contrib/tsearch2/query_gist.c @@ -7,180 +7,201 @@ #include "query.h" typedef uint64 TPQTGist; -#define SIGLEN (sizeof(TPQTGist)*BITS_PER_BYTE) + +#define SIGLEN (sizeof(TPQTGist)*BITS_PER_BYTE) #define GETENTRY(vec,pos) ((TPQTGist *) DatumGetPointer((vec)->vector[(pos)].key)) PG_FUNCTION_INFO_V1(tsq_mcontains); -Datum tsq_mcontains(PG_FUNCTION_ARGS); +Datum tsq_mcontains(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(tsq_mcontained); -Datum tsq_mcontained(PG_FUNCTION_ARGS); +Datum tsq_mcontained(PG_FUNCTION_ARGS); static TPQTGist -makesign(QUERYTYPE* a) { - int i; - ITEM *ptr = GETQUERY(a); +makesign(QUERYTYPE * a) +{ + int i; + ITEM *ptr = GETQUERY(a); TPQTGist sign = 0; - for (i = 0; i < a->size; i++) { - if ( ptr->type == VAL ) + for (i = 0; i < a->size; i++) + { + if (ptr->type == VAL) sign |= 1 << (ptr->val % SIGLEN); ptr++; } - + return sign; } Datum -tsq_mcontains(PG_FUNCTION_ARGS) { +tsq_mcontains(PG_FUNCTION_ARGS) +{ QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); QUERYTYPE *ex = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); - TPQTGist sq, se; - int i,j; - ITEM *iq, *ie; - - if ( query->size < ex->size ) { + TPQTGist sq, + se; + int i, + j; + ITEM *iq, + *ie; + + if (query->size < ex->size) + { PG_FREE_IF_COPY(query, 0); PG_FREE_IF_COPY(ex, 1); - PG_RETURN_BOOL( false ); + PG_RETURN_BOOL(false); } sq = makesign(query); se = makesign(ex); - if ( (sq&se)!=se ) { + if ((sq & se) != se) + { PG_FREE_IF_COPY(query, 0); PG_FREE_IF_COPY(ex, 1); - PG_RETURN_BOOL( false ); - } + PG_RETURN_BOOL(false); + } ie = GETQUERY(ex); - for(i=0;isize;i++) { + for (i = 0; i < ex->size; i++) + { iq = GETQUERY(query); - if ( ie[i].type != VAL ) + if (ie[i].type != VAL) continue; - for(j=0;jsize;j++) - if ( iq[j].type == VAL && ie[i].val == iq[j].val ) { - j = query->size+1; + for (j = 0; j < query->size; j++) + if (iq[j].type == VAL && ie[i].val == iq[j].val) + { + j = query->size + 1; break; } - if ( j == query->size ) { + if (j == query->size) + { PG_FREE_IF_COPY(query, 0); PG_FREE_IF_COPY(ex, 1); - PG_RETURN_BOOL( false ); + PG_RETURN_BOOL(false); } - } + } PG_FREE_IF_COPY(query, 0); PG_FREE_IF_COPY(ex, 1); - PG_RETURN_BOOL( true ); + PG_RETURN_BOOL(true); } Datum -tsq_mcontained(PG_FUNCTION_ARGS) { +tsq_mcontained(PG_FUNCTION_ARGS) +{ PG_RETURN_DATUM( - DirectFunctionCall2( - tsq_mcontains, - PG_GETARG_DATUM(1), - PG_GETARG_DATUM(0) - ) + DirectFunctionCall2( + tsq_mcontains, + PG_GETARG_DATUM(1), + PG_GETARG_DATUM(0) + ) ); } PG_FUNCTION_INFO_V1(gtsq_in); -Datum gtsq_in(PG_FUNCTION_ARGS); +Datum gtsq_in(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_out); -Datum gtsq_out(PG_FUNCTION_ARGS); +Datum gtsq_out(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_compress); -Datum gtsq_compress(PG_FUNCTION_ARGS); +Datum gtsq_compress(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_decompress); -Datum gtsq_decompress(PG_FUNCTION_ARGS); +Datum gtsq_decompress(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_consistent); -Datum gtsq_consistent(PG_FUNCTION_ARGS); +Datum gtsq_consistent(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_union); -Datum gtsq_union(PG_FUNCTION_ARGS); +Datum gtsq_union(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_same); -Datum gtsq_same(PG_FUNCTION_ARGS); +Datum gtsq_same(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_penalty); -Datum gtsq_penalty(PG_FUNCTION_ARGS); +Datum gtsq_penalty(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(gtsq_picksplit); -Datum gtsq_picksplit(PG_FUNCTION_ARGS); +Datum gtsq_picksplit(PG_FUNCTION_ARGS); Datum -gtsq_in(PG_FUNCTION_ARGS) { - elog(ERROR, "Not implemented"); - PG_RETURN_DATUM(0); +gtsq_in(PG_FUNCTION_ARGS) +{ + elog(ERROR, "Not implemented"); + PG_RETURN_DATUM(0); } Datum -gtsq_out(PG_FUNCTION_ARGS) { - elog(ERROR, "Not implemented"); - PG_RETURN_DATUM(0); +gtsq_out(PG_FUNCTION_ARGS) +{ + elog(ERROR, "Not implemented"); + PG_RETURN_DATUM(0); } Datum -gtsq_compress(PG_FUNCTION_ARGS) { +gtsq_compress(PG_FUNCTION_ARGS) +{ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); GISTENTRY *retval = entry; - if (entry->leafkey) { - TPQTGist *sign = (TPQTGist*)palloc( sizeof(TPQTGist) ); + if (entry->leafkey) + { + TPQTGist *sign = (TPQTGist *) palloc(sizeof(TPQTGist)); + retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); - *sign = makesign( (QUERYTYPE*)DatumGetPointer(PG_DETOAST_DATUM(entry->key)) ); + *sign = makesign((QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(entry->key))); gistentryinit(*retval, PointerGetDatum(sign), - entry->rel, entry->page, - entry->offset, sizeof(TPQTGist), FALSE); + entry->rel, entry->page, + entry->offset, sizeof(TPQTGist), FALSE); } PG_RETURN_POINTER(retval); } Datum -gtsq_decompress(PG_FUNCTION_ARGS) { +gtsq_decompress(PG_FUNCTION_ARGS) +{ PG_RETURN_DATUM(PG_GETARG_DATUM(0)); } Datum -gtsq_consistent(PG_FUNCTION_ARGS) { +gtsq_consistent(PG_FUNCTION_ARGS) +{ GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); - TPQTGist *key = (TPQTGist*) DatumGetPointer(entry->key); + TPQTGist *key = (TPQTGist *) DatumGetPointer(entry->key); QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); - StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); + StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); TPQTGist sq = makesign(query); - if ( GIST_LEAF(entry) ) - PG_RETURN_BOOL( ( (*key) & sq ) == ((strategy==1) ? sq : *key) ); - else - PG_RETURN_BOOL( (*key) & sq ); + if (GIST_LEAF(entry)) + PG_RETURN_BOOL(((*key) & sq) == ((strategy == 1) ? sq : *key)); + else + PG_RETURN_BOOL((*key) & sq); } Datum -gtsq_union(PG_FUNCTION_ARGS) { +gtsq_union(PG_FUNCTION_ARGS) +{ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); - TPQTGist *sign = (TPQTGist*)palloc( sizeof(TPQTGist) ); - int i; - int *size = (int *) PG_GETARG_POINTER(1); + TPQTGist *sign = (TPQTGist *) palloc(sizeof(TPQTGist)); + int i; + int *size = (int *) PG_GETARG_POINTER(1); - memset( sign, 0, sizeof(TPQTGist) ); + memset(sign, 0, sizeof(TPQTGist)); - for (i = 0; i < entryvec->n;i++) + for (i = 0; i < entryvec->n; i++) *sign |= *GETENTRY(entryvec, i); *size = sizeof(TPQTGist); @@ -189,35 +210,40 @@ gtsq_union(PG_FUNCTION_ARGS) { } Datum -gtsq_same(PG_FUNCTION_ARGS) { - TPQTGist *a = (TPQTGist *) PG_GETARG_POINTER(0); - TPQTGist *b = (TPQTGist *) PG_GETARG_POINTER(1); +gtsq_same(PG_FUNCTION_ARGS) +{ + TPQTGist *a = (TPQTGist *) PG_GETARG_POINTER(0); + TPQTGist *b = (TPQTGist *) PG_GETARG_POINTER(1); - PG_RETURN_POINTER( *a == *b ); + PG_RETURN_POINTER(*a == *b); } static int -sizebitvec(TPQTGist sign) { - int size=0,i; +sizebitvec(TPQTGist sign) +{ + int size = 0, + i; - for(i=0;i>i); + for (i = 0; i < SIGLEN; i++) + size += 0x01 & (sign >> i); return size; } static int -hemdist(TPQTGist a, TPQTGist b) { - TPQTGist res = a ^ b; +hemdist(TPQTGist a, TPQTGist b) +{ + TPQTGist res = a ^ b; return sizebitvec(res); } Datum -gtsq_penalty(PG_FUNCTION_ARGS) { - TPQTGist *origval = (TPQTGist*) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key); - TPQTGist *newval = (TPQTGist*) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); - float *penalty = (float *) PG_GETARG_POINTER(2); +gtsq_penalty(PG_FUNCTION_ARGS) +{ + TPQTGist *origval = (TPQTGist *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key); + TPQTGist *newval = (TPQTGist *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); + float *penalty = (float *) PG_GETARG_POINTER(2); *penalty = hemdist(*origval, *newval); @@ -225,36 +251,45 @@ gtsq_penalty(PG_FUNCTION_ARGS) { } -typedef struct { - OffsetNumber pos; - int4 cost; +typedef struct +{ + OffsetNumber pos; + int4 cost; } SPLITCOST; static int -comparecost(const void *a, const void *b) { - if (((SPLITCOST *) a)->cost == ((SPLITCOST *) b)->cost) - return 0; - else - return (((SPLITCOST *) a)->cost > ((SPLITCOST *) b)->cost) ? 1 : -1; +comparecost(const void *a, const void *b) +{ + if (((SPLITCOST *) a)->cost == ((SPLITCOST *) b)->cost) + return 0; + else + return (((SPLITCOST *) a)->cost > ((SPLITCOST *) b)->cost) ? 1 : -1; } #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) ) Datum -gtsq_picksplit(PG_FUNCTION_ARGS) { +gtsq_picksplit(PG_FUNCTION_ARGS) +{ GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); OffsetNumber maxoff = entryvec->n - 2; - OffsetNumber k,j; - - TPQTGist *datum_l, *datum_r; - int4 size_alpha, size_beta; - int4 size_waste, waste = -1; - int4 nbytes; - OffsetNumber seed_1 = 0, seed_2 = 0; - OffsetNumber *left, *right; - - SPLITCOST *costvector; + OffsetNumber k, + j; + + TPQTGist *datum_l, + *datum_r; + int4 size_alpha, + size_beta; + int4 size_waste, + waste = -1; + int4 nbytes; + OffsetNumber seed_1 = 0, + seed_2 = 0; + OffsetNumber *left, + *right; + + SPLITCOST *costvector; nbytes = (maxoff + 2) * sizeof(OffsetNumber); left = v->spl_left = (OffsetNumber *) palloc(nbytes); @@ -262,9 +297,11 @@ gtsq_picksplit(PG_FUNCTION_ARGS) { v->spl_nleft = v->spl_nright = 0; for (k = FirstOffsetNumber; k < maxoff; k = OffsetNumberNext(k)) - for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j)) { - size_waste = hemdist( *GETENTRY(entryvec,j), *GETENTRY(entryvec,k) ); - if (size_waste > waste) { + for (j = OffsetNumberNext(k); j <= maxoff; j = OffsetNumberNext(j)) + { + size_waste = hemdist(*GETENTRY(entryvec, j), *GETENTRY(entryvec, k)); + if (size_waste > waste) + { waste = size_waste; seed_1 = k; seed_2 = j; @@ -272,47 +309,56 @@ gtsq_picksplit(PG_FUNCTION_ARGS) { } - if (seed_1 == 0 || seed_2 == 0) { + if (seed_1 == 0 || seed_2 == 0) + { seed_1 = 1; seed_2 = 2; } - datum_l = (TPQTGist*)palloc( sizeof(TPQTGist) ); - *datum_l=*GETENTRY(entryvec,seed_1); - datum_r = (TPQTGist*)palloc( sizeof(TPQTGist) ); - *datum_r=*GETENTRY(entryvec,seed_2); - - + datum_l = (TPQTGist *) palloc(sizeof(TPQTGist)); + *datum_l = *GETENTRY(entryvec, seed_1); + datum_r = (TPQTGist *) palloc(sizeof(TPQTGist)); + *datum_r = *GETENTRY(entryvec, seed_2); + + maxoff = OffsetNumberNext(maxoff); costvector = (SPLITCOST *) palloc(sizeof(SPLITCOST) * maxoff); - for (j = FirstOffsetNumber; j <= maxoff; j = OffsetNumberNext(j)) { + for (j = FirstOffsetNumber; j <= maxoff; j = OffsetNumberNext(j)) + { costvector[j - 1].pos = j; - size_alpha = hemdist( *GETENTRY(entryvec,seed_1), *GETENTRY(entryvec,j) ); - size_beta = hemdist( *GETENTRY(entryvec,seed_2), *GETENTRY(entryvec,j) ); + size_alpha = hemdist(*GETENTRY(entryvec, seed_1), *GETENTRY(entryvec, j)); + size_beta = hemdist(*GETENTRY(entryvec, seed_2), *GETENTRY(entryvec, j)); costvector[j - 1].cost = abs(size_alpha - size_beta); } qsort((void *) costvector, maxoff, sizeof(SPLITCOST), comparecost); - for (k = 0; k < maxoff; k++) { + for (k = 0; k < maxoff; k++) + { j = costvector[k].pos; - if ( j == seed_1 ) { + if (j == seed_1) + { *left++ = j; v->spl_nleft++; continue; - } else if ( j == seed_2 ) { + } + else if (j == seed_2) + { *right++ = j; v->spl_nright++; continue; } - size_alpha = hemdist( *datum_l, *GETENTRY(entryvec,j) ); - size_beta = hemdist( *datum_r, *GETENTRY(entryvec,j) ); + size_alpha = hemdist(*datum_l, *GETENTRY(entryvec, j)); + size_beta = hemdist(*datum_r, *GETENTRY(entryvec, j)); - if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.05)) { - *datum_l |= *GETENTRY(entryvec,j); + if (size_alpha < size_beta + WISH_F(v->spl_nleft, v->spl_nright, 0.05)) + { + *datum_l |= *GETENTRY(entryvec, j); *left++ = j; v->spl_nleft++; - } else { - *datum_r |= *GETENTRY(entryvec,j); + } + else + { + *datum_r |= *GETENTRY(entryvec, j); *right++ = j; v->spl_nright++; } @@ -324,5 +370,3 @@ gtsq_picksplit(PG_FUNCTION_ARGS) { PG_RETURN_POINTER(v); } - - diff --git a/contrib/tsearch2/query_rewrite.c b/contrib/tsearch2/query_rewrite.c index e3d40cc44d..f1faaf8778 100644 --- a/contrib/tsearch2/query_rewrite.c +++ b/contrib/tsearch2/query_rewrite.c @@ -6,135 +6,167 @@ MemoryContext AggregateContext = NULL; static int -addone(int * counters, int last, int total) { +addone(int *counters, int last, int total) +{ counters[last]++; - if ( counters[last]>=total ) { - if (last==0) + if (counters[last] >= total) + { + if (last == 0) return 0; - if ( addone( counters, last-1, total-1 ) == 0 ) + if (addone(counters, last - 1, total - 1) == 0) return 0; - counters[last] = counters[last-1]+1; + counters[last] = counters[last - 1] + 1; } return 1; } -static QTNode * -findeq(QTNode *node, QTNode *ex, MemoryType memtype, QTNode *subs, bool *isfind) { - - if ( (node->sign & ex->sign) != ex->sign || node->valnode->type != ex->valnode->type || node->valnode->val != ex->valnode->val ) +static QTNode * +findeq(QTNode * node, QTNode * ex, MemoryType memtype, QTNode * subs, bool *isfind) +{ + + if ((node->sign & ex->sign) != ex->sign || node->valnode->type != ex->valnode->type || node->valnode->val != ex->valnode->val) return node; - if ( node->flags & QTN_NOCHANGE ) - return node; + if (node->flags & QTN_NOCHANGE) + return node; - if ( node->valnode->type==OPR ) { - if ( node->nchild == ex->nchild ) { - if ( QTNEq( node, ex ) ) { - QTNFree( node ); - if ( subs ) { - node = QTNCopy( subs, memtype ); + if (node->valnode->type == OPR) + { + if (node->nchild == ex->nchild) + { + if (QTNEq(node, ex)) + { + QTNFree(node); + if (subs) + { + node = QTNCopy(subs, memtype); node->flags |= QTN_NOCHANGE; - } else - node = NULL; + } + else + node = NULL; *isfind = true; } - } else if ( node->nchild > ex->nchild ) { - int *counters = (int*)palloc( sizeof(int) * node->nchild ); - int i; - QTNode *tnode = (QTNode*)MEMALLOC( memtype, sizeof(QTNode) ); + } + else if (node->nchild > ex->nchild) + { + int *counters = (int *) palloc(sizeof(int) * node->nchild); + int i; + QTNode *tnode = (QTNode *) MEMALLOC(memtype, sizeof(QTNode)); memset(tnode, 0, sizeof(QTNode)); - tnode->child = (QTNode**)MEMALLOC( memtype, sizeof(QTNode*) * ex->nchild ); + tnode->child = (QTNode **) MEMALLOC(memtype, sizeof(QTNode *) * ex->nchild); tnode->nchild = ex->nchild; - tnode->valnode = (ITEM*)MEMALLOC( memtype, sizeof(ITEM) ); + tnode->valnode = (ITEM *) MEMALLOC(memtype, sizeof(ITEM)); *(tnode->valnode) = *(ex->valnode); - for(i=0;inchild;i++) - counters[i]=i; + for (i = 0; i < ex->nchild; i++) + counters[i] = i; - do { - tnode->sign=0; - for(i=0;inchild;i++) { - tnode->child[i] = node->child[ counters[i] ]; + do + { + tnode->sign = 0; + for (i = 0; i < ex->nchild; i++) + { + tnode->child[i] = node->child[counters[i]]; tnode->sign |= tnode->child[i]->sign; } - if ( QTNEq( tnode, ex ) ) { - int j=0; + if (QTNEq(tnode, ex)) + { + int j = 0; - MEMFREE( memtype, tnode->valnode ); - MEMFREE( memtype, tnode->child ); - MEMFREE( memtype, tnode ); - if ( subs ) { - tnode = QTNCopy( subs, memtype ); + MEMFREE(memtype, tnode->valnode); + MEMFREE(memtype, tnode->child); + MEMFREE(memtype, tnode); + if (subs) + { + tnode = QTNCopy(subs, memtype); tnode->flags = QTN_NOCHANGE | QTN_NEEDFREE; - } else + } + else tnode = NULL; - node->child[ counters[0] ] = tnode; + node->child[counters[0]] = tnode; - for(i=1;inchild;i++) - node->child[ counters[i] ] = NULL; - for(i=0;inchild;i++) { - if ( node->child[i] ) { + for (i = 1; i < ex->nchild; i++) + node->child[counters[i]] = NULL; + for (i = 0; i < node->nchild; i++) + { + if (node->child[i]) + { node->child[j] = node->child[i]; j++; } } - node->nchild = j; + node->nchild = j; *isfind = true; break; } - } while (addone(counters,ex->nchild-1,node->nchild)); - if ( tnode && (tnode->flags & QTN_NOCHANGE) == 0 ) { - MEMFREE( memtype, tnode->valnode ); - MEMFREE( memtype, tnode->child ); - MEMFREE( memtype, tnode ); - } else - QTNSort( node ); - pfree( counters ); + } while (addone(counters, ex->nchild - 1, node->nchild)); + if (tnode && (tnode->flags & QTN_NOCHANGE) == 0) + { + MEMFREE(memtype, tnode->valnode); + MEMFREE(memtype, tnode->child); + MEMFREE(memtype, tnode); + } + else + QTNSort(node); + pfree(counters); } - } else if ( QTNEq( node, ex ) ) { - QTNFree( node ); - if ( subs ) { - node = QTNCopy( subs, memtype ); + } + else if (QTNEq(node, ex)) + { + QTNFree(node); + if (subs) + { + node = QTNCopy(subs, memtype); node->flags |= QTN_NOCHANGE; - } else { + } + else + { node = NULL; } *isfind = true; } return node; -} +} static QTNode * -dofindsubquery( QTNode *root, QTNode *ex, MemoryType memtype, QTNode *subs, bool *isfind ) { - root = findeq( root, ex, memtype, subs, isfind ); +dofindsubquery(QTNode * root, QTNode * ex, MemoryType memtype, QTNode * subs, bool *isfind) +{ + root = findeq(root, ex, memtype, subs, isfind); + + if (root && (root->flags & QTN_NOCHANGE) == 0 && root->valnode->type == OPR) + { + int i; - if ( root && (root->flags & QTN_NOCHANGE) == 0 && root->valnode->type==OPR) { - int i; - for(i=0;inchild;i++) - root->child[i] = dofindsubquery( root->child[i], ex, memtype, subs, isfind ); + for (i = 0; i < root->nchild; i++) + root->child[i] = dofindsubquery(root->child[i], ex, memtype, subs, isfind); } return root; } static QTNode * -dropvoidsubtree( QTNode *root ) { +dropvoidsubtree(QTNode * root) +{ - if ( !root ) + if (!root) return NULL; - if ( root->valnode->type==OPR ) { - int i,j=0; + if (root->valnode->type == OPR) + { + int i, + j = 0; - for(i=0;inchild;i++) { - if ( root->child[i] ) { + for (i = 0; i < root->nchild; i++) + { + if (root->child[i]) + { root->child[j] = root->child[i]; j++; } @@ -142,88 +174,100 @@ dropvoidsubtree( QTNode *root ) { root->nchild = j; - if ( root->valnode->val == (int4)'!' && root->nchild==0 ) { + if (root->valnode->val == (int4) '!' && root->nchild == 0) + { QTNFree(root); - root=NULL; - } else if ( root->nchild==1 ) { - QTNode *nroot = root->child[0]; + root = NULL; + } + else if (root->nchild == 1) + { + QTNode *nroot = root->child[0]; + pfree(root); - root = nroot; - } + root = nroot; + } } return root; } static QTNode * -findsubquery( QTNode *root, QTNode *ex, MemoryType memtype, QTNode *subs, bool *isfind ) { - bool DidFind = false; - root = dofindsubquery( root, ex, memtype, subs, &DidFind ); +findsubquery(QTNode * root, QTNode * ex, MemoryType memtype, QTNode * subs, bool *isfind) +{ + bool DidFind = false; + + root = dofindsubquery(root, ex, memtype, subs, &DidFind); - if ( !subs && DidFind ) - root = dropvoidsubtree( root ); + if (!subs && DidFind) + root = dropvoidsubtree(root); - if ( isfind ) + if (isfind) *isfind = DidFind; return root; } -static Oid tsqOid = InvalidOid; +static Oid tsqOid = InvalidOid; static void get_tsq_Oid(void) { - int ret; - bool isnull; - - if ((ret = SPI_exec("select oid from pg_type where typname='tsquery'", 1)) < 0) - /* internal error */ - elog(ERROR, "SPI_exec to get tsquery oid returns %d", ret); - - if (SPI_processed < 0) - /* internal error */ - elog(ERROR, "There is no tsvector type"); - tsqOid = DatumGetObjectId(SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull)); - if (tsqOid == InvalidOid) - /* internal error */ - elog(ERROR, "tsquery type has InvalidOid"); + int ret; + bool isnull; + + if ((ret = SPI_exec("select oid from pg_type where typname='tsquery'", 1)) < 0) + /* internal error */ + elog(ERROR, "SPI_exec to get tsquery oid returns %d", ret); + + if (SPI_processed < 0) + /* internal error */ + elog(ERROR, "There is no tsvector type"); + tsqOid = DatumGetObjectId(SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull)); + if (tsqOid == InvalidOid) + /* internal error */ + elog(ERROR, "tsquery type has InvalidOid"); } PG_FUNCTION_INFO_V1(tsquery_rewrite); PG_FUNCTION_INFO_V1(rewrite_accum); -Datum rewrite_accum(PG_FUNCTION_ARGS); - -Datum -rewrite_accum(PG_FUNCTION_ARGS) { - QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0); - ArrayType *qa = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); - QUERYTYPE *q; - QTNode *qex, *subs = NULL, *acctree; - bool isfind = false; - Datum *elemsp; - int nelemsp; +Datum rewrite_accum(PG_FUNCTION_ARGS); + +Datum +rewrite_accum(PG_FUNCTION_ARGS) +{ + QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0); + ArrayType *qa = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); + QUERYTYPE *q; + QTNode *qex, + *subs = NULL, + *acctree; + bool isfind = false; + Datum *elemsp; + int nelemsp; AggregateContext = ((AggState *) fcinfo->context)->aggcontext; - - if (acc == NULL || PG_ARGISNULL(0)) { - acc = (QUERYTYPE*)MEMALLOC( AggMemory, sizeof(QUERYTYPE) ); + + if (acc == NULL || PG_ARGISNULL(0)) + { + acc = (QUERYTYPE *) MEMALLOC(AggMemory, sizeof(QUERYTYPE)); acc->len = HDRSIZEQT; acc->size = 0; } - if ( qa == NULL || PG_ARGISNULL(1) ) { - PG_FREE_IF_COPY( qa, 1 ); - PG_RETURN_POINTER( acc ); + if (qa == NULL || PG_ARGISNULL(1)) + { + PG_FREE_IF_COPY(qa, 1); + PG_RETURN_POINTER(acc); } - if ( ARR_NDIM(qa) != 1 ) + if (ARR_NDIM(qa) != 1) elog(ERROR, "array must be one-dimensional, not %d dimension", ARR_NDIM(qa)); - if ( ArrayGetNItems( ARR_NDIM(qa), ARR_DIMS(qa)) != 3 ) + if (ArrayGetNItems(ARR_NDIM(qa), ARR_DIMS(qa)) != 3) elog(ERROR, "array should have only three elements"); - if (tsqOid == InvalidOid) { + if (tsqOid == InvalidOid) + { SPI_connect(); get_tsq_Oid(); SPI_finish(); @@ -232,108 +276,122 @@ rewrite_accum(PG_FUNCTION_ARGS) { if (ARR_ELEMTYPE(qa) != tsqOid) elog(ERROR, "array should contain tsquery type"); - deconstruct_array(qa, tsqOid, -1, false, 'i', &elemsp, NULL, &nelemsp); + deconstruct_array(qa, tsqOid, -1, false, 'i', &elemsp, NULL, &nelemsp); - q = (QUERYTYPE*)DatumGetPointer( elemsp[0] ); - if ( q->size == 0 ) { - pfree( elemsp ); - PG_RETURN_POINTER( acc ); + q = (QUERYTYPE *) DatumGetPointer(elemsp[0]); + if (q->size == 0) + { + pfree(elemsp); + PG_RETURN_POINTER(acc); } - - if ( !acc->size ) { - if ( acc->len > HDRSIZEQT ) { - pfree( elemsp ); - PG_RETURN_POINTER( acc ); - } else - acctree = QT2QTN( GETQUERY(q), GETOPERAND(q) ); - } else - acctree = QT2QTN( GETQUERY(acc), GETOPERAND(acc) ); - - QTNTernary( acctree ); - QTNSort( acctree ); - - q = (QUERYTYPE*)DatumGetPointer( elemsp[1] ); - if ( q->size == 0 ) { - pfree( elemsp ); - PG_RETURN_POINTER( acc ); + + if (!acc->size) + { + if (acc->len > HDRSIZEQT) + { + pfree(elemsp); + PG_RETURN_POINTER(acc); + } + else + acctree = QT2QTN(GETQUERY(q), GETOPERAND(q)); } - qex = QT2QTN( GETQUERY(q), GETOPERAND(q) ); - QTNTernary( qex ); - QTNSort( qex ); - - q = (QUERYTYPE*)DatumGetPointer( elemsp[2] ); - if ( q->size ) - subs = QT2QTN( GETQUERY(q), GETOPERAND(q) ); + else + acctree = QT2QTN(GETQUERY(acc), GETOPERAND(acc)); - acctree = findsubquery( acctree, qex, PlainMemory, subs, &isfind ); + QTNTernary(acctree); + QTNSort(acctree); + + q = (QUERYTYPE *) DatumGetPointer(elemsp[1]); + if (q->size == 0) + { + pfree(elemsp); + PG_RETURN_POINTER(acc); + } + qex = QT2QTN(GETQUERY(q), GETOPERAND(q)); + QTNTernary(qex); + QTNSort(qex); - if ( isfind || !acc->size ) { + q = (QUERYTYPE *) DatumGetPointer(elemsp[2]); + if (q->size) + subs = QT2QTN(GETQUERY(q), GETOPERAND(q)); + + acctree = findsubquery(acctree, qex, PlainMemory, subs, &isfind); + + if (isfind || !acc->size) + { /* pfree( acc ); do not pfree(p), because nodeAgg.c will */ - if ( acctree ) { - QTNBinary( acctree ); - acc = QTN2QT( acctree, AggMemory ); - } else { - acc = (QUERYTYPE*)MEMALLOC( AggMemory, HDRSIZEQT*2 ); + if (acctree) + { + QTNBinary(acctree); + acc = QTN2QT(acctree, AggMemory); + } + else + { + acc = (QUERYTYPE *) MEMALLOC(AggMemory, HDRSIZEQT * 2); acc->len = HDRSIZEQT * 2; acc->size = 0; } } - pfree( elemsp ); - QTNFree( qex ); - QTNFree( subs ); - QTNFree( acctree ); + pfree(elemsp); + QTNFree(qex); + QTNFree(subs); + QTNFree(acctree); - PG_RETURN_POINTER( acc ); + PG_RETURN_POINTER(acc); } PG_FUNCTION_INFO_V1(rewrite_finish); -Datum rewrite_finish(PG_FUNCTION_ARGS); - -Datum -rewrite_finish(PG_FUNCTION_ARGS) { - QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0); - QUERYTYPE *rewrited; - - if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0 ) { - acc = (QUERYTYPE*)palloc(sizeof(QUERYTYPE)); +Datum rewrite_finish(PG_FUNCTION_ARGS); + +Datum +rewrite_finish(PG_FUNCTION_ARGS) +{ + QUERYTYPE *acc = (QUERYTYPE *) PG_GETARG_POINTER(0); + QUERYTYPE *rewrited; + + if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0) + { + acc = (QUERYTYPE *) palloc(sizeof(QUERYTYPE)); acc->len = HDRSIZEQT; acc->size = 0; } - rewrited = (QUERYTYPE*) palloc( acc->len ); - memcpy( rewrited, acc, acc->len ); - pfree( acc ); + rewrited = (QUERYTYPE *) palloc(acc->len); + memcpy(rewrited, acc, acc->len); + pfree(acc); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewrited); } -Datum tsquery_rewrite(PG_FUNCTION_ARGS); +Datum tsquery_rewrite(PG_FUNCTION_ARGS); Datum -tsquery_rewrite(PG_FUNCTION_ARGS) { +tsquery_rewrite(PG_FUNCTION_ARGS) +{ QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); - text *in = PG_GETARG_TEXT_P(1); + text *in = PG_GETARG_TEXT_P(1); QUERYTYPE *rewrited = query; - QTNode *tree; - char *buf; - void *plan; - Portal portal; - bool isnull; - int i; - - if ( query->size == 0 ) { + QTNode *tree; + char *buf; + void *plan; + Portal portal; + bool isnull; + int i; + + if (query->size == 0) + { PG_FREE_IF_COPY(in, 1); - PG_RETURN_POINTER( rewrited ); + PG_RETURN_POINTER(rewrited); } - tree = QT2QTN( GETQUERY(query), GETOPERAND(query) ); - QTNTernary( tree ); - QTNSort( tree ); + tree = QT2QTN(GETQUERY(query), GETOPERAND(query)); + QTNTernary(tree); + QTNSort(tree); - buf = (char*)palloc( VARSIZE(in) ); + buf = (char *) palloc(VARSIZE(in)); memcpy(buf, VARDATA(in), VARSIZE(in) - VARHDRSZ); - buf[ VARSIZE(in) - VARHDRSZ ] = '\0'; + buf[VARSIZE(in) - VARHDRSZ] = '\0'; SPI_connect(); @@ -345,132 +403,147 @@ tsquery_rewrite(PG_FUNCTION_ARGS) { if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, false)) == NULL) elog(ERROR, "SPI_cursor_open('%s') returns NULL", buf); - + SPI_cursor_fetch(portal, true, 100); if (SPI_tuptable->tupdesc->natts != 2) elog(ERROR, "number of fields doesn't equal to 2"); - if (SPI_gettypeid(SPI_tuptable->tupdesc, 1) != tsqOid ) + if (SPI_gettypeid(SPI_tuptable->tupdesc, 1) != tsqOid) elog(ERROR, "column #1 isn't of tsquery type"); - if (SPI_gettypeid(SPI_tuptable->tupdesc, 2) != tsqOid ) + if (SPI_gettypeid(SPI_tuptable->tupdesc, 2) != tsqOid) elog(ERROR, "column #2 isn't of tsquery type"); - while (SPI_processed > 0 && tree ) { - for (i = 0; i < SPI_processed && tree; i++) { - Datum qdata = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &isnull); - Datum sdata; + while (SPI_processed > 0 && tree) + { + for (i = 0; i < SPI_processed && tree; i++) + { + Datum qdata = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &isnull); + Datum sdata; - if ( isnull ) continue; + if (isnull) + continue; sdata = SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2, &isnull); - if (!isnull) { - QUERYTYPE *qtex = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(qdata)); - QUERYTYPE *qtsubs = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(sdata)); - QTNode *qex, *qsubs = NULL; - - if (qtex->size == 0) { - if ( qtex != (QUERYTYPE *) DatumGetPointer(qdata) ) - pfree( qtex ); - if ( qtsubs != (QUERYTYPE *) DatumGetPointer(sdata) ) - pfree( qtsubs ); + if (!isnull) + { + QUERYTYPE *qtex = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(qdata)); + QUERYTYPE *qtsubs = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(sdata)); + QTNode *qex, + *qsubs = NULL; + + if (qtex->size == 0) + { + if (qtex != (QUERYTYPE *) DatumGetPointer(qdata)) + pfree(qtex); + if (qtsubs != (QUERYTYPE *) DatumGetPointer(sdata)) + pfree(qtsubs); continue; } - qex = QT2QTN( GETQUERY(qtex), GETOPERAND(qtex) ); + qex = QT2QTN(GETQUERY(qtex), GETOPERAND(qtex)); - QTNTernary( qex ); - QTNSort( qex ); + QTNTernary(qex); + QTNSort(qex); - if ( qtsubs->size ) - qsubs = QT2QTN( GETQUERY(qtsubs), GETOPERAND(qtsubs) ); + if (qtsubs->size) + qsubs = QT2QTN(GETQUERY(qtsubs), GETOPERAND(qtsubs)); - tree = findsubquery( tree, qex, SPIMemory, qsubs, NULL ); - - QTNFree( qex ); - if ( qtex != (QUERYTYPE *) DatumGetPointer(qdata) ) - pfree( qtex ); - QTNFree( qsubs ); - if ( qtsubs != (QUERYTYPE *) DatumGetPointer(sdata) ) - pfree( qtsubs ); + tree = findsubquery(tree, qex, SPIMemory, qsubs, NULL); + + QTNFree(qex); + if (qtex != (QUERYTYPE *) DatumGetPointer(qdata)) + pfree(qtex); + QTNFree(qsubs); + if (qtsubs != (QUERYTYPE *) DatumGetPointer(sdata)) + pfree(qtsubs); } } SPI_freetuptable(SPI_tuptable); SPI_cursor_fetch(portal, true, 100); } - + SPI_freetuptable(SPI_tuptable); SPI_cursor_close(portal); SPI_freeplan(plan); - SPI_finish(); + SPI_finish(); - if ( tree ) { - QTNBinary( tree ); - rewrited = QTN2QT( tree, PlainMemory ); - QTNFree( tree ); + if (tree) + { + QTNBinary(tree); + rewrited = QTN2QT(tree, PlainMemory); + QTNFree(tree); PG_FREE_IF_COPY(query, 0); - } else { + } + else + { rewrited->len = HDRSIZEQT; rewrited->size = 0; } pfree(buf); PG_FREE_IF_COPY(in, 1); - PG_RETURN_POINTER( rewrited ); + PG_RETURN_POINTER(rewrited); } PG_FUNCTION_INFO_V1(tsquery_rewrite_query); -Datum tsquery_rewrite_query(PG_FUNCTION_ARGS); +Datum tsquery_rewrite_query(PG_FUNCTION_ARGS); Datum -tsquery_rewrite_query(PG_FUNCTION_ARGS) { - QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); - QUERYTYPE *ex = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); - QUERYTYPE *subst = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(2))); - QUERYTYPE *rewrited = query; - QTNode *tree, *qex, *subs = NULL; - - if ( query->size == 0 || ex->size == 0 ) { - PG_FREE_IF_COPY(ex, 1); - PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER( rewrited ); - } - - tree = QT2QTN( GETQUERY(query), GETOPERAND(query) ); - QTNTernary( tree ); - QTNSort( tree ); - - qex = QT2QTN( GETQUERY(ex), GETOPERAND(ex) ); - QTNTernary( qex ); - QTNSort( qex ); - - if ( subst->size ) - subs = QT2QTN( GETQUERY(subst), GETOPERAND(subst) ); - - tree = findsubquery( tree, qex, PlainMemory, subs, NULL ); - QTNFree( qex ); - QTNFree( subs ); - - if ( !tree ) { +tsquery_rewrite_query(PG_FUNCTION_ARGS) +{ + QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); + QUERYTYPE *ex = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1))); + QUERYTYPE *subst = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(2))); + QUERYTYPE *rewrited = query; + QTNode *tree, + *qex, + *subs = NULL; + + if (query->size == 0 || ex->size == 0) + { + PG_FREE_IF_COPY(ex, 1); + PG_FREE_IF_COPY(subst, 2); + PG_RETURN_POINTER(rewrited); + } + + tree = QT2QTN(GETQUERY(query), GETOPERAND(query)); + QTNTernary(tree); + QTNSort(tree); + + qex = QT2QTN(GETQUERY(ex), GETOPERAND(ex)); + QTNTernary(qex); + QTNSort(qex); + + if (subst->size) + subs = QT2QTN(GETQUERY(subst), GETOPERAND(subst)); + + tree = findsubquery(tree, qex, PlainMemory, subs, NULL); + QTNFree(qex); + QTNFree(subs); + + if (!tree) + { rewrited->len = HDRSIZEQT; rewrited->size = 0; - PG_FREE_IF_COPY(ex, 1); - PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER( rewrited ); - } else { - QTNBinary( tree ); - rewrited = QTN2QT( tree, PlainMemory ); - QTNFree( tree ); + PG_FREE_IF_COPY(ex, 1); + PG_FREE_IF_COPY(subst, 2); + PG_RETURN_POINTER(rewrited); + } + else + { + QTNBinary(tree); + rewrited = QTN2QT(tree, PlainMemory); + QTNFree(tree); } - PG_FREE_IF_COPY(query, 0); - PG_FREE_IF_COPY(ex, 1); - PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER( rewrited ); + PG_FREE_IF_COPY(query, 0); + PG_FREE_IF_COPY(ex, 1); + PG_FREE_IF_COPY(subst, 2); + PG_RETURN_POINTER(rewrited); } - diff --git a/contrib/tsearch2/query_support.c b/contrib/tsearch2/query_support.c index edc2d48fcf..dfdd714073 100644 --- a/contrib/tsearch2/query_support.c +++ b/contrib/tsearch2/query_support.c @@ -4,168 +4,188 @@ #include "query_util.h" PG_FUNCTION_INFO_V1(tsquery_numnode); -Datum tsquery_numnode(PG_FUNCTION_ARGS); +Datum tsquery_numnode(PG_FUNCTION_ARGS); Datum -tsquery_numnode(PG_FUNCTION_ARGS) { +tsquery_numnode(PG_FUNCTION_ARGS) +{ QUERYTYPE *query = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); - int nnode = query->size; - PG_FREE_IF_COPY(query,0); + int nnode = query->size; + + PG_FREE_IF_COPY(query, 0); PG_RETURN_INT32(nnode); } -static QTNode* -join_tsqueries(QUERYTYPE *a, QUERYTYPE *b) { - QTNode *res=(QTNode*)palloc0( sizeof(QTNode) ); +static QTNode * +join_tsqueries(QUERYTYPE * a, QUERYTYPE * b) +{ + QTNode *res = (QTNode *) palloc0(sizeof(QTNode)); res->flags |= QTN_NEEDFREE; - res->valnode = (ITEM*)palloc0( sizeof(ITEM) ); + res->valnode = (ITEM *) palloc0(sizeof(ITEM)); res->valnode->type = OPR; - res->child = (QTNode**)palloc0( sizeof(QTNode*)*2 ); - res->child[0] = QT2QTN( GETQUERY(b), GETOPERAND(b) ); - res->child[1] = QT2QTN( GETQUERY(a), GETOPERAND(a) ); + res->child = (QTNode **) palloc0(sizeof(QTNode *) * 2); + res->child[0] = QT2QTN(GETQUERY(b), GETOPERAND(b)); + res->child[1] = QT2QTN(GETQUERY(a), GETOPERAND(a)); res->nchild = 2; return res; } PG_FUNCTION_INFO_V1(tsquery_and); -Datum tsquery_and(PG_FUNCTION_ARGS); +Datum tsquery_and(PG_FUNCTION_ARGS); Datum -tsquery_and(PG_FUNCTION_ARGS) { +tsquery_and(PG_FUNCTION_ARGS) +{ QUERYTYPE *a = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); QUERYTYPE *b = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); - QTNode *res; + QTNode *res; QUERYTYPE *query; - if ( a->size == 0 ) { - PG_FREE_IF_COPY(a,1); + if (a->size == 0) + { + PG_FREE_IF_COPY(a, 1); PG_RETURN_POINTER(b); - } else if ( b->size == 0 ) { - PG_FREE_IF_COPY(b,1); + } + else if (b->size == 0) + { + PG_FREE_IF_COPY(b, 1); PG_RETURN_POINTER(a); - } + } res = join_tsqueries(a, b); res->valnode->val = '&'; - query = QTN2QT( res, PlainMemory ); + query = QTN2QT(res, PlainMemory); QTNFree(res); - PG_FREE_IF_COPY(a,0); - PG_FREE_IF_COPY(b,1); + PG_FREE_IF_COPY(a, 0); + PG_FREE_IF_COPY(b, 1); PG_RETURN_POINTER(query); } PG_FUNCTION_INFO_V1(tsquery_or); -Datum tsquery_or(PG_FUNCTION_ARGS); +Datum tsquery_or(PG_FUNCTION_ARGS); Datum -tsquery_or(PG_FUNCTION_ARGS) { +tsquery_or(PG_FUNCTION_ARGS) +{ QUERYTYPE *a = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); QUERYTYPE *b = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); - QTNode *res; + QTNode *res; QUERYTYPE *query; - if ( a->size == 0 ) { - PG_FREE_IF_COPY(a,1); + if (a->size == 0) + { + PG_FREE_IF_COPY(a, 1); PG_RETURN_POINTER(b); - } else if ( b->size == 0 ) { - PG_FREE_IF_COPY(b,1); + } + else if (b->size == 0) + { + PG_FREE_IF_COPY(b, 1); PG_RETURN_POINTER(a); - } + } res = join_tsqueries(a, b); res->valnode->val = '|'; - query = QTN2QT( res, PlainMemory ); + query = QTN2QT(res, PlainMemory); QTNFree(res); - PG_FREE_IF_COPY(a,0); - PG_FREE_IF_COPY(b,1); + PG_FREE_IF_COPY(a, 0); + PG_FREE_IF_COPY(b, 1); PG_RETURN_POINTER(query); } PG_FUNCTION_INFO_V1(tsquery_not); -Datum tsquery_not(PG_FUNCTION_ARGS); +Datum tsquery_not(PG_FUNCTION_ARGS); Datum -tsquery_not(PG_FUNCTION_ARGS) { +tsquery_not(PG_FUNCTION_ARGS) +{ QUERYTYPE *a = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); - QTNode *res; + QTNode *res; QUERYTYPE *query; - if ( a->size == 0 ) + if (a->size == 0) PG_RETURN_POINTER(a); - res=(QTNode*)palloc0( sizeof(QTNode) ); + res = (QTNode *) palloc0(sizeof(QTNode)); res->flags |= QTN_NEEDFREE; - res->valnode = (ITEM*)palloc0( sizeof(ITEM) ); + res->valnode = (ITEM *) palloc0(sizeof(ITEM)); res->valnode->type = OPR; res->valnode->val = '!'; - res->child = (QTNode**)palloc0( sizeof(QTNode*) ); - res->child[0] = QT2QTN( GETQUERY(a), GETOPERAND(a) ); + res->child = (QTNode **) palloc0(sizeof(QTNode *)); + res->child[0] = QT2QTN(GETQUERY(a), GETOPERAND(a)); res->nchild = 1; - query = QTN2QT( res, PlainMemory ); + query = QTN2QT(res, PlainMemory); QTNFree(res); - PG_FREE_IF_COPY(a,0); + PG_FREE_IF_COPY(a, 0); PG_RETURN_POINTER(query); } static int -CompareTSQ( QUERYTYPE *a, QUERYTYPE *b ) { - if ( a->size != b->size ) { - return ( a->size < b->size ) ? -1 : 1; - } else if ( a->len != b->len ) { - return ( a->len < b->len ) ? -1 : 1; - } else { - QTNode *an = QT2QTN( GETQUERY(a), GETOPERAND(a) ); - QTNode *bn = QT2QTN( GETQUERY(b), GETOPERAND(b) ); - int res = QTNodeCompare(an, bn); +CompareTSQ(QUERYTYPE * a, QUERYTYPE * b) +{ + if (a->size != b->size) + { + return (a->size < b->size) ? -1 : 1; + } + else if (a->len != b->len) + { + return (a->len < b->len) ? -1 : 1; + } + else + { + QTNode *an = QT2QTN(GETQUERY(a), GETOPERAND(a)); + QTNode *bn = QT2QTN(GETQUERY(b), GETOPERAND(b)); + int res = QTNodeCompare(an, bn); QTNFree(an); QTNFree(bn); - return res; + return res; } return 0; } -PG_FUNCTION_INFO_V1(tsquery_cmp); \ -Datum tsquery_cmp(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(tsquery_cmp); +\ +Datum tsquery_cmp(PG_FUNCTION_ARGS); Datum -tsquery_cmp(PG_FUNCTION_ARGS) { +tsquery_cmp(PG_FUNCTION_ARGS) +{ QUERYTYPE *a = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); QUERYTYPE *b = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); - int res = CompareTSQ(a,b); + int res = CompareTSQ(a, b); - PG_FREE_IF_COPY(a,0); - PG_FREE_IF_COPY(b,1); + PG_FREE_IF_COPY(a, 0); + PG_FREE_IF_COPY(b, 1); PG_RETURN_INT32(res); } -#define CMPFUNC( NAME, ACTION ) \ +#define CMPFUNC( NAME, ACTION ) \ PG_FUNCTION_INFO_V1(NAME); \ Datum NAME(PG_FUNCTION_ARGS); \ \ Datum \ -NAME(PG_FUNCTION_ARGS) { \ +NAME(PG_FUNCTION_ARGS) { \ QUERYTYPE *a = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); \ QUERYTYPE *b = (QUERYTYPE *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); \ int res = CompareTSQ(a,b); \ @@ -176,12 +196,9 @@ NAME(PG_FUNCTION_ARGS) { \ PG_RETURN_BOOL( ACTION ); \ } -CMPFUNC( tsquery_lt, res <0 ); -CMPFUNC( tsquery_le, res<=0 ); -CMPFUNC( tsquery_eq, res==0 ); -CMPFUNC( tsquery_ge, res>=0 ); -CMPFUNC( tsquery_gt, res >0 ); -CMPFUNC( tsquery_ne, res!=0 ); - - - +CMPFUNC(tsquery_lt, res < 0); +CMPFUNC(tsquery_le, res <= 0); +CMPFUNC(tsquery_eq, res == 0); +CMPFUNC(tsquery_ge, res >= 0); +CMPFUNC(tsquery_gt, res > 0); +CMPFUNC(tsquery_ne, res != 0); diff --git a/contrib/tsearch2/query_util.c b/contrib/tsearch2/query_util.c index f509d9b642..efa74fe053 100644 --- a/contrib/tsearch2/query_util.c +++ b/contrib/tsearch2/query_util.c @@ -2,153 +2,180 @@ #include "executor/spi.h" #include "query_util.h" -QTNode* -QT2QTN( ITEM *in, char *operand ) { - QTNode *node = (QTNode*)palloc0( sizeof(QTNode) ); +QTNode * +QT2QTN(ITEM * in, char *operand) +{ + QTNode *node = (QTNode *) palloc0(sizeof(QTNode)); node->valnode = in; - - if (in->type == OPR) { - node->child = (QTNode**)palloc0( sizeof(QTNode*) * 2 ); - node->child[0] = QT2QTN( in + 1, operand ); + + if (in->type == OPR) + { + node->child = (QTNode **) palloc0(sizeof(QTNode *) * 2); + node->child[0] = QT2QTN(in + 1, operand); node->sign = node->child[0]->sign; if (in->val == (int4) '!') node->nchild = 1; - else { + else + { node->nchild = 2; - node->child[1] = QT2QTN( in + in->left, operand ); + node->child[1] = QT2QTN(in + in->left, operand); node->sign |= node->child[1]->sign; } - } else if ( operand ) { + } + else if (operand) + { node->word = operand + in->distance; - node->sign = 1 << ( in->val % 32 ); + node->sign = 1 << (in->val % 32); } - - return node; + + return node; } -void -QTNFree( QTNode* in ) { - if ( !in ) +void +QTNFree(QTNode * in) +{ + if (!in) return; - if ( in->valnode->type == VAL && in->word && (in->flags & QTN_WORDFREE) !=0 ) - pfree( in->word ); + if (in->valnode->type == VAL && in->word && (in->flags & QTN_WORDFREE) != 0) + pfree(in->word); - if ( in->child ) { - if ( in->valnode ) { - if ( in->valnode->type == OPR && in->nchild > 0 ) { - int i; - for (i=0;inchild;i++) - QTNFree( in->child[i] ); + if (in->child) + { + if (in->valnode) + { + if (in->valnode->type == 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 ); + if (in->flags & QTN_NEEDFREE) + pfree(in->valnode); } - pfree( in->child ); + pfree(in->child); } - pfree( in ); + pfree(in); } int -QTNodeCompare( QTNode *an, QTNode *bn ) { - if ( an->valnode->type != bn->valnode->type ) - return ( an->valnode->type > bn->valnode->type ) ? -1 : 1; - else if ( an->valnode->val != bn->valnode->val ) - return ( an->valnode->val > bn->valnode->val ) ? -1 : 1; - else if ( an->valnode->type == VAL ) { - if ( an->valnode->length == bn->valnode->length ) - return strncmp( an->word, bn->word, an->valnode->length ); - else - return ( an->valnode->length > bn->valnode->length ) ? -1 : 1; - } else if ( an->nchild != bn->nchild ) { - return ( an->nchild > bn->nchild ) ? -1 : 1; - } else { - int i,res; - - for( i=0; inchild; i++ ) - if ( (res=QTNodeCompare(an->child[i], bn->child[i]))!=0 ) +QTNodeCompare(QTNode * an, QTNode * bn) +{ + if (an->valnode->type != bn->valnode->type) + return (an->valnode->type > bn->valnode->type) ? -1 : 1; + else if (an->valnode->val != bn->valnode->val) + return (an->valnode->val > bn->valnode->val) ? -1 : 1; + else if (an->valnode->type == VAL) + { + if (an->valnode->length == bn->valnode->length) + return strncmp(an->word, bn->word, an->valnode->length); + else + return (an->valnode->length > bn->valnode->length) ? -1 : 1; + } + else if (an->nchild != bn->nchild) + { + return (an->nchild > bn->nchild) ? -1 : 1; + } + else + { + int i, + res; + + for (i = 0; i < an->nchild; i++) + if ((res = QTNodeCompare(an->child[i], bn->child[i])) != 0) return res; - } - + } + return 0; } static int -cmpQTN( const void *a, const void *b ) { - return QTNodeCompare( *(QTNode**)a, *(QTNode**)b ); +cmpQTN(const void *a, const void *b) +{ + return QTNodeCompare(*(QTNode **) a, *(QTNode **) b); } - -void -QTNSort( QTNode* in ) { - int i; - if ( in->valnode->type != OPR ) +void +QTNSort(QTNode * in) +{ + int i; + + if (in->valnode->type != OPR) return; - - for (i=0;inchild;i++) - QTNSort( in->child[i] ); - if ( in->nchild > 1 ) - qsort((void *) in->child, in->nchild, sizeof(QTNode*), cmpQTN); + + for (i = 0; i < in->nchild; i++) + QTNSort(in->child[i]); + if (in->nchild > 1) + qsort((void *) in->child, in->nchild, sizeof(QTNode *), cmpQTN); } -bool -QTNEq( QTNode* a, QTNode* b ) { - uint32 sign = a->sign & b->sign; - if ( !(sign == a->sign && sign == b->sign) ) +bool +QTNEq(QTNode * a, QTNode * b) +{ + uint32 sign = a->sign & b->sign; + + if (!(sign == a->sign && sign == b->sign)) return 0; - return ( QTNodeCompare(a,b) == 0 ) ? true : false; + return (QTNodeCompare(a, b) == 0) ? true : false; } -void -QTNTernary( QTNode* in ) { - int i; +void +QTNTernary(QTNode * in) +{ + int i; - if ( in->valnode->type != OPR ) + if (in->valnode->type != OPR) return; - for (i=0;inchild;i++) - QTNTernary( in->child[i] ); + for (i = 0; i < in->nchild; i++) + QTNTernary(in->child[i]); + + for (i = 0; i < in->nchild; i++) + { + if (in->valnode->type == in->child[i]->valnode->type && in->valnode->val == in->child[i]->valnode->val) + { + QTNode *cc = in->child[i]; + int oldnchild = in->nchild; - for (i=0;inchild;i++) { - if ( in->valnode->type == in->child[i]->valnode->type && in->valnode->val == in->child[i]->valnode->val ) { - QTNode* cc = in->child[i]; - int oldnchild = in->nchild; + in->nchild += cc->nchild - 1; + in->child = (QTNode **) repalloc(in->child, in->nchild * sizeof(QTNode *)); - 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*) ); + 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; + memcpy(in->child + i, cc->child, cc->nchild * sizeof(QTNode *)); + i += cc->nchild - 1; pfree(cc); - } + } } } -void -QTNBinary( QTNode* in ) { - int i; +void +QTNBinary(QTNode * in) +{ + int i; - if ( in->valnode->type != OPR ) + if (in->valnode->type != OPR) return; - for (i=0;inchild;i++) - QTNBinary( in->child[i] ); + for (i = 0; i < in->nchild; i++) + QTNBinary(in->child[i]); + + if (in->nchild <= 2) + return; - if ( in->nchild <= 2 ) - return; + while (in->nchild > 2) + { + QTNode *nn = (QTNode *) palloc0(sizeof(QTNode)); - while( in->nchild > 2 ) { - QTNode *nn = (QTNode*)palloc0( sizeof(QTNode) ); - nn->valnode = (ITEM*)palloc0( sizeof(ITEM) ); - nn->child = (QTNode**)palloc0( sizeof(QTNode*) * 2 ); + nn->valnode = (ITEM *) palloc0(sizeof(ITEM)); + nn->child = (QTNode **) palloc0(sizeof(QTNode *) * 2); nn->nchild = 2; nn->flags = QTN_NEEDFREE; @@ -161,97 +188,114 @@ QTNBinary( QTNode* in ) { nn->valnode->val = in->valnode->val; in->child[0] = nn; - in->child[1] = in->child[ in->nchild-1 ]; + in->child[1] = in->child[in->nchild - 1]; in->nchild--; - } + } } static void -cntsize(QTNode *in, int4 *sumlen, int4 *nnode) { +cntsize(QTNode * in, int4 *sumlen, int4 *nnode) +{ *nnode += 1; - if ( in->valnode->type == OPR ) { - int i; - for (i=0;inchild;i++) + if (in->valnode->type == OPR) + { + int i; + + for (i = 0; i < in->nchild; i++) cntsize(in->child[i], sumlen, nnode); - } else { - *sumlen += in->valnode->length+1; + } + else + { + *sumlen += in->valnode->length + 1; } } -typedef struct { - ITEM *curitem; - char *operand; - char *curoperand; -} QTN2QTState; +typedef struct +{ + ITEM *curitem; + char *operand; + char *curoperand; +} QTN2QTState; static void -fillQT( QTN2QTState *state, QTNode *in ) { +fillQT(QTN2QTState * state, QTNode * in) +{ *(state->curitem) = *(in->valnode); - - if ( in->valnode->type == VAL ) { - memcpy( state->curoperand, in->word, in->valnode->length ); + + if (in->valnode->type == VAL) + { + memcpy(state->curoperand, in->word, in->valnode->length); state->curitem->distance = state->curoperand - state->operand; - state->curoperand[ in->valnode->length ] = '\0'; - state->curoperand += in->valnode->length + 1; + state->curoperand[in->valnode->length] = '\0'; + state->curoperand += in->valnode->length + 1; state->curitem++; - } else { - ITEM *curitem = state->curitem; + } + else + { + ITEM *curitem = state->curitem; - Assert( in->nchild<=2 ); + Assert(in->nchild <= 2); state->curitem++; - fillQT( state, in->child[0] ); + fillQT(state, in->child[0]); - if ( in->nchild==2 ) { + if (in->nchild == 2) + { curitem->left = state->curitem - curitem; - fillQT( state, in->child[1] ); - } + fillQT(state, in->child[1]); + } } -} +} -QUERYTYPE* -QTN2QT( QTNode* in, MemoryType memtype ) { - QUERYTYPE *out; - int len; - int sumlen=0, nnode=0; - QTN2QTState state; +QUERYTYPE * +QTN2QT(QTNode * in, MemoryType memtype) +{ + QUERYTYPE *out; + int len; + int sumlen = 0, + nnode = 0; + QTN2QTState state; cntsize(in, &sumlen, &nnode); - len = COMPUTESIZE( nnode, sumlen ); + len = COMPUTESIZE(nnode, sumlen); - out = (QUERYTYPE*)MEMALLOC(memtype, len); - out->len = len; - out->size = nnode; + out = (QUERYTYPE *) MEMALLOC(memtype, len); + out->len = len; + out->size = nnode; - state.curitem = GETQUERY( out ); - state.operand = state.curoperand = GETOPERAND( out ); + state.curitem = GETQUERY(out); + state.operand = state.curoperand = GETOPERAND(out); - fillQT( &state, in ); - return out; + fillQT(&state, in); + return out; } QTNode * -QTNCopy( QTNode* in, MemoryType memtype ) { - QTNode *out = (QTNode*)MEMALLOC( memtype, sizeof(QTNode) ); +QTNCopy(QTNode * in, MemoryType memtype) +{ + QTNode *out = (QTNode *) MEMALLOC(memtype, sizeof(QTNode)); *out = *in; - out->valnode = (ITEM*)MEMALLOC( memtype, sizeof(ITEM) ); + out->valnode = (ITEM *) MEMALLOC(memtype, sizeof(ITEM)); *(out->valnode) = *(in->valnode); out->flags |= QTN_NEEDFREE; - - if ( in->valnode->type == VAL ) { - out->word = MEMALLOC( memtype, in->valnode->length + 1 ); - memcpy( out->word, in->word, in->valnode->length ); - out->word[ in->valnode->length ] = '\0'; + + if (in->valnode->type == VAL) + { + out->word = MEMALLOC(memtype, in->valnode->length + 1); + memcpy(out->word, in->word, in->valnode->length); + out->word[in->valnode->length] = '\0'; out->flags |= QTN_WORDFREE; - } else { - int i; + } + else + { + int i; - out->child = (QTNode**)MEMALLOC( memtype, sizeof(QTNode*) * in->nchild ); + out->child = (QTNode **) MEMALLOC(memtype, sizeof(QTNode *) * in->nchild); - for(i=0;inchild;i++) - out->child[i] = QTNCopy( in->child[i], memtype ); - } + for (i = 0; i < in->nchild; i++) + out->child[i] = QTNCopy(in->child[i], memtype); + } return out; } diff --git a/contrib/tsearch2/query_util.h b/contrib/tsearch2/query_util.h index cf3900925a..484c7f383c 100644 --- a/contrib/tsearch2/query_util.h +++ b/contrib/tsearch2/query_util.h @@ -6,39 +6,41 @@ #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 { +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; +} 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 ); +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; +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) ) +#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 diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index d5cb777401..a8c30bf329 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -266,8 +266,10 @@ calc_rank_or(float *w, tsvector * t, QUERYTYPE * q) for (i = 0; i < size; i++) { - float resj,wjm; - int4 jm; + float resj, + wjm; + int4 jm; + entry = find_wordentry(t, q, item[i]); if (!entry) continue; @@ -283,28 +285,29 @@ calc_rank_or(float *w, tsvector * t, QUERYTYPE * q) post = POSNULL + 1; } - resj = 0.0; - wjm = -1.0; - jm = 0; - for (j = 0; j < dimt; j++) - { - resj = resj + wpos(post[j])/((j+1)*(j+1)); - if ( wpos(post[j]) > wjm ) { - wjm = wpos(post[j]); - jm = j; - } - } -/* - limit (sum(i/i^2),i->inf) = pi^2/6 - resj = sum(wi/i^2),i=1,noccurence, - wi - should be sorted desc, - don't sort for now, just choose maximum weight. This should be corrected + resj = 0.0; + wjm = -1.0; + jm = 0; + for (j = 0; j < dimt; j++) + { + resj = resj + wpos(post[j]) / ((j + 1) * (j + 1)); + if (wpos(post[j]) > wjm) + { + wjm = wpos(post[j]); + jm = j; + } + } +/* + limit (sum(i/i^2),i->inf) = pi^2/6 + resj = sum(wi/i^2),i=1,noccurence, + wi - should be sorted desc, + don't sort for now, just choose maximum weight. This should be corrected Oleg Bartunov */ - res = res + ( wjm + resj - wjm/((jm+1)*(jm+1)))/1.64493406685; + res = res + (wjm + resj - wjm / ((jm + 1) * (jm + 1))) / 1.64493406685; } - if ( size > 0 ) - res = res /size; + if (size > 0) + res = res / size; pfree(item); return res; } @@ -414,7 +417,7 @@ rank_def(PG_FUNCTION_ARGS) typedef struct { - ITEM **item; + ITEM **item; int16 nitem; bool needfree; int32 pos; @@ -429,53 +432,59 @@ compareDocR(const void *a, const void *b) } static bool -checkcondition_ITEM(void *checkval, ITEM * val) { - return (bool)(val->istrue); +checkcondition_ITEM(void *checkval, ITEM * val) +{ + return (bool) (val->istrue); } static void -reset_istrue_flag(QUERYTYPE *query) { - ITEM *item = GETQUERY(query); - int i; +reset_istrue_flag(QUERYTYPE * query) +{ + ITEM *item = GETQUERY(query); + int i; /* reset istrue flag */ - for(i = 0; i < query->size; i++) { - if ( item->type == VAL ) + for (i = 0; i < query->size; i++) + { + if (item->type == VAL) item->istrue = 0; item++; } } - + static bool Cover(DocRepresentation * doc, int len, QUERYTYPE * query, int *pos, int *p, int *q) { DocRepresentation *ptr; int lastpos = *pos; - int i; - bool found=false; + int i; + bool found = false; reset_istrue_flag(query); - + *p = 0x7fffffff; *q = 0; ptr = doc + *pos; /* find upper bound of cover from current position, move up */ - while (ptr - doc < len) { - for(i=0;initem;i++) + while (ptr - doc < len) + { + for (i = 0; i < ptr->nitem; i++) ptr->item[i]->istrue = 1; - if ( TS_execute(GETQUERY(query), NULL, false, checkcondition_ITEM) ) { - if (ptr->pos > *q) { + if (TS_execute(GETQUERY(query), NULL, false, checkcondition_ITEM)) + { + if (ptr->pos > *q) + { *q = ptr->pos; lastpos = ptr - doc; found = true; - } + } break; } ptr++; } - if (!found) + if (!found) return false; reset_istrue_flag(query); @@ -483,25 +492,31 @@ Cover(DocRepresentation * doc, int len, QUERYTYPE * query, int *pos, int *p, int ptr = doc + lastpos; /* find lower bound of cover from founded upper bound, move down */ - while (ptr >= doc ) { - for(i=0;initem;i++) + while (ptr >= doc) + { + for (i = 0; i < ptr->nitem; i++) ptr->item[i]->istrue = 1; - if ( TS_execute(GETQUERY(query), NULL, true, checkcondition_ITEM) ) { - if (ptr->pos < *p) + if (TS_execute(GETQUERY(query), NULL, true, checkcondition_ITEM)) + { + if (ptr->pos < *p) *p = ptr->pos; break; } ptr--; } - if ( *p <= *q ) { - /* set position for next try to next lexeme after begining of founded cover */ - *pos= (ptr-doc) + 1; + if (*p <= *q) + { + /* + * set position for next try to next lexeme after begining of founded + * cover + */ + *pos = (ptr - doc) + 1; return true; } (*pos)++; - return Cover( doc, len, query, pos, p, q ); + return Cover(doc, len, query, pos, p, q); } static DocRepresentation * @@ -550,26 +565,32 @@ get_docrep(tsvector * txt, QUERYTYPE * query, int *doclen) for (j = 0; j < dimt; j++) { - if ( j == 0 ) { - ITEM *kptr, *iptr = item+i; - int k; - + if (j == 0) + { + ITEM *kptr, + *iptr = item + i; + int k; + doc[cur].needfree = false; doc[cur].nitem = 0; - doc[cur].item = (ITEM**)palloc( sizeof(ITEM*) * query->size ); + doc[cur].item = (ITEM **) palloc(sizeof(ITEM *) * query->size); - for(k=0; k < query->size; k++) { - kptr = item+k; - if ( k==i || ( item[k].type == VAL && compareITEM( &kptr, &iptr ) == 0 ) ) { - doc[cur].item[ doc[cur].nitem ] = item+k; + for (k = 0; k < query->size; k++) + { + kptr = item + k; + if (k == i || (item[k].type == VAL && compareITEM(&kptr, &iptr) == 0)) + { + doc[cur].item[doc[cur].nitem] = item + k; doc[cur].nitem++; kptr->istrue = 1; } - } - } else { + } + } + else + { doc[cur].needfree = false; - doc[cur].nitem = doc[cur-1].nitem; - doc[cur].item = doc[cur-1].item; + doc[cur].nitem = doc[cur - 1].nitem; + doc[cur].item = doc[cur - 1].item; } doc[cur].pos = WEP_GETPOS(post[j]); cur++; @@ -604,7 +625,7 @@ rank_cd(PG_FUNCTION_ARGS) len, cur, i, - doclen=0; + doclen = 0; doc = get_docrep(txt, query, &doclen); if (!doc) @@ -640,9 +661,9 @@ rank_cd(PG_FUNCTION_ARGS) elog(ERROR, "unrecognized normalization method: %d", method); } - for(i=0;icharmaxlen = pg_database_encoding_max_length(); - prs->str = str; + prs->str = str; prs->lenstr = len; #ifdef TS_USE_WIDE - /* - * Use wide char code only when max encoding length > 1 and ctype != C. - * Some operating systems fail with multi-byte encodings and a C locale. - * Also, for a C locale there is no need to process as multibyte. - * From backend/utils/adt/oracle_compat.c Teodor - */ - - if ( prs->charmaxlen > 1 && !lc_ctype_is_c() ) { - prs->usewide=true; - prs->wstr = (wchar_t*)palloc( sizeof(wchar_t) * prs->lenstr ); - prs->lenwstr = char2wchar( prs->wstr, prs->str, prs->lenstr ); - } else + + /* + * Use wide char code only when max encoding length > 1 and ctype != C. + * Some operating systems fail with multi-byte encodings and a C locale. + * Also, for a C locale there is no need to process as multibyte. From + * backend/utils/adt/oracle_compat.c Teodor + */ + + if (prs->charmaxlen > 1 && !lc_ctype_is_c()) + { + prs->usewide = true; + prs->wstr = (wchar_t *) palloc(sizeof(wchar_t) * prs->lenstr); + prs->lenwstr = char2wchar(prs->wstr, prs->str, prs->lenstr); + } + else #endif - prs->usewide=false; + prs->usewide = false; prs->state = newTParserPosition(NULL); prs->state->state = TPS_Base; @@ -56,16 +61,19 @@ TParserInit( char *str, int len ) { } void -TParserClose( TParser* prs ) { - while( prs->state ) { +TParserClose(TParser * prs) +{ + while (prs->state) + { TParserPosition *ptr = prs->state->prev; - pfree( prs->state ); + + pfree(prs->state); prs->state = ptr; } - if ( prs->wstr ) - pfree( prs->wstr ); - pfree( prs ); + if (prs->wstr) + pfree(prs->wstr); + pfree(prs); } /* @@ -73,15 +81,15 @@ TParserClose( TParser* prs ) { * working with any possible encodings and locales */ -#ifdef TS_USE_WIDE +#ifdef TS_USE_WIDE -#define p_iswhat(type) \ +#define p_iswhat(type) \ static int \ p_is##type(TParser *prs) { \ Assert( prs->state ); \ - return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) : \ + return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) : \ is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) ); \ -} \ +} \ \ static int \ p_isnot##type(TParser *prs) { \ @@ -93,19 +101,19 @@ p_isnot##type(TParser *prs) { \ /* p_iseq should be used only for ascii symbols */ static int -p_iseq(TParser *prs, char c) { - Assert( prs->state ); - return ( ( prs->state->charlen==1 && *( prs->str + prs->state->posbyte ) == c ) ) ? 1 : 0; +p_iseq(TParser * prs, char c) +{ + Assert(prs->state); + return ((prs->state->charlen == 1 && *(prs->str + prs->state->posbyte) == c)) ? 1 : 0; } +#else /* TS_USE_WIDE */ -#else /* TS_USE_WIDE */ - -#define p_iswhat(type) \ +#define p_iswhat(type) \ static int \ p_is##type(TParser *prs) { \ Assert( prs->state ); \ return is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ); \ -} \ +} \ \ static int \ p_isnot##type(TParser *prs) { \ @@ -114,12 +122,12 @@ p_isnot##type(TParser *prs) { \ static int -p_iseq(TParser *prs, char c) { - Assert( prs->state ); - return ( *( prs->str + prs->state->posbyte ) == c ) ? 1 : 0; +p_iseq(TParser * prs, char c) +{ + Assert(prs->state); + return (*(prs->str + prs->state->posbyte) == c) ? 1 : 0; } - -#endif /* TS_USE_WIDE */ +#endif /* TS_USE_WIDE */ p_iswhat(alnum) p_iswhat(alpha) @@ -132,90 +140,114 @@ p_iswhat(upper) p_iswhat(xdigit) static int -p_isEOF(TParser *prs) { - Assert( prs->state ); - return (prs->state->posbyte == prs->lenstr || prs->state->charlen==0) ? 1 : 0; +p_isEOF(TParser * prs) +{ + Assert(prs->state); + return (prs->state->posbyte == prs->lenstr || prs->state->charlen == 0) ? 1 : 0; } static int -p_iseqC(TParser *prs) { - return p_iseq(prs, prs->c); +p_iseqC(TParser * prs) +{ + return p_iseq(prs, prs->c); } static int -p_isneC(TParser *prs) { +p_isneC(TParser * prs) +{ return !p_iseq(prs, prs->c); } static int -p_isascii(TParser *prs) { - return ( prs->state->charlen==1 && isascii( (unsigned char) *( prs->str + prs->state->posbyte ) ) ) ? 1 : 0; +p_isascii(TParser * prs) +{ + return (prs->state->charlen == 1 && isascii((unsigned char) *(prs->str + prs->state->posbyte))) ? 1 : 0; } static int -p_islatin(TParser *prs) { - return ( p_isalpha(prs) && p_isascii(prs) ) ? 1 : 0; +p_islatin(TParser * prs) +{ + return (p_isalpha(prs) && p_isascii(prs)) ? 1 : 0; } static int -p_isnonlatin(TParser *prs) { - return ( p_isalpha(prs) && !p_isascii(prs) ) ? 1 : 0; +p_isnonlatin(TParser * prs) +{ + return (p_isalpha(prs) && !p_isascii(prs)) ? 1 : 0; } -void _make_compiler_happy(void); +void _make_compiler_happy(void); void -_make_compiler_happy(void) { - p_isalnum(NULL); p_isnotalnum(NULL); - p_isalpha(NULL); p_isnotalpha(NULL); - p_isdigit(NULL); p_isnotdigit(NULL); - p_islower(NULL); p_isnotlower(NULL); - p_isprint(NULL); p_isnotprint(NULL); - p_ispunct(NULL); p_isnotpunct(NULL); - p_isspace(NULL); p_isnotspace(NULL); - p_isupper(NULL); p_isnotupper(NULL); - p_isxdigit(NULL); p_isnotxdigit(NULL); - p_isEOF(NULL); - p_iseqC(NULL); p_isneC(NULL); +_make_compiler_happy(void) +{ + p_isalnum(NULL); + p_isnotalnum(NULL); + p_isalpha(NULL); + p_isnotalpha(NULL); + p_isdigit(NULL); + p_isnotdigit(NULL); + p_islower(NULL); + p_isnotlower(NULL); + p_isprint(NULL); + p_isnotprint(NULL); + p_ispunct(NULL); + p_isnotpunct(NULL); + p_isspace(NULL); + p_isnotspace(NULL); + p_isupper(NULL); + p_isnotupper(NULL); + p_isxdigit(NULL); + p_isnotxdigit(NULL); + p_isEOF(NULL); + p_iseqC(NULL); + p_isneC(NULL); } static void -SpecialTags(TParser *prs) { - switch( prs->state->lencharlexeme ) { - case 8: /* lexeme, "state->lencharlexeme) + { + case 8: /* lexeme, "ignore = false; break; - case 7: /*