Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
77db9d9f
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,发现更多精彩内容 >>
提交
77db9d9f
编写于
10月 20, 2008
作者:
T
Teodor Sigaev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove mark/restore support in GIN and GiST indexes.
Per Tom's comment. Also revome useless GISTScanOpaque->flags field.
上级
7f6bc33f
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
20 addition
and
250 deletion
+20
-250
src/backend/access/gin/ginget.c
src/backend/access/gin/ginget.c
+1
-49
src/backend/access/gin/ginscan.c
src/backend/access/gin/ginscan.c
+10
-57
src/backend/access/gist/gistget.c
src/backend/access/gist/gistget.c
+1
-11
src/backend/access/gist/gistscan.c
src/backend/access/gist/gistscan.c
+6
-113
src/include/access/gin.h
src/include/access/gin.h
+1
-4
src/include/access/gist_private.h
src/include/access/gist_private.h
+1
-16
未找到文件。
src/backend/access/gin/ginget.c
浏览文件 @
77db9d9f
...
...
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.
19 2008/09/04 11:47:05
teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.
20 2008/10/20 13:39:44
teodor Exp $
*-------------------------------------------------------------------------
*/
...
...
@@ -582,54 +582,6 @@ entryGetItem(Relation index, GinScanEntry entry)
return
entry
->
isFinished
;
}
/*
* restart from saved position. Actually it's needed only for
* partial match. function is called only by ginrestpos()
*/
void
ginrestartentry
(
GinScanEntry
entry
)
{
ItemPointerData
stopItem
=
entry
->
curItem
;
bool
savedReduceResult
;
if
(
entry
->
master
||
entry
->
partialMatch
==
NULL
)
return
;
/* entry is slave or not a partial match type*/
if
(
entry
->
isFinished
)
return
;
/* entry was finished before ginmarkpos() call */
if
(
ItemPointerGetBlockNumber
(
&
stopItem
)
==
InvalidBlockNumber
)
return
;
/* entry wasn't began before ginmarkpos() call */
/*
* Reset iterator
*/
tbm_begin_iterate
(
entry
->
partialMatch
);
entry
->
partialMatchResult
=
NULL
;
entry
->
offset
=
0
;
/*
* Temporary reset reduceResult flag to guarantee refinding
* of curItem
*/
savedReduceResult
=
entry
->
reduceResult
;
entry
->
reduceResult
=
FALSE
;
do
{
/*
* We can use null instead of index because
* partial match doesn't use it
*/
if
(
entryGetItem
(
NULL
,
entry
)
==
false
)
elog
(
ERROR
,
"cannot refind scan position"
);
/* must not be here! */
}
while
(
compareItemPointers
(
&
stopItem
,
&
entry
->
curItem
)
!=
0
);
Assert
(
entry
->
isFinished
==
FALSE
);
entry
->
reduceResult
=
savedReduceResult
;
}
/*
* Sets key->curItem to new found heap item pointer for one scan key
* Returns isFinished, ie TRUE means we did NOT get a new item pointer!
...
...
src/backend/access/gin/ginscan.c
浏览文件 @
77db9d9f
...
...
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.1
8 2008/09/04 11:47:05
teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.1
9 2008/10/20 13:39:44
teodor Exp $
*-------------------------------------------------------------------------
*/
...
...
@@ -114,7 +114,7 @@ resetScanKeys(GinScanKey keys, uint32 nkeys)
#endif
static
void
freeScanKeys
(
GinScanKey
keys
,
uint32
nkeys
,
bool
removeRes
)
freeScanKeys
(
GinScanKey
keys
,
uint32
nkeys
)
{
uint32
i
,
j
;
...
...
@@ -130,14 +130,13 @@ freeScanKeys(GinScanKey keys, uint32 nkeys, bool removeRes)
{
if
(
key
->
scanEntry
[
j
].
buffer
!=
InvalidBuffer
)
ReleaseBuffer
(
key
->
scanEntry
[
j
].
buffer
);
if
(
removeRes
&&
key
->
scanEntry
[
j
].
list
)
if
(
key
->
scanEntry
[
j
].
list
)
pfree
(
key
->
scanEntry
[
j
].
list
);
if
(
removeRes
&&
key
->
scanEntry
[
j
].
partialMatch
)
if
(
key
->
scanEntry
[
j
].
partialMatch
)
tbm_free
(
key
->
scanEntry
[
j
].
partialMatch
);
}
if
(
removeRes
)
pfree
(
key
->
entryRes
);
pfree
(
key
->
entryRes
);
pfree
(
key
->
scanEntry
);
}
...
...
@@ -233,11 +232,10 @@ ginrescan(PG_FUNCTION_ARGS)
}
else
{
freeScanKeys
(
so
->
keys
,
so
->
nkeys
,
TRUE
);
freeScanKeys
(
so
->
markPos
,
so
->
nkeys
,
FALSE
);
freeScanKeys
(
so
->
keys
,
so
->
nkeys
);
}
so
->
markPos
=
so
->
keys
=
NULL
;
so
->
keys
=
NULL
;
if
(
scankey
&&
scan
->
numberOfKeys
>
0
)
{
...
...
@@ -257,8 +255,7 @@ ginendscan(PG_FUNCTION_ARGS)
if
(
so
!=
NULL
)
{
freeScanKeys
(
so
->
keys
,
so
->
nkeys
,
TRUE
);
freeScanKeys
(
so
->
markPos
,
so
->
nkeys
,
FALSE
);
freeScanKeys
(
so
->
keys
,
so
->
nkeys
);
MemoryContextDelete
(
so
->
tempCtx
);
...
...
@@ -268,60 +265,16 @@ ginendscan(PG_FUNCTION_ARGS)
PG_RETURN_VOID
();
}
static
GinScanKey
copyScanKeys
(
GinScanKey
keys
,
uint32
nkeys
,
bool
restart
)
{
GinScanKey
newkeys
;
uint32
i
,
j
;
newkeys
=
(
GinScanKey
)
palloc
(
sizeof
(
GinScanKeyData
)
*
nkeys
);
memcpy
(
newkeys
,
keys
,
sizeof
(
GinScanKeyData
)
*
nkeys
);
for
(
i
=
0
;
i
<
nkeys
;
i
++
)
{
newkeys
[
i
].
scanEntry
=
(
GinScanEntry
)
palloc
(
sizeof
(
GinScanEntryData
)
*
keys
[
i
].
nentries
);
memcpy
(
newkeys
[
i
].
scanEntry
,
keys
[
i
].
scanEntry
,
sizeof
(
GinScanEntryData
)
*
keys
[
i
].
nentries
);
for
(
j
=
0
;
j
<
keys
[
i
].
nentries
;
j
++
)
{
if
(
keys
[
i
].
scanEntry
[
j
].
buffer
!=
InvalidBuffer
)
IncrBufferRefCount
(
keys
[
i
].
scanEntry
[
j
].
buffer
);
if
(
keys
[
i
].
scanEntry
[
j
].
master
)
{
int
masterN
=
keys
[
i
].
scanEntry
[
j
].
master
-
keys
[
i
].
scanEntry
;
newkeys
[
i
].
scanEntry
[
j
].
master
=
newkeys
[
i
].
scanEntry
+
masterN
;
}
if
(
restart
)
ginrestartentry
(
&
keys
[
i
].
scanEntry
[
j
]
);
}
}
return
newkeys
;
}
Datum
ginmarkpos
(
PG_FUNCTION_ARGS
)
{
IndexScanDesc
scan
=
(
IndexScanDesc
)
PG_GETARG_POINTER
(
0
);
GinScanOpaque
so
=
(
GinScanOpaque
)
scan
->
opaque
;
freeScanKeys
(
so
->
markPos
,
so
->
nkeys
,
FALSE
);
so
->
markPos
=
copyScanKeys
(
so
->
keys
,
so
->
nkeys
,
FALSE
);
elog
(
ERROR
,
"GIN does not support mark/restore"
);
PG_RETURN_VOID
();
}
Datum
ginrestrpos
(
PG_FUNCTION_ARGS
)
{
IndexScanDesc
scan
=
(
IndexScanDesc
)
PG_GETARG_POINTER
(
0
);
GinScanOpaque
so
=
(
GinScanOpaque
)
scan
->
opaque
;
freeScanKeys
(
so
->
keys
,
so
->
nkeys
,
FALSE
);
so
->
keys
=
copyScanKeys
(
so
->
markPos
,
so
->
nkeys
,
TRUE
);
elog
(
ERROR
,
"GIN does not support mark/restore"
);
PG_RETURN_VOID
();
}
src/backend/access/gist/gistget.c
浏览文件 @
77db9d9f
...
...
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.7
6 2008/10/17 17:02:21
teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.7
7 2008/10/20 13:39:44
teodor Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -494,16 +494,6 @@ gistfindnext(IndexScanDesc scan, OffsetNumber n, ScanDirection dir)
*/
oldcxt
=
MemoryContextSwitchTo
(
so
->
tempCxt
);
/*
* If we modified the index during the scan, we may have a pointer to a
* ghost tuple, before the scan. If this is the case, back up one.
*/
if
(
so
->
flags
&
GS_CURBEFORE
)
{
so
->
flags
&=
~
GS_CURBEFORE
;
n
=
OffsetNumberPrev
(
n
);
}
while
(
n
>=
FirstOffsetNumber
&&
n
<=
maxoff
)
{
it
=
(
IndexTuple
)
PageGetItem
(
p
,
PageGetItemId
(
p
,
n
));
...
...
src/backend/access/gist/gistscan.c
浏览文件 @
77db9d9f
...
...
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.7
2 2008/10/17 17:02:21
teodor Exp $
* $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.7
3 2008/10/20 13:39:44
teodor Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -49,30 +49,21 @@ gistrescan(PG_FUNCTION_ARGS)
{
/* rescan an existing indexscan --- reset state */
gistfreestack
(
so
->
stack
);
gistfreestack
(
so
->
markstk
);
so
->
stack
=
so
->
markstk
=
NULL
;
so
->
flags
=
0x0
;
so
->
stack
=
NULL
;
/* drop pins on buffers -- no locks held */
if
(
BufferIsValid
(
so
->
curbuf
))
{
ReleaseBuffer
(
so
->
curbuf
);
so
->
curbuf
=
InvalidBuffer
;
}
if
(
BufferIsValid
(
so
->
markbuf
))
{
ReleaseBuffer
(
so
->
markbuf
);
so
->
markbuf
=
InvalidBuffer
;
}
}
else
{
/* initialize opaque data */
so
=
(
GISTScanOpaque
)
palloc
(
sizeof
(
GISTScanOpaqueData
));
so
->
stack
=
so
->
markstk
=
NULL
;
so
->
flags
=
0x0
;
so
->
stack
=
NULL
;
so
->
tempCxt
=
createTempGistContext
();
so
->
curbuf
=
so
->
markbuf
=
InvalidBuffer
;
so
->
curbuf
=
InvalidBuffer
;
so
->
giststate
=
(
GISTSTATE
*
)
palloc
(
sizeof
(
GISTSTATE
));
initGISTstate
(
so
->
giststate
,
scan
->
indexRelation
);
...
...
@@ -83,7 +74,6 @@ gistrescan(PG_FUNCTION_ARGS)
* Clear all the pointers.
*/
ItemPointerSetInvalid
(
&
so
->
curpos
);
ItemPointerSetInvalid
(
&
so
->
markpos
);
so
->
nPageData
=
so
->
curPageData
=
0
;
/* Update scan key, if a new one is given */
...
...
@@ -119,108 +109,14 @@ gistrescan(PG_FUNCTION_ARGS)
Datum
gistmarkpos
(
PG_FUNCTION_ARGS
)
{
IndexScanDesc
scan
=
(
IndexScanDesc
)
PG_GETARG_POINTER
(
0
);
GISTScanOpaque
so
;
GISTSearchStack
*
o
,
*
n
,
*
tmp
;
so
=
(
GISTScanOpaque
)
scan
->
opaque
;
so
->
markpos
=
so
->
curpos
;
if
(
so
->
flags
&
GS_CURBEFORE
)
so
->
flags
|=
GS_MRKBEFORE
;
else
so
->
flags
&=
~
GS_MRKBEFORE
;
o
=
NULL
;
n
=
so
->
stack
;
/* copy the parent stack from the current item data */
while
(
n
!=
NULL
)
{
tmp
=
(
GISTSearchStack
*
)
palloc
(
sizeof
(
GISTSearchStack
));
tmp
->
lsn
=
n
->
lsn
;
tmp
->
parentlsn
=
n
->
parentlsn
;
tmp
->
block
=
n
->
block
;
tmp
->
next
=
o
;
o
=
tmp
;
n
=
n
->
next
;
}
gistfreestack
(
so
->
markstk
);
so
->
markstk
=
o
;
/* Update markbuf: make sure to bump ref count on curbuf */
if
(
BufferIsValid
(
so
->
markbuf
))
{
ReleaseBuffer
(
so
->
markbuf
);
so
->
markbuf
=
InvalidBuffer
;
}
if
(
BufferIsValid
(
so
->
curbuf
))
{
IncrBufferRefCount
(
so
->
curbuf
);
so
->
markbuf
=
so
->
curbuf
;
}
so
->
markNPageData
=
so
->
nPageData
;
so
->
markCurPageData
=
so
->
curPageData
;
if
(
so
->
markNPageData
>
0
)
memcpy
(
so
->
markPageData
,
so
->
pageData
,
sizeof
(
ItemResult
)
*
so
->
markNPageData
);
elog
(
ERROR
,
"GiST does not support mark/restore"
);
PG_RETURN_VOID
();
}
Datum
gistrestrpos
(
PG_FUNCTION_ARGS
)
{
IndexScanDesc
scan
=
(
IndexScanDesc
)
PG_GETARG_POINTER
(
0
);
GISTScanOpaque
so
;
GISTSearchStack
*
o
,
*
n
,
*
tmp
;
so
=
(
GISTScanOpaque
)
scan
->
opaque
;
so
->
curpos
=
so
->
markpos
;
if
(
so
->
flags
&
GS_MRKBEFORE
)
so
->
flags
|=
GS_CURBEFORE
;
else
so
->
flags
&=
~
GS_CURBEFORE
;
o
=
NULL
;
n
=
so
->
markstk
;
/* copy the parent stack from the current item data */
while
(
n
!=
NULL
)
{
tmp
=
(
GISTSearchStack
*
)
palloc
(
sizeof
(
GISTSearchStack
));
tmp
->
lsn
=
n
->
lsn
;
tmp
->
parentlsn
=
n
->
parentlsn
;
tmp
->
block
=
n
->
block
;
tmp
->
next
=
o
;
o
=
tmp
;
n
=
n
->
next
;
}
gistfreestack
(
so
->
stack
);
so
->
stack
=
o
;
/* Update curbuf: be sure to bump ref count on markbuf */
if
(
BufferIsValid
(
so
->
curbuf
))
{
ReleaseBuffer
(
so
->
curbuf
);
so
->
curbuf
=
InvalidBuffer
;
}
if
(
BufferIsValid
(
so
->
markbuf
))
{
IncrBufferRefCount
(
so
->
markbuf
);
so
->
curbuf
=
so
->
markbuf
;
}
so
->
nPageData
=
so
->
markNPageData
;
so
->
curPageData
=
so
->
markNPageData
;
if
(
so
->
markNPageData
>
0
)
memcpy
(
so
->
pageData
,
so
->
markPageData
,
sizeof
(
ItemResult
)
*
so
->
markNPageData
);
elog
(
ERROR
,
"GiST does not support mark/restore"
);
PG_RETURN_VOID
();
}
...
...
@@ -235,14 +131,11 @@ gistendscan(PG_FUNCTION_ARGS)
if
(
so
!=
NULL
)
{
gistfreestack
(
so
->
stack
);
gistfreestack
(
so
->
markstk
);
if
(
so
->
giststate
!=
NULL
)
freeGISTstate
(
so
->
giststate
);
/* drop pins on buffers -- we aren't holding any locks */
if
(
BufferIsValid
(
so
->
curbuf
))
ReleaseBuffer
(
so
->
curbuf
);
if
(
BufferIsValid
(
so
->
markbuf
))
ReleaseBuffer
(
so
->
markbuf
);
MemoryContextDelete
(
so
->
tempCxt
);
pfree
(
scan
->
opaque
);
}
...
...
src/include/access/gin.h
浏览文件 @
77db9d9f
...
...
@@ -4,7 +4,7 @@
*
* Copyright (c) 2006-2008, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/include/access/gin.h,v 1.2
4 2008/07/13 21:50:04 tgl
Exp $
* $PostgreSQL: pgsql/src/include/access/gin.h,v 1.2
5 2008/10/20 13:39:44 teodor
Exp $
*--------------------------------------------------------------------------
*/
...
...
@@ -426,8 +426,6 @@ typedef struct GinScanOpaqueData
uint32
nkeys
;
bool
isVoidRes
;
/* true if ginstate.extractQueryFn guarantees
* that nothing will be found */
GinScanKey
markPos
;
}
GinScanOpaqueData
;
typedef
GinScanOpaqueData
*
GinScanOpaque
;
...
...
@@ -449,7 +447,6 @@ extern PGDLLIMPORT int GinFuzzySearchLimit;
extern
Datum
gingetbitmap
(
PG_FUNCTION_ARGS
);
extern
Datum
gingettuple
(
PG_FUNCTION_ARGS
);
extern
void
ginrestartentry
(
GinScanEntry
entry
);
/* ginvacuum.c */
extern
Datum
ginbulkdelete
(
PG_FUNCTION_ARGS
);
...
...
src/include/access/gist_private.h
浏览文件 @
77db9d9f
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.3
3 2008/10/17 17:02:21
teodor Exp $
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.3
4 2008/10/20 13:39:44
teodor Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -72,21 +72,15 @@ typedef struct GISTScanOpaqueData
{
GISTSearchStack
*
stack
;
GISTSearchStack
*
markstk
;
uint16
flags
;
bool
qual_ok
;
/* false if qual can never be satisfied */
GISTSTATE
*
giststate
;
MemoryContext
tempCxt
;
Buffer
curbuf
;
ItemPointerData
curpos
;
Buffer
markbuf
;
ItemPointerData
markpos
;
ItemResult
pageData
[
BLCKSZ
/
sizeof
(
IndexTupleData
)];
OffsetNumber
nPageData
;
OffsetNumber
curPageData
;
ItemResult
markPageData
[
BLCKSZ
/
sizeof
(
IndexTupleData
)];
OffsetNumber
markNPageData
;
OffsetNumber
markCurPageData
;
}
GISTScanOpaqueData
;
typedef
GISTScanOpaqueData
*
GISTScanOpaque
;
...
...
@@ -225,15 +219,6 @@ typedef struct
ItemPointerData
key
;
}
GISTInsertState
;
/*
* When we're doing a scan and updating a tree at the same time, the
* updates may affect the scan. We use the flags entry of the scan's
* opaque space to record our actual position in response to updates
* that we can't handle simply by adjusting pointers.
*/
#define GS_CURBEFORE ((uint16) (1 << 0))
#define GS_MRKBEFORE ((uint16) (1 << 1))
/* root page of a gist index */
#define GIST_ROOT_BLKNO 0
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录