Kouhei Sutou
null+****@clear*****
Wed Oct 28 21:58:39 JST 2015
Kouhei Sutou 2015-10-28 21:58:39 +0900 (Wed, 28 Oct 2015) New Revision: da4b42849fdb481c01bec3414a7873c79d930d8a https://github.com/pgroonga/pgroonga/commit/da4b42849fdb481c01bec3414a7873c79d930d8a Message: Use recheck for LIKE Added files: expected/full-text-search/text/single/like/underscore/bitmapscan.out expected/full-text-search/text/single/like/underscore/indexscan.out expected/full-text-search/text/single/like/underscore/seqscan.out sql/full-text-search/text/single/like/underscore/bitmapscan.sql sql/full-text-search/text/single/like/underscore/indexscan.sql sql/full-text-search/text/single/like/underscore/seqscan.sql Copied files: expected/full-text-search/text/single/like/begin/bitmapscan.out (from sql/full-text-search/text/single/like/bitmapscan.sql) expected/full-text-search/text/single/like/begin/indexscan.out (from sql/full-text-search/text/single/like/indexscan.sql) expected/full-text-search/text/single/like/begin/seqscan.out (from sql/full-text-search/text/single/like/seqscan.sql) expected/full-text-search/text/single/like/end/indexscan.out (from expected/full-text-search/text/single/like/indexscan.out) expected/full-text-search/text/single/like/partial/bitmapscan.out (from expected/full-text-search/text/single/like/seqscan.out) expected/full-text-search/text/single/like/partial/indexscan.out (from expected/full-text-search/text/single/like/seqscan.out) sql/full-text-search/text/single/like/begin/bitmapscan.sql (from sql/full-text-search/text/single/like/bitmapscan.sql) sql/full-text-search/text/single/like/begin/indexscan.sql (from sql/full-text-search/text/single/like/indexscan.sql) sql/full-text-search/text/single/like/begin/seqscan.sql (from sql/full-text-search/text/single/like/seqscan.sql) sql/full-text-search/text/single/like/end/bitmapscan.sql (from sql/full-text-search/text/single/like/bitmapscan.sql) sql/full-text-search/text/single/like/end/indexscan.sql (from sql/full-text-search/text/single/like/indexscan.sql) sql/full-text-search/text/single/like/end/seqscan.sql (from sql/full-text-search/text/single/like/seqscan.sql) Modified files: pgroonga.c Renamed files: expected/full-text-search/text/single/like/end/bitmapscan.out (from expected/full-text-search/text/single/like/bitmapscan.out) expected/full-text-search/text/single/like/end/seqscan.out (from expected/full-text-search/text/single/like/indexscan.out) expected/full-text-search/text/single/like/partial/seqscan.out (from expected/full-text-search/text/single/like/seqscan.out) sql/full-text-search/text/single/like/partial/bitmapscan.sql (from sql/full-text-search/text/single/like/bitmapscan.sql) sql/full-text-search/text/single/like/partial/indexscan.sql (from sql/full-text-search/text/single/like/indexscan.sql) sql/full-text-search/text/single/like/partial/seqscan.sql (from sql/full-text-search/text/single/like/seqscan.sql) Copied: expected/full-text-search/text/single/like/begin/bitmapscan.out (+5 -5) 79% =================================================================== --- sql/full-text-search/text/single/like/bitmapscan.sql 2015-10-28 21:12:24 +0900 (b102ea2) +++ expected/full-text-search/text/single/like/begin/bitmapscan.out 2015-10-28 21:58:39 +0900 (3597661) @@ -2,20 +2,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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); - CREATE INDEX grnindex ON memos USING pgroonga (content); - SET enable_seqscan = off; SET enable_indexscan = off; SET enable_bitmapscan = on; - SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; + id | content +----+------------------------ + 1 | PostgreSQL is a RDBMS. +(1 row) DROP TABLE memos; Copied: expected/full-text-search/text/single/like/begin/indexscan.out (+5 -5) 79% =================================================================== --- sql/full-text-search/text/single/like/indexscan.sql 2015-10-28 21:12:24 +0900 (4fdd972) +++ expected/full-text-search/text/single/like/begin/indexscan.out 2015-10-28 21:58:39 +0900 (c2f99c9) @@ -2,20 +2,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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); - CREATE INDEX grnindex ON memos USING pgroonga (content); - SET enable_seqscan = off; SET enable_indexscan = on; SET enable_bitmapscan = off; - SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; + id | content +----+------------------------ + 1 | PostgreSQL is a RDBMS. +(1 row) DROP TABLE memos; Copied: expected/full-text-search/text/single/like/begin/seqscan.out (+5 -5) 79% =================================================================== --- sql/full-text-search/text/single/like/seqscan.sql 2015-10-28 21:12:24 +0900 (10a5d37) +++ expected/full-text-search/text/single/like/begin/seqscan.out 2015-10-28 21:58:39 +0900 (06b7347) @@ -2,20 +2,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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); - CREATE INDEX grnindex ON memos USING pgroonga (content); - SET enable_seqscan = on; SET enable_indexscan = off; SET enable_bitmapscan = off; - SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; + id | content +----+------------------------ + 1 | PostgreSQL is a RDBMS. +(1 row) DROP TABLE memos; Renamed: expected/full-text-search/text/single/like/end/bitmapscan.out (+2 -4) 85% =================================================================== --- expected/full-text-search/text/single/like/bitmapscan.out 2015-10-28 21:12:24 +0900 (6296d36) +++ expected/full-text-search/text/single/like/end/bitmapscan.out 2015-10-28 21:58:39 +0900 (23a5dd1) @@ -12,12 +12,10 @@ SET enable_indexscan = off; SET enable_bitmapscan = on; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; id | content ----+------------------------------------------------------- - 2 | Groonga is fast full text search engine. 3 | PGroonga is a PostgreSQL extension that uses Groonga. - 4 | groonga command is provided. -(3 rows) +(1 row) DROP TABLE memos; Copied: expected/full-text-search/text/single/like/end/indexscan.out (+2 -4) 85% =================================================================== --- expected/full-text-search/text/single/like/indexscan.out 2015-10-28 21:12:24 +0900 (2788b46) +++ expected/full-text-search/text/single/like/end/indexscan.out 2015-10-28 21:58:39 +0900 (77d3f69) @@ -12,12 +12,10 @@ SET enable_indexscan = on; SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; id | content ----+------------------------------------------------------- - 2 | Groonga is fast full text search engine. 3 | PGroonga is a PostgreSQL extension that uses Groonga. - 4 | groonga command is provided. -(3 rows) +(1 row) DROP TABLE memos; Renamed: expected/full-text-search/text/single/like/end/seqscan.out (+4 -6) 78% =================================================================== --- expected/full-text-search/text/single/like/indexscan.out 2015-10-28 21:12:24 +0900 (2788b46) +++ expected/full-text-search/text/single/like/end/seqscan.out 2015-10-28 21:58:39 +0900 (8de1aef) @@ -7,17 +7,15 @@ 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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); CREATE INDEX grnindex ON memos USING pgroonga (content); -SET enable_seqscan = off; -SET enable_indexscan = on; +SET enable_seqscan = on; +SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; id | content ----+------------------------------------------------------- - 2 | Groonga is fast full text search engine. 3 | PGroonga is a PostgreSQL extension that uses Groonga. - 4 | groonga command is provided. -(3 rows) +(1 row) DROP TABLE memos; Copied: expected/full-text-search/text/single/like/partial/bitmapscan.out (+2 -2) 91% =================================================================== --- expected/full-text-search/text/single/like/seqscan.out 2015-10-28 21:12:24 +0900 (df93bba) +++ expected/full-text-search/text/single/like/partial/bitmapscan.out 2015-10-28 21:58:39 +0900 (50cffa2) @@ -7,9 +7,9 @@ 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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); CREATE INDEX grnindex ON memos USING pgroonga (content); -SET enable_seqscan = on; +SET enable_seqscan = off; SET enable_indexscan = off; -SET enable_bitmapscan = off; +SET enable_bitmapscan = on; SELECT id, content FROM memos WHERE content LIKE '%groonga%'; Copied: expected/full-text-search/text/single/like/partial/indexscan.out (+2 -2) 92% =================================================================== --- expected/full-text-search/text/single/like/seqscan.out 2015-10-28 21:12:24 +0900 (df93bba) +++ expected/full-text-search/text/single/like/partial/indexscan.out 2015-10-28 21:58:39 +0900 (e2d50c1) @@ -7,8 +7,8 @@ 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.'); INSERT INTO memos VALUES (4, 'groonga command is provided.'); CREATE INDEX grnindex ON memos USING pgroonga (content); -SET enable_seqscan = on; -SET enable_indexscan = off; +SET enable_seqscan = off; +SET enable_indexscan = on; SET enable_bitmapscan = off; SELECT id, content FROM memos Renamed: expected/full-text-search/text/single/like/partial/seqscan.out (+0 -0) 100% =================================================================== Added: expected/full-text-search/text/single/like/underscore/bitmapscan.out (+20 -0) 100644 =================================================================== --- /dev/null +++ expected/full-text-search/text/single/like/underscore/bitmapscan.out 2015-10-28 21:58:39 +0900 (8eba219) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); +CREATE INDEX grnindex ON memos USING pgroonga (content); +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; +SELECT id, content + FROM memos + WHERE content LIKE '_'; + id | content +----+--------- + 2 | a +(1 row) + +DROP TABLE memos; Added: expected/full-text-search/text/single/like/underscore/indexscan.out (+20 -0) 100644 =================================================================== --- /dev/null +++ expected/full-text-search/text/single/like/underscore/indexscan.out 2015-10-28 21:58:39 +0900 (0df9f1c) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); +CREATE INDEX grnindex ON memos USING pgroonga (content); +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; +SELECT id, content + FROM memos + WHERE content LIKE '_'; + id | content +----+--------- + 2 | a +(1 row) + +DROP TABLE memos; Added: expected/full-text-search/text/single/like/underscore/seqscan.out (+20 -0) 100644 =================================================================== --- /dev/null +++ expected/full-text-search/text/single/like/underscore/seqscan.out 2015-10-28 21:58:39 +0900 (19b151c) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); +CREATE INDEX grnindex ON memos USING pgroonga (content); +SET enable_seqscan = on; +SET enable_indexscan = off; +SET enable_bitmapscan = off; +SELECT id, content + FROM memos + WHERE content LIKE '_'; + id | content +----+--------- + 2 | a +(1 row) + +DROP TABLE memos; Modified: pgroonga.c (+79 -11) =================================================================== --- pgroonga.c 2015-10-28 21:12:24 +0900 (dd3eba0) +++ pgroonga.c 2015-10-28 21:58:39 +0900 (752619f) @@ -206,6 +206,7 @@ static grn_ctx grnContext; static grn_ctx *ctx = NULL; static grn_obj buffer; static grn_obj pathBuffer; +static grn_obj keywordBuffer; static grn_obj patternBuffer; static grn_obj ctidBuffer; static grn_obj scoreBuffer; @@ -449,6 +450,7 @@ PGrnOnProcExit(int code, Datum arg) GRN_OBJ_FIN(ctx, &ctidBuffer); GRN_OBJ_FIN(ctx, &scoreBuffer); GRN_OBJ_FIN(ctx, &patternBuffer); + GRN_OBJ_FIN(ctx, &keywordBuffer); GRN_OBJ_FIN(ctx, &pathBuffer); GRN_OBJ_FIN(ctx, &buffer); @@ -620,6 +622,7 @@ _PG_init(void) GRN_VOID_INIT(&buffer); GRN_TEXT_INIT(&pathBuffer, 0); + GRN_TEXT_INIT(&keywordBuffer, 0); GRN_TEXT_INIT(&patternBuffer, 0); GRN_FLOAT_INIT(&scoreBuffer, 0); GRN_UINT64_INIT(&ctidBuffer, 0); @@ -3155,13 +3158,36 @@ pgroonga_beginscan(PG_FUNCTION_ARGS) } static void +PGrnSearchBuildConditionLikeMatchFlush(grn_obj *expression, + grn_obj *matchTarget, + 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_const_str(ctx, expression, + GRN_TEXT_VALUE(keyword), + GRN_TEXT_LEN(keyword), + GRN_OP_PUSH, 1); + grn_expr_append_op(ctx, expression, GRN_OP_MATCH, 2); + if (*nKeywords > 0) + grn_expr_append_op(ctx, expression, GRN_OP_OR, 2); + (*nKeywords)++; + + GRN_BULK_REWIND(keyword); +} + +static void PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data, grn_obj *matchTarget, grn_obj *query) { grn_obj *expression; const char *queryRaw; - size_t querySize; + size_t i, querySize; + int nKeywords = 0; expression = data->expression; queryRaw = GRN_TEXT_VALUE(query); @@ -3173,17 +3199,46 @@ PGrnSearchBuildConditionLikeMatch(PGrnSearchData *data, return; } - if (!(queryRaw[0] == '%' && queryRaw[querySize - 1] == '%')) + GRN_BULK_REWIND(&keywordBuffer); + for (i = 0; i < querySize; i++) { - data->isEmptyCondition = true; - return; + switch (queryRaw[i]) + { + case '\\': + if (i == querySize) + { + GRN_TEXT_PUTC(ctx, &keywordBuffer, '\\'); + } + else + { + GRN_TEXT_PUTC(ctx, &keywordBuffer, queryRaw[i + 1]); + i++; + } + break; + case '%': + case '_': + PGrnSearchBuildConditionLikeMatchFlush(expression, + matchTarget, + &keywordBuffer, + &nKeywords); + break; + default: + GRN_TEXT_PUTC(ctx, &keywordBuffer, queryRaw[i]); + break; + } } - grn_expr_append_obj(ctx, expression, matchTarget, GRN_OP_PUSH, 1); - grn_expr_append_const_str(ctx, expression, - queryRaw + 1, querySize - 2, - GRN_OP_PUSH, 1); - grn_expr_append_op(ctx, expression, GRN_OP_MATCH, 2); + PGrnSearchBuildConditionLikeMatchFlush(expression, + matchTarget, + &keywordBuffer, + &nKeywords); + if (nKeywords == 0) + { + grn_expr_append_obj(ctx, expression, + grn_ctx_get(ctx, "all_records", -1), + GRN_OP_PUSH, 1); + grn_expr_append_op(ctx, expression, GRN_OP_CALL, 0); + } } static void @@ -4022,6 +4077,19 @@ PGrnEnsureCursorOpened(IndexScanDesc scan, ScanDirection dir) { PGrnScanOpaque so = (PGrnScanOpaque) scan->opaque; + { + int i; + for (i = 0; i < scan->numberOfKeys; i++) + { + ScanKey key = &(scan->keyData[i]); + if (key->sk_strategy == PGrnLikeStrategyNumber) + { + scan->xs_recheck = true; + break; + } + } + } + if (so->indexCursor) return; if (so->tableCursor) @@ -4166,7 +4234,7 @@ pgroonga_getbitmap(PG_FUNCTION_ARGS) GRN_BULK_REWIND(&ctidBuffer); grn_obj_get_value(ctx, so->ctidAccessor, posting->rid, &ctidBuffer); ctid = UInt64ToCtid(GRN_UINT64_VALUE(&ctidBuffer)); - tbm_add_tuples(tbm, &ctid, 1, false); + tbm_add_tuples(tbm, &ctid, 1, scan->xs_recheck); nRecords++; } } @@ -4179,7 +4247,7 @@ pgroonga_getbitmap(PG_FUNCTION_ARGS) GRN_BULK_REWIND(&ctidBuffer); grn_obj_get_value(ctx, so->ctidAccessor, id, &ctidBuffer); ctid = UInt64ToCtid(GRN_UINT64_VALUE(&ctidBuffer)); - tbm_add_tuples(tbm, &ctid, 1, false); + tbm_add_tuples(tbm, &ctid, 1, scan->xs_recheck); nRecords++; } } Copied: sql/full-text-search/text/single/like/begin/bitmapscan.sql (+1 -1) 93% =================================================================== --- sql/full-text-search/text/single/like/bitmapscan.sql 2015-10-28 21:12:24 +0900 (b102ea2) +++ sql/full-text-search/text/single/like/begin/bitmapscan.sql 2015-10-28 21:58:39 +0900 (4b30caa) @@ -16,6 +16,6 @@ SET enable_bitmapscan = on; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; DROP TABLE memos; Copied: sql/full-text-search/text/single/like/begin/indexscan.sql (+1 -1) 93% =================================================================== --- sql/full-text-search/text/single/like/indexscan.sql 2015-10-28 21:12:24 +0900 (4fdd972) +++ sql/full-text-search/text/single/like/begin/indexscan.sql 2015-10-28 21:58:39 +0900 (9a8117a) @@ -16,6 +16,6 @@ SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; DROP TABLE memos; Copied: sql/full-text-search/text/single/like/begin/seqscan.sql (+1 -1) 93% =================================================================== --- sql/full-text-search/text/single/like/seqscan.sql 2015-10-28 21:12:24 +0900 (10a5d37) +++ sql/full-text-search/text/single/like/begin/seqscan.sql 2015-10-28 21:58:39 +0900 (4603c88) @@ -16,6 +16,6 @@ SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE 'PostgreSQL%'; DROP TABLE memos; Copied: sql/full-text-search/text/single/like/end/bitmapscan.sql (+1 -1) 94% =================================================================== --- sql/full-text-search/text/single/like/bitmapscan.sql 2015-10-28 21:12:24 +0900 (b102ea2) +++ sql/full-text-search/text/single/like/end/bitmapscan.sql 2015-10-28 21:58:39 +0900 (6c87e6f) @@ -16,6 +16,6 @@ SET enable_bitmapscan = on; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; DROP TABLE memos; Copied: sql/full-text-search/text/single/like/end/indexscan.sql (+1 -1) 94% =================================================================== --- sql/full-text-search/text/single/like/indexscan.sql 2015-10-28 21:12:24 +0900 (4fdd972) +++ sql/full-text-search/text/single/like/end/indexscan.sql 2015-10-28 21:58:39 +0900 (5bb096a) @@ -16,6 +16,6 @@ SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; DROP TABLE memos; Copied: sql/full-text-search/text/single/like/end/seqscan.sql (+1 -1) 94% =================================================================== --- sql/full-text-search/text/single/like/seqscan.sql 2015-10-28 21:12:24 +0900 (10a5d37) +++ sql/full-text-search/text/single/like/end/seqscan.sql 2015-10-28 21:58:39 +0900 (9ec27a4) @@ -16,6 +16,6 @@ SET enable_bitmapscan = off; SELECT id, content FROM memos - WHERE content LIKE '%groonga%'; + WHERE content LIKE '%Groonga.'; DROP TABLE memos; Renamed: sql/full-text-search/text/single/like/partial/bitmapscan.sql (+0 -0) 100% =================================================================== Renamed: sql/full-text-search/text/single/like/partial/indexscan.sql (+0 -0) 100% =================================================================== Renamed: sql/full-text-search/text/single/like/partial/seqscan.sql (+0 -0) 100% =================================================================== Added: sql/full-text-search/text/single/like/underscore/bitmapscan.sql (+20 -0) 100644 =================================================================== --- /dev/null +++ sql/full-text-search/text/single/like/underscore/bitmapscan.sql 2015-10-28 21:58:39 +0900 (a308d92) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); + +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); + +CREATE INDEX grnindex ON memos USING pgroonga (content); + +SET enable_seqscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; + +SELECT id, content + FROM memos + WHERE content LIKE '_'; + +DROP TABLE memos; Added: sql/full-text-search/text/single/like/underscore/indexscan.sql (+20 -0) 100644 =================================================================== --- /dev/null +++ sql/full-text-search/text/single/like/underscore/indexscan.sql 2015-10-28 21:58:39 +0900 (04522c2) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); + +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); + +CREATE INDEX grnindex ON memos USING pgroonga (content); + +SET enable_seqscan = off; +SET enable_indexscan = on; +SET enable_bitmapscan = off; + +SELECT id, content + FROM memos + WHERE content LIKE '_'; + +DROP TABLE memos; Added: sql/full-text-search/text/single/like/underscore/seqscan.sql (+20 -0) 100644 =================================================================== --- /dev/null +++ sql/full-text-search/text/single/like/underscore/seqscan.sql 2015-10-28 21:58:39 +0900 (f7fd84f) @@ -0,0 +1,20 @@ +CREATE TABLE memos ( + id integer, + content text +); + +INSERT INTO memos VALUES (1, ''); +INSERT INTO memos VALUES (2, 'a'); +INSERT INTO memos VALUES (3, 'ab'); + +CREATE INDEX grnindex ON memos USING pgroonga (content); + +SET enable_seqscan = on; +SET enable_indexscan = off; +SET enable_bitmapscan = off; + +SELECT id, content + FROM memos + WHERE content LIKE '_'; + +DROP TABLE memos; -------------- next part -------------- HTML����������������������������...Download