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 "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, DumpOptions *dopt, 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 79 of file common.c.

◆ SH_DECLARE

#define SH_DECLARE

Definition at line 75 of file common.c.

◆ SH_DEFINE

#define SH_DEFINE

Definition at line 76 of file common.c.

◆ SH_ELEMENT_TYPE

#define SH_ELEMENT_TYPE   CatalogIdMapEntry

Definition at line 66 of file common.c.

◆ SH_EQUAL

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

Definition at line 70 of file common.c.

◆ SH_GET_HASH

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

Definition at line 72 of file common.c.

◆ SH_HASH_KEY

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

Definition at line 69 of file common.c.

◆ SH_KEY

#define SH_KEY   catId

Definition at line 68 of file common.c.

◆ SH_KEY_TYPE

#define SH_KEY_TYPE   CatalogId

Definition at line 67 of file common.c.

◆ SH_PREFIX

#define SH_PREFIX   catalogid

Definition at line 65 of file common.c.

◆ SH_RAW_ALLOCATOR

#define SH_RAW_ALLOCATOR   pg_malloc0

Definition at line 74 of file common.c.

◆ SH_SCOPE

#define SH_SCOPE   static inline

Definition at line 73 of file common.c.

◆ SH_STORE_HASH

#define SH_STORE_HASH

Definition at line 71 of file common.c.

Typedef Documentation

◆ CatalogIdMapEntry

Function Documentation

◆ addObjectDependency()

void addObjectDependency ( DumpableObject dobj,
DumpId  refId 
)

◆ AssignDumpId()

void AssignDumpId ( DumpableObject dobj)

Definition at line 634 of file common.c.

