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)
 
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 118 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 1418 of file bitmapset.c.

1419{
1420 Assert(keysize == sizeof(Bitmapset *));
1421 return bms_hash_value(*((const Bitmapset *const *) key));
1422}
uint32 bms_hash_value(const Bitmapset *a)
Definition bitmapset.c:1402
#define Assert(condition)
Definition c.h:885

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 1428 of file bitmapset.c.

1429{
1430 Assert(keysize == sizeof(Bitmapset *));
1431 return !bms_equal(*((const Bitmapset *const *) key1),
1432 *((const Bitmapset *const *) key2));
1433}
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
Definition bitmapset.c:142
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 799 of file bitmapset.c.

800{
801 int wordnum,
802 bitnum;
803
805
806 if (x < 0)
807 elog(ERROR, "negative bitmapset member not allowed");
808 if (a == NULL)
809 return bms_make_singleton(x);
810
811 wordnum = WORDNUM(x);
812 bitnum = BITNUM(x);
813
814 /* enlarge the set if necessary */
815 if (wordnum >= a->nwords)
816 {
817 int oldnwords = a->nwords;
818 int i;
819
821 a->nwords = wordnum + 1;
822 /* zero out the enlarged portion */
823 i = oldnwords;
824 do
825 {
826 a->words[i] = 0;
827 } while (++i < a->nwords);
828 }
829
830 a->words[wordnum] |= ((bitmapword) 1 << bitnum);
831
832#ifdef REALLOCATE_BITMAPSETS
833
834 /*
835 * There's no guarantee that the repalloc returned a new pointer, so copy
836 * and free unconditionally here.
837 */
839#endif
840
841 return a;
842}
#define BITMAPSET_SIZE(nwords)
Definition bitmapset.c:50
Bitmapset * bms_make_singleton(int x)
Definition bitmapset.c:216
#define WORDNUM(x)
Definition bitmapset.c:47
#define BITNUM(x)
Definition bitmapset.c:48
uint32 bitmapword
Definition bitmapset.h:44
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
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:1632

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(), do_analyze_rel(), DoCopy(), dropconstraint_internal(), estimate_multivariate_ndistinct(), EvalPlanQualBegin(), ExecAsyncAppendResponse(), ExecBuildUpdateProjection(), ExecCheckPermissions(), ExecInitAgg(), ExecInitAppend(), ExecInitGenerated(), 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_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(), 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(), has_notnull_forced_var(), HeapDetermineColumnsInfo(), infer_arbiter_indexes(), InitExecPartitionPruneContexts(), 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(), offset_relid_set(), offset_relid_set(), 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_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(), stat_covers_expressions(), statext_is_compatible_clause(), statext_is_compatible_clause_internal(), statext_mcv_clauselist_selectivity(), test_bms_add_member(), test_random_operations(), transformGroupClause(), transformGroupClauseList(), transformInsertStmt(), transformMergeStmt(), transformRangeTableFunc(), transformUpdateTargetList(), translate_col_privs(), try_partitionwise_join(), use_physical_tlist(), and view_cols_are_auto_updatable().

◆ bms_add_members()

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

Definition at line 901 of file bitmapset.c.

902{
903 Bitmapset *result;
904 const Bitmapset *other;
905 int otherlen;
906 int i;
907
910
911 /* Handle cases where either input is NULL */
912 if (a == NULL)
913 return bms_copy(b);
914 if (b == NULL)
915 {
916#ifdef REALLOCATE_BITMAPSETS
918#endif
919
920 return a;
921 }
922 /* Identify shorter and longer input; copy the longer one if needed */
923 if (a->nwords < b->nwords)
924 {
925 result = bms_copy(b);
926 other = a;
927 }
928 else
929 {
930 result = a;
931 other = b;
932 }
933 /* And union the shorter input into the result */
935 i = 0;
936 do
937 {
938 result->words[i] |= other->words[i];
939 } while (++i < otherlen);
940 if (result != a)
941 pfree(a);
942#ifdef REALLOCATE_BITMAPSETS
943 else
944 result = bms_copy_and_free(result);
945#endif
946
947 return result;
948}
Bitmapset * bms_copy(const Bitmapset *a)
Definition bitmapset.c:122
int b
Definition isn.c:74
void pfree(void *pointer)
Definition mcxt.c:1616
int nwords
Definition bitmapset.h:54
bitmapword words[FLEXIBLE_ARRAY_MEMBER]
Definition bitmapset.h:55

