@@ -28,11 +28,31 @@ PG_FUNCTION_INFO_V1(gin_metapage_info);
28
28
PG_FUNCTION_INFO_V1 (gin_page_opaque_info );
29
29
PG_FUNCTION_INFO_V1 (gin_leafpage_items );
30
30
31
+
32
+ static Page
33
+ get_page_from_raw (bytea * raw_page )
34
+ {
35
+ int raw_page_size ;
36
+ Page page ;
37
+
38
+ raw_page_size = VARSIZE (raw_page ) - VARHDRSZ ;
39
+ if (raw_page_size < BLCKSZ )
40
+ ereport (ERROR ,
41
+ (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
42
+ errmsg ("input page too small (%d bytes)" , raw_page_size )));
43
+
44
+ /* make a copy so that the page is properly aligned for struct access */
45
+ page = palloc (raw_page_size );
46
+ memcpy (page , VARDATA (raw_page ), raw_page_size );
47
+
48
+ return page ;
49
+ }
50
+
51
+
31
52
Datum
32
53
gin_metapage_info (PG_FUNCTION_ARGS )
33
54
{
34
55
bytea * raw_page = PG_GETARG_BYTEA_P (0 );
35
- int raw_page_size ;
36
56
TupleDesc tupdesc ;
37
57
Page page ;
38
58
GinPageOpaque opaq ;
@@ -46,12 +66,7 @@ gin_metapage_info(PG_FUNCTION_ARGS)
46
66
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
47
67
(errmsg ("must be superuser to use raw page functions" ))));
48
68
49
- raw_page_size = VARSIZE (raw_page ) - VARHDRSZ ;
50
- if (raw_page_size < BLCKSZ )
51
- ereport (ERROR ,
52
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
53
- errmsg ("input page too small (%d bytes)" , raw_page_size )));
54
- page = VARDATA (raw_page );
69
+ page = get_page_from_raw (raw_page );
55
70
56
71
opaq = (GinPageOpaque ) PageGetSpecialPointer (page );
57
72
if (opaq -> flags != GIN_META )
94
109
gin_page_opaque_info (PG_FUNCTION_ARGS )
95
110
{
96
111
bytea * raw_page = PG_GETARG_BYTEA_P (0 );
97
- int raw_page_size ;
98
112
TupleDesc tupdesc ;
99
113
Page page ;
100
114
GinPageOpaque opaq ;
@@ -110,12 +124,7 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
110
124
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
111
125
(errmsg ("must be superuser to use raw page functions" ))));
112
126
113
- raw_page_size = VARSIZE (raw_page ) - VARHDRSZ ;
114
- if (raw_page_size < BLCKSZ )
115
- ereport (ERROR ,
116
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
117
- errmsg ("input page too small (%d bytes)" , raw_page_size )));
118
- page = VARDATA (raw_page );
127
+ page = get_page_from_raw (raw_page );
119
128
120
129
opaq = (GinPageOpaque ) PageGetSpecialPointer (page );
121
130
@@ -173,7 +182,6 @@ Datum
173
182
gin_leafpage_items (PG_FUNCTION_ARGS )
174
183
{
175
184
bytea * raw_page = PG_GETARG_BYTEA_P (0 );
176
- int raw_page_size ;
177
185
FuncCallContext * fctx ;
178
186
gin_leafpage_items_state * inter_call_data ;
179
187
@@ -182,20 +190,14 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
182
190
(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
183
191
(errmsg ("must be superuser to use raw page functions" ))));
184
192
185
- raw_page_size = VARSIZE (raw_page ) - VARHDRSZ ;
186
-
187
193
if (SRF_IS_FIRSTCALL ())
188
194
{
189
195
TupleDesc tupdesc ;
190
196
MemoryContext mctx ;
191
197
Page page ;
192
198
GinPageOpaque opaq ;
193
199
194
- if (raw_page_size < BLCKSZ )
195
- ereport (ERROR ,
196
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
197
- errmsg ("input page too small (%d bytes)" , raw_page_size )));
198
- page = VARDATA (raw_page );
200
+ page = get_page_from_raw (raw_page );
199
201
200
202
if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GinPageOpaqueData )))
201
203
ereport (ERROR ,
0 commit comments