Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4394c1b

Browse files
committed
Resurrect the code for the rewrite(ARRAY[...]) aggregate function,
and put it into contrib/tsearch2 compatibility module.
1 parentabd183e commit4394c1b

File tree

6 files changed

+253
-28
lines changed

6 files changed

+253
-28
lines changed

‎contrib/tsearch2/expected/tsearch2.out

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,24 @@ select rewrite('bar & new & qq & foo & york', 'select keyword, sample from test
472472
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
473473
(1 row)
474474

475+
select rewrite( ARRAY['moscow', keyword, sample] ) from test_tsquery;
476+
rewrite
477+
---------------------
478+
'moskva' | 'moscow'
479+
(1 row)
480+
481+
select rewrite( ARRAY['moscow & hotel', keyword, sample] ) from test_tsquery;
482+
rewrite
483+
-----------------------------------
484+
( 'moskva' | 'moscow' ) & 'hotel'
485+
(1 row)
486+
487+
select rewrite( ARRAY['bar & new & qq & foo & york', keyword, sample] ) from test_tsquery;
488+
rewrite
489+
-------------------------------------------------------------------------------------
490+
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
491+
(1 row)
492+
475493
select keyword from test_tsquery where keyword @> 'new';
476494
keyword
477495
----------------
@@ -495,6 +513,42 @@ select keyword from test_tsquery where keyword <@ 'moscow';
495513
'moscow'
496514
(1 row)
497515

516+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow') as query where keyword <@ query;
517+
rewrite
518+
---------------------
519+
'moskva' | 'moscow'
520+
(1 row)
521+
522+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow & hotel') as query where keyword <@ query;
523+
rewrite
524+
-----------------------------------
525+
( 'moskva' | 'moscow' ) & 'hotel'
526+
(1 row)
527+
528+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'bar & new & qq & foo & york') as query where keyword <@ query;
529+
rewrite
530+
-------------------------------------------------------------------------------------
531+
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
532+
(1 row)
533+
534+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow') as query where query @> keyword;
535+
rewrite
536+
---------------------
537+
'moskva' | 'moscow'
538+
(1 row)
539+
540+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow & hotel') as query where query @> keyword;
541+
rewrite
542+
-----------------------------------
543+
( 'moskva' | 'moscow' ) & 'hotel'
544+
(1 row)
545+
546+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'bar & new & qq & foo & york') as query where query @> keyword;
547+
rewrite
548+
-------------------------------------------------------------------------------------
549+
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
550+
(1 row)
551+
498552
create index qq on test_tsquery using gist (keyword gist_tp_tsquery_ops);
499553
set enable_seqscan='off';
500554
select keyword from test_tsquery where keyword @> 'new';
@@ -520,6 +574,42 @@ select keyword from test_tsquery where keyword <@ 'moscow';
520574
'moscow'
521575
(1 row)
522576

577+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow') as query where keyword <@ query;
578+
rewrite
579+
---------------------
580+
'moskva' | 'moscow'
581+
(1 row)
582+
583+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow & hotel') as query where keyword <@ query;
584+
rewrite
585+
-----------------------------------
586+
( 'moskva' | 'moscow' ) & 'hotel'
587+
(1 row)
588+
589+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'bar & new & qq & foo & york') as query where keyword <@ query;
590+
rewrite
591+
-------------------------------------------------------------------------------------
592+
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
593+
(1 row)
594+
595+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow') as query where query @> keyword;
596+
rewrite
597+
---------------------
598+
'moskva' | 'moscow'
599+
(1 row)
600+
601+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'moscow & hotel') as query where query @> keyword;
602+
rewrite
603+
-----------------------------------
604+
( 'moskva' | 'moscow' ) & 'hotel'
605+
(1 row)
606+
607+
select rewrite( ARRAY[query, keyword, sample] ) from test_tsquery, to_tsquery('english', 'bar & new & qq & foo & york') as query where query @> keyword;
608+
rewrite
609+
-------------------------------------------------------------------------------------
610+
'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | ( 'big' & 'appl' | 'new' & 'york' ) )
611+
(1 row)
612+
523613
set enable_seqscan='on';
524614
select lexize('simple', 'ASD56 hsdkf');
525615
lexize

