p.txt

text/plain

Filename: p.txt
Type: text/plain
Part: 0
Message: Re: five-key syscaches
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index 82b0730..e803652 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -63,7 +63,6 @@
 #include "utils/hsearch.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
-#include "utils/syscache.h"
 #include "utils/tqual.h"
 
 #include "dblink.h"
diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c
index c76e6cc..906d38d 100644
--- a/contrib/ltree/ltree_op.c
+++ b/contrib/ltree/ltree_op.c
@@ -11,7 +11,6 @@
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
 #include "utils/selfuncs.h"
-#include "utils/syscache.h"
 #include "ltree.h"
 
 PG_MODULE_MAGIC;
diff --git a/contrib/tsearch2/tsearch2.c b/contrib/tsearch2/tsearch2.c
index d421f77..224563a 100644
--- a/contrib/tsearch2/tsearch2.c
+++ b/contrib/tsearch2/tsearch2.c
@@ -172,9 +172,8 @@ tsa_set_curdict(PG_FUNCTION_ARGS)
 {
 	Oid			dict_oid = PG_GETARG_OID(0);
 
-	if (!SearchSysCacheExists(TSDICTOID,
-							  ObjectIdGetDatum(dict_oid),
-							  0, 0, 0))
+	if (!SearchSysCacheExists1(TSDICTOID,
+							   ObjectIdGetDatum(dict_oid)))
 		elog(ERROR, "cache lookup failed for text search dictionary %u",
 			 dict_oid);
 
@@ -211,9 +210,8 @@ tsa_set_curprs(PG_FUNCTION_ARGS)
 {
 	Oid			parser_oid = PG_GETARG_OID(0);
 
-	if (!SearchSysCacheExists(TSPARSEROID,
-							  ObjectIdGetDatum(parser_oid),
-							  0, 0, 0))
+	if (!SearchSysCacheExists1(TSPARSEROID,
+							  ObjectIdGetDatum(parser_oid)))
 		elog(ERROR, "cache lookup failed for text search parser %u",
 			 parser_oid);
 
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 07d6d89..c1ef41b 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -183,6 +183,13 @@ CatalogCacheComputeHashValue(CatCache *cache, int nkeys, ScanKey cur_skey)
 
 	switch (nkeys)
 	{
+		case 5:
+			oneHash =
+				DatumGetUInt32(DirectFunctionCall1(cache->cc_hashfunc[4],
+												   cur_skey[4].sk_argument));
+			hashValue ^= oneHash << 16;
+			hashValue ^= oneHash >> 16;
+			/* FALLTHROUGH */
 		case 4:
 			oneHash =
 				DatumGetUInt32(DirectFunctionCall1(cache->cc_hashfunc[3],
@@ -1057,7 +1064,8 @@ SearchCatCache(CatCache *cache,
 			   Datum v1,
 			   Datum v2,
 			   Datum v3,
-			   Datum v4)
+			   Datum v4,
+			   Datum v5)
 {
 	ScanKeyData cur_skey[CATCACHE_MAXKEYS];
 	uint32		hashValue;
@@ -1086,6 +1094,7 @@ SearchCatCache(CatCache *cache,
 	cur_skey[1].sk_argument = v2;
 	cur_skey[2].sk_argument = v3;
 	cur_skey[3].sk_argument = v4;
+	cur_skey[4].sk_argument = v5;
 
 	/*
 	 * find the hash bucket in which to look for the tuple
@@ -1298,7 +1307,8 @@ SearchCatCacheList(CatCache *cache,
 				   Datum v1,
 				   Datum v2,
 				   Datum v3,
-				   Datum v4)
+				   Datum v4,
+				   Datum v5)
 {
 	ScanKeyData cur_skey[CATCACHE_MAXKEYS];
 	uint32		lHashValue;
@@ -1333,6 +1343,7 @@ SearchCatCacheList(CatCache *cache,
 	cur_skey[1].sk_argument = v2;
 	cur_skey[2].sk_argument = v3;
 	cur_skey[3].sk_argument = v4;
+	cur_skey[4].sk_argument = v5;
 
 	/*
 	 * compute a hash value of the given keys for faster search.  We don't
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index 61b06ac..8dca335 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -95,7 +95,7 @@ struct cachedesc
 	Oid			reloid;			/* OID of the relation being cached */
 	Oid			indoid;			/* OID of index relation for this cache */
 	int			nkeys;			/* # of keys needed for cache lookup */
-	int			key[4];			/* attribute numbers of key attrs */
+	int			key[CATCACHE_MAXKEYS];	/* attribute numbers of key attrs */
 	int			nbuckets;		/* number of hash buckets for this cache */
 };
 
@@ -107,6 +107,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_aggregate_aggfnoid,
 			0,
 			0,
+			0,
 			0
 		},
 		32
@@ -118,6 +119,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_am_amname,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -129,6 +131,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -140,6 +143,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_amop_amopopr,
 			Anum_pg_amop_amopfamily,
 			0,
+			0,
 			0
 		},
 		64
@@ -151,7 +155,8 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_amop_amopfamily,
 			Anum_pg_amop_amoplefttype,
 			Anum_pg_amop_amoprighttype,
-			Anum_pg_amop_amopstrategy
+			Anum_pg_amop_amopstrategy,
+			0
 		},
 		64
 	},
@@ -162,7 +167,8 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_amproc_amprocfamily,
 			Anum_pg_amproc_amproclefttype,
 			Anum_pg_amproc_amprocrighttype,
-			Anum_pg_amproc_amprocnum
+			Anum_pg_amproc_amprocnum,
+			0
 		},
 		64
 	},
