PostgreSQL Source Code  git master
list.c File Reference
#include "postgres.h"
#include "common/int.h"
#include "nodes/pg_list.h"
#include "port/pg_bitutils.h"
#include "utils/memdebug.h"
#include "utils/memutils.h"
Include dependency graph for list.c:

Go to the source code of this file.

Macros

#define LIST_HEADER_OVERHEAD    ((int) ((offsetof(List, initial_elements) - 1) / sizeof(ListCell) + 1))
 
#define IsPointerList(l)   ((l) == NIL || IsA((l), List))
 
#define IsIntegerList(l)   ((l) == NIL || IsA((l), IntList))
 
#define IsOidList(l)   ((l) == NIL || IsA((l), OidList))
 
#define IsXidList(l)   ((l) == NIL || IsA((l), XidList))
 
#define check_list_invariants(l)   ((void) 0)
 

Functions

static Listnew_list (NodeTag type, int min_size)
 
static void enlarge_list (List *list, int min_size)
 
Listlist_make1_impl (NodeTag t, ListCell datum1)
 
Listlist_make2_impl (NodeTag t, ListCell datum1, ListCell datum2)
 
Listlist_make3_impl (NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3)
 
Listlist_make4_impl (NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4)
 
Listlist_make5_impl (NodeTag t, ListCell datum1, ListCell datum2, ListCell datum3, ListCell datum4, ListCell datum5)
 
static void new_head_cell (List *list)
 
static void new_tail_cell (List *list)
 
Listlappend (List *list, void *datum)
 
Listlappend_int (List *list, int datum)
 
Listlappend_oid (List *list, Oid datum)
 
Listlappend_xid (List *list, TransactionId datum)
 
static ListCellinsert_new_cell (List *list, int pos)
 
Listlist_insert_nth (List *list, int pos, void *datum)
 
Listlist_insert_nth_int (List *list, int pos, int datum)
 
Listlist_insert_nth_oid (List *list, int pos, Oid datum)
 
Listlcons (void *datum, List *list)
 
Listlcons_int (int datum, List *list)
 
Listlcons_oid (Oid datum, List *list)
 
Listlist_concat (List *list1, const List *list2)
 
Listlist_concat_copy (const List *list1, const List *list2)
 
Listlist_truncate (List *list, int new_size)
 
bool list_member (const List *list, const void *datum)
 
bool list_member_ptr (const List *list, const void *datum)
 
bool list_member_int (const List *list, int datum)
 
bool list_member_oid (const List *list, Oid datum)
 
bool list_member_xid (const List *list, TransactionId datum)
 
Listlist_delete_nth_cell (List *list, int n)
 
Listlist_delete_cell (List *list, ListCell *cell)
 
Listlist_delete (List *list, void *datum)
 
Listlist_delete_ptr (List *list, void *datum)
 
Listlist_delete_int (List *list, int datum)
 
Listlist_delete_oid (List *list, Oid datum)
 
Listlist_delete_first (List *list)
 
Listlist_delete_last (List *list)
 
Listlist_delete_first_n (List *list, int n)
 
Listlist_union (const List *list1, const List *list2)
 
Listlist_union_ptr (const List *list1, const List *list2)
 
Listlist_union_int (const List *list1, const List *list2)
 
Listlist_union_oid (const List *list1, const List *list2)
 
Listlist_intersection (const List *list1, const List *list2)
 
Listlist_intersection_int (const List *list1, const List *list2)
 
Listlist_difference (const List *list1, const List *list2)
 
Listlist_difference_ptr (const List *list1, const List *list2)
 
Listlist_difference_int (const List *list1, const List *list2)
 
Listlist_difference_oid (const List *list1, const List *list2)
 
Listlist_append_unique (List *list, void *datum)
 
Listlist_append_unique_ptr (List *list, void *datum)
 
Listlist_append_unique_int (List *list, int datum)
 
Listlist_append_unique_oid (List *list, Oid datum)
 
Listlist_concat_unique (List *list1, const List *list2)
 
Listlist_concat_unique_ptr (List *list1, const List *list2)
 
Listlist_concat_unique_int (List *list1, const List *list2)
 
Listlist_concat_unique_oid (List *list1, const List *list2)
 
void list_deduplicate_oid (List *list)
 
static void list_free_private (List *list, bool deep)
 
void list_free (List *list)
 
void list_free_deep (List *list)
 
Listlist_copy (const List *oldlist)
 
Listlist_copy_head (const List *oldlist, int len)
 
Listlist_copy_tail (const List *oldlist, int nskip)
 
Listlist_copy_deep (const List *oldlist)
 
void list_sort (List *list, list_sort_comparator cmp)
 
int list_int_cmp (const ListCell *p1, const ListCell *p2)
 
int list_oid_cmp (const ListCell *p1, const ListCell *p2)
 

Macro Definition Documentation

◆ check_list_invariants

#define check_list_invariants (   l)    ((void) 0)

Definition at line 80 of file list.c.

◆ IsIntegerList

#define IsIntegerList (   l)    ((l) == NIL || IsA((l), IntList))

Definition at line 56 of file list.c.

◆ IsOidList

#define IsOidList (   l)    ((l) == NIL || IsA((l), OidList))

Definition at line 57 of file list.c.

◆ IsPointerList

#define IsPointerList (   l)    ((l) == NIL || IsA((l), List))

Definition at line 55 of file list.c.

◆ IsXidList

#define IsXidList (   l)    ((l) == NIL || IsA((l), XidList))

Definition at line 58 of file list.c.

◆ LIST_HEADER_OVERHEAD

#define LIST_HEADER_OVERHEAD    ((int) ((offsetof(List, initial_elements) - 1) / sizeof(ListCell) + 1))

Definition at line 48 of file list.c.

Function Documentation

◆ enlarge_list()

static void enlarge_list ( List list,
int  min_size 
)
static

Definition at line 155 of file list.c.

156 {
157  int new_max_len;
158 
159  Assert(min_size > list->max_length); /* else we shouldn't be here */
160 
161 #ifndef DEBUG_LIST_MEMORY_USAGE
162 
163  /*
164  * As above, we prefer power-of-two total allocations; but here we need
165  * not account for list header overhead.
166  */
167 
168  /* clamp the minimum value to 16, a semi-arbitrary small power of 2 */
169  new_max_len = pg_nextpower2_32(Max(16, min_size));
170 
171 #else
172  /* As above, don't allocate anything extra */
173  new_max_len = min_size;
174 #endif
175 
176  if (list->elements == list->initial_elements)
177  {
178  /*
179  * Replace original in-line allocation with a separate palloc block.
180  * Ensure it is in the same memory context as the List header. (The
181  * previous List implementation did not offer any guarantees about
182  * keeping all list cells in the same context, but it seems reasonable
183  * to create such a guarantee now.)
184  */
185  list->elements = (ListCell *)
187  new_max_len * sizeof(ListCell));
188  memcpy(list->elements, list->initial_elements,
189  list->length * sizeof(ListCell));
190 
191  /*
192  * We must not move the list header, so it's unsafe to try to reclaim
193  * the initial_elements[] space via repalloc. In debugging builds,
194  * however, we can clear that space and/or mark it inaccessible.
195  * (wipe_mem includes VALGRIND_MAKE_MEM_NOACCESS.)
196  */
197 #ifdef CLOBBER_FREED_MEMORY
198  wipe_mem(list->initial_elements,
199  list->max_length * sizeof(ListCell));
200 #else
201  VALGRIND_MAKE_MEM_NOACCESS(list->initial_elements,
202  list->max_length * sizeof(ListCell));
203 #endif
204  }
205  else
206  {
207 #ifndef DEBUG_LIST_MEMORY_USAGE
208  /* Normally, let repalloc deal with enlargement */
209  list->elements = (ListCell *) repalloc(list->elements,
210  new_max_len * sizeof(ListCell));
211 #else
212  /*
213  * repalloc() might enlarge the space in-place, which we don't want
214  * for debugging purposes, so forcibly move the data somewhere else.
215  */
216  ListCell *newelements;
217 
218  newelements = (ListCell *)
220  new_max_len * sizeof(ListCell));
221  memcpy(newelements, list->elements,
222  list->length * sizeof(ListCell));
223  pfree(list->elements);
224  list->elements = newelements;
225 #endif
226  }
227 
228  list->max_length = new_max_len;
229 }
#define Max(x, y)
Definition: c.h:985
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
Definition: mcxt.c:1508
void * repalloc(void *pointer, Size size)
Definition: mcxt.c:1528
MemoryContext GetMemoryChunkContext(void *pointer)
Definition: mcxt.c:695
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1168
#define VALGRIND_MAKE_MEM_NOACCESS(addr, size)
Definition: memdebug.h:27
static uint32 pg_nextpower2_32(uint32 num)
Definition: pg_bitutils.h:189
union ListCell ListCell

References Assert(), GetMemoryChunkContext(), sort-test::list, Max, MemoryContextAlloc(), pfree(), pg_nextpower2_32(), repalloc(), and VALGRIND_MAKE_MEM_NOACCESS.

Referenced by insert_new_cell(), list_concat(), new_head_cell(), and new_tail_cell().

◆ insert_new_cell()

static ListCell* insert_new_cell ( List list,
int  pos 
)
static

Definition at line 415 of file list.c.

416 {
417  Assert(pos >= 0 && pos <= list->length);
418 
419  /* Enlarge array if necessary */
420  if (list->length >= list->max_length)
421  enlarge_list(list, list->length + 1);
422  /* Now shove the existing data over */
423  if (pos < list->length)
424  memmove(&list->elements[pos + 1], &list->elements[pos],
425  (list->length - pos) * sizeof(ListCell));
426  list->length++;
427 
428  return &list->elements[pos];
429 }
static void enlarge_list(List *list, int min_size)
Definition: list.c:155

References Assert(), enlarge_list(), and sort-test::list.

Referenced by list_insert_nth(), list_insert_nth_int(), and list_insert_nth_oid().

◆ lappend()

List* lappend ( List list,
void *  datum 
)

Definition at line 339 of file list.c.

340 {
342 
343  if (list == NIL)
344  list = new_list(T_List, 1);
345  else
347 
348  llast(list) = datum;
350  return list;
351 }
static List * new_list(NodeTag type, int min_size)
Definition: list.c:91
#define check_list_invariants(l)
Definition: list.c:80
static void new_tail_cell(List *list)
Definition: list.c:323
#define IsPointerList(l)
Definition: list.c:55
#define llast(l)
Definition: pg_list.h:198
#define NIL
Definition: pg_list.h:68

References Assert(), check_list_invariants, IsPointerList, sort-test::list, llast, new_list(), new_tail_cell(), and NIL.