‎contrib/tsearch2/sql/tsearch2.sql

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,21 @@ select rewrite('moscow', 'select keyword, sample from test_tsquery'::text );
116116
select rewrite('moscow & hotel','select keyword, sample from test_tsquery'::text );
117117
select rewrite('bar & new & qq & foo & york','select keyword, sample from test_tsquery'::text );
118118

119+
select rewrite( ARRAY['moscow', keyword, sample] )from test_tsquery;
120+
select rewrite( ARRAY['moscow & hotel', keyword, sample] )from test_tsquery;
121+
select rewrite( ARRAY['bar & new & qq & foo & york', keyword, sample] )from test_tsquery;
122+
123+
119124
select keywordfrom test_tsquerywhere keyword @>'new';
120125
select keywordfrom test_tsquerywhere keyword @>'moscow';
121126
select keywordfrom test_tsquerywhere keyword<@'new';
122127
select keywordfrom test_tsquerywhere keyword<@'moscow';
128+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow')as querywhere keyword<@ query;
129+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow & hotel')as querywhere keyword<@ query;
130+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','bar & new & qq & foo & york')as querywhere keyword<@ query;
131+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow')as querywhere query @> keyword;
132+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow & hotel')as querywhere query @> keyword;
133+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','bar & new & qq & foo & york')as querywhere query @> keyword;
123134

124135
createindexqqon test_tsquery using gist (keyword gist_tp_tsquery_ops);
125136
set enable_seqscan='off';
@@ -128,7 +139,12 @@ select keyword from test_tsquery where keyword @> 'new';
128139
select keywordfrom test_tsquerywhere keyword @>'moscow';
129140
select keywordfrom test_tsquerywhere keyword<@'new';
130141
select keywordfrom test_tsquerywhere keyword<@'moscow';
131-
142+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow')as querywhere keyword<@ query;
143+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow & hotel')as querywhere keyword<@ query;
144+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','bar & new & qq & foo & york')as querywhere keyword<@ query;
145+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow')as querywhere query @> keyword;
146+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','moscow & hotel')as querywhere query @> keyword;
147+
select rewrite( ARRAY[query, keyword, sample] )from test_tsquery, to_tsquery('english','bar & new & qq & foo & york')as querywhere query @> keyword;
132148
set enable_seqscan='on';
133149

134150

‎contrib/tsearch2/tsearch2.c

Lines changed: 137 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.1 2007/11/1321:02:29 tgl Exp $
10+
* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.c,v 1.2 2007/11/1322:14:50 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include"postgres.h"
1515

1616
#include"catalog/namespace.h"
17+
#include"catalog/pg_type.h"
1718
#include"commands/trigger.h"
1819
#include"fmgr.h"
1920
#include"tsearch/ts_utils.h"
@@ -77,13 +78,14 @@ Datum tsa_set_curprs_byname(PG_FUNCTION_ARGS);
7778
Datumtsa_parse_current(PG_FUNCTION_ARGS);
7879
Datumtsa_set_curcfg(PG_FUNCTION_ARGS);
7980
Datumtsa_set_curcfg_byname(PG_FUNCTION_ARGS);
80-
Datumtsa_show_curcfg(PG_FUNCTION_ARGS);
8181
Datumtsa_to_tsvector_name(PG_FUNCTION_ARGS);
8282
Datumtsa_to_tsquery_name(PG_FUNCTION_ARGS);
8383
Datumtsa_plainto_tsquery_name(PG_FUNCTION_ARGS);
8484
Datumtsa_headline_byname(PG_FUNCTION_ARGS);
8585
Datumtsa_ts_stat(PG_FUNCTION_ARGS);
8686
Datumtsa_tsearch2(PG_FUNCTION_ARGS);
87+
Datumtsa_rewrite_accum(PG_FUNCTION_ARGS);
88+
Datumtsa_rewrite_finish(PG_FUNCTION_ARGS);
8789

