aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/cache/syscache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/cache/syscache.c')
-rw-r--r--src/backend/utils/cache/syscache.c1057
1 files changed, 545 insertions, 512 deletions
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index 460e8d40af0..5f6c22b95fc 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -1,37 +1,37 @@
/*-------------------------------------------------------------------------
*
* syscache.c--
- * System cache management routines
+ * System cache management routines
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.4 1996/11/06 10:31:29 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.5 1997/09/07 04:53:10 momjian Exp $
*
* NOTES
- * These routines allow the parser/planner/executor to perform
- * rapid lookups on the contents of the system catalogs.
+ * These routines allow the parser/planner/executor to perform
+ * rapid lookups on the contents of the system catalogs.
*
- * see catalog/syscache.h for a list of the cache id's
+ * see catalog/syscache.h for a list of the cache id's
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-
+
#include "access/heapam.h"
#include "access/htup.h"
#include "catalog/catname.h"
#include "utils/catcache.h"
#ifndef HAVE_MEMMOVE
-# include <regex/utils.h>
+#include <regex/utils.h>
#else
-# include <string.h>
+#include <string.h>
#endif
-
+
/* ----------------
- * hardwired attribute information comes from system catalog files.
+ * hardwired attribute information comes from system catalog files.
* ----------------
*/
#include "catalog/pg_am.h"
@@ -51,592 +51,625 @@
#include "catalog/pg_user.h"
#include "storage/large_object.h"
#include "catalog/pg_listener.h"
-
-extern bool AMI_OVERRIDE; /* XXX style */
-
+
+extern bool AMI_OVERRIDE; /* XXX style */
+
#include "utils/syscache.h"
#include "catalog/indexing.h"
-
-typedef HeapTuple (*ScanFunc)();
+
+typedef HeapTuple(*ScanFunc) ();
/* ----------------
- * Warning: cacheinfo[] below is changed, then be sure and
- * update the magic constants in syscache.h!
+ * Warning: cacheinfo[] below is changed, then be sure and
+ * update the magic constants in syscache.h!
* ----------------
*/
static struct cachedesc cacheinfo[] = {
- { AccessMethodOperatorRelationName, /* AMOPOPID */
- 3,
- { Anum_pg_amop_amopclaid,
- Anum_pg_amop_amopopr,
- Anum_pg_amop_amopid,
- 0 },
- sizeof(FormData_pg_amop),
- NULL,
- (ScanFunc) NULL },
- { AccessMethodOperatorRelationName, /* AMOPSTRATEGY */
- 3,
- { Anum_pg_amop_amopid,
- Anum_pg_amop_amopclaid,
- Anum_pg_amop_amopstrategy,
- 0 },
- sizeof(FormData_pg_amop),
- NULL,
- (ScanFunc) NULL },
- { AttributeRelationName, /* ATTNAME */
- 2,
- { Anum_pg_attribute_attrelid,
- Anum_pg_attribute_attname,
- 0,
- 0 },
- ATTRIBUTE_TUPLE_SIZE,
- AttributeNameIndex,
- (ScanFunc) AttributeNameIndexScan },
- { AttributeRelationName, /* ATTNUM */
- 2,
- { Anum_pg_attribute_attrelid,
- Anum_pg_attribute_attnum,
- 0,
- 0 },
- ATTRIBUTE_TUPLE_SIZE,
- AttributeNumIndex,
- (ScanFunc) AttributeNumIndexScan },
- { IndexRelationName, /* INDEXRELID */
- 1,
- { Anum_pg_index_indexrelid,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_index, indpred),
- NULL,
- NULL },
- { LanguageRelationName, /* LANNAME */
- 1,
- { Anum_pg_language_lanname,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_language, lancompiler),
- NULL,
- NULL },
- { OperatorRelationName, /* OPRNAME */
- 4,
- { Anum_pg_operator_oprname,
- Anum_pg_operator_oprleft,
- Anum_pg_operator_oprright,
- Anum_pg_operator_oprkind },
- sizeof(FormData_pg_operator),
- NULL,
- NULL },
- { OperatorRelationName, /* OPROID */
- 1,
- { ObjectIdAttributeNumber,
- 0,
- 0,
- 0 },
- sizeof(FormData_pg_operator),
- NULL,
- (ScanFunc) NULL },
- { ProcedureRelationName, /* PRONAME */
- 3,
- { Anum_pg_proc_proname,
- Anum_pg_proc_pronargs,
- Anum_pg_proc_proargtypes,
- 0 },
- offsetof(FormData_pg_proc, prosrc),
- ProcedureNameIndex,
- (ScanFunc) ProcedureNameIndexScan },
- { ProcedureRelationName, /* PROOID */
- 1,
- { ObjectIdAttributeNumber,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_proc, prosrc),
- ProcedureOidIndex,
- (ScanFunc) ProcedureOidIndexScan },
- { RelationRelationName, /* RELNAME */
- 1,
- { Anum_pg_class_relname,
- 0,
- 0,
- 0 },
- CLASS_TUPLE_SIZE,
- ClassNameIndex,
- (ScanFunc) ClassNameIndexScan },
- { RelationRelationName, /* RELOID */
- 1,
- { ObjectIdAttributeNumber,
- 0,
- 0,
- 0 },
- CLASS_TUPLE_SIZE,
- ClassOidIndex,
- (ScanFunc) ClassOidIndexScan },
- { TypeRelationName, /* TYPNAME */
- 1,
- { Anum_pg_type_typname,
- 0,
- 0,
- 0 },
- offsetof(TypeTupleFormData,typalign)+sizeof(char),
- TypeNameIndex,
- TypeNameIndexScan },
- { TypeRelationName, /* TYPOID */
- 1,
- { ObjectIdAttributeNumber,
- 0,
- 0,
+ {AccessMethodOperatorRelationName, /* AMOPOPID */
+ 3,
+ {Anum_pg_amop_amopclaid,
+ Anum_pg_amop_amopopr,
+ Anum_pg_amop_amopid,
+ 0},
+ sizeof(FormData_pg_amop),
+ NULL,
+ (ScanFunc) NULL},
+ {AccessMethodOperatorRelationName, /* AMOPSTRATEGY */
+ 3,
+ {Anum_pg_amop_amopid,
+ Anum_pg_amop_amopclaid,
+ Anum_pg_amop_amopstrategy,
+ 0},
+ sizeof(FormData_pg_amop),
+ NULL,
+ (ScanFunc) NULL},
+ {AttributeRelationName, /* ATTNAME */
+ 2,
+ {Anum_pg_attribute_attrelid,
+ Anum_pg_attribute_attname,
+ 0,
+ 0},
+ ATTRIBUTE_TUPLE_SIZE,
+ AttributeNameIndex,
+ (ScanFunc) AttributeNameIndexScan},
+ {AttributeRelationName, /* ATTNUM */
+ 2,
+ {Anum_pg_attribute_attrelid,
+ Anum_pg_attribute_attnum,
+ 0,
+ 0},
+ ATTRIBUTE_TUPLE_SIZE,
+ AttributeNumIndex,
+ (ScanFunc) AttributeNumIndexScan},
+ {IndexRelationName, /* INDEXRELID */
+ 1,
+ {Anum_pg_index_indexrelid,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_index, indpred),
+ NULL,
+ NULL},
+ {LanguageRelationName, /* LANNAME */
+ 1,
+ {Anum_pg_language_lanname,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_language, lancompiler),
+ NULL,
+ NULL},
+ {OperatorRelationName, /* OPRNAME */
+ 4,
+ {Anum_pg_operator_oprname,
+ Anum_pg_operator_oprleft,
+ Anum_pg_operator_oprright,
+ Anum_pg_operator_oprkind},
+ sizeof(FormData_pg_operator),
+ NULL,
+ NULL},
+ {OperatorRelationName, /* OPROID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ sizeof(FormData_pg_operator),
+ NULL,
+ (ScanFunc) NULL},
+ {ProcedureRelationName, /* PRONAME */
+ 3,
+ {Anum_pg_proc_proname,
+ Anum_pg_proc_pronargs,
+ Anum_pg_proc_proargtypes,
+ 0},
+ offsetof(FormData_pg_proc, prosrc),
+ ProcedureNameIndex,
+ (ScanFunc) ProcedureNameIndexScan},
+ {ProcedureRelationName, /* PROOID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_proc, prosrc),
+ ProcedureOidIndex,
+ (ScanFunc) ProcedureOidIndexScan},
+ {RelationRelationName, /* RELNAME */
+ 1,
+ {Anum_pg_class_relname,
+ 0,
+ 0,
+ 0},
+ CLASS_TUPLE_SIZE,
+ ClassNameIndex,
+ (ScanFunc) ClassNameIndexScan},
+ {RelationRelationName, /* RELOID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ CLASS_TUPLE_SIZE,
+ ClassOidIndex,
+ (ScanFunc) ClassOidIndexScan},
+ {TypeRelationName, /* TYPNAME */
+ 1,
+ {Anum_pg_type_typname,
+ 0,
+ 0,
+ 0},
+ offsetof(TypeTupleFormData, typalign) + sizeof(char),
+ TypeNameIndex,
+ TypeNameIndexScan},
+ {TypeRelationName, /* TYPOID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ offsetof(TypeTupleFormData, typalign) +sizeof(char),
+ TypeOidIndex,
+ TypeOidIndexScan},
+ {AccessMethodRelationName, /* AMNAME */
+ 1,
+ {Anum_pg_am_amname,
+ 0,
+ 0,
+ 0},
+ sizeof(FormData_pg_am),
+ NULL,
+ NULL},
+ {OperatorClassRelationName, /* CLANAME */
+ 1,
+ {Anum_pg_opclass_opcname,
+ 0,
+ 0,
+ 0},
+ sizeof(FormData_pg_opclass),
+ NULL,
+ NULL},
+ {IndexRelationName, /* INDRELIDKEY */
+ 2,
+ {Anum_pg_index_indrelid,
+ Anum_pg_index_indkey,
+ 0,
+ 0},
+ offsetof(FormData_pg_index, indpred),
+ NULL,
+ (ScanFunc) NULL},
+ {InheritsRelationName, /* INHRELID */
+ 2,
+ {Anum_pg_inherits_inhrel,
+ Anum_pg_inherits_inhseqno,
+ 0,
0},
- offsetof(TypeTupleFormData,typalign)+sizeof(char),
- TypeOidIndex,
- TypeOidIndexScan },
- { AccessMethodRelationName, /* AMNAME */
- 1,
- { Anum_pg_am_amname,
- 0,
- 0,
+ sizeof(FormData_pg_inherits),
+ NULL,
+ (ScanFunc) NULL},
+ {RewriteRelationName, /* RULOID */
+ 1,
+ {ObjectIdAttributeNumber,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_rewrite, ev_qual),
+ NULL,
+ (ScanFunc) NULL},
+ {AggregateRelationName, /* AGGNAME */
+ 2,
+ {Anum_pg_aggregate_aggname,
+ Anum_pg_aggregate_aggbasetype,
+ 0,
0},
- sizeof(FormData_pg_am),
- NULL,
- NULL },
- { OperatorClassRelationName, /* CLANAME */
- 1,
- { Anum_pg_opclass_opcname,
- 0,
- 0,
+ offsetof(FormData_pg_aggregate, agginitval1),
+ NULL,
+ (ScanFunc) NULL},
+ {ListenerRelationName, /* LISTENREL */
+ 2,
+ {Anum_pg_listener_relname,
+ Anum_pg_listener_pid,
+ 0,
0},
- sizeof(FormData_pg_opclass),
- NULL,
- NULL },
- { IndexRelationName, /* INDRELIDKEY */
- 2,
- { Anum_pg_index_indrelid,
- Anum_pg_index_indkey,
- 0,
+ sizeof(FormData_pg_listener),
+ NULL,
+ (ScanFunc) NULL},
+ {UserRelationName, /* USENAME */
+ 1,
+ {Anum_pg_user_usename,
+ 0,
+ 0,
0},
- offsetof(FormData_pg_index, indpred),
- NULL,
- (ScanFunc) NULL },
- { InheritsRelationName, /* INHRELID */
- 2,
- { Anum_pg_inherits_inhrel,
- Anum_pg_inherits_inhseqno,
- 0,
+ sizeof(FormData_pg_user),
+ NULL,
+ (ScanFunc) NULL},
+ {UserRelationName, /* USESYSID */
+ 1,
+ {Anum_pg_user_usesysid,
+ 0,
+ 0,
+ 0},
+ sizeof(FormData_pg_user),
+ NULL,
+ (ScanFunc) NULL},
+ {GroupRelationName, /* GRONAME */
+ 1,
+ {Anum_pg_group_groname,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_group, grolist[0]),
+ NULL,
+ (ScanFunc) NULL},
+ {GroupRelationName, /* GROSYSID */
+ 1,
+ {Anum_pg_group_grosysid,
+ 0,
+ 0,
0},
- sizeof(FormData_pg_inherits),
- NULL,
- (ScanFunc) NULL },
- { RewriteRelationName, /* RULOID */
- 1,
- { ObjectIdAttributeNumber,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_rewrite, ev_qual),
- NULL,
- (ScanFunc) NULL },
- { AggregateRelationName, /*AGGNAME*/
- 2,
- { Anum_pg_aggregate_aggname,
- Anum_pg_aggregate_aggbasetype,
- 0,
- 0 },
- offsetof(FormData_pg_aggregate, agginitval1),
- NULL,
- (ScanFunc) NULL },
- { ListenerRelationName, /* LISTENREL */
- 2,
- { Anum_pg_listener_relname,
- Anum_pg_listener_pid,
- 0,
- 0 },
- sizeof(FormData_pg_listener),
- NULL,
- (ScanFunc) NULL },
- { UserRelationName, /* USENAME */
- 1,
- { Anum_pg_user_usename,
- 0,
- 0,
- 0 },
- sizeof(FormData_pg_user),
- NULL,
- (ScanFunc) NULL },
- { UserRelationName, /* USESYSID */
- 1,
- { Anum_pg_user_usesysid,
- 0,
- 0,
- 0 },
- sizeof(FormData_pg_user),
- NULL,
- (ScanFunc) NULL },
- { GroupRelationName, /* GRONAME */
- 1,
- { Anum_pg_group_groname,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_group, grolist[0]),
- NULL,
- (ScanFunc) NULL },
- { GroupRelationName, /* GROSYSID */
- 1,
- { Anum_pg_group_grosysid,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_group, grolist[0]),
- NULL,
- (ScanFunc) NULL },
- { RewriteRelationName, /* REWRITENAME */
- 1,
- { Anum_pg_rewrite_rulename,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_rewrite, ev_qual),
- NULL,
- (ScanFunc) NULL },
- { ProcedureRelationName, /* PROSRC */
- 1,
- { Anum_pg_proc_prosrc,
- 0,
- 0,
- 0 },
- offsetof(FormData_pg_proc, prosrc),
- ProcedureSrcIndex,
- (ScanFunc) ProcedureSrcIndexScan },
- { OperatorClassRelationName, /* CLADEFTYPE */
- 1,
- { Anum_pg_opclass_opcdeftype,
- 0,
- 0,
- 0 },
- sizeof(FormData_pg_opclass),
- NULL,
- (ScanFunc) NULL }
+ offsetof(FormData_pg_group, grolist[0]),
+ NULL,
+ (ScanFunc) NULL},
+ {RewriteRelationName, /* REWRITENAME */
+ 1,
+ {Anum_pg_rewrite_rulename,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_rewrite, ev_qual),
+ NULL,
+ (ScanFunc) NULL},
+ {ProcedureRelationName, /* PROSRC */
+ 1,
+ {Anum_pg_proc_prosrc,
+ 0,
+ 0,
+ 0},
+ offsetof(FormData_pg_proc, prosrc),
+ ProcedureSrcIndex,
+ (ScanFunc) ProcedureSrcIndexScan},
+ {OperatorClassRelationName, /* CLADEFTYPE */
+ 1,
+ {Anum_pg_opclass_opcdeftype,
+ 0,
+ 0,
+ 0},
+ sizeof(FormData_pg_opclass),
+ NULL,
+ (ScanFunc) NULL}
};
-
-static struct catcache *SysCache[lengthof(cacheinfo)];
-static int32 SysCacheSize = lengthof(cacheinfo);
-
-
+
+static struct catcache *SysCache[
+ lengthof(cacheinfo)];
+static int32 SysCacheSize = lengthof(cacheinfo);
+
+
/*
* zerocaches--
*
- * Make sure the SysCache structure is zero'd.
+ * Make sure the SysCache structure is zero'd.
*/
void
zerocaches()
{
- memset((char *) SysCache, 0, SysCacheSize * sizeof(struct catcache *));
+ memset((char *) SysCache, 0, SysCacheSize * sizeof(struct catcache *));
}
/*
* Note:
- * This function was written because the initialized catalog caches
- * are used to determine which caches may contain tuples which need
- * to be invalidated in other backends.
+ * This function was written because the initialized catalog caches
+ * are used to determine which caches may contain tuples which need
+ * to be invalidated in other backends.
*/
void
InitCatalogCache()
{
- int cacheId; /* XXX type */
-
- if (!AMI_OVERRIDE) {
- for (cacheId = 0; cacheId < SysCacheSize; cacheId += 1) {
-
- Assert(!PointerIsValid((Pointer)SysCache[cacheId]));
-
- SysCache[cacheId] =
- InitSysCache(cacheinfo[cacheId].name,
- cacheinfo[cacheId].indname,
- cacheId,
- cacheinfo[cacheId].nkeys,
- cacheinfo[cacheId].key,
- cacheinfo[cacheId].iScanFunc);
- if (!PointerIsValid((char *)SysCache[cacheId])) {
- elog(WARN,
- "InitCatalogCache: Can't init cache %.16s(%d)",
- cacheinfo[cacheId].name,
- cacheId);
- }
-
+ int cacheId; /* XXX type */
+
+ if (!AMI_OVERRIDE)
+ {
+ for (cacheId = 0; cacheId < SysCacheSize; cacheId += 1)
+ {
+
+ Assert(!PointerIsValid((Pointer) SysCache[cacheId]));
+
+ SysCache[cacheId] =
+ InitSysCache(cacheinfo[cacheId].name,
+ cacheinfo[cacheId].indname,
+ cacheId,
+ cacheinfo[cacheId].nkeys,
+ cacheinfo[cacheId].key,
+ cacheinfo[cacheId].iScanFunc);
+ if (!PointerIsValid((char *) SysCache[cacheId]))
+ {
+ elog(WARN,
+ "InitCatalogCache: Can't init cache %.16s(%d)",
+ cacheinfo[cacheId].name,
+ cacheId);
+ }
+
+ }
}
- }
}
/*
* SearchSysCacheTuple--
*
- * A layer on top of SearchSysCache that does the initialization and
- * key-setting for you.
+ * A layer on top of SearchSysCache that does the initialization and
+ * key-setting for you.
*
* Returns the tuple if one is found, NULL if not.
*
* XXX The tuple that is returned is NOT supposed to be pfree'd!
*/
HeapTuple
-SearchSysCacheTuple(int cacheId, /* cache selection code */
- Datum key1,
- Datum key2,
- Datum key3,
- Datum key4)
+SearchSysCacheTuple(int cacheId, /* cache selection code */
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
{
- register HeapTuple tp;
-
- if (cacheId < 0 || cacheId >= SysCacheSize) {
- elog(WARN, "SearchSysCacheTuple: Bad cache id %d", cacheId);
- return((HeapTuple) NULL);
- }
-
- if (!AMI_OVERRIDE) {
- Assert(PointerIsValid(SysCache[cacheId]));
- } else {
- if (!PointerIsValid(SysCache[cacheId])) {
- SysCache[cacheId] =
- InitSysCache(cacheinfo[cacheId].name,
- cacheinfo[cacheId].indname,
- cacheId,
- cacheinfo[cacheId].nkeys,
- cacheinfo[cacheId].key,
- cacheinfo[cacheId].iScanFunc);
- if (!PointerIsValid(SysCache[cacheId])) {
- elog(WARN,
- "InitCatalogCache: Can't init cache %.16s(%d)",
- cacheinfo[cacheId].name,
- cacheId);
- }
-
+ register HeapTuple tp;
+
+ if (cacheId < 0 || cacheId >= SysCacheSize)
+ {
+ elog(WARN, "SearchSysCacheTuple: Bad cache id %d", cacheId);
+ return ((HeapTuple) NULL);
+ }
+
+ if (!AMI_OVERRIDE)
+ {
+ Assert(PointerIsValid(SysCache[cacheId]));
+ }
+ else
+ {
+ if (!PointerIsValid(SysCache[cacheId]))
+ {
+ SysCache[cacheId] =
+ InitSysCache(cacheinfo[cacheId].name,
+ cacheinfo[cacheId].indname,
+ cacheId,
+ cacheinfo[cacheId].nkeys,
+ cacheinfo[cacheId].key,
+ cacheinfo[cacheId].iScanFunc);
+ if (!PointerIsValid(SysCache[cacheId]))
+ {
+ elog(WARN,
+ "InitCatalogCache: Can't init cache %.16s(%d)",
+ cacheinfo[cacheId].name,
+ cacheId);
+ }
+
+ }
}
- }
-
- tp = SearchSysCache(SysCache[cacheId], key1, key2, key3, key4);
- if (!HeapTupleIsValid(tp)) {
+
+ tp = SearchSysCache(SysCache[cacheId], key1, key2, key3, key4);
+ if (!HeapTupleIsValid(tp))
+ {
#ifdef CACHEDEBUG
- elog(DEBUG,
- "SearchSysCacheTuple: Search %s(%d) %d %d %d %d failed",
- (*cacheinfo[cacheId].name)->data,
- cacheId, key1, key2, key3, key4);
+ elog(DEBUG,
+ "SearchSysCacheTuple: Search %s(%d) %d %d %d %d failed",
+ (*cacheinfo[cacheId].name)->data,
+ cacheId, key1, key2, key3, key4);
#endif
- return((HeapTuple) NULL);
- }
- return(tp);
+ return ((HeapTuple) NULL);
+ }
+ return (tp);
}
/*
* SearchSysCacheStruct--
- * Fills 's' with the information retrieved by calling SearchSysCache()
- * with arguments key1...key4. Retrieves only the portion of the tuple
- * which is not variable-length.
+ * Fills 's' with the information retrieved by calling SearchSysCache()
+ * with arguments key1...key4. Retrieves only the portion of the tuple
+ * which is not variable-length.
*
* NOTE: we are assuming that non-variable-length fields in the system
- * catalogs will always be defined!
+ * catalogs will always be defined!
*
* Returns 1L if a tuple was found, 0L if not.
*/
int32
SearchSysCacheStruct(int cacheId, /* cache selection code */
- char *returnStruct, /* (preallocated!) */
- Datum key1,
- Datum key2,
- Datum key3,
- Datum key4)
+ char *returnStruct, /* (preallocated!) */
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
{
- HeapTuple tp;
-
- if (!PointerIsValid(returnStruct)) {
- elog(WARN, "SearchSysCacheStruct: No receiving struct");
- return(0);
- }
- tp = SearchSysCacheTuple(cacheId, key1, key2, key3, key4);
- if (!HeapTupleIsValid(tp))
- return(0);
- memmove(returnStruct, (char *) GETSTRUCT(tp), cacheinfo[cacheId].size);
- return(1);
+ HeapTuple tp;
+
+ if (!PointerIsValid(returnStruct))
+ {
+ elog(WARN, "SearchSysCacheStruct: No receiving struct");
+ return (0);
+ }
+ tp = SearchSysCacheTuple(cacheId, key1, key2, key3, key4);
+ if (!HeapTupleIsValid(tp))
+ return (0);
+ memmove(returnStruct, (char *) GETSTRUCT(tp), cacheinfo[cacheId].size);
+ return (1);
}
/*
* SearchSysCacheGetAttribute--
- * Returns the attribute corresponding to 'attributeNumber' for
- * a given cached tuple.
+ * Returns the attribute corresponding to 'attributeNumber' for
+ * a given cached tuple.
*
* XXX This re-opens a relation, so this is slower.
*
* [callers all assume this returns a (struct varlena *). -ay 10/94]
*/
-void *
+void *
SearchSysCacheGetAttribute(int cacheId,
- AttrNumber attributeNumber,
- Datum key1,
- Datum key2,
- Datum key3,
- Datum key4)
+ AttrNumber attributeNumber,
+ Datum key1,
+ Datum key2,
+ Datum key3,
+ Datum key4)
{
- HeapTuple tp;
- char *cacheName;
- Relation relation;
- int32 attributeLength, attributeByValue;
- bool isNull;
- char *attributeValue;
- void *returnValue;
-
- tp = SearchSysCacheTuple(cacheId, key1, key2, key3, key4);
- cacheName = cacheinfo[cacheId].name;
-
- if (!HeapTupleIsValid(tp)) {
+ HeapTuple tp;
+ char *cacheName;
+ Relation relation;
+ int32 attributeLength,
+ attributeByValue;
+ bool isNull;
+ char *attributeValue;
+ void *returnValue;
+
+ tp = SearchSysCacheTuple(cacheId, key1, key2, key3, key4);
+ cacheName = cacheinfo[cacheId].name;
+
+ if (!HeapTupleIsValid(tp))
+ {
#ifdef CACHEDEBUG
- elog(DEBUG,
- "SearchSysCacheGetAttribute: Lookup in %s(%d) failed",
- cacheName, cacheId);
-#endif /* defined(CACHEDEBUG) */
- return(NULL);
- }
-
- relation = heap_openr(cacheName);
-
- if (attributeNumber < 0 &&
- attributeNumber > FirstLowInvalidHeapAttributeNumber) {
- attributeLength = heap_sysattrlen(attributeNumber);
- attributeByValue = heap_sysattrbyval(attributeNumber);
- } else if (attributeNumber > 0 &&
- attributeNumber <= relation->rd_rel->relnatts) {
- attributeLength =
- relation->rd_att->attrs[attributeNumber-1]->attlen;
- attributeByValue =
- relation->rd_att->attrs[attributeNumber-1]->attbyval;
- } else {
- elog(WARN,
- "SearchSysCacheGetAttribute: Bad attr # %d in %s(%d)",
- attributeNumber, cacheName, cacheId);
- return(NULL);
- }
-
- attributeValue = heap_getattr(tp,
- (Buffer) 0,
- attributeNumber,
- RelationGetTupleDescriptor(relation),
- &isNull);
-
- if (isNull) {
- /*
- * Used to be an elog(DEBUG, ...) here and a claim that it should
- * be a FATAL error, I don't think either is warranted -mer 6/9/92
- */
- return(NULL);
- }
-
- if (attributeByValue) {
- returnValue = (void *)attributeValue;
- } else {
- char *tmp;
- int size = (attributeLength < 0)
- ? VARSIZE((struct varlena *) attributeValue) /* variable length */
- : attributeLength; /* fixed length */
-
- tmp = (char *) palloc(size);
- memmove(tmp, attributeValue, size);
- returnValue = (void *)tmp;
- }
-
- heap_close(relation);
- return(returnValue);
+ elog(DEBUG,
+ "SearchSysCacheGetAttribute: Lookup in %s(%d) failed",
+ cacheName, cacheId);
+#endif /* defined(CACHEDEBUG) */
+ return (NULL);
+ }
+
+ relation = heap_openr(cacheName);
+
+ if (attributeNumber < 0 &&
+ attributeNumber > FirstLowInvalidHeapAttributeNumber)
+ {
+ attributeLength = heap_sysattrlen(attributeNumber);
+ attributeByValue = heap_sysattrbyval(attributeNumber);
+ }
+ else if (attributeNumber > 0 &&
+ attributeNumber <= relation->rd_rel->relnatts)
+ {
+ attributeLength =
+ relation->rd_att->attrs[attributeNumber - 1]->attlen;
+ attributeByValue =
+ relation->rd_att->attrs[attributeNumber - 1]->attbyval;
+ }
+ else
+ {
+ elog(WARN,
+ "SearchSysCacheGetAttribute: Bad attr # %d in %s(%d)",
+ attributeNumber, cacheName, cacheId);
+ return (NULL);
+ }
+
+ attributeValue = heap_getattr(tp,
+ (Buffer) 0,
+ attributeNumber,
+ RelationGetTupleDescriptor(relation),
+ &isNull);
+
+ if (isNull)
+ {
+
+ /*
+ * Used to be an elog(DEBUG, ...) here and a claim that it should
+ * be a FATAL error, I don't think either is warranted -mer 6/9/92
+ */
+ return (NULL);
+ }
+
+ if (attributeByValue)
+ {
+ returnValue = (void *) attributeValue;
+ }
+ else
+ {
+ char *tmp;
+ int size = (attributeLength < 0)
+ ? VARSIZE((struct varlena *) attributeValue) /* variable length */
+ : attributeLength; /* fixed length */
+
+ tmp = (char *) palloc(size);
+ memmove(tmp, attributeValue, size);
+ returnValue = (void *) tmp;
+ }
+
+ heap_close(relation);
+ return (returnValue);
}
/*
* TypeDefaultRetrieve--
*
- * Given a type OID, return the typdefault field associated with that
- * type. The typdefault is returned as the car of a dotted pair which
- * is passed to TypeDefaultRetrieve by the calling routine.
+ * Given a type OID, return the typdefault field associated with that
+ * type. The typdefault is returned as the car of a dotted pair which
+ * is passed to TypeDefaultRetrieve by the calling routine.
*
* Returns a fixnum for types which are passed by value and a ppreserve'd
* vectori for types which are not.
*
* [identical to get_typdefault, expecting a (struct varlena *) as ret val.
- * some day, either of the functions should be removed -ay 10/94]
+ * some day, either of the functions should be removed -ay 10/94]
*/
-void *
+void *
TypeDefaultRetrieve(Oid typId)
{
- HeapTuple typeTuple;
- TypeTupleForm type;
- int32 typByVal, typLen;
- struct varlena *typDefault;
- int32 dataSize;
- void *returnValue;
-
- typeTuple = SearchSysCacheTuple(TYPOID,
- ObjectIdGetDatum(typId),
- 0,0,0);
-
- if (!HeapTupleIsValid(typeTuple)) {
-#ifdef CACHEDEBUG
- elog(DEBUG, "TypeDefaultRetrieve: Lookup in %s(%d) failed",
- (*cacheinfo[TYPOID].name)->data, TYPOID);
-#endif /* defined(CACHEDEBUG) */
- return(NULL);
- }
-
- type = (TypeTupleForm) GETSTRUCT(typeTuple);
- typByVal = type->typbyval;
- typLen = type->typlen;
-
- typDefault = (struct varlena *)
- SearchSysCacheGetAttribute(TYPOID,
- Anum_pg_type_typdefault,
- ObjectIdGetDatum(typId),
- 0,0,0);
-
- if (typDefault == (struct varlena *)NULL) {
+ HeapTuple typeTuple;
+ TypeTupleForm type;
+ int32 typByVal,
+ typLen;
+ struct varlena *typDefault;
+ int32 dataSize;
+ void *returnValue;
+
+ typeTuple = SearchSysCacheTuple(TYPOID,
+ ObjectIdGetDatum(typId),
+ 0, 0, 0);
+
+ if (!HeapTupleIsValid(typeTuple))
+ {
#ifdef CACHEDEBUG
- elog(DEBUG, "TypeDefaultRetrieve: No extractable typdefault",
- (*cacheinfo[TYPOID].name)->data, TYPOID);
-#endif /* defined(CACHEDEBUG) */
- return (NULL);
-
- }
-
- dataSize = VARSIZE(typDefault) - VARHDRSZ;
-
- if (typByVal) {
- int8 i8;
- int16 i16;
- int32 i32;
-
- if (dataSize == typLen) {
- switch (typLen) {
- case sizeof(int8):
- memmove((char *) &i8, VARDATA(typDefault), sizeof(int8));
- i32 = i8;
- break;
- case sizeof(int16):
- memmove((char *) &i16, VARDATA(typDefault), sizeof(int16));
- i32 = i16;
- break;
- case sizeof(int32):
- memmove((char *) &i32, VARDATA(typDefault), sizeof(int32));
- break;
- }
- returnValue = (void *)i32;
- } else {
- returnValue = NULL;
+ elog(DEBUG, "TypeDefaultRetrieve: Lookup in %s(%d) failed",
+ (*cacheinfo[TYPOID].name)->data, TYPOID);
+#endif /* defined(CACHEDEBUG) */
+ return (NULL);
}
- } else {
- if ((typLen < 0 && dataSize < 0) || dataSize != typLen)
- returnValue = NULL;
- else {
- returnValue = (void *)palloc(VARSIZE(typDefault));
- memmove((char *) returnValue,
- (char *) typDefault,
- (int) VARSIZE(typDefault));
+
+ type = (TypeTupleForm) GETSTRUCT(typeTuple);
+ typByVal = type->typbyval;
+ typLen = type->typlen;
+
+ typDefault = (struct varlena *)
+ SearchSysCacheGetAttribute(TYPOID,
+ Anum_pg_type_typdefault,
+ ObjectIdGetDatum(typId),
+ 0, 0, 0);
+
+ if (typDefault == (struct varlena *) NULL)
+ {
+#ifdef CACHEDEBUG
+ elog(DEBUG, "TypeDefaultRetrieve: No extractable typdefault",
+ (*cacheinfo[TYPOID].name)->data, TYPOID);
+#endif /* defined(CACHEDEBUG) */
+ return (NULL);
+
}
- }
-
- return(returnValue);
-}
+ dataSize = VARSIZE(typDefault) - VARHDRSZ;
+ if (typByVal)
+ {
+ int8 i8;
+ int16 i16;
+ int32 i32;
+
+ if (dataSize == typLen)
+ {
+ switch (typLen)
+ {
+ case sizeof(int8):
+ memmove((char *) &i8, VARDATA(typDefault), sizeof(int8));
+ i32 = i8;
+ break;
+ case sizeof(int16):
+ memmove((char *) &i16, VARDATA(typDefault), sizeof(int16));
+ i32 = i16;
+ break;
+ case sizeof(int32):
+ memmove((char *) &i32, VARDATA(typDefault), sizeof(int32));
+ break;
+ }
+ returnValue = (void *) i32;
+ }
+ else
+ {
+ returnValue = NULL;
+ }
+ }
+ else
+ {
+ if ((typLen < 0 && dataSize < 0) || dataSize != typLen)
+ returnValue = NULL;
+ else
+ {
+ returnValue = (void *) palloc(VARSIZE(typDefault));
+ memmove((char *) returnValue,
+ (char *) typDefault,
+ (int) VARSIZE(typDefault));
+ }
+ }
+
+ return (returnValue);
+}