On Wed, 2019-08-21 at 21:54 -0700, Paul A Jungwirth wrote: > Sometimes I think about having a maybe<T> type instead of null/not > null. SQL nulls are already very "monadic" I think but nullability > doesn't travel.
Yeah, that would be a great direction, but there is some additional complexity that we'd need to deal with that a "normal" compiler does not: * handling both existing global types (like int) as well as on-the- fly types like Maybe<Either<Int,Bool>> * types need to do more things, like have serialized representations, interface with indexing strategies, and present the optimizer with choices that may influence which indexes can be used or not * at some point needs to work with normal SQL types and NULL * there are a lot of times we care not just whether a type is sortable, but we actually care about the way it's sorted (e.g. localization). typeclasses+newtype would probably be unacceptable for trying to match SQL behavior here. I'm all in favor of pursuing this, but it's not going to bear fruit very soon. > Btw I have working multirange_{send,recv,in,out} now, and I > automatically create a multirange type and its array type when > someone > creates a new range type. I have a decent start on passing tests and > no compiler warnings. I also have a start on anymultirange and > anyrangearray. (I think I need the latter to support a range-like > constructor function, so you can say `int4multirange(int4range(1,4), > int4range(8,10))`.) I want to get the any* types done and improve the > test coverage, and then I'll probably be ready to share a patch. Awesome! > Here are a couple other questions: > > - Does anyone have advice for the typanalyze function? I feel pretty > out of my depth there (although I haven't looked into typanalyze > stuff > very deeply yet). I can probably get some inspiration from > range_typanalyze and array_typanalyze, but those are both quite > detailed (their statistics functions that is). I think Alexander Korotkov did a lot of the heavy lifting here, perhaps he has a comment? I'd keep it simple for now if you can, and we can try to improve it later. > - What should a multirange do if you give it an empty range? I'm > thinking it should just ignore it, but then `'{}'::int4multirange = > '{empty}'::int4multirange`. Does that seem okay? (It does to me > actually, if we think of `empty` as the additive identity. Similarly > mr + empty = mr. I agree. Multiranges are more than just an array of ranges, so they coalesce into some canonical form. > - What should a multirange do if you give it a null, like > `int4multirange(int4range(1,4), null)`. I'm thinking it should be > null, just like mr + null = null. Right? Yes. NULL is for the overall multirange datum (that is, a multirange column can be NULL), but I don't think individual parts of a datatype make much sense as NULL. So, I agree that mr + null = null. (Note that arrays and records can have NULL parts, but I don't see a reason we should follow those examples for multiranges.) Regards, Jeff Davis