8890
PG_FUNCTION_INFO_V1(tsa_lexize_byname);
8991
PG_FUNCTION_INFO_V1(tsa_lexize_bycurrent);
@@ -95,13 +97,14 @@ PG_FUNCTION_INFO_V1(tsa_set_curprs_byname);
9597
PG_FUNCTION_INFO_V1(tsa_parse_current);
9698
PG_FUNCTION_INFO_V1(tsa_set_curcfg);
9799
PG_FUNCTION_INFO_V1(tsa_set_curcfg_byname);
98-
PG_FUNCTION_INFO_V1(tsa_show_curcfg);
99100
PG_FUNCTION_INFO_V1(tsa_to_tsvector_name);
100101
PG_FUNCTION_INFO_V1(tsa_to_tsquery_name);
101102
PG_FUNCTION_INFO_V1(tsa_plainto_tsquery_name);
102103
PG_FUNCTION_INFO_V1(tsa_headline_byname);
103104
PG_FUNCTION_INFO_V1(tsa_ts_stat);
104105
PG_FUNCTION_INFO_V1(tsa_tsearch2);
106+
PG_FUNCTION_INFO_V1(tsa_rewrite_accum);
107+
PG_FUNCTION_INFO_V1(tsa_rewrite_finish);
105108

106109

107110
/*
@@ -138,9 +141,6 @@ UNSUPPORTED_FUNCTION(tsa_prsd_headline);
138141
UNSUPPORTED_FUNCTION(tsa_reset_tsearch);
139142
UNSUPPORTED_FUNCTION(tsa_get_covers);
140143

141-
UNSUPPORTED_FUNCTION(tsa_rewrite_accum);
142-
UNSUPPORTED_FUNCTION(tsa_rewrite_finish);
143-
144144

145145
/*
146146
* list of redefined functions
@@ -275,6 +275,7 @@ tsa_set_curcfg_byname(PG_FUNCTION_ARGS)
275275
char*name;
276276

277277
name=TextPGetCString(arg0);
278+
278279
set_config_option("default_text_search_config",name,
279280
PGC_USERSET,
280281
PGC_S_SESSION,
@@ -284,20 +285,6 @@ tsa_set_curcfg_byname(PG_FUNCTION_ARGS)
284285
PG_RETURN_VOID();
285286
}
286287

287-
/* show_curcfg() */
288-
Datum
289-
tsa_show_curcfg(PG_FUNCTION_ARGS)
290-
{
291-
char*cfgname;
292-
Oidconfig_oid;
293-
294-
cfgname=GetConfigOptionByName("default_text_search_config",NULL);
295-
config_oid=DatumGetObjectId(DirectFunctionCall1(regconfigin,
296-
CStringGetDatum(cfgname)));
297-
298-
PG_RETURN_OID(config_oid);
299-
}
300-
301288
/* to_tsvector(text, text) */
302289
Datum
303290
tsa_to_tsvector_name(PG_FUNCTION_ARGS)
@@ -411,6 +398,136 @@ tsa_tsearch2(PG_FUNCTION_ARGS)
411398
returntsvector_update_trigger_byid(fcinfo);
412399
}
413400

