summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev2009-01-15 16:33:59 +0000
committerTeodor Sigaev2009-01-15 16:33:59 +0000
commit4921bde61906314125edae959b81cbc80c1b4e83 (patch)
tree974fd7dce35ad7d1e9720a4de75e3ae24fd50526
parentf6ffaf8045664bc5b86b3d9cd9175b5f321d658e (diff)
Fix URL generation in headline. Only tag lexeme will be replaced by space.
Per http://archives.postgresql.org/pgsql-bugs/2008-12/msg00013.php
-rw-r--r--src/backend/tsearch/ts_parse.c2
-rw-r--r--src/backend/tsearch/wparser_def.c25
-rw-r--r--src/include/tsearch/ts_public.h3
3 files changed, 18 insertions, 12 deletions
diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c
index d717bb3dce..20f010f604 100644
--- a/src/backend/tsearch/ts_parse.c
+++ b/src/backend/tsearch/ts_parse.c
@@ -625,7 +625,7 @@ generateHeadline(HeadlineParsedText *prs)
*ptr = ' ';
ptr++;
}
- else
+ else if (!wrd->skip)
{
if (wrd->selected)
{
diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c
index 94ff4087ed..190b882581 100644
--- a/src/backend/tsearch/wparser_def.c
+++ b/src/backend/tsearch/wparser_def.c
@@ -1587,10 +1587,11 @@ prsd_end(PG_FUNCTION_ARGS)
#define COMPLEXTOKEN(x) ( (x)==URL_T || (x)==NUMHWORD || (x)==ASCIIHWORD || (x)==HWORD )
#define ENDPUNCTOKEN(x) ( (x)==SPACE )
-#define TS_IDIGNORE(x) ( (x)==TAG_T || (x)==PROTOCOL || (x)==SPACE || (x)==XMLENTITY )
-#define HLIDIGNORE(x) ( (x)==URL_T || (x)==TAG_T || (x)==NUMHWORD || (x)==ASCIIHWORD || (x)==HWORD )
-#define XMLHLIDIGNORE(x) ( (x)==URL_T || (x)==NUMHWORD || (x)==ASCIIHWORD || (x)==HWORD )
-#define NONWORDTOKEN(x) ( (x)==SPACE || HLIDIGNORE(x) )
+#define TS_IDIGNORE(x) ( (x)==TAG_T || (x)==PROTOCOL || (x)==SPACE || (x)==XMLENTITY )
+#define HLIDREPLACE(x) ( (x)==TAG_T )
+#define HLIDSKIP(x) ( (x)==URL_T || (x)==NUMHWORD || (x)==ASCIIHWORD || (x)==HWORD )
+#define XMLHLIDSKIP(x) ( (x)==URL_T || (x)==NUMHWORD || (x)==ASCIIHWORD || (x)==HWORD )
+#define NONWORDTOKEN(x) ( (x)==SPACE || HLIDREPLACE(x) || HLIDSKIP(x) )
#define NOENDTOKEN(x) ( NONWORDTOKEN(x) || (x)==SCIENTIFIC || (x)==VERSIONNUMBER || (x)==DECIMAL || (x)==SIGNEDINT || (x)==UNSIGNEDINT || TS_IDIGNORE(x) )
typedef struct
@@ -1695,13 +1696,15 @@ mark_fragment(HeadlineParsedText *prs, int highlight, int startpos, int endpos)
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 (XMLHLIDIGNORE(prs->words[i].type))
- prs->words[i].replace = 1;
+ if (XMLHLIDSKIP(prs->words[i].type))
+ prs->words[i].skip = 1;
}
prs->words[i].in = (prs->words[i].repeated) ? 0 : 1;
@@ -2050,13 +2053,15 @@ mark_hl_words(HeadlineParsedText *prs, TSQuery query, int highlight,
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 (XMLHLIDIGNORE(prs->words[i].type))
- prs->words[i].replace = 1;
+ if (XMLHLIDSKIP(prs->words[i].type))
+ prs->words[i].skip = 1;
}
prs->words[i].in = (prs->words[i].repeated) ? 0 : 1;
diff --git a/src/include/tsearch/ts_public.h b/src/include/tsearch/ts_public.h
index c2d4be0105..0558ae36e2 100644
--- a/src/include/tsearch/ts_public.h
+++ b/src/include/tsearch/ts_public.h
@@ -38,7 +38,8 @@ typedef struct
in:1,
replace:1,
repeated:1,
- unused:4,
+ skip:1,
+ unused:3,
type:8,
len:16;
char *word;