Hello,
I noticed a behavior that was surprising to me,
so I wanted to know if such behavior is expected.
I created a partial unique index on table "t",
and a prepared statement in which a subexpression
of the index's WHERE clause figures as a parameter.
# CREATE TABLE t(i int);
# CREATE UNIQUE INDEX ON t(i) WHERE i >= 2;
# PREPARE u(int) AS
INSERT INTO t VALUES(3)
ON CONFLICT (i) WHERE i >= $1
DO NOTHING;
After performing "EXPLAIN EXECUTE u(2)" 5 times
and getting a valid query plan, the 6th execution
of the same statement results in:
# EXPLAIN EXECUTE u(2);
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
It seems that the attempt to create a generic
execution plan fails because inference is
impossible without a concrete value.
The documentation for "PREPARE" talks about prepared
statements being "semantically *almost* equivalent",
so I guess some change in statement meaning is
allowed (although in this case I'd say that the
statement loses meaning after 5th execution, because
it becomes invalid).
Regards,
Bojan