Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qcCpS-00EG2b-7K for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Sep 2023 22:41:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qcCpO-000OQn-UI for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Sep 2023 22:41:22 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qcCpO-000OPa-Ju for pgsql-hackers@lists.postgresql.org; Fri, 01 Sep 2023 22:41:22 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qcCpK-002EKE-NA for pgsql-hackers@lists.postgresql.org; Fri, 01 Sep 2023 22:41:21 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 23A981C0003; Fri, 1 Sep 2023 22:41:13 +0000 (UTC) Message-ID: <5463561d-2e35-2e49-f516-df64dd5510e7@postgresfriends.org> Date: Sat, 2 Sep 2023 00:41:13 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: SQL:2011 application time Content-Language: en-US To: Paul Jungwirth , Peter Eisentraut Cc: Corey Huinker , PostgreSQL Hackers References: <5650d77a-1d73-fd8d-4410-8e97dbeff572@illuminatedcomputing.com> <21964319-46e5-3e47-217b-6ac4169bdf13@enterprisedb.com> <27361388-f5ab-ea36-ea35-41d68a90e60d@illuminatedcomputing.com> <152e4c2c-36b4-bdc0-1b62-e9f9e8b68adc@enterprisedb.com> <251B44D1-D3E0-47E4-AB9D-4A848EDB495E@yesql.se> <1c674adf-4114-e8d8-cec7-ac10e2f424c7@enterprisedb.com> <831f17ba-ff36-1380-a475-a7cd2c65a89c@enterprisedb.com> <6f010a6e-8e20-658b-dc05-dc9033a694da@eisentraut.org> <7d44dade-ff31-5eef-80ac-78ed838066f6@postgresfriends.org> <88dadcc1-6652-ff7d-264d-73906a53dee9@illuminatedcomputing.com> From: Vik Fearing In-Reply-To: <88dadcc1-6652-ff7d-264d-73906a53dee9@illuminatedcomputing.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-GND-Sasl: vik@postgresfriends.org List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 9/1/23 21:56, Paul Jungwirth wrote: > On 9/1/23 03:50, Vik Fearing wrote: >> On 9/1/23 11:30, Peter Eisentraut wrote: >>> 1) If I write UNIQUE (a, b, c WITHOUT OVERLAPS), does the WITHOUT >>> OVERLAPS clause attach to the last column, or to the whole column >>> list? In the SQL standard, you can only have one period and it has to >>> be listed last, so this question does not arise.  But here we are >>> building a more general facility to then build the SQL facility on >>> top of.  So I think it doesn't make sense that the range column must >>> be last or that there can only be one.  Also, your implementation >>> requires at least one non-overlaps column, which also seems like a >>> confusing restriction. >>> >>> I think the WITHOUT OVERLAPS clause should be per-column, so that >>> something like UNIQUE (a WITHOUT OVERLAPS, b, c WITHOUT OVERLAPS) >>> would be possible.  Then the WITHOUT OVERLAPS clause would directly >>> correspond to the choice between equality or overlaps operator per >>> column. >>> >>> An alternative interpretation would be that WITHOUT OVERLAPS applies >>> to the whole column list, and we would take it to mean, for any range >>> column, use the overlaps operator, for any non-range column, use the >>> equals operator.  But I think this would be confusing and would >>> prevent the case of using the equality operator for some ranges and >>> the overlaps operator for some other ranges in the same key. >> >> I prefer the first option.  That is: WITHOUT OVERLAPS applies only to >> the column or expression it is attached to, and need not be last in line. > > I agree. The second option seems confusing and is more restrictive. > > I think allowing multiple uses of `WITHOUT OVERLAPS` (and in any > position) is a great recommendation that enables a lot of new > functionality. Several books[1,2] about temporal databases describe a > multi-dimensional temporal space (even beyond application time vs. > system time), and the standard is pretty disappointing here. It's not a > weird idea. > > But I just want to be explicit that this isn't something the standard > describes. (I think everyone in the conversation so far understands > that.) So far I've tried to be pretty scrupulous about following > SQL:2011, although personally I'd rather see Postgres support this > functionality. And it's not like it goes *against* what the standard > says. But if there are any objections, I'd love to hear them before > putting in the work. :-) I have no problem with a first version doing exactly what the standard says and expanding it later. > If we allow multiple+anywhere WITHOUT OVERLAPS in PRIMARY KEY & UNIQUE > constraints, then surely we also allow multiple+anywhere PERIOD in > FOREIGN KEY constraints too. (I guess the standard switched keywords > because a FK is more like "MUST OVERLAPS". :-) Seems reasonable. > Also if you have multiple application-time dimensions we probably need > to allow multiple FOR PORTION OF clauses. I think the syntax would be: > > UPDATE t >   FOR PORTION OF valid_at FROM ... TO ... >   FOR PORTION OF asserted_at FROM ... TO ... >   [...] >   SET foo = bar > > Does that sound okay? That sounds really cool. > [1] C. J. Date, Hugh Darwen, Nikos Lorentzos. Time and Relational > Theory, Second Edition: Temporal Databases in the Relational Model and > SQL. 2nd edition, 2014. > [2] Tom Johnston. Bitemporal Data: Theory and Practice. 2014. Thanks! I have ordered these books. -- Vik Fearing