PostgreSQL Source Code  git master
common.c File Reference
#include "postgres_fe.h"
#include <ctype.h>
#include "catalog/pg_class_d.h"
#include "catalog/pg_collation_d.h"
#include "catalog/pg_extension_d.h"
#include "catalog/pg_namespace_d.h"
#include "catalog/pg_operator_d.h"
#include "catalog/pg_proc_d.h"
#include "catalog/pg_publication_d.h"
#include "catalog/pg_subscription_d.h"
#include "catalog/pg_type_d.h"
#include "common/hashfn.h"
#include "fe_utils/string_utils.h"
#include "pg_backup_archiver.h"
#include "pg_backup_utils.h"
#include "pg_dump.h"
#include "lib/simplehash.h"
Include dependency graph for common.c:

Go to the source code of this file.

Data Structures

struct  _catalogIdMapEntry
 

Macros

#define SH_PREFIX   catalogid
 
#define SH_ELEMENT_TYPE   CatalogIdMapEntry
 
#define SH_KEY_TYPE   CatalogId
 
#define SH_KEY   catId
 
#define SH_HASH_KEY(tb, key)   hash_bytes((const unsigned char *) &(key), sizeof(CatalogId))
 
#define SH_EQUAL(tb, a, b)   ((a).oid == (b).oid && (a).tableoid == (b).tableoid)
 
#define SH_STORE_HASH
 
#define SH_GET_HASH(tb, a)   (a)->hashval
 
#define SH_SCOPE   static inline
 
#define SH_RAW_ALLOCATOR   pg_malloc0
 
#define SH_DECLARE
 
#define SH_DEFINE
 
#define CATALOGIDHASH_INITIAL_SIZE   10000
 

Typedefs

typedef struct _catalogIdMapEntry CatalogIdMapEntry
 

Functions

static void flagInhTables (Archive *fout, TableInfo *tblinfo, int numTables, InhInfo *inhinfo, int numInherits)
 
static void flagInhIndexes (Archive *fout, TableInfo *tblinfo, int numTables)
 
static void flagInhAttrs (Archive *fout, TableInfo *tblinfo, int numTables)
 
static int strInArray (const char *pattern, char **arr, int arr_size)
 
static IndxInfofindIndexByOid (Oid oid)
 
TableInfogetSchemaData (Archive *fout, int *numTablesPtr)
 
static void flagInhIndexes (Archive *fout, TableInfo tblinfo[], int numTables)
 
void AssignDumpId (DumpableObject *dobj)
 
void recordAdditionalCatalogID (CatalogId catId, DumpableObject *dobj)
 
DumpId createDumpId (void)
 
DumpId getMaxDumpId (void)
 
DumpableObjectfindObjectByDumpId (DumpId dumpId)
 
DumpableObjectfindObjectByCatalogId (CatalogId catalogId)
 
void getDumpableObjects (DumpableObject ***objs, int *numObjs)
 
void addObjectDependency (DumpableObject *dobj, DumpId refId)
 
void removeObjectDependency (DumpableObject *dobj, DumpId refId)
 
TableInfofindTableByOid (Oid oid)
 
TypeInfofindTypeByOid (Oid oid)
 
FuncInfofindFuncByOid (Oid oid)
 
OprInfofindOprByOid (Oid oid)
 
CollInfofindCollationByOid (Oid oid)
 
NamespaceInfofindNamespaceByOid (Oid oid)
 
ExtensionInfofindExtensionByOid (Oid oid)
 
PublicationInfofindPublicationByOid (Oid oid)
 
SubscriptionInfofindSubscriptionByOid (Oid oid)
 
void recordExtensionMembership (CatalogId catId, ExtensionInfo *ext)
 
ExtensionInfofindOwningExtension (CatalogId catalogId)
 
void parseOidArray (const char *str, Oid *array, int arraysize)
 

Variables

static DumpableObject ** dumpIdMap = NULL
 
static int allocedDumpIds = 0
 
static DumpId lastDumpId = 0
 
static catalogid_hash * catalogIdHash = NULL
 

Macro Definition Documentation

◆ CATALOGIDHASH_INITIAL_SIZE

#define CATALOGIDHASH_INITIAL_SIZE   10000

Definition at line 81 of file common.c.

◆ SH_DECLARE

#define SH_DECLARE

Definition at line 77 of file common.c.

◆ SH_DEFINE

#define SH_DEFINE

Definition at line 78 of file common.c.

◆ SH_ELEMENT_TYPE

#define SH_ELEMENT_TYPE   CatalogIdMapEntry

Definition at line 68 of file common.c.

◆ SH_EQUAL

#define SH_EQUAL (   tb,
  a,
  b 
)    ((a).oid == (b).oid && (a).tableoid == (b).tableoid)

Definition at line 72 of file common.c.

◆ SH_GET_HASH

#define SH_GET_HASH (   tb,
  a 
)    (a)->hashval

Definition at line 74 of file common.c.

◆ SH_HASH_KEY

#define SH_HASH_KEY (   tb,
  key 
)    hash_bytes((const unsigned char *) &(key), sizeof(CatalogId))

Definition at line 71 of file common.c.

◆ SH_KEY

#define SH_KEY   catId

Definition at line 70 of file common.c.

◆ SH_KEY_TYPE

#define SH_KEY_TYPE   CatalogId

Definition at line 69 of file common.c.

◆ SH_PREFIX

#define SH_PREFIX   catalogid

Definition at line 67 of file common.c.

◆ SH_RAW_ALLOCATOR

#define SH_RAW_ALLOCATOR   pg_malloc0

Definition at line 76 of file common.c.

◆ SH_SCOPE

#define SH_SCOPE   static inline

Definition at line 75 of file common.c.

◆ SH_STORE_HASH

#define SH_STORE_HASH

Definition at line 73 of file common.c.

Typedef Documentation

◆ CatalogIdMapEntry

Function Documentation

◆ addObjectDependency()

void addObjectDependency ( DumpableObject dobj,
DumpId  refId 
)

◆ AssignDumpId()

void AssignDumpId ( DumpableObject dobj)

Definition at line 622 of file common.c.

