From a82832465b50ce674de39aa2a9030327f894fdba Mon Sep 17 00:00:00 2001
From: Teodor Sigaev <teodor@sigaev.ru>
Date: Thu, 15 Jan 2009 18:04:42 +0000
Subject: [PATCH] Fix URL generation in headline. Only tag lexeme will be
 replaced by space. Per
 http://archives.postgresql.org/pgsql-bugs/2008-12/msg00013.php

---
 contrib/tsearch2/ts_cfg.c      |  2 +-
 contrib/tsearch2/ts_cfg.h      |  3 ++-
 contrib/tsearch2/wparser_def.c | 12 +++++++-----
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/contrib/tsearch2/ts_cfg.c b/contrib/tsearch2/ts_cfg.c
index 2faddd62185..b0b3f9bc936 100644
--- a/contrib/tsearch2/ts_cfg.c
+++ b/contrib/tsearch2/ts_cfg.c
@@ -519,7 +519,7 @@ genhl(HLPRSTEXT * prs)
 				*ptr = ' ';
 				ptr++;
 			}
-			else
+			else if (!wrd->skip)
 			{
 				if (wrd->selected)
 				{
diff --git a/contrib/tsearch2/ts_cfg.h b/contrib/tsearch2/ts_cfg.h
index 7bffdbcdd61..9b8a429a6a0 100644
--- a/contrib/tsearch2/ts_cfg.h
+++ b/contrib/tsearch2/ts_cfg.h
@@ -51,7 +51,8 @@ typedef struct
 				in:1,
 				replace:1,
 				repeated:1,
-				unused:4,
+				skip:1,
+				unused:3,
 				type:8,
 				len:16;
 	char	   *word;
diff --git a/contrib/tsearch2/wparser_def.c b/contrib/tsearch2/wparser_def.c
index 5ae70067a5b..25e409786e6 100644
--- a/contrib/tsearch2/wparser_def.c
+++ b/contrib/tsearch2/wparser_def.c
@@ -72,11 +72,11 @@ prsd_end(PG_FUNCTION_ARGS)
 #define COMPLEXTOKEN(x) ( (x)==5 || (x)==15 || (x)==16 || (x)==17 )
 #define ENDPUNCTOKEN(x) ( (x)==12 )
 
-
 #define TS_IDIGNORE(x) ( (x)==13 || (x)==14 || (x)==12 || (x)==23 )
-#define HLIDIGNORE(x) ( (x)==5 || (x)==13 || (x)==15 || (x)==16 || (x)==17 )
+#define HLIDREPLACE(x)  ( (x)==13 )
+#define HLIDSKIP(x)     ( (x)==5 || (x)==15 || (x)==16 || (x)==17 )
 #define HTMLHLIDIGNORE(x) ( (x)==5 || (x)==15 || (x)==16 || (x)==17 )
-#define NONWORDTOKEN(x) ( (x)==12 || HLIDIGNORE(x) )
+#define NONWORDTOKEN(x) ( (x)==12 || HLIDREPLACE(x) || HLIDSKIP(x) )
 #define NOENDTOKEN(x)	( NONWORDTOKEN(x) || (x)==7 || (x)==8 || (x)==20 || (x)==21 || (x)==22 || TS_IDIGNORE(x) )
 
 typedef struct
@@ -364,13 +364,15 @@ prsd_headline(PG_FUNCTION_ARGS)
 			prs->words[i].selected = 1;
 		if (highlight == 0)
 		{
-			if (HLIDIGNORE(prs->words[i].type))
+			if (HLIDREPLACE(prs->words[i].type))
 				prs->words[i].replace = 1;
+			else if (HLIDSKIP(prs->words[i].type))
+				prs->words[i].skip = 1;
 		}
 		else
 		{
 			if (HTMLHLIDIGNORE(prs->words[i].type))
-				prs->words[i].replace = 1;
+				prs->words[i].skip = 1;
 		}
 
 		prs->words[i].in = (prs->words[i].repeated) ? 0 : 1;