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

Commitcdf8b56

Browse files
committed
SPI_cursor_open failed to enforce that only read-only queries could be
executed in read_only mode. This could lead to various relatively-subtlefailures, such as an allegedly stable function returning non-stable results.Bug goes all the way back to the introduction of read-only mode in 8.0.Per report from Gaetano Mendola.
1 parente88a7ad commitcdf8b56

File tree

1 file changed

+25
-1
lines changed
  • src/backend/executor

1 file changed

+25
-1
lines changed

‎src/backend/executor/spi.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.172 2007/03/15 23:12:06 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.173 2007/03/17 03:15:38 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -964,6 +964,30 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan,
964964
else
965965
portal->cursorOptions |=CURSOR_OPT_NO_SCROLL;
966966

967+
/*
968+
* If told to be read-only, we'd better check for read-only queries.
969+
* This can't be done earlier because we need to look at the finished,
970+
* planned queries. (In particular, we don't want to do it between
971+
* RevalidateCachedPlan and PortalDefineQuery, because throwing an error
972+
* between those steps would result in leaking our plancache refcount.)
973+
*/
974+
if (read_only)
975+
{
976+
ListCell*lc;
977+
978+
foreach(lc,stmt_list)
979+
{
980+
Node*pstmt= (Node*)lfirst(lc);
981+
982+
if (!CommandIsReadOnly(pstmt))
983+
ereport(ERROR,
984+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
985+
/* translator: %s is a SQL statement name */
986+
errmsg("%s is not allowed in a non-volatile function",
987+
CreateCommandTag(pstmt))));
988+
}
989+
}
990+
967991
/*
968992
* Set up the snapshot to use.(PortalStart will do CopySnapshot, so we
969993
* skip that here.)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp