Index: Makefile
===================================================================
RCS file: /projects/cvsroot/pgsql/contrib/pg_trgm/Makefile,v
retrieving revision 1.6
diff -c -r1.6 Makefile
*** Makefile	9 Feb 2007 17:24:33 -0000	1.6
--- Makefile	21 Feb 2007 23:49:37 -0000
***************
*** 1,7 ****
  # $PostgreSQL: pgsql/contrib/pg_trgm/Makefile,v 1.6 2007/02/09 17:24:33 petere Exp $
  
  MODULE_big = pg_trgm
! OBJS = trgm_op.o trgm_gist.o 
  
  DATA_built = pg_trgm.sql
  DATA = uninstall_pg_trgm.sql
--- 1,7 ----
  # $PostgreSQL: pgsql/contrib/pg_trgm/Makefile,v 1.6 2007/02/09 17:24:33 petere Exp $
  
  MODULE_big = pg_trgm
! OBJS = trgm_op.o trgm_gist.o trgm_gin.o
  
  DATA_built = pg_trgm.sql
  DATA = uninstall_pg_trgm.sql
Index: uninstall_pg_trgm.sql
===================================================================
RCS file: /projects/cvsroot/pgsql/contrib/pg_trgm/uninstall_pg_trgm.sql,v
retrieving revision 1.2
diff -c -r1.2 uninstall_pg_trgm.sql
*** uninstall_pg_trgm.sql	13 Mar 2006 18:04:58 -0000	1.2
--- uninstall_pg_trgm.sql	21 Feb 2007 23:49:37 -0000
***************
*** 20,25 ****
--- 20,33 ----
  
  DROP TYPE gtrgm CASCADE;
  
+ DROP OPERATOR CLASS gin_trgm_ops USING gin;
+ 
+ DROP FUNCTION gin_extract_trgm(text, internal);
+ 
+ DROP FUNCTION gin_extract_trgm(text, internal, internal);
+ 
+ DROP FUNCTION gin_trgm_consistent(internal, internal, text);
+ 
  DROP OPERATOR % (text, text);
  
  DROP FUNCTION similarity_op(text,text);
Index: pg_trgm.sql.in
===================================================================
RCS file: /projects/cvsroot/pgsql/contrib/pg_trgm/pg_trgm.sql.in,v
retrieving revision 1.2
diff -c -r1.2 pg_trgm.sql.in
*** pg_trgm.sql.in	27 Feb 2006 16:09:48 -0000	1.2
--- pg_trgm.sql.in	21 Feb 2007 23:49:37 -0000
***************
*** 36,42 ****
          JOIN = contjoinsel
  );
  
! --gist key
  CREATE FUNCTION gtrgm_in(cstring)
  RETURNS gtrgm
  AS 'MODULE_PATHNAME'
--- 36,42 ----
          JOIN = contjoinsel
  );
  
! -- gist key
  CREATE FUNCTION gtrgm_in(cstring)
  RETURNS gtrgm
  AS 'MODULE_PATHNAME'
***************
*** 53,59 ****
          OUTPUT = gtrgm_out
  );
  
! -- support functions
  CREATE FUNCTION gtrgm_consistent(gtrgm,internal,int4)
  RETURNS bool
  AS 'MODULE_PATHNAME'
--- 53,59 ----
          OUTPUT = gtrgm_out
  );
  
! -- support functions for gist
  CREATE FUNCTION gtrgm_consistent(gtrgm,internal,int4)
  RETURNS bool
  AS 'MODULE_PATHNAME'
***************
*** 89,95 ****
  AS 'MODULE_PATHNAME'
  LANGUAGE C;
  
! -- create the operator class
  CREATE OPERATOR CLASS gist_trgm_ops
  FOR TYPE text USING gist
  AS
--- 89,95 ----
  AS 'MODULE_PATHNAME'
  LANGUAGE C;
  
! -- create the operator class for gist
  CREATE OPERATOR CLASS gist_trgm_ops
  FOR TYPE text USING gist
  AS
***************
*** 103,107 ****
--- 103,133 ----
          FUNCTION        7       gtrgm_same (gtrgm, gtrgm, internal),
          STORAGE         gtrgm;
  
