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

Commit4fe8ba6

Browse files
committed
Fix bug corrupting query in gist consistent function.
Thank to Mario Weilguni <mweilguni@sime.com> to discover a bug.
1 parentc713683 commit4fe8ba6

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

‎contrib/ltree/_ltree_gist.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,5 +580,6 @@ _ltree_consistent(PG_FUNCTION_ARGS)
580580
/* internal error */
581581
elog(ERROR,"unrecognized StrategyNumber: %d",strategy);
582582
}
583+
PG_FREE_IF_COPY(query,1);
583584
PG_RETURN_BOOL(res);
584585
}

‎contrib/ltree/ltree.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.15 2006/03/1104:38:29 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.16 2006/07/1116:00:44 teodor Exp $ */
22

33
#ifndef__LTREE_H__
44
#define__LTREE_H__
@@ -163,8 +163,11 @@ bool compare_subnode(ltree_level * t, char *q, int len,
163163
ltree*lca_inner(ltree**a,intlen);
164164

165165
#definePG_GETARG_LTREE(x)((ltree*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
166+
#definePG_GETARG_LTREE_COPY(x)((ltree*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
166167
#definePG_GETARG_LQUERY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
168+
#definePG_GETARG_LQUERY_COPY(x) ((lquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
167169
#definePG_GETARG_LTXTQUERY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(x))))
170+
#definePG_GETARG_LTXTQUERY_COPY(x) ((ltxtquery*)DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(x))))
168171

169172
/* GiST support for ltree */
170173

‎contrib/ltree/ltree_gist.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* GiST support for ltree
33
* Teodor Sigaev <teodor@stack.net>
4-
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.15 2006/06/28 11:59:59 teodor Exp $
4+
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.16 2006/07/11 16:00:44 teodor Exp $
55
*/
66

77
#include"ltree.h"
@@ -627,23 +627,26 @@ Datum
627627
ltree_consistent(PG_FUNCTION_ARGS)
628628
{
629629
GISTENTRY*entry= (GISTENTRY*)PG_GETARG_POINTER(0);
630-
char*query=(char*)DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
630+
void*query=NULL;
631631
ltree_gist*key= (ltree_gist*)DatumGetPointer(entry->key);
632632
StrategyNumberstrategy= (StrategyNumber)PG_GETARG_UINT16(2);
633633
boolres= false;
634634

635635
switch (strategy)
636636
{
637637
caseBTLessStrategyNumber:
638+
query=PG_GETARG_LTREE(1);
638639
res= (GIST_LEAF(entry)) ?
639640
(ltree_compare((ltree*)query,LTG_NODE(key))>0)
640641
:
641642
(ltree_compare((ltree*)query,LTG_GETLNODE(key)) >=0);
642643
break;
643644
caseBTLessEqualStrategyNumber:
645+
query=PG_GETARG_LTREE(1);
644646
res= (ltree_compare((ltree*)query,LTG_GETLNODE(key)) >=0);
645647
break;
646648
caseBTEqualStrategyNumber:
649+
query=PG_GETARG_LTREE(1);
647650
if (GIST_LEAF(entry))
648651
res= (ltree_compare((ltree*)query,LTG_NODE(key))==0);
649652
else
@@ -654,28 +657,33 @@ ltree_consistent(PG_FUNCTION_ARGS)
654657
);
655658
break;
656659
caseBTGreaterEqualStrategyNumber:
660+
query=PG_GETARG_LTREE(1);
657661
res= (ltree_compare((ltree*)query,LTG_GETRNODE(key)) <=0);
658662
break;
659663
caseBTGreaterStrategyNumber:
664+
query=PG_GETARG_LTREE(1);
660665
res= (GIST_LEAF(entry)) ?
661666
(ltree_compare((ltree*)query,LTG_GETRNODE(key))<0)
662667
:
663668
(ltree_compare((ltree*)query,LTG_GETRNODE(key)) <=0);
664669
break;
665670
case10:
671+
query=PG_GETARG_LTREE_COPY(1);
666672
res= (GIST_LEAF(entry)) ?
667673
inner_isparent((ltree*)query,LTG_NODE(key))
668674
:
669675
gist_isparent(key, (ltree*)query);
670676
break;
671677
case11:
678+
query=PG_GETARG_LTREE_COPY(1);
672679
res= (GIST_LEAF(entry)) ?
673680
inner_isparent(LTG_NODE(key), (ltree*)query)
674681
:
675682
gist_ischild(key, (ltree*)query);
676683
break;
677684
case12:
678685
case13:
686+
query=PG_GETARG_LQUERY(1);
679687
if (GIST_LEAF(entry))
680688
res=DatumGetBool(DirectFunctionCall2(ltq_regex,
681689
PointerGetDatum(LTG_NODE(key)),
@@ -686,6 +694,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
686694
break;
687695
case14:
688696
case15:
697+
query=PG_GETARG_LQUERY(1);
689698
if (GIST_LEAF(entry))
690699
res=DatumGetBool(DirectFunctionCall2(ltxtq_exec,
691700
PointerGetDatum(LTG_NODE(key)),
@@ -696,6 +705,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
696705
break;
697706
case16:
698707
case17:
708+
query=DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
699709
if (GIST_LEAF(entry))
700710
res=DatumGetBool(DirectFunctionCall2(lt_q_regex,
701711
PointerGetDatum(LTG_NODE(key)),
@@ -708,5 +718,7 @@ ltree_consistent(PG_FUNCTION_ARGS)
708718
/* internal error */
709719
elog(ERROR,"unrecognized StrategyNumber: %d",strategy);
710720
}
721+
722+
PG_FREE_IF_COPY(query,1);
711723
PG_RETURN_BOOL(res);
712724
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp