Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id 882A9189E83A; Tue, 10 Apr 2012 14:58:10 -0300 (ADT) Received: from [87.118.86.135] (helo=km31432.keymachine.de) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1SHfKT-0000wp-4c; Tue, 10 Apr 2012 17:58:09 +0000 Received: from localhost.localdomain (unknown [87.242.62.156]) by km31432.keymachine.de (Postfix) with ESMTPSA id ACD0B3900122; Tue, 10 Apr 2012 18:03:32 +0000 (UTC) Message-ID: <4F847453.9060200@cybertec.at> Date: Tue, 10 Apr 2012 19:56:35 +0200 From: Boszormenyi Zoltan User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1 MIME-Version: 1.0 To: Noah Misch , Michael Meskes , Robert Haas , PG Hackers , Heikki Linnakangas , Bruce Momjian Subject: Re: ECPG FETCH readahead References: <4F74409C.3050904@cybertec.at> <20120329170341.GA4142@tornado.leadboat.com> <4F74E6A7.8040204@cybertec.at> <20120407112008.GA2286@feivel.credativ.lan> <20120407155042.GB11987@tornado.leadboat.com> <20120408142501.GA21513@feivel.credativ.lan> <4F81BE55.1010904@cybertec.at> <20120408173859.GA4915@feivel.credativ.lan> <4F83E2B9.3030302@cybertec.at> <20120410143722.GC6129@tornado.leadboat.com> <20120410145501.GA11554@feivel.credativ.lan> In-Reply-To: <20120410145501.GA11554@feivel.credativ.lan> Content-Type: multipart/mixed; boundary="------------050606020106070403080604" X-Host-Lookup-Failed: Reverse DNS lookup failed for 87.118.86.135 (deferred) X-Pg-Spam-Score: -1.1 (-) X-Archive-Number: 201204/504 X-Sequence-Number: 206307 This is a multi-part message in MIME format. --------------050606020106070403080604 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi, 2012-04-10 16:55 keltez=C3=A9ssel, Michael Meskes =C3=ADrta: > On Tue, Apr 10, 2012 at 10:37:22AM -0400, Noah Misch wrote: >>> Only a non-decorated cursor can be overridden, even if >>> a different default readahead window size is specified with >>> e.g. "ecpg -R 8". If ECPGFETCHSZ is not present, 8 will be used, >>> if ECPGFETCHSZ is present, its value will be used. ECPGopen() >>> will need an extra bool argument to distinguish this. >>> >>> Is this acceptable? Noah, Michael? >> Sounds perfect. > Fine by me. > > Michael you commented on "two new options were added and they should be suboptions to -r". I looked at "man getopt_long" to see what I can do about the "-R" option and there seems to be a getsubopt() call which is an extension to getopt_long. My manpage under Fedora 16 says this: NAME getsubopt - parse suboption arguments from a string SYNOPSIS #include int getsubopt(char **optionp, char * const *tokens, char **valuep= ); Feature Test Macro Requirements for glibc (see feature_test_macros(7)= ): getsubopt(): _XOPEN_SOURCE >=3D 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTE= NDED || /* Since glibc 2.12: */ _POSIX_C_SOURCE >=3D 200809L I wonder whether the manual parsing of "-r" suboptions may be rewritten using this function or PostgreSQL supports systems without the above X/Open or POSIX support levels. Anyway, to make it possible to rewrite using the above call, I modified "= -R" and it's now "-r readahead=3Dnumber". Documentation is adjusted. With the above, it would be possible to use a comma separated list of "-r= " suboptions, e.g. "-r prepare,questionmarks,readahead=3D16" in one option. Summary of other changes: - The result set size detection is a suboption of "-r", documentation is = adjusted. - Only undecorated cursors use ECPGFETCHSZ, documentation is adjusted - "ecpg --help says ...default 0 (disabled)..." fixed. - Comment in cursor-readahead.pgc is fixed. - New regression test that exercises ECPGFETCHSZ=3D8 and a "non-readahead= " cursor. The stderr file shows the "fetch forward 8" executed by the ru= ntime. - Also added a note to the documentation about a possible performance tra= p if a previously written ECPG application uses its own custom readahead= via multi-row FETCH statements. This patch should be applied over the two patches I last sent. Best regards, Zolt=C3=A1n B=C3=B6sz=C3=B6rm=C3=A9nyi --=20 ---------------------------------- Zolt=C3=A1n B=C3=B6sz=C3=B6rm=C3=A9nyi Cybertec Sch=C3=B6nig& Sch=C3=B6nig GmbH Gr=C3=B6hrm=C3=BChlgasse 26 A-2700 Wiener Neustadt, Austria Web: http://www.postgresql-support.de http://www.postgresql.at/ --------------050606020106070403080604 Content-Type: application/x-tar; name="ecpg-cursor-readahead-fixes-v3.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ecpg-cursor-readahead-fixes-v3.patch.gz" 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 --------------050606020106070403080604--