@@ -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 ));
@@ -120,7 +137,6 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
120
137
bytea * raw_page = PG_GETARG_BYTEA_P (0 );
121
138
ReturnSetInfo * rsinfo = (ReturnSetInfo * ) fcinfo -> resultinfo ;
122
139
Page page ;
123
- GISTPageOpaque opaq ;
124
140
OffsetNumber offset ;
125
141
OffsetNumber maxoff = InvalidOffsetNumber ;
126
142
@@ -131,29 +147,11 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
131
147
132
148
InitMaterializedSRF (fcinfo , 0 );
133
149
134
- page = get_page_from_raw (raw_page );
150
+ page = verify_gist_page (raw_page );
135
151
136
152
if (PageIsNew (page ))
137
153
PG_RETURN_NULL ();
138
154
139
- /* verify the special space has the expected size */
140
- if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GISTPageOpaqueData )))
141
- ereport (ERROR ,
142
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
143
- errmsg ("input page is not a valid %s page" , "GiST" ),
144
- errdetail ("Expected special size %d, got %d." ,
145
- (int ) MAXALIGN (sizeof (GISTPageOpaqueData )),
146
- (int ) PageGetSpecialSize (page ))));
147
-
148
- opaq = GistPageGetOpaque (page );
149
- if (opaq -> gist_page_id != GIST_PAGE_ID )
150
- ereport (ERROR ,
151
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
152
- errmsg ("input page is not a valid %s page" , "GiST" ),
153
- errdetail ("Expected %08x, got %08x." ,
154
- GIST_PAGE_ID ,
155
- opaq -> gist_page_id )));
156
-
157
155
/* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */
158
156
if (GistPageIsDeleted (page ))
159
157
elog (NOTICE , "page is deleted" );
@@ -224,7 +222,7 @@ gist_page_items(PG_FUNCTION_ARGS)
224
222
errmsg ("\"%s\" is not a %s index" ,
225
223
RelationGetRelationName (indexRel ), "GiST" )));
226
224
227
- page = get_page_from_raw (raw_page );
225
+ page = verify_gist_page (raw_page );
228
226
229
227
if (PageIsNew (page ))
230
228
{
0 commit comments