Referenced by _SPI_make_plan_non_temp(), _SPI_prepare_oneshot_plan(), _SPI_prepare_plan(), _SPI_save_plan(), accumulate_append_subpath(), AcquireRewriteLocks(), add_base_clause_to_rel(), add_column_to_pathtarget(), add_dummy_return(), add_eq_member(), add_join_clause_to_rels(), add_join_rel(), add_local_reloption(), add_merged_range_bounds(), add_outer_joins_to_relids(), add_part_relids(), add_paths_to_append_rel(), add_placeholders_to_base_rels(), add_placeholders_to_joinrel(), add_row_identity_var(), add_rte_to_flat_rtable(), add_security_quals(), add_to_flat_tlist(), add_unique_group_var(), add_vars_to_targetlist(), add_with_check_options(), addArc(), AddEventToPendingNotifies(), addFamilyMember(), addFkRecurseReferencing(), addKey(), addKeyToQueue(), addNSItemToQuery(), addRangeTableEntry(), addRangeTableEntryForCTE(), addRangeTableEntryForENR(), addRangeTableEntryForFunction(), addRangeTableEntryForJoin(), addRangeTableEntryForRelation(), addRangeTableEntryForSubquery(), addRangeTableEntryForTableFunc(), addRangeTableEntryForValues(), AddRelationNewConstraints(), AddRelationNotNullConstraints(), addRTEPermissionInfo(), addTargetToGroupList(), addTargetToSortList(), AlterPublicationTables(), AlterTableMoveAll(), AlterTSDictionary(), analyzeCTE(), analyzeCTETargetList(), append_pathkeys(), apply_child_basequals(), apply_handle_truncate(), apply_scanjoin_target_to_paths(), applyLockingClause(), ApplyRetrieveRule(), array_subscript_transform(), assign_param_for_placeholdervar(), assign_param_for_var(), ATAddCheckNNConstraint(), ATExecAddColumn(), ATExecSetExpression(), ATExecValidateConstraint(), ATGetQueueEntry(), ATParseTransformCmd(), ATPostAlterTypeParse(), ATPrepAddPrimaryKey(), ATPrepAlterColumnType(), ATPrepCmd(), BaseBackupAddTarget(), btcostestimate(), build_aggregate_finalfn_expr(), build_aggregate_transfn_expr(), build_coercion_expression(), build_index_pathkeys(), build_index_paths(), build_index_tlist(), build_join_rel(), build_joinrel_tlist(), build_partition_pathkeys(), build_path_tlist(), build_physical_tlist(), build_remote_returning(), build_subplan(), BuildEventTriggerCache(), BuildOnConflictExcludedTargetlist(), buildRelationAliases(), cached_scansel(), calc_joinrel_size_estimate(), can_minmax_aggs(), check_index_predicates(), check_selective_binary_conversion(), check_sql_fn_retval(), check_tuple_attribute(), checkInsertTargets(), checkSharedDependencies(), checkWellFormedRecursionWalker(), choose_bitmap_and(), ChooseIndexColumnNames(), classifyConditions(), clauselist_apply_dependencies(), CloneFkReferenced(), CloneFkReferencing(), CloneRowTriggersToPartition(), coerce_fn_result_column(), coerce_record_to_complex(), compute_common_attribute(), compute_semi_anti_join_factors(), compute_semijoin_info(), ComputeIndexAttrs(), ComputePartitionAttrs(), consider_groupingsets_paths(), consider_new_or_clause(), convert_ANY_sublink_to_join(), convert_EXISTS_to_ANY(), convert_subquery_pathkeys(), CopyMultiInsertInfoFlush(), CopyMultiInsertInfoSetupBuffer(), cost_incremental_sort(), create_append_plan(), create_bitmap_scan_plan(), create_bitmap_subplan(), create_ctas_nodata(), create_customscan_plan(), create_degenerate_grouping_paths(), create_edata_for_relation(), create_groupingsets_plan(), create_hashjoin_plan(), create_index_paths(), create_indexscan_plan(), create_join_clause(), create_merge_append_plan(), create_nestloop_path(), create_partitionwise_grouping_paths(), create_tidrangescan_plan(), create_tidscan_plan(), create_unique_plan(), CreateStatistics(), database_to_xmlschema_internal(), deconstruct_distribute(), deconstruct_recurse(), DefineRelation(), DefineSequence(), DefineTSDictionary(), DefineView(), DefineVirtualRelation(), deparseFromExprForRel(), deparseParam(), deparseVar(), deserialize_deflist(), determineRecursiveColTypes(), distribute_qual_to_rels(), distribute_row_identity_vars(), do_pg_backup_start(), DoCopy(), dropconstraint_internal(), estimate_multivariate_ndistinct(), estimate_num_groups(), eval_const_expressions_mutator(), EvalPlanQualStart(), EventTriggerAlterTableEnd(), EventTriggerCollectAlterDefPrivs(), EventTriggerCollectAlterOpFam(), EventTriggerCollectAlterTableSubcmd(), EventTriggerCollectAlterTSConfig(), EventTriggerCollectCreateOpClass(), EventTriggerCollectGrant(), EventTriggerCollectSimpleCommand(), Exec_ListenCommit(), ExecAllocTableSlot(), ExecEvalXmlExpr(), ExecGetAncestorResultRels(), ExecGetTriggerResultRel(), ExecInitExprList(), ExecInitExprRec(), ExecInitInsertProjection(), ExecInitLockRows(), ExecInitMerge(), ExecInitModifyTable(), ExecInitNode(), ExecInitPartitionInfo(), ExecInitResultRelation(), ExecInitSubPlan(), ExecInsert(), ExecPrepareExprList(), ExecPushExprSetupSteps(), ExecSerializePlan(), ExecuteGrantStmt(), ExecuteTruncate(), ExecuteTruncateGuts(), expand_grouping_sets(), expand_groupingset_node(), expand_inherited_rtentry(), expand_insert_targetlist(), expand_single_inheritance_child(), expand_vacuum_rel(), expandNSItemAttrs(), expandNSItemVars(), ExpandRowReference(), expandRTE(), expandTableLikeClause(), expandTupleDesc(), ExplainNode(), ExportSnapshot(), expr_setup_walker(), expression_tree_mutator_impl(), extract_actual_clauses(), extract_actual_join_clauses(), extract_jsp_path_expr_nodes(), extract_lateral_references(), extract_nonindex_conditions(), extract_or_clause(), extract_rollup_sets(), extractRemainingColumns(), fetch_remote_table_info(), fetch_statentries_for_relation(), fetch_table_list(), fetch_upper_rel(), FetchTableStates(), file_fdw_validator(), fill_hba_line(), FilterWalSummaries(), find_duplicate_ors(), find_hash_columns(), find_indexpath_quals(), find_list_position(), find_mergeclauses_for_outer_pathkeys(), find_partition_scheme(), find_placeholder_info(), find_window_functions_walker(), find_window_run_conditions(), findTargetlistEntrySQL99(), fireRIRrules(), fireRules(), fix_indexorderby_references(), fix_indexqual_references(), flatten_grouping_sets(), flatten_join_alias_vars_mutator(), flatten_simple_union_all(), fmgr_security_definer(), fmgr_sql_validator(), foreign_grouping_ok(), foreign_join_ok(), format_operator_parts(), format_procedure_parts(), func_get_detail(), gen_partprune_steps_internal(), gen_prune_step_combine(), gen_prune_step_op(), gen_prune_steps_from_opexps(), generate_append_tlist(), generate_base_implied_equalities_const(), generate_bitmap_or_paths(), generate_implied_equalities_for_column(), generate_join_implied_equalities_broken(), generate_join_implied_equalities_normal(), generate_matching_part_pairs(), generate_orderedappend_paths(), generate_partitionwise_join_paths(), generate_setop_tlist(), generate_subquery_params(), generate_subquery_vars(), generate_union_paths(), generateClonedExtStatsStmt(), generateClonedIndexStmt(), generateSerialExtraStmts(), get_actual_clauses(), get_all_vacuum_rels(), get_appendrel_parampathinfo(), get_baserel_parampathinfo(), get_database_list(), get_eclass_for_sort_expr(), get_ext_ver_info(), get_ext_ver_list(), get_file_fdw_attribute_options(), get_foreign_key_join_selectivity(), get_func_expr(), get_index_clause_from_support(), get_index_paths(), get_insert_query_def(), get_join_index_paths(), get_joinrel_parampathinfo(), get_local_synced_slots(), get_matching_part_pairs(), get_merge_query_def(), get_op_btree_interpretation(), get_policies_for_relation(), get_qual_for_hash(), get_qual_for_list(), get_qual_for_range(), get_quals_from_indexclauses(), get_range_nulltest(), get_rel_sync_entry(), get_relation_constraints(), get_relation_foreign_keys(), get_relation_statistics_worker(), get_rels_with_domain(), get_required_extension(), get_sortgrouplist_exprs(), get_steps_using_prefix_recurse(), get_subscription_list(), get_switched_clauses(), get_tables_to_cluster(), get_tables_to_cluster_partitioned(), get_tlist_exprs(), get_update_query_targetlist_def(), get_useful_ecs_for_relation(), get_useful_group_keys_orderings(), get_useful_pathkeys_for_relation(), get_windowfunc_expr_helper(), GetAfterTriggersTableData(), getObjectIdentityParts(), getState(), GetSubscriptionRelations(), getTokenTypes(), GetWalSummaries(), gistFindPath(), gistfixsplit(), gistplacetopage(), group_keys_reorder_by_pathkeys(), groupclause_apply_groupingset(), grouping_planner(), hash_inner_and_outer(), hashagg_spill_finish(), heap_truncate(), identify_current_nestloop_params(), identify_opfamily_groups(), index_concurrently_create_copy(), infer_arbiter_indexes(), init_execution_state(), init_sql_fcache(), initialize_target_list(), InitPlan(), innerrel_is_unique_ext(), interpret_AS_clause(), interpret_function_parameter_list(), intorel_startup(), is_innerrel_unique_for(), join_is_removable(), jsonb_ops__extract_nodes(), jsonb_path_ops__extract_nodes(), jsonb_subscript_transform(), JsonValueListAppend(), list_append_unique(), list_append_unique_ptr(), list_concat_unique(), list_concat_unique_ptr(), list_difference(), list_difference_ptr(), list_intersection(), list_union(), list_union_ptr(), llvm_compile_module(), load_hba(), load_ident(), LoadPublications(), Lock_AF_UNIX(), logicalrep_workers_find(), make_canonical_pathkey(), make_copy_attnamelist(), make_group_input_target(), make_inh_translation_list(), make_inner_pathkeys_for_merge(), make_modifytable(), make_partial_grouping_target(), make_partition_op_expr(), make_partition_pruneinfo(), make_partitionedrel_pruneinfo(), make_path_rowexpr(), make_pathkeys_for_sortclauses_extended(), make_pathtarget_from_tlist(), make_rel_from_joinlist(), make_row_comparison_op(), make_setop_translation_list(), make_sort_input_target(), make_sub_restrictinfos(), make_tlist_from_pathtarget(), make_window_input_target(), makeDependencyGraphWalker(), manifest_process_wal_range(), MarkGUCPrefixReserved(), markRelsAsNulledBy(), match_clause_to_index(), match_clause_to_partition_key(), match_foreign_keys_to_quals(), match_join_clauses_to_index(), match_network_subset(), match_pathkeys_to_index(), match_pattern_prefix(), matchLocks(), mbms_add_member(), mbms_add_members(), merge_clump(), merge_list_bounds(), merge_publications(), MergeAttributes(), MergeCheckConstraint(), negate_clause(), next_field_expand(), nodeRead(), ObjectsInPublicationToOids(), OpenTableList(), order_qual_clauses(), pa_launch_parallel_worker(), paraminfo_get_equal_hashops(), parse_hba_line(), parseCheckAggregates(), ParseFuncOrColumn(), PartConstraintImpliedByRelConstraint(), perform_base_backup(), pg_get_object_address(), pg_get_publication_tables(), pg_logical_slot_get_changes_guts(), pg_plan_queries(), pg_rewrite_query(), pgfdw_abort_cleanup_begin(), pgfdw_finish_abort_cleanup(), pgfdw_finish_pre_commit_cleanup(), pgfdw_subxact_callback(), pgfdw_xact_callback(), pgoutput_row_filter_init(), plan_union_children(), populate_typ_list(), postgresGetForeignPaths(), postgresGetForeignPlan(), postgresImportForeignSchema(), prep_domain_constraints(), prepare_sort_from_pathkeys(), preprocess_aggref(), preprocess_grouping_sets(), preprocess_rowmarks(), preprocess_targetlist(), process_duplicate_ors(), process_equivalence(), process_pipe_input(), process_sublinks_mutator(), process_subquery_nestloop_params(), ProcessStartupPacket(), pull_ands(), pull_ors(), pull_up_simple_values(), pull_up_sublinks_jointree_recurse(), pull_up_sublinks_qual_recurse(), pull_up_union_leaf_queries(), pull_var_clause_walker(), pull_vars_walker(), query_tree_mutator_impl(), QueryRewrite(), queue_listen(), range_table_mutator_impl(), read_tablespace_map(), rebuild_fdw_scan_tlist(), RebuildConstraintComment(), record_plan_function_dependency(), record_plan_type_dependency(), reduce_outer_joins_pass1(), register_ENR(), register_label_provider(), register_reloptions_validator(), ReindexRelationConcurrently(), relation_excluded_by_constraints(), relation_has_unique_index_ext(), RelationCacheInvalidate(), RelationGetDummyIndexExpressions(), RelationGetFKeyList(), RelationGetNotNullConstraints(), remap_to_groupclause_idx(), RememberConstraintForRebuilding(), RememberIndexForRebuilding(), RememberStatisticsForRebuilding(), RememberSyncRequest(), remove_rel_from_joinlist(), remove_self_join_rel(), remove_useless_groupby_columns(), RemoveInheritance(), reorder_function_arguments(), reparameterize_path(), reparameterize_path_by_child(), reparameterize_pathlist_by_child(), replace_empty_jointree(), replace_nestloop_param_placeholdervar(), replace_nestloop_param_var(), replace_outer_agg(), replace_outer_grouping(), replace_outer_merge_support(), report_reduced_full_join(), resolve_unique_index_expr(), RewriteQuery(), rewriteSearchAndCycle(), rewriteTargetListIU(), rewriteTargetView(), rewriteValuesRTE(), rewriteValuesRTEToNulls(), RI_Initial_Check(), ScanSourceDatabasePgClassPage(), schema_to_xmlschema_internal(), SearchCatCacheList(), select_active_windows(), select_mergejoin_clauses(), select_outer_pathkeys_for_merge(), sepgsql_set_client_label(), sequence_options(), set_append_rel_pathlist(), set_append_rel_size(), set_cheapest(), set_deparse_for_query(), set_dummy_tlist_references(), set_indexonlyscan_references(), set_joinrel_partition_key_exprs(), set_plan_references(), set_plan_refs(), set_rtable_names(), set_simple_column_names(), set_subquery_pathlist(), set_upper_references(), set_using_names(), show_eval_params(), show_grouping_set_keys(), show_incremental_sort_group_info(), show_modifytable_info(), show_plan_tlist(), show_sort_group_keys(), show_tablesample(), simplify_and_arguments(), simplify_or_arguments(), split_pathtarget_at_srfs(), split_pathtarget_walker(), split_selfjoin_quals(), SplitDirectoriesString(), SplitGUCList(), SplitIdentifierString(), SS_make_initplan_from_plan(), SS_process_ctes(), statext_is_compatible_clause_internal(), statext_mcv_clauselist_selectivity(), stringToQualifiedNameList(), subquery_planner(), synchronize_slots(), table_slot_create(), textarray_to_stringlist(), textarray_to_strvaluelist(), textToQualifiedNameList(), TidExprListCreate(), TidRangeQualFromRestrictInfoList(), tokenize_auth_file(), tokenize_expand_file(), transform_MERGE_to_join(), transformAExprIn(), transformAggregateCall(), transformAlterTableStmt(), transformArrayExpr(), transformAssignmentIndirection(), transformBoolExpr(), transformCallStmt(), transformCaseExpr(), transformCoalesceExpr(), transformColumnDefinition(), transformCreateSchemaStmtElements(), transformCreateStmt(), transformDistinctClause(), transformDistinctOnClause(), transformExpressionList(), transformFKConstraints(), transformFkeyGetPrimaryKey(), transformFromClause(), transformFromClauseItem(), transformFuncCall(), transformGenericOptions(), transformGroupClause(), transformGroupClauseExpr(), transformGroupingFunc(), transformGroupingSet(), TransformGUCArray(), transformIndexConstraint(), transformIndexConstraints(), transformIndirection(), transformInsertRow(), transformInsertStmt(), transformJoinUsingClause(), transformJsonArrayConstructor(), transformJsonObjectConstructor(), transformMergeStmt(), transformMinMaxExpr(), transformMultiAssignRef(), transformOfType(), transformPartitionBound(), transformPartitionRangeBounds(), transformPartitionSpec(), transformPLAssignStmt(), transformRangeFunction(), transformRangeTableFunc(), transformRangeTableSample(), transformRowExpr(), transformRuleStmt(), transformSetOperationStmt(), transformSetOperationTree(), transformSubLink(), transformTableConstraint(), transformTableLikeClause(), transformTargetList(), transformValuesClause(), transformWindowDefinitions(), transformWindowFuncCall(), transformWithClause(), transformXmlExpr(), trim_mergeclauses_for_inner_pathkeys(), TS_execute_locations_recurse(), untransformRelOptions(), update_eclasses(), UpdateLogicalMappings(), WaitForLockersMultiple(), and xmlelement().

