From: Pavan Deolasee Date: Tue, 21 Aug 2018 11:53:18 +0000 (+0530) Subject: Fix an assertion failure X-Git-Tag: XL_10_R1BETA1~27 X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=8b7812e97db30f97ca48c892f7a8d974f5aab00b;p=postgres-xl.git Fix an assertion failure --- diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index cae36be417..1fb8d31080 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -5589,8 +5589,11 @@ make_remotesubplan(PlannerInfo *root, foreach(lc, lefttree->targetlist) { TargetEntry *tle = (TargetEntry *) lfirst(lc); + Expr *tleExpr = tle->expr; - if (equal(tle->expr, expr)) + if (IsA(tle->expr, RelabelType)) + tleExpr = ((RelabelType *)tle->expr)->arg; + if (equal(tleExpr, expr)) { node->distributionKey = tle->resno; break; diff --git a/src/backend/optimizer/util/tlist.c b/src/backend/optimizer/util/tlist.c index 9345891380..c311cce11a 100644 --- a/src/backend/optimizer/util/tlist.c +++ b/src/backend/optimizer/util/tlist.c @@ -323,7 +323,12 @@ apply_tlist_labeling(List *dest_tlist, List *src_tlist) ListCell *ld, *ls; - Assert(list_length(dest_tlist) == list_length(src_tlist)); + /* + * XL planner may add junk attributes to the RemoteSubplan, so the + * dest_tlist may have more entries than the src_tlist. Doesn't matter + * because the forboth loop ends when any of the lists finishes. + */ + Assert(list_length(dest_tlist) >= list_length(src_tlist)); forboth(ld, dest_tlist, ls, src_tlist) { TargetEntry *dest_tle = (TargetEntry *) lfirst(ld); diff --git a/src/test/regress/expected/xl_misc.out b/src/test/regress/expected/xl_misc.out index e3202e39c0..bc435893ac 100644 --- a/src/test/regress/expected/xl_misc.out +++ b/src/test/regress/expected/xl_misc.out @@ -331,3 +331,38 @@ select pg_relation_size('"tab_SIZE"'); (1 row) drop table "schema_SIZE"."tab_SIZE"; +-- a test known to crash (before it was fixed) +CREATE TEMPORARY TABLE empsalary ( + depname varchar, + empno bigint, + salary int, + enroll_date date +); +INSERT INTO empsalary VALUES +('develop', 10, 5200, '2007-08-01'), +('sales', 1, 5000, '2006-10-01'), +('personnel', 5, 3500, '2007-12-10'), +('sales', 4, 4800, '2007-08-08'), +('personnel', 2, 3900, '2006-12-23'), +('develop', 7, 4200, '2008-01-01'), +('develop', 9, 4500, '2008-01-01'), +('sales', 3, 4800, '2007-08-01'), +('develop', 8, 6000, '2006-10-01'), +('develop', 11, 5200, '2007-08-15'); +CREATE TEMPORARY TABLE t1_tmp (depname text, empno int, salary int, sum int); +INSERT INTO t1_tmp SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT * FROM t1_tmp ORDER BY empno; + depname | empno | salary | sum +-----------+-------+--------+------- + sales | 1 | 5000 | 14600 + personnel | 2 | 3900 | 7400 + sales | 3 | 4800 | 14600 + sales | 4 | 4800 | 14600 + personnel | 5 | 3500 | 7400 + develop | 7 | 4200 | 25100 + develop | 8 | 6000 | 25100 + develop | 9 | 4500 | 25100 + develop | 10 | 5200 | 25100 + develop | 11 | 5200 | 25100 +(10 rows) + diff --git a/src/test/regress/sql/xl_misc.sql b/src/test/regress/sql/xl_misc.sql index 30351efe9f..9201486c8a 100644 --- a/src/test/regress/sql/xl_misc.sql +++ b/src/test/regress/sql/xl_misc.sql @@ -186,3 +186,27 @@ select pg_relation_size('"schema_SIZE"."tab_SIZE"'); set search_path to "schema_SIZE"; select pg_relation_size('"tab_SIZE"'); drop table "schema_SIZE"."tab_SIZE"; + +-- a test known to crash (before it was fixed) +CREATE TEMPORARY TABLE empsalary ( + depname varchar, + empno bigint, + salary int, + enroll_date date +); + +INSERT INTO empsalary VALUES +('develop', 10, 5200, '2007-08-01'), +('sales', 1, 5000, '2006-10-01'), +('personnel', 5, 3500, '2007-12-10'), +('sales', 4, 4800, '2007-08-08'), +('personnel', 2, 3900, '2006-12-23'), +('develop', 7, 4200, '2008-01-01'), +('develop', 9, 4500, '2008-01-01'), +('sales', 3, 4800, '2007-08-01'), +('develop', 8, 6000, '2006-10-01'), +('develop', 11, 5200, '2007-08-15'); + +CREATE TEMPORARY TABLE t1_tmp (depname text, empno int, salary int, sum int); +INSERT INTO t1_tmp SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary; +SELECT * FROM t1_tmp ORDER BY empno;