Commit 3b8bca33 authored by Teodor Sigaev's avatar Teodor Sigaev

Fix memory arrangement of tsquery after removing stop words. It causes

a unused memory holes in tsquery.

Per report by Richard Huxton <dev@archonet.com>.

It was working well because in fact tsquery->size is not used for any
kind of operation except comparing tsqueries. So, in HEAD it's enough to
fix to_tsquery function, but for previous version it's needed to
remove optimization in CompareTSQ to prevent requirement of renew all
stored tsquery.
parent 588d213a
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.9 2008/03/05 15:50:37 momjian Exp $ * $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.10 2008/03/07 14:30:20 teodor Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -350,6 +350,18 @@ to_tsquery_byid(PG_FUNCTION_ARGS) ...@@ -350,6 +350,18 @@ to_tsquery_byid(PG_FUNCTION_ARGS)
PG_RETURN_POINTER(query); PG_RETURN_POINTER(query);
} }
memcpy((void *) GETQUERY(query), (void *) res, len * sizeof(QueryItem)); memcpy((void *) GETQUERY(query), (void *) res, len * sizeof(QueryItem));
if ( len != query->size ) {
char *oldoperand = GETOPERAND(query);
int4 lenoperand = VARSIZE(query) - (oldoperand - (char*)query);
Assert( len < query->size );
query->size = len;
memcpy((void *) GETOPERAND(query), oldoperand, VARSIZE(query) - (oldoperand - (char*)query) );
SET_VARSIZE(query, COMPUTESIZE( len, lenoperand ));
}
pfree(res); pfree(res);
PG_RETURN_TSQUERY(query); PG_RETURN_TSQUERY(query);
} }
...@@ -388,6 +400,18 @@ plainto_tsquery_byid(PG_FUNCTION_ARGS) ...@@ -388,6 +400,18 @@ plainto_tsquery_byid(PG_FUNCTION_ARGS)
PG_RETURN_POINTER(query); PG_RETURN_POINTER(query);
} }
memcpy((void *) GETQUERY(query), (void *) res, len * sizeof(QueryItem)); memcpy((void *) GETQUERY(query), (void *) res, len * sizeof(QueryItem));
if ( len != query->size ) {
char *oldoperand = GETOPERAND(query);
int4 lenoperand = VARSIZE(query) - (oldoperand - (char*)query);
Assert( len < query->size );
query->size = len;
memcpy((void *) GETOPERAND(query), oldoperand, lenoperand );
SET_VARSIZE(query, COMPUTESIZE( len, lenoperand ));
}
pfree(res); pfree(res);
PG_RETURN_POINTER(query); PG_RETURN_POINTER(query);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment