Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e1662cb

Browse files
committed
Simplify/clean up code for varlena types
1 parent 03b8efa commit e1662cb

File tree

6 files changed

+58
-161
lines changed

6 files changed

+58
-161
lines changed

contrib/btree_gist/btree_bit.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static bytea *
6767
gbt_bit_xfrm(bytea *leaf)
6868
{
6969
bytea *out = leaf;
70-
int s = VARBITBYTES(leaf) + VARHDRSZ;
70+
int s = INTALIGN(VARBITBYTES(leaf) + VARHDRSZ);
7171

7272
out = palloc(s);
7373
VARATT_SIZEP(out) = s;
@@ -126,8 +126,7 @@ Datum
126126
gbt_bit_consistent(PG_FUNCTION_ARGS)
127127
{
128128
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
129-
GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
130-
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
129+
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
131130
void *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
132131
void *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
133132
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -144,8 +143,6 @@ gbt_bit_consistent(PG_FUNCTION_ARGS)
144143
pfree(q);
145144
}
146145

147-
if (ktst != key)
148-
pfree(key);
149146
if (qtst != query)
150147
pfree(query);
151148
PG_RETURN_BOOL(retval);

contrib/btree_gist/btree_bytea.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ Datum
9696
gbt_bytea_consistent(PG_FUNCTION_ARGS)
9797
{
9898
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
99-
GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
100-
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
99+
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
101100
void *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
102101
void *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
103102
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -106,8 +105,6 @@ gbt_bytea_consistent(PG_FUNCTION_ARGS)
106105

107106
retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
108107

109-
if (ktst != key)
110-
pfree(key);
111108
if (qtst != query)
112109
pfree(query);
113110
PG_RETURN_BOOL(retval);

contrib/btree_gist/btree_gist.sql.in

+11-6
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ RETURNS internal
107107
AS 'MODULE_PATHNAME'
108108
LANGUAGE 'C';
109109

110+
CREATE FUNCTION gbt_var_decompress(internal)
111+
RETURNS internal
112+
AS 'MODULE_PATHNAME'
113+
LANGUAGE 'C';
114+
110115
CREATE FUNCTION gbt_oid_penalty(internal,internal,internal)
111116
RETURNS internal
112117
AS 'MODULE_PATHNAME'
@@ -893,7 +898,7 @@ AS
893898
FUNCTION 1 gbt_text_consistent (internal, text, int2),
894899
FUNCTION 2 gbt_text_union (bytea, internal),
895900
FUNCTION 3 gbt_text_compress (internal),
896-
FUNCTION 4 gbt_decompress (internal),
901+
FUNCTION 4 gbt_var_decompress (internal),
897902
FUNCTION 5 gbt_text_penalty (internal, internal, internal),
898903
FUNCTION 6 gbt_text_picksplit (internal, internal),
899904
FUNCTION 7 gbt_text_same (internal, internal, internal),
@@ -912,7 +917,7 @@ AS
912917
FUNCTION 1 gbt_bpchar_consistent (internal, bpchar , int2),
913918
FUNCTION 2 gbt_text_union (bytea, internal),
914919
FUNCTION 3 gbt_bpchar_compress (internal),
915-
FUNCTION 4 gbt_decompress (internal),
920+
FUNCTION 4 gbt_var_decompress (internal),
916921
FUNCTION 5 gbt_text_penalty (internal, internal, internal),
917922
FUNCTION 6 gbt_text_picksplit (internal, internal),
918923
FUNCTION 7 gbt_text_same (internal, internal, internal),
@@ -969,7 +974,7 @@ AS
969974
FUNCTION 1 gbt_bytea_consistent (internal, bytea, int2),
970975
FUNCTION 2 gbt_bytea_union (bytea, internal),
971976
FUNCTION 3 gbt_bytea_compress (internal),
972-
FUNCTION 4 gbt_decompress (internal),
977+
FUNCTION 4 gbt_var_decompress (internal),
973978
FUNCTION 5 gbt_bytea_penalty (internal, internal, internal),
974979
FUNCTION 6 gbt_bytea_picksplit (internal, internal),
975980
FUNCTION 7 gbt_bytea_same (internal, internal, internal),
@@ -1026,7 +1031,7 @@ AS
10261031
FUNCTION 1 gbt_numeric_consistent (internal, numeric, int2),
10271032
FUNCTION 2 gbt_numeric_union (bytea, internal),
10281033
FUNCTION 3 gbt_numeric_compress (internal),
1029-
FUNCTION 4 gbt_decompress (internal),
1034+
FUNCTION 4 gbt_var_decompress (internal),
10301035
FUNCTION 5 gbt_numeric_penalty (internal, internal, internal),
10311036
FUNCTION 6 gbt_numeric_picksplit (internal, internal),
10321037
FUNCTION 7 gbt_numeric_same (internal, internal, internal),
@@ -1081,7 +1086,7 @@ AS
10811086
FUNCTION 1 gbt_bit_consistent (internal, bit, int2),
10821087
FUNCTION 2 gbt_bit_union (bytea, internal),
10831088
FUNCTION 3 gbt_bit_compress (internal),
1084-
FUNCTION 4 gbt_decompress (internal),
1089+
FUNCTION 4 gbt_var_decompress (internal),
10851090
FUNCTION 5 gbt_bit_penalty (internal, internal, internal),
10861091
FUNCTION 6 gbt_bit_picksplit (internal, internal),
10871092
FUNCTION 7 gbt_bit_same (internal, internal, internal),
@@ -1100,7 +1105,7 @@ AS
11001105
FUNCTION 1 gbt_bit_consistent (internal, bit, int2),
11011106
FUNCTION 2 gbt_bit_union (bytea, internal),
11021107
FUNCTION 3 gbt_bit_compress (internal),
1103-
FUNCTION 4 gbt_decompress (internal),
1108+
FUNCTION 4 gbt_var_decompress (internal),
11041109
FUNCTION 5 gbt_bit_penalty (internal, internal, internal),
11051110
FUNCTION 6 gbt_bit_picksplit (internal, internal),
11061111
FUNCTION 7 gbt_bit_same (internal, internal, internal),

contrib/btree_gist/btree_numeric.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ gbt_numeric_consistent(PG_FUNCTION_ARGS)
9797
{
9898

9999
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
100-
GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
101-
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
100+
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
102101
void *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
103102
void *query = (void *) DatumGetNumeric(PG_GETARG_DATUM(1));
104103
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
@@ -107,8 +106,6 @@ gbt_numeric_consistent(PG_FUNCTION_ARGS)
107106

108107
retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
109108

110-
if (ktst != key)
111-
pfree(key);
112109
if (qtst != query)
113110
pfree(query);
114111
PG_RETURN_BOOL(retval);

contrib/btree_gist/btree_text.c

+9-89
Original file line numberDiff line numberDiff line change
@@ -59,64 +59,9 @@ gbt_textlt(const void *a, const void *b)
5959
static int32
6060
gbt_textcmp(const bytea *a, const bytea *b)
6161
{
62-
return strcmp(VARDATA(a), VARDATA(b));
62+
return DatumGetInt32(DirectFunctionCall2(bttextcmp, PointerGetDatum(a), PointerGetDatum(b)));
6363
}
6464

65-
66-
/*
67-
* Converts data of leaf using strxfrm ( locale support )
68-
*/
69-
70-
static bytea *
71-
gbt_text_xfrm(bytea *leaf)
72-
{
73-
bytea *out = leaf;
74-
int32 ilen = VARSIZE(leaf) - VARHDRSZ;
75-
int32 olen;
76-
char *sin;
77-
char *sou;
78-
79-
sin = palloc(ilen + 1);
80-
memcpy(sin, (void *) VARDATA(leaf), ilen);
81-
sin[ilen] = '\0';
82-
83-
olen = strxfrm(NULL, &sin[0], 0) + 1;
84-
sou = palloc(olen);
85-
olen = strxfrm(sou, &sin[0], olen);
86-
olen += VARHDRSZ;
87-
out = palloc(olen + 1);
88-
out->vl_len = olen + 1;
89-
memcpy((void *) VARDATA(out), sou, olen - VARHDRSZ);
90-
((char *) out)[olen] = '\0';
91-
92-
pfree(sou);
93-
pfree(sin);
94-
95-
return out;
96-
}
97-
98-
99-
static GBT_VARKEY *
100-
gbt_text_l2n(GBT_VARKEY * leaf)
101-
{
102-
103-
GBT_VARKEY *out = leaf;
104-
GBT_VARKEY_R r = gbt_var_key_readable(leaf);
105-
bytea *o;
106-
107-
o = gbt_text_xfrm(r.lower);
108-
r.lower = r.upper = o;
109-
out = gbt_var_key_copy(&r, TRUE);
110-
pfree(o);
111-
112-
return out;
113-
114-
}
115-
116-
117-
118-
119-
12065
static const gbtree_vinfo tinfo =
12166
{
12267
gbt_t_text,
@@ -128,7 +73,7 @@ static const gbtree_vinfo tinfo =
12873
gbt_textle,
12974
gbt_textlt,
13075
gbt_textcmp,
131-
gbt_text_l2n
76+
NULL
13277
};
13378

13479

@@ -157,14 +102,13 @@ gbt_bpchar_compress(PG_FUNCTION_ARGS)
157102
{
158103

159104
Datum d = DirectFunctionCall1(rtrim1, entry->key);
160-
GISTENTRY *trim = palloc(sizeof(GISTENTRY));
105+
GISTENTRY trim;
161106

162-
gistentryinit(*trim, d,
107+
gistentryinit(trim, d,
163108
entry->rel, entry->page,
164109
entry->offset, VARSIZE(DatumGetPointer(d)), TRUE);
165-
retval = gbt_var_compress(trim, &tinfo);
110+
retval = gbt_var_compress(&trim, &tinfo);
166111

167-
pfree(trim);
168112
pfree(DatumGetPointer(d));
169113
}
170114
else
@@ -179,27 +123,15 @@ Datum
179123
gbt_text_consistent(PG_FUNCTION_ARGS)
180124
{
181125
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
182-
GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
183-
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
126+
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
184127
void *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
185128
void *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
186129
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
187130
bool retval = FALSE;
188131
GBT_VARKEY_R r = gbt_var_key_readable(key);
189132

190-
if (GIST_LEAF(entry))
191-
retval = gbt_var_consistent(&r, query, &strategy, TRUE, &tinfo);
192-
else
193-
{
194-
bytea *q = gbt_text_xfrm((bytea *) query);
133+
retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
195134

196-
retval = gbt_var_consistent(&r, (void *) q, &strategy, FALSE, &tinfo);
197-
if (q != query)
198-
pfree(q);
199-
}
200-
201-
if (ktst != key)
202-
pfree(key);
203135
if (qtst != query)
204136
pfree(query);
205137

@@ -211,30 +143,18 @@ Datum
211143
gbt_bpchar_consistent(PG_FUNCTION_ARGS)
212144
{
213145
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
214-
GBT_VARKEY *ktst = (GBT_VARKEY *) DatumGetPointer(entry->key);
215-
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
146+
GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
216147
void *qtst = (void *) DatumGetPointer(PG_GETARG_DATUM(1));
217148
void *query = (void *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(1)));
218149
void *trim = (void *) DatumGetPointer(DirectFunctionCall1(rtrim1, PointerGetDatum(query)));
219150
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
220151
bool retval = FALSE;
221152
GBT_VARKEY_R r = gbt_var_key_readable(key);
222153

223-
if (GIST_LEAF(entry))
224-
retval = gbt_var_consistent(&r, trim, &strategy, TRUE, &tinfo);
225-
else
226-
{
227-
bytea *q = gbt_text_xfrm((bytea *) trim);
228-
229-
retval = gbt_var_consistent(&r, (void *) q, &strategy, FALSE, &tinfo);
230-
if (q != trim)
231-
pfree(q);
232-
}
154+
retval = gbt_var_consistent(&r, trim, &strategy, GIST_LEAF(entry), &tinfo);
233155

234156
pfree(trim);
235157

236-
if (ktst != key)
237-
pfree(key);
238158
if (qtst != query)
239159
pfree(query);
240160
PG_RETURN_BOOL(retval);

0 commit comments

Comments
 (0)