623 {
624  dobj->dumpId = ++lastDumpId;
625  dobj->name = NULL; /* must be set later */
626  dobj->namespace = NULL; /* may be set later */
627  dobj->dump = DUMP_COMPONENT_ALL; /* default assumption */
628  dobj->dump_contains = DUMP_COMPONENT_ALL; /* default assumption */
629  /* All objects have definitions; we may set more components bits later */
631  dobj->ext_member = false; /* default assumption */
632  dobj->depends_on_ext = false; /* default assumption */
633  dobj->dependencies = NULL;
634  dobj->nDeps = 0;
635  dobj->allocDeps = 0;
636 
637  /* Add object to dumpIdMap[], enlarging that array if need be */
638  while (dobj->dumpId >= allocedDumpIds)
639  {
640  int newAlloc;
641 
642  if (allocedDumpIds <= 0)
643  {
644  newAlloc = 256;
646  }
647  else
648  {
649  newAlloc = allocedDumpIds * 2;
651  }
652  memset(dumpIdMap + allocedDumpIds, 0,
653  (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
654  allocedDumpIds = newAlloc;
655  }
656  dumpIdMap[dobj->dumpId] = dobj;
657 
658  /* If it has a valid CatalogId, enter it into the hash table */
659  if (OidIsValid(dobj->catId.tableoid))
660  {
661  CatalogIdMapEntry *entry;
662  bool found;
663 
664  /* Initialize CatalogId hash table if not done yet */
665  if (catalogIdHash == NULL)
666  catalogIdHash = catalogid_create(CATALOGIDHASH_INITIAL_SIZE, NULL);
667 
668  entry = catalogid_insert(catalogIdHash, dobj->catId, &found);
669  if (!found)
670  {
671  entry->dobj = NULL;
672  entry->ext = NULL;
673  }
674  Assert(entry->dobj == NULL);
675  entry->dobj = dobj;
676  }
677 }
static int allocedDumpIds
Definition: common.c:39
static DumpableObject ** dumpIdMap
Definition: common.c:38
#define CATALOGIDHASH_INITIAL_SIZE
Definition: common.c:81
static catalogid_hash * catalogIdHash
Definition: common.c:83
static DumpId lastDumpId
Definition: common.c:40
#define Assert(condition)
Definition: c.h:858
#define OidIsValid(objectId)
Definition: c.h:775
#define DUMP_COMPONENT_ALL
Definition: pg_dump.h:104
#define DUMP_COMPONENT_DEFINITION
Definition: pg_dump.h:97
Oid tableoid
Definition: pg_backup.h:266
ExtensionInfo * ext
Definition: common.c:64
DumpableObject * dobj
Definition: common.c:63
DumpComponents dump
Definition: pg_dump.h:139
char * name
Definition: pg_dump.h:138
DumpId dumpId
Definition: pg_dump.h:137
bool ext_member
Definition: pg_dump.h:143
DumpComponents components
Definition: pg_dump.h:142
CatalogId catId
Definition: pg_dump.h:136
DumpComponents dump_contains
Definition: pg_dump.h:141
bool depends_on_ext
Definition: pg_dump.h:144

References _dumpableObject::allocDeps, allocedDumpIds, Assert, catalogIdHash, CATALOGIDHASH_INITIAL_SIZE, _dumpableObject::catId, _dumpableObject::components, _dumpableObject::dependencies, _dumpableObject::depends_on_ext, _catalogIdMapEntry::dobj, _dumpableObject::dump, DUMP_COMPONENT_ALL, DUMP_COMPONENT_DEFINITION, _dumpableObject::dump_contains, _dumpableObject::dumpId, dumpIdMap, _catalogIdMapEntry::ext, _dumpableObject::ext_member, lastDumpId, _dumpableObject::name, _dumpableObject::nDeps, OidIsValid, pg_malloc_array, pg_realloc_array, and CatalogId::tableoid.

Referenced by createBoundaryObjects(), flagInhAttrs(), flagInhIndexes(), flagInhTables(), getAccessMethods(), getAggregates(), getCasts(), getCollations(), getConstraints(), getConversions(), getDefaultACLs(), getDomainConstraints(), getEventTriggers(), getExtendedStatistics(), getExtensions(), getForeignDataWrappers(), getForeignServers(), getFuncs(), getIndexes(), getLOs(), getNamespaces(), getOpclasses(), getOperators(), getOpfamilies(), getPolicies(), getProcLangs(), getPublicationNamespaces(), getPublications(), getPublicationTables(), getRules(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), getTables(), getTransforms(), getTriggers(), getTSConfigurations(), getTSDictionaries(), getTSParsers(), getTSTemplates(), getTypes(), and makeTableDataInfo().

◆ createDumpId()

◆ findCollationByOid()

CollInfo* findCollationByOid ( Oid  oid)

Definition at line 919 of file common.c.

920 {
921  CatalogId catId;
922  DumpableObject *dobj;
923 
924  catId.tableoid = CollationRelationId;
925  catId.oid = oid;
926  dobj = findObjectByCatalogId(catId);
927  Assert(dobj == NULL || dobj->objType == DO_COLLATION);
928  return (CollInfo *) dobj;
929 }
DumpableObject * findObjectByCatalogId(CatalogId catalogId)
Definition: common.c:743
@ DO_COLLATION
Definition: pg_dump.h:50
DumpableObjectType objType
Definition: pg_dump.h:135

References Assert, DO_COLLATION, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by createDummyViewAsClause(), dumpCompositeType(), dumpDomain(), dumpRangeType(), and dumpTableSchema().

◆ findExtensionByOid()

ExtensionInfo* findExtensionByOid ( Oid  oid)

Definition at line 955 of file common.c.

956 {
957  CatalogId catId;
958  DumpableObject *dobj;
959 
960  catId.tableoid = ExtensionRelationId;
961  catId.oid = oid;
962  dobj = findObjectByCatalogId(catId);
963  Assert(dobj == NULL || dobj->objType == DO_EXTENSION);
964  return (ExtensionInfo *) dobj;
965 }
@ DO_EXTENSION
Definition: pg_dump.h:41

References Assert, DO_EXTENSION, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by getExtensionMembership().

◆ findFuncByOid()

FuncInfo* findFuncByOid ( Oid  oid)

Definition at line 883 of file common.c.

884 {
885  CatalogId catId;
886  DumpableObject *dobj;
887 
888  catId.tableoid = ProcedureRelationId;
889  catId.oid = oid;
890  dobj = findObjectByCatalogId(catId);
891  Assert(dobj == NULL || dobj->objType == DO_FUNC);
892  return (FuncInfo *) dobj;
893 }
@ DO_FUNC
Definition: pg_dump.h:44

References Assert, DO_FUNC, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by dumpCast(), dumpProcLang(), and dumpTransform().

◆ findIndexByOid()

static IndxInfo * findIndexByOid ( Oid  oid)
static

Definition at line 846 of file common.c.

847 {
848  CatalogId catId;
849  DumpableObject *dobj;
850 
851  catId.tableoid = RelationRelationId;
852  catId.oid = oid;
853  dobj = findObjectByCatalogId(catId);
854  Assert(dobj == NULL || dobj->objType == DO_INDEX);
855  return (IndxInfo *) dobj;
856 }
@ DO_INDEX
Definition: pg_dump.h:55

References Assert, DO_INDEX, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by flagInhIndexes().

◆ findNamespaceByOid()

NamespaceInfo* findNamespaceByOid ( Oid  oid)

Definition at line 937 of file common.c.

938 {
939  CatalogId catId;
940  DumpableObject *dobj;
941 
942  catId.tableoid = NamespaceRelationId;
943  catId.oid = oid;
944  dobj = findObjectByCatalogId(catId);
945  Assert(dobj == NULL || dobj->objType == DO_NAMESPACE);
946  return (NamespaceInfo *) dobj;
947 }
@ DO_NAMESPACE
Definition: pg_dump.h:40

References Assert, DO_NAMESPACE, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by findNamespace(), and getPublicationNamespaces().

◆ findObjectByCatalogId()

DumpableObject* findObjectByCatalogId ( CatalogId  catalogId)

Definition at line 743 of file common.c.

744 {
745  CatalogIdMapEntry *entry;
746 
747  if (catalogIdHash == NULL)
748  return NULL; /* no objects exist yet */
749 
750  entry = catalogid_lookup(catalogIdHash, catalogId);
751  if (entry == NULL)
752  return NULL;
753  return entry->dobj;
754 }

References catalogIdHash, and _catalogIdMapEntry::dobj.

Referenced by buildMatViewRefreshDependencies(), collectComments(), collectSecLabels(), findCollationByOid(), findExtensionByOid(), findFuncByOid(), findIndexByOid(), findNamespaceByOid(), findOprByOid(), findPublicationByOid(), findSubscriptionByOid(), findTableByOid(), findTypeByOid(), getAdditionalACLs(), and getDependencies().

◆ findObjectByDumpId()

DumpableObject* findObjectByDumpId ( DumpId  dumpId)

Definition at line 730 of file common.c.

731 {
732  if (dumpId <= 0 || dumpId >= allocedDumpIds)
733  return NULL; /* out of range? */
734  return dumpIdMap[dumpId];
735 }

References allocedDumpIds, and dumpIdMap.

Referenced by binary_upgrade_extension_member(), BuildArchiveDependencies(), dumpConstraint(), dumpDumpableObject(), dumpExtension(), findDumpableDependencies(), and findLoop().

◆ findOprByOid()

OprInfo* findOprByOid ( Oid  oid)

Definition at line 901 of file common.c.

902 {
903  CatalogId catId;
904  DumpableObject *dobj;
905 
906  catId.tableoid = OperatorRelationId;
907  catId.oid = oid;
908  dobj = findObjectByCatalogId(catId);
909  Assert(dobj == NULL || dobj->objType == DO_OPERATOR);
910  return (OprInfo *) dobj;
911 }
@ DO_OPERATOR
Definition: pg_dump.h:46

References Assert, DO_OPERATOR, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by getFormattedOperatorName().

◆ findOwningExtension()

ExtensionInfo* findOwningExtension ( CatalogId  catalogId)

Definition at line 1034 of file common.c.

1035 {
1036  CatalogIdMapEntry *entry;
1037 
1038  if (catalogIdHash == NULL)
1039  return NULL; /* no objects exist yet */
1040 
1041  entry = catalogid_lookup(catalogIdHash, catalogId);
1042  if (entry == NULL)
1043  return NULL;
1044  return entry->ext;
1045 }

References catalogIdHash, and _catalogIdMapEntry::ext.

Referenced by checkExtensionMembership().

◆ findPublicationByOid()

PublicationInfo* findPublicationByOid ( Oid  oid)

Definition at line 973 of file common.c.

974 {
975  CatalogId catId;
976  DumpableObject *dobj;
977 
978  catId.tableoid = PublicationRelationId;
979  catId.oid = oid;
980  dobj = findObjectByCatalogId(catId);
981  Assert(dobj == NULL || dobj->objType == DO_PUBLICATION);
982  return (PublicationInfo *) dobj;
983 }
@ DO_PUBLICATION
Definition: pg_dump.h:82

References Assert, DO_PUBLICATION, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by getPublicationNamespaces(), and getPublicationTables().

◆ findSubscriptionByOid()

SubscriptionInfo* findSubscriptionByOid ( Oid  oid)

Definition at line 991 of file common.c.

992 {
993  CatalogId catId;
994  DumpableObject *dobj;
995 
996  catId.tableoid = SubscriptionRelationId;
997  catId.oid = oid;
998  dobj = findObjectByCatalogId(catId);
999  Assert(dobj == NULL || dobj->objType == DO_SUBSCRIPTION);
1000  return (SubscriptionInfo *) dobj;
1001 }
@ DO_SUBSCRIPTION
Definition: pg_dump.h:85

References Assert, DO_SUBSCRIPTION, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by getSubscriptionTables().

◆ findTableByOid()

TableInfo* findTableByOid ( Oid  oid)

◆ findTypeByOid()

TypeInfo* findTypeByOid ( Oid  oid)

Definition at line 864 of file common.c.

865 {
866  CatalogId catId;
867  DumpableObject *dobj;
868 
869  catId.tableoid = TypeRelationId;
870  catId.oid = oid;
871  dobj = findObjectByCatalogId(catId);
872  Assert(dobj == NULL ||
873  dobj->objType == DO_TYPE || dobj->objType == DO_DUMMY_TYPE);
874  return (TypeInfo *) dobj;
875 }
@ DO_TYPE
Definition: pg_dump.h:42
@ DO_DUMMY_TYPE
Definition: pg_dump.h:66

References Assert, DO_DUMMY_TYPE, DO_TYPE, findObjectByCatalogId(), _dumpableObject::objType, CatalogId::oid, and CatalogId::tableoid.

Referenced by collectComments(), collectSecLabels(), DOTypeNameCompare(), getCasts(), getFormattedTypeName(), and getTransforms().

◆ flagInhAttrs()

static void flagInhAttrs ( Archive fout,
TableInfo tblinfo,
int  numTables 
)
static

Definition at line 477 of file common.c.

478 {
479  DumpOptions *dopt = fout->dopt;
480  int i,
481  j,
482  k;
483 
484  /*
485  * We scan the tables in OID order, since that's how tblinfo[] is sorted.
486  * Hence we will typically visit parents before their children --- but
487  * that is *not* guaranteed. Thus this loop must be careful that it does
488  * not alter table properties in a way that could change decisions made at
489  * child tables during other iterations.
490  */
491  for (i = 0; i < numTables; i++)
492  {
493  TableInfo *tbinfo = &(tblinfo[i]);
494  int numParents;
495  TableInfo **parents;
496 
497  /* Some kinds never have parents */
498  if (tbinfo->relkind == RELKIND_SEQUENCE ||
499  tbinfo->relkind == RELKIND_VIEW ||
500  tbinfo->relkind == RELKIND_MATVIEW)
501  continue;
502 
503  /* Don't bother computing anything for non-target tables, either */
504  if (!tbinfo->dobj.dump)
505  continue;
506 
507  numParents = tbinfo->numParents;
508  parents = tbinfo->parents;
509 
510  if (numParents == 0)
511  continue; /* nothing to see here, move along */
512 
513  /* For each column, search for matching column names in parent(s) */
514  for (j = 0; j < tbinfo->numatts; j++)
515  {
516  bool foundNotNull; /* Attr was NOT NULL in a parent */
517  bool foundDefault; /* Found a default in a parent */
518  bool foundSameGenerated; /* Found matching GENERATED */
519  bool foundDiffGenerated; /* Found non-matching GENERATED */
520 
521  /* no point in examining dropped columns */
522  if (tbinfo->attisdropped[j])
523  continue;
524 
525  foundNotNull = false;
526  foundDefault = false;
527  foundSameGenerated = false;
528  foundDiffGenerated = false;
529  for (k = 0; k < numParents; k++)
530  {
531  TableInfo *parent = parents[k];
532  int inhAttrInd;
533 
534  inhAttrInd = strInArray(tbinfo->attnames[j],
535  parent->attnames,
536  parent->numatts);
537  if (inhAttrInd >= 0)
538  {
539  AttrDefInfo *parentDef = parent->attrdefs[inhAttrInd];
540 
541  foundNotNull |= parent->notnull[inhAttrInd];
542  foundDefault |= (parentDef != NULL &&
543  strcmp(parentDef->adef_expr, "NULL") != 0 &&
544  !parent->attgenerated[inhAttrInd]);
545  if (parent->attgenerated[inhAttrInd])
546  {
547  /* these pointer nullness checks are just paranoia */
548  if (parentDef != NULL &&
549  tbinfo->attrdefs[j] != NULL &&
550  strcmp(parentDef->adef_expr,
551  tbinfo->attrdefs[j]->adef_expr) == 0)
552  foundSameGenerated = true;
553  else
554  foundDiffGenerated = true;
555  }
556  }
557  }
558 
559  /* Remember if we found inherited NOT NULL */
560  tbinfo->inhNotNull[j] = foundNotNull;
561 
562  /*
563  * Manufacture a DEFAULT NULL clause if necessary. This breaks
564  * the advice given above to avoid changing state that might get
565  * inspected in other loop iterations. We prevent trouble by
566  * having the foundDefault test above check whether adef_expr is
567  * "NULL", so that it will reach the same conclusion before or
568  * after this is done.
569  */
570  if (foundDefault && tbinfo->attrdefs[j] == NULL)
571  {
572  AttrDefInfo *attrDef;
573 
574  attrDef = pg_malloc_object(AttrDefInfo);
575  attrDef->dobj.objType = DO_ATTRDEF;
576  attrDef->dobj.catId.tableoid = 0;
577  attrDef->dobj.catId.oid = 0;
578  AssignDumpId(&attrDef->dobj);
579  attrDef->dobj.name = pg_strdup(tbinfo->dobj.name);
580  attrDef->dobj.namespace = tbinfo->dobj.namespace;
581  attrDef->dobj.dump = tbinfo->dobj.dump;
582 
583  attrDef->adtable = tbinfo;
584  attrDef->adnum = j + 1;
585  attrDef->adef_expr = pg_strdup("NULL");
586 
587  /* Will column be dumped explicitly? */
588  if (shouldPrintColumn(dopt, tbinfo, j))
589  {
590  attrDef->separate = false;
591  /* No dependency needed: NULL cannot have dependencies */
592  }
593  else
594  {
595  /* column will be suppressed, print default separately */
596  attrDef->separate = true;
597  /* ensure it comes out after the table */
598  addObjectDependency(&attrDef->dobj,
599  tbinfo->dobj.dumpId);
600  }
601 
602  tbinfo->attrdefs[j] = attrDef;
603  }
604 
605  /* No need to dump generation expression if it's inheritable */
606  if (foundSameGenerated && !foundDiffGenerated &&
607  !tbinfo->ispartition && !dopt->binary_upgrade)
608  tbinfo->attrdefs[j]->dobj.dump = DUMP_COMPONENT_NONE;
609  }
610  }
611 }
void addObjectDependency(DumpableObject *dobj, DumpId refId)
Definition: common.c:783
void AssignDumpId(DumpableObject *dobj)
Definition: common.c:622
static int strInArray(const char *pattern, char **arr, int arr_size)
Definition: common.c:1105
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
#define pg_malloc_object(type)
Definition: fe_memutils.h:38
int j
Definition: isn.c:74
int i
Definition: isn.c:73
bool shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno)
Definition: pg_dump.c:9178
#define DUMP_COMPONENT_NONE
Definition: pg_dump.h:96
@ DO_ATTRDEF
Definition: pg_dump.h:54
DumpOptions * dopt
Definition: pg_backup.h:214
DumpableObject dobj
Definition: pg_dump.h:375
char * adef_expr
Definition: pg_dump.h:378
TableInfo * adtable
Definition: pg_dump.h:376
bool separate
Definition: pg_dump.h:379
int binary_upgrade
Definition: pg_backup.h:166
bool ispartition
Definition: pg_dump.h:322
DumpableObject dobj
Definition: pg_dump.h:285
int numParents
Definition: pg_dump.h:325
struct _tableInfo ** parents
Definition: pg_dump.h:326
char * attgenerated
Definition: pg_dump.h:340
bool * attisdropped
Definition: pg_dump.h:338
int numatts
Definition: pg_dump.h:332
struct _attrDefInfo ** attrdefs
Definition: pg_dump.h:351
bool * notnull
Definition: pg_dump.h:349
char ** attnames
Definition: pg_dump.h:333
char relkind
Definition: pg_dump.h:288
bool * inhNotNull
Definition: pg_dump.h:350

References addObjectDependency(), _attrDefInfo::adef_expr, _attrDefInfo::adnum, _attrDefInfo::adtable, AssignDumpId(), _tableInfo::attgenerated, _tableInfo::attisdropped, _tableInfo::attnames, _tableInfo::attrdefs, _dumpOptions::binary_upgrade, _dumpableObject::catId, DO_ATTRDEF, _tableInfo::dobj, _attrDefInfo::dobj, Archive::dopt, _dumpableObject::dump, DUMP_COMPONENT_NONE, _dumpableObject::dumpId, i, _tableInfo::inhNotNull, _tableInfo::ispartition, j, _dumpableObject::name, _tableInfo::notnull, _tableInfo::numatts, _tableInfo::numParents, _dumpableObject::objType, CatalogId::oid, _tableInfo::parents, pg_malloc_object, pg_strdup(), _tableInfo::relkind, _attrDefInfo::separate, shouldPrintColumn(), strInArray(), and CatalogId::tableoid.

Referenced by getSchemaData().

◆ flagInhIndexes() [1/2]

static void flagInhIndexes ( Archive fout,
TableInfo tblinfo,
int  numTables 
)
static

Referenced by getSchemaData().

◆ flagInhIndexes() [2/2]

static void flagInhIndexes ( Archive fout,
TableInfo  tblinfo[],
int  numTables 
)
static

Definition at line 387 of file common.c.

388 {
389  int i,
390  j;
391 
392  for (i = 0; i < numTables; i++)
393  {
394  if (!tblinfo[i].ispartition || tblinfo[i].numParents == 0)
395  continue;
396 
397  Assert(tblinfo[i].numParents == 1);
398 
399  for (j = 0; j < tblinfo[i].numIndexes; j++)
400  {
401  IndxInfo *index = &(tblinfo[i].indexes[j]);
402  IndxInfo *parentidx;
403  IndexAttachInfo *attachinfo;
404 
405  if (index->parentidx == 0)
406  continue;
407 
408  parentidx = findIndexByOid(index->parentidx);
409  if (parentidx == NULL)
410  continue;
411 
412  attachinfo = pg_malloc_object(IndexAttachInfo);
413 
414  attachinfo->dobj.objType = DO_INDEX_ATTACH;
415  attachinfo->dobj.catId.tableoid = 0;
416  attachinfo->dobj.catId.oid = 0;
417  AssignDumpId(&attachinfo->dobj);
418  attachinfo->dobj.name = pg_strdup(index->dobj.name);
419  attachinfo->dobj.namespace = index->indextable->dobj.namespace;
420  attachinfo->parentIdx = parentidx;
421  attachinfo->partitionIdx = index;
422 
423  /*
424  * We must state the DO_INDEX_ATTACH object's dependencies
425  * explicitly, since it will not match anything in pg_depend.
426  *
427  * Give it dependencies on both the partition index and the parent
428  * index, so that it will not be executed till both of those
429  * exist. (There's no need to care what order those are created
430  * in.)
431  *
432  * In addition, give it dependencies on the indexes' underlying
433  * tables. This does nothing of great value so far as serial
434  * restore ordering goes, but it ensures that a parallel restore
435  * will not try to run the ATTACH concurrently with other
436  * operations on those tables.
437  */
438  addObjectDependency(&attachinfo->dobj, index->dobj.dumpId);
439  addObjectDependency(&attachinfo->dobj, parentidx->dobj.dumpId);
440  addObjectDependency(&attachinfo->dobj,
441  index->indextable->dobj.dumpId);
442  addObjectDependency(&attachinfo->dobj,
443  parentidx->indextable->dobj.dumpId);
444 
445  /* keep track of the list of partitions in the parent index */
446  simple_ptr_list_append(&parentidx->partattaches, &attachinfo->dobj);
447  }
448  }
449 }
static IndxInfo * findIndexByOid(Oid oid)
Definition: common.c:846
@ DO_INDEX_ATTACH
Definition: pg_dump.h:56
void simple_ptr_list_append(SimplePtrList *list, void *ptr)
Definition: simple_list.c:162
IndxInfo * partitionIdx
Definition: pg_dump.h:416
DumpableObject dobj
Definition: pg_dump.h:414
IndxInfo * parentIdx
Definition: pg_dump.h:415
TableInfo * indextable
Definition: pg_dump.h:392
SimplePtrList partattaches
Definition: pg_dump.h:406
DumpableObject dobj
Definition: pg_dump.h:391
struct _indxInfo * indexes
Definition: pg_dump.h:360
int numIndexes
Definition: pg_dump.h:359
Definition: type.h:95

References addObjectDependency(), Assert, AssignDumpId(), _dumpableObject::catId, DO_INDEX_ATTACH, _tableInfo::dobj, _indxInfo::dobj, _indexAttachInfo::dobj, _dumpableObject::dumpId, findIndexByOid(), i, _tableInfo::indexes, _indxInfo::indextable, j, _dumpableObject::name, _tableInfo::numIndexes, _dumpableObject::objType, CatalogId::oid, _indexAttachInfo::parentIdx, _indxInfo::partattaches, _indexAttachInfo::partitionIdx, pg_malloc_object, pg_strdup(), simple_ptr_list_append(), and CatalogId::tableoid.

◆ flagInhTables()

static void flagInhTables ( Archive fout,
TableInfo tblinfo,
int  numTables,
InhInfo inhinfo,
int  numInherits 
)
static

Definition at line 269 of file common.c.

271 {
272  TableInfo *child = NULL;
273  TableInfo *parent = NULL;
274  int i,
275  j;
276 
277  /*
278  * Set up links from child tables to their parents.
279  *
280  * We used to attempt to skip this work for tables that are not to be
281  * dumped; but the optimizable cases are rare in practice, and setting up
282  * these links in bulk is cheaper than the old way. (Note in particular
283  * that it's very rare for a child to have more than one parent.)
284  */
285  for (i = 0; i < numInherits; i++)
286  {
287  /*
288  * Skip a hashtable lookup if it's same table as last time. This is
289  * unlikely for the child, but less so for the parent. (Maybe we
290  * should ask the backend for a sorted array to make it more likely?
291  * Not clear the sorting effort would be repaid, though.)
292  */
293  if (child == NULL ||
294  child->dobj.catId.oid != inhinfo[i].inhrelid)
295  {
296  child = findTableByOid(inhinfo[i].inhrelid);
297 
298  /*
299  * If we find no TableInfo, assume the pg_inherits entry is for a
300  * partitioned index, which we don't need to track.
301  */
302  if (child == NULL)
303  continue;
304  }
305  if (parent == NULL ||
306  parent->dobj.catId.oid != inhinfo[i].inhparent)
307  {
308  parent = findTableByOid(inhinfo[i].inhparent);
309  if (parent == NULL)
310  pg_fatal("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found",
311  inhinfo[i].inhparent,
312  child->dobj.name,
313  child->dobj.catId.oid);
314  }
315  /* Add this parent to the child's list of parents. */
316  if (child->numParents > 0)
317  child->parents = pg_realloc_array(child->parents,
318  TableInfo *,
319  child->numParents + 1);
320  else
321  child->parents = pg_malloc_array(TableInfo *, 1);
322  child->parents[child->numParents++] = parent;
323  }
324 
325  /*
326  * Now consider all child tables and mark parents interesting as needed.
327  */
328  for (i = 0; i < numTables; i++)
329  {
330  /*
331  * If needed, mark the parents as interesting for getTableAttrs and
332  * getIndexes. We only need this for direct parents of dumpable
333  * tables.
334  */
335  if (tblinfo[i].dobj.dump)
336  {
337  int numParents = tblinfo[i].numParents;
338  TableInfo **parents = tblinfo[i].parents;
339 
340  for (j = 0; j < numParents; j++)
341  parents[j]->interesting = true;
342  }
343 
344  /* Create TableAttachInfo object if needed */
345  if ((tblinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
346  tblinfo[i].ispartition)
347  {
348  TableAttachInfo *attachinfo;
349 
350  /* With partitions there can only be one parent */
351  if (tblinfo[i].numParents != 1)
352  pg_fatal("invalid number of parents %d for table \"%s\"",
353  tblinfo[i].numParents,
354  tblinfo[i].dobj.name);
355 
356  attachinfo = (TableAttachInfo *) palloc(sizeof(TableAttachInfo));
357  attachinfo->dobj.objType = DO_TABLE_ATTACH;
358  attachinfo->dobj.catId.tableoid = 0;
359  attachinfo->dobj.catId.oid = 0;
360  AssignDumpId(&attachinfo->dobj);
361  attachinfo->dobj.name = pg_strdup(tblinfo[i].dobj.name);
362  attachinfo->dobj.namespace = tblinfo[i].dobj.namespace;
363  attachinfo->parentTbl = tblinfo[i].parents[0];
364  attachinfo->partitionTbl = &tblinfo[i];
365 
366  /*
367  * We must state the DO_TABLE_ATTACH object's dependencies
368  * explicitly, since it will not match anything in pg_depend.
369  *
370  * Give it dependencies on both the partition table and the parent
371  * table, so that it will not be executed till both of those
372  * exist. (There's no need to care what order those are created
373  * in.)
374  */
375  addObjectDependency(&attachinfo->dobj, tblinfo[i].dobj.dumpId);
376  addObjectDependency(&attachinfo->dobj, tblinfo[i].parents[0]->dobj.dumpId);
377  }
378  }
379 }
TableInfo * findTableByOid(Oid oid)
Definition: common.c:828
void * palloc(Size size)
Definition: mcxt.c:1317
#define pg_fatal(...)
@ DO_TABLE_ATTACH
Definition: pg_dump.h:53
TableInfo * partitionTbl
Definition: pg_dump.h:370
DumpableObject dobj
Definition: pg_dump.h:368
TableInfo * parentTbl
Definition: pg_dump.h:369

References addObjectDependency(), AssignDumpId(), _dumpableObject::catId, DO_TABLE_ATTACH, _tableInfo::dobj, _tableAttachInfo::dobj, DUMP_COMPONENT_DEFINITION, _dumpableObject::dumpId, findTableByOid(), i, _inhInfo::inhparent, _inhInfo::inhrelid, _tableInfo::ispartition, j, _dumpableObject::name, _tableInfo::numParents, _dumpableObject::objType, CatalogId::oid, palloc(), _tableInfo::parents, _tableAttachInfo::parentTbl, _tableAttachInfo::partitionTbl, pg_fatal, pg_malloc_array, pg_realloc_array, pg_strdup(), and CatalogId::tableoid.

Referenced by getSchemaData().

◆ getDumpableObjects()

void getDumpableObjects ( DumpableObject ***  objs,
int *  numObjs 
)

Definition at line 762 of file common.c.

763 {
764  int i,
765  j;
766 
768  j = 0;
769  for (i = 1; i < allocedDumpIds; i++)
770  {
771  if (dumpIdMap[i])
772  (*objs)[j++] = dumpIdMap[i];
773  }
774  *numObjs = j;
775 }

References allocedDumpIds, dumpIdMap, i, j, and pg_malloc_array.

Referenced by getTableDataFKConstraints(), and main().

◆ getMaxDumpId()

DumpId getMaxDumpId ( void  )

Definition at line 719 of file common.c.

720 {
721  return lastDumpId;
722 }

References lastDumpId.

Referenced by findDependencyLoops(), and TopoSort().

◆ getSchemaData()

TableInfo* getSchemaData ( Archive fout,
int *  numTablesPtr 
)

Definition at line 98 of file common.c.

99 {
100  TableInfo *tblinfo;
101  ExtensionInfo *extinfo;
102  InhInfo *inhinfo;
103  int numTables;
104  int numExtensions;
105  int numInherits;
106 
107  /*
108  * We must read extensions and extension membership info first, because
109  * extension membership needs to be consultable during decisions about
110  * whether other objects are to be dumped.
111  */
112  pg_log_info("reading extensions");
113  extinfo = getExtensions(fout, &numExtensions);
114 
115  pg_log_info("identifying extension members");
116  getExtensionMembership(fout, extinfo, numExtensions);
117 
118  pg_log_info("reading schemas");
119  getNamespaces(fout);
120 
121  /*
122  * getTables should be done as soon as possible, so as to minimize the
123  * window between starting our transaction and acquiring per-table locks.
124  * However, we have to do getNamespaces first because the tables get
125  * linked to their containing namespaces during getTables.
126  */
127  pg_log_info("reading user-defined tables");
128  tblinfo = getTables(fout, &numTables);
129 
130  getOwnedSeqs(fout, tblinfo, numTables);
131 
132  pg_log_info("reading user-defined functions");
133  getFuncs(fout);
134 
135  /* this must be after getTables and getFuncs */
136  pg_log_info("reading user-defined types");
137  getTypes(fout);
138 
139  /* this must be after getFuncs, too */
140  pg_log_info("reading procedural languages");
141  getProcLangs(fout);
142 
143  pg_log_info("reading user-defined aggregate functions");
144  getAggregates(fout);
145 
146  pg_log_info("reading user-defined operators");
147  getOperators(fout);
148 
149  pg_log_info("reading user-defined access methods");
150  getAccessMethods(fout);
151 
152  pg_log_info("reading user-defined operator classes");
153  getOpclasses(fout);
154 
155  pg_log_info("reading user-defined operator families");
156  getOpfamilies(fout);
157 
158  pg_log_info("reading user-defined text search parsers");
159  getTSParsers(fout);
160 
161  pg_log_info("reading user-defined text search templates");
162  getTSTemplates(fout);
163 
164  pg_log_info("reading user-defined text search dictionaries");
165  getTSDictionaries(fout);
166 
167  pg_log_info("reading user-defined text search configurations");
168  getTSConfigurations(fout);
169 
170  pg_log_info("reading user-defined foreign-data wrappers");
172 
173  pg_log_info("reading user-defined foreign servers");
174  getForeignServers(fout);
175 
176  pg_log_info("reading default privileges");
177  getDefaultACLs(fout);
178 
179  pg_log_info("reading user-defined collations");
180  getCollations(fout);
181 
182  pg_log_info("reading user-defined conversions");
183  getConversions(fout);
184 
185  pg_log_info("reading type casts");
186  getCasts(fout);
187 
188  pg_log_info("reading transforms");
189  getTransforms(fout);
190 
191  pg_log_info("reading table inheritance information");
192  inhinfo = getInherits(fout, &numInherits);
193 
194  pg_log_info("reading event triggers");
195  getEventTriggers(fout);
196 
197  /* Identify extension configuration tables that should be dumped */
198  pg_log_info("finding extension tables");
199  processExtensionTables(fout, extinfo, numExtensions);
200 
201  /* Link tables to parents, mark parents of target tables interesting */
202  pg_log_info("finding inheritance relationships");
203  flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
204 
205  pg_log_info("reading column info for interesting tables");
206  getTableAttrs(fout, tblinfo, numTables);
207 
208  pg_log_info("flagging inherited columns in subtables");
209  flagInhAttrs(fout, tblinfo, numTables);
210 
211  pg_log_info("reading partitioning data");
212  getPartitioningInfo(fout);
213 
214  pg_log_info("reading indexes");
215  getIndexes(fout, tblinfo, numTables);
216 
217  pg_log_info("flagging indexes in partitioned tables");
218  flagInhIndexes(fout, tblinfo, numTables);
219 
220  pg_log_info("reading extended statistics");
221  getExtendedStatistics(fout);
222 
223  pg_log_info("reading constraints");
224  getConstraints(fout, tblinfo, numTables);
225 
226  pg_log_info("reading triggers");
227  getTriggers(fout, tblinfo, numTables);
228 
229  pg_log_info("reading rewrite rules");
230  getRules(fout);
231 
232  pg_log_info("reading policies");
233  getPolicies(fout, tblinfo, numTables);
234 
235  pg_log_info("reading publications");
236  getPublications(fout);
237 
238  pg_log_info("reading publication membership of tables");
239  getPublicationTables(fout, tblinfo, numTables);
240 
241  pg_log_info("reading publication membership of schemas");
243 
244  pg_log_info("reading subscriptions");
245  getSubscriptions(fout);
246 
247  pg_log_info("reading subscription membership of tables");
248  getSubscriptionTables(fout);
249 
250  free(inhinfo); /* not needed any longer */
251 
252  *numTablesPtr = numTables;
253  return tblinfo;
254 }
static void flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables, InhInfo *inhinfo, int numInherits)
Definition: common.c:269
static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables)
static void flagInhAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
Definition: common.c:477
#define free(a)
Definition: header.h:65
#define pg_log_info(...)
Definition: logging.h:124
void getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:7694
void getPublicationNamespaces(Archive *fout)
Definition: pg_dump.c:4398
void getPartitioningInfo(Archive *fout)
Definition: pg_dump.c:7245
void getForeignDataWrappers(Archive *fout)
Definition: pg_dump.c:9451
void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:3919
void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[], int numExtensions)
Definition: pg_dump.c:17891
void getTypes(Archive *fout)
Definition: pg_dump.c:5805
void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:7126
void getOpclasses(Archive *fout)
Definition: pg_dump.c:6222
void getForeignServers(Archive *fout)
Definition: pg_dump.c:9535
void getFuncs(Archive *fout)
Definition: pg_dump.c:6485
void getTSDictionaries(Archive *fout)
Definition: pg_dump.c:9267
void getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:4485
void getCasts(Archive *fout)
Definition: pg_dump.c:8427
void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:7305
void getTSConfigurations(Archive *fout)
Definition: pg_dump.c:9392
void getAccessMethods(Archive *fout)
Definition: pg_dump.c:6160
void getConversions(Archive *fout)
Definition: pg_dump.c:6098
void getRules(Archive *fout)
Definition: pg_dump.c:7972
InhInfo * getInherits(Archive *fout, int *numInherits)
Definition: pg_dump.c:7189
void getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
Definition: pg_dump.c:8621
void getSubscriptionTables(Archive *fout)
Definition: pg_dump.c:4939
void getCollations(Archive *fout)
Definition: pg_dump.c:6036
void getAggregates(Archive *fout)
Definition: pg_dump.c:6344
void getNamespaces(Archive *fout)
Definition: pg_dump.c:5601
void getPublications(Archive *fout)
Definition: pg_dump.c:4204
void getTSParsers(Archive *fout)
Definition: pg_dump.c:9193
void getExtendedStatistics(Archive *fout)
Definition: pg_dump.c:7615
void processExtensionTables(Archive *fout, ExtensionInfo extinfo[], int numExtensions)
Definition: pg_dump.c:17984
void getDefaultACLs(Archive *fout)
Definition: pg_dump.c:9623
void getSubscriptions(Archive *fout)
Definition: pg_dump.c:4739
ExtensionInfo * getExtensions(Archive *fout, int *numExtensions)
Definition: pg_dump.c:5733
void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:8069
void getTransforms(Archive *fout)
Definition: pg_dump.c:8537
void getEventTriggers(Archive *fout)
Definition: pg_dump.c:8265
TableInfo * getTables(Archive *fout, int *numTables)
Definition: pg_dump.c:6680
void getTSTemplates(Archive *fout)
Definition: pg_dump.c:9333
void getProcLangs(Archive *fout)
Definition: pg_dump.c:8343
void getOperators(Archive *fout)
Definition: pg_dump.c:5968
void getOpfamilies(Archive *fout)
Definition: pg_dump.c:6282

