Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jkjHD-0007vF-PL for pgsql-hackers@arkaria.postgresql.org; Mon, 15 Jun 2020 07:11:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1jkjHC-0008WF-6f for pgsql-hackers@arkaria.postgresql.org; Mon, 15 Jun 2020 07:11:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jkjHB-0008W0-9h for pgsql-hackers@lists.postgresql.org; Mon, 15 Jun 2020 07:11:25 +0000 Received: from forward3-smtp.messagingengine.com ([66.111.4.237]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jkjH7-0005ZO-Uv for pgsql-hackers@postgresql.org; Mon, 15 Jun 2020 07:11:24 +0000 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailforward.nyi.internal (Postfix) with ESMTP id 9A21019407A5 for ; Mon, 15 Jun 2020 03:11:19 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Mon, 15 Jun 2020 03:11:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-me-proxy:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; bh=ZECyhe6LY5DkNU9ZXRYOwaucgqYa9 9fd0CQwFkB9OH4=; b=DjYQvoVCtOnm2RAo7++ETjkZucfsMnvPxf0QhAJ1PJreo 8HaKSRe3QNLnzG9f5gawuIM3qTtIO4gziKJl76Pggk3zk9vyV+C8dRBz1CYwKqjI 8NxM05rY1zHvv4iXCpfTFD9lgqoKUppa2qwiqFS1IH6cRmZb24P8LBJeN9zNheqH KLp4xAspGk/aj2dI0U7/B3dEbHM7MHDbQ5F1GRLgaUfyBmeF00j3u/w+PPKJJUf8 GaIh/kFKSfM3ETItrNtX9CVUxVJ8x+DezMCHJNXBsN9A6ZyCZrj1vCl4QK12gqZh 1Ur/3o9Oi/umVGOm5Cmj7K7SypaUCiOuYQNcHUQxg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduhedrudeijedguddukecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhephffuvfhokffffgggtgesmhdtre ertdefjeenucfhrhhomheprfgvthgvrhcugfhishgvnhhtrhgruhhtuceophgvthgvrhdr vghishgvnhhtrhgruhhtsedvnhguqhhurggurhgrnhhtrdgtohhmqeenucggtffrrghtth gvrhhnpeegtdduteekveehleeiffehhfeileevgeefveekuefgkeevtddvheekleeuueev tdenucffohhmrghinhepphhoshhtghhrvghsqhhlrdhorhhgpddvnhguqhhurggurhgrnh htrdgtohhmnecukfhppeelfedrvdegfedrkedvrddvgeeinecuvehluhhsthgvrhfuihii vgeptdenucfrrghrrghmpehmrghilhhfrhhomhepphgvthgvrhdrvghishgvnhhtrhgruh htsedvnhguqhhurggurhgrnhhtrdgtohhm X-ME-Proxy: Received: from april.pezone.net (p5df352f6.dip0.t-ipconnect.de [93.243.82.246]) by mail.messagingengine.com (Postfix) with ESMTPA id 7610C30618BF for ; Mon, 15 Jun 2020 03:11:18 -0400 (EDT) From: Peter Eisentraut Subject: factorial of negative numbers To: pgsql-hackers Organization: 2ndQuadrant Message-ID: <6ce1df0e-86a3-e544-743a-f357ff663f68@2ndquadrant.com> Date: Mon, 15 Jun 2020 09:11:16 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------5311390283562CCE15580C6F" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------5311390283562CCE15580C6F Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Adjacent to the discussion in [0] I wanted to document the factorial() function and expand the tests for that slightly with some edge cases. I noticed that the current implementation returns 1 for the factorial of all negative numbers: SELECT factorial(-4); factorial ----------- 1 While there are some advanced mathematical constructions that define factorials for negative numbers, they certainly produce different answers than this. Curiously, before the reimplementation of factorial using numeric (04a4821adef38155b7920ba9eb83c4c3c29156f8), it returned 0 for negative numbers, which is also not correct by any theory I could find. I propose to change this to error out for negative numbers. See attached patches for test and code changes. [0]: https://www.postgresql.org/message-id/flat/38ca86db-42ab-9b48-2902-337a0d6b8311%402ndquadrant.com -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------5311390283562CCE15580C6F Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-doc-Document-factorial-function.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-doc-Document-factorial-function.patch" RnJvbSA3MDBmNjYxOGZkYmQ3MmRlZmNmY2Q1OTdhMDA2OTBjZTMwZTdkYmExIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxNSBKdW4gMjAyMCAwODo1MTo0NiArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggMS8zXSBkb2M6IERvY3VtZW50IGZhY3RvcmlhbCBmdW5jdGlvbgoKVGhpcyBo YXMgZXhpc3RlZCBmb3IgYSB2ZXJ5IGxvbmcgdGltZSwgZXF1aXZhbGVudCB0byB0aGUgISBh bmQgISEKb3BlcmF0b3JzLCBidXQgaXQgd2FzIG5ldmVyIGRvY3VtZW50ZWQuCi0tLQogZG9j L3NyYy9zZ21sL2Z1bmMuc2dtbCB8IDE3ICsrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hh bmdlZCwgMTcgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5j LnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCmluZGV4IGI2NWFhMjhmMzQuLjUwMDZj MzVmYjcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKKysrIGIvZG9jL3Ny Yy9zZ21sL2Z1bmMuc2dtbApAQCAtMTM0Nyw2ICsxMzQ3LDIzIEBAIDx0aXRsZT5NYXRoZW1h dGljYWwgRnVuY3Rpb25zPC90aXRsZT4KICAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAg IDwvcm93PgogCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxl X2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRl cm0+CisgICAgICAgICA8cHJpbWFyeT5mYWN0b3JpYWw8L3ByaW1hcnk+CisgICAgICAgIDwv aW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+ZmFjdG9yaWFsPC9mdW5jdGlvbj4gKCA8 dHlwZT5udW1lcmljPC90eXBlPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5udW1lcmljPC9y ZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIEZh Y3RvcmlhbAorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgPGxpdGVy YWw+ZmFjdG9yaWFsKDUpPC9saXRlcmFsPgorICAgICAgICA8cmV0dXJudmFsdWU+MTIwPC9y ZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgorCiAg ICAgICA8cm93PgogICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFy YSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CiAgICAgICAgIDxpbmRleHRlcm0+Ci0tIAoyLjI3 LjAKCg== --------------5311390283562CCE15580C6F Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0002-Expand-tests-for-factorial.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0002-Expand-tests-for-factorial.patch" RnJvbSA0ZThiMDVkMjA5ZjYxYmUyMjJjN2ViNzc2ZWRmZmEyMDZiNzA2Mjk5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxNSBKdW4gMjAyMCAwODo1OToxOSArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggMi8zXSBFeHBhbmQgdGVzdHMgZm9yIGZhY3RvcmlhbAoKTW92ZSBmcm9tIGlu dDQgdG8gbnVtZXJpYyB0ZXN0LiAgKFRoZXkgd2VyZSBvcmlnaW5hbGx5IGludDQgZnVuY3Rp b25zLApidXQgd2VyZSByZWltcGxlbWVudGVkIGZvciBudW1lcmljIGluCjA0YTQ4MjFhZGVm MzgxNTViNzkyMGJhOWViODNjNGMzYzI5MTU2ZjguKSAgQWRkIHNvbWUgdGVzdHMgZm9yIGVk Z2UKY2FzZXMuCi0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9pbnQ0Lm91dCAgICB8 IDEyIC0tLS0tLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9udW1lcmljLm91dCB8 IDM1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwv aW50NC5zcWwgICAgICAgICB8ICA0IC0tLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvbnVtZXJp Yy5zcWwgICAgICB8IDEwICsrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDQ1IGluc2VydGlv bnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvaW50NC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ludDQub3V0 CmluZGV4IGMzODRhZjE4ZWUuLjc3ZjQzNzM5YTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvaW50NC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9pbnQ0Lm91dApAQCAtMjk5LDE4ICsyOTksNiBAQCBTRUxFQ1QgaW50NCAnMTAwMCcgPCBp bnQ0ICc5OTknIEFTIGZhbHNlOwogIGYKICgxIHJvdykKIAotU0VMRUNUIDQhIEFTIHR3ZW50 eV9mb3VyOwotIHR3ZW50eV9mb3VyIAotLS0tLS0tLS0tLS0tLQotICAgICAgICAgIDI0Ci0o MSByb3cpCi0KLVNFTEVDVCAhITMgQVMgc2l4OwotIHNpeCAKLS0tLS0tCi0gICA2Ci0oMSBy b3cpCi0KIFNFTEVDVCAxICsgMSArIDEgKyAxICsgMSArIDEgKyAxICsgMSArIDEgKyAxIEFT IHRlbjsKICB0ZW4gCiAtLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9udW1lcmljLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbnVtZXJpYy5v dXQKaW5kZXggYzdmZTYzZDAzNy4uMDVlOWEyYjllOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9udW1lcmljLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL251bWVyaWMub3V0CkBAIC0yMzE1LDMgKzIzMTUsMzggQEAgRlJPTSAoVkFMVUVT ICgwOjpudW1lcmljLCAwOjpudW1lcmljKSwKIAogU0VMRUNUIGxjbSg5OTk5ICogKDEwOjpu dW1lcmljKV4xMzEwNjggKyAoMTA6Om51bWVyaWNeMTMxMDY4IC0gMSksIDIpOyAtLSBvdmVy ZmxvdwogRVJST1I6ICB2YWx1ZSBvdmVyZmxvd3MgbnVtZXJpYyBmb3JtYXQKKy0tCistLSBU ZXN0cyBmb3IgZmFjdG9yaWFsCistLQorU0VMRUNUIDQhOworID9jb2x1bW4/IAorLS0tLS0t LS0tLQorICAgICAgIDI0CisoMSByb3cpCisKK1NFTEVDVCAhITM7CisgP2NvbHVtbj8gCist LS0tLS0tLS0tCisgICAgICAgIDYKKygxIHJvdykKKworU0VMRUNUIGZhY3RvcmlhbCgxNSk7 CisgICBmYWN0b3JpYWwgICAKKy0tLS0tLS0tLS0tLS0tLQorIDEzMDc2NzQzNjgwMDAKKygx IHJvdykKKworU0VMRUNUIDEwMDAwMCE7CitFUlJPUjogIHZhbHVlIG92ZXJmbG93cyBudW1l cmljIGZvcm1hdAorU0VMRUNUIDAhOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorICAgICAg ICAxCisoMSByb3cpCisKK1NFTEVDVCBmYWN0b3JpYWwoLTQpOworIGZhY3RvcmlhbCAKKy0t LS0tLS0tLS0tCisgICAgICAgICAxCisoMSByb3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2ludDQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvaW50NC5zcWwK aW5kZXggYTllOTBhOTZjNC4uYjAwYzlkZWEyYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvaW50NC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvaW50NC5zcWwK QEAgLTExNCwxMCArMTE0LDYgQEAgQ1JFQVRFIFRBQkxFIElOVDRfVEJMKGYxIGludDQpOwog CiBTRUxFQ1QgaW50NCAnMTAwMCcgPCBpbnQ0ICc5OTknIEFTIGZhbHNlOwogCi1TRUxFQ1Qg NCEgQVMgdHdlbnR5X2ZvdXI7Ci0KLVNFTEVDVCAhITMgQVMgc2l4OwotCiBTRUxFQ1QgMSAr IDEgKyAxICsgMSArIDEgKyAxICsgMSArIDEgKyAxICsgMSBBUyB0ZW47CiAKIFNFTEVDVCAy ICsgMiAvIDIgQVMgdGhyZWU7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9u dW1lcmljLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL251bWVyaWMuc3FsCmluZGV4IDQx NDc1YTlhMjQuLjQ4M2M4MWI5Y2QgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L251bWVyaWMuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL251bWVyaWMuc3FsCkBA IC0xMTExLDMgKzExMTEsMTMgQEAgQ1JFQVRFIFRBQkxFIG51bV9pbnB1dF90ZXN0IChuMSBu dW1lcmljKTsKICAgICAgICAgICAgICAoNDIzMi44MjA6Om51bWVyaWMsIDEzMi43MjAwMDo6 bnVtZXJpYykpIEFTIHYoYSwgYik7CiAKIFNFTEVDVCBsY20oOTk5OSAqICgxMDo6bnVtZXJp YyleMTMxMDY4ICsgKDEwOjpudW1lcmljXjEzMTA2OCAtIDEpLCAyKTsgLS0gb3ZlcmZsb3cK KworLS0KKy0tIFRlc3RzIGZvciBmYWN0b3JpYWwKKy0tCitTRUxFQ1QgNCE7CitTRUxFQ1Qg ISEzOworU0VMRUNUIGZhY3RvcmlhbCgxNSk7CitTRUxFQ1QgMTAwMDAwITsKK1NFTEVDVCAw ITsKK1NFTEVDVCBmYWN0b3JpYWwoLTQpOwotLSAKMi4yNy4wCgo= --------------5311390283562CCE15580C6F Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0003-Disallow-factorial-of-negative-numbers.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0003-Disallow-factorial-of-negative-numbers.patch" RnJvbSA5YWUwZDExMzVkMGE3NWI0NTYwZjJhNGMyMmJlOGI4YmJmZGUwODAzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxNSBKdW4gMjAyMCAwOTowMjoxNCArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggMy8zXSBEaXNhbGxvdyBmYWN0b3JpYWwgb2YgbmVnYXRpdmUgbnVtYmVycwoK VGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHJldHVybmVkIDEgZm9yIGFsbCBuZWdhdGl2 ZSBudW1iZXJzLCB3aGljaAppcyBub3Qgc2Vuc2libGUgdW5kZXIgYW55IGRlZmluaXRpb24u Ci0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYyAgICAgICB8IDYgKysrKyst CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL251bWVyaWMub3V0IHwgNiArLS0tLS0KIDIg ZmlsZXMgY2hhbmdlZCwgNiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvbnVtZXJpYy5jCmluZGV4IGVlYTQyMzk4NTQuLmY0ZmI0Mzg2NjkgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMKKysrIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L251bWVyaWMuYwpAQCAtMjk0Niw3ICsyOTQ2LDExIEBAIG51bWVyaWNf ZmFjKFBHX0ZVTkNUSU9OX0FSR1MpCiAJTnVtZXJpY1ZhcglmYWN0OwogCU51bWVyaWNWYXIJ cmVzdWx0OwogCi0JaWYgKG51bSA8PSAxKQorCWlmIChudW0gPCAwKQorCQllcmVwb3J0KEVS Uk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfTlVNRVJJQ19WQUxVRV9PVVRfT0ZfUkFOR0Up LAorCQkJCSBlcnJtc2coImZhY3RvcmlhbCBvZiBuZWdhdGl2ZSBudW1iZXJzIGlzIHVuZGVm aW5lZCIpKSk7CisJaWYgKG51bSA9PSAwIHx8IG51bSA9PSAxKQogCXsKIAkJcmVzID0gbWFr ZV9yZXN1bHQoJmNvbnN0X29uZSk7CiAJCVBHX1JFVFVSTl9OVU1FUklDKHJlcyk7CmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL251bWVyaWMub3V0IGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9udW1lcmljLm91dAppbmRleCAwNWU5YTJiOWU5Li5jZmY5 Y2RlNWU4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL251bWVyaWMu b3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbnVtZXJpYy5vdXQKQEAgLTIz NDUsOCArMjM0NSw0IEBAIFNFTEVDVCAwITsKICgxIHJvdykKIAogU0VMRUNUIGZhY3Rvcmlh bCgtNCk7Ci0gZmFjdG9yaWFsIAotLS0tLS0tLS0tLS0KLSAgICAgICAgIDEKLSgxIHJvdykK LQorRVJST1I6ICBmYWN0b3JpYWwgb2YgbmVnYXRpdmUgbnVtYmVycyBpcyB1bmRlZmluZWQK LS0gCjIuMjcuMAoK --------------5311390283562CCE15580C6F--