From fec843c33b349e8f5f1d850b88da92a7b21b6e89 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 1 Mar 2018 09:37:54 +0800 Subject: [PATCH] Catch exceptions from C++ in EXPLAIN for DXL generation When generating DXL output in EXPLAIN {ANALYZE}, make sure to catch any exceptions generated on the C++ side to avoid a server crash on queries where ORCA fail to generate a plan. A better job of catching the various different possible exceptions and generating nice error messages can be made, this closes the current hole of trivial core dumps on for example this: EXPLAIN (dxl) SELECT * FROM pg_class; --- src/backend/gpopt/CGPOptimizer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backend/gpopt/CGPOptimizer.cpp b/src/backend/gpopt/CGPOptimizer.cpp index 03db069be0..da7de796f3 100644 --- a/src/backend/gpopt/CGPOptimizer.cpp +++ b/src/backend/gpopt/CGPOptimizer.cpp @@ -113,7 +113,18 @@ CGPOptimizer::SzDXLPlan Query *pquery ) { - return COptTasks::SzOptimize(pquery); + GPOS_TRY; + { + return COptTasks::SzOptimize(pquery); + } + GPOS_CATCH_EX(ex); + { + errstart(ERROR, ex.SzFilename(), ex.UlLine(), NULL, TEXTDOMAIN); + errfinish(errcode(ERRCODE_INTERNAL_ERROR), + errmsg("Optimizer failed to produce plan")); + } + GPOS_CATCH_END; + return NULL; } //--------------------------------------------------------------------------- -- GitLab