X-Original-To: pgsql-patches-postgresql.org@postgresql.org Received: from localhost (wm.hub.org [200.46.204.128]) by postgresql.org (Postfix) with ESMTP id A15FF9FA5FE for ; Mon, 24 Jul 2006 01:57:21 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.128]) (amavisd-new, port 10024) with ESMTP id 03145-10 for ; Mon, 24 Jul 2006 04:57:16 +0000 (UTC) X-Greylist: delayed 00:59:58.87865 by SQLgrey- Received: from joeconway.com (joeconway.com [68.15.9.201]) by postgresql.org (Postfix) with ESMTP id D06769FA433 for ; Mon, 24 Jul 2006 01:57:15 -0300 (ADT) Received: from [192.168.4.40] (account jconway [192.168.4.40] verified) by joeconway.com (CommuniGate Pro SMTP 4.1.8) with ESMTP-TLS id 4090198; Sun, 23 Jul 2006 20:57:15 -0700 Message-ID: <44C4451A.4010906@joeconway.com> Date: Sun, 23 Jul 2006 20:57:14 -0700 From: Joe Conway User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.13) Gecko/20060501 Fedora/1.7.13-1.1.fc5 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Tom Lane CC: Christopher Kings-Lynne , "Patches (PostgreSQL)" , Andrew Dunstan , Bernd Helmle , Peter Eisentraut , Susanne Ebrecht Subject: Values list-of-targetlists patch for comments (was Re: [HACKERS] 8.2 features?) References: <44B69778.5050104@dunslane.net> <50461.84.63.113.55.1152832991.squirrel@pezone.net> <44B7ADFC.90205@dunslane.net> <44BC0432.3040509@joeconway.com> <44BC661F.80609@joeconway.com> <44BCD06C.3060409@calorieking.com> <44BCF1D4.3010807@dunslane.net> <5842.1153246741@sss.pgh.pa.us> <44BD8854.9060506@calorieking.com> <15212.1153279954@sss.pgh.pa.us> <44BDB2F5.7080003@joeconway.com> <44BEA710.6060700@joeconway.com> <23198.1153367887@sss.pgh.pa.us> <44BF0382.2010501@joeconway.com> <23454.1153370214@sss.pgh.pa.us> <44BF122F.1080200@joeconway.com> <23927.1153373971@sss.pgh.pa.us> <44C00E1E.1000405@joeconway.com> <14047.1153442773@sss.pgh.pa.us> In-Reply-To: <14047.1153442773@sss.pgh.pa.us> Content-Type: multipart/mixed; boundary="------------050406070802090403030103" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200607/163 X-Sequence-Number: 20317 This is a multi-part message in MIME format. --------------050406070802090403030103 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Tom Lane wrote: > Joe Conway writes: > >>I'm liking this too. But when you say "jointree node", are you saying to >>model the new node type after NestLoop/MergeJoin/HashJoin nodes? These >>are referred to as "join nodes" in ExecInitNode. Or as you mentioned a >>couple of times, should this look more like an Append node? > > > No, I guess I confused you by talking about the executor representation > at the same time. This is really unrelated to the executor. The join > tree I'm thinking of here is the data structure that dangles off > Query.jointree --- it's a representation of the query's FROM clause, > and (at present) can contain RangeTblRef, FromExpr, and JoinExpr nodes. > See the last hundred or so lines of primnodes.h for some details. > The jointree is used by the planner to compute the plan node tree that > the executor will run, but it's not the same thing. > > There are basically two ways you could go about this: > 1. Make a new jointree leaf node type to represent a VALUES construct, > and dangle the list of lists of expressions off that. > 2. Make a new RangeTblEntry type to represent a VALUES construct, and > just put a RangeTblRef to it into the jointree. The expressions > dangle off the RangeTblEntry. > > Offhand I'm not certain which of these would be cleanest. The second > way has some similarities to the way we handle set operation trees > (UNION et al), so it might be worth looking at that stuff. However, > being a RangeTblEntry has a lot of baggage (eg, various routines expect > to find an RTE alias, column names, column types, etc) and maybe we > don't need all that for VALUES. Since the feature freeze is only about a week off, I wanted to post this patch even though it is not yet ready to be applied. Executive summary: ================== 1. The patch is now large and invasive based on adding new node types and associated infrastructure. I modelled the nodes largely on RangeFunction and FunctionScan. 2. Performance is close enough to mysql to not be a big issue (I think, more data below) as long as the machine does not get into a memory swapping regime. Memory usage is now better, but not as good as mysql. 3. I specifically coded with the intent of preserving current insert statement behavior and code paths for current functionality. So there *should* be no performance degradation or subtle semantics changes for "INSERT DEFAULT VALUES", "INSERT ... VALUES (with one target list)", "INSERT ... SELECT ...". Even Tom's recently discovered "insert into foo values (tenk1.*)" still works ;-) Performance: ============ On my development machine (dual core amd64, 2GB RAM) I get the following results using the php script posted earlier: Postgres: --------- $loopcount = 100000; multi-INSERT-at-once Elapsed time is 1 second $loopcount = 300000; multi-INSERT-at-once Elapsed time is 5 seconds $loopcount = 500000; multi-INSERT-at-once Elapsed time is 9 seconds $loopcount = 800000; multi-INSERT-at-once Elapsed time is 14 seconds $loopcount = 900000; multi-INSERT-at-once Elapsed time is 17 seconds $loopcount = 1000000; multi-INSERT-at-once Elapsed time is 42 seconds $loopcount = 2000000; killed after 5 minutes due to swapping MySQL: ------ $loopcount = 100000; multi-INSERT-at-once Elapsed time is 2 seconds $loopcount = 300000; INSERT failed:Got a packet bigger than 'max_allowed_packet' bytes changed max_allowed_packet=64M multi-INSERT-at-once Elapsed time is 5 seconds $loopcount = 500000; multi-INSERT-at-once Elapsed time is 8 seconds $loopcount = 800000; multi-INSERT-at-once Elapsed time is 13 seconds $loopcount = 900000; multi-INSERT-at-once Elapsed time is 15 seconds $loopcount = 1000000; multi-INSERT-at-once Elapsed time is 17 seconds $loopcount = 2000000; multi-INSERT-at-once Elapsed time is 36 seconds $loopcount = 3000000; multi-INSERT-at-once Elapsed time is 54 seconds $loopcount = 4000000; multi-INSERT-at-once Elapsed time is 134 seconds : ========================== Included in this patch is support for
in the FROM clause, e.g.: regression=# select * from {values (1,array[1,2]),(2,array[3,4])}; ?column? | array ----------+------- 1 | {1,2} 2 | {3,4} (2 rows) The strange syntax is a temporary hack to eliminate shift/reduce conflicts. I'm not entirely sure we want to try to support this (or something like it) for 8.2, but much of what is needed is now readily available. More on known issues next. Known Issues: ============= General: -------- 1. Several comments in the patch are marked "FIXME". These are areas where I was uncertain what was the "right thing to do". Any advice on these specific spots would be very much appreciated. 2. I broke the rules regression test -- still need to look at what I did to mess that up. Somewhere in the reconstruction of "VALUES ..." according to the diff. VALUES multi-targetlist INSERTS: -------------------------------- 3. Not yet quite sure how to get DEFAULT to work for "INSERT ... multi-values". As noted above, works fine if there is only one targetlist.
: -------------------------- 4. I'm getting shift/reduce conflicts that are not easily eliminated. Making VALUES fully reserved only made it 1 shift/reduce conflict. 5. Column aliases are still not working correctly. Haven't really looked closely at this yet. 6. Data types are being deduced currently based on the first row, and not currently getting checked on subsequent rows. So it is easy to induce a crash: regression=# select * from {values (1,array[1,2]),(2,3)}; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. !> 7. In general,
in the FROM clause needs more discussion -- among other things, how should we determine and enforce column types? I think this could be a very useful feature, but I'm not comfortable I understand it yet. ================= As usual, review, advise, comments, flames, etc. requested Joe --------------050406070802090403030103 Content-Type: application/x-gzip; name="multi-insert-r6a.diff.gz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="multi-insert-r6a.diff.gz" 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 AQA= --------------050406070802090403030103--