77 *
88 *
99 * IDENTIFICATION
10- * $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.3 2007/09/10 12:36:40 teodor Exp $
10+ * $PostgreSQL: pgsql/src/backend/tsearch/to_tsany.c,v 1.4 2007/09/26 10:09:57 teodor Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -40,7 +40,12 @@ compareWORD(const void *a, const void *b)
4040 ((ParsedWord * )b )-> len );
4141
4242if (res == 0 )
43+ {
44+ if ( ((ParsedWord * )a )-> pos .pos == ((ParsedWord * )b )-> pos .pos )
45+ return 0 ;
46+
4347return (((ParsedWord * )a )-> pos .pos > ((ParsedWord * )b )-> pos .pos ) ?1 :-1 ;
48+ }
4449return res ;
4550}
4651return (((ParsedWord * )a )-> len > ((ParsedWord * )b )-> len ) ?1 :-1 ;
@@ -66,18 +71,31 @@ uniqueWORD(ParsedWord * a, int4 l)
6671res = a ;
6772ptr = a + 1 ;
6873
74+ /*
75+ * Sort words with its positions
76+ */
6977qsort ((void * )a ,l ,sizeof (ParsedWord ),compareWORD );
78+
79+ /*
80+ * Initialize first word and its first position
81+ */
7082tmppos = LIMITPOS (a -> pos .pos );
7183a -> alen = 2 ;
7284a -> pos .apos = (uint16 * )palloc (sizeof (uint16 )* a -> alen );
7385a -> pos .apos [0 ]= 1 ;
7486a -> pos .apos [1 ]= tmppos ;
7587
88+ /*
89+ * Summarize position information for each word
90+ */
7691while (ptr - a < l )
7792{
7893if (!(ptr -> len == res -> len &&
7994strncmp (ptr -> word ,res -> word ,res -> len )== 0 ))
8095{
96+ /*
97+ * Got a new word, so put it in result
98+ */
8199res ++ ;
82100res -> len = ptr -> len ;
83101res -> word = ptr -> word ;
@@ -89,8 +107,14 @@ uniqueWORD(ParsedWord * a, int4 l)
89107}
90108else
91109{
110+ /*
111+ * The word already exists, so adjust position information.
112+ * But before we should check size of position's array,
113+ * max allowed value for position and uniqueness of position
114+ */
92115pfree (ptr -> word );
93- if (res -> pos .apos [0 ]< MAXNUMPOS - 1 && res -> pos .apos [res -> pos .apos [0 ]]!= MAXENTRYPOS - 1 )
116+ if (res -> pos .apos [0 ]< MAXNUMPOS - 1 && res -> pos .apos [res -> pos .apos [0 ]]!= MAXENTRYPOS - 1 &&
117+ res -> pos .apos [res -> pos .apos [0 ]]!= LIMITPOS (ptr -> pos .pos ))
94118{
95119if (res -> pos .apos [0 ]+ 1 >=res -> alen )
96120{