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

Commitfff2a7d

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 parent92a8864 commitfff2a7d

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

‎src/backend/access/table/tableamapi.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include"catalog/pg_am.h"
1919
#include"catalog/pg_proc.h"
2020
#include"commands/defrem.h"
21+
#include"miscadmin.h"
2122
#include"utils/fmgroids.h"
2223
#include"utils/memutils.h"
2324
#include"utils/syscache.h"
@@ -119,10 +120,11 @@ check_default_table_access_method(char **newval, void **extra, GucSource source)
119120
}
120121

121122
/*
122-
* If we aren't inside a transaction, we cannot do database access so
123-
* cannot verify the name. Must accept the value on faith.
123+
* If we aren't inside a transaction, or not connected to a database, we
124+
* cannot do the catalog access necessary to verify the method. Must
125+
* accept the value on faith.
124126
*/
125-
if (IsTransactionState())
127+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
126128
{
127129
if (!OidIsValid(get_table_am_oid(*newval, true)))
128130
{

‎src/backend/commands/tablespace.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,10 +1069,11 @@ bool
10691069
check_default_tablespace(char**newval,void**extra,GucSourcesource)
10701070
{
10711071
/*
1072-
* If we aren't inside a transaction, we cannot do database access so
1073-
* cannot verify the name. Must accept the value on faith.
1072+
* If we aren't inside a transaction, or connected to a database, we
1073+
* cannot do the catalog accesses necessary to verify the name. Must
1074+
* accept the value on faith.
10741075
*/
1075-
if (IsTransactionState())
1076+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
10761077
{
10771078
if (**newval!='\0'&&
10781079
!OidIsValid(get_tablespace_oid(*newval, true)))
@@ -1190,11 +1191,12 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source)
11901191
}
11911192

11921193
/*
1193-
* If we aren't inside a transaction, we cannot do database access so
1194-
* cannot verify the individual names. Must accept the list on faith.
1194+
* If we aren't inside a transaction, or connected to a database, we
1195+
* cannot do the catalog accesses necessary to verify the name. Must
1196+
* accept the value on faith.
11951197
* Fortunately, there's then also no need to pass the data to fd.c.
11961198
*/
1197-
if (IsTransactionState())
1199+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
11981200
{
11991201
temp_tablespaces_extra*myextra;
12001202
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"
@@ -590,10 +591,11 @@ bool
590591
check_TSCurrentConfig(char**newval,void**extra,GucSourcesource)
591592
{
592593
/*
593-
* If we aren't inside a transaction, we cannot do database access so
594-
* cannot verify the config name. Must accept it on faith.
594+
* If we aren't inside a transaction, or connected to a database, we
595+
* cannot do the catalog accesses necessary to verify the config name.
596+
* Must accept it on faith.
595597
*/
596-
if (IsTransactionState())
598+
if (IsTransactionState()&&MyDatabaseId!=InvalidOid)
597599
{
598600
OidcfgId;
599601
HeapTupletuple;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp