Fix an assertion failure
authorPavan Deolasee <[email protected]>
Tue, 21 Aug 2018 11:53:18 +0000 (17:23 +0530)
committerPavan Deolasee <[email protected]>
Tue, 21 Aug 2018 12:17:41 +0000 (17:47 +0530)
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/util/tlist.c
src/test/regress/expected/xl_misc.out
src/test/regress/sql/xl_misc.sql

index cae36be417db99622a77514d146aefc2e1ef007c..1fb8d3108096e7b53f6fca13e3ebe399e384347c 100644 (file)
@@ -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;
index 934589138040498824054b2b772517a59dec65c2..c311cce11aa057660cb740ac6a744977b3a9fedf 100644 (file)
@@ -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);
index e3202e39c073e2efb906b7cc32e9cce1785c56e4..bc435893aca7eb49b9396abd180478f88a483119 100644 (file)
@@ -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)
+
index 30351efe9f54b34383d1530313e18dfde0b57618..9201486c8abe213083d9c52d0bc05c962eef8755 100644 (file)
@@ -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;