[Groonga-commit] pgroonga/pgroonga at b8f059e [master] Fix a bug that sequential scan doesn't work for regexp search

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Dec 25 19:38:29 JST 2015


Kouhei Sutou	2015-12-25 19:38:29 +0900 (Fri, 25 Dec 2015)

  New Revision: b8f059e0488876161c6479cc31b7f3bb34eaa702
  https://github.com/pgroonga/pgroonga/commit/b8f059e0488876161c6479cc31b7f3bb34eaa702

  Message:
    Fix a bug that sequential scan doesn't work for regexp search
    
    Reported by Hiroyuki Sato. Thanks!!!

  Added files:
    expected/regexp/text/regexp/dot/bitmapscan.out
    expected/regexp/text/regexp/dot/indexscan.out
    expected/regexp/text/regexp/dot/seqscan.out
    sql/regexp/text/regexp/dot/bitmapscan.sql
    sql/regexp/text/regexp/dot/indexscan.sql
    sql/regexp/text/regexp/dot/seqscan.sql
  Modified files:
    pgroonga.c

  Added: expected/regexp/text/regexp/dot/bitmapscan.out (+21 -0) 100644
===================================================================
--- /dev/null
+++ expected/regexp/text/regexp/dot/bitmapscan.out    2015-12-25 19:38:29 +0900 (813aa55)
@@ -0,0 +1,21 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+SET enable_seqscan = off;
+SET enable_indexscan = off;
+SET enable_bitmapscan = on;
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+ id |                        content                        
+----+-------------------------------------------------------
+  2 | Groonga is fast full text search engine.
+  3 | PGroonga is a PostgreSQL extension that uses Groonga.
+(2 rows)
+
+DROP TABLE memos;

  Added: expected/regexp/text/regexp/dot/indexscan.out (+21 -0) 100644
===================================================================
--- /dev/null
+++ expected/regexp/text/regexp/dot/indexscan.out    2015-12-25 19:38:29 +0900 (7508c20)
@@ -0,0 +1,21 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+SET enable_seqscan = off;
+SET enable_indexscan = on;
+SET enable_bitmapscan = off;
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+ id |                        content                        
+----+-------------------------------------------------------
+  2 | Groonga is fast full text search engine.
+  3 | PGroonga is a PostgreSQL extension that uses Groonga.
+(2 rows)
+
+DROP TABLE memos;

  Added: expected/regexp/text/regexp/dot/seqscan.out (+21 -0) 100644
===================================================================
--- /dev/null
+++ expected/regexp/text/regexp/dot/seqscan.out    2015-12-25 19:38:29 +0900 (f7d3fbb)
@@ -0,0 +1,21 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+SET enable_seqscan = on;
+SET enable_indexscan = off;
+SET enable_bitmapscan = off;
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+ id |                        content                        
+----+-------------------------------------------------------
+  2 | Groonga is fast full text search engine.
+  3 | PGroonga is a PostgreSQL extension that uses Groonga.
+(2 rows)
+
+DROP TABLE memos;

  Modified: pgroonga.c (+21 -18)