References flagInhAttrs(), flagInhIndexes(), flagInhTables(), free, getAccessMethods(), getAggregates(), getCasts(), getCollations(), getConstraints(), getConversions(), getDefaultACLs(), getEventTriggers(), getExtendedStatistics(), getExtensionMembership(), getExtensions(), getForeignDataWrappers(), getForeignServers(), getFuncs(), getIndexes(), getInherits(), getNamespaces(), getOpclasses(), getOperators(), getOpfamilies(), getOwnedSeqs(), getPartitioningInfo(), getPolicies(), getProcLangs(), getPublicationNamespaces(), getPublications(), getPublicationTables(), getRules(), getSubscriptions(), getSubscriptionTables(), getTableAttrs(), getTables(), getTransforms(), getTriggers(), getTSConfigurations(), getTSDictionaries(), getTSParsers(), getTSTemplates(), getTypes(), pg_log_info, and processExtensionTables().

Referenced by main().

◆ parseOidArray()

void parseOidArray ( const char *  str,
Oid array,
int  arraysize 
)

Definition at line 1058 of file common.c.

1059 {
1060  int j,
1061  argNum;
1062  char temp[100];
1063  char s;
1064 
1065  argNum = 0;
1066  j = 0;
1067  for (;;)
1068  {
1069  s = *str++;
1070  if (s == ' ' || s == '\0')
1071  {
1072  if (j > 0)
1073  {
1074  if (argNum >= arraysize)
1075  pg_fatal("could not parse numeric array \"%s\": too many numbers", str);
1076  temp[j] = '\0';
1077  array[argNum++] = atooid(temp);
1078  j = 0;
1079  }
1080  if (s == '\0')
1081  break;
1082  }
1083  else
1084  {
1085  if (!(isdigit((unsigned char) s) || s == '-') ||
1086  j >= sizeof(temp) - 1)
1087  pg_fatal("could not parse numeric array \"%s\": invalid character in number", str);
1088  temp[j++] = s;
1089  }
1090  }
1091 
1092  while (argNum < arraysize)
1093  array[argNum++] = InvalidOid;
1094 }
const char * str
#define InvalidOid
Definition: postgres_ext.h:36
#define atooid(x)
Definition: postgres_ext.h:42

