On Tue, Mar 8, 2022 at 4:01 PM Kyotaro Horiguchi <horikyota....@gmail.com> wrote: > At Tue, 8 Mar 2022 10:28:46 +0900, Michael Paquier <mich...@paquier.xyz> > wrote in > > On Tue, Mar 08, 2022 at 10:06:50AM +0900, Kyotaro Horiguchi wrote: > > > At Tue, 8 Mar 2022 10:39:06 +1300, Thomas Munro <thomas.mu...@gmail.com> > > > wrote in > > >> Thanks, you're right. Test on a Win10 VM. Here's a new version. > > > > Looks fine to me. > > > > > FYI, on Windows11, pg_basebackup didn't work correctly without the > > > patch. So this looks like fixing an undiscovered bug as well. > > > > Well, that's not really a long-time bug but just a side effect of > > in-place tablespaces because we don't use them in many test cases > > yet, is it? > > No, we don't. So just FYI.
Ok, I pushed the fix for pg_basebackup. As for the complaint about pg_tablespace_location() failing, would it be better to return an empty string? That's what was passed in as LOCATION. Something like the attached.
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 4568749d23..1cd70a8eaa 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -15,6 +15,7 @@ #include "postgres.h" #include <sys/file.h> +#include <sys/stat.h> #include <dirent.h> #include <fcntl.h> #include <math.h> @@ -306,6 +307,24 @@ pg_tablespace_location(PG_FUNCTION_ARGS) */ snprintf(sourcepath, sizeof(sourcepath), "pg_tblspc/%u", tablespaceOid); + /* Return empty string for in-place tablespaces. */ +#ifdef WIN32 + if (!pgwin32_is_junction(sourcepath)) + PG_RETURN_TEXT_P(cstring_to_text("")); +#else + { + struct stat stat_buf; + + if (lstat(sourcepath, &stat_buf) < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", + sourcepath))); + if (!S_ISLNK(stat_buf.st_mode)) + PG_RETURN_TEXT_P(cstring_to_text("")); + } +#endif + rllen = readlink(sourcepath, targetpath, sizeof(targetpath)); if (rllen < 0) ereport(ERROR,