]> granicus.if.org Git - postgresql/blobdiff - src/include/catalog/pg_constraint.h
CREATE INDEX ... INCLUDING (column[, ...])
[postgresql] / src / include / catalog / pg_constraint.h
index fdc8c0676da6f70cac6f7812282dac4f7bcf2dc7..bff2fd175b6a5d0510ea8767e78b72c6327ceebd 100644 (file)
@@ -5,13 +5,13 @@
  *       along with the relation's initial contents.
  *
  *
- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.15 2005/03/25 21:57:59 tgl Exp $
+ * src/include/catalog/pg_constraint.h
  *
  * NOTES
- *       the genbki.sh script reads this file and generates .bki
+ *       the genbki.pl script reads this file and generates .bki
  *       information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
 #ifndef PG_CONSTRAINT_H
 #define PG_CONSTRAINT_H
 
-/* ----------------
- *             postgres.h contains the system type definitions and the
- *             CATALOG(), BOOTSTRAP and DATA() sugar words so this file
- *             can be read by both genbki.sh and the C compiler.
- * ----------------
- */
+#include "catalog/genbki.h"
 
 /* ----------------
  *             pg_constraint definition.  cpp turns this into
  *             typedef struct FormData_pg_constraint
  * ----------------
  */
-CATALOG(pg_constraint)
+#define ConstraintRelationId  2606
+
+CATALOG(pg_constraint,2606)
 {
        /*
         * conname + connamespace is deliberately not unique; we allow, for
         * example, the same name to be used for constraints of different
         * relations.  This is partly for backwards compatibility with past
-        * Postgres practice, and partly because we don't want to have to
-        * obtain a global lock to generate a globally unique name for a
-        * nameless constraint.  We associate a namespace with constraint
-        * names only for SQL92 compatibility.
+        * Postgres practice, and partly because we don't want to have to obtain a
+        * global lock to generate a globally unique name for a nameless
+        * constraint.  We associate a namespace with constraint names only for
+        * SQL-spec compatibility.
         */
        NameData        conname;                /* name of this constraint */
        Oid                     connamespace;   /* OID of namespace containing constraint */
        char            contype;                /* constraint type; see codes below */
        bool            condeferrable;  /* deferrable constraint? */
        bool            condeferred;    /* deferred by default? */
+       bool            convalidated;   /* constraint has been validated? */
 
        /*
-        * conrelid and conkey are only meaningful if the constraint applies
-        * to a specific relation (this excludes domain constraints and
-        * assertions).  Otherwise conrelid is 0 and conkey is NULL.
+        * conrelid and conkey are only meaningful if the constraint applies to a
+        * specific relation (this excludes domain constraints and assertions).
+        * Otherwise conrelid is 0 and conkey is NULL.
         */
        Oid                     conrelid;               /* relation this constraint constrains */
 
        /*
         * contypid links to the pg_type row for a domain if this is a domain
-        * constraint.  Otherwise it's 0.
+        * constraint.  Otherwise it's 0.
         *
         * For SQL-style global ASSERTIONs, both conrelid and contypid would be
-        * zero.  This is not presently supported, however.
+        * zero. This is not presently supported, however.
         */
        Oid                     contypid;               /* domain this constraint constrains */
 
+       /*
+        * conindid links to the index supporting the constraint, if any;
+        * otherwise it's 0.  This is used for unique, primary-key, and exclusion
+        * constraints, and less obviously for foreign-key constraints (where the
+        * index is a unique index on the referenced relation's referenced
+        * columns).  Notice that the index is on conrelid in the first case but
+        * confrelid in the second.
+        */
+       Oid                     conindid;               /* index supporting this constraint */
+
        /*
         * These fields, plus confkey, are only meaningful for a foreign-key
-        * constraint.  Otherwise confrelid is 0 and the char fields are
-        * spaces.
+        * constraint.  Otherwise confrelid is 0 and the char fields are spaces.
         */
        Oid                     confrelid;              /* relation referenced by foreign key */
        char            confupdtype;    /* foreign key's ON UPDATE action */
        char            confdeltype;    /* foreign key's ON DELETE action */
        char            confmatchtype;  /* foreign key's match type */
 
+       /* Has a local definition (hence, do not drop when coninhcount is 0) */
+       bool            conislocal;
+
+       /* Number of times inherited from direct parent relation(s) */
+       int32           coninhcount;
+
+       /* Has a local definition and cannot be inherited */
+       bool            connoinherit;
+
+#ifdef CATALOG_VARLEN                  /* variable-length fields start here */
+
        /*
-        * VARIABLE LENGTH FIELDS start here.  These fields may be NULL, too.
+        * Columns of conrelid that the constraint applies to, if known (this is
+        * NULL for trigger constraints)
         */
+       int16           conkey[1];
 
        /*
-        * Columns of conrelid that the constraint applies to
+        * Columns of conrelid that the constraint does not apply to,
+        * but included into the same index with key columns.
         */
-       int2            conkey[1];
+       int16           conincluding[1];
 
        /*
         * If a foreign key, the referenced columns of confrelid
         */
-       int2            confkey[1];
+       int16           confkey[1];
+
+       /*
+        * If a foreign key, the OIDs of the PK = FK equality operators for each
+        * column of the constraint
+        */
+       Oid                     conpfeqop[1];
+
+       /*
+        * If a foreign key, the OIDs of the PK = PK equality operators for each
+        * column of the constraint (i.e., equality for the referenced columns)
+        */
+       Oid                     conppeqop[1];
+
+       /*
+        * If a foreign key, the OIDs of the FK = FK equality operators for each
+        * column of the constraint (i.e., equality for the referencing columns)
+        */
+       Oid                     conffeqop[1];
+
+       /*
+        * If an exclusion constraint, the OIDs of the exclusion operators for
+        * each column of the constraint
+        */
+       Oid                     conexclop[1];
 
        /*
         * If a check constraint, nodeToString representation of expression
         */
-       text            conbin;
+       pg_node_tree conbin;
 
        /*
         * If a check constraint, source-text representation of expression
         */
        text            consrc;
+#endif
 } FormData_pg_constraint;
 
 /* ----------------
@@ -110,22 +156,39 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  *             compiler constants for pg_constraint
  * ----------------
  */
