Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5103be5

Browse files
committed
Bugfix and small refactor of rum_ts_join_pos
1 parent 9d16555 commit 5103be5

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

src/rum_ts_utils.c

+31-19
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)