References a, Assert, b, bms_copy(), fb(), i, Bitmapset::nwords, pfree(), and Bitmapset::words.

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(), 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 1003 of file bitmapset.c.

1004{
1005 int lwordnum,
1006 lbitnum,
1007 uwordnum,
1008 ushiftbits,
1009 wordnum;
1010
1012
1013 /* do nothing if nothing is called for, without further checking */
1014 if (upper < lower)
1015 {
1016#ifdef REALLOCATE_BITMAPSETS
1018#endif
1019
1020 return a;
1021 }
1022
1023 if (lower < 0)
1024 elog(ERROR, "negative bitmapset member not allowed");
1026
1027 if (a == NULL)
1028 {
1030 a->type = T_Bitmapset;
1031 a->nwords = uwordnum + 1;
1032 }
1033 else if (uwordnum >= a->nwords)
1034 {
1035 int oldnwords = a->nwords;
1036 int i;
1037
1038 /* ensure we have enough words to store the upper bit */
1040 a->nwords = uwordnum + 1;
1041 /* zero out the enlarged portion */
1042 i = oldnwords;
1043 do
1044 {
1045 a->words[i] = 0;
1046 } while (++i < a->nwords);
1047 }
1048
1050
1051 lbitnum = BITNUM(lower);
1053
1054 /*
1055 * Special case when lwordnum is the same as uwordnum we must perform the
1056 * upper and lower masking on the word.
1057 */
1058 if (lwordnum == uwordnum)
1059 {
1060 a->words[lwordnum] |= ~(bitmapword) (((bitmapword) 1 << lbitnum) - 1)
1061 & (~(bitmapword) 0) >> ushiftbits;
1062 }
1063 else
1064 {
1065 /* turn on lbitnum and all bits left of it */
1066 a->words[wordnum++] |= ~(bitmapword) (((bitmapword) 1 << lbitnum) - 1);
1067
1068 /* turn on all bits for any intermediate words */
1069 while (wordnum < uwordnum)
1070 a->words[wordnum++] = ~(bitmapword) 0;
1071
1072 /* turn on upper's bit and all bits right of it. */
1073 a->words[uwordnum] |= (~(bitmapword) 0) >> ushiftbits;
1074 }
1075
1076#ifdef REALLOCATE_BITMAPSETS
1077
1078 /*
1079 * There's no guarantee that the repalloc returned a new pointer, so copy
1080 * and free unconditionally here.
1081 */
1083#endif
1084
1085 return a;
1086}
#define BITS_PER_BITMAPWORD
Definition bitmapset.h:43
void * palloc0(Size size)
Definition mcxt.c:1417
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 183 of file bitmapset.c.

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

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 122 of file bitmapset.c.

123{
124 Bitmapset *result;
125 size_t size;
126
128
129 if (a == NULL)
130 return NULL;
131
132 size = BITMAPSET_SIZE(a->nwords);
133 result = (Bitmapset *) palloc(size);
134 memcpy(result, a, size);
135 return result;
136}
void * palloc(Size size)
Definition mcxt.c:1387

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

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(), reconsider_full_join_clause(), reconsider_outer_join_clause(), RelationGetIdentityKeyBitmap(), RelationGetIndexAttrBitmap(), 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 852 of file bitmapset.c.

853{
854 int wordnum,
855 bitnum;
856
858
859 if (x < 0)
860 elog(ERROR, "negative bitmapset member not allowed");
861 if (a == NULL)
862 return NULL;
863
864 wordnum = WORDNUM(x);
865 bitnum = BITNUM(x);
866
867#ifdef REALLOCATE_BITMAPSETS
869#endif
870
871 /* member can't exist. Return 'a' unmodified */
872 if (unlikely(wordnum >= a->nwords))
873 return a;
874
875 a->words[wordnum] &= ~((bitmapword) 1 << bitnum);
876
877 /* when last word becomes empty, trim off all trailing empty words */
878 if (a->words[wordnum] == 0 && wordnum == a->nwords - 1)
879 {
880 /* find the last non-empty word and make that the new final word */
881 for (int i = wordnum - 1; i >= 0; i--)
882 {
883 if (a->words[i] != 0)
884 {
885 a->nwords = i + 1;
886 return a;
887 }
888 }
889
890 /* the set is now empty */
891 pfree(a);
892 return NULL;
893 }
894 return a;
895}
#define unlikely(x)
Definition c.h:424

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_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 1145 of file bitmapset.c.