@@ -173,6 +179,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_attribute_attrelid,
 			Anum_pg_attribute_attname,
 			0,
+			0,
 			0
 		},
 		2048
@@ -184,6 +191,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_attribute_attrelid,
 			Anum_pg_attribute_attnum,
 			0,
+			0,
 			0
 		},
 		2048
@@ -195,6 +203,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_auth_members_member,
 			Anum_pg_auth_members_roleid,
 			0,
+			0,
 			0
 		},
 		128
@@ -206,6 +215,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_auth_members_roleid,
 			Anum_pg_auth_members_member,
 			0,
+			0,
 			0
 		},
 		128
@@ -217,6 +227,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_authid_rolname,
 			0,
 			0,
+			0,
 			0
 		},
 		128
@@ -228,6 +239,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		128
@@ -240,6 +252,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_cast_castsource,
 			Anum_pg_cast_casttarget,
 			0,
+			0,
 			0
 		},
 		256
@@ -251,6 +264,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_opclass_opcmethod,
 			Anum_pg_opclass_opcname,
 			Anum_pg_opclass_opcnamespace,
+			0,
 			0
 		},
 		64
@@ -262,6 +276,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		64
@@ -274,6 +289,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_conversion_conforencoding,
 			Anum_pg_conversion_contoencoding,
 			ObjectIdAttributeNumber,
+			0
 		},
 		128
 	},
@@ -284,6 +300,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_conversion_conname,
 			Anum_pg_conversion_connamespace,
 			0,
+			0,
 			0
 		},
 		128
@@ -295,6 +312,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		1024
@@ -306,6 +324,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		128
@@ -317,6 +336,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -328,6 +348,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_default_acl_defaclrole,
 			Anum_pg_default_acl_defaclnamespace,
 			Anum_pg_default_acl_defaclobjtype,
+			0,
 			0
 		},
 		256
@@ -339,6 +360,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		256
@@ -350,6 +372,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_enum_enumtypid,
 			Anum_pg_enum_enumlabel,
 			0,
+			0,
 			0
 		},
 		256
@@ -361,6 +384,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_foreign_data_wrapper_fdwname,
 			0,
 			0,
+			0,
 			0
 		},
 		8
