@@ -36,7 +36,8 @@ typedef enum
3636{
3737 PREWARM_PREFETCH ,
3838 PREWARM_READ ,
39- PREWARM_BUFFER
39+ PREWARM_BUFFER ,
40+ PREWARM_TUPLE ,
4041} PrewarmType ;
4142
4243static PGIOAlignedBlock blockbuffer ;
@@ -89,6 +90,8 @@ pg_prewarm(PG_FUNCTION_ARGS)
8990 ptype = PREWARM_READ ;
9091 else if (strcmp (ttype , "buffer" ) == 0 )
9192 ptype = PREWARM_BUFFER ;
93+ else if (strcmp (ttype , "tuple" ) == 0 )
94+ ptype = PREWARM_TUPLE ;
9295 else
9396 {
9497 ereport (ERROR ,
@@ -185,6 +188,33 @@ pg_prewarm(PG_FUNCTION_ARGS)
185188 }
186189 }
187190 else if (ptype == PREWARM_BUFFER )
191+ {
192+ BlockNumber prefetch_block = first_block ;
193+ Oid nspOid ;
194+ int io_concurrency ;
195+
196+ nspOid = rel -> rd_rel -> reltablespace ;
197+ io_concurrency = get_tablespace_maintenance_io_concurrency (nspOid );
198+
199+ /*
200+ * In buffer mode, we actually pull the data into shared_buffers.
201+ */
202+ for (block = first_block ; block <= last_block ; ++ block )
203+ {
204+ Buffer buf ;
205+ BlockNumber prefetch_stop = block + Min (last_block - block + 1 ,
206+ io_concurrency );
207+ CHECK_FOR_INTERRUPTS ();
208+ while (prefetch_block < prefetch_stop )
209+ {
210+ PrefetchBuffer (rel , forkNumber , prefetch_block ++ );
211+ }
212+ buf = ReadBufferExtended (rel , forkNumber , block , RBM_NORMAL , NULL );
213+ ReleaseBuffer (buf );
214+ ++ blocks_done ;
215+ }
216+ }
217+ else if (ptype == PREWARM_TUPLE )
188218 {
189219 if (get_relkind_objtype (rel -> rd_rel -> relkind ) == OBJECT_TABLE && forkNumber == MAIN_FORKNUM )
190220 {
@@ -204,33 +234,11 @@ pg_prewarm(PG_FUNCTION_ARGS)
204234 CHECK_FOR_INTERRUPTS ();
205235 }
206236 heap_endscan (scan );
207- }
208- else
237+ } else
209238 {
210- BlockNumber prefetch_block = first_block ;
211- Oid nspOid ;
212- int io_concurrency ;
213-
214- nspOid = rel -> rd_rel -> reltablespace ;
215- io_concurrency = get_tablespace_maintenance_io_concurrency (nspOid );
216-
217- /*
218- * In buffer mode, we actually pull the data into shared_buffers.
219- */
220- for (block = first_block ; block <= last_block ; ++ block )
221- {
222- Buffer buf ;
223- BlockNumber prefetch_stop = block + Min (last_block - block + 1 ,
224- io_concurrency );
225- CHECK_FOR_INTERRUPTS ();
226- while (prefetch_block < prefetch_stop )
227- {
228- PrefetchBuffer (rel , forkNumber , prefetch_block ++ );
229- }
230- buf = ReadBufferExtended (rel , forkNumber , block , RBM_NORMAL , NULL );
231- ReleaseBuffer (buf );
232- ++ blocks_done ;
233- }
239+ ereport (INFO ,
240+ (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
241+ errmsg ("tuple prewarm is only supported for heap relations on main fork" )));
234242 }
235243 }
236244
0 commit comments