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

Go to the source code of this file.

Data Structures

struct  Bitmapset
 

Macros

#define BITS_PER_BITMAPWORD   32
 
#define bmw_leftmost_one_pos(w)   pg_leftmost_one_pos32(w)
 
#define bmw_rightmost_one_pos(w)   pg_rightmost_one_pos32(w)
 
#define bmw_popcount(w)   pg_popcount32(w)
 
#define bms_is_empty(a)   ((a) == NULL)
 

Typedefs

typedef uint32 bitmapword
 
typedef int32 signedbitmapword
 
typedef struct Bitmapset Bitmapset
 

Enumerations

enum  BMS_Comparison { BMS_EQUAL , BMS_SUBSET1 , BMS_SUBSET2 , BMS_DIFFERENT }
 
enum  BMS_Membership { BMS_EMPTY_SET , BMS_SINGLETON , BMS_MULTIPLE }
 

Functions

Bitmapsetbms_copy (const Bitmapset *a)
 
bool bms_equal (const Bitmapset *a, const Bitmapset *b)
 
int bms_compare (const Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_make_singleton (int x)
 
void bms_free (Bitmapset *a)
 
Bitmapsetbms_union (const Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_intersect (const Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_difference (const Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_offset_members (const Bitmapset *a, int offset)
 
bool bms_is_subset (const Bitmapset *a, const Bitmapset *b)
 
BMS_Comparison bms_subset_compare (const Bitmapset *a, const Bitmapset *b)
 
bool bms_is_member (int x, const Bitmapset *a)
 
int bms_member_index (Bitmapset *a, int x)
 
bool bms_overlap (const Bitmapset *a, const Bitmapset *b)
 
bool bms_overlap_list (const Bitmapset *a, const struct List *b)
 
bool bms_nonempty_difference (const Bitmapset *a, const Bitmapset *b)
 
int bms_singleton_member (const Bitmapset *a)
 
bool bms_get_singleton_member (const Bitmapset *a, int *member)
 
int bms_num_members (const Bitmapset *a)
 
BMS_Membership bms_membership (const Bitmapset *a)
 
Bitmapsetbms_add_member (Bitmapset *a, int x)
 
Bitmapsetbms_del_member (Bitmapset *a, int x)
 
Bitmapsetbms_add_members (Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_replace_members (Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_add_range (Bitmapset *a, int lower, int upper)
 
Bitmapsetbms_int_members (Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_del_members (Bitmapset *a, const Bitmapset *b)
 
Bitmapsetbms_join (Bitmapset *a, Bitmapset *b)
 
int bms_next_member (const Bitmapset *a, int prevbit)
 
int bms_prev_member (const Bitmapset *a, int prevbit)
 
uint32 bms_hash_value (const Bitmapset *a)
 
uint32 bitmap_hash (const void *key, Size keysize)
 
int bitmap_match (const void *key1, const void *key2, Size keysize)
 

Macro Definition Documentation

◆ BITS_PER_BITMAPWORD

#define BITS_PER_BITMAPWORD   32

Definition at line 43 of file bitmapset.h.

◆ bms_is_empty

#define bms_is_empty (   a)    ((a) == NULL)

Definition at line 119 of file bitmapset.h.

◆ bmw_leftmost_one_pos

#define bmw_leftmost_one_pos (   w)    pg_leftmost_one_pos32(w)

Definition at line 78 of file bitmapset.h.

◆ bmw_popcount

#define bmw_popcount (   w)    pg_popcount32(w)

Definition at line 80 of file bitmapset.h.

◆ bmw_rightmost_one_pos

#define bmw_rightmost_one_pos (   w)    pg_rightmost_one_pos32(w)

Definition at line 79 of file bitmapset.h.

Typedef Documentation

◆ Bitmapset

◆ bitmapword

Definition at line 44 of file bitmapset.h.

◆ signedbitmapword

Definition at line 45 of file bitmapset.h.

Enumeration Type Documentation

◆ BMS_Comparison

Enumerator
BMS_EQUAL 
BMS_SUBSET1 
BMS_SUBSET2 
BMS_DIFFERENT 

Definition at line 60 of file bitmapset.h.

61{
62 BMS_EQUAL, /* sets are equal */
63 BMS_SUBSET1, /* first set is a subset of the second */
64 BMS_SUBSET2, /* second set is a subset of the first */
65 BMS_DIFFERENT, /* neither set is a subset of the other */
BMS_Comparison
Definition bitmapset.h:61
@ BMS_DIFFERENT
Definition bitmapset.h:65
@ BMS_SUBSET1
Definition bitmapset.h:63
@ BMS_EQUAL
Definition bitmapset.h:62
@ BMS_SUBSET2
Definition bitmapset.h:64

◆ BMS_Membership

Enumerator
BMS_EMPTY_SET 
BMS_SINGLETON 
BMS_MULTIPLE 

Definition at line 69 of file bitmapset.h.

70{
71 BMS_EMPTY_SET, /* 0 members */
72 BMS_SINGLETON, /* 1 member */
73 BMS_MULTIPLE, /* >1 member */
BMS_Membership
Definition bitmapset.h:70
@ BMS_SINGLETON
Definition bitmapset.h:72
@ BMS_EMPTY_SET
Definition bitmapset.h:71
@ BMS_MULTIPLE
Definition bitmapset.h:73

Function Documentation

◆ bitmap_hash()

uint32 bitmap_hash ( const void key,
Size  keysize 
)
extern

Definition at line 1559 of file bitmapset.c.

1560{
1561 Assert(keysize == sizeof(Bitmapset *));
1562 return bms_hash_value(*((const Bitmapset *const *) key));
1563}
uint32 bms_hash_value(const Bitmapset *a)
Definition bitmapset.c:1543
#define Assert(condition)
Definition c.h:1002

References Assert, and bms_hash_value().

Referenced by build_join_rel_hash(), and test_bitmap_hash().

◆ bitmap_match()

int bitmap_match ( const void key1,
const void key2,
Size  keysize 
)
extern

Definition at line 1569 of file bitmapset.c.

1570{
1571 Assert(keysize == sizeof(Bitmapset *));
1572 return !bms_equal(*((const Bitmapset *const *) key1),
1573 *((const Bitmapset *const *) key2));
1574}
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:143
static int fb(int x)

References Assert, bms_equal(), and fb().

Referenced by build_join_rel_hash(), and test_bitmap_match().

◆ bms_add_member()

Bitmapset * bms_add_member ( Bitmapset a,
int  x 
)
extern

Definition at line 934 of file bitmapset.c.

935{
936 int wordnum,
937 bitnum;
938
940
941 if (x < 0)
942 elog(ERROR, "negative bitmapset member not allowed");
943 if (a == NULL)
944 return bms_make_singleton(x);
945
946 wordnum = WORDNUM(x);
947 bitnum = BITNUM(x);
948
949 /* enlarge the set if necessary */
950 if (wordnum >= a->nwords)
951 {
952 int oldnwords = a->nwords;
953 int i;
954
956 a->nwords = wordnum + 1;
957 /* zero out the enlarged portion */
958 i = oldnwords;
959 do
960 {
961 a->words[i] = 0;
962 } while (++i < a->nwords);
963 }
964
965 a->words[wordnum] |= ((bitmapword) 1 << bitnum);
966
967#ifdef REALLOCATE_BITMAPSETS
968
969 /*
970 * There's no guarantee that the repalloc returned a new pointer, so copy
971 * and free unconditionally here.
972 */
974#endif
975
976 return a;
977}
#define BITMAPSET_SIZE(nwords)
Definition bitmapset.c:51
Bitmapset * bms_make_singleton(int x)
Definition bitmapset.c:217
#define WORDNUM(x)
Definition bitmapset.c:48
#define BITNUM(x)
Definition bitmapset.c:49
uint32 bitmapword
Definition bitmapset.h:44
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
int x
Definition isn.c:75
int a
Definition isn.c:73
int i
Definition isn.c:77
void * repalloc(void *pointer, Size size)
Definition mcxt.c:1635

References a, Assert, BITMAPSET_SIZE, BITNUM, bms_make_singleton(), elog, ERROR, fb(), i, repalloc(), WORDNUM, and x.

Referenced by _readBitmapset(), add_child_eq_member(), add_outer_joins_to_relids(), add_row_identity_var(), add_rte_to_flat_rtable(), adjust_child_relids(), adjust_group_pathkeys_for_groupagg(), adjust_relid_set(), adjust_view_column_set(), alias_relid_set(), all_rows_selectable(), apply_handle_update(), build_joinrel_tlist(), build_subplan(), buildGroupedVar(), check_functional_grouping(), check_index_only(), checkInsertTargets(), classify_index_clause_usage(), clauselist_apply_dependencies(), convert_EXISTS_sublink_to_join(), create_lateral_join_info(), create_list_bounds(), CreatePartitionPruneState(), DecodeTextArrayToBitmapset(), deconstruct_distribute_oj_quals(), deconstruct_recurse(), deparseColumnRef(), dependencies_clauselist_selectivity(), DiscreteKnapsack(), DoCopy(), dropconstraint_internal(), estimate_multivariate_ndistinct(), EvalPlanQualBegin(), ExecAsyncAppendResponse(), ExecBuildUpdateProjection(), ExecCheckPermissions(), ExecInitAgg(), ExecInitAppend(), ExecInitGenerated(), ExecInitModifyTable(), ExecNestLoop(), ExecRecursiveUnion(), ExecReScanGather(), ExecReScanGatherMerge(), ExecReScanRecursiveUnion(), ExecReScanSetParamPlan(), ExecScanSubPlan(), execute_attr_map_cols(), expand_single_inheritance_child(), ExplainPreScanNode(), ExplainSubPlans(), extract_rollup_sets(), extractRemainingColumns(), fetch_remote_table_info(), fetch_statentries_for_relation(), finalize_plan(), finalize_primnode(), find_childrel_parents(), find_cols(), find_cols_walker(), find_hash_columns(), find_having_conflicts(), find_matching_subplans_recurse(), find_window_run_conditions(), findDefaultOnlyColumns(), fixup_inherited_columns(), fixup_whole_row_references(), func_get_detail(), gen_partprune_steps_internal(), generate_base_implied_equalities(), generate_query_for_graph_path(), get_baserel_parampathinfo(), get_dependent_generated_columns(), get_eclass_for_sort_expr(), get_matching_partitions(), get_nullingrels_recurse(), get_param_path_clause_serials(), get_primary_key_attnos(), get_relation_constraint_attnos(), get_relation_notnullatts(), get_relation_statistics(), get_relids_in_jointree(), HeapDetermineColumnsInfo(), infer_arbiter_indexes(), InitExecPartitionPruneContexts(), initialize_change_context(), is_var_needed_by_join(), join_is_removable(), load_enum_cache_data(), logicalrep_read_attrs(), logicalrep_rel_open(), make_datum_param(), make_modifytable(), make_outerjoininfo(), make_partition_pruneinfo(), make_partitionedrel_pruneinfo(), make_row_comparison_op(), make_window_input_target(), makeDependencyGraphWalker(), mark_rels_nulled_by_join(), mark_stmt(), markRelsAsNulledBy(), markRTEForSelectPriv(), mbms_add_member(), mbms_overlap_sets(), MergeAttributes(), nodeRead(), pgpa_filter_out_join_relids(), pgpa_plan_walker(), pgpa_planner_apply_join_path_advice(), pgpa_planner_apply_joinrel_advice(), pgpa_planner_apply_scan_advice(), pgpa_qf_add_rti(), pgpa_trove_add_to_hash(), pgpa_trove_slice_lookup(), pgpa_walker_join_order_matches_member(), pgpa_walker_would_advise(), plpgsql_mark_local_assignment_targets(), preprocess_grouping_sets(), pub_collist_to_bitmapset(), pub_collist_validate(), pub_form_cols_map(), pull_exec_paramids_walker(), pull_paramids_walker(), pull_up_sublinks_jointree_recurse(), pull_varattnos_walker(), pull_varnos_walker(), rebuild_joinclause_attr_needed(), reduce_outer_joins_pass2(), register_partpruneinfo(), RelationGetIdentityKeyBitmap(), RelationGetIndexAttrBitmap(), remove_leftjoinrel_from_query(), remove_rel_from_phvs(), remove_rel_from_query(), remove_self_join_rel(), remove_self_joins_one_group(), remove_self_joins_recurse(), remove_useless_groupby_columns(), remove_useless_results_recurse(), rewriteTargetListIU(), rewriteTargetView(), RI_Initial_Check(), set_join_column_names(), set_param_references(), SS_identify_outer_params(), standard_planner(), stat_covers_expressions(), statext_is_compatible_clause_internal(), statext_mcv_clauselist_selectivity(), test_bms_add_member(), test_random_offset_operations(), test_random_operations(), transformForPortionOfClause(), transformGroupClause(), transformGroupClauseList(), transformInsertStmt(), transformMergeStmt(), transformRangeTableFunc(), transformUpdateTargetList(), translate_col_privs(), try_partitionwise_join(), use_physical_tlist(), validate_va_cols_list(), and view_cols_are_auto_updatable().

◆ bms_add_members()

Bitmapset * bms_add_members ( Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 1036 of file bitmapset.c.

1037{
1039 const Bitmapset *other;
1040 int otherlen;
1041 int i;
1042
1045
1046 /* Handle cases where either input is NULL */
1047 if (a == NULL)
1048 return bms_copy(b);
1049 if (b == NULL)
1050 {
1051#ifdef REALLOCATE_BITMAPSETS
1053#endif
1054
1055 return a;
1056 }
1057 /* Identify shorter and longer input; copy the longer one if needed */
1058 if (a->nwords < b->nwords)
1059 {
1060 result = bms_copy(b);
1061 other = a;
1062 }
1063 else
1064 {
1065 result = a;
1066 other = b;
1067 }
1068 /* And union the shorter input into the result */
1069 otherlen = other->nwords;
1070 i = 0;
1071 do
1072 {
1073 result->words[i] |= other->words[i];
1074 } while (++i < otherlen);
1075 if (result != a)
1076 pfree(a);
1077#ifdef REALLOCATE_BITMAPSETS
1078 else
1080#endif
1081
1082 return result;
1083}
Bitmapset * bms_copy(const Bitmapset *a)
Definition bitmapset.c:123
uint32 result
int b
Definition isn.c:74
void pfree(void *pointer)
Definition mcxt.c:1619

References a, Assert, b, bms_copy(), fb(), i, pfree(), and result.

Referenced by add_child_join_rel_equivalences(), add_child_rel_equivalences(), add_eq_member(), add_outer_joins_to_relids(), add_part_relids(), add_paths_to_joinrel(), add_placeholders_to_joinrel(), add_vars_to_attr_needed(), add_vars_to_targetlist(), adjust_appendrel_attrs_mutator(), adjust_standard_join_alias_expression(), build_index_paths(), choose_best_statistics(), choose_bitmap_and(), create_agg_clause_infos(), create_bitmap_and_path(), create_bitmap_or_path(), create_join_clause(), create_lateral_join_info(), CreatePartitionPruneState(), deconstruct_distribute(), deconstruct_recurse(), ExecDoInitialPruning(), ExecFindMatchingSubPlans(), ExecInitAgg(), expand_partitioned_rtentry(), ExplainPreScanNode(), finalize_plan(), find_nonnullable_rels_walker(), foreign_join_ok(), generate_union_paths(), get_eclass_indexes_for_relids(), get_param_path_clause_serials(), get_placeholder_nulling_relids(), heap_update(), join_is_legal(), make_outerjoininfo(), mbms_add_members(), perform_pruning_combine_step(), pgpa_build_scan(), pgpa_classify_alternative_subplans(), pgpa_process_unrolled_join(), pgpa_qf_add_rtis(), pull_varnos_walker(), pullup_replace_vars_callback(), reduce_outer_joins_pass1(), reduce_outer_joins_pass2(), remove_leftjoinrel_from_query(), remove_self_join_rel(), remove_self_joins_recurse(), test_bms_add_members(), transformOnConflictArbiter(), and try_partitionwise_join().

◆ bms_add_range()

Bitmapset * bms_add_range ( Bitmapset a,
int  lower,
int  upper 
)
extern

Definition at line 1138 of file bitmapset.c.

1139{
1140 int lwordnum,
1141 lbitnum,
1142 uwordnum,
1143 ushiftbits,
1144 wordnum;
1145
1147
1148 /* do nothing if nothing is called for, without further checking */
1149 if (upper < lower)
1150 {
1151#ifdef REALLOCATE_BITMAPSETS
1153#endif
1154
1155 return a;
1156 }
1157
1158 if (lower < 0)
1159 elog(ERROR, "negative bitmapset member not allowed");
1161
1162 if (a == NULL)
1163 {
1165 a->type = T_Bitmapset;
1166 a->nwords = uwordnum + 1;
1167 }
1168 else if (uwordnum >= a->nwords)
1169 {
1170 int oldnwords = a->nwords;
1171 int i;
1172
1173 /* ensure we have enough words to store the upper bit */
1175 a->nwords = uwordnum + 1;
1176 /* zero out the enlarged portion */
1177 i = oldnwords;
1178 do
1179 {
1180 a->words[i] = 0;
1181 } while (++i < a->nwords);
1182 }
1183
1185
1186 lbitnum = BITNUM(lower);
1188
1189 /*
1190 * Special case when lwordnum is the same as uwordnum we must perform the
1191 * upper and lower masking on the word.
1192 */
1193 if (lwordnum == uwordnum)
1194 {
1195 a->words[lwordnum] |= ~(bitmapword) (((bitmapword) 1 << lbitnum) - 1)
1196 & (~(bitmapword) 0) >> ushiftbits;
1197 }
1198 else
1199 {
1200 /* turn on lbitnum and all bits left of it */
1201 a->words[wordnum++] |= ~(bitmapword) (((bitmapword) 1 << lbitnum) - 1);
1202
1203 /* turn on all bits for any intermediate words */
1204 while (wordnum < uwordnum)
1205 a->words[wordnum++] = ~(bitmapword) 0;
1206
1207 /* turn on upper's bit and all bits right of it. */
1208 a->words[uwordnum] |= (~(bitmapword) 0) >> ushiftbits;
1209 }
1210
1211#ifdef REALLOCATE_BITMAPSETS
1212
1213 /*
1214 * There's no guarantee that the repalloc returned a new pointer, so copy
1215 * and free unconditionally here.
1216 */
1218#endif
1219
1220 return a;
1221}
#define BITS_PER_BITMAPWORD
Definition bitmapset.h:43
void * palloc0(Size size)
Definition mcxt.c:1420
Datum lower(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)

References a, Assert, BITMAPSET_SIZE, BITNUM, BITS_PER_BITMAPWORD, elog, ERROR, fb(), i, lower(), palloc0(), repalloc(), upper(), and WORDNUM.

Referenced by add_setop_child_rel_equivalences(), ComputePartitionAttrs(), DoCopy(), ExecInitAppend(), ExecInitMergeAppend(), ExecInitPartitionExecPruning(), get_matching_hash_bounds(), get_matching_list_bounds(), get_matching_partitions(), get_matching_range_bounds(), logicalrep_rel_open(), make_partition_pruneinfo(), perform_pruning_combine_step(), prune_append_rel_partitions(), test_bms_add_range(), and test_random_operations().

◆ bms_compare()

int bms_compare ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 184 of file bitmapset.c.

185{
186 int i;
187
190
191 /* Handle cases where either input is NULL */
192 if (a == NULL)
193 return (b == NULL) ? 0 : -1;
194 else if (b == NULL)
195 return +1;
196
197 /* the set with the most words must be greater */
198 if (a->nwords != b->nwords)
199 return (a->nwords > b->nwords) ? +1 : -1;
200
201 i = a->nwords - 1;
202 do
203 {
204 bitmapword aw = a->words[i];
205 bitmapword bw = b->words[i];
206
207 if (aw != bw)
208 return (aw > bw) ? +1 : -1;
209 } while (--i >= 0);
210 return 0;
211}

References a, Assert, b, fb(), and i.

Referenced by append_startup_cost_compare(), append_total_cost_compare(), and test_bms_compare().

◆ bms_copy()

Bitmapset * bms_copy ( const Bitmapset a)
extern

Definition at line 123 of file bitmapset.c.

124{
126 size_t size;
127
129
130 if (a == NULL)
131 return NULL;
132
133 size = BITMAPSET_SIZE(a->nwords);
134 result = (Bitmapset *) palloc(size);
135 memcpy(result, a, size);
136 return result;
137}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
void * palloc(Size size)
Definition mcxt.c:1390

References a, Assert, BITMAPSET_SIZE, fb(), memcpy(), palloc(), and result.

Referenced by _copyBitmapset(), add_nullingrels_if_needed(), add_outer_joins_to_relids(), adjust_child_relids(), adjust_relid_set(), afterTriggerCopyBitmap(), bms_add_members(), bms_difference(), bms_intersect(), bms_replace_members(), bms_union(), build_child_join_rel(), build_index_paths(), build_join_rel(), build_simple_grouped_rel(), calc_nestloop_required_outer(), choose_bitmap_and(), create_lateral_join_info(), CreatePartitionPruneState(), deconstruct_distribute_oj_quals(), deconstruct_recurse(), DiscreteKnapsack(), distribute_qual_to_rels(), ExecFindMatchingSubPlans(), fetch_upper_rel(), finalize_plan(), finalize_primnode(), find_hash_columns(), find_placeholder_info(), fixup_whole_row_references(), get_join_domain_min_rels(), get_nullingrels_recurse(), get_param_path_clause_serials(), get_relation_statistics_worker(), InitPlan(), innerrel_is_unique_ext(), is_var_needed_by_join(), join_is_legal(), join_is_removable(), load_enum_cache_data(), logicalrep_partition_open(), logicalrep_relmap_update(), make_grouped_join_rel(), make_outerjoininfo(), make_partition_pruneinfo(), mark_nullable_by_grouping(), mark_stmt(), partition_bounds_copy(), perform_pruning_combine_step(), pgpa_process_unrolled_join(), reconsider_full_join_clause(), reconsider_outer_join_clause(), RelationGetIdentityKeyBitmap(), RelationGetIndexAttrBitmap(), remove_rel_from_eclass(), remove_rel_from_query(), remove_rel_from_restrictinfo(), reparameterize_path_by_child(), and test_bms_copy().

◆ bms_del_member()

Bitmapset * bms_del_member ( Bitmapset a,
int  x 
)
extern

Definition at line 987 of file bitmapset.c.

988{
989 int wordnum,
990 bitnum;
991
993
994 if (x < 0)
995 elog(ERROR, "negative bitmapset member not allowed");
996 if (a == NULL)
997 return NULL;
998
999 wordnum = WORDNUM(x);
1000 bitnum = BITNUM(x);
1001
1002#ifdef REALLOCATE_BITMAPSETS
1004#endif
1005
1006 /* member can't exist. Return 'a' unmodified */
1007 if (unlikely(wordnum >= a->nwords))
1008 return a;
1009
1010 a->words[wordnum] &= ~((bitmapword) 1 << bitnum);
1011
1012 /* when last word becomes empty, trim off all trailing empty words */
1013 if (a->words[wordnum] == 0 && wordnum == a->nwords - 1)
1014 {
1015 /* find the last non-empty word and make that the new final word */
1016 for (int i = wordnum - 1; i >= 0; i--)
1017 {
1018 if (a->words[i] != 0)
1019 {
1020 a->nwords = i + 1;
1021 return a;
1022 }
1023 }
1024
1025 /* the set is now empty */
1026 pfree(a);
1027 return NULL;
1028 }
1029 return a;
1030}
#define unlikely(x)
Definition c.h:497

References a, Assert, BITNUM, elog, ERROR, fb(), i, pfree(), unlikely, WORDNUM, and x.

Referenced by add_nullingrels_if_needed(), adjust_child_relids(), adjust_group_pathkeys_for_groupagg(), adjust_relid_set(), build_index_paths(), BuildParameterizedTidPaths(), ComputePartitionAttrs(), deconstruct_distribute_oj_quals(), dependencies_clauselist_selectivity(), DiscreteKnapsack(), DoCopy(), expand_partitioned_rtentry(), finalize_plan(), finalize_primnode(), find_hash_columns(), findDefaultOnlyColumns(), fixup_whole_row_references(), get_join_domain_min_rels(), get_matching_list_bounds(), logicalrep_rel_open(), make_outerjoininfo(), postgresGetForeignPaths(), preprocess_rowmarks(), remove_rel_from_eclass(), remove_rel_from_query(), remove_rel_from_restrictinfo(), remove_self_joins_recurse(), substitute_phv_relids_walker(), test_bms_del_member(), test_random_operations(), and TopologicalSort().

◆ bms_del_members()

Bitmapset * bms_del_members ( Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 1280 of file bitmapset.c.

1281{
1282 int i;
1283
1286
1287 /* Handle cases where either input is NULL */
1288 if (a == NULL)
1289 return NULL;
1290 if (b == NULL)
1291 {
1292#ifdef REALLOCATE_BITMAPSETS
1294#endif
1295
1296 return a;
1297 }
1298
1299 /* Remove b's bits from a; we need never copy */
1300 if (a->nwords > b->nwords)
1301 {
1302 /*
1303 * We'll never need to remove trailing zero words when 'a' has more
1304 * words than 'b'.
1305 */
1306 i = 0;
1307 do
1308 {
1309 a->words[i] &= ~b->words[i];
1310 } while (++i < b->nwords);
1311 }
1312 else
1313 {
1314 int lastnonzero = -1;
1315
1316 /* we may need to remove trailing zero words from the result. */
1317 i = 0;
1318 do
1319 {
1320 a->words[i] &= ~b->words[i];
1321
1322 /* remember the last non-zero word */
1323 if (a->words[i] != 0)
1324 lastnonzero = i;
1325 } while (++i < a->nwords);
1326
1327 /* check if 'a' has become empty */
1328 if (lastnonzero == -1)
1329 {
1330 pfree(a);
1331 return NULL;
1332 }
1333
1334 /* trim off any trailing zero words */
1335 a->nwords = lastnonzero + 1;
1336 }
1337
1338#ifdef REALLOCATE_BITMAPSETS
1340#endif
1341
1342 return a;
1343}

References a, Assert, b, fb(), i, and pfree().

Referenced by adjust_group_pathkeys_for_groupagg(), build_join_rel(), calc_nestloop_required_outer(), check_index_predicates(), classify_matching_subplans(), finalize_plan(), get_join_domain_min_rels(), get_placeholder_nulling_relids(), make_outerjoininfo(), make_partition_pruneinfo(), min_join_parameterization(), NumRelids(), pullup_replace_vars_callback(), remove_self_joins_recurse(), and test_bms_del_members().

◆ bms_difference()

Bitmapset * bms_difference ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 347 of file bitmapset.c.

348{
350 int i;
351
354
355 /* Handle cases where either input is NULL */
356 if (a == NULL)
357 return NULL;
358 if (b == NULL)
359 return bms_copy(a);
360
361 /*
362 * In Postgres' usage, an empty result is a very common case, so it's
363 * worth optimizing for that by testing bms_nonempty_difference(). This
364 * saves us a palloc/pfree cycle compared to checking after-the-fact.
365 */
367 return NULL;
368
369 /* Copy the left input */
370 result = bms_copy(a);
371
372 /* And remove b's bits from result */
373 if (result->nwords > b->nwords)
374 {
375 /*
376 * We'll never need to remove trailing zero words when 'a' has more
377 * words than 'b' as the additional words must be non-zero.
378 */
379 i = 0;
380 do
381 {
382 result->words[i] &= ~b->words[i];
383 } while (++i < b->nwords);
384 }
385 else
386 {
387 int lastnonzero = -1;
388
389 /* we may need to remove trailing zero words from the result. */
390 i = 0;
391 do
392 {
393 result->words[i] &= ~b->words[i];
394
395 /* remember the last non-zero word */
396 if (result->words[i] != 0)
397 lastnonzero = i;
398 } while (++i < result->nwords);
399
400 /* trim off trailing zero words */
401 result->nwords = lastnonzero + 1;
402 }
403 Assert(result->nwords != 0);
404
405 /* Need not check for empty result, since we handled that case above */
406 return result;
407}
bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:769

References a, Assert, b, bms_copy(), bms_nonempty_difference(), fb(), i, and result.

Referenced by add_child_join_rel_equivalences(), add_child_rel_equivalences(), add_paths_to_joinrel(), check_index_predicates(), consider_new_or_clause(), create_foreignscan_plan(), create_hashjoin_plan(), create_mergejoin_plan(), create_nestloop_plan(), examine_variable(), finalize_plan(), find_placeholder_info(), make_plain_restrictinfo(), pull_varnos_walker(), remove_nulling_relids_mutator(), remove_rel_from_phvs_mutator(), remove_rel_from_query(), remove_useless_groupby_columns(), standard_planner(), and test_bms_difference().

◆ bms_equal()

bool bms_equal ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 143 of file bitmapset.c.

144{
145 int i;
146
149
150 /* Handle cases where either input is NULL */
151 if (a == NULL)
152 {
153 if (b == NULL)
154 return true;
155 return false;
156 }
157 else if (b == NULL)
158 return false;
159
160 /* can't be equal if the word counts don't match */
161 if (a->nwords != b->nwords)
162 return false;
163
164 /* check each word matches */
165 i = 0;
166 do
167 {
168 if (a->words[i] != b->words[i])
169 return false;
170 } while (++i < a->nwords);
171
172 return true;
173}

References a, Assert, b, fb(), and i.

Referenced by _equalBitmapset(), add_non_redundant_clauses(), add_path_precheck(), add_paths_to_append_rel(), afterTriggerAddEvent(), AlterPublicationTables(), assign_param_for_var(), bitmap_match(), choose_bitmap_and(), create_append_path(), create_merge_append_path(), create_unique_paths(), deconstruct_distribute_oj_quals(), deconstruct_jointree(), ExecInitPartitionExecPruning(), extract_lateral_vars_from_PHVs(), extract_rollup_sets(), fetch_upper_rel(), find_dependent_phvs_walker(), find_join_rel(), find_param_path_info(), generate_grouped_paths(), generate_implied_equalities_for_column(), generate_partitionwise_join_paths(), get_cheapest_parameterized_child_path(), get_eclass_for_sort_expr(), get_join_domain_min_rels(), has_join_restriction(), infer_arbiter_indexes(), innerrel_is_unique_ext(), is_safe_restriction_clause_for(), join_is_legal(), make_grouped_join_rel(), make_one_rel(), make_partitionedrel_pruneinfo(), mark_nullable_by_grouping(), match_pathkeys_to_index(), merge_clump(), pgoutput_column_list_init(), pgpa_walker_contains_feature(), pgpa_walker_contains_join(), pgpa_walker_find_scan(), pgpa_walker_join_order_matches_member(), populate_joinrel_with_paths(), pull_varnos_walker(), search_indexed_tlist_for_phv(), search_indexed_tlist_for_var(), set_rel_pathlist(), standard_join_search(), test_bms_equal(), test_random_offset_operations(), and try_partitionwise_join().

◆ bms_free()

◆ bms_get_singleton_member()

bool bms_get_singleton_member ( const Bitmapset a,
int member 
)
extern

Definition at line 843 of file bitmapset.c.

844{
845 int result = -1;
846 int nwords;
847 int wordnum;
848
850
851 if (a == NULL)
852 return false;
853
854 nwords = a->nwords;
855 wordnum = 0;
856 do
857 {
858 bitmapword w = a->words[wordnum];
859
860 if (w != 0)
861 {
862 if (result >= 0 || HAS_MULTIPLE_ONES(w))
863 return false;
866 }
867 } while (++wordnum < nwords);
868
869 /* we don't expect non-NULL sets to be empty */
870 Assert(result >= 0);
871 *member = result;
872 return true;
873}
#define HAS_MULTIPLE_ONES(x)
Definition bitmapset.c:73
#define bmw_rightmost_one_pos(w)
Definition bitmapset.h:79

References a, Assert, BITS_PER_BITMAPWORD, bmw_rightmost_one_pos, fb(), HAS_MULTIPLE_ONES, and result.

Referenced by add_placeholders_to_base_rels(), create_lateral_join_info(), distribute_restrictinfo_to_rels(), estimate_multivariate_bucketsize(), examine_variable(), find_join_input_rel(), find_single_rel_for_clauses(), generate_base_implied_equalities_no_const(), get_common_eclass_indexes(), join_is_removable(), reduce_unique_semijoins(), replace_relid_callback(), set_base_rel_consider_startup(), statext_is_compatible_clause(), and test_bms_get_singleton_member().

◆ bms_hash_value()

uint32 bms_hash_value ( const Bitmapset a)
extern

Definition at line 1543 of file bitmapset.c.

1544{
1546
1547 if (a == NULL)
1548 return 0; /* All empty sets hash to 0 */
1549 return DatumGetUInt32(hash_any((const unsigned char *) a->words,
1550 a->nwords * sizeof(bitmapword)));
1551}
static Datum hash_any(const unsigned char *k, int keylen)
Definition hashfn.h:31
static uint32 DatumGetUInt32(Datum X)
Definition postgres.h:222

References a, Assert, DatumGetUInt32(), fb(), and hash_any().

Referenced by bitmap_hash(), and test_bms_hash_value().

◆ bms_int_members()

Bitmapset * bms_int_members ( Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 1228 of file bitmapset.c.

1229{
1230 int lastnonzero;
1231 int shortlen;
1232 int i;
1233
1236
1237 /* Handle cases where either input is NULL */
1238 if (a == NULL)
1239 return NULL;
1240 if (b == NULL)
1241 {
1242 pfree(a);
1243 return NULL;
1244 }
1245
1246 /* Intersect b into a; we need never copy */
1247 shortlen = Min(a->nwords, b->nwords);
1248 lastnonzero = -1;
1249 i = 0;
1250 do
1251 {
1252 a->words[i] &= b->words[i];
1253
1254 if (a->words[i] != 0)
1255 lastnonzero = i;
1256 } while (++i < shortlen);
1257
1258 /* If we computed an empty result, we must return NULL */
1259 if (lastnonzero == -1)
1260 {
1261 pfree(a);
1262 return NULL;
1263 }
1264
1265 /* get rid of trailing zero words */
1266 a->nwords = lastnonzero + 1;
1267
1268#ifdef REALLOCATE_BITMAPSETS
1270#endif
1271
1272 return a;
1273}
#define Min(x, y)
Definition c.h:1131

References a, Assert, b, fb(), i, Min, and pfree().

Referenced by find_nonnullable_rels_walker(), find_placeholder_info(), get_common_eclass_indexes(), get_param_path_clause_serials(), make_outerjoininfo(), make_row_comparison_op(), mbms_int_members(), perform_pruning_combine_step(), relation_is_updatable(), and test_bms_int_members().

◆ bms_intersect()

Bitmapset * bms_intersect ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 293 of file bitmapset.c.

294{
296 const Bitmapset *other;
297 int lastnonzero;
298 int resultlen;
299 int i;
300
303
304 /* Handle cases where either input is NULL */
305 if (a == NULL || b == NULL)
306 return NULL;
307
308 /* Identify shorter and longer input; copy the shorter one */
309 if (a->nwords <= b->nwords)
310 {
311 result = bms_copy(a);
312 other = b;
313 }
314 else
315 {
316 result = bms_copy(b);
317 other = a;
318 }
319 /* And intersect the longer input with the result */
320 resultlen = result->nwords;
321 lastnonzero = -1;
322 i = 0;
323 do
324 {
325 result->words[i] &= other->words[i];
326
327 if (result->words[i] != 0)
328 lastnonzero = i;
329 } while (++i < resultlen);
330 /* If we computed an empty result, we must return NULL */
331 if (lastnonzero == -1)
332 {
333 pfree(result);
334 return NULL;
335 }
336
337 /* get rid of trailing zero words */
338 result->nwords = lastnonzero + 1;
339 return result;
340}

References a, Assert, b, bms_copy(), fb(), i, pfree(), and result.

Referenced by build_joinrel_tlist(), classify_matching_subplans(), create_lateral_join_info(), distribute_qual_to_rels(), find_dependent_phvs_walker(), find_em_for_rel(), get_matching_part_pairs(), identify_current_nestloop_params(), make_outerjoininfo(), match_eclasses_to_foreign_key_col(), pullup_replace_vars_callback(), rebuild_joinclause_attr_needed(), set_param_references(), test_bms_intersect(), test_random_operations(), and UpdateChangedParamSet().

◆ bms_is_member()

bool bms_is_member ( int  x,
const Bitmapset a 
)
extern

Definition at line 645 of file bitmapset.c.

646{
647 int wordnum,
648 bitnum;
649
651
652 /* XXX better to just return false for x<0 ? */
653 if (x < 0)
654 elog(ERROR, "negative bitmapset member not allowed");
655 if (a == NULL)
656 return false;
657
658 wordnum = WORDNUM(x);
659 bitnum = BITNUM(x);
660 if (wordnum >= a->nwords)
661 return false;
662 if ((a->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0)
663 return true;
664 return false;
665}

References a, Assert, BITNUM, elog, ERROR, fb(), WORDNUM, and x.

Referenced by add_non_redundant_clauses(), add_nulling_relids_mutator(), add_outer_joins_to_relids(), add_row_identity_var(), adjust_appendrel_attrs_mutator(), adjust_child_relids(), adjust_relid_set(), adjust_rowcount_for_semijoins(), bms_member_index(), build_joinrel_tlist(), check_index_predicates(), check_redundant_nullability_qual(), check_relation_privileges(), checkInsertTargets(), clause_selectivity_ext(), clauselist_selectivity_ext(), clauselist_selectivity_or(), ComputePartitionAttrs(), consider_groupingsets_paths(), contain_invalid_rfcolumn_walker(), contain_placeholder_references_walker(), cost_incremental_sort(), create_foreignscan_plan(), create_lateral_join_info(), create_nestloop_path(), createTableConstraints(), deconstruct_distribute_oj_quals(), DefineIndex(), deparseFromExprForRel(), deparseLockingClause(), deparseRangeTblRef(), deparseTargetList(), deparseVar(), dependencies_clauselist_selectivity(), dependency_is_fully_matched(), DoCopy(), dropconstraint_internal(), enum_known_sorted(), estimate_multivariate_ndistinct(), examine_variable(), ExecBuildSlotValueDescription(), ExecBuildUpdateProjection(), ExecCheckPermissions(), ExecEvalGroupingFunc(), ExecGetRangeTableRelation(), ExecInitLockRows(), ExecInitModifyTable(), ExecRelationIsTargetRelation(), ExecScanFetch(), execute_attr_map_cols(), expand_indexqual_rowcompare(), expand_single_inheritance_child(), ExplainSubPlans(), extract_lateral_vars_from_PHVs(), extractRemainingColumns(), ExtractReplicaIdentity(), fetch_remote_table_info(), filter_event_trigger(), find_hash_columns(), find_modifytable_subplan(), fixup_whole_row_references(), foreign_expr_walker(), func_get_detail(), gen_partprune_steps_internal(), gen_prune_steps_from_opexps(), generate_base_implied_equalities(), get_eclass_for_sort_expr(), get_eclass_indexes_for_relids(), get_expression_sortgroupref(), get_foreign_key_join_selectivity(), get_join_domain_min_rels(), get_matching_hash_bounds(), get_memoize_path(), get_placeholder_nulling_relids(), get_translated_update_targetlist(), get_variable(), get_xmltable(), group_similar_or_args(), has_notnull_forced_var(), has_partition_attrs(), hashagg_spill_tuple(), HeapDetermineColumnsInfo(), identify_current_nestloop_params(), index_expression_changed_walker(), index_unchanged_by_update(), InitPartitionPruneContext(), InitPlan(), is_foreign_param(), is_pseudo_constant_for_index(), is_subquery_var(), is_var_in_aggref_only(), IsBinaryTidClause(), isPlainForeignVar(), IsTidEqualAnyClause(), join_clause_is_movable_to(), join_is_removable(), lo_manage(), logicalrep_rel_mark_updatable(), logicalrep_should_publish_column(), logicalrep_write_attrs(), make_outerjoininfo(), make_window_input_target(), mark_expr(), mark_invalid_subplans_as_finished(), mark_rels_nulled_by_join(), match_opclause_to_indexcol(), match_orclause_to_indexcol(), match_rowcompare_to_indexcol(), match_saopclause_to_indexcol(), mbms_is_member(), MergeAttributes(), partitions_are_ordered(), perform_pruning_base_step(), pgpa_classify_alternative_subplans(), plpgsql_param_fetch(), postgresExplainForeignScan(), prepare_projection_slot(), preprocess_rowmarks(), process_subquery_nestloop_params(), pub_collist_validate(), pub_contains_invalid_column(), pullup_replace_vars_callback(), rangeTableEntry_used_walker(), rebuild_joinclause_attr_needed(), RememberWholeRowDependentForRebuilding(), remove_leftjoinrel_from_query(), remove_nulling_relids_mutator(), remove_rel_from_eclass(), remove_rel_from_query(), remove_self_join_rel(), remove_self_joins_one_group(), remove_self_joins_recurse(), remove_unused_subquery_outputs(), remove_useless_groupby_columns(), replace_nestloop_params_mutator(), replace_relid_callback(), rewriteTargetListIU(), rewriteValuesRTE(), ScanRelIsReadOnly(), semijoin_target_ok(), set_join_column_names(), set_rtable_names(), show_modifytable_info(), statext_mcv_clauselist_selectivity(), subquery_planner(), substitute_phv_relids_walker(), test_bms_is_member(), test_random_operations(), tfuncLoadRows(), transformGroupClauseExpr(), translate_col_privs(), TriggerEnabled(), try_hashjoin_path(), try_mergejoin_path(), try_nestloop_path(), tsvector_update_trigger(), tuples_equal(), update_eclasses(), use_physical_tlist(), validate_va_cols_list(), var_is_nonnullable(), and view_cols_are_auto_updatable().

◆ bms_is_subset()

bool bms_is_subset ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 547 of file bitmapset.c.

548{
549 int i;
550
553
554 /* Handle cases where either input is NULL */
555 if (a == NULL)
556 return true; /* empty set is a subset of anything */
557 if (b == NULL)
558 return false;
559
560 /* 'a' can't be a subset of 'b' if it contains more words */
561 if (a->nwords > b->nwords)
562 return false;
563
564 /* Check all 'a' members are set in 'b' */
565 i = 0;
566 do
567 {
568 if ((a->words[i] & ~b->words[i]) != 0)
569 return false;
570 } while (++i < a->nwords);
571 return true;
572}

References a, Assert, b, fb(), and i.

Referenced by add_child_rel_equivalences(), add_outer_joins_to_relids(), add_paths_to_joinrel(), add_placeholders_to_joinrel(), add_vars_to_attr_needed(), add_vars_to_targetlist(), build_joinrel_tlist(), check_functional_grouping(), check_index_only(), choose_best_statistics(), clause_sides_match_join(), compute_semijoin_info(), convert_ANY_sublink_to_join(), convert_EXISTS_sublink_to_join(), create_agg_clause_infos(), create_index_paths(), distribute_qual_to_rels(), eager_aggregation_possible_for_relation(), eclass_already_used(), eclass_useful_for_merging(), extract_lateral_vars_from_PHVs(), extract_rollup_sets(), final_cost_hashjoin(), finalize_plan(), find_computable_ec_member(), find_ec_member_matching_expr(), find_em_for_rel(), find_join_domain(), foreign_join_ok(), generate_implied_equalities_for_column(), generate_join_implied_equalities_broken(), generate_join_implied_equalities_normal(), get_appendrel_parampathinfo(), get_baserel_parampathinfo(), get_cheapest_fractional_path_for_pathkeys(), get_cheapest_parameterized_child_path(), get_cheapest_path_for_pathkeys(), get_join_index_paths(), get_join_variables(), get_joinrel_parampathinfo(), get_switched_clauses(), has_join_restriction(), has_relevant_eclass_joinclause(), have_join_order_restriction(), have_partkey_equi_join(), identify_current_nestloop_params(), initial_cost_mergejoin(), innerrel_is_unique_ext(), is_simple_subquery(), join_clause_is_movable_into(), join_is_legal(), join_is_removable(), jointree_contains_lateral_outer_refs(), make_grouped_join_rel(), make_outerjoininfo(), pg_get_expr_worker(), pgpa_walker_contains_no_gather(), populate_joinrel_with_paths(), process_implied_equality(), process_subquery_nestloop_params(), pullup_replace_vars_callback(), remove_rel_from_query(), reparameterize_path(), replace_nestloop_params_mutator(), search_indexed_tlist_for_phv(), search_indexed_tlist_for_var(), statext_mcv_clauselist_selectivity(), subbuild_joinrel_joinlist(), subbuild_joinrel_restrictlist(), test_bms_is_subset(), try_partial_nestloop_path(), and use_physical_tlist().

◆ bms_join()

Bitmapset * bms_join ( Bitmapset a,
Bitmapset b 
)
extern

Definition at line 1349 of file bitmapset.c.

1350{
1353 int otherlen;
1354 int i;
1355
1358
1359 /* Handle cases where either input is NULL */
1360 if (a == NULL)
1361 {
1362#ifdef REALLOCATE_BITMAPSETS
1364#endif
1365
1366 return b;
1367 }
1368 if (b == NULL)
1369 {
1370#ifdef REALLOCATE_BITMAPSETS
1372#endif
1373
1374 return a;
1375 }
1376
1377 /* Identify shorter and longer input; use longer one as result */
1378 if (a->nwords < b->nwords)
1379 {
1380 result = b;
1381 other = a;
1382 }
1383 else
1384 {
1385 result = a;
1386 other = b;
1387 }
1388 /* And union the shorter input into the result */
1389 otherlen = other->nwords;
1390 i = 0;
1391 do
1392 {
1393 result->words[i] |= other->words[i];
1394 } while (++i < otherlen);
1395 if (other != result) /* pure paranoia */
1396 pfree(other);
1397
1398#ifdef REALLOCATE_BITMAPSETS
1400#endif
1401
1402 return result;
1403}

References a, Assert, b, fb(), i, pfree(), and result.

Referenced by add_paths_to_joinrel(), alias_relid_set(), build_joinrel_tlist(), finalize_primnode(), find_nonnullable_rels_walker(), get_partkey_exec_paramids(), get_relids_in_jointree(), make_partition_pruneinfo(), process_equivalence(), pull_up_sublinks_jointree_recurse(), pull_varnos_walker(), test_bms_join(), and UpdateChangedParamSet().

◆ bms_make_singleton()

Bitmapset * bms_make_singleton ( int  x)
extern

Definition at line 217 of file bitmapset.c.

218{
220 int wordnum,
221 bitnum;
222
223 if (x < 0)
224 elog(ERROR, "negative bitmapset member not allowed");
225 wordnum = WORDNUM(x);
226 bitnum = BITNUM(x);
228 result->type = T_Bitmapset;
229 result->nwords = wordnum + 1;
230 result->words[wordnum] = ((bitmapword) 1 << bitnum);
231 return result;
232}

References BITMAPSET_SIZE, BITNUM, elog, ERROR, fb(), palloc0(), result, WORDNUM, and x.

Referenced by add_row_identity_var(), ATExecDropColumn(), ATPrepAlterColumnType(), bms_add_member(), build_base_rel_tlists(), build_simple_rel(), CopyFrom(), create_edata_for_relation(), create_estate_for_relation(), deconstruct_distribute_oj_quals(), deconstruct_recurse(), deparseReturningList(), DiscreteKnapsack(), examine_simple_variable(), expand_inherited_rtentry(), extract_lateral_references(), find_dependent_phvs(), find_dependent_phvs_in_jointree(), find_nonnullable_rels_walker(), get_matching_hash_bounds(), get_matching_list_bounds(), get_matching_range_bounds(), get_relids_in_jointree(), initialize_change_context(), load_enum_cache_data(), make_group_input_target(), make_pathkeys_for_sortclauses_extended(), mark_nullable_by_grouping(), pg_column_is_updatable(), pg_get_expr_worker(), pgpa_build_scan(), pgpa_walker_join_order_matches_member(), pgpa_walker_would_advise(), pull_up_sublinks_jointree_recurse(), pullup_replace_vars_callback(), rebuild_lateral_attr_needed(), reconsider_full_join_clause(), reduce_outer_joins(), reduce_outer_joins_pass1(), remove_rel_from_phvs(), remove_rel_from_query(), rewriteTargetView(), set_subqueryscan_references(), set_upper_references(), split_pathtarget_walker(), subquery_planner(), test_bms_make_singleton(), and transform_MERGE_to_join().

◆ bms_member_index()

int bms_member_index ( Bitmapset a,
int  x 
)
extern

Definition at line 674 of file bitmapset.c.

675{
676 int bitnum;
677 int wordnum;
678 int result = 0;
679 bitmapword mask;
680
682
683 /* return -1 if not a member of the bitmap */
684 if (!bms_is_member(x, a))
685 return -1;
686
687 wordnum = WORDNUM(x);
688 bitnum = BITNUM(x);
689
690 /* count bits in preceding words */
691 result += pg_popcount((const char *) a->words,
692 wordnum * sizeof(bitmapword));
693
694 /*
695 * Now add bits of the last word, but only those before the item. We can
696 * do that by applying a mask and then using popcount again. To get
697 * 0-based index, we want to count only preceding bits, not the item
698 * itself, so we subtract 1.
699 */
700 mask = ((bitmapword) 1 << bitnum) - 1;
701 result += bmw_popcount(a->words[wordnum] & mask);
702
703 return result;
704}
bool bms_is_member(int x, const Bitmapset *a)
Definition bitmapset.c:645
#define bmw_popcount(w)
Definition bitmapset.h:80
static uint64 pg_popcount(const char *buf, int bytes)

References a, Assert, BITNUM, bms_is_member(), bmw_popcount, fb(), pg_popcount(), result, WORDNUM, and x.

Referenced by clauselist_apply_dependencies(), mcv_get_match_bitmap(), mcv_match_expression(), and test_bms_member_index().

◆ bms_membership()

BMS_Membership bms_membership ( const Bitmapset a)
extern

Definition at line 900 of file bitmapset.c.

901{
903 int nwords;
904 int wordnum;
905
907
908 if (a == NULL)
909 return BMS_EMPTY_SET;
910
911 nwords = a->nwords;
912 wordnum = 0;
913 do
914 {
915 bitmapword w = a->words[wordnum];
916
917 if (w != 0)
918 {
920 return BMS_MULTIPLE;
922 }
923 } while (++wordnum < nwords);
924 return result;
925}

References a, Assert, BMS_EMPTY_SET, BMS_MULTIPLE, BMS_SINGLETON, fb(), HAS_MULTIPLE_ONES, and result.

Referenced by add_base_clause_to_rel(), add_child_join_rel_equivalences(), deparseFromExpr(), deparseLockingClause(), deparseVar(), dependencies_clauselist_selectivity(), dependency_is_compatible_clause(), dependency_is_compatible_expression(), distribute_qual_to_rels(), extract_lateral_vars_from_PHVs(), find_nonnullable_rels_walker(), generate_base_implied_equalities(), generate_base_implied_equalities_broken(), get_foreign_key_join_selectivity(), grouping_planner(), overexplain_bitmapset_list(), pgpa_build_scan(), pgpa_join_path_setup(), pgpa_joinrel_setup(), pgpa_output_join_member(), pgpa_output_query_feature(), pgpa_output_scan_strategy(), pgpa_output_simple_strategy(), process_implied_equality(), rebuild_joinclause_attr_needed(), relation_has_unique_index_for(), remove_self_join_rel(), remove_self_joins_recurse(), remove_useless_groupby_columns(), replace_relid_callback(), set_subquery_pathlist(), set_tablesample_rel_pathlist(), setup_eager_aggregation(), split_selfjoin_quals(), statext_mcv_clauselist_selectivity(), and test_bms_membership().

◆ bms_next_member()

int bms_next_member ( const Bitmapset a,
int  prevbit 
)
extern

Definition at line 1425 of file bitmapset.c.

1426{
1427 unsigned int currbit = prevbit;
1428 int nwords;
1429 bitmapword mask;
1430
1432
1433 if (a == NULL)
1434 return -2;
1435 nwords = a->nwords;
1436
1437 /* use an unsigned int to avoid the risk that int overflows */
1438 currbit++;
1439 mask = (~(bitmapword) 0) << BITNUM(currbit);
1440 for (int wordnum = WORDNUM(currbit); wordnum < nwords; wordnum++)
1441 {
1442 bitmapword w = a->words[wordnum];
1443
1444 /* ignore bits before currbit */
1445 w &= mask;
1446
1447 if (w != 0)
1448 {
1449 int result;
1450
1453 return result;
1454 }
1455
1456 /* in subsequent words, consider all bits */
1457 mask = (~(bitmapword) 0);
1458 }
1459 return -2;
1460}

References a, Assert, BITNUM, BITS_PER_BITMAPWORD, bmw_rightmost_one_pos, fb(), result, and WORDNUM.

Referenced by add_child_join_rel_equivalences(), add_child_rel_equivalences(), add_join_clause_to_rels(), add_part_relids(), adjust_group_pathkeys_for_groupagg(), adjust_view_column_set(), alias_relid_set(), all_rows_selectable(), apply_scanjoin_target_to_paths(), approximate_joinrel_size(), attnumstoint2vector(), build_attnums_array(), check_relation_privileges(), check_selective_binary_conversion(), choose_next_subplan_for_worker(), choose_next_subplan_locally(), clauselist_apply_dependencies(), ComputePartitionAttrs(), convert_EXISTS_sublink_to_join(), create_lateral_join_info(), create_partitionwise_grouping_paths(), CreatePartitionPruneState(), CreateStatistics(), DefineIndex(), deparseLockingClause(), dependencies_clauselist_selectivity(), DoCopy(), eager_aggregation_possible_for_relation(), eclass_member_iterator_next(), EstimateParamExecSpace(), ExecAppendAsyncBegin(), ExecAppendAsyncEventWait(), ExecAppendAsyncRequest(), ExecCheckOneRelPerms(), ExecCheckPermissionsModified(), ExecInitAgg(), ExecInitAppend(), ExecInitMergeAppend(), ExecMergeAppend(), ExecReScanAppend(), ExecScanReScan(), ExecSetParamPlanMulti(), expand_partitioned_rtentry(), find_appinfos_by_relids(), find_dependent_phvs_in_jointree(), find_hash_columns(), find_matching_subplans_recurse(), fixup_inherited_columns(), format_expr_params(), generate_base_implied_equalities(), generate_implied_equalities_for_column(), generate_join_implied_equalities(), get_eclass_for_sort_expr(), get_eclass_indexes_for_relids(), get_loop_count(), get_matching_partitions(), get_placeholder_nulling_relids(), grouping_planner(), has_notnull_forced_var(), has_relevant_eclass_joinclause(), have_relevant_eclass_joinclause(), HeapDetermineColumnsInfo(), InitExecPartitionPruneContexts(), logicalrep_get_attrs_str(), logicalrep_rel_mark_updatable(), lookup_var_attr_stats(), make_build_data(), make_partitionedrel_pruneinfo(), make_row_comparison_op(), mark_rels_nulled_by_join(), match_eclasses_to_foreign_key_col(), outBitmapset(), overexplain_bitmapset(), overexplain_bitmapset_list(), pgpa_bms_to_cstring(), pgpa_compute_identifiers_by_relids(), pgpa_filter_out_join_relids(), pgpa_output_relations(), pgpa_plan_walker(), pgpa_planner_apply_join_path_advice(), pgpa_planner_apply_joinrel_advice(), pgpa_planner_apply_scan_advice(), pgpa_trove_set_flags(), pgpa_trove_slice_lookup(), postgresBeginForeignScan(), postgresExplainForeignScan(), postgresPlanForeignModify(), pub_contains_invalid_column(), publication_add_relation(), pullup_replace_vars_callback(), remove_join_clause_from_rels(), remove_self_join_rel(), remove_self_joins_one_group(), remove_self_joins_recurse(), remove_useless_results_recurse(), remove_useless_self_joins(), SerializeParamExecParams(), show_result_replacement_info(), test_bms_next_member(), test_random_offset_operations(), test_random_operations(), and unique_nonjoin_rtekind().

◆ bms_nonempty_difference()

bool bms_nonempty_difference ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 769 of file bitmapset.c.

770{
771 int i;
772
775
776 /* Handle cases where either input is NULL */
777 if (a == NULL)
778 return false;
779 if (b == NULL)
780 return true;
781 /* if 'a' has more words then it must contain additional members */
782 if (a->nwords > b->nwords)
783 return true;
784 /* Check all 'a' members are set in 'b' */
785 i = 0;
786 do
787 {
788 if ((a->words[i] & ~b->words[i]) != 0)
789 return true;
790 } while (++i < a->nwords);
791 return false;
792}

References a, Assert, b, fb(), and i.

Referenced by add_placeholders_to_base_rels(), add_placeholders_to_joinrel(), allow_star_schema_join(), bms_difference(), build_joinrel_tlist(), ExecReScanMemoize(), foreign_join_ok(), is_var_needed_by_join(), test_bms_nonempty_difference(), and use_physical_tlist().

◆ bms_num_members()

◆ bms_offset_members()

Bitmapset * bms_offset_members ( const Bitmapset a,
int  offset 
)
extern

Definition at line 419 of file bitmapset.c.

420{
422 int offset_words;
423 int offset_bits;
424 int new_nwords;
425 int old_nwords;
427 int old_highest;
428 int new_highest;
429
431
432 /* nothing to do for empty sets */
433 if (a == NULL)
434 return NULL;
435
436 old_nwords = a->nwords;
437 offset_words = WORDNUM(offset);
438 offset_bits = BITNUM(offset);
439 high_bit = bmw_leftmost_one_pos(a->words[a->nwords - 1]);
441
442 /* don't create a set with a member that doesn't fit into an int32 */
444 elog(ERROR, "bitmapset overflow");
445 /* return NULL if the new set would be empty */
446 else if (new_highest < 0)
447 return NULL;
448
451 result->type = T_Bitmapset;
452 result->nwords = new_nwords;
453
454 /* handle zero and positive offsets (bitshift left) */
455 if (offset >= 0)
456 {
457 /*
458 * We special-case offsetting only by whole words, so we don't have to
459 * special-case bitshifting by BITS_PER_BITMAPWORD places, which has
460 * an undefined behavior.
461 */
462 if (offset_bits == 0)
463 {
464 int i = 0;
465
466 /*
467 * The old set is guaranteed to have at least 1 word, so use
468 * do/while to save the redundant initial loop bounds check.
469 */
470 do
471 {
473 result->words[i + offset_words] = a->words[i];
474 } while (++i < old_nwords);
475 }
476 else
477 {
480 int i = 0;
481
482 do
483 {
484 bitmapword carry = (a->words[i] >> carry_bits);
485
487 /* shift bits up and carry bits from the previous word */
488 result->words[i + offset_words] = (a->words[i] << offset_bits) | prev_carry;
490 } while (++i < old_nwords);
491 result->words[new_nwords - 1] |= prev_carry;
492 }
493 }
494
495 /* handle negative offset (bitshift right) */
496 else
497 {
498 /* make the negative offset_words and offset_bits positive */
501
502 /* as above, special case shifting only by whole words */
503 if (offset_bits == 0)
504 {
505 int i = 0;
506
507 do
508 {
510 result->words[i] = a->words[i + offset_words];
511 } while (++i < new_nwords);
512 }
513 else
514 {
517 int i = new_nwords - 1;
518
519 /* carry bits from any word just above where the loop starts */
522
523 /*
524 * We loop backward over the array so we correctly carry bits from
525 * higher words.
526 */
527 do
528 {
529 bitmapword carry = (a->words[i + offset_words] << carry_bits);
530
532
533 /* shift bits down and carry bits from the previous word */
534 result->words[i] = (a->words[i + offset_words] >> offset_bits) | prev_carry;
536 } while (--i >= 0);
537 }
538 }
539
540 return result;
541}
#define bmw_leftmost_one_pos(w)
Definition bitmapset.h:78
int32_t int32
Definition c.h:679
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
Definition int.h:151

References a, Assert, BITMAPSET_SIZE, BITNUM, BITS_PER_BITMAPWORD, bmw_leftmost_one_pos, elog, ERROR, fb(), i, palloc0(), pg_add_s32_overflow(), result, and WORDNUM.

Referenced by has_notnull_forced_var(), offset_relid_set(), OffsetVarNodes_walker(), statext_is_compatible_clause(), test_bms_offset_members(), and test_random_offset_operations().

◆ bms_overlap()

bool bms_overlap ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 710 of file bitmapset.c.

711{
712 int shortlen;
713 int i;
714
717
718 /* Handle cases where either input is NULL */
719 if (a == NULL || b == NULL)
720 return false;
721 /* Check words in common */
722 shortlen = Min(a->nwords, b->nwords);
723 i = 0;
724 do
725 {
726 if ((a->words[i] & b->words[i]) != 0)
727 return true;
728 } while (++i < shortlen);
729 return false;
730}

References a, Assert, b, fb(), i, and Min.

Referenced by add_child_join_rel_equivalences(), add_nulling_relids_mutator(), add_paths_to_joinrel(), adjust_child_relids_multilevel(), allow_star_schema_join(), calc_nestloop_required_outer(), calc_non_nestloop_required_outer(), choose_bitmap_and(), classify_matching_subplans(), compute_semijoin_info(), create_nestloop_path(), distribute_qual_to_rels(), eager_aggregation_possible_for_relation(), eclass_useful_for_merging(), examine_variable(), ExecInitGenerated(), ExecReScanAgg(), ExecReScanAppend(), ExecReScanFunctionScan(), ExecReScanMergeAppend(), ExecUpdateLockMode(), extract_lateral_vars_from_PHVs(), generate_implied_equalities_for_column(), generate_join_implied_equalities(), generate_join_implied_equalities_for_ecs(), get_appendrel_parampathinfo(), get_baserel_parampathinfo(), get_dependent_generated_columns(), get_joinrel_parampathinfo(), get_useful_ecs_for_relation(), has_join_restriction(), has_legal_joinclause(), has_notnull_forced_var(), has_partition_attrs(), have_join_order_restriction(), have_partkey_equi_join(), have_relevant_eclass_joinclause(), have_relevant_joinclause(), heap_update(), identify_current_nestloop_params(), join_clause_is_movable_into(), join_clause_is_movable_to(), join_is_legal(), join_is_removable(), join_search_one_level(), make_join_rel(), make_outerjoininfo(), make_plain_restrictinfo(), make_rels_by_clause_joins(), make_rels_by_clauseless_joins(), mbms_overlap_sets(), partitions_are_ordered(), path_is_reparameterizable_by_child(), pullup_replace_vars_callback(), reduce_outer_joins_pass2(), remove_nulling_relids_mutator(), remove_self_joins_recurse(), reparameterize_path_by_child(), select_outer_pathkeys_for_merge(), set_append_rel_size(), subbuild_joinrel_restrictlist(), test_bms_overlap(), try_hashjoin_path(), try_mergejoin_path(), try_nestloop_path(), and try_partitionwise_join().

◆ bms_overlap_list()

bool bms_overlap_list ( const Bitmapset a,
const struct List b 
)
extern

◆ bms_prev_member()

int bms_prev_member ( const Bitmapset a,
int  prevbit 
)
extern

Definition at line 1487 of file bitmapset.c.

1488{
1489 unsigned int currbit;
1490 int ushiftbits;
1491 bitmapword mask;
1492
1494
1495 /*
1496 * If set is NULL or if there are no more bits to the right then we've
1497 * nothing to do.
1498 */
1499 if (a == NULL || prevbit == 0)
1500 return -2;
1501
1502 /* Validate callers didn't give us something out of range */
1503 Assert(prevbit < 0 || prevbit <= (unsigned int) (a->nwords * BITS_PER_BITMAPWORD));
1504
1505 /*
1506 * Transform -1 (or any negative number) to the highest possible bit we
1507 * could have set. We do this in unsigned math to avoid the risk of
1508 * overflowing a signed int.
1509 */
1510 if (prevbit < 0)
1511 currbit = (unsigned int) a->nwords * BITS_PER_BITMAPWORD - 1;
1512 else
1513 currbit = prevbit - 1;
1514
1516 mask = (~(bitmapword) 0) >> ushiftbits;
1517 for (int wordnum = WORDNUM(currbit); wordnum >= 0; wordnum--)
1518 {
1519 bitmapword w = a->words[wordnum];
1520
1521 /* mask out bits left of currbit */
1522 w &= mask;
1523
1524 if (w != 0)
1525 {
1526 int result;
1527
1530 return result;
1531 }
1532
1533 /* in subsequent words, consider all bits */
1534 mask = (~(bitmapword) 0);
1535 }
1536 return -2;
1537}

References a, Assert, BITNUM, BITS_PER_BITMAPWORD, bmw_leftmost_one_pos, fb(), result, and WORDNUM.

Referenced by choose_next_subplan_locally(), and test_bms_prev_member().

◆ bms_replace_members()

Bitmapset * bms_replace_members ( Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 1091 of file bitmapset.c.

1092{
1093 int i;
1094
1097
1098 if (a == NULL)
1099 return bms_copy(b);
1100 if (b == NULL)
1101 {
1102 pfree(a);
1103 return NULL;
1104 }
1105
1106 if (a->nwords < b->nwords)
1107 a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(b->nwords));
1108
1109 i = 0;
1110 do
1111 {
1112 a->words[i] = b->words[i];
1113 } while (++i < b->nwords);
1114
1115 a->nwords = b->nwords;
1116
1117#ifdef REALLOCATE_BITMAPSETS
1118
1119 /*
1120 * There's no guarantee that the repalloc returned a new pointer, so copy
1121 * and free unconditionally here.
1122 */
1124#endif
1125
1126 return a;
1127}

References a, Assert, b, BITMAPSET_SIZE, bms_copy(), fb(), i, pfree(), and repalloc().

Referenced by DiscreteKnapsack(), and test_bms_replace_members().

◆ bms_singleton_member()

int bms_singleton_member ( const Bitmapset a)
extern

Definition at line 800 of file bitmapset.c.

801{
802 int result = -1;
803 int nwords;
804 int wordnum;
805
807
808 if (a == NULL)
809 elog(ERROR, "bitmapset is empty");
810
811 nwords = a->nwords;
812 wordnum = 0;
813 do
814 {
815 bitmapword w = a->words[wordnum];
816
817 if (w != 0)
818 {
819 if (result >= 0 || HAS_MULTIPLE_ONES(w))
820 elog(ERROR, "bitmapset has multiple members");
823 }
824 } while (++wordnum < nwords);
825
826 /* we don't expect non-NULL sets to be empty */
827 Assert(result >= 0);
828 return result;
829}

References a, Assert, BITS_PER_BITMAPWORD, bmw_rightmost_one_pos, elog, ERROR, fb(), HAS_MULTIPLE_ONES, and result.

Referenced by fix_append_rel_relids(), get_matching_part_pairs(), overexplain_bitmapset_list(), remove_useless_joins(), split_selfjoin_quals(), and test_bms_singleton_member().

◆ bms_subset_compare()

BMS_Comparison bms_subset_compare ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 580 of file bitmapset.c.

581{
583 int shortlen;
584 int i;
585
588
589 /* Handle cases where either input is NULL */
590 if (a == NULL)
591 {
592 if (b == NULL)
593 return BMS_EQUAL;
594 return BMS_SUBSET1;
595 }
596 if (b == NULL)
597 return BMS_SUBSET2;
598
599 /* Check common words */
600 result = BMS_EQUAL; /* status so far */
601 shortlen = Min(a->nwords, b->nwords);
602 i = 0;
603 do
604 {
605 bitmapword aword = a->words[i];
606 bitmapword bword = b->words[i];
607
608 if ((aword & ~bword) != 0)
609 {
610 /* a is not a subset of b */
611 if (result == BMS_SUBSET1)
612 return BMS_DIFFERENT;
614 }
615 if ((bword & ~aword) != 0)
616 {
617 /* b is not a subset of a */
618 if (result == BMS_SUBSET2)
619 return BMS_DIFFERENT;
621 }
622 } while (++i < shortlen);
623 /* Check extra words */
624 if (a->nwords > b->nwords)
625 {
626 /* if a has more words then a is not a subset of b */
627 if (result == BMS_SUBSET1)
628 return BMS_DIFFERENT;
629 return BMS_SUBSET2;
630 }
631 else if (a->nwords < b->nwords)
632 {
633 /* if b has more words then b is not a subset of a */
634 if (result == BMS_SUBSET2)
635 return BMS_DIFFERENT;
636 return BMS_SUBSET1;
637 }
638 return result;
639}

References a, Assert, b, BMS_DIFFERENT, BMS_EQUAL, BMS_SUBSET1, BMS_SUBSET2, fb(), i, Min, and result.

Referenced by add_path(), consider_index_join_outer_rels(), remove_useless_groupby_columns(), set_cheapest(), and test_bms_subset_compare().

◆ bms_union()

Bitmapset * bms_union ( const Bitmapset a,
const Bitmapset b 
)
extern

Definition at line 252 of file bitmapset.c.

253{
255 const Bitmapset *other;
256 int otherlen;
257 int i;
258
261
262 /* Handle cases where either input is NULL */
263 if (a == NULL)
264 return bms_copy(b);
265 if (b == NULL)
266 return bms_copy(a);
267 /* Identify shorter and longer input; copy the longer one */
268 if (a->nwords <= b->nwords)
269 {
270 result = bms_copy(b);
271 other = a;
272 }
273 else
274 {
275 result = bms_copy(a);
276 other = b;
277 }
278 /* And union the shorter input into the result */
279 otherlen = other->nwords;
280 i = 0;
281 do
282 {
283 result->words[i] |= other->words[i];
284 } while (++i < otherlen);
285 return result;
286}

References a, Assert, b, bms_copy(), fb(), i, and result.

Referenced by add_nulling_relids_mutator(), build_join_rel(), build_joinrel_restrictlist(), BuildParameterizedTidPaths(), calc_nestloop_required_outer(), calc_non_nestloop_required_outer(), check_index_predicates(), check_relation_privileges(), compute_semijoin_info(), consider_index_join_outer_rels(), create_hashjoin_plan(), create_join_clause(), create_mergejoin_plan(), create_nestloop_plan(), deconstruct_distribute(), deconstruct_distribute_oj_quals(), deconstruct_jointree(), deconstruct_recurse(), ExecConstraints(), ExecGetAllUpdatedCols(), ExecPartitionCheckEmitError(), ExecWithCheckOptions(), finalize_plan(), find_hash_columns(), foreign_join_ok(), generate_join_implied_equalities(), generate_join_implied_equalities_for_ecs(), generate_nonunion_paths(), generate_recursion_path(), get_baserel_parampathinfo(), get_joinrel_parampathinfo(), get_rel_all_updated_cols(), get_tuple_desc(), has_legal_joinclause(), identify_current_nestloop_params(), index_unchanged_by_update(), join_is_removable(), make_join_rel(), make_outerjoininfo(), make_plain_restrictinfo(), markNullableIfNeeded(), min_join_parameterization(), pgpa_trove_lookup(), postgresGetForeignPaths(), pull_up_sublinks_jointree_recurse(), reduce_outer_joins_pass1(), reduce_unique_semijoins(), remove_leftjoinrel_from_query(), ReportNotNullViolationError(), resolve_special_varno(), rewriteTargetView(), substitute_phv_relids_walker(), test_bms_union(), test_random_operations(), and try_partitionwise_join().