===================================================================
--- pgroonga.c    2015-12-25 19:18:45 +0900 (70ac242)
+++ pgroonga.c    2015-12-25 19:38:29 +0900 (7bdd4b2)
@@ -3384,14 +3384,15 @@ pgroonga_beginscan(PG_FUNCTION_ARGS)
 
 static void
 PGrnSearchBuildConditionLikeMatchFlush(grn_obj *expression,
-									   grn_obj *matchTarget,
+									   grn_obj *targetColumn,
 									   grn_obj *keyword,
 									   int *nKeywords)
 {
 	if (GRN_TEXT_LEN(keyword) == 0)
 		return;
 
-	grn_expr_append_obj(ctx, expression, matchTarget, GRN_OP_PUSH, 1);
+	grn_expr_append_obj(ctx, expression, targetColumn, GRN_OP_PUSH, 1);
+	grn_expr_append_op(ctx, expression, GRN_OP_GET_VALUE, 1);
 	grn_expr_append_const_str(ctx, expression,
 							  GRN_TEXT_VALUE(keyword),
 							  GRN_TEXT_LEN(keyword),
@@ -3406,7 +3407,7 @@ PGrnSearchBuildConditionLikeMatchFlush(grn_obj *expression,
 
 static void
 PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data,
-								  grn_obj *matchTarget,
+								  grn_obj *targetColumn,
 								  grn_obj *query)
 {
 	grn_obj *expression;
@@ -3443,7 +3444,7 @@ PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data,
 		case '%':
 		case '_':
 			PGrnSearchBuildConditionLikeMatchFlush(expression,
-												   matchTarget,
+												   targetColumn,
 												   &keywordBuffer,
 												   &nKeywords);
 			break;
@@ -3454,7 +3455,7 @@ PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data,
 	}
 
 	PGrnSearchBuildConditionLikeMatchFlush(expression,
-										   matchTarget,
+										   targetColumn,
 										   &keywordBuffer,
 										   &nKeywords);
 	if (nKeywords == 0)
@@ -3468,7 +3469,7 @@ PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data,
 
 static void
 PGrnSearchBuildConditionLikeRegexp(PGrnSearchData *data,
-								   grn_obj *matchTarget,
+								   grn_obj *targetColumn,
 								   grn_obj *query)
 {
 	grn_obj *expression;
@@ -3576,7 +3577,8 @@ PGrnSearchBuildConditionLikeRegexp(PGrnSearchData *data,
 	if (!lastIsPercent)
 		GRN_TEXT_PUTS(ctx, &patternBuffer, "\\z");
 
-	grn_expr_append_obj(ctx, expression, matchTarget, GRN_OP_PUSH, 1);
+	grn_expr_append_obj(ctx, expression, targetColumn, GRN_OP_PUSH, 1);
+	grn_expr_append_op(ctx, expression, GRN_OP_GET_VALUE, 1);
 	grn_expr_append_const_str(ctx, expression,
 							  GRN_TEXT_VALUE(&patternBuffer),
 							  GRN_TEXT_LEN(&patternBuffer),
@@ -3824,7 +3826,6 @@ PGrnSearchBuildCondition(IndexScanDesc scan,
 	Form_pg_attribute attribute;
 	const char *targetColumnName;
 	grn_obj *targetColumn;
-	grn_obj *matchTarget, *matchTargetVariable;
 	grn_operator operator = GRN_OP_NOP;
 
 	/* NULL key is not supported */
@@ -3843,12 +3844,6 @@ PGrnSearchBuildCondition(IndexScanDesc scan,
 		return PGrnSearchBuildConditionJSON(data, key, targetColumn);
 #endif
 
-	GRN_EXPR_CREATE_FOR_QUERY(ctx, so->sourcesTable,
-							  matchTarget, matchTargetVariable);
-	GRN_PTR_PUT(ctx, &(data->matchTargets), matchTarget);
-
-	grn_expr_append_obj(ctx, matchTarget, targetColumn, GRN_OP_PUSH, 1);
-
 	{
 		grn_id domain;
 		unsigned char flags = 0;
@@ -3909,18 +3904,25 @@ PGrnSearchBuildCondition(IndexScanDesc scan,
 	{
 	case PGrnLikeStrategyNumber:
 		if (PGrnIsForRegexpSearchIndex(index, key->sk_attno - 1))
-			PGrnSearchBuildConditionLikeRegexp(data, matchTarget, &buffer);
+			PGrnSearchBuildConditionLikeRegexp(data, targetColumn, &buffer);
 		else
-			PGrnSearchBuildConditionLikeMatch(data, matchTarget, &buffer);
+			PGrnSearchBuildConditionLikeMatch(data, targetColumn, &buffer);
 		break;
 	case PGrnILikeStrategyNumber:
-		PGrnSearchBuildConditionLikeMatch(data, matchTarget, &buffer);
+		PGrnSearchBuildConditionLikeMatch(data, targetColumn, &buffer);
 		break;
 	case PGrnQueryStrategyNumber:
 	{
 		grn_rc rc;
+		grn_obj *matchTarget, *matchTargetVariable;
 		grn_expr_flags flags =
 			GRN_EXPR_SYNTAX_QUERY | GRN_EXPR_ALLOW_LEADING_NOT;
+
+		GRN_EXPR_CREATE_FOR_QUERY(ctx, so->sourcesTable,
+								  matchTarget, matchTargetVariable);
+		GRN_PTR_PUT(ctx, &(data->matchTargets), matchTarget);
+		grn_expr_append_obj(ctx, matchTarget, targetColumn, GRN_OP_PUSH, 1);
+
 		rc = grn_expr_parse(ctx, data->expression,
 							GRN_TEXT_VALUE(&buffer), GRN_TEXT_LEN(&buffer),
 							matchTarget, GRN_OP_MATCH, GRN_OP_AND,
@@ -3936,7 +3938,8 @@ PGrnSearchBuildCondition(IndexScanDesc scan,
 	}
 	default:
 		grn_expr_append_obj(ctx, data->expression,
-							matchTarget, GRN_OP_PUSH, 1);
+							targetColumn, GRN_OP_PUSH, 1);
+		grn_expr_append_op(ctx, data->expression, GRN_OP_GET_VALUE, 1);
 		grn_expr_append_const(ctx, data->expression,
 							  &buffer, GRN_OP_PUSH, 1);
 		grn_expr_append_op(ctx, data->expression, operator, 2);

  Added: sql/regexp/text/regexp/dot/bitmapscan.sql (+20 -0) 100644
===================================================================
--- /dev/null
+++ sql/regexp/text/regexp/dot/bitmapscan.sql    2015-12-25 19:38:29 +0900 (1990b19)
@@ -0,0 +1,20 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+
+SET enable_seqscan = off;
+SET enable_indexscan = off;
+SET enable_bitmapscan = on;
+
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+
+DROP TABLE memos;

  Added: sql/regexp/text/regexp/dot/indexscan.sql (+20 -0) 100644
===================================================================
--- /dev/null
+++ sql/regexp/text/regexp/dot/indexscan.sql    2015-12-25 19:38:29 +0900 (74159e4)
@@ -0,0 +1,20 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+
+SET enable_seqscan = off;
+SET enable_indexscan = on;
+SET enable_bitmapscan = off;
+
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+
+DROP TABLE memos;

  Added: sql/regexp/text/regexp/dot/seqscan.sql (+20 -0) 100644
===================================================================
--- /dev/null
+++ sql/regexp/text/regexp/dot/seqscan.sql    2015-12-25 19:38:29 +0900 (095cd08)
@@ -0,0 +1,20 @@
+CREATE TABLE memos (
+  id integer,
+  content text
+);
+
+INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
+INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
+INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
+
+CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
+
+SET enable_seqscan = on;
+SET enable_indexscan = off;
+SET enable_bitmapscan = off;
+
+SELECT id, content
+  FROM memos
+ WHERE content @~ '.roonga';
+
+DROP TABLE memos;
-------------- next part --------------
HTML����������������������������...
다운로드 



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