635 {
636  dobj->dumpId = ++lastDumpId;
637  dobj->name = NULL; /* must be set later */
638  dobj->namespace = NULL; /* may be set later */
639  dobj->dump = DUMP_COMPONENT_ALL; /* default assumption */
640  dobj->dump_contains = DUMP_COMPONENT_ALL; /* default assumption */
641  /* All objects have definitions; we may set more components bits later */
643  dobj->ext_member = false; /* default assumption */
644  dobj->depends_on_ext = false; /* default assumption */
645  dobj->dependencies = NULL;
646  dobj->nDeps = 0;
647  dobj->allocDeps = 0;
648 
649  /* Add object to dumpIdMap[], enlarging that array if need be */
650  while (dobj->dumpId >= allocedDumpIds)
651  {
652  int newAlloc;
653 
654  if (allocedDumpIds <= 0)
655  {
656  newAlloc = 256;
658  }
659  else
660  {
661  newAlloc = allocedDumpIds * 2;
663  }
664  memset(dumpIdMap + allocedDumpIds, 0,
665  (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
666  allocedDumpIds = newAlloc;
667  }
668  dumpIdMap[dobj->dumpId] = dobj;
669 
670  /* If it has a valid CatalogId, enter it into the hash table */
671  if (OidIsValid(dobj->catId.tableoid))
672  {
673  CatalogIdMapEntry *entry;
674  bool found;
675 
676  /* Initialize CatalogId hash table if not done yet */
677  if (catalogIdHash == NULL)
678  catalogIdHash = catalogid_create(CATALOGIDHASH_INITIAL_SIZE, NULL);
679 
680  entry = catalogid_insert(catalogIdHash, dobj->catId, &found);
681  if (!found)
682  {
683  entry->dobj = NULL;
684  entry->ext = NULL;
685  }
686  Assert(entry->dobj == NULL);
687  entry->dobj = dobj;
688  }
689 }
static int allocedDumpIds
Definition: common.c:37
static DumpableObject ** dumpIdMap
Definition: common.c:36
#define CATALOGIDHASH_INITIAL_SIZE
Definition: common.c:79
static catalogid_hash * catalogIdHash
Definition: common.c:81
static DumpId lastDumpId
Definition: common.c:38
#define Assert(condition)
Definition: c.h:812
#define OidIsValid(objectId)
Definition: c.h:729
#define DUMP_COMPONENT_ALL
Definition: pg_dump.h:104
#define DUMP_COMPONENT_DEFINITION
Definition: pg_dump.h:97
Oid tableoid
Definition: pg_backup.h:271
ExtensionInfo * ext
Definition: common.c:62
DumpableObject * dobj
Definition: common.c:61
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 931 of file common.c.

932 {
933  CatalogId catId;
934  DumpableObject *dobj;
935 
936  catId.tableoid = CollationRelationId;
937  catId.oid = oid;
938  dobj = findObjectByCatalogId(catId);
939  Assert(dobj == NULL || dobj->objType == DO_COLLATION);
940  return (CollInfo *) dobj;
941 }
DumpableObject * findObjectByCatalogId(CatalogId catalogId)
Definition: common.c:755
@ 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 967 of file common.c.

968 {
969  CatalogId catId;
970  DumpableObject *dobj;
971 
972  catId.tableoid = ExtensionRelationId;
973  catId.oid = oid;
974  dobj = findObjectByCatalogId(catId);
975  Assert(dobj == NULL || dobj->objType == DO_EXTENSION);
976  return (ExtensionInfo *) dobj;
977 }
@ 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 895 of file common.c.

896 {
897  CatalogId catId;
898  DumpableObject *dobj;
899 
900  catId.tableoid = ProcedureRelationId;
901  catId.oid = oid;
902  dobj = findObjectByCatalogId(catId);
903  Assert(dobj == NULL || dobj->objType == DO_FUNC);
904  return (FuncInfo *) dobj;
905 }
@ 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 858 of file common.c.

859 {
860  CatalogId catId;
861  DumpableObject *dobj;
862 
863  catId.tableoid = RelationRelationId;
864  catId.oid = oid;
865  dobj = findObjectByCatalogId(catId);
866  Assert(dobj == NULL || dobj->objType == DO_INDEX);
867  return (IndxInfo *) dobj;
868 }
@ 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 949 of file common.c.

950 {
951  CatalogId catId;
952  DumpableObject *dobj;
953 
954  catId.tableoid = NamespaceRelationId;
955  catId.oid = oid;
956  dobj = findObjectByCatalogId(catId);
957  Assert(dobj == NULL || dobj->objType == DO_NAMESPACE);
958  return (NamespaceInfo *) dobj;
959 }
@ 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 755 of file common.c.

756 {
757  CatalogIdMapEntry *entry;
758 
759  if (catalogIdHash == NULL)
760  return NULL; /* no objects exist yet */
761 
762  entry = catalogid_lookup(catalogIdHash, catalogId);
763  if (entry == NULL)
764  return NULL;
765  return entry->dobj;
766 }

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 742 of file common.c.

743 {
744  if (dumpId <= 0 || dumpId >= allocedDumpIds)
745  return NULL; /* out of range? */
746  return dumpIdMap[dumpId];
747 }

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 913 of file common.c.

914 {
915  CatalogId catId;
916  DumpableObject *dobj;
917 
918  catId.tableoid = OperatorRelationId;
919  catId.oid = oid;
920  dobj = findObjectByCatalogId(catId);
921  Assert(dobj == NULL || dobj->objType == DO_OPERATOR);
922  return (OprInfo *) dobj;
923 }
@ 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 1046 of file common.c.

1047 {
1048  CatalogIdMapEntry *entry;
1049 
1050  if (catalogIdHash == NULL)
1051  return NULL; /* no objects exist yet */
1052 
1053  entry = catalogid_lookup(catalogIdHash, catalogId);
1054  if (entry == NULL)
1055  return NULL;
1056  return entry->ext;
1057 }

References catalogIdHash, and _catalogIdMapEntry::ext.

Referenced by checkExtensionMembership().

◆ findPublicationByOid()

PublicationInfo* findPublicationByOid ( Oid  oid)

Definition at line 985 of file common.c.

986 {
987  CatalogId catId;
988  DumpableObject *dobj;
989 
990  catId.tableoid = PublicationRelationId;
991  catId.oid = oid;
992  dobj = findObjectByCatalogId(catId);
993  Assert(dobj == NULL || dobj->objType == DO_PUBLICATION);
994  return (PublicationInfo *) dobj;
995 }
@ 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 1003 of file common.c.

1004 {
1005  CatalogId catId;
1006  DumpableObject *dobj;
1007 
1008  catId.tableoid = SubscriptionRelationId;
1009  catId.oid = oid;
1010  dobj = findObjectByCatalogId(catId);
1011  Assert(dobj == NULL || dobj->objType == DO_SUBSCRIPTION);
1012  return (SubscriptionInfo *) dobj;
1013 }
@ 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 876 of file common.c.

877 {
878  CatalogId catId;
879  DumpableObject *dobj;
880 
881  catId.tableoid = TypeRelationId;
882  catId.oid = oid;
883  dobj = findObjectByCatalogId(catId);
884  Assert(dobj == NULL ||
885  dobj->objType == DO_TYPE || dobj->objType == DO_DUMMY_TYPE);
886  return (TypeInfo *) dobj;
887 }
@ 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 binary_upgrade_set_type_oids_by_type_oid(), collectComments(), collectSecLabels(), DOTypeNameCompare(), getCasts(), getFormattedTypeName(), and getTransforms().

◆ flagInhAttrs()

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

Definition at line 477 of file common.c.

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

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, _dumpableObject::dump, DUMP_COMPONENT_NONE, _dumpableObject::dumpId, i, _tableInfo::ispartition, j, _dumpableObject::name, _tableInfo::notnull_constrs, _tableInfo::notnull_islocal, _tableInfo::numatts, _tableInfo::numParents, _dumpableObject::objType, CatalogId::oid, _tableInfo::parents, pg_malloc_object, pg_strdup(), _tableInfo::relkind, Archive::remoteVersion, _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 386 of file common.c.

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

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 268 of file common.c.

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

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 774 of file common.c.

775 {
776  int i,
777  j;
778 
780  j = 0;
781  for (i = 1; i < allocedDumpIds; i++)
782  {
783  if (dumpIdMap[i])
784  (*objs)[j++] = dumpIdMap[i];
785  }
786  *numObjs = j;
787 }

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

Referenced by getTableDataFKConstraints(), and main().

◆ getMaxDumpId()

DumpId getMaxDumpId ( void  )

Definition at line 731 of file common.c.

732 {
733  return lastDumpId;
734 }

References lastDumpId.

Referenced by findDependencyLoops(), and TopoSort().

◆ getSchemaData()

TableInfo* getSchemaData ( Archive fout,
int *  numTablesPtr 
)

Definition at line 97 of file common.c.

98 {
99  TableInfo *tblinfo;
100  ExtensionInfo *extinfo;
101  InhInfo *inhinfo;
102  int numTables;
103  int numExtensions;
104  int numInherits;
105 
106  /*
107  * We must read extensions and extension membership info first, because
108  * extension membership needs to be consultable during decisions about
109  * whether other objects are to be dumped.
110  */
111  pg_log_info("reading extensions");
112  extinfo = getExtensions(fout, &numExtensions);
113 
114  pg_log_info("identifying extension members");
115  getExtensionMembership(fout, extinfo, numExtensions);
116 
117  pg_log_info("reading schemas");
118  getNamespaces(fout);
119 
120  /*
121  * getTables should be done as soon as possible, so as to minimize the
122  * window between starting our transaction and acquiring per-table locks.
123  * However, we have to do getNamespaces first because the tables get
124  * linked to their containing namespaces during getTables.
125  */
126  pg_log_info("reading user-defined tables");
127  tblinfo = getTables(fout, &numTables);
128 
129  getOwnedSeqs(fout, tblinfo, numTables);
130 
131  pg_log_info("reading user-defined functions");
132  getFuncs(fout);
133 
134  /* this must be after getTables and getFuncs */
135  pg_log_info("reading user-defined types");
136  getTypes(fout);
137 
138  /* this must be after getFuncs, too */
139  pg_log_info("reading procedural languages");
140  getProcLangs(fout);
141 
142  pg_log_info("reading user-defined aggregate functions");
143  getAggregates(fout);
144 
145  pg_log_info("reading user-defined operators");
146  getOperators(fout);
147 
148  pg_log_info("reading user-defined access methods");
149  getAccessMethods(fout);
150 
151  pg_log_info("reading user-defined operator classes");
152  getOpclasses(fout);
153 
154  pg_log_info("reading user-defined operator families");
155  getOpfamilies(fout);
156 
157  pg_log_info("reading user-defined text search parsers");
158  getTSParsers(fout);
159 
160  pg_log_info("reading user-defined text search templates");
161  getTSTemplates(fout);
162 
163  pg_log_info("reading user-defined text search dictionaries");
164  getTSDictionaries(fout);
165 
166  pg_log_info("reading user-defined text search configurations");
167  getTSConfigurations(fout);
168 
169  pg_log_info("reading user-defined foreign-data wrappers");
171 
172  pg_log_info("reading user-defined foreign servers");
173  getForeignServers(fout);
174 
175  pg_log_info("reading default privileges");
176  getDefaultACLs(fout);
177 
178  pg_log_info("reading user-defined collations");
179  getCollations(fout);
180 
181  pg_log_info("reading user-defined conversions");
182  getConversions(fout);
183 
184  pg_log_info("reading type casts");
185  getCasts(fout);
186 
187  pg_log_info("reading transforms");
188  getTransforms(fout);
189 
190  pg_log_info("reading table inheritance information");
191  inhinfo = getInherits(fout, &numInherits);
192 
193  pg_log_info("reading event triggers");
194  getEventTriggers(fout);
195 
196  /* Identify extension configuration tables that should be dumped */
197  pg_log_info("finding extension tables");
198  processExtensionTables(fout, extinfo, numExtensions);
199 
200  /* Link tables to parents, mark parents of target tables interesting */
201  pg_log_info("finding inheritance relationships");
202  flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
203 
204  pg_log_info("reading column info for interesting tables");
205  getTableAttrs(fout, tblinfo, numTables);
206 
207  pg_log_info("flagging inherited columns in subtables");
208  flagInhAttrs(fout, fout->dopt, tblinfo, numTables);
209 
210  pg_log_info("reading partitioning data");
211  getPartitioningInfo(fout);
212 
213  pg_log_info("reading indexes");
214  getIndexes(fout, tblinfo, numTables);
215 
216  pg_log_info("flagging indexes in partitioned tables");
217  flagInhIndexes(fout, tblinfo, numTables);
218 
219  pg_log_info("reading extended statistics");
220  getExtendedStatistics(fout);
221 
222  pg_log_info("reading constraints");
223  getConstraints(fout, tblinfo, numTables);
224 
225  pg_log_info("reading triggers");
226  getTriggers(fout, tblinfo, numTables);
227 
228  pg_log_info("reading rewrite rules");
229  getRules(fout);
230 
231  pg_log_info("reading policies");
232  getPolicies(fout, tblinfo, numTables);
233 
234  pg_log_info("reading publications");
235  getPublications(fout);
236 
237  pg_log_info("reading publication membership of tables");
238  getPublicationTables(fout, tblinfo, numTables);
239 
240  pg_log_info("reading publication membership of schemas");
242 
243  pg_log_info("reading subscriptions");
244  getSubscriptions(fout);
245 
246  pg_log_info("reading subscription membership of tables");
247  getSubscriptionTables(fout);
248 
249  free(inhinfo); /* not needed any longer */
250 
251  *numTablesPtr = numTables;
252  return tblinfo;
253 }
static void flagInhAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tblinfo, int numTables)
Definition: common.c:477
static void flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables, InhInfo *inhinfo, int numInherits)
Definition: common.c:268
static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables)
#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:7812
void getPublicationNamespaces(Archive *fout)
Definition: pg_dump.c:4483
void getPartitioningInfo(Archive *fout)
Definition: pg_dump.c:7353
void getForeignDataWrappers(Archive *fout)
Definition: pg_dump.c:9719
void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:3992
void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[], int numExtensions)
Definition: pg_dump.c:18424
void getTypes(Archive *fout)
Definition: pg_dump.c:5909
void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:7234
void getOpclasses(Archive *fout)
Definition: pg_dump.c:6330
void getForeignServers(Archive *fout)
Definition: pg_dump.c:9803
void getFuncs(Archive *fout)
Definition: pg_dump.c:6593
void getTSDictionaries(Archive *fout)
Definition: pg_dump.c:9535
void getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:4570
void getCasts(Archive *fout)
Definition: pg_dump.c:8545
void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:7413
void getTSConfigurations(Archive *fout)
Definition: pg_dump.c:9660
void getAccessMethods(Archive *fout)
Definition: pg_dump.c:6268
void getConversions(Archive *fout)
Definition: pg_dump.c:6206
void getRules(Archive *fout)
Definition: pg_dump.c:8090
InhInfo * getInherits(Archive *fout, int *numInherits)
Definition: pg_dump.c:7297
void getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
Definition: pg_dump.c:8739
void getSubscriptionTables(Archive *fout)
Definition: pg_dump.c:5044
void getCollations(Archive *fout)
Definition: pg_dump.c:6144
void getAggregates(Archive *fout)
Definition: pg_dump.c:6452
void getNamespaces(Archive *fout)
Definition: pg_dump.c:5702
void getPublications(Archive *fout)
Definition: pg_dump.c:4277
void getTSParsers(Archive *fout)
Definition: pg_dump.c:9461
void getExtendedStatistics(Archive *fout)
Definition: pg_dump.c:7733
void processExtensionTables(Archive *fout, ExtensionInfo extinfo[], int numExtensions)
Definition: pg_dump.c:18517
void getDefaultACLs(Archive *fout)
Definition: pg_dump.c:9891
void getSubscriptions(Archive *fout)
Definition: pg_dump.c:4846
ExtensionInfo * getExtensions(Archive *fout, int *numExtensions)
Definition: pg_dump.c:5834
void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
Definition: pg_dump.c:8187
void getTransforms(Archive *fout)
Definition: pg_dump.c:8655
void getEventTriggers(Archive *fout)
Definition: pg_dump.c:8383
TableInfo * getTables(Archive *fout, int *numTables)
Definition: pg_dump.c:6788
void getTSTemplates(Archive *fout)
Definition: pg_dump.c:9601
void getProcLangs(Archive *fout)
Definition: pg_dump.c:8461
void getOperators(Archive *fout)
Definition: pg_dump.c:6076
void getOpfamilies(Archive *fout)
Definition: pg_dump.c:6390
DumpOptions * dopt
Definition: pg_backup.h:219