@@ -372,6 +396,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		8
@@ -383,6 +408,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_foreign_server_srvname,
 			0,
 			0,
+			0,
 			0
 		},
 		32
@@ -394,6 +420,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		32
@@ -405,6 +432,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_index_indexrelid,
 			0,
 			0,
+			0,
 			0
 		},
 		1024
@@ -416,6 +444,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_language_lanname,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -427,6 +456,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -438,6 +468,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_namespace_nspname,
 			0,
 			0,
+			0,
 			0
 		},
 		256
@@ -449,6 +480,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		256
@@ -460,7 +492,9 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_operator_oprname,
 			Anum_pg_operator_oprleft,
 			Anum_pg_operator_oprright,
-			Anum_pg_operator_oprnamespace
+			Anum_pg_operator_oprnamespace,
+			0
+
 		},
 		1024
 	},
@@ -471,6 +505,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		1024
@@ -482,6 +517,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_opfamily_opfmethod,
 			Anum_pg_opfamily_opfname,
 			Anum_pg_opfamily_opfnamespace,
+			0,
 			0
 		},
 		64
@@ -493,6 +529,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		64
@@ -504,6 +541,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_proc_proname,
 			Anum_pg_proc_proargtypes,
 			Anum_pg_proc_pronamespace,
+			0,
 			0
 		},
 		2048
@@ -515,6 +553,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		2048
@@ -526,6 +565,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_class_relname,
 			Anum_pg_class_relnamespace,
 			0,
+			0,
 			0
 		},
 		1024
@@ -537,6 +577,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		1024
@@ -548,6 +589,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_rewrite_ev_class,
 			Anum_pg_rewrite_rulename,
 			0,
+			0,
 			0
 		},
 		1024
@@ -559,6 +601,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_statistic_starelid,
 			Anum_pg_statistic_staattnum,
 			Anum_pg_statistic_stainherit,
+			0,
 			0
 		},
 		1024
@@ -571,6 +614,7 @@ static const struct cachedesc cacheinfo[] = {
 			0,
 			0,
 			0,
+			0
 		},
 		16
 	},
@@ -581,6 +625,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_ts_config_map_mapcfg,
 			Anum_pg_ts_config_map_maptokentype,
 			Anum_pg_ts_config_map_mapseqno,
+			0,
 			0
 		},
 		4
@@ -592,6 +637,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_ts_config_cfgname,
 			Anum_pg_ts_config_cfgnamespace,
 			0,
+			0,
 			0
 		},
 		16
@@ -603,6 +649,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		16
@@ -614,6 +661,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_ts_dict_dictname,
 			Anum_pg_ts_dict_dictnamespace,
 			0,
+			0,
 			0
 		},
 		16
@@ -625,6 +673,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		16
@@ -636,6 +685,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_ts_parser_prsname,
 			Anum_pg_ts_parser_prsnamespace,
 			0,
+			0,
 			0
 		},
 		4
@@ -647,6 +697,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		4
@@ -658,6 +709,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_ts_template_tmplname,
 			Anum_pg_ts_template_tmplnamespace,
 			0,
+			0,
 			0
 		},
 		16
@@ -669,6 +721,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		16
@@ -680,6 +733,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_type_typname,
 			Anum_pg_type_typnamespace,
 			0,
+			0,
 			0
 		},
 		1024
@@ -691,6 +745,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		1024
@@ -702,6 +757,7 @@ static const struct cachedesc cacheinfo[] = {
 			ObjectIdAttributeNumber,
 			0,
 			0,
+			0,
 			0
 		},
 		128
@@ -713,6 +769,7 @@ static const struct cachedesc cacheinfo[] = {
 			Anum_pg_user_mapping_umuser,
 			Anum_pg_user_mapping_umserver,
 			0,
+			0,
 			0
 		},
 		128