References atooid, InvalidOid, j, pg_fatal, and str.

Referenced by dumpFunc(), getAggregates(), getFuncs(), and getIndexes().

◆ recordAdditionalCatalogID()

void recordAdditionalCatalogID ( CatalogId  catId,
DumpableObject dobj 
)

Definition at line 684 of file common.c.

685 {
686  CatalogIdMapEntry *entry;
687  bool found;
688 
689  /* CatalogId hash table must exist, if we have a DumpableObject */
690  Assert(catalogIdHash != NULL);
691 
692  /* Add reference to CatalogId hash */
693  entry = catalogid_insert(catalogIdHash, catId, &found);
694  if (!found)
695  {
696  entry->dobj = NULL;
697  entry->ext = NULL;
698  }
699  Assert(entry->dobj == NULL);
700  entry->dobj = dobj;
701 }

References Assert, catalogIdHash, _catalogIdMapEntry::dobj, and _catalogIdMapEntry::ext.

Referenced by getLOs().

◆ recordExtensionMembership()

void recordExtensionMembership ( CatalogId  catId,
ExtensionInfo ext 
)

Definition at line 1010 of file common.c.

1011 {
1012  CatalogIdMapEntry *entry;
1013  bool found;
1014 
1015  /* CatalogId hash table must exist, if we have an ExtensionInfo */
1016  Assert(catalogIdHash != NULL);
1017 
1018  /* Add reference to CatalogId hash */
1019  entry = catalogid_insert(catalogIdHash, catId, &found);
1020  if (!found)
1021  {
1022  entry->dobj = NULL;
1023  entry->ext = NULL;
1024  }
1025  Assert(entry->ext == NULL);
1026  entry->ext = ext;
1027 }