References Archive::dopt, 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 1070 of file common.c.

1071 {
1072  int j,
1073  argNum;
1074  char temp[100];
1075  char s;
1076 
1077  argNum = 0;
1078  j = 0;
1079  for (;;)
1080  {
1081  s = *str++;
1082  if (s == ' ' || s == '\0')
1083  {
1084  if (j > 0)
1085  {
1086  if (argNum >= arraysize)
1087  pg_fatal("could not parse numeric array \"%s\": too many numbers", str);
1088  temp[j] = '\0';
1089  array[argNum++] = atooid(temp);
1090  j = 0;
1091  }
1092  if (s == '\0')
1093  break;
1094  }
1095  else
1096  {
1097  if (!(isdigit((unsigned char) s) || s == '-') ||
1098  j >= sizeof(temp) - 1)
1099  pg_fatal("could not parse numeric array \"%s\": invalid character in number", str);
1100  temp[j++] = s;
1101  }
1102  }
1103 
1104  while (argNum < arraysize)
1105  array[argNum++] = InvalidOid;
1106 }
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 696 of file common.c.

697 {
698  CatalogIdMapEntry *entry;
699  bool found;
700 
701  /* CatalogId hash table must exist, if we have a DumpableObject */
702  Assert(catalogIdHash != NULL);
703 
704  /* Add reference to CatalogId hash */
705  entry = catalogid_insert(catalogIdHash, catId, &found);
706  if (!found)
707  {
708  entry->dobj = NULL;
709  entry->ext = NULL;
710  }
711  Assert(entry->dobj == NULL);
712  entry->dobj = dobj;
713 }

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