401+
402+
Datum
403+
tsa_rewrite_accum(PG_FUNCTION_ARGS)
404+
{
405+
TSQueryacc;
406+
ArrayType*qa;
407+
TSQueryq;
408+
QTNode*qex=NULL,
409+
*subs=NULL,
410+
*acctree=NULL;
411+
boolisfind= false;
412+
Datum*elemsp;
413+
intnelemsp;
414+
MemoryContextaggcontext;
415+
MemoryContextoldcontext;
416+
417+
aggcontext= ((AggState*)fcinfo->context)->aggcontext;
418+
419+
if (PG_ARGISNULL(0)||PG_GETARG_POINTER(0)==NULL)
420+
{
421+
acc= (TSQuery)MemoryContextAlloc(aggcontext,HDRSIZETQ);
422+
SET_VARSIZE(acc,HDRSIZETQ);
423+
acc->size=0;
424+
}
425+
else
426+
acc=PG_GETARG_TSQUERY(0);
427+
428+
if (PG_ARGISNULL(1)||PG_GETARG_POINTER(1)==NULL)
429+
PG_RETURN_TSQUERY(acc);
430+
else
431+
qa=PG_GETARG_ARRAYTYPE_P_COPY(1);
432+
433+
if (ARR_NDIM(qa)!=1)
434+
elog(ERROR,"array must be one-dimensional, not %d dimensions",
435+
ARR_NDIM(qa));
436+
if (ArrayGetNItems(ARR_NDIM(qa),ARR_DIMS(qa))!=3)
437+
elog(ERROR,"array must have three elements");
438+
if (ARR_ELEMTYPE(qa)!=TSQUERYOID)
439+
elog(ERROR,"array must contain tsquery elements");
440+
441+
deconstruct_array(qa,TSQUERYOID,-1, false,'i',&elemsp,NULL,&nelemsp);
442+
443+
q=DatumGetTSQuery(elemsp[0]);
444+
if (q->size==0)
445+
{
446+
pfree(elemsp);
447+
PG_RETURN_POINTER(acc);
448+
}
449+
450+
if (!acc->size)
451+
{
452+
if (VARSIZE(acc)>HDRSIZETQ)
453+
{
454+
pfree(elemsp);
455+
PG_RETURN_POINTER(acc);
456+
}
457+
else
458+
acctree=QT2QTN(GETQUERY(q),GETOPERAND(q));
459+
}
460+
else
461+
acctree=QT2QTN(GETQUERY(acc),GETOPERAND(acc));
462+
463+
QTNTernary(acctree);
464+
QTNSort(acctree);
465+
466+
q=DatumGetTSQuery(elemsp[1]);
467+
if (q->size==0)
468+
{
469+
pfree(elemsp);
470+
PG_RETURN_POINTER(acc);
471+
}
472+
qex=QT2QTN(GETQUERY(q),GETOPERAND(q));
473+
QTNTernary(qex);
474+
QTNSort(qex);
475+
476+
q=DatumGetTSQuery(elemsp[2]);
477+
if (q->size)
478+
subs=QT2QTN(GETQUERY(q),GETOPERAND(q));
479+
480+
acctree=findsubquery(acctree,qex,subs,&isfind);
481+
482+
if (isfind|| !acc->size)
483+
{
484+
/* pfree( acc ); do not pfree(p), because nodeAgg.c will */
485+
if (acctree)
486+
{
487+
QTNBinary(acctree);
488+
oldcontext=MemoryContextSwitchTo(aggcontext);
489+
acc=QTN2QT(acctree);
490+
MemoryContextSwitchTo(oldcontext);
491+
}
492+
else
493+
{
494+
acc= (TSQuery)MemoryContextAlloc(aggcontext,HDRSIZETQ);
495+
SET_VARSIZE(acc,HDRSIZETQ);
496+
acc->size=0;
497+
}
498+
}
499+
500+
pfree(elemsp);
501+
QTNFree(qex);
502+
QTNFree(subs);
503+
QTNFree(acctree);
504+
505+
PG_RETURN_TSQUERY(acc);
506+
}
507+
508+
Datum
509+
tsa_rewrite_finish(PG_FUNCTION_ARGS)
510+
{
511+
TSQueryacc=PG_GETARG_TSQUERY(0);
512+
TSQueryrewrited;
513+
514+
if (acc==NULL||PG_ARGISNULL(0)||acc->size==0)
515+
{
516+
rewrited= (TSQuery)palloc(HDRSIZETQ);
517+
SET_VARSIZE(rewrited,HDRSIZETQ);
518+
rewrited->size=0;
519+
}
520+
else
521+
{
522+
rewrited= (TSQuery)palloc(VARSIZE(acc));
523+
memcpy(rewrited,acc,VARSIZE(acc));
524+
pfree(acc);
525+
}
526+
527+
PG_RETURN_POINTER(rewrited);
528+
}
529+
530+
414531
/*
415532
* Get Oid of current dictionary
416533
*/

‎contrib/tsearch2/tsearch2.sql.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.sql.in,v 1.1 2007/11/1321:02:29 tgl Exp $ */
1+
/* $PostgreSQL: pgsql/contrib/tsearch2/tsearch2.sql.in,v 1.2 2007/11/1322:14:50 tgl Exp $ */
22

33
-- Adjust this setting to control where the objects get created.
44
SET search_path = public;
@@ -206,9 +206,9 @@ CREATE FUNCTION set_curcfg(text)
206206

207207
CREATE FUNCTION show_curcfg()
208208
RETURNS oid
209-
as 'MODULE_PATHNAME', 'tsa_show_curcfg'
210-
LANGUAGEC
211-
RETURNS NULL ON NULL INPUT;
209+
AS 'get_current_ts_config'
210+
LANGUAGEINTERNAL
211+
RETURNS NULL ON NULL INPUT STABLE;
212212

213213
CREATE FUNCTION length(tsvector)
214214
RETURNS int4

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp