Skip to content

Commit

Permalink
fix(current_history): Fixed lower range not being set correctly when … (
Browse files Browse the repository at this point in the history
#75)

* fix(current_history): Fixed lower range not being set correctly when including current version in history. Moved mitigate_update_conflicts to be a VAR like other ARG variables. Updated tests to reflect new change

* Matching original extension functionality to raise ERROR if start and end timestamp ranges are the same

* Updated no checks function with new changes

* Updated system time tests to set timestamp on each transaction and closely mirror original extension tests

* tweak to test to check less than too

* updated comments
  • Loading branch information
kieranswhite authored Nov 19, 2024
1 parent 956f27a commit 4f0d730
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 81 deletions.
8 changes: 4 additions & 4 deletions test/expected/invalid_system_period.out
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
CREATE TABLE invalid_system_period (sys_period bigint);
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);
INSERT INTO invalid_system_period DEFAULT VALUES;
ERROR: system period column "sys_period" of relation "invalid_system_period" is not a range but type bigint
CREATE TABLE invalid_system_period2 (sys_period tstzrange);
ALTER TABLE invalid_system_period2 DROP COLUMN sys_period;
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period2
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);
INSERT INTO invalid_system_period2 DEFAULT VALUES;
ERROR: column "sys_period" of relation "invalid_system_period2" does not exist
CREATE TABLE invalid_system_period3 (sys_period tstzrange[]);
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period3
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);
INSERT INTO invalid_system_period3 DEFAULT VALUES;
ERROR: system period column "sys_period" of relation "invalid_system_period3" is not a range but an array
CREATE TABLE invalid_system_period4 (sys_period tsrange);
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period4
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);
INSERT INTO invalid_system_period4 DEFAULT VALUES;
ERROR: system period column "sys_period" of relation "invalid_system_period4" is not a range of timestamp with timezone but of type timestamp without time zone
2 changes: 1 addition & 1 deletion test/expected/no_system_period.out
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ SET client_min_messages TO error;
CREATE TABLE no_system_period ();
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON no_system_period
FOR EACH ROW EXECUTE PROCEDURE versioning(NULL, NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning(NULL, NULL, false);
INSERT INTO no_system_period DEFAULT VALUES;
ERROR: column "null" of relation "no_system_period" does not exist
99 changes: 64 additions & 35 deletions test/expected/set_system_time.out
Original file line number Diff line number Diff line change
Expand Up @@ -9,70 +9,99 @@ FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'versioning_history', fa
-- Insert.
BEGIN;
SELECT set_system_time('2001-01-01 22:59:59.001.000234');
set_system_time
set_system_time
--------------------------------
2001-01-01 22:59:59.001.000234
(1 row)

INSERT INTO versioning (a) VALUES (3);
SELECT * FROM versioning_history;
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;
a | b b | sys_period
---+-----+------------------------------------
1 | | [-infinity,)
2 | | ["2000-01-01 00:00:00+00",)
3 | | ["2001-01-01 22:59:59.001234+00",)
(3 rows)

SELECT * FROM versioning_history ORDER BY a, sys_period;
a | c | sys_period
---+---+------------
(0 rows)

COMMIT;
-- Update.
BEGIN;
SELECT set_system_time('2001-02-01 22:59:59.001.000234');
set_system_time
--------------------------------
2001-02-01 22:59:59.001.000234
(1 row)

UPDATE versioning SET a = 4 WHERE a = 3;
SELECT * FROM versioning_history;
a | c | sys_period
---+---+------------------------------------
3 | | (,"2001-01-01 22:59:59.001234+00")
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;
a | b b | sys_period
---+-----+------------------------------------
1 | | [-infinity,)
2 | | ["2000-01-01 00:00:00+00",)
4 | | ["2001-02-01 22:59:59.001234+00",)
(3 rows)

SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;
a | c | sys_period
---+---+-------------------------------------------------------------------
3 | | ["2001-01-01 22:59:59.001234+00","2001-02-01 22:59:59.001234+00")
(1 row)

COMMIT;
-- Reset system time and do multiple updates.
BEGIN;
SELECT set_system_time('2001-03-01 22:59:59.001.000234');
set_system_time
--------------------------------
2001-03-01 22:59:59.001.000234
(1 row)

UPDATE versioning SET a = 5 WHERE a = 4;
UPDATE versioning SET "b b" = '2012-01-01' WHERE a = 5;
SELECT * FROM versioning_history;
a | c | sys_period
---+---+------------------------------------
3 | | (,"2001-01-01 22:59:59.001234+00")
4 | | (,"2001-01-01 22:59:59.001234+00")
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;
a | b b | sys_period
---+------------+------------------------------------
1 | | [-infinity,)
2 | | ["2000-01-01 00:00:00+00",)
5 | 2012-01-01 | ["2001-03-01 22:59:59.001234+00",)
(3 rows)

SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;
a | c | sys_period
---+---+-------------------------------------------------------------------
3 | | ["2001-01-01 22:59:59.001234+00","2001-02-01 22:59:59.001234+00")
4 | | ["2001-02-01 22:59:59.001234+00","2001-03-01 22:59:59.001234+00")
(2 rows)

COMMIT;
-- Delete.
BEGIN;
SELECT set_system_time('2022-01-11 12:00:00.000.000000');
set_system_time
SELECT set_system_time('2001-04-01 22:59:59.001.000234');
set_system_time
--------------------------------
2022-01-11 12:00:00.000.000000
2001-04-01 22:59:59.001.000234
(1 row)

DELETE FROM versioning WHERE a = 4;
SELECT * FROM versioning_history;
a | c | sys_period
---+---+------------------------------------
3 | | (,"2001-01-01 22:59:59.001234+00")
4 | | (,"2001-01-01 22:59:59.001234+00")
(2 rows)
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;
a | b b | sys_period
---+------------+------------------------------------
1 | | [-infinity,)
2 | | ["2000-01-01 00:00:00+00",)
5 | 2012-01-01 | ["2001-03-01 22:59:59.001234+00",)
(3 rows)

END;
-- Delete.
BEGIN;
DELETE FROM versioning;
SELECT * FROM versioning_history;
a | c | sys_period
---+---+------------------------------------
3 | | (,"2001-01-01 22:59:59.001234+00")
4 | | (,"2001-01-01 22:59:59.001234+00")
1 | | (,"2022-01-11 12:00:00+00")
2 | | (,"2022-01-11 12:00:00+00")
5 | | (,"2022-01-11 12:00:00+00")
(5 rows)
SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;
a | c | sys_period
---+---+-------------------------------------------------------------------
3 | | ["2001-01-01 22:59:59.001234+00","2001-02-01 22:59:59.001234+00")
4 | | ["2001-02-01 22:59:59.001234+00","2001-03-01 22:59:59.001234+00")
(2 rows)

END;
COMMIT;
DROP TABLE versioning;
DROP TABLE versioning_history;
24 changes: 20 additions & 4 deletions test/expected/versioning_including_current_version_in_history.out
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ INSERT INTO versioning (a, sys_period) VALUES (2, tstzrange('2000-01-01', NULL))
CREATE TABLE versioning_history (a bigint, c date, sys_period tstzrange);
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON versioning
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'versioning_history', false, false, true);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'versioning_history', true, false, true);
-- Insert.
BEGIN;
INSERT INTO versioning (a) VALUES (3);
Expand Down Expand Up @@ -52,7 +52,7 @@ SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER
SELECT a, c, lower(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
3 | |
3 | | f
4 | | t
(2 rows)

Expand All @@ -62,6 +62,13 @@ SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDE
4 |
(1 row)

SELECT a, c, lower(sys_period) IS NOT NULL FROM versioning_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
3 | | t
4 | | t
(2 rows)

COMMIT;
-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);
Expand All @@ -74,7 +81,7 @@ SELECT pg_sleep(0.1);
BEGIN;
UPDATE versioning SET a = 5 WHERE a = 4;
UPDATE versioning SET "b b" = '2012-01-01' WHERE a = 5;
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP FROM versioning ORDER BY a, sys_period;
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' FROM versioning ORDER BY a, sys_period;
a | b b | ?column?
---+------------+----------
1 | | f
Expand All @@ -87,11 +94,20 @@ SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER
---+---+----------
3 | | f
4 | | t
5 | | f
5 | |
(4 rows)

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' FROM versioning_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
3 | | f
4 | | f
5 | | t
5 | |
(4 rows)

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' ORDER BY a, sys_period;
a | b b
---+------------
5 | 2012-01-01
Expand Down
8 changes: 4 additions & 4 deletions test/sql/invalid_system_period.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ CREATE TABLE invalid_system_period (sys_period bigint);

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);

