You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by rl...@apache.org on 2016/10/28 03:53:10 UTC
[07/17] incubator-hawq git commit: HAWQ-1122. Fix ORCA - gpdb
exception handling. This closes #793
HAWQ-1122. Fix ORCA - gpdb exception handling. This closes #793
Any GPDB exception happens in while ORCA generating plan will abort
query.
This is cherry-picked from greenplum-db/gpdb@045d437cc1240b0d804ce4a37b5b165ec216afd7
Signed-off-by: Foyzur Rahman <fr...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/f6b76472
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/f6b76472
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/f6b76472
Branch: refs/heads/master
Commit: f6b76472c9c3112cf83058c78d05cf1a59d8d498
Parents: dc14ecb
Author: Karthikeyan Jambu Rajaraman <ka...@gmail.com>
Authored: Tue Apr 26 08:21:50 2016 -0700
Committer: rlei <rl...@pivotal.io>
Committed: Fri Oct 28 11:52:20 2016 +0800
----------------------------------------------------------------------
src/backend/gpopt/CGPOptimizer.cpp | 16 +-
src/backend/gpopt/gpdbwrappers.cpp | 7 +-
src/backend/gpopt/utils/COptTasks.cpp | 13 +-
src/test/regress/expected/abstime_optimizer.out | 137 +
src/test/regress/expected/errors.out | 4 +
src/test/regress/expected/gp_optimizer.out | 35 +
src/test/regress/expected/horology.out | 5 +-
.../regress/expected/horology_optimizer.out | 3104 ++++++++++++++++++
.../regress/expected/namespace_optimizer.out | 142 +
.../regress/expected/privileges_optimizer.out | 733 +++++
src/test/regress/expected/role_optimizer.out | 107 +
src/test/regress/sql/errors.sql | 5 +-
src/test/regress/sql/gp_optimizer.sql | 25 +
src/test/regress/sql/horology.sql | 6 +-
14 files changed, 4323 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/backend/gpopt/CGPOptimizer.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/CGPOptimizer.cpp b/src/backend/gpopt/CGPOptimizer.cpp
index db3cab8..4ade344 100644
--- a/src/backend/gpopt/CGPOptimizer.cpp
+++ b/src/backend/gpopt/CGPOptimizer.cpp
@@ -37,6 +37,8 @@
#include "gpopt/init.h"
#include "gpos/_api.h"
+#include "naucrates/exception.h"
+
//---------------------------------------------------------------------------
// @function:
// CGPOptimizer::TouchLibraryInitializers
@@ -69,7 +71,19 @@ CGPOptimizer::PplstmtOptimize
bool *pfUnexpectedFailure // output : set to true if optimizer unexpectedly failed to produce plan
)
{
- return COptTasks::PplstmtOptimize(pquery, pfUnexpectedFailure);
+ GPOS_TRY
+ {
+ return COptTasks::PplstmtOptimize(pquery, pfUnexpectedFailure);
+ }
+ GPOS_CATCH_EX(ex)
+ {
+ if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError))
+ {
+ elog(ERROR, "GPDB exception. Aborting GPORCA plan generation.");
+ }
+ }
+ GPOS_CATCH_END;
+ return NULL;
}
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/backend/gpopt/gpdbwrappers.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/gpdbwrappers.cpp b/src/backend/gpopt/gpdbwrappers.cpp
index 7d72823..1d6a071 100644
--- a/src/backend/gpopt/gpdbwrappers.cpp
+++ b/src/backend/gpopt/gpdbwrappers.cpp
@@ -237,8 +237,13 @@
#define GP_WRAP_END \
} \
+ else \
+ { \
+ EmitErrorReport(); \
+ FlushErrorState(); \
+ GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError); \
+ } \
} \
- GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)
using namespace gpos;
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/backend/gpopt/utils/COptTasks.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/COptTasks.cpp b/src/backend/gpopt/utils/COptTasks.cpp
index ca20e4c..58085b8 100644
--- a/src/backend/gpopt/utils/COptTasks.cpp
+++ b/src/backend/gpopt/utils/COptTasks.cpp
@@ -726,9 +726,11 @@ COptTasks::PdrgPssLoad
}
GPOS_CATCH_EX(ex)
{
- GPOS_RESET_EX;
-
+ if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError)) {
+ GPOS_RETHROW(ex);
+ }
elog(DEBUG2, "\n[OPT]: Using default search strategy");
+ GPOS_RESET_EX;
}
GPOS_CATCH_END;
@@ -1528,13 +1530,6 @@ COptTasks::PvEvalExprFromDXLTask
{
CMDCache::Shutdown();
}
- // Catch GPDB exceptions
- if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError))
- {
- elog(NOTICE, "Found non const expression. Please check log for more information.");
- GPOS_RESET_EX;
- return NULL;
- }
if (FErrorOut(ex))
{
IErrorContext *perrctxt = CTask::PtskSelf()->Perrctxt();
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/test/regress/expected/abstime_optimizer.out
----------------------------------------------------------------------
diff --git a/src/test/regress/expected/abstime_optimizer.out b/src/test/regress/expected/abstime_optimizer.out
new file mode 100644
index 0000000..81b6fbd
--- /dev/null
+++ b/src/test/regress/expected/abstime_optimizer.out
@@ -0,0 +1,137 @@
+--
+-- ABSTIME
+-- testing built-in time type abstime
+-- uses reltime and tinterval
+--
+--
+-- timezones may vary based not only on location but the operating
+-- system. the main correctness issue is that the OS may not get
+-- daylight savings time right for times prior to Unix epoch (jan 1 1970).
+--
+CREATE TABLE ABSTIME_TBL (f1 abstime);
+NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'f1' as the Greenplum Database data distribution key for this table.
+HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
+BEGIN;
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'now');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'now');
+SELECT count(*) AS two FROM ABSTIME_TBL WHERE f1 = 'now' ;
+ two
+-----
+ 2
+(1 row)
+
+END;
+DELETE FROM ABSTIME_TBL;
+INSERT INTO ABSTIME_TBL (f1) VALUES ('Jan 14, 1973 03:14:21');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'Mon May 1 00:30:30 1995');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'epoch');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'infinity');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime '-infinity');
+INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'May 10, 1947 23:59:12');
+-- what happens if we specify slightly misformatted abstime?
+INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 35, 1946 10:00:00');
+ERROR: date/time field value out of range: "Feb 35, 1946 10:00:00"
+LINE 1: INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 35, 1946 10:00:00'...
+ ^
+HINT: Perhaps you need a different "datestyle" setting.
+INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 28, 1984 25:08:10');
+ERROR: date/time field value out of range: "Feb 28, 1984 25:08:10"
+LINE 1: INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 28, 1984 25:08:10'...
+ ^
+-- badly formatted abstimes: these should result in invalid abstimes
+INSERT INTO ABSTIME_TBL (f1) VALUES ('bad date format');
+ERROR: invalid input syntax for type abstime: "bad date format"
+LINE 1: INSERT INTO ABSTIME_TBL (f1) VALUES ('bad date format');
+ ^
+INSERT INTO ABSTIME_TBL (f1) VALUES ('Jun 10, 1843');
+ERROR: cannot convert abstime "invalid" to timestamp
+ERROR: GPDB exception. Aborting GPORCA plan generation. (CGPOptimizer.cpp:66)
+-- test abstime operators
+SELECT '' AS eight, * FROM ABSTIME_TBL ORDER BY 2;
+ eight | f1
+-------+------------------------------
+ | -infinity
+ | Sat May 10 23:59:12 1947 PST
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+ | Mon May 01 00:30:30 1995 PDT
+ | infinity
+(6 rows)
+
+SELECT '' AS six, * FROM ABSTIME_TBL
+ WHERE ABSTIME_TBL.f1 < abstime 'Jun 30, 2001' ORDER BY 2;
+ six | f1
+-----+------------------------------
+ | -infinity
+ | Sat May 10 23:59:12 1947 PST
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+ | Mon May 01 00:30:30 1995 PDT
+(5 rows)
+
+SELECT '' AS six, * FROM ABSTIME_TBL
+ WHERE ABSTIME_TBL.f1 > abstime '-infinity' ORDER BY 2;
+ six | f1
+-----+------------------------------
+ | Sat May 10 23:59:12 1947 PST
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+ | Mon May 01 00:30:30 1995 PDT
+ | infinity
+(5 rows)
+
+SELECT '' AS six, * FROM ABSTIME_TBL
+ WHERE abstime 'May 10, 1947 23:59:12' <> ABSTIME_TBL.f1 ORDER BY 2;
+ six | f1
+-----+------------------------------
+ | -infinity
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+ | Mon May 01 00:30:30 1995 PDT
+ | infinity
+(5 rows)
+
+SELECT '' AS three, * FROM ABSTIME_TBL
+ WHERE abstime 'epoch' >= ABSTIME_TBL.f1 ORDER BY 2;
+ three | f1
+-------+------------------------------
+ | -infinity
+ | Sat May 10 23:59:12 1947 PST
+ | Wed Dec 31 16:00:00 1969 PST
+(3 rows)
+
+SELECT '' AS four, * FROM ABSTIME_TBL
+ WHERE ABSTIME_TBL.f1 <= abstime 'Jan 14, 1973 03:14:21' ORDER BY 2;
+ four | f1
+------+------------------------------
+ | -infinity
+ | Sat May 10 23:59:12 1947 PST
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+(4 rows)
+
+SELECT '' AS four, * FROM ABSTIME_TBL
+ WHERE ABSTIME_TBL.f1 <?>
+ tinterval '["Apr 1 1950 00:00:00" "Dec 30 1999 23:00:00"]' ORDER BY 2;
+ four | f1
+------+------------------------------
+ | Wed Dec 31 16:00:00 1969 PST
+ | Sun Jan 14 03:14:21 1973 PST
+ | Mon May 01 00:30:30 1995 PDT
+(3 rows)
+
+SELECT '' AS four, f1 AS abstime,
+ date_part('year', f1) AS year, date_part('month', f1) AS month,
+ date_part('day',f1) AS day, date_part('hour', f1) AS hour,
+ date_part('minute', f1) AS minute, date_part('second', f1) AS second
+ FROM ABSTIME_TBL
+ WHERE isfinite(f1)
+ ORDER BY abstime;
+ four | abstime | year | month | day | hour | minute | second
+------+------------------------------+------+-------+-----+------+--------+--------
+ | Sat May 10 23:59:12 1947 PST | 1947 | 5 | 10 | 23 | 59 | 12
+ | Wed Dec 31 16:00:00 1969 PST | 1969 | 12 | 31 | 16 | 0 | 0
+ | Sun Jan 14 03:14:21 1973 PST | 1973 | 1 | 14 | 3 | 14 | 21
+ | Mon May 01 00:30:30 1995 PDT | 1995 | 5 | 1 | 0 | 30 | 30
+(4 rows)
+
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/test/regress/expected/errors.out
----------------------------------------------------------------------
diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out
index 2e53cdc..ebb70aa 100755
--- a/src/test/regress/expected/errors.out
+++ b/src/test/regress/expected/errors.out
@@ -483,9 +483,13 @@ create function infinite_recurse() returns int as
-- # mpp-2756
-- m/(ERROR|WARNING|CONTEXT|NOTICE):.*stack depth limit exceeded\s+at\s+character/
-- s/\s+at\s+character.*//
+-- m/ERROR:.*GPDB exception. Aborting GPORCA.*/
+-- s/ERROR:.*GPDB exception. Aborting GPORCA.*//
-- end_matchsubs
+-- start_ignore
select infinite_recurse();
ERROR: stack depth limit exceeded
+-- end_ignore
select 1; -- test that this works
?column?
----------
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/test/regress/expected/gp_optimizer.out
----------------------------------------------------------------------
diff --git a/src/test/regress/expected/gp_optimizer.out b/src/test/regress/expected/gp_optimizer.out
index fd3a686..4da8197 100644
--- a/src/test/regress/expected/gp_optimizer.out
+++ b/src/test/regress/expected/gp_optimizer.out
@@ -8730,6 +8730,41 @@ drop role unpriv;
drop table can_set_tag_target;
drop table can_set_tag_audit;
+reset optimizer_segments;
+-- Check if ORCA can handle GPDB's error properly
+drop table if exists orca_exc_handle;
+NOTICE: table "orca_exc_handle" does not exist, skipping
+create table orca_exc_handle(
+ a int primary key,
+ b char
+);
+NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "orca_exc_handle_pkey" for table "orca_exc_handle"
+insert into orca_exc_handle select i, i from generate_Series(1,4) as i;
+-- enable the fault injector
+--start_ignore
+\! gpfaultinjector -f opt_relcache_translator_catalog_access -y error --seg_dbid 1
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Starting gpfaultinjector with args: -f opt_relcache_translator_catalog_access -y error --seg_dbid 1
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-local Greenplum Version: 'postgres (Greenplum Database) 4.3.99.00 build dev'
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Obtaining Segment details from master...
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Injecting fault on 1 segment(s)
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Injecting fault on krajaraman:/Users/krajaraman/gitdev/gpdb64/gpAux/gpdemo/datadirs/qddir/demoDataDir-1:content=-1:dbid=1:mode=s:status=u
+20160425:14:59:22:001357 gpfaultinjector:krajaraman:krajaraman-[INFO]:-DONE
+--end_ignore
+select a from orca_exc_handle;
+ERROR: fault triggered, fault name:'opt_relcache_translator_catalog_access' fault type:'error' (faultinjector.c:671)
+ERROR: GPDB exception. Aborting GPORCA plan generation. (CGPOptimizer.cpp:66)
+-- reset the fault injector
+--start_ignore
+\! gpfaultinjector -f opt_relcache_translator_catalog_access -y reset --seg_dbid 1
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Starting gpfaultinjector with args: -f opt_relcache_translator_catalog_access -y reset --seg_dbid 1
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-local Greenplum Version: 'postgres (Greenplum Database) 4.3.99.00 build dev'
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Obtaining Segment details from master...
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Injecting fault on 1 segment(s)
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-Injecting fault on krajaraman:/Users/krajaraman/gitdev/gpdb64/gpAux/gpdemo/datadirs/qddir/demoDataDir-1:content=-1:dbid=1:mode=s:status=u
+20160425:14:59:23:001374 gpfaultinjector:krajaraman:krajaraman-[INFO]:-DONE
+--end_ignore
+drop table orca_exc_handle;
+-- End of Check if ORCA can handle GPDB's error properly
-- clean up
drop schema orca cascade;
NOTICE: drop cascades to table orca.bm_dyn_test_onepart_1_prt_part5
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/f6b76472/src/test/regress/expected/horology.out
----------------------------------------------------------------------
diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out
index 4b79ed8..9786e5a 100755
--- a/src/test/regress/expected/horology.out
+++ b/src/test/regress/expected/horology.out
@@ -10,8 +10,9 @@ INSERT INTO ABSTIME_HOROLOGY_TBL (f1) VALUES ('Jan 14, 1973 03:14:21'),
(abstime 'epoch'),
(abstime 'infinity'),
(abstime '-infinity'),
-(abstime 'May 10, 1947 23:59:12'),
-('Jun 10, 1843');
+(abstime 'May 10, 1947 23:59:12');
+-- orca will fail for this
+INSERT INTO ABSTIME_HOROLOGY_TBL (f1) VALUES('Jun 10, 1843');
CREATE TABLE INTERVAL_HOROLOGY_TBL (f1 interval);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'f1' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.