On 2018/04/10 23:37, David Rowley wrote: > On 10 April 2018 at 23:13, Kyotaro HORIGUCHI > <[email protected]> wrote: >> Note: This is not intended to be committed this time but just for >> information. >> >> At Tue, 10 Apr 2018 10:34:27 +0900 (Tokyo Standard Time), Kyotaro HORIGUCHI >> wrote: >>> Just adding negation would work as a_expr is doing. >>> >>>> | '-' a_expr %prec UMINUS >>>> { $$ = doNegate($2, @1); } >> >> a_expr fits partbound_datum_list as is but it cannot sit >> side-by-side with MAX/MINVALUE at all. However c_expr can if >> columnref is not excluded. The attached patch does that and >> partition bound accepts the following syntax. (I didn't see the >> transform side at all) >> >> create table p2c1 partition of p2 for values from (log(1000),0+1,0/1) to >> (10, 10, ('1'||'0')::int); > > I imagined this would have had a check for volatile functions and some > user-friendly error message to say partition bounds must be immutable, > but instead, it does: > > postgres=# create table d_p1 partition of d for values in (Random()); > ERROR: specified value cannot be cast to type double precision for column "d" > LINE 1: create table d_p1 partition of d for values in (Random()); > ^ > DETAIL: The cast requires a non-immutable conversion. > HINT: Try putting the literal value in single quotes. > > For inspiration, maybe you could follow the lead of CREATE INDEX: > > postgres=# create index on d ((random())); > ERROR: functions in index expression must be marked IMMUTABLE
Hmm, I think we do already check that the *partition key* expression is IMMUTABLE. create table foo (a int) partition by list (random()); ERROR: functions in partition key expression must be marked IMMUTABLE This sounds to not apply to what we'd want to do with a partition bound expression. Thanks, Amit