@@ -803,13 +860,14 @@ SearchSysCache(int cacheId,
 			   Datum key1,
 			   Datum key2,
 			   Datum key3,
-			   Datum key4)
+			   Datum key4,
+			   Datum key5)
 {
 	if (cacheId < 0 || cacheId >= SysCacheSize ||
 		!PointerIsValid(SysCache[cacheId]))
 		elog(ERROR, "invalid cache id: %d", cacheId);
 
-	return SearchCatCache(SysCache[cacheId], key1, key2, key3, key4);
+	return SearchCatCache(SysCache[cacheId], key1, key2, key3, key4, key5);
 }
 
 /*
@@ -835,12 +893,13 @@ SearchSysCacheCopy(int cacheId,
 				   Datum key1,
 				   Datum key2,
 				   Datum key3,
-				   Datum key4)
+				   Datum key4,
+				   Datum key5)
 {
 	HeapTuple	tuple,
 				newtuple;
 
-	tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+	tuple = SearchSysCache(cacheId, key1, key2, key3, key4, key5);
 	if (!HeapTupleIsValid(tuple))
 		return tuple;
 	newtuple = heap_copytuple(tuple);
@@ -859,11 +918,12 @@ SearchSysCacheExists(int cacheId,
 					 Datum key1,
 					 Datum key2,
 					 Datum key3,
-					 Datum key4)
+					 Datum key4,
+					 Datum key5)
 {
 	HeapTuple	tuple;
 
-	tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+	tuple = SearchSysCache(cacheId, key1, key2, key3, key4, key5);
 	if (!HeapTupleIsValid(tuple))
 		return false;
 	ReleaseSysCache(tuple);
@@ -882,12 +942,13 @@ GetSysCacheOid(int cacheId,
 			   Datum key1,
 			   Datum key2,
 			   Datum key3,
-			   Datum key4)
+			   Datum key4,
+			   Datum key5)
 {
 	HeapTuple	tuple;
 	Oid			result;
 
-	tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
+	tuple = SearchSysCache(cacheId, key1, key2, key3, key4, key5);
 	if (!HeapTupleIsValid(tuple))
 		return InvalidOid;
 	result = HeapTupleGetOid(tuple);
@@ -1008,12 +1069,12 @@ SysCacheGetAttr(int cacheId, HeapTuple tup,
  */
 struct catclist *
 SearchSysCacheList(int cacheId, int nkeys,
-				   Datum key1, Datum key2, Datum key3, Datum key4)
+				   Datum key1, Datum key2, Datum key3, Datum key4, Datum key5)
 {
 	if (cacheId < 0 || cacheId >= SysCacheSize ||
 		!PointerIsValid(SysCache[cacheId]))
 		elog(ERROR, "invalid cache id: %d", cacheId);
 
 	return SearchCatCacheList(SysCache[cacheId], nkeys,
-							  key1, key2, key3, key4);
+							  key1, key2, key3, key4, key5);
 }
diff --git a/src/include/utils/catcache.h b/src/include/utils/catcache.h
index 0db116d..64e683e 100644
--- a/src/include/utils/catcache.h
+++ b/src/include/utils/catcache.h
@@ -32,7 +32,7 @@
  *		struct catcacheheader:	information for managing all the caches.
  */
 
-#define CATCACHE_MAXKEYS		4
+#define CATCACHE_MAXKEYS		5
 
 typedef struct catcache
 {
@@ -171,12 +171,14 @@ extern void InitCatCachePhase2(CatCache *cache, bool touch_index);
 
 extern HeapTuple SearchCatCache(CatCache *cache,
 			   Datum v1, Datum v2,
-			   Datum v3, Datum v4);
+			   Datum v3, Datum v4,
+			   Datum v5);
 extern void ReleaseCatCache(HeapTuple tuple);
 
 extern CatCList *SearchCatCacheList(CatCache *cache, int nkeys,
 				   Datum v1, Datum v2,
-				   Datum v3, Datum v4);
+				   Datum v3, Datum v4,
+				   Datum v5);
 extern void ReleaseCatCacheList(CatCList *list);
 
 extern void ResetCatalogCaches(void);
