diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index aa00815787..247d0816ad 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 4dd9658a3c..c79d6cfba3 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -310,39 +310,48 @@ 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 set of PG_TRY() / PG_CATCH() / PG_FINALLY() / PG_END_TRY() + * statements. *---------- */ -#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) /*