INSERT INTO invalid_system_period DEFAULT VALUES;

Expand All @@ -12,22 +12,22 @@ ALTER TABLE invalid_system_period2 DROP COLUMN sys_period;

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period2
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);

INSERT INTO invalid_system_period2 DEFAULT VALUES;

CREATE TABLE invalid_system_period3 (sys_period tstzrange[]);

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period3
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);

INSERT INTO invalid_system_period3 DEFAULT VALUES;

CREATE TABLE invalid_system_period4 (sys_period tsrange);

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON invalid_system_period4
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', NULL, false);

INSERT INTO invalid_system_period4 DEFAULT VALUES;
2 changes: 1 addition & 1 deletion test/sql/no_system_period.sql
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ CREATE TABLE no_system_period ();

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON no_system_period
FOR EACH ROW EXECUTE PROCEDURE versioning(NULL, NULL, NULL);
FOR EACH ROW EXECUTE PROCEDURE versioning(NULL, NULL, false);

INSERT INTO no_system_period DEFAULT VALUES;
34 changes: 17 additions & 17 deletions test/sql/set_system_time.sql
Original file line number Diff line number Diff line change
Expand Up @@ -17,48 +17,48 @@ SELECT set_system_time('2001-01-01 22:59:59.001.000234');

INSERT INTO versioning (a) VALUES (3);