diff --git a/src/include/utils/syscache.h b/src/include/utils/syscache.h
index 2f19e5c..fc9bb08 100644
--- a/src/include/utils/syscache.h
+++ b/src/include/utils/syscache.h
@@ -91,16 +91,17 @@ extern void InitCatalogCache(void);
 extern void InitCatalogCachePhase2(void);
 
 extern HeapTuple SearchSysCache(int cacheId,
-			   Datum key1, Datum key2, Datum key3, Datum key4);
+			   Datum key1, Datum key2, Datum key3, Datum key4, Datum key5);
 extern void ReleaseSysCache(HeapTuple tuple);
 
 /* convenience routines */
 extern HeapTuple SearchSysCacheCopy(int cacheId,
-				   Datum key1, Datum key2, Datum key3, Datum key4);
+				   Datum key1, Datum key2, Datum key3, Datum key4, Datum key5);
 extern bool SearchSysCacheExists(int cacheId,
-					 Datum key1, Datum key2, Datum key3, Datum key4);
+					 Datum key1, Datum key2, Datum key3,
+					 Datum key4, Datum key5);
 extern Oid GetSysCacheOid(int cacheId,
-			   Datum key1, Datum key2, Datum key3, Datum key4);
+			   Datum key1, Datum key2, Datum key3, Datum key4, Datum key5);
 
 extern HeapTuple SearchSysCacheAttName(Oid relid, const char *attname);
 extern HeapTuple SearchSysCacheCopyAttName(Oid relid, const char *attname);
@@ -111,7 +112,7 @@ extern Datum SysCacheGetAttr(int cacheId, HeapTuple tup,
 
 /* list-search interface.  Users of this must import catcache.h too */
 extern struct catclist *SearchSysCacheList(int cacheId, int nkeys,
-				   Datum key1, Datum key2, Datum key3, Datum key4);
+				   Datum key1, Datum key2, Datum key3, Datum key4, Datum key5);
 
 /*
  * The use of the macros below rather than direct calls to the corresponding
@@ -119,49 +120,59 @@ extern struct catclist *SearchSysCacheList(int cacheId, int nkeys,
  * maximum number of keys.
  */
 #define SearchSysCache1(cacheId, key1) \
-	SearchSysCache(cacheId, key1, 0, 0, 0)
+	SearchSysCache(cacheId, key1, 0, 0, 0, 0)
 #define SearchSysCache2(cacheId, key1, key2) \
-	SearchSysCache(cacheId, key1, key2, 0, 0)
+	SearchSysCache(cacheId, key1, key2, 0, 0, 0)
 #define SearchSysCache3(cacheId, key1, key2, key3) \
-	SearchSysCache(cacheId, key1, key2, key3, 0)
+	SearchSysCache(cacheId, key1, key2, key3, 0, 0)
 #define SearchSysCache4(cacheId, key1, key2, key3, key4) \
-	SearchSysCache(cacheId, key1, key2, key3, key4)
+	SearchSysCache(cacheId, key1, key2, key3, key4, 0)
+#define SearchSysCache5(cacheId, key1, key2, key3, key4, key5) \
+	SearchSysCache(cacheId, key1, key2, key3, key4, key5)
 
 #define SearchSysCacheCopy1(cacheId, key1) \
-	SearchSysCacheCopy(cacheId, key1, 0, 0, 0)
+	SearchSysCacheCopy(cacheId, key1, 0, 0, 0, 0)
 #define SearchSysCacheCopy2(cacheId, key1, key2) \
-	SearchSysCacheCopy(cacheId, key1, key2, 0, 0)
+	SearchSysCacheCopy(cacheId, key1, key2, 0, 0, 0)
 #define SearchSysCacheCopy3(cacheId, key1, key2, key3) \
-	SearchSysCacheCopy(cacheId, key1, key2, key3, 0)
+	SearchSysCacheCopy(cacheId, key1, key2, key3, 0, 0)
 #define SearchSysCacheCopy4(cacheId, key1, key2, key3, key4) \