1146{
1147 int i;
1148
1151
1152 /* Handle cases where either input is NULL */
1153 if (a == NULL)
1154 return NULL;
1155 if (b == NULL)
1156 {
1157#ifdef REALLOCATE_BITMAPSETS
1159#endif
1160
1161 return a;
1162 }
1163
1164 /* Remove b's bits from a; we need never copy */
1165 if (a->nwords > b->nwords)
1166 {
1167 /*
1168 * We'll never need to remove trailing zero words when 'a' has more
1169 * words than 'b'.
1170 */
1171 i = 0;
1172 do
1173 {
1174 a->words[i] &= ~b->words[i];
1175 } while (++i < b->nwords);
1176 }
1177 else
1178 {
1179 int lastnonzero = -1;
1180
1181 /* we may need to remove trailing zero words from the result. */
1182 i = 0;
1183 do
1184 {
1185 a->words[i] &= ~b->words[i];
1186
1187 /* remember the last non-zero word */
1188 if (a->words[i] != 0)
1189 lastnonzero = i;
1190 } while (++i < a->nwords);
1191
1192 /* check if 'a' has become empty */
1193 if (lastnonzero == -1)
1194 {
1195 pfree(a);
1196 return NULL;
1197 }
1198
1199 /* trim off any trailing zero words */
1200 a->nwords = lastnonzero + 1;
1201 }
1202
1203#ifdef REALLOCATE_BITMAPSETS
1205#endif
1206
1207 return a;
1208}

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 346 of file bitmapset.c.

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

References a, Assert, b, bms_copy(), bms_nonempty_difference(), fb(), i, Bitmapset::nwords, and Bitmapset::words.

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(), examine_variable(), finalize_plan(), find_placeholder_info(), make_plain_restrictinfo(), pull_varnos_walker(), remove_nulling_relids_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 142 of file bitmapset.c.

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

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(), 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(), and try_partitionwise_join().

◆ bms_free()

◆ bms_get_singleton_member()

bool bms_get_singleton_member ( const Bitmapset a,
int member 
)
extern

Definition at line 708 of file bitmapset.c.

709{
710 int result = -1;
711 int nwords;
712 int wordnum;
713
715
716 if (a == NULL)
717 return false;
718
719 nwords = a->nwords;
720 wordnum = 0;
721 do
722 {
723 bitmapword w = a->words[wordnum];
724
725 if (w != 0)
726 {
727 if (result >= 0 || HAS_MULTIPLE_ONES(w))
728 return false;
729 result = wordnum * BITS_PER_BITMAPWORD;
730 result += bmw_rightmost_one_pos(w);
731 }
732 } while (++wordnum < nwords);
733
734 /* we don't expect non-NULL sets to be empty */
735 Assert(result >= 0);
736 *member = result;
737 return true;
738}
#define HAS_MULTIPLE_ONES(x)
Definition bitmapset.c:72
#define bmw_rightmost_one_pos(w)
Definition bitmapset.h:79

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

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 1402 of file bitmapset.c.

1403{
1405
1406 if (a == NULL)
1407 return 0; /* All empty sets hash to 0 */
1408 return DatumGetUInt32(hash_any((const unsigned char *) a->words,
1409 a->nwords * sizeof(bitmapword)));
1410}
static Datum hash_any(const unsigned char *k, int keylen)
Definition hashfn.h:31
static uint32 DatumGetUInt32(Datum X)
Definition postgres.h:232

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 1093 of file bitmapset.c.

