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.96) (envelope-from ) id 1vvz53-00DsML-1Y for pgsql-bugs@arkaria.postgresql.org; Fri, 27 Feb 2026 14:44:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvz51-0043mS-1V for pgsql-bugs@arkaria.postgresql.org; Fri, 27 Feb 2026 14:44:35 +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.96) (envelope-from ) id 1vvz51-0043m9-0f for pgsql-bugs@lists.postgresql.org; Fri, 27 Feb 2026 14:44:35 +0000 Received: from mail-ot1-x331.google.com ([2607:f8b0:4864:20::331]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvz4x-00000001VoM-34LU for pgsql-bugs@lists.postgresql.org; Fri, 27 Feb 2026 14:44:34 +0000 Received: by mail-ot1-x331.google.com with SMTP id 46e09a7af769-7d513bc15c7so2680366a34.1 for ; Fri, 27 Feb 2026 06:44:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772203472; cv=none; d=google.com; s=arc-20240605; b=VNqWP2dsB/p991Ii6M35Ys6tsnWf+Yhv5014wnS7+AMiziHS0gRbTUCJx0cHl4dEYi 1ZeIohs9j4q6HOq05UznM5CfAhA9fkAkK3aog5QOfwb3M3axbur2WNHh7x8DuXTlF8NK osDhz5m3R1zUarv8fKoc8YgfPD7lDmj6zb5KCxxdxmx+WiQ9VbP9NrVkdnjKBcU2ZOuL kS4dFRPmEoWds//l6W0TZFH/IW7RrfbFaR227vgCyyxUF9TT6X5LgIh4wmVAVyoSiwPE HCnJqqwaYJNEprzMOvQzbgdqveNr6PiL6789lBDTLaoavO/g00Y/40c1JcjTQKcbXbZ+ 0hzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=wfSTXnKbgF6NgG2+6kx+6nd4nXhVlHokclhTmz45Hcc=; fh=CDPerezunECEcWGQfMufboGhhY8vrfoD+9I/YFcIbGQ=; b=XtuJJskahplSfj3l3SI9JkN7LTtjG78cY3tZXvmD4EsfHZI3OzHmnSGOyxASOQZNhH mQ9unNOUFbdBa02jYCKjpLIDd16l8p/fn4ULlthEsTcNolIVs5g9qhl4+fd49GY4xxlH 3lB+TuS83s0HhD6QKwYKRoSHG6AT5Q/Za1V42RHyBEXJ/iIkz9ueS1hAdzS0jT2EQulw DNslZ9ENawAtn2yW2nBRuqVI1cOlqmoYpeFD8OcsgL+xiKyspz7Bn4KO1IE3wR3g0WU3 pBwvSPGIIUrMwdU2YI4mKB03RF59ukjNbKJ3WWKlUXmb5nqOJipCxRaM2+DHmMcDi6y7 7zWw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772203472; x=1772808272; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=wfSTXnKbgF6NgG2+6kx+6nd4nXhVlHokclhTmz45Hcc=; b=LncLC5ZpvCQeX+nqi+rzGaWNx4JywnkTQJ/rNqgwj0GmGukBrzdJpM+aUftHRF1f7l tatRGVmxNOD4B9Ou9IpJ8MgDppBmUFTYtsdTqgJss5B53L/7TytbdwtinJyj+NzTScJ5 VbpRAPKgqOZ1uGpeCBUGSHQfMKvQ1hbZ2Yxlor031yRHr88R53AEdGRSgBdMFZMWu92j SJLO29C41JkzKzEtq+hEKfJ7Ju50i4Qzh5OYZaTxv3+zX10vDPU1j5mzaG3p+8FnkqRH V+DPENGRMYrTVwLPsCORZi7usKcIZ6l04QtAeZEbufMjxcRBL5E6q0GBaPZlm/a2fRDR 7XYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772203472; x=1772808272; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=wfSTXnKbgF6NgG2+6kx+6nd4nXhVlHokclhTmz45Hcc=; b=Kec2m51J3b/a0FopOe09CAnjnteFIykXgRAAQASF0+hctCz/NX7QrNN5RZIXZjkWi8 N+E3dxjH7+ZtDW92X4cSznk2QKCzYEBtWMlHN9WcxFuiGb/h78jUc8kl1RcoJ9HU793r Jt/S46XK3yryzfNdwpfTQBckTvEW7aJCat6AJh+hgt6mN4OxFbHL54dfhHHJfFd6iDnj XxGzfvIinQwEMGvYHHitjOwpD1LSNiNPdIEFVV7FOLPSyOtT328/SeF+ZRIHvV0CzTTl JqglCKyVO9VdgWJ/3NBznnjmc98sKnZLGGAeA2oUb0WOZzO9XrmA6U+XuOT3zbv5wLub 81ew== X-Forwarded-Encrypted: i=1; AJvYcCVG6yhjGf2/g5MWkGcCYfiHHTosKDjMDeeN7ox3DKRLXP9cHeMnvrAcxofa4H4klgo0g4ocVXVdL2Vq@lists.postgresql.org X-Gm-Message-State: AOJu0YzHzBMr8SkRSzpyId8kAz3i4KnBFpgjS+FJE9pGDqWNxOWJ5lqs enmSj5XeyUBH2rroikix02LwiTTGLXImxdP8kMWzqDZMHQ6zZ1HLcaaKSnqnii3vx1dWmmE1K7M 4KE/r8p/ZTZcRBl1xYO6AIbbVPguXg2Wmc5AT X-Gm-Gg: ATEYQzyBr9AJbVom1mZj1yS5zhqsQZyzGnN0ANmNa8pIpUAAC+QxKcywNFXYOwNKPSt TlnJDMOqIoZ6ByTAbrShTu8oAl5aGgB7QxujfK+p5+4UO5vpOGLtkVA5mD3a5VmPnlN0Pl3gXQ9 wBpPlmwOEkgXNLrAM3OTxpcwQVbpEu5JxbRSeiveY8r+vi+vj/q8TxatqZ/ObL7uiEPquQR1eCU 8uasLuo95tpj5TKVtW7HBchmB9IvG515xhm7Y3AtMo+PiRMk9HsFIt+CsEZ2UiEqtCDDi5haFBY 05GcOJJz X-Received: by 2002:a05:6820:2012:b0:679:de26:7b4b with SMTP id 006d021491bc7-679fafa146bmr1952013eaf.74.1772203472195; Fri, 27 Feb 2026 06:44:32 -0800 (PST) MIME-Version: 1.0 References: <19418-591ba1f29862ef5b@postgresql.org> <2abdb464-27f5-4759-bb0b-f09ab5b5ceab@postgresfriends.org> In-Reply-To: <2abdb464-27f5-4759-bb0b-f09ab5b5ceab@postgresfriends.org> From: Richard Guo Date: Fri, 27 Feb 2026 23:44:20 +0900 X-Gm-Features: AaiRm52-7lI3RXDmLElXv-bBMvxnG4Ntf70deNB7dhHdH44LlaTvIGtSSBaUuJg Message-ID: Subject: Re: BUG #19418: SQL/JSON JSON_VALUE() does not conform to ISO/IEC 9075-2:2023(E) 6.34 To: Vik Fearing Cc: lukas.eder@gmail.com, pgsql-bugs@lists.postgresql.org, PG Bug reporting form Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Thu, Feb 26, 2026 at 11:20=E2=80=AFPM Vik Fearing wrote: > On 26/02/2026 10:57, PG Bug reporting form wrote: > > Try this: > > > > select json_array(select 1 where false); > > > > It produces NULL, not [] > I can confirm that postgres violates the standard here. It looks like postgres rewrites JSON_ARRAY(query) into JSON_ARRAYAGG() internally: explain (verbose, costs off) select json_array(select 1 where false); QUERY PLAN --------------------------------------------------- Result Output: (InitPlan expr_1).col1 InitPlan expr_1 -> Aggregate Output: JSON_ARRAYAGG(1 RETURNING json) -> Result One-Time Filter: false (7 rows) The comment above transformJsonArrayQueryConstructor() says: /* * Transform JSON_ARRAY(query [FORMAT] [RETURNING] [ON NULL]) into * (SELECT JSON_ARRAYAGG(a [FORMAT] [RETURNING] [ON NULL]) FROM (query) = q(a)) */ Because of this transformation, we inherit standard aggregate behavior: evaluating an aggregate over an empty set without a GROUP BY yields NULL instead of the expected []. I wonder if we can fix it by wrapping the JSON_ARRAYAGG in a COALESCE to catch the NULL and convert it to an empty array; ie: SELECT COALESCE( JSON_ARRAYAGG(a [FORMAT] [RETURNING] [ON NULL]), '[]'::[RETURNING_TYPE] ) FROM (query) q(a) - Richard