Thread
-
Re: BUG #19356: Unexpected result of prepared UPDATE with force_generic_plan
Tender Wang <tndrwang@gmail.com> — 2025-12-26T07:20:58Z
ZhangChi <798604270@qq.com> 于2025年12月26日周五 15:00写道: > Hi, > > Has anyone had a look at this report? > > Best, > Chi > > Original > ------------------------------ > From: PG Bug reporting form <noreply@postgresql.org> > Date: 2025-12-16 11:06 > To: pgsql-bugs <pgsql-bugs@lists.postgresql.org> > Cc: 798604270 <798604270@qq.com> > Subject: BUG #19356: Unexpected result of prepared UPDATE with > force_generic_plan > > The following bug has been logged on the website: > > Bug reference: 19356 > Logged by: Chi Zhang > Email address: 798604270@qq.com > PostgreSQL version: 17.6 > Operating system: ubuntu 24.04 with docker > Description: > > Hi, > > In the following test case, the WHERE condition of UPDATE is true; however, > the value in the table is not updated: > > ``` > SET plan_cache_mode = force_generic_plan; > CREATE TABLE t2(c0 int4range); > > INSERT INTO t2(c0) VALUES('[-1372225904,-410785016)'::int4range) ON CONFLICT > DO NOTHING; > PREPARE prepare_query (text, int4range, text, text, inet) AS UPDATE t2 SET > c0=DEFAULT WHERE NOT (((((CAST($1 AS > int4range))&&(((t2.c0)-($2)))))AND((quote_literal($3) SIMILAR TO > (($4)||($5)))))); > EXECUTE prepare_query('-2073583882', '[-1190073754,1650158810)'::int4range, > '?', 'j&Q', '171.191.143.34'); > DEALLOCATE prepare_query; > SELECT DISTINCT * FROM t2; > c0 > -------------------------- > [-1372225904,-410785016) > (1 row) > ``` > > This is the result of the condition: > ``` > PREPARE prepare_query (text, int4range, text, text, inet) AS SELECT > ((((quote_literal($3) SIMILAR TO (($4)||($5)))))); > EXECUTE prepare_query('-2073583882', '[-1190073754,1650158810)'::int4range, > '?', 'j&Q', '171.191.143.34'); > ?column? > ---------- > f > (1 row) > ``` > > > The equivalent normal UPDATE can execute correctly `UPDATE t2 SET c0=DEFAULT > WHERE NOT (((((CAST('-2073583882'::text AS > > int4range))&&(((t2.c0)-('[-1190073754,1650158810)'::int4range)))))AND((quote_literal('?'::text) > SIMILAR TO (('j&Q'::text)||('171.191.143.34'::inet))))));` > > > I run your SQL on 17.6, I got this: postgres=# select version(); version --------------------------------------------------------------------------------------------------------- PostgreSQL 17.6 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0, 64-bit (1 row) postgres=# SET plan_cache_mode = force_generic_plan; CREATE TABLE t2(c0 int4range); INSERT INTO t2(c0) VALUES('[-1372225904,-410785016)'::int4range) ON CONFLICT DO NOTHING; PREPARE prepare_query (text, int4range, text, text, inet) AS UPDATE t2 SET c0=DEFAULT WHERE NOT (((((CAST($1 AS int4range))&&(((t2.c0)-($2)))))AND((quote_literal($3) SIMILAR TO (($4)||($5)))))); EXECUTE prepare_query('-2073583882', '[-1190073754,1650158810)'::int4range, '?', 'j&Q', '171.191.143.34'); DEALLOCATE prepare_query; SELECT DISTINCT * FROM t2; SET CREATE TABLE INSERT 0 1 PREPARE ERROR: malformed range literal: "-2073583882" DETAIL: Missing left parenthesis or bracket. DEALLOCATE c0 -------------------------- [-1372225904,-410785016) (1 row) EXECUTE prepare_query('-2073583882', '[-1190073754,1650158810)'::int4range, '?', 'j&Q', '171.191.143.34'); This SQL reported error: malformed range literal: "-2073583882", so it did nothing. -- Thanks, Tender Wang