1094{
1095 int lastnonzero;
1096 int shortlen;
1097 int i;
1098
1101
1102 /* Handle cases where either input is NULL */
1103 if (a == NULL)
1104 return NULL;
1105 if (b == NULL)
1106 {
1107 pfree(a);
1108 return NULL;
1109 }
1110
1111 /* Intersect b into a; we need never copy */
1112 shortlen = Min(a->nwords, b->nwords);
1113 lastnonzero = -1;
1114 i = 0;
1115 do
1116 {
1117 a->words[i] &= b->words[i];
1118
1119 if (a->words[i] != 0)
1120 lastnonzero = i;
1121 } while (++i < shortlen);
1122
1123 /* If we computed an empty result, we must return NULL */
1124 if (lastnonzero == -1)
1125 {
1126 pfree(a);
1127 return NULL;
1128 }
1129
1130 /* get rid of trailing zero words */
1131 a->nwords = lastnonzero + 1;
1132
1133#ifdef REALLOCATE_BITMAPSETS
1135#endif
1136
1137 return a;
1138}
#define Min(x, y)
Definition c.h:1019

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 292 of file bitmapset.c.

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

References a, Assert, b, bms_copy(), fb(), i, Bitmapset::nwords, pfree(), and Bitmapset::words.

Referenced by build_joinrel_tlist(), classify_matching_subplans(), create_lateral_join_info(), distribute_qual_to_rels(), 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 510 of file bitmapset.c.

