Re: WIP: System Versioned Temporal Table - Mailing list pgsql-hackers

From Hannu Krosing
Subject Re: WIP: System Versioned Temporal Table
Date
Msg-id CAMT0RQR4XHFyced+FzEaRdwOc3hpBRPHC+26WK3-OvZaz1vVHQ@mail.gmail.com
Whole thread Raw
In response to Re: WIP: System Versioned Temporal Table  (Corey Huinker <corey.huinker@gmail.com>)
List pgsql-hackers
On Mon, Sep 20, 2021 at 7:09 AM Corey Huinker <corey.huinker@gmail.com> wrote:
>
> On Sun, Sep 19, 2021 at 3:12 PM Hannu Krosing <hannuk@google.com> wrote:
>>
>> A side table has the nice additional benefit that we can very easily
>> version the *table structure* so when we ALTER TABLE and the table
>> structure changes we just make a new side table with now-currents
>> structure.
>
>
> It's true that would allow for perfect capture of changes to the table structure, but how would you query the thing?
>
> If a system versioned table was created with a column foo that is type float, and then we dropped that column, how
wouldwe ever query what the value of foo was in the past?
 


We can query that thing only in tables AS OF the time when the column
was still there.

We probably could get away with pretending the dropped columns to be
NULL in newer versions (and the versions before the column was added)

Even more tricky case would be changing the column data type.

>
> Would the columns returned from SELECT * change based on the timeframe requested?


If we want to emulate real table history, then it should.

But the * thing was not really specified well even for original
PostgreSQL inheritance.

Maybe we could do SELECT (* AS OF 'yesterday afternoon'::timestamp) FROM ... :)

> If we then later added another column that happened to also be named foo but now was type JSONB, would we change the
datatypereturned based on the time period being queried?
 

Many databases do allow returning multiple result sets, and actually
the PostgreSQL wire *protocol* also theoretically supports this, just
that it is not supported by any current client library.

With current libraries it would be possible to return a dynamic
version of  row_to_json(t.*) which changes based on actual historical
table structure

> Is the change in structure a system versioning which itself must be captured?

We do capture it (kind of) for logical decoding. That is, we decode
according to the structure in effect at the time of row creation,
though we currently miss the actual DDL itself.


So there is a lot to figure out and define, but at least storing the
history in a separate table gives a good foundation to build upon.



-----
Hannu Krosing
Google Cloud - We have a long list of planned contributions and we are hiring.
Contact me if interested.



pgsql-hackers by date:

Previous
From: Ajin Cherian
Date:
Subject: Re: row filtering for logical replication
Next
From: Antonin Houska
Date:
Subject: Re: [PATCH] Full support for index LP_DEAD hint bits on standby