@@ -32,29 +32,20 @@ PG_FUNCTION_INFO_V1(gist_page_items_bytea);
32
32
#define IS_GIST (r ) ((r)->rd_rel->relam == GIST_AM_OID)
33
33
34
34
35
- Datum
36
- gist_page_opaque_info (PG_FUNCTION_ARGS )
35
+ static Page verify_gist_page (bytea * raw_page );
36
+
37
+ /*
38
+ * Verify that the given bytea contains a GIST page or die in the attempt.
39
+ * A pointer to the page is returned.
40
+ */
41
+ static Page
42
+ verify_gist_page (bytea * raw_page )
37
43
{
38
- bytea * raw_page = PG_GETARG_BYTEA_P (0 );
39
- TupleDesc tupdesc ;
40
- Page page ;
44
+ Page page = get_page_from_raw (raw_page );
41
45
GISTPageOpaque opaq ;
42
- HeapTuple resultTuple ;
43
- Datum values [4 ];
44
- bool nulls [4 ];
45
- Datum flags [16 ];
46
- int nflags = 0 ;
47
- uint16 flagbits ;
48
-
49
- if (!superuser ())
50
- ereport (ERROR ,
51
- (errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
52
- errmsg ("must be superuser to use raw page functions" )));
53
-
54
- page = get_page_from_raw (raw_page );
55
46
56
47
if (PageIsNew (page ))
57
- PG_RETURN_NULL () ;
48
+ return page ;
58
49
59
50
/* verify the special space has the expected size */
60
51
if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GISTPageOpaqueData )))
@@ -74,12 +65,38 @@ gist_page_opaque_info(PG_FUNCTION_ARGS)
74
65
GIST_PAGE_ID ,
75
66
opaq -> gist_page_id )));
76
67
68
+ return page ;
69
+ }
70
+
71
+ Datum
72
+ gist_page_opaque_info (PG_FUNCTION_ARGS )
73
+ {
74
+ bytea * raw_page = PG_GETARG_BYTEA_P (0 );
75
+ TupleDesc tupdesc ;
76
+ Page page ;
77
+ HeapTuple resultTuple ;
78
+ Datum values [4 ];
79
+ bool nulls [4 ];
80
+ Datum flags [16 ];
81
+ int nflags = 0 ;
82
+ uint16 flagbits ;
83
+
84
+ if (!superuser ())
85
+ ereport (ERROR ,
86
+ (errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
87
+ errmsg ("must be superuser to use raw page functions" )));
88
+
89
+ page = verify_gist_page (raw_page );
90
+
91
+ if (PageIsNew (page ))
92
+ PG_RETURN_NULL ();
93
+
77
94
/* Build a tuple descriptor for our result type */
78
95
if (get_call_result_type (fcinfo , NULL , & tupdesc ) != TYPEFUNC_COMPOSITE )
79
96
elog (ERROR , "return type must be a row type" );
80
97
81
98
/* Convert the flags bitmask to an array of human-readable names */
82
- flagbits = opaq -> flags ;
99
+ flagbits = GistPageGetOpaque ( page ) -> flags ;
83
100
if (flagbits & F_LEAF )
84
101
flags [nflags ++ ] = CStringGetTextDatum ("leaf" );
85
102
if (flagbits & F_DELETED )
@@ -101,7 +118,7 @@ gist_page_opaque_info(PG_FUNCTION_ARGS)
101
118
102
119
values [0 ] = LSNGetDatum (PageGetLSN (page ));
103
120
values [1 ] = LSNGetDatum (GistPageGetNSN (page ));
104
- values [2 ] = Int64GetDatum (opaq -> rightlink );
121
+ values [2 ] = Int64GetDatum (GistPageGetOpaque ( page ) -> rightlink );
105
122
values [3 ] = PointerGetDatum (construct_array_builtin (flags , nflags , TEXTOID ));
106
123
107
124
/* Build and return the result tuple. */
@@ -116,7 +133,6 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
116
133
bytea * raw_page = PG_GETARG_BYTEA_P (0 );
117
134
ReturnSetInfo * rsinfo = (ReturnSetInfo * ) fcinfo -> resultinfo ;
118
135
Page page ;
119
- GISTPageOpaque opaq ;
120
136
OffsetNumber offset ;
121
137
OffsetNumber maxoff = InvalidOffsetNumber ;
122
138
@@ -127,29 +143,11 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
127
143
128
144
InitMaterializedSRF (fcinfo , 0 );
129
145
130
- page = get_page_from_raw (raw_page );
146
+ page = verify_gist_page (raw_page );
131
147
132
148
if (PageIsNew (page ))
133
149
PG_RETURN_NULL ();
134
150
135
- /* verify the special space has the expected size */
136
- if (PageGetSpecialSize (page ) != MAXALIGN (sizeof (GISTPageOpaqueData )))
137
- ereport (ERROR ,
138
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
139
- errmsg ("input page is not a valid %s page" , "GiST" ),
140
- errdetail ("Expected special size %d, got %d." ,
141
- (int ) MAXALIGN (sizeof (GISTPageOpaqueData )),
142
- (int ) PageGetSpecialSize (page ))));
143
-
144
- opaq = GistPageGetOpaque (page );
145
- if (opaq -> gist_page_id != GIST_PAGE_ID )
146
- ereport (ERROR ,
147
- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
148
- errmsg ("input page is not a valid %s page" , "GiST" ),
149
- errdetail ("Expected %08x, got %08x." ,
150
- GIST_PAGE_ID ,
151
- opaq -> gist_page_id )));
152
-
153
151
/* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */
154
152
if (GistPageIsDeleted (page ))
155
153
elog (NOTICE , "page is deleted" );
@@ -220,7 +218,7 @@ gist_page_items(PG_FUNCTION_ARGS)
220
218
errmsg ("\"%s\" is not a %s index" ,
221
219
RelationGetRelationName (indexRel ), "GiST" )));
222
220
223
- page = get_page_from_raw (raw_page );
221
+ page = verify_gist_page (raw_page );
224
222
225
223
if (PageIsNew (page ))
226
224
{
0 commit comments