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

Commitc015560

Browse files
committed
Don't access catalogs to validate GUCs when not connected to a DB.
Vignesh found this bug in the check function fordefault_table_access_method's check hook, but that was just copiedfrom older GUCs. Investigation by Michael and me then found the bug infurther places.When not connected to a database (e.g. in a walsender connection), wecannot perform (most) GUC checks that need database access. Even whenonly shared tables are needed, unless they'renailed (c.f. RelationCacheInitializePhase2()), they cannot be accessedwithout pg_class etc. being present.Fix by extending the existing IsTransactionState() checks to alsocheck for MyDatabaseOid.Reported-By: Vignesh C, Michael Paquier, Andres FreundAuthor: Vignesh C, Andres FreundDiscussion:https://postgr.es/m/CALDaNm1KXK9gbZfY-p_peRFm_XrBh1OwQO1Kk6Gig0c0fVZ2uw%40mail.gmail.comBackpatch: 9.4-
1 parent6a781c4 commitc015560

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

‎src/backend/commands/tablespace.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,10 +1064,11 @@ bool
10641064
check_default_tablespace(char**newval,void**extra,GucSourcesource)
10651065
{
10661066
/*
1067-
* If we aren't inside a transaction, we cannot do database access so
1068-
* cannot verify the name. Must accept the value on faith.
1067+
* If we aren't inside a transaction, or connected to a database, we
1068+
* cannot do the catalog accesses necessary to verify the name. Must
1069+
* accept the value on faith.
10691070
*/
1070-
if (IsTransactionState())
1071+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
10711072
{
10721073
if (**newval!='\0'&&
10731074
!OidIsValid(get_tablespace_oid(*newval, true)))
@@ -1175,11 +1176,12 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source)
11751176
}
11761177

11771178
/*
1178-
* If we aren't inside a transaction, we cannot do database access so
1179-
* cannot verify the individual names. Must accept the list on faith.
1179+
* If we aren't inside a transaction, or connected to a database, we
1180+
* cannot do the catalog accesses necessary to verify the name. Must
1181+
* accept the value on faith.
11801182
* Fortunately, there's then also no need to pass the data to fd.c.
11811183
*/
1182-
if (IsTransactionState())
1184+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
11831185
{
11841186
temp_tablespaces_extra*myextra;
11851187
Oid*tblSpcs;

‎src/backend/utils/cache/ts_cache.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include"catalog/pg_ts_parser.h"
3939
#include"catalog/pg_ts_template.h"
4040
#include"commands/defrem.h"
41+
#include"miscadmin.h"
4142
#include"tsearch/ts_cache.h"
4243
#include"utils/builtins.h"
4344
#include"utils/catcache.h"
@@ -591,10 +592,11 @@ bool
591592
check_TSCurrentConfig(char**newval,void**extra,GucSourcesource)
592593
{
593594
/*
594-
* If we aren't inside a transaction, we cannot do database access so
595-
* cannot verify the config name. Must accept it on faith.
595+
* If we aren't inside a transaction, or connected to a database, we
596+
* cannot do the catalog accesses necessary to verify the config name.
597+
* Must accept it on faith.
596598
*/
597-
if (IsTransactionState())
599+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
598600
{
599601
OidcfgId;
600602
HeapTupletuple;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp