@@ -991,6 +991,7 @@ count_pos(char *ptr, int len)
991
991
if (!(ptr [i ] & HIGHBIT ))
992
992
count ++ ;
993
993
}
994
+ Assert (!(ptr [i - 1 ] & HIGHBIT ));
994
995
return count ;
995
996
}
996
997
@@ -2208,6 +2209,7 @@ rum_ts_join_pos(PG_FUNCTION_ARGS)
2208
2209
count2 = count_pos (in2 , VARSIZE_ANY_EXHDR (addInfo2 )),
2209
2210
countRes = 0 ;
2210
2211
int i1 = 0 , i2 = 0 ;
2212
+ int n_equals = 0 ;
2211
2213
Size size ;
2212
2214
WordEntryPos pos1 = 0 ,
2213
2215
pos2 = 0 ,
@@ -2220,51 +2222,61 @@ rum_ts_join_pos(PG_FUNCTION_ARGS)
2220
2222
in1 = decompress_pos (in1 , & pos1 );
2221
2223
in2 = decompress_pos (in2 , & pos2 );
2222
2224
2223
- while ( i1 < count1 && i2 < count2 )
2225
+ for (;; )
2224
2226
{
2225
2227
if (WEP_GETPOS (pos1 ) > WEP_GETPOS (pos2 ))
2226
2228
{
2227
2229
pos [countRes ++ ] = pos2 ;
2228
- if (i2 < count2 )
2229
- in2 = decompress_pos (in2 , & pos2 );
2230
2230
i2 ++ ;
2231
+ if (i2 >= count2 )
2232
+ break ;
2233
+ in2 = decompress_pos (in2 , & pos2 );
2231
2234
}
2232
2235
else if (WEP_GETPOS (pos1 ) < WEP_GETPOS (pos2 ))
2233
2236
{
2234
2237
pos [countRes ++ ] = pos1 ;
2235
- if (i1 < count1 )
2236
- in1 = decompress_pos (in1 , & pos1 );
2237
2238
i1 ++ ;
2239
+ if (i1 >= count1 )
2240
+ break ;
2241
+ in1 = decompress_pos (in1 , & pos1 );
2238
2242
}
2239
2243
else
2240
2244
{
2241
2245
pos [countRes ++ ] = pos1 ;
2246
+ n_equals ++ ;
2247
+ i1 ++ ;
2248
+ i2 ++ ;
2242
2249
if (i1 < count1 )
2243
2250
in1 = decompress_pos (in1 , & pos1 );
2244
2251
if (i2 < count2 )
2245
2252
in2 = decompress_pos (in2 , & pos2 );
2246
- i1 ++ ;
2247
- i2 ++ ;
2253
+ if ( i2 >= count2 || i1 >= count1 )
2254
+ break ;
2248
2255
}
2249
2256
}
2250
2257
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 ;
2255
2265
in1 = decompress_pos (in1 , & pos1 );
2256
- i1 ++ ;
2257
- }
2258
-
2259
- while (i2 < count2 )
2266
+ }
2267
+ else if (i2 < count2 )
2260
2268
{
2261
- pos [countRes ++ ] = pos2 ;
2262
- if (i2 < count2 )
2269
+ for (;;)
2270
+ {
2271
+ pos [countRes ++ ] = pos2 ;
2272
+ i2 ++ ;
2273
+ if (i2 >= count2 )
2274
+ break ;
2263
2275
in2 = decompress_pos (in2 , & pos2 );
2264
- i2 ++ ;
2276
+ }
2265
2277
}
2266
2278
2267
- Assert (countRes <= ( count1 + count2 ) );
2279
+ Assert (countRes == count1 + count2 - n_equals );
2268
2280
2269
2281
/*
2270
2282
* In some cases compressed positions may take more memory than
0 commit comments