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 1wl77u-00131h-2j for pgsql-bugs@arkaria.postgresql.org; Sat, 18 Jul 2026 15:38:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wl77s-003CJi-17 for pgsql-bugs@arkaria.postgresql.org; Sat, 18 Jul 2026 15:38:52 +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.96) (envelope-from ) id 1wl77r-003CJa-3B for pgsql-bugs@lists.postgresql.org; Sat, 18 Jul 2026 15:38:52 +0000 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wl77p-00000000wLn-1Z5D for pgsql-bugs@lists.postgresql.org; Sat, 18 Jul 2026 15:38:51 +0000 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-47de0093c42so4317080f8f.3 for ; Sat, 18 Jul 2026 08:38:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784389123; x=1784993923; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:to:subject:user-agent :mime-version:date:message-id:content-type:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6l3b3UMxp0/7ItnGRUX9oszJC/jsvk/hkqQygLdjcj0=; b=IasuEEpDci5JtiTuSssFZ2FVjuccmsk1osomvAAPLJhyi8m2I1vZKXi2Cbw+g7BNiI cSjLBUxCn6bRra6O1XHepAjxf5lnqsGFZ6kJfP20GyXRsARIgMpGO94mylwtovKIxtQY UCApUyi/gttpkN03p6YeSwV9kjRfvCiWAOByUGmh/fUHTLdcpQHkt0alnHvRUK8IXI6M d4l48Q7NRITGQyFxp98sAR6o8iSeGhpg8o1TCdV1r8Qoa0/BX45lHUyNusus5odcgYAW Av+c+7AvpjY3rNZXu1/+PokCxyFnNTiAZG6EF/1K0WjnM/NnuO6z6u1Q7V8Qo6N80vGH tvVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784389123; x=1784993923; h=in-reply-to:from:content-language:references:to:subject:user-agent :mime-version:date:message-id:content-type:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=6l3b3UMxp0/7ItnGRUX9oszJC/jsvk/hkqQygLdjcj0=; b=W8RPUOmK6yssJwiXOfw9g6etmJEut3q9pLoosHq1vJW8uycOK4oOMPKG7cIUwEnj0V QhbuhKVEMHnIA9XSd1s05XciTkzRJofzkzKYgDnYfJe0VCiMjGD73VcbtjuXtIL7wTdE HWRWlAql20ddXgV0JRdW1QIXEOhipbGwp0AZoMIqoxRurN73Wc4adH8mHx5FpPYmicuX Z3Ei6xB/4qW+8nEHN1xZHWSptZW3bo9LpwvcICc2xdyO1+v0Pbt3VZXb2psRAfhFijOT 5qOgVADp+AJWqTOxXcWWIcBELluFWvhk3p1oG90dJlSitdhcATdCZx3WCsLPszGnpm6C ku2A== X-Forwarded-Encrypted: i=1; AHgh+RpF7RF1X/ZV3++RllgMNlC4FeyOht1yEkpdlDISJxTZ6sgOVZn5TzOSjpIIzOY3q7IQkYNuFoTHApF6@lists.postgresql.org X-Gm-Message-State: AOJu0Ywoom+atSXWRvcbeFw312RCN/kUY6v2lKlpKiM/T5d1nMeBGWkb 0EKYSOK7q3WUr67fxUQXB6u9XUCCoaDzoiVKkkkUdbmBvFAv3OL/8Kw5XsCltA== X-Gm-Gg: AfdE7cnXAcDyxFu5ZCsflmmX/IhyNXHj+9Z4NT4RG/V3EPQdqxF3K7Z4ZQoQwCdz5HK TKVmZLII8y0cs/ohVd8kRAhag06V7T36ia+6+M3sgRp6s2/wxzJAHGbzxEsM9LlMr591W/scSAF ssJlHa7p7iCP8uWusoLRKg0A6MuFuLGNwnt+W7F+eArLMlm+xg9zr5Cy16jBBNEVA4J6VYV4kLR huhrsnnogn8SeVQlJXdasYX7nW+9F8JQIpF9humlDZ0fUDRoIKYt44b10N/TqJ5yIfs5gtMYu6c Lm72TMH+mT4VDl6yZdFrXyZVRnAlbx/2Utn3Hxdzytcz0tYR6ponhOT3uqWVCbebJcMG+z56Vms Ywamys7CqGPUJAxaus410Rdnmu8tGLKAumtTT6MeE0tMykElY2JXjhyAU8yQ51KvhrLTIV4rgiT RmaEXl3NBIpkQJuPLN9LL9tDlT8GZZF2EXxmeJSzEjjmyQFJQdjye8 X-Received: by 2002:a05:6000:712:b0:47f:6f2c:7303 with SMTP id ffacd0b85a97d-47f6f2c73c3mr1789397f8f.33.1784389122723; Sat, 18 Jul 2026 08:38:42 -0700 (PDT) Received: from ?IPV6:2a01:e0a:22d:4d0:1ac0:4dff:fe8b:a3c7? ([2a01:e0a:22d:4d0:1ac0:4dff:fe8b:a3c7]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47f69e5eff1sm6524550f8f.19.2026.07.18.08.38.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 18 Jul 2026 08:38:41 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------9f6W8S1LdvHah4wlpoOSzM0L" Message-ID: <02aea982-c656-462d-a412-1fb2e388f754@gmail.com> Date: Sat, 18 Jul 2026 17:38:41 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re:[patch] BUG #19558: User-defined prefix operators "|" and "->" no longer parse in 19beta2 (SQL/PGQ grammar change) To: pierre@senellart.com, pgsql-bugs@lists.postgresql.org References: <19558-ad1fca59a3a471a0@postgresql.org> Content-Language: en-US From: Pierre Forstmann In-Reply-To: <19558-ad1fca59a3a471a0@postgresql.org> 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. --------------9f6W8S1LdvHah4wlpoOSzM0L Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello, I propose following patch that adds missing grammar rules:  src/backend/parser/gram.y | 9 +++++++++  1 file changed, 9 insertions(+) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ff4e138..331da79 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -15873,6 +15873,10 @@ a_expr:        c_expr                   { $$ = $1; }                  { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }              | '-' a_expr                    %prec UMINUS                  { $$ = doNegate($2, @1); } +            | '|' a_expr                  %prec UMINUS +                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "|", NULL , $2, @1); } +            | RIGHT_ARROW a_expr                  %prec UMINUS +                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "->", NULL , $2, @1); }              | a_expr '+' a_expr                  { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }              | a_expr '-' a_expr @@ -15902,6 +15906,7 @@ a_expr:        c_expr                 { $$ = $1; }              | a_expr '|' a_expr                  { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "|", $1, $3, @2); } +              | a_expr qual_Op a_expr                %prec Op                  { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }              | qual_Op a_expr                    %prec Op @@ -16355,6 +16360,10 @@ b_expr:        c_expr                  { $$ = makeTypeCast($1, $3, @2); }              | '+' b_expr                    %prec UMINUS                  { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); } +            | '|' b_expr                    %prec UMINUS +                { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "|", NULL, $2, @1); } +            | RIGHT_ARROW b_expr                    %prec UMINUS +                { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "->", NULL, $2, @1); }              | '-' b_expr                    %prec UMINUS                  { $$ = doNegate($2, @1); }              | b_expr '+' b_expr -- 2.52.0 Test case says: CREATE FUNCTION identity_int(int) RETURNS int       LANGUAGE sql IMMUTABLE AS 'SELECT $1'; CREATE FUNCTION CREATE OPERATOR |  (RIGHTARG = int, FUNCTION = identity_int); CREATE OPERATOR CREATE OPERATOR -> (RIGHTARG = int, FUNCTION = identity_int); CREATE OPERATOR SELECT | 5;  ?column? ----------         5 (1 row) SELECT -> 5;  ?column? ----------         5 (1 row) Le 18/07/2026 à 10:39, PG Bug reporting form a écrit : > The following bug has been logged on the website: > > Bug reference: 19558 > Logged by: Pierre Senellart > Email address: pierre@senellart.com > PostgreSQL version: 19beta2 > Operating system: Linux > Description: > > The following works on PostgreSQL <= 18 but raises a syntax error on > 19beta1/19beta2 (tested: PostgreSQL 19beta2, Ubuntu package > 19~beta2-1.pgdg26.04+1, x86_64-linux): > > CREATE FUNCTION identity_int(int) RETURNS int > LANGUAGE sql IMMUTABLE AS 'SELECT $1'; > CREATE OPERATOR | (RIGHTARG = int, FUNCTION = identity_int); > CREATE OPERATOR -> (RIGHTARG = int, FUNCTION = identity_int); > > SELECT | 5; -- 18: returns 5; 19beta2: syntax error at or near "|" > SELECT -> 5; -- 18: returns 5; 19beta2: syntax error at or near "->" > > Cause: the SQL/PGQ property graph patch turned "|" and "->" into dedicated > grammar tokens (RIGHT_ARROW), declared in the precedence list alongside Op. > Explicit binary productions (a_expr '|' a_expr, a_expr RIGHT_ARROW a_expr) > preserve infix use, and both tokens were added to the operator-name > productions, so binary use and the OPERATOR() syntax still work: > > SELECT OPERATOR(public.|) 5; -- still returns 5 on 19beta2 > SELECT OPERATOR(public.->) 5; -- still returns 5 on 19beta2 > > But no unary counterparts of these productions were added, so a user-defined > *prefix* operator spelled exactly "|" or "->" can no longer be invoked by > its bare name. Note the inconsistency: CREATE OPERATOR still accepts both > names for prefix operators; the resulting operator just cannot be called > except through OPERATOR(). > > If the tokenization is here to stay, could unary productions ('|' a_expr, > RIGHT_ARROW a_expr) be added to restore the pre-19 behaviour? Failing that, > this seems worth an entry in the release notes' incompatibilities section, > since nothing currently documents it. > > Motivation: https://pgxn.org/dist/provsql/ which I am developing uses prefix > | as a probabilistic “given” operator. This works on all PostgreSQL versions > from 10 to 18, but fails on 19beta2. > > > > --------------9f6W8S1LdvHah4wlpoOSzM0L Content-Type: text/x-patch; charset=UTF-8; name="0001-bug-19558-Fix-user-defined-prefix-operators-and.patch" Content-Disposition: attachment; filename*0="0001-bug-19558-Fix-user-defined-prefix-operators-and.patch" Content-Transfer-Encoding: base64 RnJvbSBlNzAzMjM2ODI3MGI5YWM1ODY5OGU5MjQ5Zjc2NjczOWI2NmM4NDhhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQaWVycmUgRm9yc3RtYW5uIDxwaWVycmUuZm9yc3Rt YW5uQGdtYWlsLmNvbT4KRGF0ZTogU2F0LCAxOCBKdWwgMjAyNiAxNzozMzozMyArMDIwMApT dWJqZWN0OiBbUEFUQ0hdIGJ1ZyMxOTU1ODogRml4IHVzZXItZGVmaW5lZCBwcmVmaXggb3Bl cmF0b3JzICd8JyBhbmQgJy0+JwoKLS0tCiBzcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55IHwg OSArKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKykKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55IGIvc3JjL2JhY2tlbmQvcGFyc2VyL2dy YW0ueQppbmRleCBmZjRlMTM4Li4zMzFkYTc5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9w YXJzZXIvZ3JhbS55CisrKyBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKQEAgLTE1ODcz LDYgKzE1ODczLDEwIEBAIGFfZXhwcjoJCWNfZXhwcgkJCQkJCQkJCXsgJCQgPSAkMTsgfQog CQkJCXsgJCQgPSAoTm9kZSAqKSBtYWtlU2ltcGxlQV9FeHByKEFFWFBSX09QLCAiKyIsIE5V TEwsICQyLCBAMSk7IH0KIAkJCXwgJy0nIGFfZXhwcgkJCQkJJXByZWMgVU1JTlVTCiAJCQkJ eyAkJCA9IGRvTmVnYXRlKCQyLCBAMSk7IH0KKwkJCXwgJ3wnIGFfZXhwciAgICAgICAgICAg ICAgICAgICVwcmVjIFVNSU5VUyAKKwkJCQkgeyAkJCA9IChOb2RlICopIG1ha2VTaW1wbGVB X0V4cHIoQUVYUFJfT1AsICJ8IiwgTlVMTCAsICQyLCBAMSk7IH0KKwkJCXwgUklHSFRfQVJS T1cgYV9leHByICAgICAgICAgICAgICAgICAgJXByZWMgVU1JTlVTIAorCQkJCSB7ICQkID0g KE5vZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIi0+IiwgTlVMTCAsICQyLCBA MSk7IH0KIAkJCXwgYV9leHByICcrJyBhX2V4cHIKIAkJCQl7ICQkID0gKE5vZGUgKikgbWFr ZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIisiLCAkMSwgJDMsIEAyKTsgfQogCQkJfCBhX2V4 cHIgJy0nIGFfZXhwcgpAQCAtMTU5MDIsNiArMTU5MDYsNyBAQCBhX2V4cHI6CQljX2V4cHIJ CQkJCQkJCQl7ICQkID0gJDE7IH0KIAkJCXwgYV9leHByICd8JyBhX2V4cHIKIAkJCQl7ICQk ID0gKE5vZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgInwiLCAkMSwgJDMsIEAy KTsgfQogCisKIAkJCXwgYV9leHByIHF1YWxfT3AgYV9leHByCQkJCSVwcmVjIE9wCiAJCQkJ eyAkJCA9IChOb2RlICopIG1ha2VBX0V4cHIoQUVYUFJfT1AsICQyLCAkMSwgJDMsIEAyKTsg fQogCQkJfCBxdWFsX09wIGFfZXhwcgkJCQkJJXByZWMgT3AKQEAgLTE2MzU1LDYgKzE2MzYw LDEwIEBAIGJfZXhwcjoJCWNfZXhwcgogCQkJCXsgJCQgPSBtYWtlVHlwZUNhc3QoJDEsICQz LCBAMik7IH0KIAkJCXwgJysnIGJfZXhwcgkJCQkJJXByZWMgVU1JTlVTCiAJCQkJeyAkJCA9 IChOb2RlICopIG1ha2VTaW1wbGVBX0V4cHIoQUVYUFJfT1AsICIrIiwgTlVMTCwgJDIsIEAx KTsgfQorCQkJfCAnfCcgYl9leHByCQkJCQklcHJlYyBVTUlOVVMKKwkJCQl7ICQkID0gKE5v ZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgInwiLCBOVUxMLCAkMiwgQDEpOyB9 CisJCQl8IFJJR0hUX0FSUk9XIGJfZXhwcgkJCQkJJXByZWMgVU1JTlVTCisJCQkJeyAkJCA9 IChOb2RlICopIG1ha2VTaW1wbGVBX0V4cHIoQUVYUFJfT1AsICItPiIsIE5VTEwsICQyLCBA MSk7IH0KIAkJCXwgJy0nIGJfZXhwcgkJCQkJJXByZWMgVU1JTlVTCiAJCQkJeyAkJCA9IGRv TmVnYXRlKCQyLCBAMSk7IH0KIAkJCXwgYl9leHByICcrJyBiX2V4cHIKLS0gCjIuNTIuMAoK --------------9f6W8S1LdvHah4wlpoOSzM0L--