[Groonga-commit] pgroonga/pgroonga at 4374c1a [master] Use varchar array instead of text array

Back to archive index

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 



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