Thread

  1. Re: domain for WITHOUT OVERLAPS

    jian he <jian.universality@gmail.com> — 2025-12-29T07:17:42Z

    On Tue, Dec 23, 2025 at 11:25 AM Paul A Jungwirth
    <pj@illuminatedcomputing.com> wrote:
    >
    > > diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
    > > index 6a347698edf..e27ca1466f2 100644
    > > --- a/src/backend/utils/cache/typcache.c
    > > +++ b/src/backend/utils/cache/typcache.c
    > > @@ -944,6 +944,8 @@ lookup_type_cache(Oid type_id, int flags)
    > >          typentry->domainBaseTypmod = -1;
    > >          typentry->domainBaseType =
    > >              getBaseTypeAndTypmod(type_id, &typentry->domainBaseTypmod);
    > > +        typentry->domainBaseTyptype =
    > > +            get_typtype(typentry->domainBaseType);
    > >      }
    > >      if ((flags & TYPECACHE_DOMAIN_CONSTR_INFO) &&
    > >          (typentry->flags & TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS) == 0 &&
    >
    > Is there any performance concern about adding this lookup?
    > From what I can tell we don't use TYPECACHE_DOMAIN_BASE_INFO very
    > often, so it is probably okay.
    > We can get here in the executor from ExecEvalWholeRowVar, but that
    > seems acceptable to me.
    >
    >
    hi.
    
    To make WITHOUT OVERLAPS work with domains, ExecWithoutOverlapsNotEmpty requires
    the base type’s typtype. I do not see a viable alternative approach.
    
    We can cache the base type's typtype in TypeCacheEntry->domainBaseTyptype.
    
    ```
        if ((flags & TYPECACHE_DOMAIN_BASE_INFO) &&
            typentry->domainBaseType == InvalidOid &&
            typentry->typtype == TYPTYPE_DOMAIN)
        {
            typentry->domainBaseTypmod = -1;
            typentry->domainBaseType =
                getBaseTypeAndTypmod(type_id, &typentry->domainBaseTypmod);
            typentry->domainBaseTyptype =
                get_typtype(typentry->domainBaseType);
        }
    ```
    
    We look up the domain base type’s typtype only once. On subsequent
    lookup_type_cache call, typentry->domainBaseType already is a valid OID, so the
    IF branch above will not be reached.
    so. I don't see any performance issues here.
    
    >
    > Also testing a range over a domain (in WITHOUT OVERLAPS position) would be good.
    >
    I do not think we need extensive foreign key–related tests, because
    check_exclusion_or_unique_constraint is only invoked for data changes on the
    primary key side. So, I kept only a single foreign key–related test.
    
    The attached patch should address all of your comments.
    I think you will like attached regress tests.
    
    
    
    --
    jian
    https://www.enterprisedb.com/