Referenced by getLOs().

◆ recordExtensionMembership()

void recordExtensionMembership ( CatalogId  catId,
ExtensionInfo ext 
)

Definition at line 1022 of file common.c.

1023 {
1024  CatalogIdMapEntry *entry;
1025  bool found;
1026 
1027  /* CatalogId hash table must exist, if we have an ExtensionInfo */
1028  Assert(catalogIdHash != NULL);
1029 
1030  /* Add reference to CatalogId hash */
1031  entry = catalogid_insert(catalogIdHash, catId, &found);
1032  if (!found)
1033  {
1034  entry->dobj = NULL;
1035  entry->ext = NULL;
1036  }
1037  Assert(entry->ext == NULL);
1038  entry->ext = ext;
1039 }

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 1117 of file common.c.

1118 {
1119  int i;
1120 
1121  for (i = 0; i < arr_size; i++)
1122  {
1123  if (strcmp(pattern, arr[i]) == 0)
1124  return i;
1125  }
1126  return -1;
1127 }

References i.

Referenced by flagInhAttrs().

Variable Documentation

◆ allocedDumpIds

int allocedDumpIds = 0
static

Definition at line 37 of file common.c.

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

◆ catalogIdHash

catalogid_hash* catalogIdHash = NULL
static

◆ dumpIdMap

DumpableObject** dumpIdMap = NULL
static

Definition at line 36 of file common.c.

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

◆ lastDumpId

DumpId lastDumpId = 0
static

Definition at line 38 of file common.c.

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