Kouhei Sutou
null+****@clear*****
Sun Feb 15 13:11:17 JST 2015
Kouhei Sutou 2015-02-15 13:11:17 +0900 (Sun, 15 Feb 2015) New Revision: 4374c1a15e7942616d75b7923ed28a55fe7d1332 https://github.com/pgroonga/pgroonga/commit/4374c1a15e7942616d75b7923ed28a55fe7d1332 Message: Use varchar array instead of text array Because we can't use 4097byte over data for index key. Copied files: sql/array/varchar/single/contain/bitmapscan.sql (from sql/array/text/single/contain/indexscan.sql) sql/array/varchar/single/contain/indexscan.sql (from sql/array/text/single/contain/indexscan.sql) Modified files: Makefile pgroonga.c pgroonga.h pgroonga.sql pgroonga_types.c Renamed files: expected/array/varchar/single/contain/bitmapscan.out (from expected/array/text/single/contain/bitmapscan.out) expected/array/varchar/single/contain/indexscan.out (from expected/array/text/single/contain/indexscan.out) expected/array/varchar/single/contain/seqscan.out (from expected/array/text/single/contain/seqscan.out) sql/array/varchar/single/contain/seqscan.sql (from sql/array/text/single/contain/indexscan.sql) Modified: Makefile (+2 -2) =================================================================== --- Makefile 2015-02-15 12:23:48 +0900 (5378744) +++ Makefile 2015-02-15 13:11:17 +0900 (938745b) @@ -40,7 +40,7 @@ installcheck: results/compare/integer/single/between installcheck: results/compare/integer/multiple/greater-than-equal installcheck: results/compare/integer/order_by_limit installcheck: results/compare/timestamp/single/between -installcheck: results/array/text/single/contain +installcheck: results/array/varchar/single/contain installcheck: results/groonga results/full-text-search/text/single/contain: @@ -73,7 +73,7 @@ results/compare/integer/order_by_limit: @mkdir -p $@ results/compare/timestamp/single/between: @mkdir -p $@ -results/array/text/single/contain: +results/array/varchar/single/contain: @mkdir -p $@ results/groonga: @mkdir -p $@ Renamed: expected/array/varchar/single/contain/bitmapscan.out (+1 -1) 96% =================================================================== --- expected/array/text/single/contain/bitmapscan.out 2015-02-15 12:23:48 +0900 (d2df0e2) +++ expected/array/varchar/single/contain/bitmapscan.out 2015-02-15 13:11:17 +0900 (52c5847) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); INSERT INTO memos VALUES ('Groonga', ARRAY['Groonga']); Renamed: expected/array/varchar/single/contain/indexscan.out (+1 -1) 96% =================================================================== --- expected/array/text/single/contain/indexscan.out 2015-02-15 12:23:48 +0900 (4359d48) +++ expected/array/varchar/single/contain/indexscan.out 2015-02-15 13:11:17 +0900 (b17f753) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); INSERT INTO memos VALUES ('Groonga', ARRAY['Groonga']); Renamed: expected/array/varchar/single/contain/seqscan.out (+1 -1) 96% =================================================================== --- expected/array/text/single/contain/seqscan.out 2015-02-15 12:23:48 +0900 (d8b3ced) +++ expected/array/varchar/single/contain/seqscan.out 2015-02-15 13:11:17 +0900 (517a48f) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); INSERT INTO memos VALUES ('Groonga', ARRAY['Groonga']); Modified: pgroonga.c (+20 -1) =================================================================== --- pgroonga.c 2015-02-15 12:23:48 +0900 (c3f4456) +++ pgroonga.c 2015-02-15 13:11:17 +0900 (4f57884) @@ -26,6 +26,8 @@ #include <stdlib.h> +#define VARCHARARRAYOID 1015 + PG_MODULE_MAGIC; static bool PGrnIsLZ4Available; @@ -431,7 +433,24 @@ PGrnGetType(Relation index, AttrNumber n, unsigned char *flags) typeID = GRN_DB_TOKYO_GEO_POINT or GRN_DB_WGS84_GEO_POINT; break; #endif - case TEXTARRAYOID: + case VARCHARARRAYOID: + maxlen = type_maximum_size(VARCHAROID, attr->atttypmod); + if (maxlen < 0) + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("pgroonga: " + "array of unlimited size varchar isn't supported"))); + } + if (maxlen > 4096) + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("pgroonga: " + "array of 4097bytes over size varchar " + "isn't supported: %d", + maxlen))); + } typeID = GRN_DB_SHORT_TEXT; typeFlags |= GRN_OBJ_VECTOR; break; Modified: pgroonga.h (+1 -1) =================================================================== --- pgroonga.h 2015-02-15 12:23:48 +0900 (e689829) +++ pgroonga.h 2015-02-15 13:11:17 +0900 (682a830) @@ -69,8 +69,8 @@ extern Datum PGDLLEXPORT pgroonga_options(PG_FUNCTION_ARGS); /* in groonga_types.c */ extern Datum PGDLLEXPORT pgroonga_get_text(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_text_array(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_varchar(PG_FUNCTION_ARGS); +extern Datum PGDLLEXPORT pgroonga_get_varchar_array(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_bool(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_int2(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_int4(PG_FUNCTION_ARGS); Modified: pgroonga.sql (+25 -22) =================================================================== --- pgroonga.sql 2015-02-15 12:23:48 +0900 (3cd1180) +++ pgroonga.sql 2015-02-15 13:11:17 +0900 (671a5ce) @@ -70,14 +70,14 @@ CREATE FUNCTION pgroonga.match(text, text) IMMUTABLE STRICT; -CREATE FUNCTION pgroonga.match(text[], text) +CREATE FUNCTION pgroonga.match(varchar, varchar) RETURNS bool AS 'MODULE_PATHNAME', 'pgroonga_match' LANGUAGE C IMMUTABLE STRICT; -CREATE FUNCTION pgroonga.match(varchar, varchar) +CREATE FUNCTION pgroonga.match(varchar[], varchar) RETURNS bool AS 'MODULE_PATHNAME', 'pgroonga_match' LANGUAGE C @@ -92,13 +92,13 @@ CREATE OPERATOR @@ ( CREATE OPERATOR @@ ( PROCEDURE = pgroonga.match, - LEFTARG = text[], - RIGHTARG = text + LEFTARG = varchar, + RIGHTARG = varchar ); CREATE OPERATOR @@ ( PROCEDURE = pgroonga.match, - LEFTARG = varchar, + LEFTARG = varchar[], RIGHTARG = varchar ); @@ -156,14 +156,14 @@ CREATE FUNCTION pgroonga.get_text(internal, internal, text) RETURNS void AS 'MODULE_PATHNAME', 'pgroonga_get_text' LANGUAGE C; -CREATE FUNCTION pgroonga.get_text_array(internal, internal, text[]) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_text_array' - LANGUAGE C; CREATE FUNCTION pgroonga.get_varchar(internal, internal, varchar) RETURNS void AS 'MODULE_PATHNAME', 'pgroonga_get_varchar' LANGUAGE C; +CREATE FUNCTION pgroonga.get_varchar_array(internal, internal, varchar[]) + RETURNS void + AS 'MODULE_PATHNAME', 'pgroonga_get_varchar_array' + LANGUAGE C; CREATE FUNCTION pgroonga.get_bool(internal, internal, bool) RETURNS void AS 'MODULE_PATHNAME', 'pgroonga_get_bool' @@ -239,19 +239,6 @@ CREATE OPERATOR CLASS pgroonga.full_text_search_text_ops DEFAULT FOR TYPE text FUNCTION 1 pgroonga.get_text(internal, internal, text), FUNCTION 2 pgroonga.get_text(internal, internal, text); -CREATE OPERATOR CLASS pgroonga.full_text_search_text_array_ops FOR TYPE text[] - USING pgroonga AS - OPERATOR 7 %% (text[], text), - OPERATOR 8 @@ (text[], text), - FUNCTION 1 pgroonga.get_text_array(internal, internal, text[]), - FUNCTION 2 pgroonga.get_text(internal, internal, text); - -CREATE OPERATOR CLASS pgroonga.text_array_ops DEFAULT FOR TYPE text[] - USING pgroonga AS - OPERATOR 7 %% (text[], text), - FUNCTION 1 pgroonga.get_text_array(internal, internal, text[]), - FUNCTION 2 pgroonga.get_text(internal, internal, text); - CREATE OPERATOR CLASS pgroonga.full_text_search_varchar_ops DEFAULT FOR TYPE varchar USING pgroonga AS OPERATOR 7 %%, @@ -269,6 +256,22 @@ CREATE OPERATOR CLASS pgroonga.varchar_ops FOR TYPE varchar FUNCTION 1 pgroonga.get_varchar(internal, internal, varchar), FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); +CREATE OPERATOR CLASS pgroonga.full_text_search_varchar_array_ops + FOR TYPE varchar[] + USING pgroonga AS + OPERATOR 7 %% (text[], text), + OPERATOR 8 @@ (varchar[], varchar), + FUNCTION 1 pgroonga.get_varchar_array(internal, internal, varchar[]), + FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); + +CREATE OPERATOR CLASS pgroonga.varchar_array_ops + DEFAULT + FOR TYPE varchar[] + USING pgroonga AS + OPERATOR 7 %% (text[], text), + FUNCTION 1 pgroonga.get_varchar_array(internal, internal, varchar[]), + FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); + CREATE OPERATOR CLASS pgroonga.bool_ops DEFAULT FOR TYPE bool USING pgroonga AS OPERATOR 1 <, Modified: pgroonga_types.c (+15 -15) =================================================================== --- pgroonga_types.c 2015-02-15 12:23:48 +0900 (853f624) +++ pgroonga_types.c 2015-02-15 13:11:17 +0900 (5a0fd46) @@ -15,8 +15,8 @@ #include <math.h> PG_FUNCTION_INFO_V1(pgroonga_get_text); -PG_FUNCTION_INFO_V1(pgroonga_get_text_array); PG_FUNCTION_INFO_V1(pgroonga_get_varchar); +PG_FUNCTION_INFO_V1(pgroonga_get_varchar_array); PG_FUNCTION_INFO_V1(pgroonga_get_bool); PG_FUNCTION_INFO_V1(pgroonga_get_int2); PG_FUNCTION_INFO_V1(pgroonga_get_int4); @@ -38,7 +38,18 @@ pgroonga_get_text(PG_FUNCTION_ARGS) } Datum -pgroonga_get_text_array(PG_FUNCTION_ARGS) +pgroonga_get_varchar(PG_FUNCTION_ARGS) +{ + grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); + grn_obj *obj = (grn_obj *) PG_GETARG_POINTER(1); + VarChar *var = PG_GETARG_VARCHAR_PP(2); + + GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), VARSIZE_ANY_EXHDR(var)); + PG_RETURN_VOID(); +} + +Datum +pgroonga_get_varchar_array(PG_FUNCTION_ARGS) { grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); grn_obj *obj = (grn_obj *) PG_GETARG_POINTER(1); @@ -50,14 +61,14 @@ pgroonga_get_text_array(PG_FUNCTION_ARGS) { int weight = 0; Datum elementDatum; - text *element; + VarChar *element; bool isNULL; elementDatum = array_ref(value, 1, &i, -1, -1, false, 'i', &isNULL); if (isNULL) continue; - element = DatumGetTextPP(elementDatum); + element = DatumGetVarCharPP(elementDatum); grn_vector_add_element(ctx, obj, VARDATA_ANY(element), VARSIZE_ANY_EXHDR(element), @@ -69,17 +80,6 @@ pgroonga_get_text_array(PG_FUNCTION_ARGS) } Datum -pgroonga_get_varchar(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *obj = (grn_obj *) PG_GETARG_POINTER(1); - VarChar *var = PG_GETARG_VARCHAR_PP(2); - - GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), VARSIZE_ANY_EXHDR(var)); - PG_RETURN_VOID(); -} - -Datum pgroonga_get_bool(PG_FUNCTION_ARGS) { grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); Copied: sql/array/varchar/single/contain/bitmapscan.sql (+3 -3) 83% =================================================================== --- sql/array/text/single/contain/indexscan.sql 2015-02-15 12:23:48 +0900 (9cb0a1e) +++ sql/array/varchar/single/contain/bitmapscan.sql 2015-02-15 13:11:17 +0900 (d4568f1) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); @@ -10,8 +10,8 @@ INSERT INTO memos VALUES ('PGroonga', ARRAY['PostgreSQL', 'Groonga']); CREATE INDEX pgroonga_memos_index ON memos USING pgroonga (tags); SET enable_seqscan = off; -SET enable_indexscan = on; -SET enable_bitmapscan = off; +SET enable_indexscan = off; +SET enable_bitmapscan = on; SELECT title, tags FROM memos Copied: sql/array/varchar/single/contain/indexscan.sql (+1 -1) 95% =================================================================== --- sql/array/text/single/contain/indexscan.sql 2015-02-15 12:23:48 +0900 (9cb0a1e) +++ sql/array/varchar/single/contain/indexscan.sql 2015-02-15 13:11:17 +0900 (8805b2a) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); Renamed: sql/array/varchar/single/contain/seqscan.sql (+3 -3) 84% =================================================================== --- sql/array/text/single/contain/indexscan.sql 2015-02-15 12:23:48 +0900 (9cb0a1e) +++ sql/array/varchar/single/contain/seqscan.sql 2015-02-15 13:11:17 +0900 (0fb15dc) @@ -1,6 +1,6 @@ CREATE TABLE memos ( title text, - tags text[] + tags varchar(1023)[] ); INSERT INTO memos VALUES ('PostgreSQL', ARRAY['PostgreSQL']); @@ -9,8 +9,8 @@ INSERT INTO memos VALUES ('PGroonga', ARRAY['PostgreSQL', 'Groonga']); CREATE INDEX pgroonga_memos_index ON memos USING pgroonga (tags); -SET enable_seqscan = off; -SET enable_indexscan = on; +SET enable_seqscan = on; +SET enable_indexscan = off; SET enable_bitmapscan = off; SELECT title, tags -------------- next part -------------- HTML����������������������������...Download