61{
68 int64 blocks_done = 0;
72 char *forkString;
73 char *ttype;
76 char relkind;
78
79
82 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
83 errmsg(
"relation cannot be null")));
87 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
88 errmsg(
"prewarm type cannot be null")));
91 if (strcmp(ttype, "prefetch") == 0)
93 else if (strcmp(ttype, "read") == 0)
95 else if (strcmp(ttype, "buffer") == 0)
97 else
98 {
100 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
101 errmsg(
"invalid prewarm type"),
102 errhint(
"Valid prewarm types are \"prefetch\", \"read\", and \"buffer\".")));
104 }
107 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
108 errmsg(
"relation fork cannot be null")));
112
113
114
115
116
118 if (relkind == RELKIND_INDEX ||
119 relkind == RELKIND_PARTITIONED_INDEX)
120 {
122
123
126 }
127 else
128 privOid = relOid;
129
131
132
133
134
135
136
137
138
139
140
142 (privOid != relOid &&
146 errmsg(
"could not find parent table of index \"%s\"",
148
152
153
154 if (!RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
156 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
157 errmsg(
"relation \"%s\" does not have storage",
160
161
164 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
165 errmsg(
"fork \"%s\" does not exist for this relation",
166 forkString)));
167
168
171 first_block = 0;
172 else
173 {
175 if (first_block < 0 || first_block >= nblocks)
177 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
178 errmsg(
"starting block number must be between 0 and %" PRId64,
179 (nblocks - 1))));
180 }
182 last_block = nblocks - 1;
183 else
184 {
186 if (last_block < 0 || last_block >= nblocks)
188 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
189 errmsg(
"ending block number must be between 0 and %" PRId64,
190 (nblocks - 1))));
191 }
192
193
195 {
196#ifdef USE_PREFETCH
197
198
199
200
201
202
203
204
205
206
207
208 for (block = first_block; block <= last_block; ++block)
209 {
212 ++blocks_done;
213 }
214#else
216 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
217 errmsg(
"prefetch is not supported by this build")));
218#endif
219 }
221 {
222
223
224
225
226
227 for (block = first_block; block <= last_block; ++block)
228 {
231 ++blocks_done;
232 }
233 }
235 {
238
239
240
241
242
243
246
247
248
249
250
254 NULL,
255 rel,
256 forkNumber,
258 &p,
259 0);
260
261 for (block = first_block; block <= last_block; ++block)
262 {
264
268 ++blocks_done;
269 }
272 }
273
274
276
277 if (privOid != relOid)
279
281}
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum, BlockNumber blockNum)
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
void ReleaseBuffer(Buffer buffer)
#define OidIsValid(objectId)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define PG_GETARG_TEXT_PP(n)
#define PG_RETURN_INT64(x)
#define PG_GETARG_INT64(n)
Assert(PointerIsAligned(start, uint64))
Oid IndexGetRelation(Oid indexId, bool missing_ok)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
char * get_rel_name(Oid relid)
char get_rel_relkind(Oid relid)
#define CHECK_FOR_INTERRUPTS()
ObjectType get_relkind_objtype(char relkind)
int errdetail_relkind_not_supported(char relkind)
static PGIOAlignedBlock blockbuffer
#define ERRCODE_UNDEFINED_TABLE
Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
ReadStream * read_stream_begin_relation(int flags, BufferAccessStrategy strategy, Relation rel, ForkNumber forknum, ReadStreamBlockNumberCB callback, void *callback_private_data, size_t per_buffer_data_size)
void read_stream_end(ReadStream *stream)
BlockNumber block_range_read_stream_cb(ReadStream *stream, void *callback_private_data, void *per_buffer_data)
#define READ_STREAM_MAINTENANCE
#define READ_STREAM_USE_BATCHING
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetRelationName(relation)
ForkNumber forkname_to_number(const char *forkName)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
static void smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void *buffer)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
BlockNumber last_exclusive
BlockNumber current_blocknum
char * text_to_cstring(const text *t)