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 1uZn2g-0088eX-ME for pgsql-hackers@arkaria.postgresql.org; Thu, 10 Jul 2025 08:54:10 +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 1uZn2e-00AH0W-PG for pgsql-hackers@arkaria.postgresql.org; Thu, 10 Jul 2025 08:54:09 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uZn2e-00AH0O-El for pgsql-hackers@lists.postgresql.org; Thu, 10 Jul 2025 08:54:09 +0000 Received: from mail-ua1-x936.google.com ([2607:f8b0:4864:20::936]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uZn2d-006oQ1-09 for pgsql-hackers@postgresql.org; Thu, 10 Jul 2025 08:54:08 +0000 Received: by mail-ua1-x936.google.com with SMTP id a1e0cc1a2514c-87edd8f4e9fso327796241.0 for ; Thu, 10 Jul 2025 01:54:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752137645; x=1752742445; 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=SGarFLERQ7FSq5TYtBAYgrSMI8HL0NP3OMwXrRr5IPM=; b=bSbFcUX6r1ZmhyuH+HJfmBHNHLTiunI8MsPWNpFlgnvxEynDsGD4LnySpXh/dGPyk/ s34IRluZSk0B+Cxa54N+uIlTA5vv2zcvVvnsjZUkf7hOMSsQIPw9wVfwAUL+g2Ps5Nk0 3If96sis61NRscugjn3u2vnHUpIcSmGMgrMZPs79jBuMafeb3ZF9gX31WHWQ7hjckzFN Hhhm0mEsj5AgfKpdlhkpfRoZMOuJ8NFv+OmM8yyP8lh8bgRiYM+HZjd+k2s3N7GMwP6T lfVpaGYkoRYpaeDJP3jDq5Df+ilF0HTRXssyPZarpe+db7lFZiy9GnMOV02kYBBMOCCH +EoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752137645; x=1752742445; 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=SGarFLERQ7FSq5TYtBAYgrSMI8HL0NP3OMwXrRr5IPM=; b=LeSCu+Mb8wRSec8SPDc5Gz6upetVfSFF6cEE57C9jnRXX7/iD7UNNvbzczXN8xeDVx uJJ3VYNJO0y3O1DKVbCRd0ruVix1Q2O58P2ZUgpplj9Z1JOTNEU1xuV186ko2S18u4dW qaD50OgKgWtOTsnAfM86XY+/Axh749nGMtCykps+jcrDWmfFca6MsrxASl+NPM28mFfL 1bkM5YHsuPZlKYrxg3JF1NKkGqF0UHvHKPfQ8KhRNEs4/jQ3qiZdZyfMabawn+tOu7tw K1ImDXyuMEJuEZQIY32qbjHxIyFgrlcQZICRaMyP33X00JyA+SFAxpdTA30sIaT1zZoD 3Qpw== X-Forwarded-Encrypted: i=1; AJvYcCWRXMu52U7YmkD1/h2gaONry6jl/kDkavYHyh8N14VsSywI6YFEPjY0NpzhaIC1KiyVCM6aMw+30ZJW0gqH@postgresql.org X-Gm-Message-State: AOJu0YymB6D2aHFZzoGl7MivLowDD+Xagmogzff/Z42vOhsT1EHDHFC/ IRFoJ8b2ZMWowCIwyBxo+h5X7GAb68FvSaIzMbOauVsKOaWIhqeBF8Wt72/O73dumoKXuKrBvI+ xPfJd75gBz76szJfzey8E+NHBzvUN8qY= X-Gm-Gg: ASbGncvz7/hIEjxYsHD5GmigxyHAizwnYBO4fNBVknPRfCJsbWb0ewN1MWQdDD8tFah qMjkTJ3UAMo43KDHjcc1NrksFG44tB4zXtiwdKfd4UN4i9VbIo5EWY15vFHOnysIA4b/FsnzmLD rwzJqKv+ngSChB+N8sstE3sfnSf/YhjeCQYgfiT5xZ7olzIY0XaOgc+Usf0crnOYzdNLqsPaHxF d8= X-Google-Smtp-Source: AGHT+IG2g/friEACvVyzleD7YjTOnIiBTNfbI5KrKydTQCfg+fr9IA+J6TlTLFPfHVzb/mbSoQqEyY0dngSfx4jW2Fw= X-Received: by 2002:a05:6102:3e19:b0:4e5:a0c9:3568 with SMTP id ada2fe7eead31-4f54a9e8416mr3893077137.20.1752137645343; Thu, 10 Jul 2025 01:54:05 -0700 (PDT) MIME-Version: 1.0 References: <21fa36b4-6d56-4556-b524-9e3955b922c8@eisentraut.org> In-Reply-To: From: jian he Date: Thu, 10 Jul 2025 16:53:28 +0800 X-Gm-Features: Ac12FXyInfzayKYY5pTjsokkn1204tnoULFbZzvwbPwyNQ7EEJq11YaPYJ5y6Eg 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="000000000000f2ffe306398f5577" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f2ffe306398f5577 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jul 9, 2025 at 4:02=E2=80=AFPM Alexandra Wang wrote: > > Thanks again for the patch! It was really helpful! I didn't directly > apply it as I made a few different choices, but I think I have > addressed all the points you covered in it. > > Let me know your thoughts! > hi. in v12-0001 and v12-0002. in transformIndirection if (!newresult) { /* * generic subscripting failed; falling back to function call o= r * field selection for a composite type. */ Node *n; /* try to find function for field selection */ newresult =3D ParseFuncOrColumn(pstate, list_make1(n), list_make1(result), last_srf, NULL, false, location); } the above comments mentioning "function call" is wrong? you passed NULL for (FuncCall *fn) in ParseFuncOrColumn. and ParseFuncOrColumn comments says ```If fn is null, we're dealing with column syntax not function syntax.`` I think coerce_jsonpath_subscript can be further simplified. we already have message like: errhint("jsonb subscript must be coercible to either integer or text."), no need to pass the third argument a constant (INT4OID). also ``Oid targetType =3D UNKNOWNOID;`` set it as InvalidOid would be better. attached is a minor refactoring of coerce_jsonpath_subscript based on (v12-0001 to v12-0004). after applied v12-0001 to v12-0006 + /* emit warning conditionally to minimize duplicate warnings */ + if (list_length(*indirection) > 0) + ereport(WARNING, + errcode(ERRCODE_WARNING), + errmsg("mixed usage of jsonb simplified accessor syntax and jsonb subscripting."), + errhint("use dot-notation for member access, or use non-null integer constants subscripting for array access."), + parser_errposition(pstate, warning_location)); src7=3D# select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]; WARNING: mixed usage of jsonb simplified accessor syntax and jsonb subscripting. LINE 1: ...t ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]... ^ HINT: use dot-notation for member access, or use non-null integer constants subscripting for array access. ERROR: subscript type bigint is not supported LINE 1: ...t ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]... ^ HINT: jsonb subscript must be coercible to either integer or text. The above example looks very bad. location printed twice, hint message is different. two messages level (ERROR, WARNING). also "or use non-null integer constants subscripting for array access." seems wrong? as you can see the below hint message saying it could be text or integer. select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['1'::int8]; ERROR: subscript type bigint is not supported LINE 1: ...ect ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['1'::int8]... ^ HINT: jsonb subscript must be coercible to either integer or text. also select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)[NULL::int4]; return NULL, so "use non-null integer constants" is wrong. --000000000000f2ffe306398f5577 Content-Type: application/octet-stream; name="v12-0001-minor-refactor-coerce_jsonpath_subscript.no-cfbot" Content-Disposition: attachment; filename="v12-0001-minor-refactor-coerce_jsonpath_subscript.no-cfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mcx5fxop0 RnJvbSA2ZmI0NmY5NzAzMGFkYzU5ZjdmOGQ1MzEzMjY0ZWYxYzZhOTViMDYyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFRodSwgMTAgSnVsIDIwMjUgMTU6NDM6MTggKzA4MDAKU3ViamVjdDogW1BBVENIIHYx MiAxLzFdIG1pbm9yIHJlZmFjdG9yIGNvZXJjZV9qc29ucGF0aF9zdWJzY3JpcHQKCi0tLQogc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L2pzb25ic3Vicy5jIHwgMTIgKysrKysrLS0tLS0tCiAxIGZpbGUg Y2hhbmdlZCwgNiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uYnN1YnMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9q c29uYnN1YnMuYwppbmRleCA1ZDBlYzZiZjJmYS4uN2ExNGY1MDZjOTIgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uYnN1YnMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9h ZHQvanNvbmJzdWJzLmMKQEAgLTMzLDE0ICszMywxNCBAQCB0eXBlZGVmIHN0cnVjdCBKc29uYlN1 YldvcmtzcGFjZQogfSBKc29uYlN1YldvcmtzcGFjZTsKIAogc3RhdGljIE5vZGUgKgotY29lcmNl X2pzb25wYXRoX3N1YnNjcmlwdChQYXJzZVN0YXRlICpwc3RhdGUsIE5vZGUgKnN1YkV4cHIsIE9p ZCBudW10eXBlKQorY29lcmNlX2pzb25wYXRoX3N1YnNjcmlwdChQYXJzZVN0YXRlICpwc3RhdGUs IE5vZGUgKnN1YkV4cHIpCiB7CiAJT2lkCQkJc3ViRXhwclR5cGUgPSBleHByVHlwZShzdWJFeHBy KTsKLQlPaWQJCQl0YXJnZXRUeXBlID0gVU5LTk9XTk9JRDsKKwlPaWQJCQl0YXJnZXRUeXBlID0g SW52YWxpZE9pZDsKIAogCWlmIChzdWJFeHByVHlwZSAhPSBVTktOT1dOT0lEKQogCXsKLQkJT2lk CQkJdGFyZ2V0c1syXSA9IHtudW10eXBlLCBURVhUT0lEfTsKKwkJT2lkCQkJdGFyZ2V0c1syXSA9 IHtJTlQ0T0lELCBURVhUT0lEfTsKIAogCQkvKgogCQkgKiBKc29uYiBjYW4gaGFuZGxlIG11bHRp cGxlIHN1YnNjcmlwdCB0eXBlcywgYnV0IGNhc2VzIHdoZW4gYQpAQCAtNTYsNyArNTYsNyBAQCBj b2VyY2VfanNvbnBhdGhfc3Vic2NyaXB0KFBhcnNlU3RhdGUgKnBzdGF0ZSwgTm9kZSAqc3ViRXhw ciwgT2lkIG51bXR5cGUpCiAJCQkJICogT25lIHR5cGUgaGFzIGFscmVhZHkgc3VjY2VlZGVkLCBp dCBtZWFucyB0aGVyZSBhcmUgdHdvCiAJCQkJICogY29lcmNpb24gdGFyZ2V0cyBwb3NzaWJsZSwg ZmFpbHVyZS4KIAkJCQkgKi8KLQkJCQlpZiAodGFyZ2V0VHlwZSAhPSBVTktOT1dOT0lEKQorCQkJ CWlmIChPaWRJc1ZhbGlkKHRhcmdldFR5cGUpKQogCQkJCQllcmVwb3J0KEVSUk9SLAogCQkJCQkJ CShlcnJjb2RlKEVSUkNPREVfREFUQVRZUEVfTUlTTUFUQ0gpLAogCQkJCQkJCSBlcnJtc2coInN1 YnNjcmlwdCB0eXBlICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXRfdHlwZV9iZShzdWJFeHBy VHlwZSkpLApAQCAtNzAsNyArNzAsNyBAQCBjb2VyY2VfanNvbnBhdGhfc3Vic2NyaXB0KFBhcnNl U3RhdGUgKnBzdGF0ZSwgTm9kZSAqc3ViRXhwciwgT2lkIG51bXR5cGUpCiAJCS8qCiAJCSAqIE5v IHN1aXRhYmxlIHR5cGVzIHdlcmUgZm91bmQsIGZhaWx1cmUuCiAJCSAqLwotCQlpZiAodGFyZ2V0 VHlwZSA9PSBVTktOT1dOT0lEKQorCQlpZiAoIU9pZElzVmFsaWQodGFyZ2V0VHlwZSkpCiAJCQll cmVwb3J0KEVSUk9SLAogCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFUWVBFX01JU01BVENIKSwK IAkJCQkJIGVycm1zZygic3Vic2NyaXB0IHR5cGUgJXMgaXMgbm90IHN1cHBvcnRlZCIsIGZvcm1h dF90eXBlX2JlKHN1YkV4cHJUeXBlKSksCkBAIC0xMzksNyArMTM5LDcgQEAganNvbmJfc3Vic2Ny aXB0X3RyYW5zZm9ybShTdWJzY3JpcHRpbmdSZWYgKnNic3JlZiwKIAkJaWYgKGFpLT51aWR4KQog CQl7CiAJCQlzdWJFeHByID0gdHJhbnNmb3JtRXhwcihwc3RhdGUsIGFpLT51aWR4LCBwc3RhdGUt PnBfZXhwcl9raW5kKTsKLQkJCXN1YkV4cHIgPSBjb2VyY2VfanNvbnBhdGhfc3Vic2NyaXB0KHBz dGF0ZSwgc3ViRXhwciwgSU5UNE9JRCk7CisJCQlzdWJFeHByID0gY29lcmNlX2pzb25wYXRoX3N1 YnNjcmlwdChwc3RhdGUsIHN1YkV4cHIpOwogCQl9CiAJCWVsc2UKIAkJewotLSAKMi4zNC4xCgo= --000000000000f2ffe306398f5577--