@@ -991,6 +991,7 @@ count_pos(char *ptr, int len)
991991 if (!(ptr [i ] & HIGHBIT ))
992992 count ++ ;
993993 }
994+ Assert (!(ptr [i - 1 ] & HIGHBIT ));
994995 return count ;
995996}
996997
@@ -2208,6 +2209,7 @@ rum_ts_join_pos(PG_FUNCTION_ARGS)
22082209 count2 = count_pos (in2 , VARSIZE_ANY_EXHDR (addInfo2 )),
22092210 countRes = 0 ;
22102211 int i1 = 0 , i2 = 0 ;
2212+ int n_equals = 0 ;
22112213 Size size ;
22122214 WordEntryPos pos1 = 0 ,
22132215 pos2 = 0 ,
@@ -2220,51 +2222,61 @@ rum_ts_join_pos(PG_FUNCTION_ARGS)
22202222 in1 = decompress_pos (in1 , & pos1 );
22212223 in2 = decompress_pos (in2 , & pos2 );
22222224
2223- while ( i1 < count1 && i2 < count2 )
2225+ for (;; )
22242226 {
22252227 if (WEP_GETPOS (pos1 ) > WEP_GETPOS (pos2 ))
22262228 {
22272229 pos [countRes ++ ] = pos2 ;
2228- if (i2 < count2 )
2229- in2 = decompress_pos (in2 , & pos2 );
22302230 i2 ++ ;
2231+ if (i2 >= count2 )
2232+ break ;
2233+ in2 = decompress_pos (in2 , & pos2 );
22312234 }
22322235 else if (WEP_GETPOS (pos1 ) < WEP_GETPOS (pos2 ))
22332236 {
22342237 pos [countRes ++ ] = pos1 ;
2235- if (i1 < count1 )
2236- in1 = decompress_pos (in1 , & pos1 );
22372238 i1 ++ ;
2239+ if (i1 >= count1 )
2240+ break ;
2241+ in1 = decompress_pos (in1 , & pos1 );
22382242 }
22392243 else
22402244 {
22412245 pos [countRes ++ ] = pos1 ;
2246+ n_equals ++ ;
2247+ i1 ++ ;
2248+ i2 ++ ;
22422249 if (i1 < count1 )
22432250 in1 = decompress_pos (in1 , & pos1 );
22442251 if (i2 < count2 )
22452252 in2 = decompress_pos (in2 , & pos2 );
2246- i1 ++ ;
2247- i2 ++ ;
2253+ if ( i2 >= count2 || i1 >= count1 )
2254+ break ;
22482255 }
22492256 }
22502257
2251- while (i1 < count1 )
2252- {
2253- pos [countRes ++ ] = pos1 ;
2254- if (i1 < count1 )
2258+ if (i1 < count1 )
2259+ for (;;)
2260+ {
2261+ pos [countRes ++ ] = pos1 ;
2262+ i1 ++ ;
2263+ if (i1 >= count1 )
2264+ break ;
22552265 in1 = decompress_pos (in1 , & pos1 );
2256- i1 ++ ;
2257- }
2258-
2259- while (i2 < count2 )
2266+ }
2267+ else if (i2 < count2 )
22602268 {
2261- pos [countRes ++ ] = pos2 ;
2262- if (i2 < count2 )
2269+ for (;;)
2270+ {
2271+ pos [countRes ++ ] = pos2 ;
2272+ i2 ++ ;
2273+ if (i2 >= count2 )
2274+ break ;
22632275 in2 = decompress_pos (in2 , & pos2 );
2264- i2 ++ ;
2276+ }
22652277 }
22662278
2267- Assert (countRes <= ( count1 + count2 ) );
2279+ Assert (countRes == count1 + count2 - n_equals );
22682280
22692281 /*
22702282 * In some cases compressed positions may take more memory than
0 commit comments