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


Reply via email to