Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ua6iQ-00FonW-4e for pgsql-hackers@arkaria.postgresql.org; Fri, 11 Jul 2025 05:54:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ua6iN-002776-Te for pgsql-hackers@arkaria.postgresql.org; Fri, 11 Jul 2025 05:54:32 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ua6iN-00275n-FW for pgsql-hackers@lists.postgresql.org; Fri, 11 Jul 2025 05:54:32 +0000 Received: from mail-ua1-x92f.google.com ([2607:f8b0:4864:20::92f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1ua6iM-006hzj-1V for pgsql-hackers@postgresql.org; Fri, 11 Jul 2025 05:54:31 +0000 Received: by mail-ua1-x92f.google.com with SMTP id a1e0cc1a2514c-87f0efa51c0so799328241.1 for ; Thu, 10 Jul 2025 22:54:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752213269; x=1752818069; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=pUvZBTrk4lWdGC+rSxOWm1utxFdpTA2bktg3AO3y+No=; b=MD9+sez8Gjc41D/7Um230yDbKzw6BRPDRr4rkBLn7RTFm5rWEKgJBWRBLAcJ17mXg+ fWLRuvOvdmIqm/NPjyhA4iPS6uzQYLlkdf/sXDKcVGPWmPbim8a46GZ8omQERJ2AnBqs d/z25JZ6eYLYVphHvbJCEUjyey8E+G/sZjbigLSL5APheDw2zTmpkzK5hTcAzZNutjeA VbdQIgrdd6ZOd/d1i1OkJTiH6WO3aw8WtqQVmw+H+yrOc3hlng4j9XuYJnhFSzrYzF2/ y1WpsKR3vGJw6CmgOXTj0s7ydbARD+glLShSdGhKgLQOHnPeq3qKs4964wMPXjtiMxib z8xQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752213269; x=1752818069; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=pUvZBTrk4lWdGC+rSxOWm1utxFdpTA2bktg3AO3y+No=; b=IcBTIYjxZ+EinRH5gm62kikxecRTw4u9UmuBPwzHT/XmxiumKNPDB6lZ6dkSih2fa6 g43+yXpVbaGXFuTy5eXbQ4pYqhXZujJ0IBsfV2dMljNiYYQX8Ws6UuJWPZPJpF4I3xsM ZgTo6HGkY8uLGxInoaVzdyxYUdX++PRcHtpSPKslSB4hHicoa60i7fYYj9z2No4Emf7p 5gdNXISArT2jTPm3CITkXf2CkZ+kYBJbax63UQAdfAjpsMGY8qgg9VDvDVPsickIdRQP nMAl7+H0f3qrSz7yOPmmJ36JXUtZYhkBTfU9Byg3h9EBmLNb18N2Ceu5gFAWuSdB4ymy 31qQ== X-Forwarded-Encrypted: i=1; AJvYcCXlcn1gVP3F64yXpUCW7oLb1px8yPqKi1rEKG+UVFkypEowP+a90G0KLdgJxFeLpcyt3z8f7mMO1C9GLby8@postgresql.org X-Gm-Message-State: AOJu0Yw37R8hvVVy1CeW1bicVU6lHejcvC2hQCid+fxzb2A2j+sKjQ35 Cu3Ltn+pOryd1oGi67K2rwJgu7QCW3xeH2bDEq7c0+Nnqwwl3E8P2mtJ9jKrmxzSwYtmgWB/ZG2 U08p3UhJhhVETtKvghn/7EsXva2+txwgXk6aoQy8= X-Gm-Gg: ASbGncuBvwkqJIzS/xdoInozyPx8IuetC+1jsUWWqnBic/H9l1J3/necxcVArWOcv+i 0Q7nC4zQpP0bYOC31KFV2fFTlhycRcvmD1d2p3Rd39NvdV3U+8e1w3bNZOSqqJR5dBbYlV3b6c5 8eoifGjIKt7C+e0uK41Tu04O8cKOWJDee92Olw/pf2lbSyo9KgELtJV5Ytn8yHKWK3BQKTu7+GV ZeH5K3bAiNls2UU3+oNPzzLl0D3HJAxZfQo0eA= X-Google-Smtp-Source: AGHT+IFpgfGFgQf41dTGVz8K8Jnt/oYDVgnigNPBflqPOxdPfwz9/GMCPebaMb2z4tsSDudK+NyarXQ1Xl2bN0l8maA= X-Received: by 2002:a05:6102:3ca1:b0:4f3:36bc:554e with SMTP id ada2fe7eead31-4f641f5dcf8mr1361770137.16.1752213269229; Thu, 10 Jul 2025 22:54:29 -0700 (PDT) MIME-Version: 1.0 References: <21fa36b4-6d56-4556-b524-9e3955b922c8@eisentraut.org> In-Reply-To: From: jian he Date: Fri, 11 Jul 2025 13:53:52 +0800 X-Gm-Features: Ac12FXx70IFxhXzxq_7Plt9cjOHkpG57eUQ05bh2S3X4v2rhWy2zVAzT6L1W8Ho Message-ID: Subject: Re: SQL:2023 JSON simplified accessor support To: Alexandra Wang Cc: Nikita Malakhov , Vik Fearing , Mark Dilger , Matheus Alcantara , Peter Eisentraut , Andrew Dunstan , Nikita Glukhov , PostgreSQL Hackers , "David E. Wheeler" Content-Type: multipart/mixed; boundary="0000000000007c90810639a0f1da" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007c90810639a0f1da Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Jul 10, 2025 at 9:34=E2=80=AFPM jian he wrote: > > ------------------------------------------ > in jsonb_subscript_make_jsonpath we have > foreach(lc, *indirection) > { > if (IsA(accessor, String)) > .... > else if (IsA(accessor, A_Indices)) > else > /* > * Unsupported node type for creating jsonpath. Instead of > * throwing an ERROR, break here so that we create a jsonpath= from > * as many indirection elements as we can and let > * transformIndirection() fallback to alternative logic to ha= ndle > * the remaining indirection elements. > */ > break; > } > the above ELSE branch comments look suspicious to me. > transformIndirection->transformContainerSubscripts->jsonb_subscript_trans= form->jsonb_subscript_make_jsonpath > As you can see, transformIndirection have a long distance from > jsonb_subscript_make_jsonpath, > let transformIndirection handle remaining indirection elements seems not = good. > context v12-0001 to v12-0006. this ELSE branch comments is wrong, because + if (jsonb_check_jsonpath_needed(*indirection)) + { + jsonb_subscript_make_jsonpath(pstate, indirection, sbsref); + if (sbsref->refjsonbpath) + return; + } in jsonb_check_jsonpath_needed we already use Assert to confirm that list "indirection" is either String or A_Indices Node. in transformContainerSubscripts we have sbsroutines->transform(sbsref, indirection, pstate, isSlice, isAssignment); /* * Error out, if datatype failed to consume any indirection elements. */ if (list_length(*indirection) =3D=3D indirection_length) { Node *ind =3D linitial(*indirection); if (noError) return NULL; if (IsA(ind, String)) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("type %s does not support dot notation", format_type_be(containerType)), parser_errposition(pstate, exprLocation(containerBase)= ))); else if (IsA(ind, A_Indices)) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("type %s does not support array subscripting", format_type_be(containerType)), parser_errposition(pstate, exprLocation(containerBase)= ))); else elog(ERROR, "invalid indirection operation: %d", nodeTag(ind)); } sbsroutines->transform currently will call array_subscript_transform, hstore_subscript_transform, jsonb_subscript_tran= sform in jsonb_subscript_transform callee we unconditionally do: *indirection =3D list_delete_first_n(*indirection, pathlen); *indirection =3D list_delete_first_n(*indirection, list_length(upperInde= xpr)); in array_subscript_transform, we do *indirection =3D list_delete_first_n(*indirection, ndim); That means, if sbsroutines->transform not error out and indirection is not NIL (which is unlikely) then sbsroutines->transform will consume some induction elements. instead of the above verbose ereport(ERROR, error handling, we can use Asse= rt Assert(indirection_length > list_length(*indirection)); for the above comments, i did a refactoring based on v12 (0001 to 0006). --0000000000007c90810639a0f1da Content-Type: application/octet-stream; name="v12-0001-minor-refactor-based-on-v12_0001_to_0006.no-cfbot" Content-Disposition: attachment; filename="v12-0001-minor-refactor-based-on-v12_0001_to_0006.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mcyei67i0 RnJvbSBhYWNhOGM0NjVhNzI3MzcwMDM1OGMxYWQ2ZGViYzJhNDRhMzVkOTM3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMTEgSnVsIDIwMjUgMTI6MDA6MTAgKzA4MDAKU3ViamVjdDogW1BBVENIIHYx MiAxLzFdIG1pbm9yIHJlZmFjdG9yIGJhc2VkIG9uIHYxMl8wMDAxX3RvXzAwMDYKCi0tLQogc3Jj L2JhY2tlbmQvcGFyc2VyL3BhcnNlX25vZGUuYyAgIHwgMjcgKystLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJzdWJzLmMgfCAyNSArKysrKysrLS0t LS0tLS0tLS0tLS0tLS0tCiAyIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgNDMgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX25vZGUuYyBi L3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9ub2RlLmMKaW5kZXggYjNlNDc2ZWIxODEuLjVjMjhk OTZmZTYwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2Vfbm9kZS5jCisrKyBi L3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9ub2RlLmMKQEAgLTMyMSwzMSArMzIxLDggQEAgdHJh bnNmb3JtQ29udGFpbmVyU3Vic2NyaXB0cyhQYXJzZVN0YXRlICpwc3RhdGUsCiAJc2Jzcm91dGlu ZXMtPnRyYW5zZm9ybShzYnNyZWYsIGluZGlyZWN0aW9uLCBwc3RhdGUsCiAJCQkJCQkgICBpc1Ns aWNlLCBpc0Fzc2lnbm1lbnQpOwogCi0JLyoKLQkgKiBFcnJvciBvdXQsIGlmIGRhdGF0eXBlIGZh aWxlZCB0byBjb25zdW1lIGFueSBpbmRpcmVjdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlpZiAobGlz dF9sZW5ndGgoKmluZGlyZWN0aW9uKSA9PSBpbmRpcmVjdGlvbl9sZW5ndGgpCi0JewotCQlOb2Rl CSAgICppbmQgPSBsaW5pdGlhbCgqaW5kaXJlY3Rpb24pOwotCi0JCWlmIChub0Vycm9yKQotCQkJ cmV0dXJuIE5VTEw7Ci0KLQkJaWYgKElzQShpbmQsIFN0cmluZykpCi0JCQllcmVwb3J0KEVSUk9S LAotCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFUWVBFX01JU01BVENIKSwKLQkJCQkJIGVycm1z ZygidHlwZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGRvdCBub3RhdGlvbiIsCi0JCQkJCQkJZm9ybWF0 X3R5cGVfYmUoY29udGFpbmVyVHlwZSkpLAotCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0 ZSwgZXhwckxvY2F0aW9uKGNvbnRhaW5lckJhc2UpKSkpOwotCQllbHNlIGlmIChJc0EoaW5kLCBB X0luZGljZXMpKQotCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRB VFlQRV9NSVNNQVRDSCksCi0JCQkJCSBlcnJtc2coInR5cGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBh cnJheSBzdWJzY3JpcHRpbmciLAotCQkJCQkJCWZvcm1hdF90eXBlX2JlKGNvbnRhaW5lclR5cGUp KSwKLQkJCQkJIHBhcnNlcl9lcnJwb3NpdGlvbihwc3RhdGUsIGV4cHJMb2NhdGlvbihjb250YWlu ZXJCYXNlKSkpKTsKLQkJZWxzZQotCQkJZWxvZyhFUlJPUiwgImludmFsaWQgaW5kaXJlY3Rpb24g b3BlcmF0aW9uOiAlZCIsIG5vZGVUYWcoaW5kKSk7Ci0JfQorCS8qIGRhdGF0eXBlIG1zdXQgY29u c3VtZSBzb21lIGluZGlyZWN0aW9uIGVsZW1lbnRzICovCisJQXNzZXJ0KGluZGlyZWN0aW9uX2xl bmd0aCA+IGxpc3RfbGVuZ3RoKCppbmRpcmVjdGlvbikpOwogCiAJLyoKIAkgKiBWZXJpZnkgd2Ug Z290IGEgdmFsaWQgdHlwZSAodGhpcyBkZWZlbmRzLCBmb3IgZXhhbXBsZSwgYWdhaW5zdCBzb21l b25lCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJzdWJzLmMgYi9zcmMv YmFja2VuZC91dGlscy9hZHQvanNvbmJzdWJzLmMKaW5kZXggYzM1ZDIwOTMzZWEuLjQyODljYTQx YmQ4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJzdWJzLmMKKysrIGIv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25ic3Vicy5jCkBAIC0yNDksMTAgKzI0OSw2IEBAIGpz b25iX3N1YnNjcmlwdF9tYWtlX2pzb25wYXRoKFBhcnNlU3RhdGUgKnBzdGF0ZSwgTGlzdCAqKmlu ZGlyZWN0aW9uLCBTdWJzY3JpcHRpCiAJaW50CQkJcGF0aGxlbiA9IDA7CiAJaW50CQkJd2Fybmlu Z19sb2NhdGlvbiA9IC0xOwogCi0Jc2JzcmVmLT5yZWZ1cHBlcmluZGV4cHIgPSBOSUw7Ci0Jc2Jz cmVmLT5yZWZsb3dlcmluZGV4cHIgPSBOSUw7Ci0Jc2JzcmVmLT5yZWZqc29uYnBhdGggPSBOVUxM OwotCiAJanByZXMuZXhwciA9IHBhdGg7CiAJanByZXMubGF4ID0gdHJ1ZTsKIApAQCAtMzI1LDE2 ICszMjEsNiBAQCBqc29uYl9zdWJzY3JpcHRfbWFrZV9qc29ucGF0aChQYXJzZVN0YXRlICpwc3Rh dGUsIExpc3QgKippbmRpcmVjdGlvbiwgU3Vic2NyaXB0aQogCQkJCWpwaS0+dmFsdWUuYXJyYXku ZWxlbXNbMF0udG8gPSBOVUxMOwogCQkJfQogCQl9Ci0JCWVsc2UKLQotCQkJLyoKLQkJCSAqIFVu c3VwcG9ydGVkIG5vZGUgdHlwZSBmb3IgY3JlYXRpbmcganNvbnBhdGguIEluc3RlYWQgb2YKLQkJ CSAqIHRocm93aW5nIGFuIEVSUk9SLCBicmVhayBoZXJlIHNvIHRoYXQgd2UgY3JlYXRlIGEganNv bnBhdGggZnJvbQotCQkJICogYXMgbWFueSBpbmRpcmVjdGlvbiBlbGVtZW50cyBhcyB3ZSBjYW4g YW5kIGxldAotCQkJICogdHJhbnNmb3JtSW5kaXJlY3Rpb24oKSBmYWxsYmFjayB0byBhbHRlcm5h dGl2ZSBsb2dpYyB0byBoYW5kbGUKLQkJCSAqIHRoZSByZW1haW5pbmcgaW5kaXJlY3Rpb24gZWxl bWVudHMuCi0JCQkgKi8KLQkJCWJyZWFrOwogCiAJCS8qIGFwcGVuZCBwYXRoIGl0ZW0gKi8KIAkJ cGF0aC0+bmV4dCA9IGpwaTsKQEAgLTM3NiwxMSArMzYyLDE1IEBAIGpzb25iX3N1YnNjcmlwdF90 cmFuc2Zvcm0oU3Vic2NyaXB0aW5nUmVmICpzYnNyZWYsCiAJTGlzdAkgICAqdXBwZXJJbmRleHBy ID0gTklMOwogCUxpc3RDZWxsICAgKmlkeDsKIAorCXNic3JlZi0+cmVmdXBwZXJpbmRleHByID0g TklMOworCXNic3JlZi0+cmVmbG93ZXJpbmRleHByID0gTklMOworCXNic3JlZi0+cmVmanNvbmJw YXRoID0gTlVMTDsKKwogCS8qIERldGVybWluZSB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIHN1YnNj cmlwdGluZyBvcGVyYXRpb247IGFsd2F5cyBqc29uYiAqLwogCXNic3JlZi0+cmVmcmVzdHlwZSA9 IEpTT05CT0lEOwogCXNic3JlZi0+cmVmdHlwbW9kID0gLTE7CiAKLQlpZiAoanNvbmJfY2hlY2tf anNvbnBhdGhfbmVlZGVkKCppbmRpcmVjdGlvbikpCisJaWYgKGlzU2xpY2UgfHwganNvbmJfY2hl Y2tfanNvbnBhdGhfbmVlZGVkKCppbmRpcmVjdGlvbikpCiAJewogCQlqc29uYl9zdWJzY3JpcHRf bWFrZV9qc29ucGF0aChwc3RhdGUsIGluZGlyZWN0aW9uLCBzYnNyZWYpOwogCQlpZiAoc2JzcmVm LT5yZWZqc29uYnBhdGgpCkBAIC0zODgsOSArMzc4LDggQEAganNvbmJfc3Vic2NyaXB0X3RyYW5z Zm9ybShTdWJzY3JpcHRpbmdSZWYgKnNic3JlZiwKIAl9CiAKIAkvKgotCSAqIFdlIHdvdWxkIG9u bHkgcmVhY2ggaGVyZSBpZiBqc29uIHNpbXBsaWZpZWQgYWNjZXNzb3IgaXMgbm90IG5lZWRlZCwg b3IKLQkgKiBpZiBqc29uYl9zdWJzY3JpcHRfbWFrZV9qc29ucGF0aCgpIGRpZG4ndCBjb25zdW1l IGFueSBpbmRpcmVjdGlvbgotCSAqIGVsZW1lbnQg4oCUIGVpdGhlciB3YXksIHRoZSBmaXJzdCBp bmRpcmVjdGlvbiBlbGVtZW50IGNvdWxkIG5vdCBiZQorCSAqIFdlIHdvdWxkIG9ubHkgcmVhY2gg aGVyZSBpZiBqc29uIHNpbXBsaWZpZWQgYWNjZXNzb3IgaXMgbm90IG5lZWRlZCwKKwkgKiB0aGUg Zmlyc3QgaW5kaXJlY3Rpb24gZWxlbWVudCBjb3VsZCBub3QgYmUKIAkgKiBjb252ZXJ0ZWQgaW50 byBhIEpzb25QYXRoIGNvbXBvbmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gaXQncyBhIG5vbi1zbGlj ZQogCSAqIEFfSW5kaWNlcyB3aXRoIGEgbm9uLWludGVnZXIgdXBwZXIgaW5kZXguIFRoZSBjb2Rl IGJlbG93IGZhbGxzIGJhY2sgdG8KIAkgKiB0cmFkaXRpb25hbCBqc29uYiBzdWJzY3JpcHRpbmcg Zm9yIHN1Y2ggY2FzZXMuCi0tIAoyLjM0LjEKCg== --0000000000007c90810639a0f1da--