Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optionally use history table oid in trigger definition #35

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
dist: trusty
sudo: required
language: c
env:
- PG=10
- PG=9.6
- PG=9.5
- PG=9.4
- PG=9.3
- PG=9.2
install:
- sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main 10" > /etc/apt/sources.list.d/pgdg.list'
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- PGPORT=5440
- sudo /etc/init.d/postgresql stop
- sudo apt-get update -o Dir::Etc::sourcelist=/dev/null
- sudo apt-get -o Dir::Etc::sourcelist="/etc/apt/sources.list.d/pgdg.list" -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0' update
- sudo apt-get install postgresql-$PG postgresql-server-dev-$PG
- sudo pg_createcluster -p $PGPORT $PG test
- sudo sed -i '1i local all all trust' /etc/postgresql/$PG/test/pg_hba.conf
Expand Down
2 changes: 1 addition & 1 deletion GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ DOCS = README.md

REGRESS = install no_system_period invalid_system_period \
no_history_table no_history_system_period invalid_types \
invalid_system_period_values \
invalid_system_period_values renaming \
versioning versioning_custom_system_time combinations \
structure uninstall

Expand Down
18 changes: 11 additions & 7 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@ environment:
PGUSER: postgres
PGPASSWORD: Password12!
matrix:
- exe: postgresql-9.3.14-1-windows-%PLATFORM%.exe
- exe: postgresql-9.4.9-1-windows-%PLATFORM%.exe
- exe: postgresql-9.5.4-1-windows-%PLATFORM%.exe
- exe: postgresql-9.6.0-1-windows-%PLATFORM%.exe
- exe: postgresql-9.3.18-1-windows-%PLATFORM%.exe
- exe: postgresql-9.4.13-1-windows-%PLATFORM%.exe
- exe: postgresql-9.5.8-1-windows-%PLATFORM%.exe
- exe: postgresql-9.6.4-1-windows-%PLATFORM%.exe
- exe: postgresql-10.0-beta3-windows-%PLATFORM%.exe

install:
- set dist=%exe:-x86=%
- set pgversion=%exe:~11,3%
# http://www.databasesoup.com/2016/05/changing-postgresql-version-numbering.html
- for /f "tokens=2 delims=-" %%A in ("%exe%") do set pgversion=%%~nA
- echo pgversion=%pgversion%
- if %PLATFORM%==x64 ( set pf=%ProgramFiles%&& set x64=-x64) else set pf=%ProgramFiles(x86)%
- set pgroot=%pf%\PostgreSQL\%pgversion%
Expand Down Expand Up @@ -61,10 +63,12 @@ test_script:
- net start postgresql%x64%-%pgversion%

- appveyor AddTest Regression -Framework pg_regress -FileName sql\ -Outcome Running
- if %pgversion:~2,1% LEQ 4 ( set psqlopt=--psqldir) else set psqlopt=--bindir
- set psqlopt=--bindir
- if %pgversion%==9.3 set psqlopt=--psqldir
- if %pgversion%==9.4 set psqlopt=--psqldir
- pg_regress "%psqlopt%=%pgroot%\bin"
install no_system_period invalid_system_period no_history_table
no_history_system_period invalid_types invalid_system_period_values
no_history_system_period invalid_types invalid_system_period_values renaming
versioning versioning_custom_system_time structure uninstall
- if ERRORLEVEL 1 (set Outcome=Failed) else set Outcome=Passed
- perl -e "my @s=stat('regression.out'); print 1000*($s[9]-$s[10]);" > duration
Expand Down
178 changes: 178 additions & 0 deletions expected/renaming.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
CREATE TABLE versioning (a bigint, "b b" date, sys_period tstzrange);
-- Insert some data before versioning is enabled.
INSERT INTO versioning (a, sys_period) VALUES (1, tstzrange('-infinity', NULL));
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 OR REPLACE FUNCTION setup_versioning(
main regclass,
sys_period_column text,
history regclass,
adjust boolean)
RETURNS void AS
$BODY$
begin
execute format('
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON %I
FOR EACH ROW EXECUTE PROCEDURE versioning2(''%s'', ''%s'', %s);
', main, sys_period_column, history::oid, adjust::text);
end;
$BODY$
LANGUAGE plpgsql;
SELECT setup_versioning('versioning', 'sys_period', 'versioning_history', false);
setup_versioning
------------------

(1 row)

-- Insert.
BEGIN;
INSERT INTO versioning (a) VALUES (3);
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP FROM versioning ORDER BY a, sys_period;
a | b b | ?column?
---+-----+----------
1 | | f
2 | | f
3 | | t
(3 rows)

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

COMMIT;
-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);
pg_sleep
----------

(1 row)

