@@ -34,29 +34,20 @@ PG_FUNCTION_INFO_V1(gist_page_items_bytea);
34
34
#define ItemPointerGetDatum (X ) PointerGetDatum(X)
35
35
36
36
37
- Datum
38
- gist_page_opaque_info (PG_FUNCTION_ARGS )
37
+ static Page verify_gist_page (bytea * raw_page );
38
+
39
+ /*
40
+ * Verify that the given bytea contains a GIST page or die in the attempt.
41
+ * A pointer to the page is returned.
42
+ */
43
+ static Page
44
+ verify_gist_page (bytea * raw_page )
39
45
{
40
- bytea * raw_page = PG_GETARG_BYTEA_P (0 );
41
- TupleDesc tupdesc ;
42
- Page page ;
46
+ Page page = get_page_from_raw (raw_page );
43
47
GISTPageOpaque opaq ;
44
- HeapTuple resultTuple ;
45
- Datum values [4 ];
46
- bool nulls [4 ];
47
- Datum flags [16 ];
48
- int nflags = 0 ;
49
- uint16 flagbits ;
50
-
51
- if (!superuser ())
52
- ereport (ERROR ,
53
- (errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
54
- errmsg ("must be superuser to use raw page functions" )));
55
-
56
- page = get_page_from_raw (raw_page );
57
48
58
49
if (PageIsNew (page ))
59
- PG_RETURN_NULL () ;
50
+ return page ;
60
51
61
52
/* verify the special space has the expected size */
62
53
if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GISTPageOpaqueData )))
@@ -76,12 +67,38 @@ gist_page_opaque_info(PG_FUNCTION_ARGS)
76
67
GIST_PAGE_ID ,
77
68
opaq -> gist_page_id )));
78
69
70
+ return page ;
71
+ }
72
+
73
+ Datum
74
+ gist_page_opaque_info (PG_FUNCTION_ARGS )
75
+ {
76
+ bytea * raw_page = PG_GETARG_BYTEA_P (0 );
77
+ TupleDesc tupdesc ;
78
+ Page page ;
79
+ HeapTuple resultTuple ;
80
+ Datum values [4 ];
81
+ bool nulls [4 ];
82
+ Datum flags [16 ];
83
+ int nflags = 0 ;
84
+ uint16 flagbits ;
85
+
86
+ if (!superuser ())
87
+ ereport (ERROR ,
88
+ (errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
89
+ errmsg ("must be superuser to use raw page functions" )));
90
+
91
+ page = verify_gist_page (raw_page );
92
+
93
+ if (PageIsNew (page ))
94
+ PG_RETURN_NULL ();
95
+
79
96
/* Build a tuple descriptor for our result type */
80
97
if (get_call_result_type (fcinfo , NULL , & tupdesc ) != TYPEFUNC_COMPOSITE )
81
98
elog (ERROR , "return type must be a row type" );
82
99
83
100
/* Convert the flags bitmask to an array of human-readable names */
84
- flagbits = opaq -> flags ;
101
+ flagbits = GistPageGetOpaque ( page ) -> flags ;
85
102
if (flagbits & F_LEAF )
86
103
flags [nflags ++ ] = CStringGetTextDatum ("leaf" );
87
104
if (flagbits & F_DELETED )
@@ -103,7 +120,7 @@ gist_page_opaque_info(PG_FUNCTION_ARGS)
103
120
104
121
values [0 ] = LSNGetDatum (PageGetLSN (page ));
105
122
values [1 ] = LSNGetDatum (GistPageGetNSN (page ));
106
- values [2 ] = Int64GetDatum (opaq -> rightlink );
123
+ values [2 ] = Int64GetDatum (GistPageGetOpaque ( page ) -> rightlink );
107
124
values [3 ] = PointerGetDatum (construct_array (flags , nflags ,
108
125
TEXTOID ,
109
126
-1 , false, TYPALIGN_INT ));
@@ -124,7 +141,6 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
124
141
Tuplestorestate * tupstore ;
125
142
MemoryContext oldcontext ;
126
143
Page page ;
127
- GISTPageOpaque opaq ;
128
144
OffsetNumber offset ;
129
145
OffsetNumber maxoff = InvalidOffsetNumber ;
130
146
@@ -157,29 +173,11 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
157
173
158
174
MemoryContextSwitchTo (oldcontext );
159
175
160
- page = get_page_from_raw (raw_page );
176
+ page = verify_gist_page (raw_page );
161
177
162
178
if (PageIsNew (page ))
163
179
PG_RETURN_NULL ();
164
180
165
- /* verify the special space has the expected size */
166
- if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GISTPageOpaqueData )))
167
- ereport (ERROR ,
168
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
169
- errmsg ("input page is not a valid %s page" , "GiST" ),
170
- errdetail ("Expected special size %d, got %d." ,
171
- (int ) MAXALIGN (sizeof (GISTPageOpaqueData )),
172
- (int ) PageGetSpecialSize (page ))));
173
-
174
- opaq = (GISTPageOpaque ) PageGetSpecialPointer (page );
175
- if (opaq -> gist_page_id != GIST_PAGE_ID )
176
- ereport (ERROR ,
177
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
178
- errmsg ("input page is not a valid %s page" , "GiST" ),
179
- errdetail ("Expected %08x, got %08x." ,
180
- GIST_PAGE_ID ,
181
- opaq -> gist_page_id )));
182
-
183
181
/* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */
184
182
if (GistPageIsDeleted (page ))
185
183
elog (NOTICE , "page is deleted" );
@@ -276,7 +274,7 @@ gist_page_items(PG_FUNCTION_ARGS)
276
274
errmsg ("\"%s\" is not a %s index" ,
277
275
RelationGetRelationName (indexRel ), "GiST" )));
278
276
279
- page = get_page_from_raw (raw_page );
277
+ page = verify_gist_page (raw_page );
280
278
281
279
if (PageIsNew (page ))
282
280
{
0 commit comments