PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pgpa_trove.h File Reference
#include "pgpa_ast.h"
#include "nodes/bitmapset.h"
Include dependency graph for pgpa_trove.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  pgpa_trove_entry
 
struct  pgpa_trove_result
 

Macros

#define PGPA_TE_MATCH_PARTIAL   0x0001
 
#define PGPA_TE_MATCH_FULL   0x0002
 
#define PGPA_TE_INAPPLICABLE   0x0004
 
#define PGPA_TE_CONFLICTING   0x0008
 
#define PGPA_TE_FAILED   0x0010
 

Typedefs

typedef struct pgpa_trove pgpa_trove
 
typedef struct pgpa_trove_entry pgpa_trove_entry
 
typedef enum pgpa_trove_lookup_type pgpa_trove_lookup_type
 
typedef struct pgpa_trove_result pgpa_trove_result
 

Enumerations

enum  pgpa_trove_lookup_type { PGPA_TROVE_LOOKUP_JOIN , PGPA_TROVE_LOOKUP_REL , PGPA_TROVE_LOOKUP_SCAN }
 

Functions

pgpa_trovepgpa_build_trove (List *advice_items)
 
void pgpa_trove_lookup (pgpa_trove *trove, pgpa_trove_lookup_type type, int nrids, pgpa_identifier *rids, pgpa_trove_result *result)
 
void pgpa_trove_lookup_all (pgpa_trove *trove, pgpa_trove_lookup_type type, pgpa_trove_entry **entries, int *nentries)
 
charpgpa_cstring_trove_entry (pgpa_trove_entry *entry)
 
void pgpa_trove_set_flags (pgpa_trove_entry *entries, Bitmapset *indexes, int flags)
 
void pgpa_trove_append_flags (StringInfo buf, int flags)
 

Macro Definition Documentation

◆ PGPA_TE_CONFLICTING

#define PGPA_TE_CONFLICTING   0x0008

Definition at line 49 of file pgpa_trove.h.

◆ PGPA_TE_FAILED

#define PGPA_TE_FAILED   0x0010

Definition at line 50 of file pgpa_trove.h.

◆ PGPA_TE_INAPPLICABLE

#define PGPA_TE_INAPPLICABLE   0x0004

Definition at line 48 of file pgpa_trove.h.

◆ PGPA_TE_MATCH_FULL

#define PGPA_TE_MATCH_FULL   0x0002

Definition at line 47 of file pgpa_trove.h.

◆ PGPA_TE_MATCH_PARTIAL

#define PGPA_TE_MATCH_PARTIAL   0x0001

Definition at line 46 of file pgpa_trove.h.

Typedef Documentation

◆ pgpa_trove

Definition at line 20 of file pgpa_trove.h.

◆ pgpa_trove_entry

◆ pgpa_trove_lookup_type

◆ pgpa_trove_result

Enumeration Type Documentation

◆ pgpa_trove_lookup_type

Enumerator
PGPA_TROVE_LOOKUP_JOIN 
PGPA_TROVE_LOOKUP_REL 
PGPA_TROVE_LOOKUP_SCAN 

Definition at line 81 of file pgpa_trove.h.

