Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
3751b495
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,发现更多精彩内容 >>
提交
3751b495
编写于
8月 27, 1997
作者:
V
Vadim B. Mikheev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Number of tuples inserted/affected by INSERT/UPDATE/DELETE...
上级
40ac5a69
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
116 addition
and
85 deletion
+116
-85
src/backend/executor/execMain.c
src/backend/executor/execMain.c
+21
-20
src/backend/tcop/dest.c
src/backend/tcop/dest.c
+21
-49
src/backend/tcop/pquery.c
src/backend/tcop/pquery.c
+4
-1
src/include/nodes/execnodes.h
src/include/nodes/execnodes.h
+3
-1
src/include/tcop/dest.h
src/include/tcop/dest.h
+2
-2
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-exec.c
+63
-11
src/interfaces/libpq/libpq-fe.h
src/interfaces/libpq/libpq-fe.h
+2
-1
未找到文件。
src/backend/executor/execMain.c
浏览文件 @
3751b495
...
...
@@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.
19 1997/08/22 14:28:20
vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.
20 1997/08/27 09:02:24
vadim Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -65,7 +65,7 @@ static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan,
int
numberTuples
,
ScanDirection
direction
,
void
(
*
printfunc
)());
static
void
ExecRetrieve
(
TupleTableSlot
*
slot
,
void
(
*
printfunc
)(),
Relation
intoRelationDesc
);
EState
*
estate
);
static
void
ExecAppend
(
TupleTableSlot
*
slot
,
ItemPointer
tupleid
,
EState
*
estate
);
static
void
ExecDelete
(
TupleTableSlot
*
slot
,
ItemPointer
tupleid
,
...
...
@@ -171,6 +171,8 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count)
plan
=
queryDesc
->
plantree
;
dest
=
queryDesc
->
dest
;
destination
=
(
void
(
*
)())
DestToFunction
(
dest
);
estate
->
es_processed
=
0
;
estate
->
es_lastoid
=
InvalidOid
;
#if 0
/*
...
...
@@ -665,7 +667,6 @@ ExecutePlan(EState *estate,
ScanDirection
direction
,
void
(
*
printfunc
)())
{
Relation
intoRelationDesc
;
JunkFilter
*
junkfilter
;
TupleTableSlot
*
slot
;
...
...
@@ -674,12 +675,6 @@ ExecutePlan(EState *estate,
int
current_tuple_count
;
TupleTableSlot
*
result
;
/* ----------------
* get information
* ----------------
*/
intoRelationDesc
=
estate
->
es_into_relation_descriptor
;
/* ----------------
* initialize local variables
* ----------------
...
...
@@ -780,9 +775,9 @@ ExecutePlan(EState *estate,
switch
(
operation
)
{
case
CMD_SELECT
:
ExecRetrieve
(
slot
,
/* slot containing tuple */
printfunc
,
/* print function */
intoRelationDesc
);
/* "into" relation
*/
ExecRetrieve
(
slot
,
/* slot containing tuple */
printfunc
,
/* print function */
estate
);
/*
*/
result
=
slot
;
break
;
...
...
@@ -853,7 +848,7 @@ ExecutePlan(EState *estate,
static
void
ExecRetrieve
(
TupleTableSlot
*
slot
,
void
(
*
printfunc
)(),
Relation
intoRelationDesc
)
EState
*
estate
)
{
HeapTuple
tuple
;
TupleDesc
attrtype
;
...
...
@@ -869,9 +864,10 @@ ExecRetrieve(TupleTableSlot *slot,
* insert the tuple into the "into relation"
* ----------------
*/
if
(
intoRelationDesc
!=
NULL
)
{
heap_insert
(
intoRelationDesc
,
tuple
);
IncrAppended
();
if
(
estate
->
es_into_relation_descriptor
!=
NULL
)
{
heap_insert
(
estate
->
es_into_relation_descriptor
,
tuple
);
IncrAppended
();
}
/* ----------------
...
...
@@ -880,6 +876,7 @@ ExecRetrieve(TupleTableSlot *slot,
*/
(
*
printfunc
)(
tuple
,
attrtype
);
IncrRetrieved
();
(
estate
->
es_processed
)
++
;
}
/* ----------------------------------------------------------------
...
...
@@ -947,7 +944,6 @@ ExecAppend(TupleTableSlot *slot,
newId
=
heap_insert
(
resultRelationDesc
,
/* relation desc */
tuple
);
/* heap tuple */
IncrAppended
();
UpdateAppendOid
(
newId
);
/* ----------------
* process indices
...
...
@@ -961,6 +957,8 @@ ExecAppend(TupleTableSlot *slot,
if
(
numIndices
>
0
)
{
ExecInsertIndexTuples
(
slot
,
&
(
tuple
->
t_ctid
),
estate
,
false
);
}
(
estate
->
es_processed
)
++
;
estate
->
es_lastoid
=
newId
;
}
/* ----------------------------------------------------------------
...
...
@@ -989,10 +987,12 @@ ExecDelete(TupleTableSlot *slot,
* delete the tuple
* ----------------
*/
heap_delete
(
resultRelationDesc
,
/* relation desc */
tupleid
);
/* item pointer to tuple */
if
(
heap_delete
(
resultRelationDesc
,
/* relation desc */
tupleid
)
)
/* item pointer to tuple */
return
;
IncrDeleted
();
(
estate
->
es_processed
)
++
;
/* ----------------
* Note: Normally one would think that we have to
...
...
@@ -1094,6 +1094,7 @@ ExecReplace(TupleTableSlot *slot,
}
IncrReplaced
();
(
estate
->
es_processed
)
++
;
/* ----------------
* Note: instead of having to update the old index tuples
...
...
src/backend/tcop/dest.c
浏览文件 @
3751b495
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.
7 1997/08/19 21:34:02 momjian
Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.
8 1997/08/27 09:03:14 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -43,8 +43,7 @@
#include "commands/async.h"
static
Oid
GetAppendOid
(
void
);
static
void
ResetAppendOid
(
void
);
static
char
CommandInfo
[
32
]
=
{
0
};
/* ----------------
* output functions
...
...
@@ -87,8 +86,6 @@ void (*DestToFunction(CommandDest dest))(HeapTuple, TupleDesc)
return
donothing
;
}
#define IS_INSERT_TAG(tag) (*tag == 'I' && *(tag+1) == 'N')
/* ----------------
* EndCommand - tell destination that no more tuples will arrive
* ----------------
...
...
@@ -106,14 +103,8 @@ EndCommand(char *commandTag, CommandDest dest)
* ----------------
*/
pq_putnchar
(
"C"
,
1
);
/* pq_putint(0, 4); */
if
(
IS_INSERT_TAG
(
commandTag
))
{
sprintf
(
buf
,
"%s %d"
,
commandTag
,
GetAppendOid
());
pq_putstr
(
buf
);
}
else
pq_putstr
(
commandTag
);
sprintf
(
buf
,
"%s%s"
,
commandTag
,
CommandInfo
);
pq_putstr
(
buf
);
pq_flush
();
break
;
...
...
@@ -239,7 +230,7 @@ BeginCommand(char *pname,
* because nothing needs to be sent to the fe.
* ----------------
*/
ResetAppendOid
()
;
CommandInfo
[
0
]
=
0
;
if
(
isIntoPortal
)
return
;
...
...
@@ -318,41 +309,22 @@ BeginCommand(char *pname,
}
}
static
Oid
AppendOid
;
static
void
ResetAppendOid
(
void
)
{
AppendOid
=
InvalidOid
;
}
#define MULTI_TUPLE_APPEND -1
void
UpdateAppendOid
(
Oid
newoid
)
{
/*
* First update after AppendOid was reset (at command beginning).
*/
if
(
AppendOid
==
InvalidOid
)
AppendOid
=
newoid
;
/*
* Already detected a multiple tuple append, return a void oid ;)
*/
else
if
(
AppendOid
==
MULTI_TUPLE_APPEND
)
return
;
/*
* Oid has been assigned once before, tag this as a multiple tuple
* append.
*/
else
AppendOid
=
MULTI_TUPLE_APPEND
;
}
static
Oid
GetAppendOid
(
void
)
UpdateCommandInfo
(
int
operation
,
Oid
lastoid
,
uint32
tuples
)
{
if
(
AppendOid
==
MULTI_TUPLE_APPEND
)
return
InvalidOid
;
return
AppendOid
;
switch
(
operation
)
{
case
CMD_INSERT
:
if
(
tuples
>
1
)
lastoid
=
InvalidOid
;
sprintf
(
CommandInfo
,
" %u %u"
,
lastoid
,
tuples
);
break
;
case
CMD_DELETE
:
case
CMD_UPDATE
:
sprintf
(
CommandInfo
,
" %u"
,
tuples
);
break
;
default
:
CommandInfo
[
0
]
=
0
;
}
return
;
}
src/backend/tcop/pquery.c
浏览文件 @
3751b495
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.
6 1997/08/19 21:34:07 momjian
Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.
7 1997/08/27 09:03:15 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -322,6 +322,9 @@ ProcessQueryDesc(QueryDesc *queryDesc)
*/
ExecutorRun
(
queryDesc
,
state
,
EXEC_RUN
,
0
);
/* save infos for EndCommand */
UpdateCommandInfo
(
operation
,
state
->
es_lastoid
,
state
->
es_processed
);
/* ----------------
* now, we close down all the scans and free allocated resources...
* with ExecutorEnd()
...
...
src/include/nodes/execnodes.h
浏览文件 @
3751b495
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: execnodes.h,v 1.
7 1997/08/06 03:42:02 momjian
Exp $
* $Id: execnodes.h,v 1.
8 1997/08/27 09:04:52 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -197,6 +197,8 @@ typedef struct EState {
TupleTable
es_tupleTable
;
JunkFilter
*
es_junkFilter
;
int
*
es_refcount
;
uint32
es_processed
;
/* # of tuples processed */
Oid
es_lastoid
;
/* last oid processed (by INSERT) */
}
EState
;
/* ----------------
...
...
src/include/tcop/dest.h
浏览文件 @
3751b495
...
...
@@ -26,7 +26,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: dest.h,v 1.
6 1997/08/19 21:40:06 momjian
Exp $
* $Id: dest.h,v 1.
7 1997/08/27 09:05:09 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -69,6 +69,6 @@ extern void NullCommand(CommandDest dest);
extern
void
BeginCommand
(
char
*
pname
,
int
operation
,
TupleDesc
attinfo
,
bool
isIntoRel
,
bool
isIntoPortal
,
char
*
tag
,
CommandDest
dest
);
extern
void
Update
AppendOid
(
Oid
newoid
);
extern
void
Update
CommandInfo
(
int
operation
,
Oid
lastoid
,
uint32
tuples
);
#endif
/* DEST_H */
src/interfaces/libpq/fe-exec.c
浏览文件 @
3751b495
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.3
3 1997/07/12 20:31:47 momjian
Exp $
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.3
4 1997/08/27 09:05:23 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -1532,18 +1532,70 @@ char* PQcmdStatus(PGresult *res) {
if the last command was an INSERT, return the oid string
if not, return ""
*/
const
char
*
PQoidStatus
(
PGresult
*
res
)
{
if
(
!
res
)
{
fprintf
(
stderr
,
"PQoidStatus() -- pointer to PQresult is null"
);
return
NULL
;
}
static
char
oidStatus
[
32
]
=
{
0
};
const
char
*
PQoidStatus
(
PGresult
*
res
)
{
if
(
!
res
)
{
fprintf
(
stderr
,
"PQoidStatus () -- pointer to PQresult is null"
);
return
NULL
;
}
if
(
!
res
->
cmdStatus
)
return
""
;
oidStatus
[
0
]
=
0
;
if
(
!
res
->
cmdStatus
)
return
oidStatus
;
if
(
strncmp
(
res
->
cmdStatus
,
"INSERT"
,
6
)
==
0
)
{
char
*
p
=
res
->
cmdStatus
+
7
;
char
*
e
;
for
(
e
=
p
;
*
e
!=
' '
&&
*
e
;
)
e
++
;
sprintf
(
oidStatus
,
"%.*s"
,
e
-
p
,
p
);
}
return
oidStatus
;
}
if
(
strncmp
(
res
->
cmdStatus
,
"INSERT"
,
6
)
==
0
)
{
return
res
->
cmdStatus
+
7
;
}
else
/*
PQcmdTuples -
if the last command was an INSERT/UPDATE/DELETE, return number
of inserted/affected tuples, if not, return ""
*/
const
char
*
PQcmdTuples
(
PGresult
*
res
)
{
if
(
!
res
)
{
fprintf
(
stderr
,
"PQcmdTuples () -- pointer to PQresult is null"
);
return
NULL
;
}
if
(
!
res
->
cmdStatus
)
return
""
;
if
(
strncmp
(
res
->
cmdStatus
,
"INSERT"
,
6
)
==
0
||
strncmp
(
res
->
cmdStatus
,
"DELETE"
,
6
)
==
0
||
strncmp
(
res
->
cmdStatus
,
"UPDATE"
,
6
)
==
0
)
{
char
*
p
=
res
->
cmdStatus
+
6
;
if
(
*
p
==
0
)
{
fprintf
(
stderr
,
"PQcmdTuples (%s) -- short input from server"
,
res
->
cmdStatus
);
return
NULL
;
}
p
++
;
if
(
*
(
res
->
cmdStatus
)
!=
'I'
)
/* UPDATE/DELETE */
return
(
p
);
while
(
*
p
!=
' '
&&
*
p
)
p
++
;
/* INSERT: skip oid */
if
(
*
p
==
0
)
{
fprintf
(
stderr
,
"PQcmdTuples (INSERT) -- there's no # of tuples"
);
return
NULL
;
}
p
++
;
return
(
p
);
}
return
""
;
}
...
...
src/interfaces/libpq/libpq-fe.h
浏览文件 @
3751b495
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: libpq-fe.h,v 1.
19 1997/05/09 03:28:54 scrappy
Exp $
* $Id: libpq-fe.h,v 1.
20 1997/08/27 09:05:24 vadim
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -225,6 +225,7 @@ extern Oid PQftype(PGresult *res, int field_num);
extern
short
PQfsize
(
PGresult
*
res
,
int
field_num
);
extern
char
*
PQcmdStatus
(
PGresult
*
res
);
extern
const
char
*
PQoidStatus
(
PGresult
*
res
);
extern
const
char
*
PQcmdTuples
(
PGresult
*
res
);
extern
char
*
PQgetvalue
(
PGresult
*
res
,
int
tup_num
,
int
field_num
);
extern
int
PQgetlength
(
PGresult
*
res
,
int
tup_num
,
int
field_num
);
extern
int
PQgetisnull
(
PGresult
*
res
,
int
tup_num
,
int
field_num
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录