◆ lappend_int()

List* lappend_int ( List list,
int  datum 
)

Definition at line 357 of file list.c.

358 {
360 
361  if (list == NIL)
362  list = new_list(T_IntList, 1);
363  else
365 
366  llast_int(list) = datum;
368  return list;
369 }
#define IsIntegerList(l)
Definition: list.c:56
#define llast_int(l)
Definition: pg_list.h:199

References Assert(), check_list_invariants, IsIntegerList, sort-test::list, llast_int, new_list(), new_tail_cell(), and NIL.

Referenced by add_merged_range_bounds(), addRangeTableEntryForCTE(), addRangeTableEntryForENR(), addRangeTableEntryForFunction(), addRangeTableEntryForSubquery(), AddRelationNotNullConstraints(), adjust_inherited_attnums(), adjust_partition_colnos_using_map(), analyzeCTETargetList(), ATRewriteTable(), build_merged_partition_bounds(), build_subplan(), check_ungrouped_columns_walker(), checkInsertTargets(), convert_EXISTS_to_ANY(), CopyGetAttnums(), deparseAnalyzeSql(), deparseExplicitTargetList(), deparseTargetList(), dropconstraint_internal(), ExecBuildAggTrans(), ExecBuildGroupingEqual(), ExecBuildParamSetEqual(), ExecInitExprRec(), ExecInitQual(), ExecInitSubscriptingRef(), expand_indexqual_rowcompare(), extract_update_targetlist_colnos(), extractRemainingColumns(), fetch_statentries_for_relation(), finalize_grouping_exprs_walker(), find_all_inheritors(), find_compatible_agg(), fix_expr_common(), gen_partprune_steps_internal(), generate_subquery_params(), grouping_planner(), list_append_unique_int(), list_concat_unique_int(), list_difference_int(), list_intersection_int(), list_union_int(), match_pathkeys_to_index(), merge_list_bounds(), nodeRead(), postgresBeginForeignInsert(), postgresPlanForeignModify(), rel_is_distinct_for(), remap_to_groupclause_idx(), RemoveInheritance(), reorder_grouping_sets(), rewriteSearchAndCycle(), set_plan_refs(), split_pathtarget_at_srfs(), SS_process_ctes(), TerminateOtherDBBackends(), transformDistinctOnClause(), transformFromClauseItem(), transformGroupClauseList(), transformRangeTableFunc(), transformSetOperationTree(), transformValuesClause(), and translate_sub_tlist().

◆ lappend_oid()

List* lappend_oid ( List list,
Oid  datum 
)

Definition at line 375 of file list.c.

376 {
378 
379  if (list == NIL)
380  list = new_list(T_OidList, 1);
381  else
383 
384  llast_oid(list) = datum;
386  return list;
387 }
#define IsOidList(l)
Definition: list.c:57
#define llast_oid(l)
Definition: pg_list.h:200

References Assert(), check_list_invariants, IsOidList, sort-test::list, llast_oid, new_list(), new_tail_cell(), and NIL.

Referenced by add_rte_to_flat_rtable(), addRangeTableEntryForCTE(), addRangeTableEntryForENR(), addRangeTableEntryForFunction(), addRangeTableEntryForSubquery(), AfterTriggerSetState(), AlterTableMoveAll(), analyzeCTETargetList(), apply_handle_truncate(), ApplyExtensionUpdates(), assign_collations_walker(), assign_param_for_placeholdervar(), assign_param_for_var(), assign_special_exec_param(), ATExecSetNotNull(), binary_upgrade_create_empty_extension(), check_functional_grouping(), CheckAttributeType(), CloneFkReferenced(), CloneFkReferencing(), compute_semijoin_info(), convert_EXISTS_to_ANY(), create_hashjoin_plan(), create_indexscan_plan(), CreateExtensionInternal(), CreateFunction(), DefineRelation(), do_autovacuum(), dropconstraint_internal(), EventTriggerCommonSetup(), ExecAlterDefaultPrivilegesStmt(), ExecInitPartitionInfo(), ExecInsertIndexTuples(), ExecuteGrantStmt(), ExecuteTruncate(), ExecuteTruncateGuts(), expand_indexqual_rowcompare(), extract_query_dependencies_walker(), ExtractExtensionList(), finalNamespacePath(), find_all_inheritors(), find_inheritance_children_extended(), find_typed_table_dependencies(), fireRIRrules(), fix_expr_common(), generate_new_exec_param(), get_index_ref_constraints(), get_mergejoin_opfamilies(), get_partition_ancestors_worker(), get_steps_using_prefix_recurse(), GetAllTablesPublicationRelations(), GetAllTablesPublications(), getAutoExtensionsOfObject(), getOwnedSequences_internal(), GetParentedForeignKeyRefs(), GetPublicationSchemas(), GetPubPartitionOptionRelations(), GetRelationPublications(), getRelationsInNamespace(), GetSchemaPublicationRelations(), GetSchemaPublications(), heap_truncate_check_FKs(), heap_truncate_find_FKs(), index_concurrently_swap(), infer_arbiter_indexes(), inline_function(), interpret_function_parameter_list(), list_append_unique_oid(), list_concat_unique_oid(), list_difference_oid(), list_union_oid(), LockViewRecurse(), logicalrep_read_truncate(), make_row_comparison_op(), nodeRead(), objectNamesToOids(), objectsInSchemaToOids(), oid_array_to_list(), OpenTableList(), paraminfo_get_equal_hashops(), PreCommit_on_commit_actions(), preprocessNamespacePath(), query_to_oid_list(), ReindexMultipleTables(), ReindexPartitions(), ReindexRelationConcurrently(), rel_is_distinct_for(), relation_is_updatable(), RelationGetIndexList(), RelationGetStatExtList(), RememberConstraintForRebuilding(), RememberIndexForRebuilding(), RememberStatisticsForRebuilding(), remove_dbtablespaces(), replace_outer_agg(), replace_outer_grouping(), replace_outer_merge_support(), RestoreReindexState(), rewriteSearchAndCycle(), roleSpecsToIds(), transformAggregateCall(), transformRangeTableFunc(), transformSetOperationTree(), transformValuesClause(), TryReuseForeignKey(), and typeInheritsFrom().