References Assert, catalogIdHash, _catalogIdMapEntry::dobj, and _catalogIdMapEntry::ext.

Referenced by getExtensionMembership().

◆ removeObjectDependency()

void removeObjectDependency ( DumpableObject dobj,
DumpId  refId 
)

◆ strInArray()

static int strInArray ( const char *  pattern,
char **  arr,
int  arr_size 
)
static

Definition at line 1105 of file common.c.

1106 {
1107  int i;
1108 
1109  for (i = 0; i < arr_size; i++)
1110  {
1111  if (strcmp(pattern, arr[i]) == 0)
1112  return i;
1113  }
1114  return -1;
1115 }

References i.

Referenced by flagInhAttrs().

Variable Documentation

◆ allocedDumpIds

int allocedDumpIds = 0
static

Definition at line 39 of file common.c.

Referenced by AssignDumpId(), findObjectByDumpId(), and getDumpableObjects().

◆ catalogIdHash

catalogid_hash* catalogIdHash = NULL
static

◆ dumpIdMap

DumpableObject** dumpIdMap = NULL
static

Definition at line 38 of file common.c.

Referenced by AssignDumpId(), findObjectByDumpId(), and getDumpableObjects().

◆ lastDumpId

DumpId lastDumpId = 0
static

Definition at line 40 of file common.c.

Referenced by AssignDumpId(), createDumpId(), and getMaxDumpId().