[Groonga-commit] pgroonga/pgroonga at 9cac325 [master] Fix a bug that record isn't found after SELECT

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index