Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
81f6db48
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,发现更多精彩内容 >>
提交
81f6db48
编写于
2月 19, 2003
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Allow PQcmdTuples to return row counts for MOVE and FETCH.
Neil Conway
上级
1eb9fd49
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
90 addition
and
69 deletion
+90
-69
doc/src/sgml/libpq.sgml
doc/src/sgml/libpq.sgml
+38
-32
doc/src/sgml/protocol.sgml
doc/src/sgml/protocol.sgml
+15
-1
src/backend/tcop/utility.c
src/backend/tcop/utility.c
+2
-2
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-exec.c
+35
-34
未找到文件。
doc/src/sgml/libpq.sgml
浏览文件 @
81f6db48
<!--
$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.11
0 2003/02/14 02:21:25
momjian Exp $
$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.11
1 2003/02/19 03:59:02
momjian Exp $
-->
<chapter id="libpq">
...
...
@@ -702,12 +702,11 @@ char *PQerrorMessage(const PGconn* conn);
int PQbackendPID(const PGconn *conn);
</synopsis>
The backend <acronym>PID</acronym> is useful for debugging
purposes and for comparison
to NOTIFY messages (which include the <acronym>PID</acronym> of
the notifying backend).
Note that the <acronym>PID</acronym> belongs to a process
executing on the database
server host, not the local host!
purposes and for comparison to <command>NOTIFY</command>
messages (which include the <acronym>PID</acronym> of the
notifying backend). Note that the <acronym>PID</acronym>
belongs to a process executing on the database server host, not
the local host!
</para>
</listitem>
...
...
@@ -818,13 +817,14 @@ ExecStatusType PQresultStatus(const PGresult *res)
</listitem>
</itemizedlist>
If the result status is <literal>PGRES_TUPLES_OK</literal>, then the
routines described below can be used to retrieve the
rows returned by the query. Note that a SELECT command that
happens to retrieve zero rows still shows <literal>PGRES_TUPLES_OK</literal>.
<literal>PGRES_COMMAND_OK</literal> is for commands that can never return rows
(INSERT, UPDATE, etc.). A response of <literal>PGRES_EMPTY_QUERY</literal> often
exposes a bug in the client software.
If the result status is <literal>PGRES_TUPLES_OK</literal>, then the
routines described below can be used to retrieve the rows returned by
the query. Note that a <command>SELECT</command> command that happens
to retrieve zero rows still shows <literal>PGRES_TUPLES_OK</literal>.
<literal>PGRES_COMMAND_OK</literal> is for commands that can never
return rows (<command>INSERT</command>, <command>UPDATE</command>,
etc.). A response of <literal>PGRES_EMPTY_QUERY</literal> often
indicates a bug in the client software.
</para>
</listitem>
...
...
@@ -1243,36 +1243,41 @@ char * PQcmdStatus(PGresult *res);
char * PQcmdTuples(PGresult *res);
</synopsis>
If the <acronym>SQL</acronym> command that generated the
<structname>PGresult</structname> was INSERT, UPDATE or DELETE, this returns a
string containing the number of rows affected. If the
command was anything else, it returns the empty string.
<structname>PGresult</structname> was <command>INSERT</command>,
<command>UPDATE</command>, <command>DELETE</command>,
<command>MOVE</command>, or <command>FETCH</command> this
returns a string containing the number of rows affected. If the
command was anything else, it returns the empty string.
</para>
</listitem>
<listitem>
<para>
<function>PQoidValue</function>
Returns the object ID of the inserted row, if the
<acronym>SQL</acronym> command was an INSERT
that inserted exactly one row into a table that has OIDs.
Otherwise, returns <literal>InvalidOid</literal>.
Returns the object ID of the inserted row, if the
<acronym>SQL</acronym> command was an <command>INSERT</command>
that inserted exactly one row into a table that has OIDs.
Otherwise, returns <literal>InvalidOid</literal>.
<synopsis>
Oid PQoidValue(const PGresult *res);
</synopsis>
The type <type>Oid</type> and the constant <literal>InvalidOid</literal>
will be defined if you include the <application>libpq</application>
header file. They will both be some integer type.
The type <type>Oid</type> and the constant
<literal>InvalidOid</literal> will be defined if you include the
<application>libpq</application> header file. They will both be
some integer type.
</para>
</listitem>
<listitem>
<para>
<function>PQoidStatus</function>
Returns a string with the object ID of the inserted row, if the
<acronym>SQL</acronym> command was an INSERT.
(The string will be <literal>0</> if the INSERT did not insert exactly one
row, or if the target table does not have OIDs.) If the command
was not an INSERT, returns an empty string.
Returns a string with the object ID
of the inserted row, if the <acronym>SQL</acronym> command
was an <command>INSERT</command>. (The string will be
<literal>0</> if the <command>INSERT</command> did not
insert exactly one row, or if the target table does not have
OIDs.) If the command was not an <command>INSERT</command>,
returns an empty string.
<synopsis>
char * PQoidStatus(const PGresult *res);
</synopsis>
...
...
@@ -1530,7 +1535,8 @@ When the main loop detects input ready, it should call
<function>PQconsumeInput</function> to read the input. It can then call
<function>PQisBusy</function>, followed by <function>PQgetResult</function>
if <function>PQisBusy</function> returns false (0). It can also call
<function>PQnotifies</function> to detect NOTIFY messages (see <xref linkend="libpq-notify">).
<function>PQnotifies</function> to detect <command>NOTIFY</command>
messages (see <xref linkend="libpq-notify">).
</para>
<para>
...
...
@@ -1700,13 +1706,13 @@ of asynchronous notification.
<function>PQnotifies()</function> does not actually read backend data; it just
returns messages previously absorbed by another <application>libpq</application>
function. In prior releases of <application>libpq</application>, the only way
to ensure timely receipt of
NOTIFY
messages was to constantly submit queries,
to ensure timely receipt of
<command>NOTIFY</command>
messages was to constantly submit queries,
even empty ones, and then check <function>PQnotifies()</function> after each
<function>PQexec()</function>. While this still works, it is
deprecated as a waste of processing power.
</para>
<para>
A better way to check for
NOTIFY
A better way to check for
<command>NOTIFY</command>
messages when you have no useful queries to make is to call
<function>PQconsumeInput()</function>, then check
<function>PQnotifies()</function>.
...
...
doc/src/sgml/protocol.sgml
浏览文件 @
81f6db48
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/protocol.sgml,v 1.2
4 2002/03/22 19:20:21 petere
Exp $ -->
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/protocol.sgml,v 1.2
5 2003/02/19 03:59:02 momjian
Exp $ -->
<chapter id="protocol">
<title>Frontend/Backend Protocol</title>
...
...
@@ -1335,6 +1335,20 @@ CompletedResponse (B)
<literal>UPDATE <Replaceable>rows</Replaceable></literal> where
<Replaceable>rows</Replaceable> is the number of rows updated.
</Para>
<para>
For a <command>MOVE</command> command, the tag is
<literal>MOVE <replaceable>rows</replaceable></literal> where
<replaceable>rows</replaceable> is the number of rows the
cursor's position has been changed by.
</para>
<para>
For a <command>FETCH</command> command, the tag is
<literal>FETCH <replaceable>rows</replaceable></literal> where
<replaceable>rows</replaceable> is the number of rows that
have been retrieved from the cursor.
</para>
</ListItem>
</VarListEntry>
</VariableList>
...
...
src/backend/tcop/utility.c
浏览文件 @
81f6db48
...
...
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.19
2 2003/02/13 05:20:01
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.19
3 2003/02/19 03:59:02
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -254,7 +254,7 @@ ProcessUtility(Node *parsetree,
switch
(
nodeTag
(
parsetree
))
{
/*
* ********************
************ transactions ************
********************
* ********************
transactions
********************
*/
case
T_TransactionStmt
:
{
...
...
src/interfaces/libpq/fe-exec.c
浏览文件 @
81f6db48
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.12
4 2003/01/07 22:23:17 tgl
Exp $
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.12
5 2003/02/19 03:59:02 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -2272,7 +2272,7 @@ PQoidStatus(const PGresult *res)
/*
PQoidValue -
a perhaps preferable form of the above which just returns
a perhaps preferable form of the above which just returns
an Oid type
*/
Oid
...
...
@@ -2300,53 +2300,54 @@ PQoidValue(const PGresult *res)
/*
PQcmdTuples -
if the last command was an INSERT/UPDATE/DELETE, return number
of inserted/affected tuples, if not, return ""
If the last command was an INSERT/UPDATE/DELETE/MOVE/FETCH, return a
string containing the number of inserted/affected tuples. If not,
return "".
XXX: this should probably return an int
*/
char
*
PQcmdTuples
(
PGresult
*
res
)
{
char
noticeBuf
[
128
];
char
*
p
;
if
(
!
res
)
return
""
;
if
(
strncmp
(
res
->
cmdStatus
,
"INSERT"
,
6
)
==
0
||
strncmp
(
res
->
cmdStatus
,
"DELETE"
,
6
)
==
0
||
strncmp
(
res
->
cmdStatus
,
"UPDATE"
,
6
)
==
0
)
if
(
strncmp
(
res
->
cmdStatus
,
"INSERT "
,
7
)
==
0
)
{
char
*
p
=
res
->
cmdStatus
+
6
;
if
(
*
p
==
0
)
{
if
(
res
->
noticeHook
)
{
snprintf
(
noticeBuf
,
sizeof
(
noticeBuf
),
libpq_gettext
(
"could not interpret result from server: %s
\n
"
),
res
->
cmdStatus
);
DONOTICE
(
res
,
noticeBuf
);
}
return
""
;
}
p
=
res
->
cmdStatus
+
6
;
p
++
;
if
(
*
(
res
->
cmdStatus
)
!=
'I'
)
/* UPDATE/DELETE */
return
p
;
/* INSERT: skip oid */
while
(
*
p
!=
' '
&&
*
p
)
p
++
;
/* INSERT: skip oid */
if
(
*
p
==
0
)
p
++
;
}
else
if
(
strncmp
(
res
->
cmdStatus
,
"DELETE "
,
7
)
==
0
||
strncmp
(
res
->
cmdStatus
,
"UPDATE "
,
7
)
==
0
)
p
=
res
->
cmdStatus
+
6
;
else
if
(
strncmp
(
res
->
cmdStatus
,
"FETCH "
,
6
)
==
0
)
p
=
res
->
cmdStatus
+
5
;
else
if
(
strncmp
(
res
->
cmdStatus
,
"MOVE "
,
5
)
==
0
)
p
=
res
->
cmdStatus
+
4
;
else
return
""
;
p
++
;
if
(
*
p
==
0
)
{
if
(
res
->
noticeHook
)
{
if
(
res
->
noticeHook
)
{
snprintf
(
noticeBuf
,
sizeof
(
noticeBuf
),
libpq_gettext
(
"no row count available
\n
"
));
DONOTICE
(
res
,
noticeBuf
);
}
return
""
;
snprintf
(
noticeBuf
,
sizeof
(
noticeBuf
),
libpq_gettext
(
"could not interpret result from server: %s
\n
"
),
res
->
cmdStatus
);
DONOTICE
(
res
,
noticeBuf
);
}
p
++
;
return
p
;
return
""
;
}
return
""
;
return
p
;
}
/*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录