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����������������������������...다운로드