82{
pgpa_trove_lookup_type
Definition pgpa_trove.h:82
@ PGPA_TROVE_LOOKUP_SCAN
Definition pgpa_trove.h:85
@ PGPA_TROVE_LOOKUP_JOIN
Definition pgpa_trove.h:83
@ PGPA_TROVE_LOOKUP_REL
Definition pgpa_trove.h:84

Function Documentation

◆ pgpa_build_trove()

pgpa_trove * pgpa_build_trove ( List advice_items)
extern

Definition at line 132 of file pgpa_trove.c.

133{
135
137 pgpa_init_trove_slice(&trove->rel);
139
141 {
142 switch (item->tag)
143 {
145 {
146 pgpa_advice_target *target;
147
148 /*
149 * For most advice types, each element in the top-level
150 * list is a separate target, but it's most convenient to
151 * regard the entirety of a JOIN_ORDER specification as a
152 * single target. Since it wasn't represented that way
153 * during parsing, build a surrogate object now.
154 */
157 target->children = item->targets;
158
160 item->tag, target);
161 }
162 break;
163
170
171 /*
172 * Scan advice.
173 */
174 foreach_ptr(pgpa_advice_target, target, item->targets)
175 {
176 /*
177 * For now, all of our scan types target single relations,
178 * but in the future this might not be true, e.g. a custom
179 * scan could replace a join.
180 */
181 Assert(target->ttype == PGPA_TARGET_IDENTIFIER);
183 item->tag, target);
184 }
185 break;
186
196
197 /*
198 * Join strategy advice.
199 */
200 foreach_ptr(pgpa_advice_target, target, item->targets)
201 {
203 item->tag, target);
204 }
205 break;
206
208 case PGPA_TAG_GATHER:
211
212 /*
213 * Advice about a RelOptInfo relevant to both scans and joins.
214 */
215 foreach_ptr(pgpa_advice_target, target, item->targets)
216 {
218 item->tag, target);
219 }
220 break;
221 }
222 }
223
224 return trove;
225}
#define Assert(condition)
Definition c.h:943
#define palloc_object(type)
Definition fe_memutils.h:74
#define palloc0_object(type)
Definition fe_memutils.h:75
#define foreach_ptr(type, var, lst)
Definition pg_list.h:501
@ PGPA_TAG_INDEX_SCAN
Definition pgpa_ast.h:89
@ PGPA_TAG_NESTED_LOOP_MATERIALIZE
Definition pgpa_ast.h:93
@ PGPA_TAG_MERGE_JOIN_PLAIN
Definition pgpa_ast.h:92
@ PGPA_TAG_GATHER_MERGE
Definition pgpa_ast.h:86
@ PGPA_TAG_GATHER
Definition pgpa_ast.h:85
@ PGPA_TAG_NESTED_LOOP_MEMOIZE
Definition pgpa_ast.h:94
@ PGPA_TAG_SEMIJOIN_NON_UNIQUE
Definition pgpa_ast.h:98
@ PGPA_TAG_BITMAP_HEAP_SCAN
Definition pgpa_ast.h:82
@ PGPA_TAG_PARTITIONWISE
Definition pgpa_ast.h:97
@ PGPA_TAG_NO_GATHER
Definition pgpa_ast.h:96
@ PGPA_TAG_INDEX_ONLY_SCAN
Definition pgpa_ast.h:88
@ PGPA_TAG_SEQ_SCAN
Definition pgpa_ast.h:100
@ PGPA_TAG_HASH_JOIN
Definition pgpa_ast.h:87
@ PGPA_TAG_SEMIJOIN_UNIQUE
Definition pgpa_ast.h:99
@ PGPA_TAG_DO_NOT_SCAN
Definition pgpa_ast.h:83
@ PGPA_TAG_JOIN_ORDER
Definition pgpa_ast.h:90
@ PGPA_TAG_TID_SCAN
Definition pgpa_ast.h:101
@ PGPA_TAG_FOREIGN_JOIN
Definition pgpa_ast.h:84
@ PGPA_TAG_NESTED_LOOP_PLAIN
Definition pgpa_ast.h:95
@ PGPA_TAG_MERGE_JOIN_MATERIALIZE
Definition pgpa_ast.h:91
@ PGPA_TARGET_IDENTIFIER
Definition pgpa_ast.h:27
@ PGPA_TARGET_ORDERED_LIST
Definition pgpa_ast.h:28
static void pgpa_init_trove_slice(pgpa_trove_slice *tslice)
Definition pgpa_trove.c:432
static void pgpa_trove_add_to_slice(pgpa_trove_slice *tslice, pgpa_advice_tag_type tag, pgpa_advice_target *target)
Definition pgpa_trove.c:367
static int fb(int x)
pgpa_target_type ttype
Definition pgpa_ast.h:49
pgpa_trove_slice rel
Definition pgpa_trove.c:53
pgpa_trove_slice join
Definition pgpa_trove.c:52
pgpa_trove_slice scan
Definition pgpa_trove.c:54

