Kouhei Sutou
null+****@clear*****
Fri Oct 7 01:13:54 JST 2016
Kouhei Sutou 2016-10-07 01:13:54 +0900 (Fri, 07 Oct 2016) New Revision: 9cac3254b0e51ebd0fb41a15b98b74c82e29d417 https://github.com/pgroonga/pgroonga/commit/9cac3254b0e51ebd0fb41a15b98b74c82e29d417 Message: Fix a bug that record isn't found after SELECT GitHub: fix #23 It may be occurred when * Source table is updated and * Index scan is used Reported by yongxianggao-chanjet. Thanks!!! Added files: expected/index-scan/kill-prior-tuple.out sql/index-scan/kill-prior-tuple.sql Modified files: src/pgroonga.c Added: expected/index-scan/kill-prior-tuple.out (+52 -0) 100644 =================================================================== --- /dev/null +++ expected/index-scan/kill-prior-tuple.out 2016-10-07 01:13:54 +0900 (99c1642) @@ -0,0 +1,52 @@ +CREATE TABLE ids ( + id integer, + memo text +); +CREATE INDEX pgroonga_index ON ids USING pgroonga (id, memo); +INSERT INTO ids VALUES (2, 'a'); +INSERT INTO ids VALUES (7, 'a'); +INSERT INTO ids VALUES (6, 'a'); +INSERT INTO ids VALUES (4, 'a'); +INSERT INTO ids VALUES (5, 'a'); +INSERT INTO ids VALUES (8, 'a'); +INSERT INTO ids VALUES (1, 'a'); +INSERT INTO ids VALUES (10, 'a'); +INSERT INTO ids VALUES (3, 'a'); +INSERT INTO ids VALUES (9, 'a'); +INSERT INTO ids VALUES (12, 'a'); +INSERT INTO ids VALUES (17, 'a'); +INSERT INTO ids VALUES (16, 'a'); +INSERT INTO ids VALUES (14, 'a'); +INSERT INTO ids VALUES (15, 'a'); +INSERT INTO ids VALUES (18, 'a'); +INSERT INTO ids VALUES (11, 'a'); +INSERT INTO ids VALUES (110, 'a'); +INSERT INTO ids VALUES (13, 'a'); +INSERT INTO ids VALUES (19, 'a'); +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; +UPDATE ids SET memo = 'b' WHERE id = 10; +UPDATE ids SET memo = 'b' WHERE id = 5; +UPDATE ids SET memo = 'b' WHERE id = 6; +SELECT * FROM ids WHERE 2 <= id and memo @@ 'a'; + id | memo +-----+------ + 2 | a + 3 | a + 4 | a + 7 | a + 8 | a + 9 | a + 11 | a + 12 | a + 13 | a + 14 | a + 15 | a + 16 | a + 17 | a + 18 | a + 19 | a + 110 | a +(16 rows) + Added: sql/index-scan/kill-prior-tuple.sql (+36 -0) 100644 =================================================================== --- /dev/null +++ sql/index-scan/kill-prior-tuple.sql 2016-10-07 01:13:54 +0900 (6062b73) @@ -0,0 +1,36 @@ +CREATE TABLE ids ( + id integer, + memo text +); + +CREATE INDEX pgroonga_index ON ids USING pgroonga (id, memo); + +INSERT INTO ids VALUES (2, 'a'); +INSERT INTO ids VALUES (7, 'a'); +INSERT INTO ids VALUES (6, 'a'); +INSERT INTO ids VALUES (4, 'a'); +INSERT INTO ids VALUES (5, 'a'); +INSERT INTO ids VALUES (8, 'a'); +INSERT INTO ids VALUES (1, 'a'); +INSERT INTO ids VALUES (10, 'a'); +INSERT INTO ids VALUES (3, 'a'); +INSERT INTO ids VALUES (9, 'a'); +INSERT INTO ids VALUES (12, 'a'); +INSERT INTO ids VALUES (17, 'a'); +INSERT INTO ids VALUES (16, 'a'); +INSERT INTO ids VALUES (14, 'a'); +INSERT INTO ids VALUES (15, 'a'); +INSERT INTO ids VALUES (18, 'a'); +INSERT INTO ids VALUES (11, 'a'); +INSERT INTO ids VALUES (110, 'a'); +INSERT INTO ids VALUES (13, 'a'); +INSERT INTO ids VALUES (19, 'a'); + +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; + +UPDATE ids SET memo = 'b' WHERE id = 10; +UPDATE ids SET memo = 'b' WHERE id = 5; +UPDATE ids SET memo = 'b' WHERE id = 6; +SELECT * FROM ids WHERE 2 <= id and memo @@ 'a'; Modified: src/pgroonga.c (+13 -1) =================================================================== --- src/pgroonga.c 2016-09-29 15:50:22 +0900 (0d400b3) +++ src/pgroonga.c 2016-10-07 01:13:54 +0900 (9230c9b) @@ -3338,7 +3338,19 @@ pgroonga_gettuple_raw(IndexScanDesc scan, if (scan->kill_prior_tuple && so->currentID != GRN_ID_NIL) { - grn_table_delete_by_id(ctx, so->sourcesTable, so->currentID); + grn_id recordID = so->currentID; + if (so->sorted) + { + GRN_BULK_REWIND(&(buffers->general)); + grn_obj_get_value(ctx, so->sorted, recordID, &(buffers->general)); + recordID = GRN_RECORD_VALUE(&(buffers->general)); + } + if (so->searched) + { + grn_table_get_key(ctx, so->searched, recordID, + &recordID, sizeof(grn_id)); + } + grn_table_delete_by_id(ctx, so->sourcesTable, recordID); } if (so->indexCursor) -------------- next part -------------- HTML����������������������������...Download