511{
512 int wordnum,
513 bitnum;
514
516
517 /* XXX better to just return false for x<0 ? */
518 if (x < 0)
519 elog(ERROR, "negative bitmapset member not allowed");
520 if (a == NULL)
521 return false;
522
523 wordnum = WORDNUM(x);
524 bitnum = BITNUM(x);
525 if (wordnum >= a->nwords)
526 return false;
527 if ((a->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0)
528 return true;
529 return false;
530}

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(), do_analyze_rel(), DoCopy(), dropconstraint_internal(), enum_known_sorted(), estimate_multivariate_ndistinct(), examine_variable(), ExecBuildSlotValueDescription(), ExecBuildUpdateProjection(), ExecCheckPermissions(), ExecEvalGroupingFunc(), ExecGetRangeTableRelation(), ExecInitLockRows(), ExecInitModifyTable(), 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(), 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(), remove_leftjoinrel_from_query(), remove_nulling_relids_mutator(), remove_rel_from_eclass(), remove_rel_from_query(), 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(), 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(), 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 412 of file bitmapset.c.

413{
414 int i;
415
418
419 /* Handle cases where either input is NULL */
420 if (a == NULL)
421 return true; /* empty set is a subset of anything */
422 if (b == NULL)
423 return false;
424
425 /* 'a' can't be a subset of 'b' if it contains more words */
426 if (a->nwords > b->nwords)
427 return false;
428
429 /* Check all 'a' members are set in 'b' */
430 i = 0;
431 do
432 {
433 if ((a->words[i] & ~b->words[i]) != 0)
434 return false;
435 } while (++i < a->nwords);
436 return true;
437}

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(), 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 1214 of file bitmapset.c.

1215{
1216 Bitmapset *result;
1218 int otherlen;
1219 int i;
1220
1223
1224 /* Handle cases where either input is NULL */
1225 if (a == NULL)
1226 {
1227#ifdef REALLOCATE_BITMAPSETS
1229#endif
1230
1231 return b;
1232 }
1233 if (b == NULL)
1234 {
1235#ifdef REALLOCATE_BITMAPSETS
1237#endif
1238
1239 return a;
1240 }
1241
1242 /* Identify shorter and longer input; use longer one as result */
1243 if (a->nwords < b->nwords)
1244 {
1245 result = b;
1246 other = a;
1247 }
1248 else
1249 {
1250 result = a;
1251 other = b;
1252 }
1253 /* And union the shorter input into the result */
1255 i = 0;
1256 do
1257 {
1258 result->words[i] |= other->words[i];
1259 } while (++i < otherlen);
1260 if (other != result) /* pure paranoia */
1261 pfree(other);
1262
1263#ifdef REALLOCATE_BITMAPSETS
1264 result = bms_copy_and_free(result);
1265#endif
1266
1267 return result;
1268}

References a, Assert, b, fb(), i, Bitmapset::nwords, pfree(), and Bitmapset::words.

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 216 of file bitmapset.c.

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

References BITMAPSET_SIZE, BITNUM, elog, ERROR, fb(), Bitmapset::nwords, palloc0(), WORDNUM, Bitmapset::words, 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(), 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(), 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_query(), 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 539 of file bitmapset.c.

540{
541 int bitnum;
542 int wordnum;
543 int result = 0;
544 bitmapword mask;
545
547
548 /* return -1 if not a member of the bitmap */
549 if (!bms_is_member(x, a))
550 return -1;
551
552 wordnum = WORDNUM(x);
553 bitnum = BITNUM(x);
554
555 /* count bits in preceding words */
556 result += pg_popcount((const char *) a->words,
557 wordnum * sizeof(bitmapword));
558
559 /*
560 * Now add bits of the last word, but only those before the item. We can
561 * do that by applying a mask and then using popcount again. To get
562 * 0-based index, we want to count only preceding bits, not the item
563 * itself, so we subtract 1.
564 */
565 mask = ((bitmapword) 1 << bitnum) - 1;
566 result += bmw_popcount(a->words[wordnum] & mask);
567
568 return result;
569}
bool bms_is_member(int x, const Bitmapset *a)
Definition bitmapset.c:510
#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(), 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

◆ bms_next_member()

int bms_next_member ( const Bitmapset a,
int  prevbit 
)
extern

Definition at line 1290 of file bitmapset.c.

1291{
1292 int nwords;
1293 bitmapword mask;
1294
1296
1297 if (a == NULL)
1298 return -2;
1299 nwords = a->nwords;
1300 prevbit++;
1301 mask = (~(bitmapword) 0) << BITNUM(prevbit);
1302 for (int wordnum = WORDNUM(prevbit); wordnum < nwords; wordnum++)
1303 {
1304 bitmapword w = a->words[wordnum];
1305
1306 /* ignore bits before prevbit */
1307 w &= mask;
1308
1309 if (w != 0)
1310 {
1311 int result;
1312
1313 result = wordnum * BITS_PER_BITMAPWORD;
1314 result += bmw_rightmost_one_pos(w);
1315 return result;
1316 }
1317
1318 /* in subsequent words, consider all bits */
1319 mask = (~(bitmapword) 0);
1320 }
1321 return -2;
1322}

References a, Assert, BITNUM, BITS_PER_BITMAPWORD, bmw_rightmost_one_pos, fb(), 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(), offset_relid_set(), offset_relid_set(), outBitmapset(), overexplain_bitmapset(), overexplain_bitmapset_list(), 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(), statext_is_compatible_clause(), test_bms_next_member(), and test_random_operations().

◆ bms_nonempty_difference()

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

Definition at line 634 of file bitmapset.c.

635{
636 int i;
637
640
641 /* Handle cases where either input is NULL */
642 if (a == NULL)
643 return false;
644 if (b == NULL)
645 return true;
646 /* if 'a' has more words then it must contain additional members */
647 if (a->nwords > b->nwords)
648 return true;
649 /* Check all 'a' members are set in 'b' */
650 i = 0;
651 do
652 {
653 if ((a->words[i] & ~b->words[i]) != 0)
654 return true;
655 } while (++i < a->nwords);
656 return false;
657}

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_overlap()

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

Definition at line 575 of file bitmapset.c.

576{
577 int shortlen;
578 int i;
579
582
583 /* Handle cases where either input is NULL */
584 if (a == NULL || b == NULL)
585 return false;
586 /* Check words in common */
587 shortlen = Min(a->nwords, b->nwords);
588 i = 0;
589 do
590 {
591 if ((a->words[i] & b->words[i]) != 0)
592 return true;
593 } while (++i < shortlen);
594 return false;
595}

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(), 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 1350 of file bitmapset.c.

1351{
1352 int ushiftbits;
1353 bitmapword mask;
1354
1356
1357 /*
1358 * If set is NULL or if there are no more bits to the right then we've
1359 * nothing to do.
1360 */
1361 if (a == NULL || prevbit == 0)
1362 return -2;
1363
1364 /* Validate callers didn't give us something out of range */
1366 Assert(prevbit >= -1);
1367
1368 /* transform -1 to the highest possible bit we could have set */
1369 if (prevbit == -1)
1370 prevbit = a->nwords * BITS_PER_BITMAPWORD - 1;
1371 else
1372 prevbit--;
1373
1375 mask = (~(bitmapword) 0) >> ushiftbits;
1376 for (int wordnum = WORDNUM(prevbit); wordnum >= 0; wordnum--)
1377 {
1378 bitmapword w = a->words[wordnum];
1379
1380 /* mask out bits left of prevbit */
1381 w &= mask;
1382
1383 if (w != 0)
1384 {
1385 int result;
1386
1387 result = wordnum * BITS_PER_BITMAPWORD;
1388 result += bmw_leftmost_one_pos(w);
1389 return result;
1390 }
1391
1392 /* in subsequent words, consider all bits */
1393 mask = (~(bitmapword) 0);
1394 }
1395 return -2;
1396}
#define bmw_leftmost_one_pos(w)
Definition bitmapset.h:78

References a, Assert, BITNUM, BITS_PER_BITMAPWORD, bmw_leftmost_one_pos, fb(), 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 956 of file bitmapset.c.

957{
958 int i;
959
962
963 if (a == NULL)
964 return bms_copy(b);
965 if (b == NULL)
966 {
967 pfree(a);
968 return NULL;
969 }
970
971 if (a->nwords < b->nwords)
972 a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(b->nwords));
973
974 i = 0;
975 do
976 {
977 a->words[i] = b->words[i];
978 } while (++i < b->nwords);
979
980 a->nwords = b->nwords;
981
982#ifdef REALLOCATE_BITMAPSETS
983
984 /*
985 * There's no guarantee that the repalloc returned a new pointer, so copy
986 * and free unconditionally here.
987 */
989#endif
990
991 return a;
992}

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 665 of file bitmapset.c.

