From: | Etsuro Fujita <fujita(dot)etsuro(at)lab(dot)ntt(dot)co(dot)jp> |
---|---|
To: | Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com> |
Cc: | Rajkumar Raghuwanshi <rajkumar(dot)raghuwanshi(at)enterprisedb(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Expression errors with "FOR UPDATE" and postgres_fdw with partition wise join enabled. |
Date: | 2018-04-24 11:19:45 |
Message-ID: | 5ADF12D1.1030406@lab.ntt.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
(2018/04/17 19:00), Etsuro Fujita wrote:
> (2018/04/17 18:43), Ashutosh Bapat wrote:
>> Here's updated patch-set.
>
> Will review.
I started reviewing this.
o 0001-Handle-ConvertRowtypeExprs-in-pull_vars_clause.patch:
+ else if (IsA(node, ConvertRowtypeExpr))
+ {
+#ifdef USE_ASSERT_CHECKING
+ ConvertRowtypeExpr *cre = castNode(ConvertRowtypeExpr, node);
+ Var *var;
+
+ /*
+ * ConvertRowtypeExprs only result when parent's whole-row
reference is
+ * translated for a child using adjust_appendrel_attrs(). That
function
+ * does not handle any upper level Var references.
+ */
+ while (IsA(cre->arg, ConvertRowtypeExpr))
+ cre = castNode(ConvertRowtypeExpr, cre->arg);
+ var = castNode(Var, cre->arg);
+ Assert (var->varlevelsup == 0);
+#endif /* USE_ASSERT_CHECKING */
Isn't it better to throw ERROR as in other cases in pull_vars_clause()?
Another thing I noticed about this patch is this:
postgres=# create table prt1 (a int, b int, c varchar) partition by
range (a);
postgres=# create table prt1_p1 partition of prt1 FOR VALUES FROM (0) TO
(250);
postgres=# create table prt1_p2 partition of prt1 FOR VALUES FROM (250)
TO (500)
;
postgres=# insert into prt1 select i, i % 25, to_char(i, 'FM0000') from
generate
_series(0, 499) i where i % 2 = 0;
postgres=# analyze prt1;
postgres=# create table prt2 (a int, b int, c varchar) partition by
range (b);
postgres=# create table prt2_p1 partition of prt2 FOR VALUES FROM (0) TO
(250);
postgres=# create table prt2_p2 partition of prt2 FOR VALUES FROM (250)
TO (500)
;
postgres=# insert into prt2 select i % 25, i, to_char(i, 'FM0000') from
generate
_series(0, 499) i where i % 3 = 0;
postgres=# analyze prt2;
postgres=# update prt1 t1 set c = 'foo' from prt2 t2 where t1::text =
t2::text a
nd t1.a = t2.b;
ERROR: ConvertRowtypeExpr found where not expected
To fix this, I think we need to pass PVC_RECURSE_CONVERTROWTYPES to
pull_vars_clause() in distribute_qual_to_rels() and
generate_base_implied_equalities_no_const() as well.
That's all I have for now. Will continue the review.
Best regards,
Etsuro Fujita
From | Date | Subject | |
---|---|---|---|
Next Message | Andrey Borodin | 2018-04-24 12:16:47 | Re: [HACKERS] Clock with Adaptive Replacement |
Previous Message | Etsuro Fujita | 2018-04-24 11:14:03 | Minor comment update in execPartition.c |