-#define Natts_pg_constraint                                    15
+#define Natts_pg_constraint                                    25
 #define Anum_pg_constraint_conname                     1
 #define Anum_pg_constraint_connamespace                2
 #define Anum_pg_constraint_contype                     3
 #define Anum_pg_constraint_condeferrable       4
 #define Anum_pg_constraint_condeferred         5
-#define Anum_pg_constraint_conrelid                    6
-#define Anum_pg_constraint_contypid                    7
-#define Anum_pg_constraint_confrelid           8
-#define Anum_pg_constraint_confupdtype         9
-#define Anum_pg_constraint_confdeltype         10
-#define Anum_pg_constraint_confmatchtype       11
-#define Anum_pg_constraint_conkey                      12
-#define Anum_pg_constraint_confkey                     13
-#define Anum_pg_constraint_conbin                      14
-#define Anum_pg_constraint_consrc                      15
+#define Anum_pg_constraint_convalidated                6
+#define Anum_pg_constraint_conrelid                    7
+#define Anum_pg_constraint_contypid                    8
+#define Anum_pg_constraint_conindid                    9
+#define Anum_pg_constraint_confrelid           10
+#define Anum_pg_constraint_confupdtype         11
+#define Anum_pg_constraint_confdeltype         12
+#define Anum_pg_constraint_confmatchtype       13
+#define Anum_pg_constraint_conislocal          14
+#define Anum_pg_constraint_coninhcount         15
+#define Anum_pg_constraint_connoinherit                16
+#define Anum_pg_constraint_conkey                      17
+#define Anum_pg_constraint_conincluding                18
+#define Anum_pg_constraint_confkey                     19
+#define Anum_pg_constraint_conpfeqop           20
+#define Anum_pg_constraint_conppeqop           21
+#define Anum_pg_constraint_conffeqop           22
+#define Anum_pg_constraint_conexclop           23
+#define Anum_pg_constraint_conbin                      24
+#define Anum_pg_constraint_consrc                      25
+
+/* ----------------
+ *             initial contents of pg_constraint
+ * ----------------
+ */
+
+/* nothing, at present */
 
 
 /* Valid values for contype */
@@ -133,6 +196,8 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 #define CONSTRAINT_FOREIGN                     'f'
 #define CONSTRAINT_PRIMARY                     'p'
 #define CONSTRAINT_UNIQUE                      'u'
+#define CONSTRAINT_TRIGGER                     't'
+#define CONSTRAINT_EXCLUSION           'x'
 
 /*
  * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx
@@ -140,47 +205,4 @@ typedef FormData_pg_constraint *Form_pg_constraint;
  * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.
  */
 
-/*
- * Identify constraint type for lookup purposes
- */
-typedef enum ConstraintCategory
-{
-       CONSTRAINT_RELATION,
-       CONSTRAINT_DOMAIN,
-       CONSTRAINT_ASSERTION            /* for future expansion */
-} ConstraintCategory;
-
-/*
- * prototypes for functions in pg_constraint.c
- */
-extern Oid CreateConstraintEntry(const char *constraintName,
-                                         Oid constraintNamespace,
-                                         char constraintType,
-                                         bool isDeferrable,
-                                         bool isDeferred,
-                                         Oid relId,
-                                         const int16 *constraintKey,
-                                         int constraintNKeys,
-                                         Oid domainId,
-                                         Oid foreignRelId,
-                                         const int16 *foreignKey,
-                                         int foreignNKeys,
-                                         char foreignUpdateType,
-                                         char foreignDeleteType,
-                                         char foreignMatchType,
-                                         Oid indexRelId,
-                                         Node *conExpr,
-                                         const char *conBin,
-                                         const char *conSrc);
-
-extern void RemoveConstraintById(Oid conId);
-
-extern bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId,
-                                        Oid objNamespace, const char *conname);
-extern char *ChooseConstraintName(const char *name1, const char *name2,
-                                        const char *label, Oid namespace,
-                                        List *others);
-
-extern char *GetConstraintNameForTrigger(Oid triggerId);
-
 #endif   /* PG_CONSTRAINT_H */