summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/tcop/utility.c6
-rw-r--r--src/include/utils/elog.h44
2 files changed, 29 insertions, 21 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index aa008157878..247d0816ad8 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1678,16 +1678,16 @@ ProcessUtilitySlow(ParseState *pstate,
* command itself is queued, which is enough.
*/
EventTriggerInhibitCommandCollection();
- PG_TRY();
+ PG_TRY(2);
{
address = ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
queryString, params, qc);
}
- PG_FINALLY();
+ PG_FINALLY(2);
{
EventTriggerUndoInhibitCommandCollection();
}
- PG_END_TRY();
+ PG_END_TRY(2);
break;
case T_CreateTrigStmt:
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index 4dd9658a3cf..f107a818e81 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -310,39 +310,47 @@ extern PGDLLIMPORT ErrorContextCallback *error_context_stack;
* pedantry; we have seen bugs from compilers improperly optimizing code
* away when such a variable was not marked. Beware that gcc's -Wclobbered
* warnings are just about entirely useless for catching such oversights.
+ *
+ * Each of these macros accepts an optional argument which can be specified
+ * to apply a suffix to the variables declared within the macros. This suffix
+ * can be used to avoid the compiler emitting warnings about shadowed
+ * variables when compiling with -Wshadow in situations where nested PG_TRY()
+ * statements are required. The optional suffix may contain any character
+ * that's allowed in a variable name. The suffix, if specified, must be the
+ * same within each component macro of the given PG_TRY() statement.
*----------
*/
-#define PG_TRY() \
+#define PG_TRY(...) \
do { \
- sigjmp_buf *_save_exception_stack = PG_exception_stack; \
- ErrorContextCallback *_save_context_stack = error_context_stack; \
- sigjmp_buf _local_sigjmp_buf; \
- bool _do_rethrow = false; \
- if (sigsetjmp(_local_sigjmp_buf, 0) == 0) \
+ sigjmp_buf *_save_exception_stack##__VA_ARGS__ = PG_exception_stack; \
+ ErrorContextCallback *_save_context_stack##__VA_ARGS__ = error_context_stack; \
+ sigjmp_buf _local_sigjmp_buf##__VA_ARGS__; \
+ bool _do_rethrow##__VA_ARGS__ = false; \
+ if (sigsetjmp(_local_sigjmp_buf##__VA_ARGS__, 0) == 0) \
{ \
- PG_exception_stack = &_local_sigjmp_buf
+ PG_exception_stack = &_local_sigjmp_buf##__VA_ARGS__
-#define PG_CATCH() \
+#define PG_CATCH(...) \
} \
else \
{ \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__
-#define PG_FINALLY() \
+#define PG_FINALLY(...) \
} \
else \
- _do_rethrow = true; \
+ _do_rethrow##__VA_ARGS__ = true; \
{ \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__
-#define PG_END_TRY() \
+#define PG_END_TRY(...) \
} \
- if (_do_rethrow) \
+ if (_do_rethrow##__VA_ARGS__) \
PG_RE_THROW(); \
- PG_exception_stack = _save_exception_stack; \
- error_context_stack = _save_context_stack; \
+ PG_exception_stack = _save_exception_stack##__VA_ARGS__; \
+ error_context_stack = _save_context_stack##__VA_ARGS__; \
} while (0)
/*