◆ lappend_xid()

List* lappend_xid ( List list,
TransactionId  datum 
)

Definition at line 393 of file list.c.

394 {
396 
397  if (list == NIL)
398  list = new_list(T_XidList, 1);
399  else
401 
402  llast_xid(list) = datum;
404  return list;
405 }
#define IsXidList(l)
Definition: list.c:58
#define llast_xid(l)
Definition: pg_list.h:201

References Assert(), check_list_invariants, IsXidList, sort-test::list, llast_xid, new_list(), new_tail_cell(), and NIL.

Referenced by nodeRead(), pa_start_subtrans(), and set_schema_sent_in_streamed_txn().

◆ lcons()

List* lcons ( void *  datum,
List list 
)

Definition at line 495 of file list.c.

496 {
498 
499  if (list == NIL)
500  list = new_list(T_List, 1);
501  else
503 
504  linitial(list) = datum;
506  return list;
507 }
static void new_head_cell(List *list)
Definition: list.c:305
#define linitial(l)
Definition: pg_list.h:178

References Assert(), check_list_invariants, IsPointerList, linitial, sort-test::list, new_head_cell(), new_list(), and NIL.

Referenced by build_minmax_path(), checkWellFormedRecursionWalker(), consider_groupingsets_paths(), CreateExprContextInternal(), CreateLockFile(), ExecInitModifyTable(), expandTableLikeClause(), ExplainNode(), ExplainSubPlans(), extract_rollup_sets(), find_expr_references_walker(), find_update_path(), generateSerialExtraStmts(), get_name_for_var_field(), get_object_address_rv(), get_query_def(), get_relation_info(), gistEmptyAllBuffers(), gistFindPath(), gistGetNodeBuffer(), gistPushItupToNodeBuffer(), load_domaintype_info(), makeDependencyGraphWalker(), pg_get_object_address(), plan_union_children(), PLy_subtransaction_enter(), PrepareClientEncoding(), push_child_plan(), pushOperator(), pushStop(), pushValue_internal(), readTimeLineHistory(), register_on_commit_action(), RelationBuildRowSecurity(), RelationCacheInvalidate(), reorder_grouping_sets(), RewriteQuery(), rewriteSearchAndCycle(), rewriteTargetView(), sepgsql_avc_compute(), set_cheapest(), show_agg_keys(), show_group_keys(), sort_inner_and_outer(), and transformCaseExpr().

◆ lcons_int()

List* lcons_int ( int  datum,
List list 
)

Definition at line 513 of file list.c.

514 {
516 
517  if (list == NIL)
518  list = new_list(T_IntList, 1);
519  else
521 
522  linitial_int(list) = datum;
524  return list;
525 }
#define linitial_int(l)
Definition: pg_list.h:179

References Assert(), check_list_invariants, IsIntegerList, linitial_int, sort-test::list, new_head_cell(), new_list(), and NIL.

Referenced by ExecInitAgg(), ExplainBeginOutput(), ExplainOpenGroup(), ExplainOpenSetAsideGroup(), and ExplainRestoreGroup().

◆ lcons_oid()

List* lcons_oid ( Oid  datum,
List list 
)

Definition at line 531 of file list.c.

532 {
534 
535  if (list == NIL)
536  list = new_list(T_OidList, 1);
537  else
539 
540  linitial_oid(list) = datum;
542  return list;
543 }
#define linitial_oid(l)
Definition: pg_list.h:180

References Assert(), check_list_invariants, IsOidList, linitial_oid, sort-test::list, new_head_cell(), new_list(), and NIL.

Referenced by finalNamespacePath(), pg_partition_ancestors(), and ReindexMultipleTables().

◆ list_append_unique()

List* list_append_unique ( List list,
void *  datum 
)

Definition at line 1343 of file list.c.

1344 {
1345  if (list_member(list, datum))
1346  return list;
1347  else
1348  return lappend(list, datum);
1349 }
List * lappend(List *list, void *datum)
Definition: list.c:339
bool list_member(const List *list, const void *datum)
Definition: list.c:661

References lappend(), sort-test::list, and list_member().

Referenced by add_security_quals(), add_with_check_options(), check_publications_origin(), and create_index_paths().

◆ list_append_unique_int()

List* list_append_unique_int ( List list,
int  datum 
)

Definition at line 1368 of file list.c.

1369 {
1370  if (list_member_int(list, datum))
1371  return list;
1372  else
1373  return lappend_int(list, datum);
1374 }
List * lappend_int(List *list, int datum)
Definition: list.c:357
bool list_member_int(const List *list, int datum)
Definition: list.c:702

References lappend_int(), sort-test::list, and list_member_int().

◆ list_append_unique_oid()

List* list_append_unique_oid ( List list,
Oid  datum 
)

Definition at line 1380 of file list.c.

1381 {
1382  if (list_member_oid(list, datum))
1383  return list;
1384  else
1385  return lappend_oid(list, datum);
1386 }
List * lappend_oid(List *list, Oid datum)
Definition: list.c:375
bool list_member_oid(const List *list, Oid datum)
Definition: list.c:722

References lappend_oid(), sort-test::list, and list_member_oid().

Referenced by ATExecAlterConstrRecurse(), btvalidate(), DropRole(), hashvalidate(), heap_truncate_find_FKs(), LogicalRepWorkersWakeupAtCommit(), map_sql_typecoll_to_xmlschema_types(), ObjectsInPublicationToOids(), and roles_is_member_of().

◆ list_append_unique_ptr()

List* list_append_unique_ptr ( List list,
void *  datum 
)

Definition at line 1356 of file list.c.

1357 {
1358  if (list_member_ptr(list, datum))
1359  return list;
1360  else
1361  return lappend(list, datum);
1362 }
bool list_member_ptr(const List *list, const void *datum)
Definition: list.c:682

References lappend(), sort-test::list, and list_member_ptr().

Referenced by get_useful_ecs_for_relation(), postgresGetForeignPaths(), subbuild_joinrel_joinlist(), and subbuild_joinrel_restrictlist().

◆ list_concat()

List* list_concat ( List list1,
const List list2 
)

Definition at line 561 of file list.c.

562 {
563  int new_len;
564 
565  if (list1 == NIL)
566  return list_copy(list2);
567  if (list2 == NIL)
568  return list1;
569 
570  Assert(list1->type == list2->type);
571 
572  new_len = list1->length + list2->length;
573  /* Enlarge array if necessary */
574  if (new_len > list1->max_length)
575  enlarge_list(list1, new_len);
576 
577  /* Even if list1 == list2, using memcpy should be safe here */
578  memcpy(&list1->elements[list1->length], &list2->elements[0],
579  list2->length * sizeof(ListCell));
580  list1->length = new_len;
581 
582  check_list_invariants(list1);
583  return list1;
584 }
List * list_copy(const List *oldlist)
Definition: list.c:1573
int max_length
Definition: pg_list.h:57
int length
Definition: pg_list.h:56
ListCell * elements
Definition: pg_list.h:58
NodeTag type
Definition: pg_list.h:55

References Assert(), check_list_invariants, List::elements, enlarge_list(), List::length, list_copy(), List::max_length, NIL, and List::type.

Referenced by accumulate_append_subpath(), add_predicate_to_index_quals(), addRangeTableEntryForJoin(), addRangeTableEntryForTableFunc(), ATExecAttachPartition(), ATParseTransformCmd(), ATPostAlterTypeParse(), AtSubCommit_Notify(), build_joinrel_restrictlist(), build_paths_for_OR(), check_index_predicates(), choose_bitmap_and(), clean_up_removed_plan_level(), CombineRangeTables(), consider_groupingsets_paths(), ConstraintImpliedByRelConstraint(), cost_index(), create_append_path(), create_append_plan(), create_bitmap_subplan(), create_index_paths(), create_join_plan(), create_one_window_path(), deconstruct_distribute(), deconstruct_recurse(), DefineRelation(), deparseDirectDeleteSql(), deparseDirectUpdateSql(), deparseFromExprForRel(), estimate_path_cost_size(), expand_groupingset_node(), ExpandAllTables(), expandRTE(), extract_or_clause(), extract_rollup_sets(), fileBeginForeignScan(), fileGetOptions(), find_indexpath_quals(), find_mergeclauses_for_outer_pathkeys(), fireRIRrules(), flatten_grouping_sets(), foreign_grouping_ok(), foreign_join_ok(), gen_partprune_steps_internal(), gen_prune_steps_from_opexps(), generate_bitmap_or_paths(), generate_join_implied_equalities(), generate_join_implied_equalities_for_ecs(), generate_join_implied_equalities_normal(), generate_partition_qual(), get_baserel_parampathinfo(), get_batch_size_option(), get_foreign_key_join_selectivity(), get_from_clause_item(), get_index_paths(), get_join_index_paths(), get_joinrel_parampathinfo(), get_relation_constraints(), get_rels_with_domain(), get_steps_using_prefix_recurse(), GetAllSchemaPublicationRelations(), GetPubPartitionOptionRelations(), is_parallel_safe(), objectsInSchemaToOids(), optimize_window_clauses(), PrepareForIncrementalBackup(), process_equivalence(), process_sublinks_mutator(), ProcessUtilitySlow(), pull_ands(), pull_ors(), pull_up_simple_subquery(), reduce_unique_semijoins(), remove_self_join_rel(), remove_self_joins_one_group(), remove_useless_results_recurse(), reorder_grouping_sets(), RewriteQuery(), rewriteRuleAction(), rewriteTargetListIU(), selectColorTrigrams(), set_joinrel_partition_key_exprs(), set_plan_refs(), split_pathtarget_at_srfs(), split_pathtarget_walker(), TidQualFromRestrictInfoList(), transformAExprIn(), transformAlterTableStmt(), transformCreateSchemaStmtElements(), transformCreateStmt(), transformExpressionList(), transformExtendedStatistics(), transformFromClause(), transformFromClauseItem(), transformIndexConstraints(), transformTargetList(), TS_execute_locations_recurse(), and vacuum().

◆ list_concat_copy()

List* list_concat_copy ( const List list1,
const List list2 
)

Definition at line 598 of file list.c.

