diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-01-23 22:46:45 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-01-23 22:47:03 -0500 |
commit | dd815a94ccf589001458f353ccb62ca348d1a894 (patch) | |
tree | 199521325c11e82a5e43ac9b0c43d18a239d1d38 /src | |
parent | 2146718b3cf99f32cc0b09d9b7c0a14463f25fd4 (diff) | |
download | postgresql-dd815a94ccf589001458f353ccb62ca348d1a894.tar.gz postgresql-dd815a94ccf589001458f353ccb62ca348d1a894.zip |
Blind attempt to fix _configthreadlocale() failures on MinGW.
Apparently, some builds of MinGW contain a version of
_configthreadlocale() that always returns -1, indicating failure.
Rather than treating that as a curl-up-and-die condition, soldier on
as though the function didn't exist. This leaves us without thread
safety on such MinGW versions, but we didn't have it anyway.
Discussion: https://postgr.es/m/d06a16bc-52d6-9f0d-2379-21242d7dbe81@2ndQuadrant.com
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/ecpg/ecpglib/descriptor.c | 2 | ||||
-rw-r--r-- | src/interfaces/ecpg/ecpglib/execute.c | 20 |
2 files changed, 12 insertions, 10 deletions
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c index cf8657e9c00..53d995966ed 100644 --- a/src/interfaces/ecpg/ecpglib/descriptor.c +++ b/src/interfaces/ecpg/ecpglib/descriptor.c @@ -518,7 +518,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...) } #ifdef HAVE__CONFIGTHREADLOCALE if (stmt.oldthreadlocale != -1) - _configthreadlocale(stmt.oldthreadlocale); + (void) _configthreadlocale(stmt.oldthreadlocale); #endif #endif } diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index adc4470d9a2..72ab5c82ec4 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1785,7 +1785,9 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, * Make sure we do NOT honor the locale for numeric input/output since the * database wants the standard decimal point. If available, use * uselocale() for this because it's thread-safe. Windows doesn't have - * that, but it usually does have _configthreadlocale(). + * that, but it usually does have _configthreadlocale(). In some versions + * of MinGW, _configthreadlocale() exists but always returns -1 --- so + * treat that situation as if the function doesn't exist. */ #ifdef HAVE_USELOCALE stmt->clocale = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0); @@ -1803,11 +1805,6 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, #else #ifdef HAVE__CONFIGTHREADLOCALE stmt->oldthreadlocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); - if (stmt->oldthreadlocale == -1) - { - ecpg_do_epilogue(stmt); - return false; - } #endif stmt->oldlocale = ecpg_strdup(setlocale(LC_NUMERIC, NULL), lineno); if (stmt->oldlocale == NULL) @@ -2024,12 +2021,17 @@ ecpg_do_epilogue(struct statement *stmt) uselocale(stmt->oldlocale); #else if (stmt->oldlocale) - { setlocale(LC_NUMERIC, stmt->oldlocale); #ifdef HAVE__CONFIGTHREADLOCALE - _configthreadlocale(stmt->oldthreadlocale); + + /* + * This is a bit trickier than it looks: if we failed partway through + * statement initialization, oldthreadlocale could still be 0. But that's + * okay because a call with 0 is defined to be a no-op. + */ + if (stmt->oldthreadlocale != -1) + (void) _configthreadlocale(stmt->oldthreadlocale); #endif - } #endif free_statement(stmt); |