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

Commit475e9da

Browse files
committed
pg_basebackup: Fix cross-platform tablespace relocation.
Specifically, when pg_basebackup is invoked with -Tx=y, don't errorout if x could plausibly be an absolute path either on Windows or onnon-Windows systems. We don't know whether the remote system isrunning the same OS as the local system, so it's not appropriate toassume that our local rule about absolute pathnames is the same asthe rule on the remote system.Patch by me, reviewed by Tom Lane, Andrew Dunstan, andDavinder Singh.Discussion:http://postgr.es/m/CA+TgmoY+jC3YiskomvYKDPK3FbrmsDU7_8+wMHt02HOdJeRb0g@mail.gmail.com
1 parentf7f82cf commit475e9da

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

‎src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,22 @@ tablespace_list_append(const char *arg)
271271
}
272272

273273
/*
274-
* This check isn't absolutely necessary. But all tablespaces are created
275-
* with absolute directories, so specifying a non-absolute path here would
276-
* just never match, possibly confusing users. It's also good to be
277-
* consistent with the new_dir check.
274+
* All tablespaces are created with absolute directories, so specifying a
275+
* non-absolute path here would just never match, possibly confusing users.
276+
* Since we don't know whether the remote side is Windows or not, and it
277+
* might be different than the local side, permit any path that could be
278+
* absolute under either set of rules.
279+
*
280+
* (There is little practical risk of confusion here, because someone
281+
* running entirely on Linux isn't likely to have a relative path that
282+
* begins with a backslash or something that looks like a drive
283+
* specification. If they do, and they also incorrectly believe that
284+
* a relative path is acceptable here, we'll silently fail to warn them
285+
* of their mistake, and the -T option will just not get applied, same
286+
* as if they'd specified -T for a nonexistent tablespace.)
278287
*/
279-
if (!is_absolute_path(cell->old_dir))
288+
if (!is_nonwindows_absolute_path(cell->old_dir)&&
289+
!is_windows_absolute_path(cell->old_dir))
280290
{
281291
pg_log_error("old directory is not an absolute path in tablespace mapping: %s",
282292
cell->old_dir);

‎src/include/port.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,32 @@ extern void get_parent_directory(char *path);
7575
externchar**pgfnames(constchar*path);
7676
externvoidpgfnames_cleanup(char**filenames);
7777

78-
/*
79-
*is_absolute_path
80-
*
81-
*By making this a macro we avoid needing to include path.c in libpq.
82-
*/
83-
#ifndefWIN32
84-
#defineIS_DIR_SEP(ch)((ch) == '/')
85-
86-
#defineis_absolute_path(filename) \
78+
#defineIS_NONWINDOWS_DIR_SEP(ch)((ch) == '/')
79+
#defineis_nonwindows_absolute_path(filename) \
8780
( \
88-
IS_DIR_SEP((filename)[0]) \
81+
IS_NONWINDOWS_DIR_SEP((filename)[0]) \
8982
)
90-
#else
91-
#defineIS_DIR_SEP(ch)((ch) == '/' || (ch) == '\\')
9283

84+
#defineIS_WINDOWS_DIR_SEP(ch)((ch) == '/' || (ch) == '\\')
9385
/* See path_is_relative_and_below_cwd() for how we handle 'E:abc'. */
94-
#defineis_absolute_path(filename) \
86+
#defineis_windows_absolute_path(filename) \
9587
( \
96-
IS_DIR_SEP((filename)[0]) || \
88+
IS_WINDOWS_DIR_SEP((filename)[0]) || \
9789
(isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \
98-
IS_DIR_SEP((filename)[2])) \
90+
IS_WINDOWS_DIR_SEP((filename)[2])) \
9991
)
92+
93+
/*
94+
*is_absolute_path and IS_DIR_SEP
95+
*
96+
*By using macros here we avoid needing to include path.c in libpq.
97+
*/
98+
#ifndefWIN32
99+
#defineIS_DIR_SEP(ch) IS_NONWINDOWS_DIR_SEP(ch)
100+
#defineis_absolute_path(filename) is_nonwindows_absolute_path(filename)
101+
#else
102+
#defineIS_DIR_SEP(ch) IS_WINDOWS_DIR_SEP(ch)
103+
#defineis_absolute_path(filename) is_windows_absolute_path(filename)
100104
#endif
101105

102106
/* Portable locale initialization (in exec.c) */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp