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;
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);
(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)
+
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;