Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1aaSBY-0002Ia-OD for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Feb 2016 18:04:44 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1aaSBY-0005xL-77 for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Feb 2016 18:04:44 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1aaSBX-0005xF-FN for pgsql-hackers@postgresql.org; Mon, 29 Feb 2016 18:04:43 +0000 Received: from hook.sigaev.ru ([93.180.27.50]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1aaSBT-00060o-Mw for pgsql-hackers@postgresql.org; Mon, 29 Feb 2016 18:04:43 +0000 Received: from xor.sai.msu.ru (newmail.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: teodor) by hook.sigaev.ru (Postfix) with ESMTPSA id 88A65B1918A; Mon, 29 Feb 2016 21:04:38 +0300 (MSK) Subject: Re: POC, WIP: OR-clause support for indexes To: David Rowley Cc: Pgsql Hackers References: <567ED6CA.2040504@sigaev.ru> From: Teodor Sigaev Message-ID: <56D48836.4040301@sigaev.ru> Date: Mon, 29 Feb 2016 21:04:38 +0300 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:42.0) Gecko/20100101 Firefox/42.0 SeaMonkey/2.39 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------080408070102090307000009" X-Pg-Spam-Score: -1.9 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is a multi-part message in MIME format. --------------080408070102090307000009 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit Thank you for review! > I'd like to see comments too! but more so in the code. :) I've had a look over > this, and it seems like a great area in which we could improve on, and your > reported performance improvements are certainly very interesting too. However > I'm finding the code rather hard to follow, which might be a combination of my > lack of familiarity with the index code, but more likely it's the lack of I've added comments, fixed a found bugs. > comments to explain what's going on. Let's just take 1 function as an example: > > Here there's not a single comment, so I'm just going to try to work out what's > going on based on the code. > > +static void > +compileScanKeys(IndexScanDesc scan) > +{ > +GISTScanOpaqueso = (GISTScanOpaque) scan->opaque; > +int*stack, > +stackPos = -1, > +i; > + > +if (scan->numberOfKeys <= 1 || so->useExec == false) > +return; > + > +Assert(scan->numberOfKeys >=3); > > Why can numberOfKeys never be 2? I looked at what calls this and I can't really Because here they are actually an expression, expression could contain 1 or tree or more nodes but could not two (operation AND/OR plus two arguments) > work it out. I'm really also not sure what useExec means as there's no comment fixed. If useExec == false then SkanKeys are implicitly ANDed and stored in just array. > in that struct member, and what if numberOfKeys == 1 and useExec == false, won't > this Assert() fail? If that's not a possible situation then why not? fixed > +ScanKey key = scan->keyData + i; > Is there a reason not to use keyData[i]; ? That's the same ScanKey key = &scan->keyData[i]; I prefer first form as more clear but I could be wrong - but there are other places in code where pointer arithmetic is used. > +if (stackPos >= 0 && (key->sk_flags & (SK_OR | SK_AND))) > +{ > +Assert(stackPos >= 1 && stackPos < scan->numberOfKeys); > stackPos >= 1? This seems unnecessary and confusing as the if test surely makes > that impossible. > + > +so->leftArgs[i] = stack[stackPos - 1]; > Something is broken here as stackPos can be 0 (going by the if() not the > Assert()), therefore that's stack[-1]. fixed > stackPos is initialised to -1, so this appears to always skip the first element > of the keyData array. If that's really the intention, then wouldn't it be better > to just make the initial condition of the for() look i = 1 ? done > I'd like to review more, but it feels like a job that's more difficult than it > needs to be due to lack of comments. > > Would it be possible to update the patch to try and explain things a little better? Hope, I made cleaner.. -- Teodor Sigaev E-mail: teodor@sigaev.ru WWW: http://www.sigaev.ru/ --------------080408070102090307000009 Content-Type: application/x-gzip; name="index_or-2.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="index_or-2.patch.gz" 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 vvr9IAWch7JuJr/cVIozPVhEbQNz/TXX5IGWhN8GHfsjVug39PkjVuj4j1ih P2KF/ogV+q3HCj1aJpr1eYDiH6ecxBK+5KXescsl208/AIDiDbTd+qjf7ow2 ZPtxeihI8OPUoVSaDY9SacKfBoUfff/2a1TFTMonnCzKB5y16flzHX0kjzin txy/3TIPJ/YriTiDxSKSC9P9mVYaN/eyDGbvPLwq78dV4OV0pb66SHTQR0oO uv/7zvv5mXJr/n6za/4Ohvh7Tkn4+xjmZprtZEJbQ7vT9XQ270mvA/JerTZp NjtjL+fqhs09raHlmbqUp75HMaX4p9lBmv5oLE792unWfuWEa7/Ue35zSb1+ tcxSnzeRzWfo8uEZe36HU33UTCr7O+RS6XhNJHHozfb629r5X64x82/TnqL6 P6UDsmR9SgfrPBWfJT77V4wm+jW9fL8z06d6hBMvvK2a5D/roJ1ux8MoLwvO oux4aObTuiB4fVoXRYdqfrlzM5+jz99a5Oqv+OrfXDjOr/hutZs3n2lEi66z 7Hoe3tm8A41ID949JifkDafxmajOY4sDa5nx/yciA35n41U7G3P/X3eZzpfR jgEA --------------080408070102090307000009 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --------------080408070102090307000009--