Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
d16b706e
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d16b706e
编写于
11月 01, 1999
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Allow indexes on system catalogs for use in cache code.
Thanks to Hiroshi
上级
1973e90c
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
237 addition
and
53 deletion
+237
-53
src/backend/catalog/index.c
src/backend/catalog/index.c
+21
-13
src/backend/catalog/indexing.c
src/backend/catalog/indexing.c
+107
-6
src/backend/utils/cache/catcache.c
src/backend/utils/cache/catcache.c
+68
-1
src/backend/utils/cache/syscache.c
src/backend/utils/cache/syscache.c
+7
-18
src/include/catalog/indexing.h
src/include/catalog/indexing.h
+21
-2
src/include/utils/syscache.h
src/include/utils/syscache.h
+13
-13
未找到文件。
src/backend/catalog/index.c
浏览文件 @
d16b706e
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.9
2 1999/10/26 03:12:33
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.9
3 1999/11/01 02:29:24
momjian Exp $
*
*
* INTERFACE ROUTINES
...
...
@@ -54,26 +54,23 @@
/* non-export function prototypes */
static
Oid
GetHeapRelationOid
(
char
*
heapRelationName
,
char
*
indexRelationName
,
bool
istemp
);
bool
istemp
);
static
TupleDesc
BuildFuncTupleDesc
(
FuncIndexInfo
*
funcInfo
);
static
TupleDesc
ConstructTupleDescriptor
(
Oid
heapoid
,
Relation
heapRelation
,
List
*
attributeList
,
int
numatts
,
AttrNumber
*
attNums
);
List
*
attributeList
,
int
numatts
,
AttrNumber
*
attNums
);
static
void
ConstructIndexReldesc
(
Relation
indexRelation
,
Oid
amoid
);
static
Oid
UpdateRelationRelation
(
Relation
indexRelation
,
char
*
temp_relname
);
static
void
InitializeAttributeOids
(
Relation
indexRelation
,
int
numatts
,
Oid
indexoid
);
static
void
AppendAttributeTuples
(
Relation
indexRelation
,
int
numatts
);
int
numatts
,
Oid
indexoid
);
static
void
AppendAttributeTuples
(
Relation
indexRelation
,
int
numatts
);
static
void
UpdateIndexRelation
(
Oid
indexoid
,
Oid
heapoid
,
FuncIndexInfo
*
funcInfo
,
int
natts
,
AttrNumber
*
attNums
,
Oid
*
classOids
,
Node
*
predicate
,
List
*
attributeList
,
bool
islossy
,
bool
unique
,
bool
primary
);
FuncIndexInfo
*
funcInfo
,
int
natts
,
AttrNumber
*
attNums
,
Oid
*
classOids
,
Node
*
predicate
,
List
*
attributeList
,
bool
islossy
,
bool
unique
,
bool
primary
);
static
void
DefaultBuild
(
Relation
heapRelation
,
Relation
indexRelation
,
int
numberOfAttributes
,
AttrNumber
*
attributeNumber
,
IndexStrategy
indexStrategy
,
uint16
parameterCount
,
int
numberOfAttributes
,
AttrNumber
*
attributeNumber
,
IndexStrategy
indexStrategy
,
uint16
parameterCount
,
Datum
*
parameter
,
FuncIndexInfoPtr
funcInfo
,
PredInfo
*
predInfo
);
/* ----------------------------------------------------------------
...
...
@@ -661,6 +658,7 @@ UpdateIndexRelation(Oid indexoid,
Relation
pg_index
;
HeapTuple
tuple
;
int
i
;
Relation
idescs
[
Num_pg_index_indices
];
/* ----------------
* allocate an Form_pg_index big enough to hold the
...
...
@@ -752,6 +750,16 @@ UpdateIndexRelation(Oid indexoid,
*/
heap_insert
(
pg_index
,
tuple
);
/* ----------------
* insert the index tuple into the pg_index
* ----------------
*/
if
(
!
IsBootstrapProcessingMode
())
{
CatalogOpenIndices
(
Num_pg_index_indices
,
Name_pg_index_indices
,
idescs
);
CatalogIndexInsert
(
idescs
,
Num_pg_index_indices
,
pg_index
,
tuple
);
CatalogCloseIndices
(
Num_pg_index_indices
,
idescs
);
}
/* ----------------
* close the relation and free the tuple
* ----------------
...
...
src/backend/catalog/indexing.c
浏览文件 @
d16b706e
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.4
8 1999/10/15 01:49:39
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.4
9 1999/11/01 02:29:25
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -38,15 +38,17 @@
* pg_trigger
*/
char
*
Name_pg_amop_indices
[
Num_pg_amop_indices
]
=
{
AccessMethodOpidIndex
,
AccessMethodStrategyIndex
};
char
*
Name_pg_attr_indices
[
Num_pg_attr_indices
]
=
{
AttributeNameIndex
,
AttributeNumIndex
,
Attribute
RelidIndex
};
AttributeNumIndex
,
AttributeRelidIndex
};
char
*
Name_pg_index_indices
[
Num_pg_index_indices
]
=
{
Index
RelidIndex
};
char
*
Name_pg_proc_indices
[
Num_pg_proc_indices
]
=
{
ProcedureNameIndex
,
ProcedureOidIndex
};
ProcedureOidIndex
};
char
*
Name_pg_type_indices
[
Num_pg_type_indices
]
=
{
TypeNameIndex
,
TypeOidIndex
};
TypeOidIndex
};
char
*
Name_pg_class_indices
[
Num_pg_class_indices
]
=
{
ClassNameIndex
,
ClassOidIndex
};
ClassOidIndex
};
char
*
Name_pg_attrdef_indices
[
Num_pg_attrdef_indices
]
=
{
AttrDefaultIndex
};
char
*
Name_pg_relcheck_indices
[
Num_pg_relcheck_indices
]
=
{
RelCheckIndex
};
...
...
@@ -255,12 +257,89 @@ CatalogIndexFetchTuple(Relation heapRelation,
}
/*---------------------------------------------------------------------
* Class-specific index lookups
*---------------------------------------------------------------------
*/
/*
* The remainder of the file is for individual index scan routines. Each
* index should be scanned according to how it was defined during bootstrap
* (that is, functional or normal) and what arguments the cache lookup
* requires. Each routine returns the heap tuple that qualifies.
*/
HeapTuple
AccessMethodOpidIndexScan
(
Relation
heapRelation
,
Oid
claid
,
Oid
opopr
,
Oid
opid
)
{
Relation
idesc
;
ScanKeyData
skey
[
3
];
HeapTuple
tuple
;
ScanKeyEntryInitialize
(
&
skey
[
0
],
(
bits16
)
0x0
,
(
AttrNumber
)
1
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
claid
));
ScanKeyEntryInitialize
(
&
skey
[
1
],
(
bits16
)
0x0
,
(
AttrNumber
)
2
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
opopr
));
ScanKeyEntryInitialize
(
&
skey
[
2
],
(
bits16
)
0x0
,
(
AttrNumber
)
3
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
opid
));
idesc
=
index_openr
(
AccessMethodOpidIndex
);
tuple
=
CatalogIndexFetchTuple
(
heapRelation
,
idesc
,
skey
,
3
);
index_close
(
idesc
);
return
tuple
;
}
HeapTuple
AccessMethodStrategyIndexScan
(
Relation
heapRelation
,
Oid
opid
,
Oid
claid
,
int2
opstrategy
)
{
Relation
idesc
;
ScanKeyData
skey
[
3
];
HeapTuple
tuple
;
ScanKeyEntryInitialize
(
&
skey
[
0
],
(
bits16
)
0x0
,
(
AttrNumber
)
1
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
opid
));
ScanKeyEntryInitialize
(
&
skey
[
1
],
(
bits16
)
0x0
,
(
AttrNumber
)
2
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
claid
));
ScanKeyEntryInitialize
(
&
skey
[
2
],
(
bits16
)
0x0
,
(
AttrNumber
)
3
,
(
RegProcedure
)
F_INT2EQ
,
Int16GetDatum
(
opstrategy
));
idesc
=
index_openr
(
AccessMethodStrategyIndex
);
tuple
=
CatalogIndexFetchTuple
(
heapRelation
,
idesc
,
skey
,
3
);
index_close
(
idesc
);
return
tuple
;
}
HeapTuple
AttributeNameIndexScan
(
Relation
heapRelation
,
Oid
relid
,
...
...
@@ -320,6 +399,28 @@ AttributeNumIndexScan(Relation heapRelation,
return
tuple
;
}
HeapTuple
IndexRelidIndexScan
(
Relation
heapRelation
,
Oid
relid
)
{
Relation
idesc
;
ScanKeyData
skey
[
1
];
HeapTuple
tuple
;
ScanKeyEntryInitialize
(
&
skey
[
0
],
(
bits16
)
0x0
,
(
AttrNumber
)
1
,
(
RegProcedure
)
F_OIDEQ
,
ObjectIdGetDatum
(
relid
));
idesc
=
index_openr
(
IndexRelidIndex
);
tuple
=
CatalogIndexFetchTuple
(
heapRelation
,
idesc
,
skey
,
1
);
index_close
(
idesc
);
return
tuple
;
}
HeapTuple
ProcedureOidIndexScan
(
Relation
heapRelation
,
Oid
procId
)
...
...
src/backend/utils/cache/catcache.c
浏览文件 @
d16b706e
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.
49 1999/09/18 19:07:55 tgl
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.
50 1999/11/01 02:29:25 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -16,9 +16,12 @@
#include "access/heapam.h"
#include "access/valid.h"
#include "catalog/pg_type.h"
#include "catalog/catname.h"
#include "catalog/indexing.h"
#include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/catcache.h"
#include "utils/syscache.h"
static
void
CatCacheRemoveCTup
(
CatCache
*
cache
,
Dlelem
*
e
);
static
Index
CatalogCacheComputeHashIndex
(
struct
catcache
*
cacheInP
);
...
...
@@ -805,6 +808,62 @@ InitSysCache(char *relname,
}
/* --------------------------------
* SearchSelfReferences
*
* This call searches a self referencing information,
*
* which causes a cycle in system catalog cache
*
* cache should already be initailized
* --------------------------------
*/
static
HeapTuple
SearchSelfReferences
(
const
struct
catcache
*
cache
)
{
HeapTuple
ntp
;
Relation
rel
;
static
Oid
indexSelfOid
=
0
;
static
HeapTuple
indexSelfTuple
=
0
;
if
(
cache
->
id
!=
INDEXRELID
)
return
(
HeapTuple
)
0
;
if
(
!
indexSelfOid
)
{
rel
=
heap_openr
(
RelationRelationName
,
AccessShareLock
);
ntp
=
ClassNameIndexScan
(
rel
,
IndexRelidIndex
);
if
(
!
HeapTupleIsValid
(
ntp
))
elog
(
ERROR
,
"SearchSelfRefernces: %s not found in %s"
,
IndexRelidIndex
,
RelationRelationName
);
indexSelfOid
=
ntp
->
t_data
->
t_oid
;
pfree
(
ntp
);
heap_close
(
rel
,
AccessShareLock
);
}
if
((
Oid
)
cache
->
cc_skey
[
0
].
sk_argument
!=
indexSelfOid
)
return
(
HeapTuple
)
0
;
if
(
!
indexSelfTuple
)
{
HeapScanDesc
sd
;
MemoryContext
oldcxt
;
if
(
!
CacheCxt
)
CacheCxt
=
CreateGlobalMemory
(
"Cache"
);
rel
=
heap_open
(
cache
->
relationId
,
AccessShareLock
);
sd
=
heap_beginscan
(
rel
,
false
,
SnapshotNow
,
1
,
cache
->
cc_skey
);
ntp
=
heap_getnext
(
sd
,
0
);
if
(
!
HeapTupleIsValid
(
ntp
))
elog
(
ERROR
,
"SearchSelfRefernces: tuple not found"
);
oldcxt
=
MemoryContextSwitchTo
((
MemoryContext
)
CacheCxt
);
indexSelfTuple
=
heap_copytuple
(
ntp
);
MemoryContextSwitchTo
(
oldcxt
);
heap_endscan
(
sd
);
heap_close
(
rel
,
AccessShareLock
);
}
return
indexSelfTuple
;
}
/* --------------------------------
* SearchSysCache
*
...
...
@@ -845,6 +904,14 @@ SearchSysCache(struct catcache * cache,
cache
->
cc_skey
[
2
].
sk_argument
=
v3
;
cache
->
cc_skey
[
3
].
sk_argument
=
v4
;
/*
* resolve self referencing informtion
*/
if
(
ntp
=
SearchSelfReferences
(
cache
),
ntp
)
{
return
heap_copytuple
(
ntp
);
}
/* ----------------
* find the hash bucket in which to look for the tuple
* ----------------
...
...
src/backend/utils/cache/syscache.c
浏览文件 @
d16b706e
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.3
7 1999/09/30 10:31:43 wieck
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.3
8 1999/11/01 02:29:25 momjian
Exp $
*
* NOTES
* These routines allow the parser/planner/executor to perform
...
...
@@ -59,8 +59,8 @@ static struct cachedesc cacheinfo[] = {
0
},
sizeof
(
FormData_pg_amop
),
NULL
,
(
ScanFunc
)
NULL
},
AccessMethodOpidIndex
,
(
ScanFunc
)
AccessMethodOpidIndexScan
},
{
AccessMethodOperatorRelationName
,
/* AMOPSTRATEGY */
3
,
{
...
...
@@ -70,8 +70,8 @@ static struct cachedesc cacheinfo[] = {
0
},
sizeof
(
FormData_pg_amop
),
NULL
,
(
ScanFunc
)
NULL
},
AccessMethodStrategyIndex
,
(
ScanFunc
)
AccessMethodStrategyIndexScan
},
{
AttributeRelationName
,
/* ATTNAME */
2
,
{
...
...
@@ -103,8 +103,8 @@ static struct cachedesc cacheinfo[] = {
0
},
offsetof
(
FormData_pg_index
,
indpred
),
NULL
,
NULL
},
IndexRelidIndex
,
(
ScanFunc
)
IndexRelidIndexScan
},
{
LanguageRelationName
,
/* LANNAME */
1
,
{
...
...
@@ -226,17 +226,6 @@ static struct cachedesc cacheinfo[] = {
sizeof
(
FormData_pg_opclass
),
NULL
,
NULL
},
{
IndexRelationName
,
/* INDRELIDKEY *//* never used */
2
,
{
Anum_pg_index_indrelid
,
Anum_pg_index_indkey
,
0
,
0
},
offsetof
(
FormData_pg_index
,
indpred
),
NULL
,
(
ScanFunc
)
NULL
},
{
InheritsRelationName
,
/* INHRELID */
2
,
{
...
...
src/include/catalog/indexing.h
浏览文件 @
d16b706e
...
...
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: indexing.h,v 1.2
5 1999/09/30 10:31:44 wieck
Exp $
* $Id: indexing.h,v 1.2
6 1999/11/01 02:29:26 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -19,7 +19,9 @@
/*
* Some definitions for indices on pg_attribute
*/
#define Num_pg_amop_indices 2
#define Num_pg_attr_indices 3
#define Num_pg_index_indices 1
#define Num_pg_proc_indices 2
#define Num_pg_type_indices 2
#define Num_pg_class_indices 2
...
...
@@ -32,8 +34,11 @@
/*
* Names of indices on system catalogs
*/
#define AccessMethodOpidIndex "pg_amop_opid_index"
#define AccessMethodStrategyIndex "pg_amop_strategy_index"
#define AttributeNameIndex "pg_attribute_relid_attnam_index"
#define AttributeNumIndex "pg_attribute_relid_attnum_index"
#define IndexRelidIndex "pg_index_indexrelid_index"
#define AttributeRelidIndex "pg_attribute_attrelid_index"
#define ProcedureOidIndex "pg_proc_oid_index"
#define ProcedureNameIndex "pg_proc_proname_narg_type_index"
...
...
@@ -48,7 +53,9 @@
#define TriggerConstrRelidIndex "pg_trigger_tgconstrrelid_index"
#define DescriptionObjIndex "pg_description_objoid_index"
extern
char
*
Name_pg_amop_indices
[];
extern
char
*
Name_pg_attr_indices
[];
extern
char
*
Name_pg_index_indices
[];
extern
char
*
Name_pg_proc_indices
[];
extern
char
*
Name_pg_type_indices
[];
extern
char
*
Name_pg_class_indices
[];
...
...
@@ -57,6 +64,7 @@ extern char *Name_pg_relcheck_indices[];
extern
char
*
Name_pg_trigger_indices
[];
extern
char
*
Name_pg_description_indices
[];
extern
char
*
IndexedCatalogNames
[];
/*
...
...
@@ -72,13 +80,17 @@ extern void CatalogIndexInsert(Relation *idescs,
HeapTuple
heapTuple
);
extern
bool
CatalogHasIndex
(
char
*
catName
,
Oid
catId
);
extern
HeapTuple
AccessMethodOpidIndexScan
(
Relation
heapRelation
,
Oid
claid
,
Oid
opopr
,
Oid
opid
);
extern
HeapTuple
AccessMethodStrategyIndexScan
(
Relation
heapRelation
,
Oid
opid
,
Oid
claid
,
int2
opstrategy
);
extern
HeapTuple
AttributeNameIndexScan
(
Relation
heapRelation
,
Oid
relid
,
char
*
attname
);
extern
HeapTuple
AttributeNumIndexScan
(
Relation
heapRelation
,
Oid
relid
,
AttrNumber
attnum
);
extern
HeapTuple
IndexRelidIndexScan
(
Relation
heapRelation
,
Oid
relid
);
extern
HeapTuple
ProcedureOidIndexScan
(
Relation
heapRelation
,
Oid
procId
);
extern
HeapTuple
ProcedureNameIndexScan
(
Relation
heapRelation
,
char
*
procName
,
int2
nargs
,
Oid
*
argTypes
);
...
...
@@ -88,6 +100,8 @@ extern HeapTuple ClassNameIndexScan(Relation heapRelation, char *relName);
extern
HeapTuple
ClassOidIndexScan
(
Relation
heapRelation
,
Oid
relId
);
/*
* What follows are lines processed by genbki.sh to create the statements
* the bootstrap parser will turn into DefineIndex commands.
...
...
@@ -95,10 +109,15 @@ extern HeapTuple ClassOidIndexScan(Relation heapRelation, Oid relId);
* The keyword is DECLARE_INDEX every thing after that is just like in a
* normal specification of the 'define index' POSTQUEL command.
*/
DECLARE_INDEX
(
pg_amop_opid_index
on
pg_amop
using
btree
(
amopclaid
oid_ops
,
amopopr
oid_ops
,
amopid
oid_ops
));
DECLARE_INDEX
(
pg_amop_strategy_index
on
pg_amop
using
btree
(
amopid
oid_ops
,
amopclaid
oid_ops
,
amopstrategy
int2_ops
));
DECLARE_INDEX
(
pg_attribute_relid_attnam_index
on
pg_attribute
using
btree
(
attrelid
oid_ops
,
attname
name_ops
));
DECLARE_INDEX
(
pg_attribute_relid_attnum_index
on
pg_attribute
using
btree
(
attrelid
oid_ops
,
attnum
int2_ops
));
DECLARE_INDEX
(
pg_attribute_attrelid_index
on
pg_attribute
using
btree
(
attrelid
oid_ops
));
DECLARE_INDEX
(
pg_index_indexrelid_index
on
pg_index
using
btree
(
indexrelid
oid_ops
));
DECLARE_INDEX
(
pg_proc_oid_index
on
pg_proc
using
btree
(
oid
oid_ops
));
DECLARE_INDEX
(
pg_proc_proname_narg_type_index
on
pg_proc
using
btree
(
proname
name_ops
,
pronargs
int2_ops
,
proargtypes
oid8_ops
));
...
...
src/include/utils/syscache.h
浏览文件 @
d16b706e
...
...
@@ -8,7 +8,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: syscache.h,v 1.
19 1999/09/30 10:31:47 wieck
Exp $
* $Id: syscache.h,v 1.
20 1999/11/01 02:29:27 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -48,18 +48,18 @@
#define TYPOID 13
#define AMNAME 14
#define CLANAME 15
#define INDRELIDKEY 16
#define INHRELID 1
7
#define RULOID 1
8
#define AGGNAME 1
9
#define LISTENREL
20
#define USENAME 2
1
#define USESYSID 2
2
#define GRONAME 2
3
#define GROSYSID 2
4
#define REWRITENAME 2
5
#define CLADEFTYPE 2
6
#define LANOID 2
7
/* #define INDRELIDKEY 16 */
#define INHRELID 1
6
#define RULOID 1
7
#define AGGNAME 1
8
#define LISTENREL
19
#define USENAME 2
0
#define USESYSID 2
1
#define GRONAME 2
2
#define GROSYSID 2
3
#define REWRITENAME 2
4
#define CLADEFTYPE 2
5
#define LANOID 2
6
/* ----------------
* struct cachedesc: information needed for a call to InitSysCache()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录