References Assert, pgpa_advice_target::children, fb(), foreach_ptr, pgpa_trove::join, palloc0_object, palloc_object, pgpa_init_trove_slice(), PGPA_TAG_BITMAP_HEAP_SCAN, PGPA_TAG_DO_NOT_SCAN, PGPA_TAG_FOREIGN_JOIN, PGPA_TAG_GATHER, PGPA_TAG_GATHER_MERGE, PGPA_TAG_HASH_JOIN, PGPA_TAG_INDEX_ONLY_SCAN, PGPA_TAG_INDEX_SCAN, PGPA_TAG_JOIN_ORDER, PGPA_TAG_MERGE_JOIN_MATERIALIZE, PGPA_TAG_MERGE_JOIN_PLAIN, PGPA_TAG_NESTED_LOOP_MATERIALIZE, PGPA_TAG_NESTED_LOOP_MEMOIZE, PGPA_TAG_NESTED_LOOP_PLAIN, PGPA_TAG_NO_GATHER, PGPA_TAG_PARTITIONWISE, PGPA_TAG_SEMIJOIN_NON_UNIQUE, PGPA_TAG_SEMIJOIN_UNIQUE, PGPA_TAG_SEQ_SCAN, PGPA_TAG_TID_SCAN, PGPA_TARGET_IDENTIFIER, PGPA_TARGET_ORDERED_LIST, pgpa_trove_add_to_slice(), pgpa_trove::rel, pgpa_trove::scan, and pgpa_advice_target::ttype.

Referenced by pgpa_planner_setup().

◆ pgpa_cstring_trove_entry()

char * pgpa_cstring_trove_entry ( pgpa_trove_entry entry)
extern

Definition at line 296 of file pgpa_trove.c.

297{
299
302
303 /* JOIN_ORDER tags are transformed by pgpa_build_trove; undo that here */
304 if (entry->tag != PGPA_TAG_JOIN_ORDER)
306 else
308
310
311 if (entry->target->itarget != NULL)
312 {
315 }
316
317 if (entry->tag != PGPA_TAG_JOIN_ORDER)
319
320 return buf.data;
321}
static char buf[DEFAULT_XLOG_SEG_SIZE]
char * pgpa_cstring_advice_tag(pgpa_advice_tag_type advice_tag)
Definition pgpa_ast.c:29
void pgpa_format_advice_target(StringInfo str, pgpa_advice_target *target)
Definition pgpa_ast.c:170
void pgpa_format_index_target(StringInfo str, pgpa_index_target *itarget)
Definition pgpa_ast.c:206
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition stringinfo.c:145
void appendStringInfoChar(StringInfo str, char ch)
Definition stringinfo.c:242
void initStringInfo(StringInfo str)
Definition stringinfo.c:97
pgpa_index_target * itarget
Definition pgpa_ast.h:64
pgpa_advice_target * target
Definition pgpa_trove.h:59
pgpa_advice_tag_type tag
Definition pgpa_trove.h:58

References appendStringInfo(), appendStringInfoChar(), Assert, buf, fb(), initStringInfo(), pgpa_advice_target::itarget, pgpa_cstring_advice_tag(), pgpa_format_advice_target(), pgpa_format_index_target(), PGPA_TAG_JOIN_ORDER, PGPA_TARGET_ORDERED_LIST, pgpa_trove_entry::tag, pgpa_trove_entry::target, and pgpa_advice_target::ttype.

Referenced by pgpa_planner_append_feedback().

◆ pgpa_trove_append_flags()

void pgpa_trove_append_flags ( StringInfo  buf,
int  flags 
)
extern

Definition at line 344 of file pgpa_trove.c.

345{
346 if ((flags & PGPA_TE_MATCH_FULL) != 0)
347 {
348 Assert((flags & PGPA_TE_MATCH_PARTIAL) != 0);
349 appendStringInfo(buf, "matched");
350 }
351 else if ((flags & PGPA_TE_MATCH_PARTIAL) != 0)
352 appendStringInfo(buf, "partially matched");
353 else
354 appendStringInfo(buf, "not matched");
355 if ((flags & PGPA_TE_INAPPLICABLE) != 0)
356 appendStringInfo(buf, ", inapplicable");
357 if ((flags & PGPA_TE_CONFLICTING) != 0)
358 appendStringInfo(buf, ", conflicting");
359 if ((flags & PGPA_TE_FAILED) != 0)
360 appendStringInfo(buf, ", failed");
361}
#define PGPA_TE_INAPPLICABLE
Definition pgpa_trove.h:48
#define PGPA_TE_MATCH_FULL
Definition pgpa_trove.h:47
#define PGPA_TE_MATCH_PARTIAL
Definition pgpa_trove.h:46
#define PGPA_TE_CONFLICTING
Definition pgpa_trove.h:49
#define PGPA_TE_FAILED
Definition pgpa_trove.h:50

