diff options
Diffstat (limited to 'src/include/nodes/relation.h')
-rw-r--r-- | src/include/nodes/relation.h | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h index adb42650479..e61c1a2a295 100644 --- a/src/include/nodes/relation.h +++ b/src/include/nodes/relation.h @@ -711,15 +711,12 @@ typedef struct RelOptInfo * * It's not enough to test whether rel->part_scheme is set, because it might * be that the basic partitioning properties of the input relations matched - * but the partition bounds did not. - * - * We treat dummy relations as unpartitioned. We could alternatively - * treat them as partitioned, but it's not clear whether that's a useful thing - * to do. + * but the partition bounds did not. Also, if we are able to prove a rel + * dummy (empty), we should henceforth treat it as unpartitioned. */ #define IS_PARTITIONED_REL(rel) \ ((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \ - (rel)->part_rels && !(IS_DUMMY_REL(rel))) + (rel)->part_rels && !IS_DUMMY_REL(rel)) /* * Convenience macro to make sure that a partitioned relation has all the @@ -1312,6 +1309,9 @@ typedef struct CustomPath * elements. These cases are optimized during create_append_plan. * In particular, an AppendPath with no subpaths is a "dummy" path that * is created to represent the case that a relation is provably empty. + * (This is a convenient representation because it means that when we build + * an appendrel and find that all its children have been excluded, no extra + * action is needed to recognize the relation as dummy.) */ typedef struct AppendPath { @@ -1324,13 +1324,16 @@ typedef struct AppendPath int first_partial_path; } AppendPath; -#define IS_DUMMY_PATH(p) \ +#define IS_DUMMY_APPEND(p) \ (IsA((p), AppendPath) && ((AppendPath *) (p))->subpaths == NIL) -/* A relation that's been proven empty will have one path that is dummy */ -#define IS_DUMMY_REL(r) \ - ((r)->cheapest_total_path != NULL && \ - IS_DUMMY_PATH((r)->cheapest_total_path)) +/* + * A relation that's been proven empty will have one path that is dummy + * (but might have projection paths on top). For historical reasons, + * this is provided as a macro that wraps is_dummy_rel(). + */ +#define IS_DUMMY_REL(r) is_dummy_rel(r) +extern bool is_dummy_rel(RelOptInfo *rel); /* * MergeAppendPath represents a MergeAppend plan, ie, the merging of sorted |