599 {
600  List *result;
601  int new_len;
602 
603  if (list1 == NIL)
604  return list_copy(list2);
605  if (list2 == NIL)
606  return list_copy(list1);
607 
608  Assert(list1->type == list2->type);
609 
610  new_len = list1->length + list2->length;
611  result = new_list(list1->type, new_len);
612  memcpy(result->elements, list1->elements,
613  list1->length * sizeof(ListCell));
614  memcpy(result->elements + list1->length, list2->elements,
615  list2->length * sizeof(ListCell));
616 
617  check_list_invariants(result);
618  return result;
619 }
Definition: pg_list.h:54

References Assert(), check_list_invariants, List::elements, List::length, list_copy(), new_list(), NIL, and List::type.

Referenced by add_function_defaults(), btadjustmembers(), build_paths_for_OR(), choose_bitmap_and(), cost_subqueryscan(), create_scan_plan(), DefineIndex(), gen_partprune_steps(), generate_bitmap_or_paths(), get_parameterized_baserel_size(), hashadjustmembers(), max_parallel_hazard_walker(), preprocess_targetlist(), process_matched_tle(), set_joinrel_partition_key_exprs(), simplify_and_arguments(), and simplify_or_arguments().

◆ list_concat_unique()

List* list_concat_unique ( List list1,
const List list2 
)

Definition at line 1405 of file list.c.

1406 {
1407  ListCell *cell;
1408 
1409  Assert(IsPointerList(list1));
1410  Assert(IsPointerList(list2));
1411 
1412  foreach(cell, list2)
1413  {
1414  if (!list_member(list1, lfirst(cell)))
1415  list1 = lappend(list1, lfirst(cell));
1416  }
1417 
1418  check_list_invariants(list1);
1419  return list1;
1420 }
#define lfirst(lc)
Definition: pg_list.h:172

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, and list_member().

Referenced by create_bitmap_subplan(), and select_active_windows().

◆ list_concat_unique_int()

List* list_concat_unique_int ( List list1,
const List list2 
)

Definition at line 1448 of file list.c.

1449 {
1450  ListCell *cell;
1451 
1452  Assert(IsIntegerList(list1));
1453  Assert(IsIntegerList(list2));
1454 
1455  foreach(cell, list2)
1456  {
1457  if (!list_member_int(list1, lfirst_int(cell)))
1458  list1 = lappend_int(list1, lfirst_int(cell));
1459  }
1460 
1461  check_list_invariants(list1);
1462  return list1;
1463 }
#define lfirst_int(lc)
Definition: pg_list.h:173

References Assert(), check_list_invariants, IsIntegerList, lappend_int(), lfirst_int, and list_member_int().

◆ list_concat_unique_oid()

List* list_concat_unique_oid ( List list1,
const List list2 
)

Definition at line 1469 of file list.c.

1470 {
1471  ListCell *cell;
1472 
1473  Assert(IsOidList(list1));
1474  Assert(IsOidList(list2));
1475 
1476  foreach(cell, list2)
1477  {
1478  if (!list_member_oid(list1, lfirst_oid(cell)))
1479  list1 = lappend_oid(list1, lfirst_oid(cell));
1480  }
1481 
1482  check_list_invariants(list1);
1483  return list1;
1484 }
#define lfirst_oid(lc)
Definition: pg_list.h:174

References Assert(), check_list_invariants, IsOidList, lappend_oid(), lfirst_oid, and list_member_oid().

Referenced by AlterPublicationOptions(), GetSchemaPublicationRelations(), pg_get_publication_tables(), and RelationBuildPublicationDesc().

◆ list_concat_unique_ptr()

List* list_concat_unique_ptr ( List list1,
const List list2 
)

Definition at line 1427 of file list.c.

1428 {
1429  ListCell *cell;
1430 
1431  Assert(IsPointerList(list1));
1432  Assert(IsPointerList(list2));
1433 
1434  foreach(cell, list2)
1435  {
1436  if (!list_member_ptr(list1, lfirst(cell)))
1437  list1 = lappend(list1, lfirst(cell));
1438  }
1439 
1440  check_list_invariants(list1);
1441  return list1;
1442 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, and list_member_ptr().

Referenced by group_keys_reorder_by_pathkeys().

◆ list_copy()

List* list_copy ( const List oldlist)

Definition at line 1573 of file list.c.

1574 {
1575  List *newlist;
1576 
1577  if (oldlist == NIL)
1578  return NIL;
1579 
1580  newlist = new_list(oldlist->type, oldlist->length);
1581  memcpy(newlist->elements, oldlist->elements,
1582  newlist->length * sizeof(ListCell));
1583 
1584  check_list_invariants(newlist);
1585  return newlist;
1586 }

References check_list_invariants, List::elements, List::length, new_list(), NIL, and List::type.

Referenced by addRangeTableEntryForCTE(), adjust_group_pathkeys_for_groupagg(), arrayconst_startup_fn(), arrayexpr_startup_fn(), build_subplan(), check_index_predicates(), check_publications(), consider_groupingsets_paths(), ConstraintImpliedByRelConstraint(), copy_pathtarget(), copyObjectImpl(), CopySearchPathMatcher(), EventTriggerCollectGrant(), ExecuteTruncateGuts(), expression_tree_mutator_impl(), fetch_search_path(), foreign_join_ok(), generate_mergejoin_paths(), generateSerialExtraStmts(), get_eclass_for_sort_expr(), get_foreign_key_join_selectivity(), get_query_def(), get_required_extension(), get_steps_using_prefix_recurse(), get_switched_clauses(), get_useful_pathkeys_for_relation(), GetSearchPathMatcher(), grouping_planner(), heap_truncate_find_FKs(), list_concat(), list_concat_copy(), list_difference(), list_difference_int(), list_difference_oid(), list_difference_ptr(), list_union(), list_union_int(), list_union_oid(), list_union_ptr(), merge_publications(), plpgsql_parse_cwordtype(), recomputeNamespacePath(), RelationGetIndexList(), RelationGetStatExtList(), remove_leftjoinrel_from_query(), remove_self_join_rel(), reorder_grouping_sets(), roles_is_member_of(), select_active_windows(), select_outer_pathkeys_for_merge(), set_joinrel_partition_key_exprs(), set_using_names(), SetReindexPending(), simplify_and_arguments(), simplify_or_arguments(), sort_inner_and_outer(), standard_qp_callback(), transformPLAssignStmt(), transformWithClause(), and WalSummariesAreComplete().

◆ list_copy_deep()

List* list_copy_deep ( const List oldlist)

Definition at line 1639 of file list.c.

1640 {
1641  List *newlist;
1642 
1643  if (oldlist == NIL)
1644  return NIL;
1645 
1646  /* This is only sensible for pointer Lists */
1647  Assert(IsA(oldlist, List));
1648 
1649  newlist = new_list(oldlist->type, oldlist->length);
1650  for (int i = 0; i < newlist->length; i++)
1651  lfirst(&newlist->elements[i]) =
1652  copyObjectImpl(lfirst(&oldlist->elements[i]));
1653 
1654  check_list_invariants(newlist);
1655  return newlist;
1656 }
void * copyObjectImpl(const void *from)
Definition: copyfuncs.c:177
int i
Definition: isn.c:73
#define IsA(nodeptr, _type_)
Definition: nodes.h:158

References Assert(), check_list_invariants, copyObjectImpl(), List::elements, i, IsA, List::length, lfirst, new_list(), NIL, and List::type.

Referenced by copyObjectImpl().

◆ list_copy_head()

List* list_copy_head ( const List oldlist,
int  len 
)

◆ list_copy_tail()

List* list_copy_tail ( const List oldlist,
int  nskip 
)

Definition at line 1613 of file list.c.

1614 {
1615  List *newlist;
1616 
1617  if (nskip < 0)
1618  nskip = 0; /* would it be better to elog? */
1619 
1620  if (oldlist == NIL || nskip >= oldlist->length)
1621  return NIL;
1622 
1623  newlist = new_list(oldlist->type, oldlist->length - nskip);
1624  memcpy(newlist->elements, &oldlist->elements[nskip],
1625  newlist->length * sizeof(ListCell));
1626 
1627  check_list_invariants(newlist);
1628  return newlist;
1629 }

References check_list_invariants, List::elements, List::length, new_list(), NIL, and List::type.

Referenced by accumulate_append_subpath(), addRangeTableEntryForJoin(), addRangeTableEntryForTableFunc(), does_not_exist_skipping(), expandRTE(), get_name_for_var_field(), get_object_address_opcf(), ParseFuncOrColumn(), push_ancestor_plan(), and transformAggregateCall().

◆ list_deduplicate_oid()

void list_deduplicate_oid ( List list)

Definition at line 1495 of file list.c.

1496 {
1497  int len;
1498 
1499  Assert(IsOidList(list));
1500  len = list_length(list);
1501  if (len > 1)
1502  {
1503  ListCell *elements = list->elements;
1504  int i = 0;
1505 
1506  for (int j = 1; j < len; j++)
1507  {
1508  if (elements[i].oid_value != elements[j].oid_value)
1509  elements[++i].oid_value = elements[j].oid_value;
1510  }
1511  list->length = i + 1;
1512  }
1514 }
int j
Definition: isn.c:74
static int list_length(const List *l)
Definition: pg_list.h:152
Oid oid_value
Definition: pg_list.h:49

References Assert(), check_list_invariants, i, IsOidList, j, len, sort-test::list, list_length(), and ListCell::oid_value.

Referenced by GetPublicationRelations(), and heap_truncate_find_FKs().

◆ list_delete()

List* list_delete ( List list,
void *  datum 
)

Definition at line 853 of file list.c.

854 {
855  ListCell *cell;
856 
859 
860  foreach(cell, list)
861  {
862  if (equal(lfirst(cell), datum))
863  return list_delete_cell(list, cell);
864  }
865 
866  /* Didn't find a match: return the list unmodified */
867  return list;
868 }
bool equal(const void *a, const void *b)
Definition: equalfuncs.c:223
List * list_delete_cell(List *list, ListCell *cell)
Definition: list.c:841

References Assert(), check_list_invariants, equal(), IsPointerList, lfirst, sort-test::list, and list_delete_cell().

Referenced by check_publications(), postgresGetForeignPlan(), and unregister_ENR().

◆ list_delete_cell()

List* list_delete_cell ( List list,
ListCell cell 
)

Definition at line 841 of file list.c.

842 {
843  return list_delete_nth_cell(list, cell - list->elements);
844 }
List * list_delete_nth_cell(List *list, int n)
Definition: list.c:767

References sort-test::list, and list_delete_nth_cell().

Referenced by list_delete(), list_delete_int(), list_delete_oid(), list_delete_ptr(), remove_useless_joins(), and transformGenericOptions().

◆ list_delete_first()

◆ list_delete_first_n()

List* list_delete_first_n ( List list,
int  n 
)

Definition at line 983 of file list.c.

984 {
986 
987  /* No-op request? */
988  if (n <= 0)
989  return list;
990 
991  /* Delete whole list? */
992  if (n >= list_length(list))
993  {
994  list_free(list);
995  return NIL;
996  }
997 
998  /*
999  * Otherwise, we normally just collapse out the removed elements. But for
1000  * debugging purposes, move the whole list contents someplace else.
1001  *
1002  * (Note that we *must* keep the contents in the same memory context.)
1003  */
1004 #ifndef DEBUG_LIST_MEMORY_USAGE
1005  memmove(&list->elements[0], &list->elements[n],
1006  (list->length - n) * sizeof(ListCell));
1007  list->length -= n;
1008 #else
1009  {
1010  ListCell *newelems;
1011  int newmaxlen = list->length - n;
1012 
1013  newelems = (ListCell *)
1015  newmaxlen * sizeof(ListCell));
1016  memcpy(newelems, &list->elements[n], newmaxlen * sizeof(ListCell));
1017  if (list->elements != list->initial_elements)
1018  pfree(list->elements);
1019  else
1020  {
1021  /*
1022  * As in enlarge_list(), clear the initial_elements[] space and/or
1023  * mark it inaccessible.
1024  */
1025 #ifdef CLOBBER_FREED_MEMORY
1026  wipe_mem(list->initial_elements,
1027  list->max_length * sizeof(ListCell));
1028 #else
1029  VALGRIND_MAKE_MEM_NOACCESS(list->initial_elements,
1030  list->max_length * sizeof(ListCell));
1031 #endif
1032  }
1033  list->elements = newelems;
1034  list->max_length = newmaxlen;
1035  list->length = newmaxlen;
1037  }
1038 #endif
1039 
1040  return list;
1041 }
void list_free(List *list)
Definition: list.c:1546