References appendStringInfo(), Assert, buf, PGPA_TE_CONFLICTING, PGPA_TE_FAILED, PGPA_TE_INAPPLICABLE, PGPA_TE_MATCH_FULL, and PGPA_TE_MATCH_PARTIAL.

Referenced by pg_plan_advice_explain_feedback(), and pgpa_planner_feedback_warning().

◆ pgpa_trove_lookup()

void pgpa_trove_lookup ( pgpa_trove trove,
pgpa_trove_lookup_type  type,
int  nrids,
pgpa_identifier rids,
pgpa_trove_result result 
)
extern

Definition at line 234 of file pgpa_trove.c.

236{
238 Bitmapset *indexes;
239
240 Assert(nrids > 0);
241
243 tslice = &trove->scan;
244 else if (type == PGPA_TROVE_LOOKUP_JOIN)
245 tslice = &trove->join;
246 else
247 tslice = &trove->rel;
248
249 indexes = pgpa_trove_slice_lookup(tslice, &rids[0]);
250 for (int i = 1; i < nrids; ++i)
251 {
253
254 /*
255 * If the caller is asking about two relations that aren't part of the
256 * same subquery, they've messed up.
257 */
258 Assert(strings_equal_or_both_null(rids[0].plan_name,
259 rids[i].plan_name));
260
262 indexes = bms_union(indexes, other_indexes);
263 }
264
265 result->entries = tslice->entries;
266 result->indexes = indexes;
267}
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:251
int i
Definition isn.c:77
static bool strings_equal_or_both_null(const char *a, const char *b)
static Bitmapset * pgpa_trove_slice_lookup(pgpa_trove_slice *tslice, pgpa_identifier *rid)
Definition pgpa_trove.c:483
pgpa_trove_entry * entries
Definition pgpa_trove.h:95
Bitmapset * indexes
Definition pgpa_trove.h:96
const char * type

References Assert, bms_union(), pgpa_trove_result::entries, fb(), i, pgpa_trove_result::indexes, pgpa_trove::join, PGPA_TROVE_LOOKUP_JOIN, PGPA_TROVE_LOOKUP_SCAN, pgpa_trove_slice_lookup(), pgpa_trove::rel, pgpa_trove::scan, strings_equal_or_both_null(), and type.

Referenced by pgpa_build_simple_rel(), and pgpa_get_join_state().

◆ pgpa_trove_lookup_all()

void pgpa_trove_lookup_all ( pgpa_trove trove,
pgpa_trove_lookup_type  type,
pgpa_trove_entry **  entries,
int nentries 
)
extern

Definition at line 276 of file pgpa_trove.c.

278{
280
282 tslice = &trove->scan;
283 else if (type == PGPA_TROVE_LOOKUP_JOIN)
284 tslice = &trove->join;
285 else
286 tslice = &trove->rel;
287
288 *entries = tslice->entries;
289 *nentries = tslice->nused;
290}

References fb(), pgpa_trove::join, PGPA_TROVE_LOOKUP_JOIN, PGPA_TROVE_LOOKUP_SCAN, pgpa_trove::rel, pgpa_trove::scan, and type.

Referenced by pgpa_planner_append_feedback().

◆ pgpa_trove_set_flags()

void pgpa_trove_set_flags ( pgpa_trove_entry entries,
Bitmapset indexes,
int  flags 
)
extern

Definition at line 327 of file pgpa_trove.c.

328{
329 int i = -1;
330
331 while ((i = bms_next_member(indexes, i)) >= 0)
332 {
333 pgpa_trove_entry *entry = &entries[i];
334
335 entry->flags |= flags;
336 }
337}
int bms_next_member(const Bitmapset *a, int prevbit)
Definition bitmapset.c:1290
Definition pgpa_trove.h:57
int flags
Definition pgpa_trove.h:60

References bms_next_member(), pgpa_trove_entry::flags, and i.

Referenced by pgpa_planner_apply_join_path_advice(), pgpa_planner_apply_joinrel_advice(), and pgpa_planner_apply_scan_advice().