-- Update.
BEGIN;
UPDATE versioning SET a = 4 WHERE a = 3;
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP FROM versioning ORDER BY a, sys_period;
a | b b | ?column?
---+-----+----------
1 | | f
2 | | f
4 | | t
(3 rows)

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM versioning_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
3 | | t
(1 row)

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
a | b b
---+-----
4 |
(1 row)

COMMIT;
-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);
pg_sleep
----------

(1 row)

-- Multiple updates.
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;
a | b b | ?column?
---+------------+----------
1 | | f
2 | | f
5 | 01-01-2012 | t
(3 rows)

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

SELECT a, "b b" FROM versioning WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
a | b b
---+------------
5 | 01-01-2012
(1 row)

COMMIT;
-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);
pg_sleep
----------

(1 row)

-- Rename both tables
ALTER TABLE versioning RENAME TO versioning_new;
ALTER TABLE versioning_history RENAME TO versioning_new_history;
-- Delete.
BEGIN;
DELETE FROM versioning_new WHERE a = 4;
SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP FROM versioning_new ORDER BY a, sys_period;
a | b b | ?column?
---+------------+----------
1 | | f
2 | | f
5 | 01-01-2012 | f
(3 rows)

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM versioning_new_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
3 | | f
4 | | f
(2 rows)

SELECT a, "b b" FROM versioning_new WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
a | b b
---+-----
(0 rows)

END;
-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);
pg_sleep
----------

(1 row)

CREATE SCHEMA new;
ALTER TABLE versioning_new_history SET SCHEMA new;
-- Delete.
BEGIN;
DELETE FROM versioning_new;
SELECT * FROM versioning_new;
a | b b | sys_period
---+-----+------------
(0 rows)

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM new.versioning_new_history ORDER BY a, sys_period;
a | c | ?column?
---+---+----------
1 | | t
2 | | t
3 | | f
4 | | f
5 | | t
(5 rows)

SELECT a, "b b" FROM versioning_new WHERE lower(sys_period) = CURRENT_TIMESTAMP ORDER BY a, sys_period;
a | b b
---+-----
(0 rows)

END;
DROP TABLE versioning_new;
DROP TABLE new.versioning_new_history;
DROP SCHEMA new;
113 changes: 113 additions & 0 deletions sql/renaming.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
CREATE TABLE versioning (a bigint, "b b" date, sys_period tstzrange);

-- Insert some data before versioning is enabled.
INSERT INTO versioning (a, sys_period) VALUES (1, tstzrange('-infinity', NULL));
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 OR REPLACE FUNCTION setup_versioning(
main regclass,
sys_period_column text,
history regclass,
adjust boolean)
RETURNS void AS
$BODY$
begin
execute format('
CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON %I
FOR EACH ROW EXECUTE PROCEDURE versioning2(''%s'', ''%s'', %s);
', main, sys_period_column, history::oid, adjust::text);
end;
$BODY$
LANGUAGE plpgsql;

SELECT setup_versioning('versioning', 'sys_period', 'versioning_history', false);

-- Insert.
BEGIN;

INSERT INTO versioning (a) VALUES (3);

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

SELECT * FROM versioning_history ORDER BY a, sys_period;

COMMIT;

-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);

-- Update.
BEGIN;

UPDATE versioning SET a = 4 WHERE a = 3;

SELECT a, "b b", lower(sys_period) = CURRENT_TIMESTAMP 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;

COMMIT;

-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);

-- Multiple updates.
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, 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;

COMMIT;

-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);

-- Rename both tables
ALTER TABLE versioning RENAME TO versioning_new;
ALTER TABLE versioning_history RENAME TO versioning_new_history;

-- Delete.
BEGIN;

DELETE FROM versioning_new WHERE a = 4;

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

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

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

END;

-- Make sure that the next transaction's CURRENT_TIMESTAMP is different.
SELECT pg_sleep(0.1);

CREATE SCHEMA new;
ALTER TABLE versioning_new_history SET SCHEMA new;

-- Delete.
BEGIN;

DELETE FROM versioning_new;

SELECT * FROM versioning_new;

SELECT a, c, upper(sys_period) = CURRENT_TIMESTAMP FROM new.versioning_new_history ORDER BY a, sys_period;

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

END;

DROP TABLE versioning_new;
DROP TABLE new.versioning_new_history;
DROP SCHEMA new;
9 changes: 9 additions & 0 deletions temporal_tables--1.1.1.sql
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ REVOKE ALL ON FUNCTION versioning() FROM PUBLIC;

COMMENT ON FUNCTION versioning() IS 'System-period temporal table trigger';

CREATE FUNCTION versioning2()
RETURNS TRIGGER
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;

REVOKE ALL ON FUNCTION versioning2() FROM PUBLIC;

COMMENT ON FUNCTION versioning2() IS 'System-period temporal table trigger, use OID as text for history relation';

CREATE FUNCTION set_system_time(timestamptz)
RETURNS VOID
AS 'MODULE_PATHNAME'
Expand Down
Loading