666{
667 int result = -1;
668 int nwords;
669 int wordnum;
670
672
673 if (a == NULL)
674 elog(ERROR, "bitmapset is empty");
675
676 nwords = a->nwords;
677 wordnum = 0;
678 do
679 {
680 bitmapword w = a->words[wordnum];
681
682 if (w != 0)
683 {
684 if (result >= 0 || HAS_MULTIPLE_ONES(w))
685 elog(ERROR, "bitmapset has multiple members");
686 result = wordnum * BITS_PER_BITMAPWORD;
687 result += bmw_rightmost_one_pos(w);
688 }
689 } while (++wordnum < nwords);
690
691 /* we don't expect non-NULL sets to be empty */
692 Assert(result >= 0);
693 return result;
694}

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

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 445 of file bitmapset.c.

446{
447 BMS_Comparison result;
448 int shortlen;
449 int i;
450
453
454 /* Handle cases where either input is NULL */
455 if (a == NULL)
456 {
457 if (b == NULL)
458 return BMS_EQUAL;
459 return BMS_SUBSET1;
460 }
461 if (b == NULL)
462 return BMS_SUBSET2;
463
464 /* Check common words */
465 result = BMS_EQUAL; /* status so far */
466 shortlen = Min(a->nwords, b->nwords);
467 i = 0;
468 do
469 {
470 bitmapword aword = a->words[i];
471 bitmapword bword = b->words[i];
472
473 if ((aword & ~bword) != 0)
474 {
475 /* a is not a subset of b */
476 if (result == BMS_SUBSET1)
477 return BMS_DIFFERENT;
478 result = BMS_SUBSET2;
479 }
480 if ((bword & ~aword) != 0)
481 {
482 /* b is not a subset of a */
483 if (result == BMS_SUBSET2)
484 return BMS_DIFFERENT;
485 result = BMS_SUBSET1;
486 }
487 } while (++i < shortlen);
488 /* Check extra words */
489 if (a->nwords > b->nwords)
490 {
491 /* if a has more words then a is not a subset of b */
492 if (result == BMS_SUBSET1)
493 return BMS_DIFFERENT;
494 return BMS_SUBSET2;
495 }
496 else if (a->nwords < b->nwords)
497 {
498 /* if b has more words then b is not a subset of a */
499 if (result == BMS_SUBSET2)
500 return BMS_DIFFERENT;
501 return BMS_SUBSET1;
502 }
503 return result;
504}

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

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 251 of file bitmapset.c.

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

References a, Assert, b, bms_copy(), fb(), i, and Bitmapset::words.

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_join_clause(), 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(), 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().