References check_list_invariants, GetMemoryChunkContext(), sort-test::list, list_free(), list_length(), MemoryContextAlloc(), NIL, pfree(), and VALGRIND_MAKE_MEM_NOACCESS.

Referenced by add_function_defaults(), func_get_detail(), and SyncPostCheckpoint().

◆ list_delete_int()

List* list_delete_int ( List list,
int  datum 
)

Definition at line 891 of file list.c.

892 {
893  ListCell *cell;
894 
897 
898  foreach(cell, list)
899  {
900  if (lfirst_int(cell) == datum)
901  return list_delete_cell(list, cell);
902  }
903 
904  /* Didn't find a match: return the list unmodified */
905  return list;
906 }

References Assert(), check_list_invariants, IsIntegerList, lfirst_int, sort-test::list, and list_delete_cell().

Referenced by reorder_grouping_sets().

◆ list_delete_last()

List* list_delete_last ( List list)

Definition at line 957 of file list.c.

958 {
960 
961  if (list == NIL)
962  return NIL; /* would an error be better? */
963 
964  /* list_truncate won't free list if it goes to empty, but this should */
965  if (list_length(list) <= 1)
966  {
967  list_free(list);
968  return NIL;
969  }
970 
971  return list_truncate(list, list_length(list) - 1);
972 }
List * list_truncate(List *list, int new_size)
Definition: list.c:631

References check_list_invariants, sort-test::list, list_free(), list_length(), list_truncate(), and NIL.

Referenced by agg_refill_hash_table(), CheckAttributeType(), fireRIRrules(), inline_function(), LockViewRecurse(), plpgsql_parse_cwordtype(), relation_is_updatable(), RewriteQuery(), transformMultiAssignRef(), and transformOnConflictClause().

◆ list_delete_nth_cell()

List* list_delete_nth_cell ( List list,
int  n 
)

Definition at line 767 of file list.c.

768 {
770 
771  Assert(n >= 0 && n < list->length);
772 
773  /*
774  * If we're about to delete the last node from the list, free the whole
775  * list instead and return NIL, which is the only valid representation of
776  * a zero-length list.
777  */
778  if (list->length == 1)
779  {
780  list_free(list);
781  return NIL;
782  }
783 
784  /*
785  * Otherwise, we normally just collapse out the removed element. But for
786  * debugging purposes, move the whole list contents someplace else.
787  *
788  * (Note that we *must* keep the contents in the same memory context.)
789  */
790 #ifndef DEBUG_LIST_MEMORY_USAGE
791  memmove(&list->elements[n], &list->elements[n + 1],
792  (list->length - 1 - n) * sizeof(ListCell));
793  list->length--;
794 #else
795  {
796  ListCell *newelems;
797  int newmaxlen = list->length - 1;
798 
799  newelems = (ListCell *)
801  newmaxlen * sizeof(ListCell));
802  memcpy(newelems, list->elements, n * sizeof(ListCell));
803  memcpy(&newelems[n], &list->elements[n + 1],
804  (list->length - 1 - n) * sizeof(ListCell));
805  if (list->elements != list->initial_elements)
806  pfree(list->elements);
807  else
808  {
809  /*
810  * As in enlarge_list(), clear the initial_elements[] space and/or
811  * mark it inaccessible.
812  */
813 #ifdef CLOBBER_FREED_MEMORY
814  wipe_mem(list->initial_elements,
815  list->max_length * sizeof(ListCell));
816 #else
817  VALGRIND_MAKE_MEM_NOACCESS(list->initial_elements,
818  list->max_length * sizeof(ListCell));
819 #endif
820  }
821  list->elements = newelems;
822  list->max_length = newmaxlen;
823  list->length--;
825  }
826 #endif
827 
828  return list;
829 }

References Assert(), check_list_invariants, GetMemoryChunkContext(), sort-test::list, list_free(), MemoryContextAlloc(), NIL, pfree(), and VALGRIND_MAKE_MEM_NOACCESS.

Referenced by AddRelationNotNullConstraints(), generateSerialExtraStmts(), list_delete_cell(), list_delete_first(), MergeAttributes(), process_equivalence(), reconsider_full_join_clause(), and sort_inner_and_outer().

◆ list_delete_oid()

List* list_delete_oid ( List list,
Oid  datum 
)

Definition at line 910 of file list.c.

911 {
912  ListCell *cell;
913 
916 
917  foreach(cell, list)
918  {
919  if (lfirst_oid(cell) == datum)
920  return list_delete_cell(list, cell);
921  }
922 
923  /* Didn't find a match: return the list unmodified */
924  return list;
925 }

References Assert(), check_list_invariants, IsOidList, lfirst_oid, sort-test::list, and list_delete_cell().

Referenced by RemoveReindexPending().

◆ list_delete_ptr()

List* list_delete_ptr ( List list,
void *  datum 
)

Definition at line 872 of file list.c.

873 {
874  ListCell *cell;
875 
878 
879  foreach(cell, list)
880  {
881  if (lfirst(cell) == datum)
882  return list_delete_cell(list, cell);
883  }
884 
885  /* Didn't find a match: return the list unmodified */
886  return list;
887 }

References Assert(), check_list_invariants, IsPointerList, lfirst, sort-test::list, and list_delete_cell().

Referenced by FreeExprContext(), pa_free_worker_info(), remove_join_clause_from_rels(), and remove_self_join_rel().

◆ list_difference()

List* list_difference ( const List list1,
const List list2 
)

Definition at line 1237 of file list.c.

