Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dAFdj-0004pc-37 for pgsql-hackers@arkaria.postgresql.org; Mon, 15 May 2017 13:02:19 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1dAFdi-00078a-5s for pgsql-hackers@arkaria.postgresql.org; Mon, 15 May 2017 13:02:18 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1dAEo0-0004yJ-Nd for pgsql-hackers@postgresql.org; Mon, 15 May 2017 12:08:53 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by makus.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dAEns-00049u-TP for pgsql-hackers@postgresql.org; Mon, 15 May 2017 12:08:51 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id 68CB921C070E; Mon, 15 May 2017 15:08:41 +0300 (MSK) X-Virus-Scanned: Debian amavisd-new at postgrespro.ru MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1494850121; bh=JoA6gca8Kz7XZyhb/MZ3CeQINS4btKo1zucdRn0pLUE=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=bidP+JmBhqLbCq6GQAmxqmydCfcWvzZ0UfbIN7LVUO21oqiRT/qmZ/RS6XzIRGms3 SfOPjL/n1hae5Sz+RP+LG2I59RvbeVopv6cpADa3Z2IL0/0bdDX54dvSkTohomhwvx yYlijp9zxgAzk2A2HA67zi845HnNwxh60LR70xR4= Content-Type: multipart/mixed; boundary="=_03b70e57d1b74d056faecf477a40e643" Date: Mon, 15 May 2017 15:08:40 +0300 From: Sokolov Yura To: Heikki Linnakangas Cc: pgsql-hackers@postgresql.org, Heikki Linnakangas Subject: Re: Small improvement to compactify_tuples Organization: Postgres Professional In-Reply-To: <6d8cd37e-3d78-451e-a9a1-418650397639@iki.fi> References: <3c6ff1d3a2ff429ee80d0031e6c69cb7@postgrespro.ru> <6d8cd37e-3d78-451e-a9a1-418650397639@iki.fi> Message-ID: <0dcb7a5afa3fae6001bd1712253cf81d@postgrespro.ru> X-Sender: funny.falcon@postgrespro.ru User-Agent: Roundcube Webmail/1.2.4 X-Pg-Spam-Score: -2.0 (--) 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 --=_03b70e57d1b74d056faecf477a40e643 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Heikki Linnakangas писал 2017-05-15 12:06: > On 05/14/2017 09:47 PM, Sokolov Yura wrote: >> Good day, everyone. >> >> I've been playing a bit with unlogged tables - just random updates on >> simple >> key-value table. I've noticed amount of cpu spent in a >> compactify_tuples >> (called by PageRepareFragmentaion). Most of time were spent in qsort >> of >> itemidbase items. > > Ah, I played with this too a couple of years ago, see > https://www.postgresql.org/message-id/546B89DE.7030906%40vmware.com, > but got distracted by other things and never got around to commit > that. > >> itemidbase array is bounded by number of tuples in a page, and >> itemIdSortData >> structure is simple, so specialized version could be a better choice. >> >> Attached patch adds combination of one pass of prefix sort with >> insertion >> sort for larger array and shell sort for smaller array. >> Insertion sort and shell sort are implemented as macros and could be >> reused. > > Cool! Could you compare that against the bucket sort I posted in the > above thread, please? > > At a quick glance, your "prefix sort" seems to be the the same > algorithm as the bucket sort that I implemented. You chose 256 > buckets, where I picked 32. And you're adding a shell sort > implementation, for small arrays, while I used a straight insertion > sort. Not sure what these differences mean in practice. > > - Heikki Thank you for attention. My first version of big page sort was almost exactly same to yours. I had a bug in my insertion sort, so I had to refactor it. (bug were fixed) I found that items in itemidbase are almost sorted, so it is important to try keep its order in prefix sort. So I've changed --count[i] to count[i+1]++. And it looks like it is better to have more buckets: - with 256 buckets, size of single bucket is almost always less than 2, so array is almost always sorted after prefix sort pass. But it looks like it is better to sort each bucket separately, as you did, and as it was in my early version. Also I used your names for functions and some comments. I attached new version of the patch. I left memcpy intact cause it looks like it doesn't take noticable cpu time. -- Sokolov Yura aka funny.falcon Postgres Professional: https://postgrespro.ru The Russian PostgreSQL Company --=_03b70e57d1b74d056faecf477a40e643 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-storage-page-bufpage.c-improve-compactify_tuples-v02.patch Content-Disposition: attachment; filename=0001-storage-page-bufpage.c-improve-compactify_tuples-v02.patch; size=6262 RnJvbSA4Zjc1ZmNhYmEwNTkwZDUxNTBkZDk1NmE2MGZlZWU1YzI4ZjRjYWFi IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBTb2tvbG92IFl1cmEg PGZ1bm55LmZhbGNvbkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAxNSBN YXkgMjAxNyAxNDoyMzozOSArMDMwMApTdWJqZWN0OiBbUEFUQ0hdIHN0b3Jh Z2UvcGFnZS9idWZwYWdlLmM6IGltcHJvdmUgY29tcGFjdGlmeV90dXBsZXMK Ckl0ZW1zIHBhc3NlZCB0byBjb21wYWN0aWZ5X3R1cGxlcyBhcmUgYWxtb3N0 IHNvcnRlZC4gU28gY2FsbCB0byBnZW5lcmFsCnFzb3J0IG1ha2VzIHVubmVj ZXNzYXJ5IG92ZXJoZWFkIG9uIGZ1bmN0aW9uIGNhbGxzIChzd2FwZnVuYywg bWVkLAppdGVtb2ZmY29tcGFyZSkuCgpUaGlzIHBhdGNoIGltcGxlbWVudHMg YnVja2V0IHNvcnQ6Ci0gb25lIHBhc3Mgb2Ygc3RhYmxlIHByZWZpeCBzb3J0 IG9uIGhpZ2ggOCBiaXRzIG9mIG9mZnNldAotIGFuZCBpbnNlcnRpb24gc29y dCBmb3IgYnVja2V0cyBsYXJnZXIgdGhhbiAxIGVsZW1lbnQKCkFsc28gZm9y IHNtYWxsZXIgYXJyYXlzIHNoZWxsIHNvcnQgaXMgdXNlZC4KCkluc2VydGlv biBhbmQgU2hlbGwgc29ydCBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgbWFjcm9z ZXMuCgpUaGlzIGFwcHJvYWNoIGFsbG93cyB0byBzYXZlIDMlIG9mIGNwdSBp biBkZWdlbmVyYXRlIGNhc2UKKGhpZ2hseSBpbnRlbnNpdmUgSE9UIHJhbmRv bSB1cGRhdGVzIG9uIHVubG9nZ2VkIHRhYmxlIHdpdGgKIHN5bmNocm9uaXpl ZF9jb21taXQ9b2ZmKSwgYW5kIHNwZWVkcyB1cCBXQUwgcmVwbGF5aW5nIChh cyB3ZXJlCmZvdW5kIGJ5IEhlaWtraSBMaW5uYWthbmdhcykuCgpTYW1lIGFw cHJvYWNoIHdlcmUgaW1wbGVtZW50ZWQgYnkgSGVpa2tpIExpbm5ha2FuZ2Fz IHNvbWUgdGltZSBhZ28gd2l0aApzZXZlcmFsIGRpc3RpbmN0aW9ucy4KLS0t CiBzcmMvYmFja2VuZC9zdG9yYWdlL3BhZ2UvYnVmcGFnZS5jIHwgNzggKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIHNyYy9pbmNs dWRlL2MuaCAgICAgICAgICAgICAgICAgICAgfCA1OSArKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDEzNCBpbnNlcnRp b25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3N0b3JhZ2UvcGFnZS9idWZwYWdlLmMgYi9zcmMvYmFja2VuZC9zdG9y YWdlL3BhZ2UvYnVmcGFnZS5jCmluZGV4IGZkZjA0NWE0NWIuLmM1NjMwZTgw OGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvcGFnZS9idWZw YWdlLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9wYWdlL2J1ZnBhZ2Uu YwpAQCAtNDM0LDYgKzQzNCw3NyBAQCBpdGVtb2ZmY29tcGFyZShjb25zdCB2 b2lkICppdGVtaWRwMSwgY29uc3Qgdm9pZCAqaXRlbWlkcDIpCiB9CiAKIC8q CisgKiBTb3J0IGFuIGFycmF5IG9mIGl0ZW1JZFNvcnQncyBvbiBpdGVtb2Zm LCBkZXNjZW5kaW5nLgorICoKKyAqIEl0IHVzZXMgU2hlbGwgc29ydC4gR2l2 ZW4gYXJyYXkgaXMgc21hbGwgYW5kIGl0ZW1vZmZjb21wYXJlIGlzIGlubGlu ZWQsCisgKiBpdCBpcyBtdWNoIGZhc3RlciB0aGFuIGNhbGwgdG8gcXNvcnQu CisgKi8KK3N0YXRpYyB2b2lkCitzb3J0X2l0ZW1JZHNfc21hbGwoaXRlbUlk U29ydCBpdGVtaWRiYXNlLCBpbnQgbml0ZW1zKQoreworCXBnX3NoZWxsX3Nv cnQoaXRlbUlkU29ydERhdGEsIGl0ZW1pZGJhc2UsIG5pdGVtcywgaXRlbW9m ZmNvbXBhcmUpOworfQorCisvKgorICogU29ydCBhbiBhcnJheSBvZiBpdGVt SWRTb3J0J3Mgb24gaXRlbW9mZiwgZGVzY2VuZGluZy4KKyAqCisgKiBJdCB1 c2VzIGJ1Y2tldCBzb3J0OgorICogLSBzaW5nbGUgcGFzcyBvZiBzdGFibGUg cHJlZml4IHNvcnQgb24gaGlnaCA4IGJpdHMKKyAqIC0gYW5kIGluc2VydGlv biBzb3J0IG9uIGJ1Y2tldHMgbGFyZ2VyIHRoYW4gMSBlbGVtZW50CisgKi8K K3N0YXRpYyB2b2lkCitzb3J0X2l0ZW1JZHMoaXRlbUlkU29ydCBpdGVtaWRi YXNlLCBpbnQgbml0ZW1zKQoreworCWl0ZW1JZFNvcnREYXRhIGNvcHlbTWF4 KE1heEluZGV4VHVwbGVzUGVyUGFnZSwgTWF4SGVhcFR1cGxlc1BlclBhZ2Up XTsKKyNkZWZpbmUgTlNQTElUIDI1NgorI2RlZmluZSBQUkVGRElWIChCTENL U1ogLyBOU1BMSVQpCisJLyogdHdvIGV4dHJhIGVsZW1lbnRzIHRvIGVtdWxh dGUgb2Zmc2V0IG9uIHByZXZpb3VzIHN0ZXAgKi8KKwl1aW50MTYJCWNvdW50 W05TUExJVCArIDJdID0gezB9OworCWludAkJCWksCisJCQkJcG9zLAorCQkJ CWhpZ2hiaXRzOworCisJQXNzZXJ0KG5pdGVtcyA8PSBNYXhJbmRleFR1cGxl c1BlclBhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBuaXRlbXM7IGkrKykKKwl7 CisJCWhpZ2hiaXRzID0gaXRlbWlkYmFzZVtpXS5pdGVtb2ZmIC8gUFJFRkRJ VjsKKwkJY291bnRbaGlnaGJpdHNdKys7CisJfQorCS8qIHNvcnQgaW4gZGVj cmVhc2luZyBvcmRlciAqLworCWZvciAoaSA9IE5TUExJVCAtIDE7IGkgIT0g MDsgaS0tKQorCQljb3VudFtpIC0gMV0gKz0gY291bnRbaV07CisKKwkvKgor CSAqIGNvdW50W2srMV0gaXMgc3RhcnQgb2YgYnVja2V0IGssIGNvdW50W2td IGlzIGVuZCBvZiBidWNrZXQgaywgYW5kCisJICogY291bnRba10gLSBjb3Vu dFtrKzFdIGlzIGxlbmd0aCBvZiBidWNrZXQgay4KKwkgKi8KKwlBc3NlcnQo Y291bnRbMF0gPT0gbml0ZW1zKTsKKwlmb3IgKGkgPSAwOyBpIDwgbml0ZW1z OyBpKyspCisJeworCQloaWdoYml0cyA9IGl0ZW1pZGJhc2VbaV0uaXRlbW9m ZiAvIFBSRUZESVY7CisJCXBvcyA9IGNvdW50W2hpZ2hiaXRzICsgMV07CisJ CWNvdW50W2hpZ2hiaXRzICsgMV0rKzsKKwkJY29weVtwb3NdID0gaXRlbWlk YmFzZVtpXTsKKwl9CisJQXNzZXJ0KGNvdW50WzFdID09IG5pdGVtcyk7CisK KwkvKgorCSAqIGNvdW50W2srMl0gaXMgc3RhcnQgb2YgYnVja2V0IGssIGNv dW50W2srMV0gaXMgZW5kIG9mIGJ1Y2tldCBrLCBhbmQKKwkgKiBjb3VudFtr KzFdLWNvdW50W2srMl0gaXMgbGVuZ3RoIG9mIGJ1Y2tldCBrLgorCSAqLwor CWZvciAoaSA9IE5TUExJVDsgaSA+IDA7IGktLSkKKwl7CisJCWlmIChsaWtl bHkoY291bnRbaV0gLSBjb3VudFtpICsgMV0gPD0gMSkpCisJCQljb250aW51 ZTsKKwkJcGdfaW5zZXJ0aW9uX3NvcnQoaXRlbUlkU29ydERhdGEsCisJCQkJ CQkgIGNvcHkgKyBjb3VudFtpICsgMV0sCisJCQkJCQkgIGNvdW50W2ldIC0g Y291bnRbaSArIDFdLAorCQkJCQkJICBpdGVtb2ZmY29tcGFyZSk7CisJfQor CW1lbWNweShpdGVtaWRiYXNlLCBjb3B5LCBzaXplb2YoaXRlbUlkU29ydERh dGEpICogbml0ZW1zKTsKK30KKworLyoKICAqIEFmdGVyIHJlbW92aW5nIG9y IG1hcmtpbmcgc29tZSBsaW5lIHBvaW50ZXJzIHVudXNlZCwgbW92ZSB0aGUg dHVwbGVzIHRvCiAgKiByZW1vdmUgdGhlIGdhcHMgY2F1c2VkIGJ5IHRoZSBy ZW1vdmVkIGl0ZW1zLgogICovCkBAIC00NDQsOSArNTE1LDEwIEBAIGNvbXBh Y3RpZnlfdHVwbGVzKGl0ZW1JZFNvcnQgaXRlbWlkYmFzZSwgaW50IG5pdGVt cywgUGFnZSBwYWdlKQogCU9mZnNldAkJdXBwZXI7CiAJaW50CQkJaTsKIAot CS8qIHNvcnQgaXRlbUlkU29ydERhdGEgYXJyYXkgaW50byBkZWNyZWFzaW5n IGl0ZW1vZmYgb3JkZXIgKi8KLQlxc29ydCgoY2hhciAqKSBpdGVtaWRiYXNl LCBuaXRlbXMsIHNpemVvZihpdGVtSWRTb3J0RGF0YSksCi0JCSAgaXRlbW9m ZmNvbXBhcmUpOworCWlmIChuaXRlbXMgPiA0OCkKKwkJc29ydF9pdGVtSWRz KGl0ZW1pZGJhc2UsIG5pdGVtcyk7CisJZWxzZQorCQlzb3J0X2l0ZW1JZHNf c21hbGwoaXRlbWlkYmFzZSwgbml0ZW1zKTsKIAogCXVwcGVyID0gcGhkci0+ cGRfc3BlY2lhbDsKIAlmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jLmggYi9zcmMvaW5jbHVkZS9jLmgK aW5kZXggZmJhMDdjNjUxZi4uODM3OTQwZDVjZiAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvYy5oCisrKyBiL3NyYy9pbmNsdWRlL2MuaApAQCAtOTYyLDYg Kzk2Miw2NSBAQCB0eXBlZGVmIE5hbWVEYXRhICpOYW1lOwogI2RlZmluZSB1 bmxpa2VseSh4KSAoKHgpICE9IDApCiAjZW5kaWYKIAorLyoKKyAqIHBnX3No ZWxsX3NvcnQgLSBzb3J0IGZvciBzbWFsbCBhcnJheXMgd2l0aCBpbmxpbmFi bGUgY29tcGFyYXRvci4KKyAqIFNpbmNlIGl0IGlzIGltcGxlbWVudGVkIGFz IGEgbWFjcm9zIGl0IGNvdWxkIGJlIG9wdGltaXplZCB0b2dldGhlciB3aXRo CisgKiBjb21wYXJpc29uIGZ1bmN0aW9uLgorICogR2FwcyBhcmUgImdhcChp KSA9IHNtYWxsZXN0IHByaW1lIG51bWJlciBiZWxvdyBlXmkiLiBUaGV5IGFy ZSBjbG9zZSB0bworICogSW5jZXJwaSAmIFNlZHdpY2sgZ2FwcywgYnV0IGxv b2tzIHRvIGJlIGJldHRlciBpbiBhdmVyYWdlLgorICogSXQgaXMgYmVzdCB1 c2VkIHdpdGggYXJyYXkgc21hbGxlciB0aGFuIDIwMCBlbGVtZW50cywgYW5k IGNvdWxkIGJlIHNhZmVseQorICogdXNlZCB1cHRvIDEwMDAgZWxlbWVudHMu IEJ1dCBpdCBkZWdyYWRlcyBmYXN0IGFmdGVyIHRoYXQsIGFuZCBpdCBpcwor ICogYmV0dGVyIHRvIHVzZSBxc29ydC4KKyAqCisgKiBBcmd1bWVudHM6Cisg KgkgZWxlbV90IC0gdHlwZSBvZiBhcnJheSBlbGVtZW50IChmb3IgZGVjbGFy aW5nIHRlbXBvcmFyeSB2YXJpYWJsZXMpCisgKgkgYXJyYXkJLSBwb2ludGVy IHRvIGVsZW1lbnRzIHRvIGJlIHNvcnRlZAorICoJIG5pdGVtcyAtIGFtb3Vu dCBvZiBlbGVtZW50cyB0byBiZSBzb3J0ZWQKKyAqCSBjbXAJLSBjb21wYXJp c29uIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhZGRyZXNzIG9mIGVsZW1lbnRz CisgKgkJCSAgKGl0IGlzIGNvbXBhdGlibGUgd2l0aCBxc29ydCBjb21wYXJp c29uIGZ1bmN0aW9uKS4KKyAqCSBOb3RlOiBgY21wYCBhcmd1bWVudCBldmFs dWF0ZXMgbWFueSB0aW1lcy4KKyAqCSBPdGhlciBhcmd1bWVudHMgZXZhbHVh dGVzIG9uY2UKKyAqLworI2RlZmluZSBwZ19zaGVsbF9zb3J0X3Bhc3MoZWxl bV90LCBjbXAsIG9mZikgXAorCWRvIHsgXAorCQlpbnQgX2ksIF9qOyBcCisJ CWVsZW1fdCBfdGVtcDsgXAorCQlmb3IgKF9pID0gb2ZmOyBfaSA8IF9uOyBf aSArPSBvZmYpIFwKKwkJeyBcCisJCQlpZiAoKGNtcCkoX2FycitfaSwgX2Fy citfaS1vZmYpID49IDApIFwKKwkJCQljb250aW51ZTsgXAorCQkJX3RlbXAg PSBfYXJyW19pXTsgXAorCQkJX2ogPSBfaTsgXAorCQkJZG8geyBcCisJCQkJ X2Fycltfal0gPSBfYXJyW19qIC0gb2ZmXTsgXAorCQkJCV9qIC09IG9mZjsg XAorCQkJfSB3aGlsZSAoX2ogPj0gb2ZmICYmIChjbXApKF9hcnIrX2otb2Zm LCAmX3RlbXApID4gMCk7IFwKKwkJCV9hcnJbX2pdID0gX3RlbXA7IFwKKwkJ fSBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcGdfc2hlbGxfc29ydChlbGVt X3QsIGFycmF5LCBuaXRlbXMsIGNtcCkgXAorCWRvIHsgXAorCQlpbnQgX24g PSAobml0ZW1zKTsgXAorCQllbGVtX3QqIF9hcnIgPSAoYXJyYXkpOyBcCisJ CXN0YXRpYyBjb25zdCBpbnQgX29mZnNldHNbXSA9IHs0MDEsIDEzOSwgNTMs IDE5LCA3LCAzfTsgXAorCQlpbnQgX25vZmYsIF9vZmY7IFwKKwkJZm9yIChf bm9mZiA9IDA7IF9ub2ZmIDwgbGVuZ3Rob2YoX29mZnNldHMpOyBfbm9mZisr KSB7IFwKKwkJCV9vZmYgPSBfb2Zmc2V0c1tfbm9mZl07IFwKKwkJCXBnX3No ZWxsX3NvcnRfcGFzcyhlbGVtX3QsIChjbXApLCBfb2ZmKTsgXAorCQl9IFwK KwkJcGdfc2hlbGxfc29ydF9wYXNzKGVsZW1fdCwgKGNtcCksIDEpOyBcCisJ fSB3aGlsZSgwKQorLyoKKyAqIHBnX2luc2VydGlvbl9zb3J0IC0ganVzdCBp bnNlcnRpb24gc29ydCBmb3Igc21hbGxlc3QgYXJyYXksIG9yIGlmCisgKiBh cnJheSB3YXMgYWxtb3N0IHNvcnRlZCBhbHJlYWR5LiBVc2VzIHNhbWUgYXJn dW1lbnRzIGFzIHBnX3NoZWxsX3NvcnQuCisgKi8KKyNkZWZpbmUgcGdfaW5z ZXJ0aW9uX3NvcnQoZWxlbV90LCBhcnJheSwgbml0ZW1zLCBjbXApIFwKKwlk byB7IFwKKwkJaW50IF9uID0gKG5pdGVtcyk7IFwKKwkJZWxlbV90KiBfYXJy ID0gKGFycmF5KTsgXAorCQlwZ19zaGVsbF9zb3J0X3Bhc3MoZWxlbV90LCAo Y21wKSwgMSk7IFwKKwl9IHdoaWxlICgwKQorCiAKIC8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KICAqCQkJCVNlY3Rpb24gODoJcmFuZG9tIHN0dWZmCi0tIAoy LjExLjAKCg== --=_03b70e57d1b74d056faecf477a40e643 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 --=_03b70e57d1b74d056faecf477a40e643--