56{
63 int64 blocks_done = 0;
67 char *forkString;
68 char *ttype;
71
72
75 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
76 errmsg(
"relation cannot be null")));
80 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
81 errmsg(
"prewarm type cannot be null")));
84 if (strcmp(ttype, "prefetch") == 0)
86 else if (strcmp(ttype, "read") == 0)
88 else if (strcmp(ttype, "buffer") == 0)
90 else
91 {
93 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
94 errmsg(
"invalid prewarm type"),
95 errhint(
"Valid prewarm types are \"prefetch\", \"read\", and \"buffer\".")));
97 }
100 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
101 errmsg(
"relation fork cannot be null")));
105
106
111
112
115 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
116 errmsg(
"fork \"%s\" does not exist for this relation",
117 forkString)));
118
119
122 first_block = 0;
123 else
124 {
126 if (first_block < 0 || first_block >= nblocks)
128 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
129 errmsg(
"starting block number must be between 0 and %lld",
130 (long long) (nblocks - 1))));
131 }
133 last_block = nblocks - 1;
134 else
135 {
137 if (last_block < 0 || last_block >= nblocks)
139 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
140 errmsg(
"ending block number must be between 0 and %lld",
141 (long long) (nblocks - 1))));
142 }
143
144
146 {
147#ifdef USE_PREFETCH
148
149
150
151
152
153
154
155
156
157
158
159 for (block = first_block; block <= last_block; ++block)
160 {
163 ++blocks_done;
164 }
165#else
167 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
168 errmsg(
"prefetch is not supported by this build")));
169#endif
170 }
172 {
173
174
175
176
177
178 for (block = first_block; block <= last_block; ++block)
179 {
182 ++blocks_done;
183 }
184 }
186 {
189
190
191
192
193
194
197
199 NULL,
200 rel,
201 forkNumber,
203 &p,
204 0);
205
206 for (block = first_block; block <= last_block; ++block)
207 {
209
213 ++blocks_done;
214 }
217 }
218
219
221
223}
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)
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))
char * get_rel_name(Oid relid)
#define CHECK_FOR_INTERRUPTS()
ObjectType get_relkind_objtype(char relkind)
static PGIOAlignedBlock blockbuffer
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)
static SMgrRelation RelationGetSmgr(Relation rel)
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)