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 1n8Aln-0006un-2U for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Jan 2022 00:48:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1n8All-00010c-4j for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Jan 2022 00:48:41 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1n8Alk-00010T-ID for pgsql-hackers@lists.postgresql.org; Fri, 14 Jan 2022 00:48:40 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1n8Alh-0001BW-KW for pgsql-hackers@lists.postgresql.org; Fri, 14 Jan 2022 00:48:39 +0000 Received: by mail-ed1-x534.google.com with SMTP id u21so29317061edd.5 for ; Thu, 13 Jan 2022 16:48:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:content-language:to:from :subject; bh=xaGehD8HEbQhE8ORJ4FcqKOAyyHHoSNPdrrWuXZx1Qc=; b=HxVtxxsaWhl1ORKstxPE/tyzRKME7WiZiEo4hFZaXWy2xeODQsRGCN9fwaffVFlego gKzD+ZKljZ8mvESm3kF5wyCTF76F0j/mUq0VEDjeMtmSmueiRNWYUvB1mKSyMgUU/+DH 5R1HGyT+LlC/BFbbKv9AwsQsGOCJ2sWG5Xc2E6Ra/bNcYRlOBB2exxJoQFMs2Aauu2S8 /tUcAZQxxc4LtUzLinEeNmr0iGftA6T6bHXFtr49CUldsegCoqOWTvRGB7rfwRpZJ1tw 0vu+ATISBcpRyWIlhyvxdV6dLzJVO6Z4szC+WGctk96q7BVb7bvjkDd/kLbFSYKvk8EV az3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent :content-language:to:from:subject; bh=xaGehD8HEbQhE8ORJ4FcqKOAyyHHoSNPdrrWuXZx1Qc=; b=v+jZ/h1BFuJjFMEb2eRDLuULZ+fG34IUFT1rvTvF3KCijZd+M+aq1llaHOpxzi6Q7q RrQawsdc5cSsYGZ/jhP1hQ3O8A6Jtln1i+LZKE4l6xrL/J9BduihqiU8pC8+4Zqblb+Z bkqU51zODUat7kRWH4OiVLQ4ACqttlVgxwkfBWMM18/Rcwf8M2a8ulXuIIR5RagS8BsJ lHiAvkQARJb6qs8PEcrDvnRTRbkJRyNguJZINFZMDK4syt4eFRUrA/22eWbmIIW25FiD DMIxcMdha0sgrymBa5cvDpvNsyWZhmU5DVR1FZaLvKPaKGwMhErwS39KVYnAVOFL8xYw TmBA== X-Gm-Message-State: AOAM533GtdH0hEIbzkzEuPrc+52+uihsozgmLGySEVe2jtN/yElTw1Py 7RJDMUhiJbIDrc7tpWWeJkhzdMxGK/ovCg7BNKVwH5mxK2g0j1V04RMsTlSm/uO3gt4LR9IMNoW V3wyveFUZdKsgWwvpLBJTchRC1/CHD3gi9Abm7FSHTHAUkrWYJAmhxiR0f+HrhR9/sJeAFc98U1 OlHT0sIRSZJhSQ2tL7XAP20UHvB7Vf/p1f9LdlnEeJ7l6iqGIguxEPyKQYHFyN7TWSE5ul6EZ95 qPzIRMBfeLfH4UYo2CnLJ0rMDw8YfjP5FCMI5Xd4FYZ3budwM+CPg== X-Google-Smtp-Source: ABdhPJxht2ItcvhK6HAH7mkEV3/JBCRoLU/pXhk4tz3Tt3oTyy0jBu1cpVdwYTq+IgNIwcbvOjZtwg== X-Received: by 2002:a17:907:c001:: with SMTP id ss1mr5673598ejc.265.1642121315880; Thu, 13 Jan 2022 16:48:35 -0800 (PST) Received: from [10.137.0.19] (ip-86-49-251-241.net.upcbroadband.cz. [86.49.251.241]) by smtp.gmail.com with ESMTPSA id mp9sm1301431ejc.106.2022.01.13.16.48.34 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 13 Jan 2022 16:48:35 -0800 (PST) Content-Type: multipart/mixed; boundary="------------e7BiyXuZvHaYrEu1cEFykVFE" Message-ID: Date: Fri, 14 Jan 2022 01:48:33 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Content-Language: en-US To: PostgreSQL Hackers From: Tomas Vondra Subject: minor bug in sort_inner_and_outer() X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------e7BiyXuZvHaYrEu1cEFykVFE Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, While looking at sort_inner_and_outer() I was rather confused what is stored in all_pathkeys, because the code does this: List *all_pathkeys; ... all_pathkeys = select_outer_pathkeys_for_merge(root, extra->mergeclause_list, joinrel); foreach(l, all_pathkeys) { List *front_pathkey = (List *) lfirst(l); ... /* Make a pathkey list with this guy first */ if (l != list_head(all_pathkeys)) outerkeys = lcons(front_pathkey, ...); else ... which seems to suggest all_pathkeys is a list of lists, because why else would front_pathkey be a (List *). But that doesn't seem to be the case, front_pathkey is actually a PathKey, not a List, as demonstrated by gdb: (gdb) p *front_pathkey $2 = {type = T_PathKey, length = 0, ...} Maybe it's some clever list-fu that I can't comprehend, but I guess it's a bug present since ~2004. It's benign because we only ever pass the front_pathkey to lcons() which does not really care. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------e7BiyXuZvHaYrEu1cEFykVFE Content-Type: text/x-patch; charset=UTF-8; name="sort-inner-and-outer-fix.patch" Content-Disposition: attachment; filename="sort-inner-and-outer-fix.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pvaW5wYXRoLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5jCmluZGV4IGY5NmZjOWZkMjgy Li44MWUwNGI2YWM5ZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv am9pbnBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5j CkBAIC0xMjU4LDcgKzEyNTgsNyBAQCBzb3J0X2lubmVyX2FuZF9vdXRlcihQbGFubmVySW5m byAqcm9vdCwKIAogCWZvcmVhY2gobCwgYWxsX3BhdGhrZXlzKQogCXsKLQkJTGlzdAkgICAq ZnJvbnRfcGF0aGtleSA9IChMaXN0ICopIGxmaXJzdChsKTsKKwkJUGF0aEtleQkgICAqZnJv bnRfcGF0aGtleSA9IGxmaXJzdF9ub2RlKFBhdGhLZXksIGwpOwogCQlMaXN0CSAgICpjdXJf bWVyZ2VjbGF1c2VzOwogCQlMaXN0CSAgICpvdXRlcmtleXM7CiAJCUxpc3QJICAgKmlubmVy a2V5czsK --------------e7BiyXuZvHaYrEu1cEFykVFE--