We haven't heard anything from Horiguchi-san and Hanada-san for almost a week. So, I am fine marking it as "ready for committer". What do you say?
On Wed, Dec 10, 2014 at 8:48 AM, Etsuro Fujita <fujita.ets...@lab.ntt.co.jp> wrote: > Hi Ashutosh, > > Thanks for the review! > > (2014/11/28 18:14), Ashutosh Bapat wrote: > >> On Thu, Nov 27, 2014 at 3:52 PM, Etsuro Fujita >> <fujita.ets...@lab.ntt.co.jp <mailto:fujita.ets...@lab.ntt.co.jp>> wrote: >> (2014/11/17 17:55), Ashutosh Bapat wrote: >> Here are my review comments for patch fdw-inh-3.patch. >> > > Tests >> ------- >> 1. It seems like you have copied from testcase inherit.sql to >> postgres_fdw testcase. That's a good thing, but it makes the >> test quite >> long. May be we should have two tests in postgres_fdw contrib >> module, >> one for simple cases, and other for inheritance. What do you say? >> > > IMO, the test is not so time-consuming, so it doesn't seem worth >> splitting it into two. >> > > I am not worried about the timing but I am worried about the length of >> the file and hence ease of debugging in case we find any issues there. >> We will leave that for the commiter to decide. >> > > OK > > > Documentation >> -------------------- >> 1. The change in ddl.sgml >> - We will refer to the child tables as partitions, though >> they >> - are in every way normal <productname>PostgreSQL</> >> tables. >> + We will refer to the child tables as partitions, though >> we assume >> + that they are normal <productname>PostgreSQL</> tables. >> >> adds phrase "we assume that", which confuses the intention >> behind the >> sentence. The original text is intended to highlight the >> equivalence >> between "partition" and "normal table", where as the addition >> esp. the >> word "assume" weakens that equivalence. Instead now we have to >> highlight >> the equivalence between "partition" and "normal or foreign >> table". The >> wording similar to "though they are either normal or foreign >> tables" >> should be used there. >> > > You are right, but I feel that there is something out of place in >> saying that there (5.10.2. Implementing Partitioning) because the >> procedure there has been written based on normal tables only. Put >> another way, if we say that, I think we'd need to add more docs, >> describing the syntax and/or the corresponding examples for >> foreign-table cases. But I'd like to leave that for another patch. >> So, how about the wording "we assume *here* that", instead of "we >> assume that", as I added the following notice in the previous >> section (5.10.1. Overview)? >> >> @@ -2650,7 +2669,10 @@ VALUES ('Albany', NULL, NULL, 'NY'); >> table of a single parent table. The parent table itself is >> normally >> empty; it exists just to represent the entire data set. You >> should be >> familiar with inheritance (see <xref linkend="ddl-inherit">) >> before >> - attempting to set up partitioning. >> + attempting to set up partitioning. (The setup and management of >> + partitioned tables illustrated in this section assume that each >> + partition is a normal table. However, you can do that in a >> similar way >> + for cases where some or all partitions are foreign tables.) >> > > This looks ok, though, I would like to see final version of the >> document. But I think, we will leave that for committer to handle. >> > > OK > > 2. The wording "some kind of optimization" gives vague picture. >> May be >> it can be worded as "Since the constraints are assumed to be >> true, they >> are used in constraint-based query optimization like constraint >> exclusion for partitioned tables.". >> + Those constraints are used in some kind of query >> optimization such >> + as constraint exclusion for partitioned tables (see >> + <xref linkend="ddl-partitioning">). >> > > Will follow your revision. >> > > Done. > > Code >> ------- >> 1. In the following change >> +/* >> * acquire_inherited_sample_rows -- acquire sample rows from >> inheritance tree >> * >> * This has the same API as acquire_sample_rows, except that >> rows are >> * collected from all inheritance children as well as the >> specified table. >> - * We fail and return zero if there are no inheritance children. >> + * We fail and return zero if there are no inheritance children >> or >> there are >> + * inheritance children that foreign tables. >> >> The addition should be "there are inheritance children that *are >> all >> *foreign tables. Note the addition "are all". >> > > Sorry, I incorrectly wrote the comment. What I tried to write is >> "We fail and return zero if there are no inheritance children or if >> we are not in VAC_MODE_SINGLE case and inheritance tree contains at >> least one foreign table.". >> > > You might want to use "English" description of VAC_MODE_SINGLE instead >> of that macro in the comment, so that reader doesn't have to look up >> VAC_MODE_SINGLE. But I think, we will leave this for the committer. >> > > I corrected the comments and translated the macro into the English > description. > > 2. The function has_foreign() be better named >> has_foreign_child()? This >> > > How about "has_foreign_table"? >> > > has_foreign_child() would be better, since these are "children" in the >> inheritance hierarchy and not mere "table"s. >> > > Done. But I renamed it to has_foreign_children() because it sounds more > natural at least to me. > > function loops through all the tableoids passed even after it >> has found >> a foreign table. Why can't we return true immediately after >> finding the >> first foreign table, unless the side effects of heap_open() on >> all the >> table are required. But I don't see that to be the case, since >> these >> tables are locked already through a previous call to >> heap_open(). In the >> > > Good catch! Will fix. >> > > same function instead of argument name parentrelId may be we >> should use >> name parent_oid, so that we use same notation for parent and >> child table >> OIDs. >> > > Will fix. >> > > Done. > > 3. Regarding enum VacuumMode - it's being used only in case of >> acquire_inherited_sample_rows(__) and that too, to check only a >> single >> value of the three defined there. May be we should just infer >> that value >> inside acquire_inherited_sample_rows(__) or pass a boolean true >> or false >> from do_analyse_rel() based on the VacuumStmt. I do not see need >> for a >> separate three value enum of which only one value is used and >> also to >> pass it down from vacuum() by changing signatures of the minion >> functions. >> > > I introduced that for possible future use. See the discussion in [1]. >> > > Will leave it for the commiter to decide. >> > > I noticed that the signatures need not to be modified, as you said. Thanks > for pointing that out! So, I revised the patch not to change the > signatures, though I left the enum, renaming it to AnalyzeMode. Let's have > the committer's review. > > 4. In postgresGetForeignPlan(), the code added by this patch is >> required >> to handle the case when the row mark is placed on a parent table >> and >> hence is required to be applied on the child table. We need a >> comment >> explaining this. Otherwise, the three step process to get the >> row mark >> information isn't clear for a reader. >> > > Will add the comment. >> > > Done. > > 5. In expand_inherited_rtentry() why do you need a separate >> variable >> hasForeign? Instead of using that variable, you can actually >> set/reset >> rte->hasForeign since existence of even a single foreign child >> would >> mark that member as true. - After typing this, I got the answer >> when I >> looked at the function code. Every child's RTE is initially a >> copy of >> parent's RTE and hence hasForeign status would be inherited by >> every >> child after the first foreign child. I think, this reasoning >> should be >> added as comment before assignment to rte->hasForeign at the end >> of the >> function. >> > > As you mentioned, I think we could set rte->hasForeign directly >> during the scan for the inheritance set, without the separate >> variable, hasForeign. But ISTM that it'd improve code readability >> to set rte->hasForeign using the separate variable at the end of the >> function because rte->hasForeign has its meaning only when rte->inh >> is true and because we know whether rte->inh is true, at the end of >> the function. >> > > Fine. Please use "hasForeignChild" instead of just "hasForeign" without >> a clue as to what is "foreign" here. >> > > Done. But I renamed it to "hasForeignChildren". > > 6. The tests in foreign_data.sql are pretty extensive. Thanks >> for that. >> I think, we should also check the effect of each of the following >> command using \d on appropriate tables. >> +CREATE FOREIGN TABLE ft2 () INHERITS (pt1) >> + SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" >> 'value'); >> +ALTER FOREIGN TABLE ft2 NO INHERIT pt1; >> +DROP FOREIGN TABLE ft2; >> +CREATE FOREIGN TABLE ft2 ( >> + c1 integer NOT NULL, >> + c2 text, >> + c3 date >> +) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" >> 'value'); >> +ALTER FOREIGN TABLE ft2 INHERIT pt1; >> > > Will fix. >> > > Done. > > Apart from the above, I noticed that the patch doesn't consider to >> call ExplainForeignModify during EXPLAIN for an inherited >> UPDATE/DELETE, as shown below (note that there are no UPDATE remote >> queries displayed): >> > > Since there seems to be no objections, I updated the patch as proposed > upthread. Here is an example. > > postgres=# explain (format text, verbose) update parent as p set a = a * 2 > returning *; > QUERY PLAN > ------------------------------------------------------------ > -------------------- > Update on public.parent p (cost=0.00..202.33 rows=11 width=10) > Output: p.a > For public.ft1 p_1 > Remote SQL: UPDATE public.mytable_1 SET a = $2 WHERE ctid = $1 > RETURNING a > For public.ft2 p_2 > Remote SQL: UPDATE public.mytable_2 SET a = $2 WHERE ctid = $1 > RETURNING a > -> Seq Scan on public.parent p (cost=0.00..0.00 rows=1 width=10) > Output: (p.a * 2), p.ctid > -> Foreign Scan on public.ft1 p_1 (cost=100.00..101.16 rows=5 > width=10) > Output: (p_1.a * 2), p_1.ctid > Remote SQL: SELECT a, ctid FROM public.mytable_1 FOR UPDATE > -> Foreign Scan on public.ft2 p_2 (cost=100.00..101.16 rows=5 > width=10) > Output: (p_2.a * 2), p_2.ctid > Remote SQL: SELECT a, ctid FROM public.mytable_2 FOR UPDATE > (14 rows) > > Other changes: > * revised regression tests for contrib/file_fdw to refer to tableoid. > * revised docs a bit further. > > Attached are updated patches. Patch fdw-inh-5.patch has been created on > top of patch fdw-chk-5.patch. Patch fdw-chk-5.patch is basically the same > as the previous one fdw-chk-4.patch, but I slightly modified that one. The > changes are the following. > * added to foreign_data.sql more tests for your comments. > * revised docs on ALTER FOREIGN TABLE a bit further. > > > Thanks, > > Best regards, > Etsuro Fujita > -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company