SELECT * FROM versioning_history;
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;

COMMIT;
SELECT * FROM versioning_history ORDER BY a, sys_period;

COMMIT;
-- Update.
BEGIN;

SELECT set_system_time('2001-02-01 22:59:59.001.000234');

UPDATE versioning SET a = 4 WHERE a = 3;

SELECT * FROM versioning_history;
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;

COMMIT;
SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;

-- Reset system time and do multiple updates.
COMMIT;
BEGIN;

SELECT set_system_time('2001-03-01 22:59:59.001.000234');

UPDATE versioning SET a = 5 WHERE a = 4;
UPDATE versioning SET "b b" = '2012-01-01' WHERE a = 5;

SELECT * FROM versioning_history;
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;

SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;

COMMIT;

-- Delete.
BEGIN;

SELECT set_system_time('2022-01-11 12:00:00.000.000000');
SELECT set_system_time('2001-04-01 22:59:59.001.000234');

DELETE FROM versioning WHERE a = 4;

SELECT * FROM versioning_history;
SELECT a, "b b", sys_period FROM versioning ORDER BY a, sys_period;

END;
SELECT a, c, sys_period FROM versioning_history ORDER BY a, sys_period;

-- Delete.
BEGIN;

DELETE FROM versioning;

SELECT * FROM versioning_history;

END;
COMMIT;

DROP TABLE versioning;
DROP TABLE versioning_history;
10 changes: 7 additions & 3 deletions test/sql/versioning_including_current_version_in_history.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ CREATE TABLE versioning_history (a bigint, c date, sys_period tstzrange);

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON versioning
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'versioning_history', false, false, true);
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'versioning_history', true, false, true);

-- Insert.
BEGIN;
Expand Down Expand Up @@ -37,6 +37,8 @@ SELECT a, c, lower(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;

SELECT a, c, lower(sys_period) IS NOT NULL FROM versioning_history ORDER BY a, sys_period;

COMMIT;

-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
Expand All @@ -48,11 +50,13 @@ BEGIN;
UPDATE versioning SET a = 5 WHERE a = 4;
UPDATE versioning SET "b b" = '2012-01-01' WHERE a = 5;

SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP FROM versioning ORDER BY a, sys_period;
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' FROM versioning ORDER BY a, sys_period;

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER BY a, sys_period;

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' FROM versioning_history ORDER BY a, sys_period;

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP + interval '1 microseconds' ORDER BY a, sys_period;

COMMIT;

Expand Down
Loading

0 comments on commit 4f0d730

Please sign in to comment.