On Tue, Apr 7, 2015 at 3:09 PM, Jim Nasby <jim.na...@bluetreble.com> wrote:

> On 4/7/15 4:35 PM, Tom Lane wrote:
>
>> Jim Nasby <jim.na...@bluetreble.com> writes:
>>
>>> On 4/7/15 4:17 PM, Tom Lane wrote:
>>>
>>>> I suspect that that's only the tip of the iceberg.  Remember the mess
>>>> we had with implicit casts to text?  And those only existed for a dozen
>>>> or so types, not for everything.  Every function or operator you define
>>>> for "variant" is going to be a loaded gun just waiting to shoot your
>>>> foot
>>>> off, if you make all those casts implicit.
>>>>
>>>
>>  Yeah, that's why I avoided it. But that makes using it in a function a
>>> real pain. :( I think this is a bit of a different scenario though,
>>> because I don't see why you'd want to overload a function to accept both
>>> variant and some other type.
>>>
>>
>>  Really what I want is for casting to variant to be a last-choice option,
>>> and even then only for function calls, not operators. I believe that
>>> would be safe, because then you'd have to explicitly be calling a
>>> function, or explicitly doing something::variant = variant.
>>>
>>
>> Just out of curiosity, what's the point of this type at all, compared
>> to "anyelement" and friends?
>>
>
> The two big differences are that you can store a variant in a table (with
> reasonable protection against things like dropping the underlying type out
> from under it), and you can readily determine what the original type was.
> ​ ​
> Well, and you're not limited to a single type in a function as you are
> with polymorphic.


> One place I've wanted this in the past is to allow storing settings or
> other configuration in the database. Currently you're stuck either casting
> everything to and from text or having a bunch of fields. With variant you
> just store what you're handed.
>
> The other thing I'm currently working on is a template system that would
> allow you to use whatever type you wanted to pass data to a template (and
> for the template itself), as well as allowing you to store templates for
> later re-use. The nice thing about variant in this context is that the
> framework itself doesn't really need to care about what's being passed
> through it. If it didn't support storing templates I could probably get
> away with anyelement for this; but that kinda defeats the purpose.
>
> I think there's a chicken and egg problem here. I've pondered variant for
> several years and never thought of anything better than the case of storing
> settings, which was hardly compelling enough to invest the work. I finally
> decided to do it anyway just to see what would be required. Only after I
> had something working did it occur to me that I could use this to build a
> template system. It's certainly possible that there isn't all that
> compelling of a case for variants afterall, but I don't think they'll get a
> fair shake unless there's something available that's pretty workable. I
> suspect there's actually some rather interesting things it could be used
> for if people start thinking about it.
>
> Your question does raise an interesting thought though... is there some
> way I could leverage the polymorphic system here? I did experiment with
> having functions accept anyelement instead of a variant and had some
> success with that (though IIRC plpgsql tended to revolt when trying to
> assign that to a variant in older versions).
>
>
​I recently posited a use for an "anyelement"-like pseudo type that didn't
have all the function restrictions of existing pseudo-types.

http://www.postgresql.org/message-id/cakfquwazck37j7fa4pzoz8m9jskmqqopaftxry0ca_n4r2x...@mail.gmail.com

The idea was to define a function with one pseudo-type and one generic
(any) type that the caller is responsible for supplying a meaningful
specific type that the function can act upon.  But this specific use would
not need an actual type but only another pseudo-type.
​

Given the nature of SQL, and PostgreSQL's implementation thereof, a storage
"variant" type seems non-idiomatic and problematic in usage.  Hell, my
recollection is that our implementation of Domains has some meaningful
hiccups when dealing with type promotion and base-type comparisons; and
domains are considerably less complicated than "Variant"...

Neither "settings" nor "templates" screams for a non-text solution; but I
also haven't given topic much consideration.

The typed text capability would allow for a simpler UI but for the limited
cases where it is a valid model (e.g., a settings table) writing a
function-based UI would provide a place to hook in the desired input
validation without introducing a entirely new global concept.

David J.

Reply via email to