Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7ae1815

Browse files
committed
Return the number of rows processed when COPY is executed through SPI.
You can now get the number of rows processed by a COPY statement in aPL/pgSQL function with "GET DIAGNOSTICS x = ROW_COUNT".Pavel Stehule, reviewed by Amit Kapila, with some editing by me.
1 parentbc1229c commit7ae1815

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

‎doc/src/sgml/spi.sgml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,10 @@ SPI_execute("INSERT INTO foo SELECT * FROM bar", false, 5);
377377
global pointer <literal>SPITupleTable *SPI_tuptable</literal> to
378378
access the result rows. Some utility commands (such as
379379
<command>EXPLAIN</>) also return row sets, and <literal>SPI_tuptable</>
380-
will contain the result in these cases too.
380+
will contain the result in these cases too. Some utility commands
381+
(<command>COPY</>, <command>CREATE TABLE AS</>) don't return a row set, so
382+
<literal>SPI_tuptable</> is NULL, but they still return the number of
383+
rows processed in <varname>SPI_processed</>.
381384
</para>
382385

383386
<para>

‎src/backend/executor/spi.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,25 +1922,31 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
19221922
_SPI_current->processed=_SPI_current->tuptable->alloced-
19231923
_SPI_current->tuptable->free;
19241924

1925+
res=SPI_OK_UTILITY;
1926+
19251927
/*
1926-
* CREATE TABLE AS is a messy special case for historical
1927-
* reasons. We must set _SPI_current->processed even though
1928-
* the tuples weren't returned to the caller, and we must
1929-
* return a special result code if the statement was spelled
1930-
* SELECT INTO.
1928+
* Some utility statements return a row count, even though the
1929+
* tuples are not returned to the caller.
19311930
*/
19321931
if (IsA(stmt,CreateTableAsStmt))
19331932
{
19341933
Assert(strncmp(completionTag,"SELECT ",7)==0);
19351934
_SPI_current->processed=strtoul(completionTag+7,
19361935
NULL,10);
1936+
1937+
/*
1938+
* For historical reasons, if CREATE TABLE AS was spelled
1939+
* as SELECT INTO, return a special return code.
1940+
*/
19371941
if (((CreateTableAsStmt*)stmt)->is_select_into)
19381942
res=SPI_OK_SELINTO;
1939-
else
1940-
res=SPI_OK_UTILITY;
19411943
}
1942-
else
1943-
res=SPI_OK_UTILITY;
1944+
elseif (IsA(stmt,CopyStmt))
1945+
{
1946+
Assert(strncmp(completionTag,"COPY ",5)==0);
1947+
_SPI_current->processed=strtoul(completionTag+5,
1948+
NULL,10);
1949+
}
19441950
}
19451951

19461952
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp