1- DROP TABLE IF EXISTS " user" ;
2- CREATE TABLE "user " (
1+ DROP SCHEMA IF EXISTS wiki;
2+ CREATE SCHEMA wiki ;
3+
4+ DROP TABLE IF EXISTS wiki .editor ;
5+ CREATE TABLE wiki .editor (
36 id serial PRIMARY KEY ,
47 username varchar (256 ) NOT NULL ,
58 email varchar (256 ) NOT NULL ,
@@ -8,8 +11,8 @@ CREATE TABLE "user" (
811 admin boolean DEFAULT FALSE
912);
1013
11- DROP TABLE IF EXISTS page_latest CASCADE;
12- CREATE TABLE page_latest (
14+ DROP TABLE IF EXISTS wiki . page_latest CASCADE;
15+ CREATE TABLE wiki . page_latest (
1316 id serial PRIMARY KEY ,
1417 title varchar (256 ) NOT NULL ,
1518 slug varchar (256 ) NOT NULL ,
@@ -18,25 +21,25 @@ CREATE TABLE page_latest (
1821 comment text DEFAULT ' ' ,
1922 num_lines int NOT NULL ,
2023 revision int DEFAULT 1 CONSTRAINT " revision must be positive" CHECK (revision > 0 ),
21- editor int REFERENCES " user " (id),
24+ editor int REFERENCES wiki . editor (id),
2225 markup varchar (64 ) DEFAULT ' plain' ,
2326 language varchar (8 ) NOT NULL ,
2427 edited_on timestamp DEFAULT now() NOT NULL
2528);
2629
27- DROP TABLE IF EXISTS page_diff CASCADE;
28- CREATE TABLE page_diff (
30+ DROP TABLE IF EXISTS wiki . page_diff CASCADE;
31+ CREATE TABLE wiki . page_diff (
2932 page_id int ,
3033 revision int ,
31- editor int REFERENCES " user " (id),
34+ editor int REFERENCES wiki . editor (id),
3235 created_on timestamp DEFAULT now() NOT NULL ,
3336 comment text DEFAULT ' ' ,
3437 PRIMARY KEY (page_id, revision),
35- FOREIGN KEY (page_id) REFERENCES page_latest(id) ON DELETE CASCADE
38+ FOREIGN KEY (page_id) REFERENCES wiki . page_latest (id) ON DELETE CASCADE
3639);
3740
38- DROP TABLE IF EXISTS page_diff_hunk;
39- CREATE TABLE page_diff_hunk (
41+ DROP TABLE IF EXISTS wiki . page_diff_hunk ;
42+ CREATE TABLE wiki . page_diff_hunk (
4043 page_id int ,
4144 revision int ,
4245 start int NOT NULL CONSTRAINT " start must be positive" CHECK (start > 0 ),
@@ -45,17 +48,13 @@ CREATE TABLE page_diff_hunk (
4548 lines_deleted int NOT NULL DEFAULT 0 ,
4649 lines_context int NOT NULL DEFAULT 0 ,
4750 PRIMARY KEY (page_id, revision, start),
48- FOREIGN KEY (page_id, revision) REFERENCES page_diff ON DELETE CASCADE
49- -- EXCLUDE USING gist (page_id WITH =, revision WITH =, [overlapping])
50- -- Would need to define a page_diff_hunk_meta type, define the "&&" operation
51- -- over it, and add a "meta" type to this table. Not worth the effort right now.
52- -- See: http://www.pgcon.org/2010/schedule/attachments/136_exclusion_constraints2.pdf
51+ FOREIGN KEY (page_id, revision) REFERENCES wiki .page_diff ON DELETE CASCADE
5352);
5453
55- CREATE OR REPLACE FUNCTION hunk_overlap (page_diff_hunk, page_diff_hunk) returns boolean as $$
54+ CREATE OR REPLACE FUNCTION wiki . hunk_overlap(wiki . page_diff_hunk , wiki . page_diff_hunk ) returns boolean as $$
5655declare
57- first page_diff_hunk;
58- second page_diff_hunk;
56+ first wiki . page_diff_hunk ;
57+ second wiki . page_diff_hunk ;
5958begin
6059 if $1 .page_id != $2 .page_id or $1 .revision != $2 .revision then
6160 RETURN FALSE;
@@ -79,24 +78,26 @@ $$ language plpgsql
7978IMMUTABLE STRICT;
8079
8180CREATE OPERATOR && (
82- leftarg = page_diff_hunk,
83- rightarg = page_diff_hunk,
84- procedure = hunk_overlap,
81+ leftarg = wiki . page_diff_hunk ,
82+ rightarg = wiki . page_diff_hunk ,
83+ procedure = wiki . hunk_overlap ,
8584 commutator = &&
8685);
8786
88- create function compare () returns boolean as $$
87+ DROP TABLE IF EXISTS wiki .page ;
88+ CREATE TABLE wiki .page (LIKE page_latest);
89+
90+ CREATE OR REPLACE FUNCTION wiki .page_latest_to_page(wiki .page_latest )
91+ returns wiki .page as $$
8992declare
90- one page_diff_hunk;
91- two page_diff_hunk;
93+ result wiki .page ;
9294begin
93- SELECT * into one FROM page_diff_hunk WHERE page_id = 1 AND revision = 1
94- AND start = 1 ;
95- SELECT * into two FROM page_diff_hunk WHERE page_id = 1 AND revision = 1
96- AND start = 2 ;
97- RETURN one && two;
95+ result := ($1 .id, $1 .title, $1 .slug, $1 .namespace, $1 .content, $1 .comment,
96+ $1 .num_lines, $1 .revision, $1 .editor, $1 .markup, $1 .language,
97+ $1 .edited_on);
98+ RETURN result;
9899end;
99- $$ language plpgsql;
100+ $$ language plpgsql IMMUTABLE STRICT ;
100101
101- DROP TABLE IF EXISTS page;
102- CREATE TABLE page ( LIKE page_latest);
102+ CREATE CAST ( wiki . page_latest AS wiki . page )
103+ WITH FUNCTION wiki . page_latest_to_page ( wiki . page_latest );
0 commit comments