+ -- support functions for gin
+ CREATE FUNCTION gin_extract_trgm(text, internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C;
+ 
+ CREATE FUNCTION gin_extract_trgm(text, internal, internal)
+ RETURNS internal
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C;
+ 
+ CREATE FUNCTION gin_trgm_consistent(internal, internal, text)
+ RETURNS internal
+ AS 'MODULE_PATHNAME'
+ LANGUAGE C;
+ 
+ -- create the operator class for gin
+ CREATE OPERATOR CLASS gin_trgm_ops
+ FOR TYPE text USING gin
+ AS
+         OPERATOR        1       % (text, text),
+         FUNCTION        1       bttextcmp (text, text),
+         FUNCTION        2       gin_extract_trgm (text, internal),
+         FUNCTION        3       gin_extract_trgm (text, internal, internal),
+         FUNCTION        4       gin_trgm_consistent (internal, internal, text),
+         STORAGE         text;
  
  COMMIT;
Index: contrib/pg_trgm/trgm_gin.c
===================================================================
RCS file: contrib/pg_trgm/trgm_gin.c
diff -N contrib/pg_trgm/trgm_gin.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- contrib/pg_trgm/trgm_gin.c	1 Jan 1970 00:00:00 -0000
***************
*** 0 ****
--- 1,78 ----
+ #include "trgm.h"
+ 
+ #include "access/gin.h"
+ #include "access/itup.h"
+ #include "access/tuptoaster.h"
+ #include "storage/bufpage.h"
+ #include "utils/array.h"
+ #include "utils/builtins.h"
+ 
+ PG_FUNCTION_INFO_V1(gin_extract_trgm);
+ Datum		gin_extract_trgm(PG_FUNCTION_ARGS);
+ 
+ PG_FUNCTION_INFO_V1(gin_trgm_consistent);
+ Datum		gin_trgm_consistent(PG_FUNCTION_ARGS);
+ 
+ Datum
+ gin_extract_trgm(PG_FUNCTION_ARGS)
+ {
+ 	text		*val = (text *) PG_GETARG_TEXT_P(0);
+ 	int32		*nentries = (int32 *) PG_GETARG_POINTER(1);
+ 	Datum		*entries = NULL;
+ 	TRGM		*trg;
+ 	int4		trglen;
+ 	
+ 	*nentries = 0;
+ 	
+ 	trg = generate_trgm(VARDATA(val), VARSIZE(val) - VARHDRSZ);
+ 	trglen = ARRNELEM(trg);
+ 	
+ 	if (trglen > 0)
+ 	{
+ 		trgm *ptr;
+ 		int4 i = 0;
+ 		*nentries = (int32) trglen;
+ 		entries = (Datum *) palloc(sizeof(Datum) * trglen);
+ 
+ 		ptr = GETARR(trg);
+ 		while (ptr - GETARR(trg) < ARRNELEM(trg))
+ 		{
+ 			text *item = (text *) palloc(VARHDRSZ + 3);
+ 	
+ 			VARATT_SIZEP(item) = VARHDRSZ + 3;
+ 			CPTRGM(VARDATA(item), ptr);
+ 			entries[i++] = PointerGetDatum(item);
+ 			
+ 			ptr++;
+ 		}
+ 	}
+ 
+ 	PG_RETURN_POINTER(entries);
+ }
+ 
+ Datum
+ gin_trgm_consistent(PG_FUNCTION_ARGS)
+ {
+ 	bool		*check = (bool *) PG_GETARG_POINTER(0);
+ 	text		*query = (text *) PG_GETARG_TEXT_P(2);
+ 	bool		res = FALSE;
+ 	TRGM		*trg;
+ 	int			i,
+ 				trglen,
+ 				ntrue = 0;
+ 	
+ 	trg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ);
+ 	trglen = ARRNELEM(trg);
+ 	
+ 	for (i = 0; i < trglen; i++)
+ 		if (check[i])
+ 			ntrue ++;
+ 
+ #ifdef DIVUNION
+ 	res = (trglen == ntrue) ? true : ((((((float4) ntrue) / ((float4) (trglen - ntrue)))) >= trgm_limit) ? true : false);
+ #else
+ 	res = (trglen == 0) ? false : ((((((float4) ntrue) / ((float4) trglen))) >= trgm_limit) ? true : false);
+ #endif
+ 
+ 	PG_RETURN_BOOL(res);
+ }
