public inbox for [email protected]help / color / mirror / Atom feed
[PATCH 2/3] Improve pg_ctl postmaster process check on Windows 6+ messages / 3 participants [nested] [flat]
* [PATCH 2/3] Improve pg_ctl postmaster process check on Windows @ 2023-09-20 04:16 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 6+ messages in thread From: Kyotaro Horiguchi @ 2023-09-20 04:16 UTC (permalink / raw) Currently pg_ctl on Windows does not verify that it actually executed a postmaster process due to lack of process ID knowledge. This can lead to false positives in cases where another pg_ctl instance starts a different server simultaneously. This patch adds the capability to identify the process ID of the launched postmaster on Windows, similar to other OS versions, ensuring more reliable detection of concurrent server startups. --- src/bin/pg_ctl/pg_ctl.c | 109 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 3ac2fcc004..ed1b0c43fc 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -132,6 +132,7 @@ static void adjust_data_dir(void); #ifdef WIN32 #include <versionhelpers.h> +#include <tlhelp32.h> static bool pgwin32_IsInstalled(SC_HANDLE); static char *pgwin32_CommandLine(bool); static void pgwin32_doRegister(void); @@ -142,6 +143,7 @@ static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *); static void pgwin32_doRunAsService(void); static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service); static PTOKEN_PRIVILEGES GetPrivilegesToDelete(HANDLE hToken); +static pid_t pgwin32_find_postmaster_pid(pid_t shell_pid); #endif static pid_t get_pgpid(bool is_status_request); @@ -609,7 +611,11 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) /* File is complete enough for us, parse it */ pid_t pmpid; time_t pmstart; - +#ifndef WIN32 + pid_t wait_pid = pm_pid; +#else + pid_t wait_pid = pgwin32_find_postmaster_pid(pm_pid); +#endif /* * Make sanity checks. If it's for the wrong PID, or the recorded * start time is before pg_ctl started, then either we are looking @@ -619,14 +625,8 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) */ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]); pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]); - if (pmstart >= start_time - 2 && -#ifndef WIN32 - pmpid == pm_pid -#else - /* Windows can only reject standalone-backend PIDs */ - pmpid > 0 -#endif - ) + + if (pmstart >= start_time - 2 && pmpid == wait_pid) { /* * OK, seems to be a valid pidfile from our child. Check the @@ -1950,6 +1950,97 @@ GetPrivilegesToDelete(HANDLE hToken) return tokenPrivs; } + +/* + * Find the PID of the launched postmaster. + * + * On Windows, the cmd.exe doesn't support the exec command. As a result, we + * don't directly get the postmaster's PID. This function identifies the PID of + * the postmaster started by the child cmd.exe. + * + * Returns the postmaster's PID. If the shell is alive but the postmaster is + * missing, returns 0. Otherwise terminates this command with an error. + * + * This function uses PID 0 as an invalid value, assuming the system idle + * process occupies it and it won't be a PID for a shell or postmaster. + */ +pid_t +pgwin32_find_postmaster_pid(pid_t shell_pid) +{ + HANDLE hSnapshot; + PROCESSENTRY32 ppe; + pid_t pm_pid = 0; /* abusing 0 as an invalid value */ + bool shell_exists = false; + bool multiple_children = false; + DWORD last_error; + + /* create a process snapshot */ + hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnapshot == INVALID_HANDLE_VALUE) + { + write_stderr(_("%s: CreateToolhelp32Snapshot failed\n"), + progname); + exit(1); + } + + /* start iterating on the snapshot */ + ppe.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(hSnapshot, &ppe)) + { + write_stderr(_("%s: Process32First failed: errcode=%08lx\n"), + progname, GetLastError()); + exit(1); + } + + /* + * Iterate over the snapshot + * + * Check for shell existence and duplicate processes for reliability. + * + * The launcher shell may start other instances of cmd.exe or programs + * besides postgres.exe. It's important to verify the program file name. + */ + do + { + if (ppe.th32ProcessID == shell_pid) + shell_exists = true; + else if (ppe.th32ParentProcessID == shell_pid && + strcmp("postgres.exe", ppe.szExeFile) == 0) + { + if (pm_pid != ppe.th32ProcessID && pm_pid != 0) + multiple_children = true; + pm_pid = ppe.th32ProcessID; + } + } + while (Process32Next(hSnapshot, &ppe)); + + /* avoid multiple calls primary for clarity, not out of necessity */ + last_error = GetLastError(); + if (last_error != ERROR_NO_MORE_FILES) + { + write_stderr(_("%s: Process32Next failed: errcode=%08lx\n"), + progname, last_error); + exit(1); + } + CloseHandle(hSnapshot); + + /* assuming the launching shell executes a single process */ + if (multiple_children) + { + write_stderr(_("%s: launcher shell executed multiple processes\n"), + progname); + exit(1); + } + + /* check if the process is still alive */ + if (!shell_exists) + { + write_stderr(_("%s: launcher shell died\n"), progname); + exit(1); + } + + return pm_pid; +} #endif /* WIN32 */ static void -- 2.39.3 ----Next_Part(Fri_Sep_22_16_15_51_2023_434)---- ^ permalink raw reply [nested|flat] 6+ messages in thread
* [PATCH v4 2/3] Improve pg_ctl postmaster process check on Windows @ 2023-10-24 05:46 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 6+ messages in thread From: Kyotaro Horiguchi @ 2023-10-24 05:46 UTC (permalink / raw) Currently pg_ctl on Windows does not verify that it actually executed a postmaster process due to lack of process ID knowledge. This can lead to false positives in cases where another pg_ctl instance starts a different server simultaneously. This patch adds the capability to identify the process ID of the launched postmaster on Windows, similar to other OS versions, ensuring more reliable detection of concurrent server startups. --- src/bin/pg_ctl/pg_ctl.c | 102 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 3ac2fcc004..9c0168b075 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -132,6 +132,7 @@ static void adjust_data_dir(void); #ifdef WIN32 #include <versionhelpers.h> +#include <tlhelp32.h> static bool pgwin32_IsInstalled(SC_HANDLE); static char *pgwin32_CommandLine(bool); static void pgwin32_doRegister(void); @@ -142,6 +143,7 @@ static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *); static void pgwin32_doRunAsService(void); static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service); static PTOKEN_PRIVILEGES GetPrivilegesToDelete(HANDLE hToken); +static pid_t pgwin32_find_postmaster_pid(pid_t shell_pid); #endif static pid_t get_pgpid(bool is_status_request); @@ -609,7 +611,11 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) /* File is complete enough for us, parse it */ pid_t pmpid; time_t pmstart; - +#ifndef WIN32 + pid_t wait_pid = pm_pid; +#else + pid_t wait_pid = pgwin32_find_postmaster_pid(pm_pid); +#endif /* * Make sanity checks. If it's for the wrong PID, or the recorded * start time is before pg_ctl started, then either we are looking @@ -619,14 +625,8 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) */ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]); pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]); - if (pmstart >= start_time - 2 && -#ifndef WIN32 - pmpid == pm_pid -#else - /* Windows can only reject standalone-backend PIDs */ - pmpid > 0 -#endif - ) + + if (pmstart >= start_time - 2 && pmpid == wait_pid) { /* * OK, seems to be a valid pidfile from our child. Check the @@ -1950,6 +1950,90 @@ GetPrivilegesToDelete(HANDLE hToken) return tokenPrivs; } + +/* + * Find the PID of the launched postmaster. + * + * On Windows, the cmd.exe doesn't support the exec command. As a result, we + * don't directly get the postmaster's PID. This function identifies the PID of + * the postmaster started by the child cmd.exe. + * + * Returns the postmaster's PID. If the shell is alive but the postmaster is + * missing, returns 0. Otherwise terminates this command with an error. + * + * This function uses PID 0 as an invalid value, assuming the system idle + * process occupies it and it won't be a PID for a shell or postmaster. + */ +static pid_t +pgwin32_find_postmaster_pid(pid_t shell_pid) +{ + HANDLE hSnapshot; + PROCESSENTRY32 ppe; + pid_t pm_pid = 0; /* abusing 0 as an invalid value */ + bool multiple_children = false; + DWORD last_error; + + /* create a process snapshot */ + hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnapshot == INVALID_HANDLE_VALUE) + { + write_stderr(_("%s: CreateToolhelp32Snapshot failed\n"), + progname); + exit(1); + } + + /* start iterating on the snapshot */ + ppe.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(hSnapshot, &ppe)) + { + write_stderr(_("%s: Process32First failed: errcode=%08lx\n"), + progname, GetLastError()); + exit(1); + } + + /* + * Iterate over the snapshot + * + * Check for duplicate processes to ensure reliability. + * + * The launcher shell might start other cmd.exe instances or programs + * besides postgres.exe. Veryfying the program file name is essential. + * + * The launcher shell process isn't checked in this function. It will be + * checked by the caller. + */ + do + { + if (ppe.th32ParentProcessID == shell_pid && + strcmp("postgres.exe", ppe.szExeFile) == 0) + { + if (pm_pid != ppe.th32ProcessID && pm_pid != 0) + multiple_children = true; + pm_pid = ppe.th32ProcessID; + } + } + while (Process32Next(hSnapshot, &ppe)); + + /* avoid multiple calls primary for clarity, not out of necessity */ + last_error = GetLastError(); + if (last_error != ERROR_NO_MORE_FILES) + { + write_stderr(_("%s: Process32Next failed: errcode=%08lx\n"), + progname, last_error); + exit(1); + } + CloseHandle(hSnapshot); + + /* assuming the launching shell executes a single process */ + if (multiple_children) + { + write_stderr(_("%s: multiple postmasters found\n"), + progname); + exit(1); + } + + return pm_pid; +} #endif /* WIN32 */ static void -- 2.39.3 ----Next_Part(Tue_Oct_24_15_00_27_2023_044)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v4-0003-Remove-short-sleep-from-001_start_stop.pl.patch" ^ permalink raw reply [nested|flat] 6+ messages in thread
* [PATCH v5 2/3] Improve pg_ctl postmaster process check on Windows @ 2023-10-24 05:46 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 6+ messages in thread From: Kyotaro Horiguchi @ 2023-10-24 05:46 UTC (permalink / raw) Currently pg_ctl on Windows does not verify that it actually executed a postmaster process due to lack of process ID knowledge. This can lead to false positives in cases where another pg_ctl instance starts a different server simultaneously. This patch adds the capability to identify the process ID of the launched postmaster on Windows, similar to other OS versions, ensuring more reliable detection of concurrent server startups. --- src/bin/pg_ctl/pg_ctl.c | 102 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 3ac2fcc004..221049db0e 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -132,6 +132,7 @@ static void adjust_data_dir(void); #ifdef WIN32 #include <versionhelpers.h> +#include <tlhelp32.h> static bool pgwin32_IsInstalled(SC_HANDLE); static char *pgwin32_CommandLine(bool); static void pgwin32_doRegister(void); @@ -142,6 +143,7 @@ static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *); static void pgwin32_doRunAsService(void); static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service); static PTOKEN_PRIVILEGES GetPrivilegesToDelete(HANDLE hToken); +static pid_t pgwin32_find_postmaster_pid(pid_t shell_pid); #endif static pid_t get_pgpid(bool is_status_request); @@ -609,7 +611,11 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) /* File is complete enough for us, parse it */ pid_t pmpid; time_t pmstart; - +#ifndef WIN32 + pid_t wait_pid = pm_pid; +#else + pid_t wait_pid = pgwin32_find_postmaster_pid(pm_pid); +#endif /* * Make sanity checks. If it's for the wrong PID, or the recorded * start time is before pg_ctl started, then either we are looking @@ -619,14 +625,8 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) */ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]); pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]); - if (pmstart >= start_time - 2 && -#ifndef WIN32 - pmpid == pm_pid -#else - /* Windows can only reject standalone-backend PIDs */ - pmpid > 0 -#endif - ) + + if (pmstart >= start_time - 2 && pmpid == wait_pid) { /* * OK, seems to be a valid pidfile from our child. Check the @@ -1950,6 +1950,90 @@ GetPrivilegesToDelete(HANDLE hToken) return tokenPrivs; } + +/* + * Find the PID of the launched postmaster. + * + * On Windows, the cmd.exe doesn't support the exec command. As a result, we + * don't directly get the postmaster's PID. This function identifies the PID of + * the postmaster started by the child cmd.exe. + * + * Returns the postmaster's PID. If the shell is alive but the postmaster is + * missing, returns 0. Otherwise terminates this command with an error. + * + * This function uses PID 0 as an invalid value, assuming the system idle + * process occupies it and it won't be a PID for a shell or postmaster. + */ +static pid_t +pgwin32_find_postmaster_pid(pid_t shell_pid) +{ + HANDLE hSnapshot; + PROCESSENTRY32 ppe; + pid_t pm_pid = 0; /* abusing 0 as an invalid value */ + bool multiple_children = false; + DWORD last_error; + + /* create a process snapshot */ + hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnapshot == INVALID_HANDLE_VALUE) + { + write_stderr(_("%s: CreateToolhelp32Snapshot failed: error code %lu\n"), + progname, (unsigned long) GetLastError()); + exit(1); + } + + /* start iterating on the snapshot */ + ppe.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(hSnapshot, &ppe)) + { + write_stderr(_("%s: Process32First failed: error code %lu\n"), + progname, (unsigned long) GetLastError()); + exit(1); + } + + /* + * Iterate over the snapshot + * + * Check for duplicate processes to ensure reliability. + * + * The launcher shell might start other cmd.exe instances or programs + * besides postgres.exe. Veryfying the program file name is essential. + * + * The launcher shell process isn't checked in this function. It will be + * checked by the caller. + */ + do + { + if (ppe.th32ParentProcessID == shell_pid && + strcmp("postgres.exe", ppe.szExeFile) == 0) + { + if (pm_pid != ppe.th32ProcessID && pm_pid != 0) + multiple_children = true; + pm_pid = ppe.th32ProcessID; + } + } + while (Process32Next(hSnapshot, &ppe)); + + /* avoid multiple calls primary for clarity, not out of necessity */ + last_error = GetLastError(); + if (last_error != ERROR_NO_MORE_FILES) + { + write_stderr(_("%s: Process32Next failed: error code %lu\n"), + progname, (unsigned long) last_error); + exit(1); + } + CloseHandle(hSnapshot); + + /* assuming the launching shell executes a single process */ + if (multiple_children) + { + write_stderr(_("%s: multiple postmasters found\n"), + progname); + exit(1); + } + + return pm_pid; +} #endif /* WIN32 */ static void -- 2.39.3 ----Next_Part(Tue_Oct_24_17_25_36_2023_034)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v5-0003-Remove-short-sleep-from-001_start_stop.pl.patch" ^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Questionable description about character sets @ 2026-02-16 07:34 Tatsuo Ishii <[email protected]> 0 siblings, 1 reply; 6+ messages in thread From: Tatsuo Ishii @ 2026-02-16 07:34 UTC (permalink / raw) To: [email protected]; +Cc: [email protected]; [email protected] > When I point my browser at > file:///home/tmunro/projects/postgresql/build/doc/src/sgml/html/multibyte.html > I see these longer descriptions flowing onto multiple lines making the > table cells higher, while the published documentation[1] does only a > small amount of that, and then the font instead becomes smaller as I > make the window narrower. Is there an easy way to see the final > website form in a local build? Same here. It would be nice to know website form in a local build. > We'd have more free space in the affected rows if we did s/Extended > UNIX Code-JP/EUC-JP/. Why is that acronym expanded, while ISO, ECMA, > JIS and CP are not? Fair point. > It might be confusing that the style "ISO 8859-1, ECMA 94" is used to > list alternative encoding standards that are aligned or equivalent, > while here you're listing the encoding and then the underlying > character sets in the same way. Would it be better to put them in > parentheses? > > With those two changes we'd have: > > EUC_JP | EUC-JP (JIS X 0201, JIS X 0208, JIS X 0212) > EUC_JIS_2004 | EUC-JP (JIS X 0201, JIS X 0213) Looks good to me. > While wondering if some other rows could be more specific, I noticed > that for GBK we have "Extended National Standard". I don't understand > these things, Me neither. Probably "Extended National Standard" comes from the fact that GB means "national standard" and "K" means "extension". However actually GBK is not an "official standard" which is mandatory for Chinese industries to follow [1]. It's kind of strongly recommended standard to follow. Probably we can just write "Defact standard (CP936)". > but from a quick look at Wikipedia[2], I got the idea > that if convert_to('€', 'GBK') = '\x80'::bytea (yes) then what we have > might actually be the yet-further-extended standard known as "GBK > 1.0". Do I have that right? I don't think so. [2] stats that "Microsoft later added the euro sign to Code page 936 and assigned the code 0x80 to it. This is not a valid code point in GBK 1.0. " So what we have seems to be CP936. Actually in UCS_to_most.pl, which is used to generate gdbk_to_utf8.map, has the line: 'GBK' => 'CP936.TXT'); > As for BIG5, it seems to be an underspecified mess defying description > other than "good luck" :-) Yeah, ours is BIG5 (Unicode 1.1) + CP950. > Thankfully we won't have to list all the > standards that MULE_INTERNAL indirectly covers, as it looks like we've > agreed to drop it. And IIRC there was a thread somewhere proposing to > drop JOHAB... Apparently JOHAB has not been well tested... > Makes sense to me. The underlying character sets must be very > important to understand, especially if implementations vary on these > points. We should give the information. Yes. > . o O ( I wonder if anyone has ever tried to make an "XTF-8-JA" > encoding just like UTF-8 but with ~1900 high-frequency Japanese > codepoints swapped into the 2-byte range U+0080-07ff where Greek, > Hebrew, Arabic and others won the encoding lottery. UTF-16 is > apparently sometimes preferred to save space in other RDBMSs that can > do it, but I suppose you could achieve the same size most of the time > with a scheme like that. The other encodings have the desired size, > but non-universal character sets. A similar thought for the languages > of India, but with the frequency fuzziness factor removed: you could > surely map a dozen tiny non-ideographic scripts into that range to > save a byte per character... Hindi, Tamil etc didn't get a very good > deal with UTF-8. Don't worry, I'm not suggesting that PostgreSQL has > any business inventings its own hair-brained encodings, I'm just > wondering out loud if that is a kind of thing that exists somewhere > out there... ) Well, I think inventing internal use only encoding is not a bad thing in general. We already have number of internal only data structures. Internal encodings are just one of them. (I am not saying I want to implement "XTF-8-JA" though). > [1] https://www.postgresql.org/docs/current/multibyte.html > [2] https://en.wikipedia.org/wiki/GBK_(character_encoding) > [3] https://ja.wikipedia.org/wiki/GBK Best regards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp ^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Questionable description about character sets @ 2026-02-16 15:59 Robert Treat <[email protected]> parent: Tatsuo Ishii <[email protected]> 0 siblings, 1 reply; 6+ messages in thread From: Robert Treat @ 2026-02-16 15:59 UTC (permalink / raw) To: Tatsuo Ishii <[email protected]>; +Cc: [email protected]; [email protected]; [email protected] On Mon, Feb 16, 2026 at 4:48 AM Tatsuo Ishii <[email protected]> wrote: > > > When I point my browser at > > file:///home/tmunro/projects/postgresql/build/doc/src/sgml/html/multibyte.html > > I see these longer descriptions flowing onto multiple lines making the > > table cells higher, while the published documentation[1] does only a > > small amount of that, and then the font instead becomes smaller as I > > make the window narrower. Is there an easy way to see the final > > website form in a local build? > > Same here. It would be nice to know website form in a local build. > Are you folks building with "make STYLE=website html" ? That usually gives me a pretty good representation of the web (although beware if you use any browser specific settings to display websites in different fonts. For example, on my desktop at home I run with postgresql.org at 133% size, which doesn't carry over when looking at locally built html pages. In any case, there is some additional info at https://www.postgresql.org/docs/devel/docguide-build.html#DOCGUIDE-BUILD-HTML Robert Treat https://xzilla.net ^ permalink raw reply [nested|flat] 6+ messages in thread
* Re: Questionable description about character sets @ 2026-02-17 01:04 Tatsuo Ishii <[email protected]> parent: Robert Treat <[email protected]> 0 siblings, 0 replies; 6+ messages in thread From: Tatsuo Ishii @ 2026-02-17 01:04 UTC (permalink / raw) To: [email protected]; +Cc: [email protected]; [email protected]; [email protected] >> Same here. It would be nice to know website form in a local build. >> > > Are you folks building with "make STYLE=website html" ? That usually > gives me a pretty good representation of the web (although beware if > you use any browser specific settings to display websites in different > fonts. For example, on my desktop at home I run with postgresql.org at > 133% size, which doesn't carry over when looking at locally built html > pages. > > In any case, there is some additional info at > https://www.postgresql.org/docs/devel/docguide-build.html#DOCGUIDE-BUILD-HTML Thanks for letting know me. I did not notice it. Best regards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp ^ permalink raw reply [nested|flat] 6+ messages in thread
end of thread, other threads:[~2026-02-17 01:04 UTC | newest] Thread overview: 6+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2023-09-20 04:16 [PATCH 2/3] Improve pg_ctl postmaster process check on Windows Kyotaro Horiguchi <[email protected]> 2023-10-24 05:46 [PATCH v4 2/3] Improve pg_ctl postmaster process check on Windows Kyotaro Horiguchi <[email protected]> 2023-10-24 05:46 [PATCH v5 2/3] Improve pg_ctl postmaster process check on Windows Kyotaro Horiguchi <[email protected]> 2026-02-16 07:34 Re: Questionable description about character sets Tatsuo Ishii <[email protected]> 2026-02-16 15:59 ` Re: Questionable description about character sets Robert Treat <[email protected]> 2026-02-17 01:04 ` Re: Questionable description about character sets Tatsuo Ishii <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox