mirror of
https://github.com/postgres/postgres.git
synced 2025-12-22 17:42:17 +03:00
Inheritance overhaul by Chris Bitmead <chris@bitmead.com>
This commit is contained in:
@@ -8,7 +8,11 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.58 2000/05/30 00:49:43 momjian Exp $
|
||||
<<<<<<< creatinh.c
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.59 2000/06/09 01:44:03 momjian Exp $
|
||||
=======
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.59 2000/06/09 01:44:03 momjian Exp $
|
||||
>>>>>>> 1.58
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -34,6 +38,9 @@ static bool checkAttrExists(const char *attributeName,
|
||||
const char *attributeType, List *schema);
|
||||
static List *MergeAttributes(List *schema, List *supers, List **supconstr);
|
||||
static void StoreCatalogInheritance(Oid relationId, List *supers);
|
||||
static void
|
||||
setRelhassubclassInRelation(Oid relationId, bool relhassubclass);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* DefineRelation
|
||||
@@ -326,6 +333,7 @@ MergeAttributes(List *schema, List *supers, List **supconstr)
|
||||
TupleConstr *constr;
|
||||
|
||||
relation = heap_openr(name, AccessShareLock);
|
||||
setRelhassubclassInRelation(relation->rd_id, true);
|
||||
tupleDesc = RelationGetDescr(relation);
|
||||
constr = tupleDesc->constr;
|
||||
|
||||
@@ -660,3 +668,39 @@ checkAttrExists(const char *attributeName, const char *attributeType, List *sche
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
setRelhassubclassInRelation(Oid relationId, bool relhassubclass)
|
||||
{
|
||||
Relation relationRelation;
|
||||
HeapTuple tuple;
|
||||
Relation idescs[Num_pg_class_indices];
|
||||
|
||||
/*
|
||||
* Lock a relation given its Oid. Go to the RelationRelation (i.e.
|
||||
* pg_relation), find the appropriate tuple, and add the specified
|
||||
* lock to it.
|
||||
*/
|
||||
relationRelation = heap_openr(RelationRelationName, RowExclusiveLock);
|
||||
tuple = SearchSysCacheTuple(RELOID,
|
||||
ObjectIdGetDatum(relationId),
|
||||
0, 0, 0)
|
||||
;
|
||||
Assert(HeapTupleIsValid(tuple));
|
||||
|
||||
((Form_pg_class) GETSTRUCT(tuple))->relhassubclass = relhassubclass;
|
||||
heap_update(relationRelation, &tuple->t_self, tuple, NULL);
|
||||
|
||||
/* keep the catalog indices up to date */
|
||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
||||
CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple
|
||||
);
|
||||
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
||||
|
||||
heap_close(relationRelation, RowExclusiveLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.35 2000/05/31 00:28:15 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.36 2000/06/09 01:44:03 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -49,7 +49,12 @@ static bool parse_XactIsoLevel(char *);
|
||||
static bool parse_random_seed(char *);
|
||||
static bool show_random_seed(void);
|
||||
static bool reset_random_seed(void);
|
||||
static bool parse_examine_subclass(char *);
|
||||
static bool show_examine_subclass(void);
|
||||
static bool reset_examine_subclass(void);
|
||||
|
||||
#define examine_subclass_default true
|
||||
bool examine_subclass = examine_subclass_default;
|
||||
|
||||
/*
|
||||
* get_token
|
||||
@@ -164,6 +169,44 @@ get_token(char **tok, char **val, char *str)
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* EXAMINE_SUBCLASS
|
||||
*
|
||||
*/
|
||||
#define EXAMINE_SUBCLASS "EXAMINE_SUBCLASS"
|
||||
|
||||
static bool
|
||||
parse_examine_subclass(char *value)
|
||||
{
|
||||
if (strcasecmp(value, "on") == 0)
|
||||
examine_subclass = true;
|
||||
else if (strcasecmp(value, "off") == 0)
|
||||
examine_subclass = false;
|
||||
else if (strcasecmp(value, "default") == 0)
|
||||
examine_subclass = examine_subclass_default;
|
||||
else
|
||||
elog(ERROR, "Bad value for %s (%s)", EXAMINE_SUBCLASS, value);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool
|
||||
show_examine_subclass()
|
||||
{
|
||||
|
||||
if (examine_subclass)
|
||||
elog(NOTICE, "%s is ON", EXAMINE_SUBCLASS);
|
||||
else
|
||||
elog(NOTICE, "%s is OFF", EXAMINE_SUBCLASS);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool
|
||||
reset_examine_subclass(void)
|
||||
{
|
||||
examine_subclass = examine_subclass_default;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* DATE_STYLE
|
||||
@@ -545,6 +588,8 @@ SetPGVariable(const char *name, const char *value)
|
||||
#endif
|
||||
else if (strcasecmp(name, "random_seed")==0)
|
||||
parse_random_seed(pstrdup(value));
|
||||
else if (strcasecmp(name, "examine_subclass")==0)
|
||||
parse_examine_subclass(pstrdup(value));
|
||||
else
|
||||
SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET);
|
||||
}
|
||||
@@ -567,6 +612,8 @@ GetPGVariable(const char *name)
|
||||
#endif
|
||||
else if (strcasecmp(name, "random_seed")==0)
|
||||
show_random_seed();
|
||||
else if (strcasecmp(name, "examine_subclass")==0)
|
||||
show_examine_subclass();
|
||||
else
|
||||
{
|
||||
const char * val = GetConfigOption(name, superuser());
|
||||
@@ -574,7 +621,6 @@ GetPGVariable(const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ResetPGVariable(const char *name)
|
||||
{
|
||||
@@ -592,6 +638,8 @@ ResetPGVariable(const char *name)
|
||||
#endif
|
||||
else if (strcasecmp(name, "random_seed")==0)
|
||||
reset_random_seed();
|
||||
else if (strcasecmp(name, "examine_subclass")==0)
|
||||
reset_examine_subclass();
|
||||
else
|
||||
SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user