-	SearchSysCacheCopy(cacheId, key1, key2, key3, key4)
+	SearchSysCacheCopy(cacheId, key1, key2, key3, key4, 0)
+#define SearchSysCacheCopy5(cacheId, key1, key2, key3, key4, key5) \
+	SearchSysCacheCopy(cacheId, key1, key2, key3, key4, key5)
 
 #define SearchSysCacheExists1(cacheId, key1) \
-	SearchSysCacheExists(cacheId, key1, 0, 0, 0)
+	SearchSysCacheExists(cacheId, key1, 0, 0, 0, 0)
 #define SearchSysCacheExists2(cacheId, key1, key2) \
-	SearchSysCacheExists(cacheId, key1, key2, 0, 0)
+	SearchSysCacheExists(cacheId, key1, key2, 0, 0, 0)
 #define SearchSysCacheExists3(cacheId, key1, key2, key3) \
-	SearchSysCacheExists(cacheId, key1, key2, key3, 0)
+	SearchSysCacheExists(cacheId, key1, key2, key3, 0, 0)
 #define SearchSysCacheExists4(cacheId, key1, key2, key3, key4) \
-	SearchSysCacheExists(cacheId, key1, key2, key3, key4)
+	SearchSysCacheExists(cacheId, key1, key2, key3, key4, 0)
+#define SearchSysCacheExists5(cacheId, key1, key2, key3, key4, key5) \
+	SearchSysCacheExists(cacheId, key1, key2, key3, key4, key5)
 
 #define GetSysCacheOid1(cacheId, key1) \
-	GetSysCacheOid(cacheId, key1, 0, 0, 0)
+	GetSysCacheOid(cacheId, key1, 0, 0, 0, 0)
 #define GetSysCacheOid2(cacheId, key1, key2) \
-	GetSysCacheOid(cacheId, key1, key2, 0, 0)
+	GetSysCacheOid(cacheId, key1, key2, 0, 0, 0)
 #define GetSysCacheOid3(cacheId, key1, key2, key3) \
-	GetSysCacheOid(cacheId, key1, key2, key3, 0)
+	GetSysCacheOid(cacheId, key1, key2, key3, 0, 0)
 #define GetSysCacheOid4(cacheId, key1, key2, key3, key4) \
-	GetSysCacheOid(cacheId, key1, key2, key3, key4)
+	GetSysCacheOid(cacheId, key1, key2, key3, key4, 0)
+#define GetSysCacheOid5(cacheId, key1, key2, key3, key4, key5) \
+	GetSysCacheOid(cacheId, key1, key2, key3, key4, key5)
 
 #define SearchSysCacheList1(cacheId, key1) \
-	SearchSysCacheList(cacheId, 1, key1, 0, 0, 0)
+	SearchSysCacheList(cacheId, 1, key1, 0, 0, 0, 0)
 #define SearchSysCacheList2(cacheId, key1, key2) \
-	SearchSysCacheList(cacheId, 2, key1, key2, 0, 0)
+	SearchSysCacheList(cacheId, 2, key1, key2, 0, 0, 0)
 #define SearchSysCacheList3(cacheId, key1, key2, key3) \
-	SearchSysCacheList(cacheId, 3, key1, key2, key3, 0)
+	SearchSysCacheList(cacheId, 3, key1, key2, key3, 0, 0)
 #define SearchSysCacheList4(cacheId, key1, key2, key3, key4) \
-	SearchSysCacheList(cacheId, 4, key1, key2, key3, key4)
+	SearchSysCacheList(cacheId, 4, key1, key2, key3, key4, 0)
+#define SearchSysCacheList5(cacheId, key1, key2, key3, key4, key5) \
+	SearchSysCacheList(cacheId, 5, key1, key2, key3, key4, key5)
 
 #define ReleaseSysCacheList(x)	ReleaseCatCacheList(x)