1238 {
1239  const ListCell *cell;
1240  List *result = NIL;
1241 
1242  Assert(IsPointerList(list1));
1243  Assert(IsPointerList(list2));
1244 
1245  if (list2 == NIL)
1246  return list_copy(list1);
1247 
1248  foreach(cell, list1)
1249  {
1250  if (!list_member(list2, lfirst(cell)))
1251  result = lappend(result, lfirst(cell));
1252  }
1253 
1254  check_list_invariants(result);
1255  return result;
1256 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, list_copy(), list_member(), and NIL.

Referenced by create_hashjoin_plan(), create_mergejoin_plan(), create_tidscan_plan(), infer_arbiter_indexes(), and process_duplicate_ors().

◆ list_difference_int()

List* list_difference_int ( const List list1,
const List list2 
)

Definition at line 1288 of file list.c.

1289 {
1290  const ListCell *cell;
1291  List *result = NIL;
1292 
1293  Assert(IsIntegerList(list1));
1294  Assert(IsIntegerList(list2));
1295 
1296  if (list2 == NIL)
1297  return list_copy(list1);
1298 
1299  foreach(cell, list1)
1300  {
1301  if (!list_member_int(list2, lfirst_int(cell)))
1302  result = lappend_int(result, lfirst_int(cell));
1303  }
1304 
1305  check_list_invariants(result);
1306  return result;
1307 }

References Assert(), check_list_invariants, IsIntegerList, lappend_int(), lfirst_int, list_copy(), list_member_int(), and NIL.

Referenced by reorder_grouping_sets().

◆ list_difference_oid()

List* list_difference_oid ( const List list1,
const List list2 
)

Definition at line 1313 of file list.c.

1314 {
1315  const ListCell *cell;
1316  List *result = NIL;
1317 
1318  Assert(IsOidList(list1));
1319  Assert(IsOidList(list2));
1320 
1321  if (list2 == NIL)
1322  return list_copy(list1);
1323 
1324  foreach(cell, list1)
1325  {
1326  if (!list_member_oid(list2, lfirst_oid(cell)))
1327  result = lappend_oid(result, lfirst_oid(cell));
1328  }
1329 
1330  check_list_invariants(result);
1331  return result;
1332 }

References Assert(), check_list_invariants, IsOidList, lappend_oid(), lfirst_oid, list_copy(), list_member_oid(), and NIL.

Referenced by AlterPublicationSchemas().

◆ list_difference_ptr()

List* list_difference_ptr ( const List list1,
const List list2 
)

Definition at line 1263 of file list.c.

1264 {
1265  const ListCell *cell;
1266  List *result = NIL;
1267 
1268  Assert(IsPointerList(list1));
1269  Assert(IsPointerList(list2));
1270 
1271  if (list2 == NIL)
1272  return list_copy(list1);
1273 
1274  foreach(cell, list1)
1275  {
1276  if (!list_member_ptr(list2, lfirst(cell)))
1277  result = lappend(result, lfirst(cell));
1278  }
1279 
1280  check_list_invariants(result);
1281  return result;
1282 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, list_copy(), list_member_ptr(), and NIL.

Referenced by create_bitmap_scan_plan(), and ExecuteTruncateGuts().

◆ list_free()

void list_free ( List list)

Definition at line 1546 of file list.c.

1547 {
1548  list_free_private(list, false);
1549 }
static void list_free_private(List *list, bool deep)
Definition: list.c:1520

References sort-test::list, and list_free_private().

Referenced by AfterTriggerSetState(), AlterIndexNamespaces(), arrayconst_cleanup_fn(), arrayexpr_cleanup_fn(), ATCheckPartitionsNotInUse(), ATExecChangeOwner(), ATExecSetTableSpace(), build_base_rel_tlists(), build_column_default(), build_remote_returning(), BuildRelationExtStatistics(), cachedNamespacePath(), calc_joinrel_size_estimate(), calculate_indexes_size(), calculate_toast_table_size(), check_createrole_self_grant(), check_datestyle(), check_debug_io_direct(), check_log_destination(), check_search_path(), check_standby_slot_names(), check_temp_tablespaces(), check_wal_consistency_checking(), choose_bitmap_and(), compute_semi_anti_join_factors(), CopyFrom(), CopyMultiInsertBufferFlush(), CopyMultiInsertInfoCleanup(), CreateExtensionInternal(), CreateTriggerFiringOn(), current_schema(), current_schemas(), DefineIndex(), DefineRelation(), deparseFromExprForRel(), distribute_qual_to_rels(), do_analyze_rel(), DropSubscription(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerOnLogin(), EventTriggerSQLDrop(), EventTriggerTableRewrite(), ExecInitPartitionInfo(), ExecInsert(), ExecOpenIndices(), ExecPendingInserts(), ExecRefreshMatView(), ExecResetTupleTable(), ExecSimpleRelationInsert(), ExecSimpleRelationUpdate(), ExecUpdateEpilogue(), extract_lateral_references(), ExtractExtensionList(), find_all_inheritors(), find_compatible_agg(), find_computable_ec_member(), find_hash_columns(), find_placeholders_in_expr(), fix_placeholder_input_needed_levels(), generate_base_implied_equalities_no_const(), generate_partitionwise_join_paths(), get_rel_sync_entry(), get_relation_info(), get_relation_statistics(), get_steps_using_prefix_recurse(), get_windowclause_startup_tuples(), GetTopMostAncestorInPublication(), group_keys_reorder_by_pathkeys(), heap_truncate_find_FKs(), index_concurrently_swap(), index_get_partition(), index_unchanged_by_update(), infer_arbiter_indexes(), list_delete_first_n(), list_delete_last(), list_delete_nth_cell(), llvm_release_context(), make_group_input_target(), make_partial_grouping_target(), make_sort_input_target(), make_window_input_target(), max_parallel_hazard_walker(), merge_list_bounds(), merge_range_bounds(), ObjectsInPublicationToOids(), OpenTableList(), paraminfo_get_equal_hashops(), parse_hba_auth_opt(), pg_partition_root(), plpgsql_extra_checks_check_hook(), pop_ancestor_plan(), PostmasterMain(), PrepareTempTablespaces(), preprocess_targetlist(), preprocessNamespacePath(), process_implied_equality(), ProcessGUCArray(), processState(), ProcessUtilitySlow(), qual_is_pushdown_safe(), recomputeNamespacePath(), refresh_by_match_merge(), RelationCacheInvalidate(), RelationDestroyRelation(), RelationGetIndexAttrBitmap(), RelationGetIndexList(), RelationGetPrimaryKeyIndex(), RelationGetReplicaIndex(), RelationGetStatExtList(), relationHasPrimaryKey(), remove_dbtablespaces(), remove_self_join_rel(), reorder_grouping_sets(), reparameterize_pathlist_by_child(), roles_is_member_of(), sepgsql_dml_privileges(), simplify_and_arguments(), simplify_or_arguments(), statext_mcv_clauselist_selectivity(), stringToQualifiedNameList(), textToQualifiedNameList(), toast_open_indexes(), transformFkeyCheckAttrs(), transformFkeyGetPrimaryKey(), transformTableLikeClause(), transformValuesClause(), triggered_change_notification(), typeInheritsFrom(), update_eclasses(), vac_open_indexes(), and WaitForLockers().

◆ list_free_deep()

◆ list_free_private()

static void list_free_private ( List list,
bool  deep 
)
static

Definition at line 1520 of file list.c.

1521 {
1522  if (list == NIL)
1523  return; /* nothing to do */
1524 
1526 
1527  if (deep)
1528  {
1529  for (int i = 0; i < list->length; i++)
1530  pfree(lfirst(&list->elements[i]));
1531  }
1532  if (list->elements != list->initial_elements)
1533  pfree(list->elements);
1534  pfree(list);
1535 }

References check_list_invariants, i, lfirst, sort-test::list, NIL, and pfree().

Referenced by list_free(), and list_free_deep().

◆ list_insert_nth()

List* list_insert_nth ( List list,
int  pos,
void *  datum 
)

Definition at line 439 of file list.c.

440 {
441  if (list == NIL)
442  {
443  Assert(pos == 0);
444  return list_make1(datum);
445  }
447  lfirst(insert_new_cell(list, pos)) = datum;
449  return list;
450 }
static ListCell * insert_new_cell(List *list, int pos)
Definition: list.c:415
#define list_make1(x1)
Definition: pg_list.h:212

References Assert(), check_list_invariants, insert_new_cell(), IsPointerList, lfirst, sort-test::list, list_make1, and NIL.

Referenced by add_partial_path(), add_path(), and merge_clump().

◆ list_insert_nth_int()

List* list_insert_nth_int ( List list,
int  pos,
int  datum 
)

Definition at line 453 of file list.c.

454 {
455  if (list == NIL)
456  {
457  Assert(pos == 0);
458  return list_make1_int(datum);
459  }
461  lfirst_int(insert_new_cell(list, pos)) = datum;
463  return list;
464 }
#define list_make1_int(x1)
Definition: pg_list.h:227

References Assert(), check_list_invariants, insert_new_cell(), IsIntegerList, lfirst_int, sort-test::list, list_make1_int, and NIL.

◆ list_insert_nth_oid()

List* list_insert_nth_oid ( List list,
int  pos,
Oid  datum 
)

Definition at line 467 of file list.c.

468 {
469  if (list == NIL)
470  {
471  Assert(pos == 0);
472  return list_make1_oid(datum);
473  }
475  lfirst_oid(insert_new_cell(list, pos)) = datum;
477  return list;
478 }
#define list_make1_oid(x1)
Definition: pg_list.h:242

References Assert(), check_list_invariants, insert_new_cell(), IsOidList, lfirst_oid, sort-test::list, list_make1_oid, and NIL.

◆ list_int_cmp()

int list_int_cmp ( const ListCell p1,
const ListCell p2 
)

Definition at line 1691 of file list.c.

1692 {
1693  int v1 = lfirst_int(p1);
1694  int v2 = lfirst_int(p2);
1695 
1696  return pg_cmp_s32(v1, v2);
1697 }
static int pg_cmp_s32(int32 a, int32 b)
Definition: int.h:483

References lfirst_int, p2, and pg_cmp_s32().

Referenced by expand_grouping_sets().

◆ list_intersection()

List* list_intersection ( const List list1,
const List list2 
)

Definition at line 1174 of file list.c.

1175 {
1176  List *result;
1177  const ListCell *cell;
1178 
1179  if (list1 == NIL || list2 == NIL)
1180  return NIL;
1181 
1182  Assert(IsPointerList(list1));
1183  Assert(IsPointerList(list2));
1184 
1185  result = NIL;
1186  foreach(cell, list1)
1187  {
1188  if (list_member(list2, lfirst(cell)))
1189  result = lappend(result, lfirst(cell));
1190  }
1191 
1192  check_list_invariants(result);
1193  return result;
1194 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, list_member(), and NIL.

◆ list_intersection_int()

List* list_intersection_int ( const List list1,
const List list2 
)

Definition at line 1200 of file list.c.

1201 {
1202  List *result;
1203  const ListCell *cell;
1204 
1205  if (list1 == NIL || list2 == NIL)
1206  return NIL;
1207 
1208  Assert(IsIntegerList(list1));
1209  Assert(IsIntegerList(list2));
1210 
1211  result = NIL;
1212  foreach(cell, list1)
1213  {
1214  if (list_member_int(list2, lfirst_int(cell)))
1215  result = lappend_int(result, lfirst_int(cell));
1216  }
1217 
1218  check_list_invariants(result);
1219  return result;
1220 }

References Assert(), check_list_invariants, IsIntegerList, lappend_int(), lfirst_int, list_member_int(), and NIL.

Referenced by parseCheckAggregates().

◆ list_make1_impl()

List* list_make1_impl ( NodeTag  t,
ListCell  datum1 
)

Definition at line 236 of file list.c.

237 {
238  List *list = new_list(t, 1);
239 
240  list->elements[0] = datum1;
242  return list;
243 }

References check_list_invariants, sort-test::list, and new_list().

◆ list_make2_impl()

List* list_make2_impl ( NodeTag  t,
ListCell  datum1,
ListCell  datum2 
)

Definition at line 246 of file list.c.

247 {
248  List *list = new_list(t, 2);
249 
250  list->elements[0] = datum1;
251  list->elements[1] = datum2;
253  return list;
254 }

References check_list_invariants, sort-test::list, and new_list().

◆ list_make3_impl()

List* list_make3_impl ( NodeTag  t,
ListCell  datum1,
ListCell  datum2,
ListCell  datum3 
)

Definition at line 257 of file list.c.

259 {
260  List *list = new_list(t, 3);
261 
262  list->elements[0] = datum1;
263  list->elements[1] = datum2;
264  list->elements[2] = datum3;
266  return list;
267 }

References check_list_invariants, sort-test::list, and new_list().

◆ list_make4_impl()

List* list_make4_impl ( NodeTag  t,
ListCell  datum1,
ListCell  datum2,
ListCell  datum3,
ListCell  datum4 
)

Definition at line 270 of file list.c.

272 {
273  List *list = new_list(t, 4);
274 
275  list->elements[0] = datum1;
276  list->elements[1] = datum2;
277  list->elements[2] = datum3;
278  list->elements[3] = datum4;
280  return list;
281 }

References check_list_invariants, sort-test::list, and new_list().

◆ list_make5_impl()

List* list_make5_impl ( NodeTag  t,
ListCell  datum1,
ListCell  datum2,
ListCell  datum3,
ListCell  datum4,
ListCell  datum5 
)

Definition at line 284 of file list.c.

286 {
287  List *list = new_list(t, 5);
288 
289  list->elements[0] = datum1;
290  list->elements[1] = datum2;
291  list->elements[2] = datum3;
292  list->elements[3] = datum4;
293  list->elements[4] = datum5;
295  return list;
296 }

References check_list_invariants, sort-test::list, and new_list().

◆ list_member()

◆ list_member_int()

◆ list_member_oid()

bool list_member_oid ( const List list,
Oid  datum 
)

Definition at line 722 of file list.c.

723 {
724  const ListCell *cell;
725 
728 
729  foreach(cell, list)
730  {
731  if (lfirst_oid(cell) == datum)
732  return true;
733  }
734 
735  return false;
736 }

References Assert(), check_list_invariants, IsOidList, lfirst_oid, and sort-test::list.

Referenced by AfterTriggerSaveEvent(), AlterTableMoveAll(), apply_handle_truncate(), ATExecAddInherit(), ATExecAttachPartition(), ATExecSetNotNull(), BeginCopyTo(), CheckAttributeType(), CloneFkReferenced(), CloneFkReferencing(), CollationIsVisibleExt(), ConversionIsVisibleExt(), DefineRelation(), dropconstraint_internal(), ec_member_matches_indexcol(), ExecAlterObjectDependsStmt(), ExecCheckIndexConstraints(), ExecInitPartitionInfo(), ExecInsertIndexTuples(), ExecuteTruncate(), finalNamespacePath(), fireRIRrules(), FunctionIsVisibleExt(), get_rel_sync_entry(), get_transform_fromsql(), get_transform_tosql(), GetTopMostAncestorInPublication(), has_privs_of_role(), hashvalidate(), have_partkey_equi_join(), heap_truncate_check_FKs(), heap_truncate_find_FKs(), inline_function(), is_member_of_role(), is_member_of_role_nosuper(), list_append_unique_oid(), list_concat_unique_oid(), list_difference_oid(), list_union_oid(), LockViewRecurse_walker(), lookup_shippable(), member_can_set_role(), OpclassIsVisibleExt(), OpenTableList(), OperatorIsVisibleExt(), OpfamilyIsVisibleExt(), PlanCacheRelCallback(), ReindexIsProcessingIndex(), relation_has_unique_index_ext(), relation_is_updatable(), RelationIsVisibleExt(), RememberConstraintForRebuilding(), RememberIndexForRebuilding(), RememberStatisticsForRebuilding(), StatisticsObjIsVisibleExt(), TSConfigIsVisibleExt(), TSDictionaryIsVisibleExt(), TSParserIsVisibleExt(), TSTemplateIsVisibleExt(), typeInheritsFrom(), and TypeIsVisibleExt().

◆ list_member_ptr()

bool list_member_ptr ( const List list,
const void *  datum 
)

◆ list_member_xid()

bool list_member_xid ( const List list,
TransactionId  datum 
)

Definition at line 742 of file list.c.

743 {
744  const ListCell *cell;
745 
748 
749  foreach(cell, list)
750  {
751  if (lfirst_xid(cell) == datum)
752  return true;
753  }
754 
755  return false;
756 }
#define lfirst_xid(lc)
Definition: pg_list.h:175

References Assert(), check_list_invariants, IsXidList, lfirst_xid, and sort-test::list.

Referenced by get_schema_sent_in_streamed_txn(), and pa_start_subtrans().

◆ list_oid_cmp()

int list_oid_cmp ( const ListCell p1,
const ListCell p2 
)

Definition at line 1703 of file list.c.

1704 {
1705  Oid v1 = lfirst_oid(p1);
1706  Oid v2 = lfirst_oid(p2);
1707 
1708  return pg_cmp_u32(v1, v2);
1709 }
static int pg_cmp_u32(uint32 a, uint32 b)
Definition: int.h:489
unsigned int Oid
Definition: postgres_ext.h:31

References lfirst_oid, p2, and pg_cmp_u32().

Referenced by GetPublicationRelations(), heap_truncate_find_FKs(), RelationGetIndexList(), and RelationGetStatExtList().

◆ list_sort()

void list_sort ( List list,
list_sort_comparator  cmp 
)

Definition at line 1674 of file list.c.

1675 {
1676  typedef int (*qsort_comparator) (const void *a, const void *b);
1677  int len;
1678 
1680 
1681  /* Nothing to do if there's less than two elements */
1682  len = list_length(list);
1683  if (len > 1)
1684  qsort(list->elements, len, sizeof(ListCell), (qsort_comparator) cmp);
1685 }
int b
Definition: isn.c:70
int a
Definition: isn.c:69
#define qsort(a, b, c, d)
Definition: port.h:449
static int cmp(const chr *x, const chr *y, size_t len)
Definition: regc_locale.c:743

References a, b, check_list_invariants, cmp(), len, sort-test::list, list_length(), and qsort.

Referenced by AddRelationNotNullConstraints(), create_append_path(), expand_grouping_sets(), GetPublicationRelations(), heap_truncate_find_FKs(), perform_base_backup(), RelationGetIndexList(), RelationGetStatExtList(), sort_policies_by_name(), UpdateLogicalMappings(), and WalSummariesAreComplete().

◆ list_truncate()

List* list_truncate ( List list,
int  new_size 
)

Definition at line 631 of file list.c.

632 {
633  if (new_size <= 0)
634  return NIL; /* truncate to zero length */
635 
636  /* If asked to effectively extend the list, do nothing */
637  if (new_size < list_length(list))
638  list->length = new_size;
639 
640  /*
641  * Note: unlike the individual-list-cell deletion functions, we don't move
642  * the list cells to new storage, even in DEBUG_LIST_MEMORY_USAGE mode.
643  * This is because none of them can move in this operation, so just like
644  * in the old cons-cell-based implementation, this function doesn't
645  * invalidate any pointers to cells of the list. This is also the reason
646  * for not wiping the memory of the deleted cells: the old code didn't
647  * free them either. Perhaps later we'll tighten this up.
648  */
649 
650  return list;
651 }

References sort-test::list, list_length(), and NIL.

Referenced by choose_bitmap_and(), expand_indexqual_rowcompare(), ExpandIndirectionStar(), expandRTE(), generate_mergejoin_paths(), geqo_eval(), list_delete_last(), mbms_int_members(), pa_stream_abort(), ParseFuncOrColumn(), transformAggregateCall(), transformFromClauseItem(), transformSetOperationStmt(), and transformWholeRowRef().

◆ list_union()

List* list_union ( const List list1,
const List list2 
)

Definition at line 1066 of file list.c.

1067 {
1068  List *result;
1069  const ListCell *cell;
1070 
1071  Assert(IsPointerList(list1));
1072  Assert(IsPointerList(list2));
1073 
1074  result = list_copy(list1);
1075  foreach(cell, list2)
1076  {
1077  if (!list_member(result, lfirst(cell)))
1078  result = lappend(result, lfirst(cell));
1079  }
1080 
1081  check_list_invariants(result);
1082  return result;
1083 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, list_copy(), and list_member().

Referenced by AddRelationNewConstraints(), and process_duplicate_ors().

◆ list_union_int()

List* list_union_int ( const List list1,
const List list2 
)

Definition at line 1113 of file list.c.

1114 {
1115  List *result;
1116  const ListCell *cell;
1117 
1118  Assert(IsIntegerList(list1));
1119  Assert(IsIntegerList(list2));
1120 
1121  result = list_copy(list1);
1122  foreach(cell, list2)
1123  {
1124  if (!list_member_int(result, lfirst_int(cell)))
1125  result = lappend_int(result, lfirst_int(cell));
1126  }
1127 
1128  check_list_invariants(result);
1129  return result;
1130 }

References Assert(), check_list_invariants, IsIntegerList, lappend_int(), lfirst_int, list_copy(), and list_member_int().

Referenced by expand_grouping_sets().

◆ list_union_oid()

List* list_union_oid ( const List list1,
const List list2 
)

Definition at line 1136 of file list.c.

1137 {
1138  List *result;
1139  const ListCell *cell;
1140 
1141  Assert(IsOidList(list1));
1142  Assert(IsOidList(list2));
1143 
1144  result = list_copy(list1);
1145  foreach(cell, list2)
1146  {
1147  if (!list_member_oid(result, lfirst_oid(cell)))
1148  result = lappend_oid(result, lfirst_oid(cell));
1149  }
1150 
1151  check_list_invariants(result);
1152  return result;
1153 }

References Assert(), check_list_invariants, IsOidList, lappend_oid(), lfirst_oid, list_copy(), and list_member_oid().

◆ list_union_ptr()

List* list_union_ptr ( const List list1,
const List list2 
)

Definition at line 1090 of file list.c.

1091 {
1092  List *result;
1093  const ListCell *cell;
1094 
1095  Assert(IsPointerList(list1));
1096  Assert(IsPointerList(list2));
1097 
1098  result = list_copy(list1);
1099  foreach(cell, list2)
1100  {
1101  if (!list_member_ptr(result, lfirst(cell)))
1102  result = lappend(result, lfirst(cell));
1103  }
1104 
1105  check_list_invariants(result);
1106  return result;
1107 }

References Assert(), check_list_invariants, IsPointerList, lappend(), lfirst, list_copy(), and list_member_ptr().

◆ new_head_cell()

static void new_head_cell ( List list)
static

Definition at line 305 of file list.c.

306 {
307  /* Enlarge array if necessary */
308  if (list->length >= list->max_length)
309  enlarge_list(list, list->length + 1);
310  /* Now shove the existing data over */
311  memmove(&list->elements[1], &list->elements[0],
312  list->length * sizeof(ListCell));
313  list->length++;
314 }

References enlarge_list(), and sort-test::list.

Referenced by lcons(), lcons_int(), and lcons_oid().

◆ new_list()

static List* new_list ( NodeTag  type,
int  min_size 
)
static

Definition at line 91 of file list.c.

92 {
93  List *newlist;
94  int max_size;
95 
96  Assert(min_size > 0);
97 
98  /*
99  * We allocate all the requested cells, and possibly some more, as part of
100  * the same palloc request as the List header. This is a big win for the
101  * typical case of short fixed-length lists. It can lose if we allocate a
102  * moderately long list and then it gets extended; we'll be wasting more
103  * initial_elements[] space than if we'd made the header small. However,
104  * rounding up the request as we do in the normal code path provides some
105  * defense against small extensions.
106  */
107 
108 #ifndef DEBUG_LIST_MEMORY_USAGE
109 
110  /*
111  * Normally, we set up a list with some extra cells, to allow it to grow
112  * without a repalloc. Prefer cell counts chosen to make the total
113  * allocation a power-of-2, since palloc would round it up to that anyway.
114  * (That stops being true for very large allocations, but very long lists
115  * are infrequent, so it doesn't seem worth special logic for such cases.)
116  *
117  * The minimum allocation is 8 ListCell units, providing either 4 or 5
118  * available ListCells depending on the machine's word width. Counting
119  * palloc's overhead, this uses the same amount of space as a one-cell
120  * list did in the old implementation, and less space for any longer list.
121  *
122  * We needn't worry about integer overflow; no caller passes min_size
123  * that's more than twice the size of an existing list, so the size limits
124  * within palloc will ensure that we don't overflow here.
125  */
126  max_size = pg_nextpower2_32(Max(8, min_size + LIST_HEADER_OVERHEAD));
127  max_size -= LIST_HEADER_OVERHEAD;
128 #else
129 
130  /*
131  * For debugging, don't allow any extra space. This forces any cell
132  * addition to go through enlarge_list() and thus move the existing data.
133  */
134  max_size = min_size;
135 #endif
136 
137  newlist = (List *) palloc(offsetof(List, initial_elements) +
138  max_size * sizeof(ListCell));
139  newlist->type = type;
140  newlist->length = min_size;
141  newlist->max_length = max_size;
142  newlist->elements = newlist->initial_elements;
143 
144  return newlist;
145 }
#define LIST_HEADER_OVERHEAD
Definition: list.c:48
void * palloc(Size size)
Definition: mcxt.c:1304
ListCell initial_elements[FLEXIBLE_ARRAY_MEMBER]
Definition: pg_list.h:60
const char * type

References Assert(), List::elements, List::initial_elements, List::length, LIST_HEADER_OVERHEAD, Max, List::max_length, palloc(), pg_nextpower2_32(), type, and List::type.

Referenced by lappend(), lappend_int(), lappend_oid(), lappend_xid(), lcons(), lcons_int(), lcons_oid(), list_concat_copy(), list_copy(), list_copy_deep(), list_copy_head(), list_copy_tail(), list_make1_impl(), list_make2_impl(), list_make3_impl(), list_make4_impl(), list_make5_impl(), pg_parse_query(), and pg_rewrite_query().

◆ new_tail_cell()

static void new_tail_cell ( List list)
static

Definition at line 323 of file list.c.

324 {
325  /* Enlarge array if necessary */
326  if (list->length >= list->max_length)
327  enlarge_list(list, list->length + 1);
328  list->length++;
329 }

References enlarge_list(), and sort-test::list.

Referenced by lappend(), lappend_int(), lappend_oid(), and lappend_xid().