]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/ibm_db2/tables.sql
MediaWiki 1.16.0
[autoinstalls/mediawiki.git] / maintenance / ibm_db2 / tables.sql
1 -- DB2
2
3 -- SQL to create the initial tables for the MediaWiki database.
4 -- This is read and executed by the install script; you should
5 -- not have to run it by itself unless doing a manual install.
6 -- This is the IBM DB2 version.
7 -- For information about each table, please see the notes in maintenance/tables.sql
8
9
10 CREATE TABLE user (
11   user_id                                       BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
12   user_name                 VARCHAR(255)     NOT NULL  UNIQUE,
13   user_real_name            VARCHAR(255),
14   user_password             VARCHAR(1024),
15   user_newpassword          VARCHAR(1024),
16   user_newpass_time         TIMESTAMP(3),
17   user_token                VARCHAR(255),
18   user_email                VARCHAR(1024),
19   user_email_token          VARCHAR(255),
20   user_email_token_expires  TIMESTAMP(3),
21   user_email_authenticated  TIMESTAMP(3),
22   -- obsolete, replace by user_properties table
23   user_options              CLOB(64K) INLINE LENGTH 4096,
24   user_touched              TIMESTAMP(3),
25   user_registration         TIMESTAMP(3),
26   user_editcount            INTEGER
27 );
28 CREATE INDEX user_email_token_idx ON user (user_email_token);
29 --leonsp:
30 CREATE UNIQUE INDEX user_include_idx
31         ON user(user_id)
32         INCLUDE (user_name, user_real_name, user_password, user_newpassword, user_newpass_time, user_token,
33                 user_email, user_email_token, user_email_token_expires, user_email_authenticated,
34                 user_touched, user_registration, user_editcount);
35
36 -- Create a dummy user to satisfy fk contraints especially with revisions
37 INSERT INTO user(
38 user_name,      user_real_name,                                 user_password,  user_newpassword,       user_newpass_time,
39 user_email,     user_email_authenticated,               user_options,   user_token,                     user_registration,      user_editcount)
40 VALUES (
41 'Anonymous','',                                                         NULL,                   NULL,                           CURRENT_TIMESTAMP,
42 NULL,           NULL,                                                   NULL,                   NULL,                           CURRENT_timestamp,      0);
43
44
45 CREATE TABLE user_groups (
46   ug_user   BIGINT NOT NULL DEFAULT 0,
47   --    REFERENCES user(user_id) ON DELETE CASCADE,
48   ug_group  VARCHAR(255)     NOT NULL
49 );
50 CREATE UNIQUE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
51 --leonsp:
52 CREATE UNIQUE INDEX user_groups_include_idx
53         ON user_groups(ug_user)
54         INCLUDE (ug_group);
55
56
57 CREATE TABLE user_newtalk (
58   -- registered users key
59   user_id              BIGINT      NOT NULL DEFAULT 0,
60   --  REFERENCES user(user_id) ON DELETE CASCADE,
61   -- anonymous users key
62   user_ip              VARCHAR(40),
63   user_last_timestamp  TIMESTAMP(3)
64 );
65 CREATE INDEX user_newtalk_id_idx ON user_newtalk (user_id);
66 CREATE INDEX user_newtalk_ip_idx ON user_newtalk (user_ip);
67 --leonsp:
68 CREATE UNIQUE INDEX user_newtalk_include_idx
69         ON user_newtalk(user_id, user_ip)
70         INCLUDE (user_last_timestamp);
71
72
73 CREATE TABLE page (
74   page_id                        BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
75   page_namespace     SMALLINT       NOT NULL,
76   page_title         VARCHAR(255)   NOT NULL,
77   page_restrictions  VARCHAR(1024),
78   page_counter       BIGINT         NOT NULL  DEFAULT 0,
79   page_is_redirect   SMALLINT       NOT NULL  DEFAULT 0,
80   page_is_new        SMALLINT       NOT NULL  DEFAULT 0,
81   page_random        NUMERIC(15,14) NOT NULL,
82   page_touched       TIMESTAMP(3),
83   page_latest        BIGINT             NOT NULL, -- FK?
84   page_len           BIGINT        NOT NULL
85 );
86 CREATE UNIQUE INDEX page_unique_name ON page (page_namespace, page_title);
87 CREATE INDEX page_random_idx         ON page (page_random);
88 CREATE INDEX page_len_idx            ON page (page_len);
89 --leonsp:
90 CREATE UNIQUE INDEX page_id_include
91         ON page (page_id)
92         INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
93 CREATE UNIQUE INDEX page_name_include
94         ON page (page_namespace, page_title)
95         INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
96
97
98 CREATE TABLE revision (
99   rev_id                        BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
100   rev_page              BIGINT NOT NULL DEFAULT 0,
101   --      REFERENCES page (page_id) ON DELETE CASCADE,
102   rev_text_id           BIGINT, -- FK
103   rev_comment           VARCHAR(1024),
104   rev_user              BIGINT      NOT NULL DEFAULT 0,
105   --  REFERENCES user(user_id) ON DELETE RESTRICT,
106   rev_user_text         VARCHAR(255) NOT NULL,
107   rev_timestamp         TIMESTAMP(3)    NOT NULL,
108   rev_minor_edit        SMALLINT     NOT NULL  DEFAULT 0,
109   rev_deleted           SMALLINT     NOT NULL  DEFAULT 0,
110   rev_len               BIGINT,
111   rev_parent_id         BIGINT                                  DEFAULT NULL
112 );
113 CREATE UNIQUE INDEX revision_unique ON revision (rev_page, rev_id);
114 CREATE INDEX rev_text_id_idx        ON revision (rev_text_id);
115 CREATE INDEX rev_timestamp_idx      ON revision (rev_timestamp);
116 CREATE INDEX rev_user_idx           ON revision (rev_user);
117 CREATE INDEX rev_user_text_idx      ON revision (rev_user_text);
118
119
120
121 CREATE TABLE text ( -- replaces reserved word 'text'
122   --old_id     INTEGER  NOT NULL,
123   old_id        INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
124   --PRIMARY KEY DEFAULT nextval('text_old_id_val'),
125   old_text   CLOB(16M) INLINE LENGTH 4096,
126   old_flags  VARCHAR(1024)
127 );
128
129
130 CREATE TABLE page_restrictions (
131   --pr_id      INTEGER      NOT NULL  UNIQUE, --DEFAULT nextval('pr_id_val'),
132   --pr_id       INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
133   pr_id         BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
134   pr_page    INTEGER              NOT NULL DEFAULT 0,
135   --(used to be nullable)
136   --  REFERENCES page (page_id) ON DELETE CASCADE,
137   pr_type    VARCHAR(60)         NOT NULL,
138   pr_level   VARCHAR(60)         NOT NULL,
139   pr_cascade SMALLINT             NOT NULL,
140   pr_user    INTEGER,
141   pr_expiry  TIMESTAMP(3)
142   --PRIMARY KEY (pr_page, pr_type)
143 );
144 --ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page,pr_type);
145 CREATE UNIQUE INDEX pr_pagetype ON page_restrictions (pr_page,pr_type);
146 CREATE INDEX pr_typelevel ON page_restrictions (pr_type,pr_level);
147 CREATE INDEX pr_level ON page_restrictions (pr_level);
148 CREATE INDEX pr_cascade ON page_restrictions (pr_cascade);
149
150 CREATE TABLE page_props (
151   pp_page      INTEGER  NOT NULL DEFAULT 0,
152   -- REFERENCES page (page_id) ON DELETE CASCADE,
153   pp_propname  VARCHAR(255)     NOT NULL,
154   pp_value     CLOB(64K) INLINE LENGTH 4096     NOT NULL,
155   PRIMARY KEY (pp_page,pp_propname) 
156 );
157 --ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
158 CREATE INDEX page_props_propname ON page_props (pp_propname);
159
160
161
162 CREATE TABLE archive (
163   ar_namespace   SMALLINT     NOT NULL,
164   ar_title       VARCHAR(255)         NOT NULL,
165   ar_text        CLOB(16M) INLINE LENGTH 4096,
166   ar_comment     VARCHAR(1024),
167   ar_user        BIGINT NOT NULL,
168   -- no foreign keys in MySQL
169   -- REFERENCES user(user_id) ON DELETE SET NULL,
170   ar_user_text   VARCHAR(255)         NOT NULL,
171   ar_timestamp   TIMESTAMP(3)  NOT NULL,
172   ar_minor_edit  SMALLINT     NOT NULL  DEFAULT 0,
173   ar_flags       VARCHAR(1024),
174   ar_rev_id      INTEGER,
175   ar_text_id     INTEGER,
176   ar_deleted     SMALLINT     NOT NULL  DEFAULT 0,
177   ar_len         INTEGER,
178   ar_page_id     INTEGER,
179   ar_parent_id   INTEGER
180 );
181 CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
182 CREATE INDEX archive_user_text            ON archive (ar_user_text);
183
184
185
186 CREATE TABLE redirect (
187   rd_from       BIGINT  NOT NULL  PRIMARY KEY,
188   --REFERENCES page(page_id) ON DELETE CASCADE,
189   rd_namespace  SMALLINT NOT NULL  DEFAULT 0,
190   rd_title      VARCHAR(255)     NOT NULL DEFAULT '',
191   rd_interwiki  varchar(32),
192   rd_fragment   VARCHAR(255)
193 );
194 CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
195
196
197 CREATE TABLE pagelinks (
198   pl_from       BIGINT   NOT NULL DEFAULT 0,
199   -- REFERENCES page(page_id) ON DELETE CASCADE,
200   pl_namespace  SMALLINT  NOT NULL,
201   pl_title      VARCHAR(255)      NOT NULL
202 );
203 CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title);
204
205 CREATE TABLE templatelinks (
206   tl_from       BIGINT  NOT NULL DEFAULT 0,
207   --  REFERENCES page(page_id) ON DELETE CASCADE,
208   tl_namespace  SMALLINT NOT NULL,
209   tl_title      VARCHAR(255)     NOT NULL
210 );
211 CREATE UNIQUE INDEX templatelinks_unique ON templatelinks (tl_namespace,tl_title,tl_from);
212 CREATE UNIQUE INDEX tl_from_idx ON templatelinks (tl_from,tl_namespace,tl_title);
213
214 CREATE TABLE imagelinks (
215   il_from  BIGINT  NOT NULL  DEFAULT 0,
216   -- REFERENCES page(page_id) ON DELETE CASCADE,
217   il_to    VARCHAR(255)     NOT NULL
218 );
219 CREATE UNIQUE INDEX il_from_idx ON imagelinks (il_to,il_from);
220 CREATE UNIQUE INDEX il_to_idx ON imagelinks (il_from,il_to);
221
222 CREATE TABLE categorylinks (
223   cl_from       BIGINT      NOT NULL  DEFAULT 0,
224   -- REFERENCES page(page_id) ON DELETE CASCADE,
225   cl_to         VARCHAR(255)         NOT NULL,
226   -- cl_sortkey has to be at least 86 wide 
227   -- in order to be compatible with the old MySQL schema from MW 1.10
228   cl_sortkey    VARCHAR(86),
229   cl_timestamp  TIMESTAMP(3)  NOT NULL
230 );
231 CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
232 CREATE INDEX cl_sortkey     ON categorylinks (cl_to, cl_sortkey, cl_from);
233
234
235
236 CREATE TABLE externallinks (
237   el_from   BIGINT  NOT NULL DEFAULT 0,
238   -- REFERENCES page(page_id) ON DELETE CASCADE,
239   el_to     VARCHAR(1024)     NOT NULL,
240   el_index  VARCHAR(1024)     NOT NULL
241 );
242 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
243 CREATE INDEX externallinks_index   ON externallinks (el_index);
244
245
246 --
247 -- Track external user accounts, if ExternalAuth is used
248 --
249 CREATE TABLE external_user (
250   -- Foreign key to user_id
251   eu_local_id                   BIGINT NOT NULL PRIMARY KEY,
252
253   -- Some opaque identifier provided by the external database
254   eu_external_id                VARCHAR(255) NOT NULL
255 );
256 CREATE UNIQUE INDEX eu_external_id_idx
257         ON external_user (eu_external_id)
258         INCLUDE (eu_local_id);
259 CREATE UNIQUE INDEX eu_local_id_idx
260         ON external_user (eu_local_id)
261         INCLUDE (eu_external_id);
262
263
264
265 CREATE TABLE langlinks (
266   ll_from    BIGINT  NOT NULL DEFAULT 0,
267   -- REFERENCES page (page_id) ON DELETE CASCADE,
268   ll_lang    VARCHAR(20),
269   ll_title   VARCHAR(255)
270 );
271 CREATE UNIQUE INDEX langlinks_unique ON langlinks (ll_from,ll_lang);
272 CREATE INDEX langlinks_lang_title    ON langlinks (ll_lang,ll_title);
273
274
275 CREATE TABLE site_stats (
276   ss_row_id         BIGINT        NOT NULL  UNIQUE,
277   ss_total_views    BIGINT            DEFAULT 0,
278   ss_total_edits    BIGINT            DEFAULT 0,
279   ss_good_articles  BIGINT             DEFAULT 0,
280   ss_total_pages    INTEGER            DEFAULT -1,
281   ss_users          INTEGER            DEFAULT -1,
282   ss_active_users   INTEGER            DEFAULT -1,
283   ss_admins         INTEGER            DEFAULT -1,
284   ss_images         INTEGER            DEFAULT 0
285 );
286
287 CREATE TABLE hitcounter (
288   hc_id  BIGINT  NOT NULL
289 );
290
291 CREATE TABLE ipblocks (
292   ipb_id                INTEGER      NOT NULL  PRIMARY KEY,
293   --DEFAULT nextval('ipblocks_ipb_id_val'),
294   ipb_address           VARCHAR(1024),
295   ipb_user              BIGINT NOT NULL DEFAULT 0,
296   --           REFERENCES user(user_id) ON DELETE SET NULL,
297   ipb_by                BIGINT      NOT NULL DEFAULT 0,
298   --  REFERENCES user(user_id) ON DELETE CASCADE,
299   ipb_by_text           VARCHAR(255)         NOT NULL  DEFAULT '',
300   ipb_reason            VARCHAR(1024)         NOT NULL,
301   ipb_timestamp         TIMESTAMP(3)  NOT NULL,
302   ipb_auto              SMALLINT     NOT NULL  DEFAULT 0,
303   ipb_anon_only         SMALLINT     NOT NULL  DEFAULT 0,
304   ipb_create_account    SMALLINT     NOT NULL  DEFAULT 1,
305   ipb_enable_autoblock  SMALLINT     NOT NULL  DEFAULT 1,
306   ipb_expiry            TIMESTAMP(3)  NOT NULL,
307   ipb_range_start       VARCHAR(1024),
308   ipb_range_end         VARCHAR(1024),
309   ipb_deleted           SMALLINT     NOT NULL  DEFAULT 0,
310   ipb_block_email       SMALLINT     NOT NULL  DEFAULT 0,
311   ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0
312
313 );
314 CREATE INDEX ipb_address ON ipblocks (ipb_address);
315 CREATE INDEX ipb_user    ON ipblocks (ipb_user);
316 CREATE INDEX ipb_range   ON ipblocks (ipb_range_start,ipb_range_end);
317
318
319
320 CREATE TABLE image (
321   img_name         VARCHAR(255)      NOT NULL  PRIMARY KEY,
322   img_size         BIGINT   NOT NULL,
323   img_width        INTEGER   NOT NULL,
324   img_height       INTEGER   NOT NULL,
325   img_metadata     CLOB(16M) INLINE LENGTH 4096     NOT NULL  DEFAULT '',
326   img_bits         SMALLINT,
327   img_media_type   VARCHAR(255),
328   img_major_mime   VARCHAR(255)                DEFAULT 'unknown',
329   img_minor_mime   VARCHAR(32)                DEFAULT 'unknown',
330   img_description  VARCHAR(1024)      NOT NULL  DEFAULT '',
331   img_user         BIGINT NOT NULL DEFAULT 0,
332   --         REFERENCES user(user_id) ON DELETE SET NULL,
333   img_user_text    VARCHAR(255)      NOT NULL DEFAULT '',
334   img_timestamp    TIMESTAMP(3),
335   img_sha1         VARCHAR(255)      NOT NULL  DEFAULT ''
336 );
337 CREATE INDEX img_size_idx      ON image (img_size);
338 CREATE INDEX img_timestamp_idx ON image (img_timestamp);
339 CREATE INDEX img_sha1          ON image (img_sha1);
340
341 CREATE TABLE oldimage (
342   oi_name          VARCHAR(255)         NOT NULL DEFAULT '',
343   oi_archive_name  VARCHAR(255)         NOT NULL,
344   oi_size          BIGINT      NOT NULL,
345   oi_width         INTEGER      NOT NULL,
346   oi_height        INTEGER      NOT NULL,
347   oi_bits          SMALLINT     NOT NULL,
348   oi_description   VARCHAR(1024),
349   oi_user          BIGINT NOT NULL DEFAULT 0,
350   --            REFERENCES user(user_id) ON DELETE SET NULL,
351   oi_user_text     VARCHAR(255)         NOT NULL,
352   oi_timestamp     TIMESTAMP(3)  NOT NULL,
353   oi_metadata      CLOB(16M) INLINE LENGTH 4096        NOT NULL DEFAULT '',
354   oi_media_type    VARCHAR(255)             ,
355   oi_major_mime    VARCHAR(255)         NOT NULL DEFAULT 'unknown',
356   oi_minor_mime    VARCHAR(255)         NOT NULL DEFAULT 'unknown',
357   oi_deleted       SMALLINT     NOT NULL DEFAULT 0,
358   oi_sha1          VARCHAR(255)         NOT NULL DEFAULT ''
359   --FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
360 );
361 --ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE;
362 CREATE INDEX oi_name_timestamp    ON oldimage (oi_name,oi_timestamp);
363 CREATE INDEX oi_name_archive_name ON oldimage (oi_name,oi_archive_name);
364 CREATE INDEX oi_sha1              ON oldimage (oi_sha1);
365
366
367
368 CREATE TABLE filearchive (
369   fa_id                 INTEGER      NOT NULL PRIMARY KEY,
370   --PRIMARY KEY DEFAULT nextval('filearchive_fa_id_seq'),
371   fa_name               VARCHAR(255)         NOT NULL,
372   fa_archive_name       VARCHAR(255),
373   fa_storage_group      VARCHAR(255),
374   fa_storage_key        VARCHAR(64)                     DEFAULT '',
375   fa_deleted_user       BIGINT NOT NULL DEFAULT 0,
376   --            REFERENCES user(user_id) ON DELETE SET NULL,
377   fa_deleted_timestamp  TIMESTAMP(3)  NOT NULL,
378   fa_deleted_reason     VARCHAR(255),
379   fa_size               BIGINT      NOT NULL,
380   fa_width              INTEGER      NOT NULL,
381   fa_height             INTEGER      NOT NULL,
382   fa_metadata           CLOB(16M) INLINE LENGTH 4096        NOT NULL  DEFAULT '',
383   fa_bits               SMALLINT,
384   fa_media_type         VARCHAR(255),
385   fa_major_mime         VARCHAR(255)                   DEFAULT 'unknown',
386   fa_minor_mime         VARCHAR(255)                   DEFAULT 'unknown',
387   fa_description        VARCHAR(1024)         NOT NULL,
388   fa_user               BIGINT NOT NULL DEFAULT 0,
389   --            REFERENCES user(user_id) ON DELETE SET NULL,
390   fa_user_text          VARCHAR(255)         NOT NULL,
391   fa_timestamp          TIMESTAMP(3),
392   fa_deleted            SMALLINT     NOT NULL DEFAULT 0
393 );
394 CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
395 CREATE INDEX fa_dupe      ON filearchive (fa_storage_group, fa_storage_key);
396 CREATE INDEX fa_notime    ON filearchive (fa_deleted_timestamp);
397 CREATE INDEX fa_nouser    ON filearchive (fa_deleted_user);
398
399
400 CREATE TABLE recentchanges (
401   rc_id              INTEGER      NOT NULL PRIMARY KEY,
402   --PRIMARY KEY DEFAULT nextval('rc_rc_id_seq'),
403   rc_timestamp       TIMESTAMP(3)  NOT NULL,
404   rc_cur_time        TIMESTAMP(3)  NOT NULL,
405   rc_user            BIGINT NOT NULL DEFAULT 0,
406   --        REFERENCES user(user_id) ON DELETE SET NULL,
407   rc_user_text       VARCHAR(255)         NOT NULL,
408   rc_namespace       SMALLINT     NOT NULL,
409   rc_title           VARCHAR(255)         NOT NULL,
410   rc_comment         VARCHAR(255),
411   rc_minor           SMALLINT     NOT NULL  DEFAULT 0,
412   rc_bot             SMALLINT     NOT NULL  DEFAULT 0,
413   rc_new             SMALLINT     NOT NULL  DEFAULT 0,
414   rc_cur_id          BIGINT NOT NULL DEFAULT 0,
415   --            REFERENCES page(page_id) ON DELETE SET NULL,
416   rc_this_oldid      BIGINT      NOT NULL,
417   rc_last_oldid      BIGINT      NOT NULL,
418   rc_type            SMALLINT     NOT NULL  DEFAULT 0,
419   rc_moved_to_ns     SMALLINT,
420   rc_moved_to_title  VARCHAR(255),
421   rc_patrolled       SMALLINT     NOT NULL  DEFAULT 0,
422   rc_ip              VARCHAR(40),       -- was CIDR type
423   rc_old_len         INTEGER,
424   rc_new_len         INTEGER,
425   rc_deleted         SMALLINT     NOT NULL  DEFAULT 0,
426   rc_logid           BIGINT      NOT NULL  DEFAULT 0,
427   rc_log_type        VARCHAR(255),
428   rc_log_action      VARCHAR(255),
429   rc_params          CLOB(64K) INLINE LENGTH 4096
430   
431 );
432 CREATE INDEX rc_timestamp       ON recentchanges (rc_timestamp);
433 CREATE INDEX rc_namespace_title ON recentchanges (rc_namespace, rc_title);
434 CREATE INDEX rc_cur_id          ON recentchanges (rc_cur_id);
435 CREATE INDEX new_name_timestamp ON recentchanges (rc_new, rc_namespace, rc_timestamp);
436 CREATE INDEX rc_ip              ON recentchanges (rc_ip);
437
438
439
440 CREATE TABLE watchlist (
441   wl_user                   BIGINT     NOT NULL DEFAULT 0,
442   --  REFERENCES user(user_id) ON DELETE CASCADE,
443   wl_namespace              SMALLINT    NOT NULL  DEFAULT 0,
444   wl_title                  VARCHAR(255)        NOT NULL,
445   wl_notificationtimestamp  TIMESTAMP(3)
446 );
447 CREATE UNIQUE INDEX wl_user_namespace_title ON watchlist (wl_namespace, wl_title, wl_user);
448
449
450 CREATE TABLE math (
451   math_inputhash              VARCHAR(16) FOR BIT DATA     NOT NULL  UNIQUE,
452   math_outputhash             VARCHAR(16) FOR BIT DATA     NOT NULL,
453   math_html_conservativeness  SMALLINT  NOT NULL,
454   math_html                   CLOB(64K) INLINE LENGTH 4096,
455   math_mathml                 CLOB(64K) INLINE LENGTH 4096
456 );
457
458
459 CREATE TABLE interwiki (
460   iw_prefix  VARCHAR(32)      NOT NULL  UNIQUE,
461   iw_url     CLOB(64K) INLINE LENGTH 4096      NOT NULL,
462   iw_local   SMALLINT  NOT NULL,
463   iw_trans   SMALLINT  NOT NULL  DEFAULT 0
464 );
465
466
467 CREATE TABLE querycache (
468   qc_type       VARCHAR(255)      NOT NULL,
469   qc_value      BIGINT   NOT NULL,
470   qc_namespace  INTEGER  NOT NULL,
471   qc_title      VARCHAR(255)      NOT NULL
472 );
473 CREATE INDEX querycache_type_value ON querycache (qc_type, qc_value);
474
475
476
477 CREATE  TABLE querycache_info (
478   qci_type        VARCHAR(255)              UNIQUE NOT NULL,
479   qci_timestamp  TIMESTAMP(3)
480 );
481
482
483 CREATE TABLE querycachetwo (
484   qcc_type           VARCHAR(255)     NOT NULL,
485   qcc_value         BIGINT  NOT NULL  DEFAULT 0,
486   qcc_namespace     INTEGER  NOT NULL  DEFAULT 0,
487   qcc_title          VARCHAR(255)     NOT NULL  DEFAULT '',
488   qcc_namespacetwo  INTEGER  NOT NULL  DEFAULT 0,
489   qcc_titletwo       VARCHAR(255)     NOT NULL  DEFAULT ''
490 );
491 CREATE INDEX querycachetwo_type_value ON querycachetwo (qcc_type, qcc_value);
492 CREATE INDEX querycachetwo_title      ON querycachetwo (qcc_type,qcc_namespace,qcc_title);
493 CREATE INDEX querycachetwo_titletwo   ON querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
494
495 CREATE TABLE objectcache (
496   keyname   VARCHAR(255)           NOT NULL        UNIQUE, -- was nullable
497   value     CLOB(16M) INLINE LENGTH 4096                   NOT NULL  DEFAULT '',
498   exptime  TIMESTAMP(3)               NOT NULL
499 );
500 CREATE INDEX objectcacache_exptime ON objectcache (exptime);
501
502
503
504 CREATE TABLE transcache (
505   tc_url       VARCHAR(255)         NOT NULL  UNIQUE,
506   tc_contents  CLOB(64K) INLINE LENGTH 4096         NOT NULL,
507   tc_time      TIMESTAMP(3)  NOT NULL
508 );
509
510
511 CREATE TABLE logging (
512   log_id                        BIGINT      NOT NULL PRIMARY KEY,
513   --PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
514   log_type                      VARCHAR(32)         NOT NULL,
515   log_action            VARCHAR(32)         NOT NULL,
516   log_timestamp         TIMESTAMP(3)  NOT NULL,
517   log_user                      BIGINT NOT NULL DEFAULT 0,
518   --                REFERENCES user(user_id) ON DELETE SET NULL,
519   -- Name of the user who performed this action
520   log_user_text         VARCHAR(255) NOT NULL default '',
521   log_namespace         SMALLINT     NOT NULL,
522   log_title                     VARCHAR(255)         NOT NULL,
523   log_page                      BIGINT,
524   log_comment           VARCHAR(255),
525   log_params            CLOB(64K) INLINE LENGTH 4096,
526   log_deleted           SMALLINT     NOT NULL DEFAULT 0
527 );
528 CREATE INDEX logging_type_name ON logging (log_type, log_timestamp);
529 CREATE INDEX logging_user_time ON logging (log_timestamp, log_user);
530 CREATE INDEX logging_page_time ON logging (log_namespace, log_title, log_timestamp);
531 CREATE INDEX log_user_type_time ON logging (log_user, log_type, log_timestamp);
532 CREATE INDEX log_page_id_time ON logging (log_page,log_timestamp);
533
534
535
536 CREATE TABLE trackbacks (
537   tb_id     INTEGER  NOT NULL PRIMARY KEY,
538   --PRIMARY KEY DEFAULT nextval('trackbacks_tb_id_seq'),
539   -- foreign key also in MySQL
540   tb_page   INTEGER REFERENCES page(page_id) ON DELETE CASCADE,
541   tb_title  VARCHAR(255)     NOT NULL,
542   tb_url    CLOB(64K) INLINE LENGTH 4096             NOT NULL,
543   tb_ex     CLOB(64K) INLINE LENGTH 4096,
544   tb_name   VARCHAR(255)
545 );
546 CREATE INDEX trackback_page ON trackbacks (tb_page);
547
548
549
550 CREATE TABLE job (
551   job_id         BIGINT   NOT NULL PRIMARY KEY,
552   --PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
553   job_cmd        VARCHAR(255)      NOT NULL,
554   job_namespace  SMALLINT  NOT NULL,
555   job_title      VARCHAR(255)      NOT NULL,
556   job_params     CLOB(64K) INLINE LENGTH 4096      NOT NULL
557 );
558 CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
559
560
561
562 -- Postgres' Tsearch2 dropped
563 --ALTER TABLE page ADD titlevector tsvector;
564 --CREATE FUNCTION ts2_page_title() RETURNS TRIGGER LANGUAGE plpgsql AS
565 --$mw$
566 --BEGIN
567 --IF TG_OP = 'INSERT' THEN
568 --  NEW.titlevector = to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
569 --ELSIF NEW.page_title != OLD.page_title THEN
570 --  NEW.titlevector := to_tsvector('default',REPLACE(NEW.page_title,'/',' '));
571 --END IF;
572 --RETURN NEW;
573 --END;
574 --$mw$;
575
576 --CREATE TRIGGER ts2_page_title BEFORE INSERT OR UPDATE ON page
577 --  FOR EACH ROW EXECUTE PROCEDURE ts2_page_title();
578
579
580 --ALTER TABLE text ADD textvector tsvector;
581 --CREATE FUNCTION ts2_page_text() RETURNS TRIGGER LANGUAGE plpgsql AS
582 --$mw$
583 --BEGIN
584 --IF TG_OP = 'INSERT' THEN
585 --  NEW.textvector = to_tsvector('default',NEW.old_text);
586 --ELSIF NEW.old_text != OLD.old_text THEN
587 --  NEW.textvector := to_tsvector('default',NEW.old_text);
588 --END IF;
589 --RETURN NEW;
590 --END;
591 --$mw$;
592
593 --CREATE TRIGGER ts2_page_text BEFORE INSERT OR UPDATE ON text
594 --  FOR EACH ROW EXECUTE PROCEDURE ts2_page_text();
595
596 -- These are added by the setup script due to version compatibility issues
597 -- If using 8.1, we switch from "gin" to "gist"
598
599 --CREATE INDEX ts2_page_title ON page USING gin(titlevector);
600 --CREATE INDEX ts2_page_text ON text USING gin(textvector);
601
602 --TODO
603 --CREATE FUNCTION add_interwiki (TEXT,INT,SMALLINT) RETURNS INT LANGUAGE SQL AS
604 --$mw$
605 --  INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES ($1,$2,$3);
606 --  SELECT 1;
607 --$mw$;
608
609 -- hack implementation
610 -- should be replaced with OmniFind, Contains(), etc
611 CREATE TABLE searchindex (
612   si_page BIGINT NOT NULL,
613   si_title varchar(255) NOT NULL default '',
614   si_text clob NOT NULL
615 );
616
617 -- This table is not used unless profiling is turned on
618 CREATE TABLE profiling (
619   pf_count   INTEGER         NOT NULL DEFAULT 0,
620   pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
621   pf_memory  NUMERIC(18,10)  NOT NULL DEFAULT 0,
622   pf_name    VARCHAR(255)            NOT NULL,
623   pf_server  VARCHAR(255)            
624 );
625 CREATE UNIQUE INDEX pf_name_server ON profiling (pf_name, pf_server);
626
627 CREATE TABLE protected_titles (
628   pt_namespace   INTEGER    NOT NULL,
629   pt_title       VARCHAR(255)        NOT NULL,
630   pt_user        BIGINT NOT NULL DEFAULT 0,
631   --       REFERENCES user(user_id) ON DELETE SET NULL,
632   pt_reason      VARCHAR(1024),
633   pt_timestamp   TIMESTAMP(3) NOT NULL,
634   pt_expiry      TIMESTAMP(3)     ,
635   pt_create_perm VARCHAR(60)        NOT NULL DEFAULT ''
636 );
637 CREATE UNIQUE INDEX protected_titles_unique ON protected_titles(pt_namespace, pt_title);
638
639
640
641 CREATE TABLE updatelog (
642   ul_key VARCHAR(255) NOT NULL PRIMARY KEY
643 );
644
645
646 CREATE TABLE category (
647   cat_id       INTEGER  NOT NULL PRIMARY KEY,
648   --PRIMARY KEY DEFAULT nextval('category_id_seq'),
649   cat_title    VARCHAR(255)     NOT NULL,
650   cat_pages    INTEGER  NOT NULL  DEFAULT 0,
651   cat_subcats  INTEGER  NOT NULL  DEFAULT 0,
652   cat_files    INTEGER  NOT NULL  DEFAULT 0,
653   cat_hidden   SMALLINT NOT NULL  DEFAULT 0
654 );
655 CREATE UNIQUE INDEX category_title ON category(cat_title);
656 CREATE INDEX category_pages ON category(cat_pages);
657
658 -- added for 1.15
659
660 -- A table to track tags for revisions, logs and recent changes.
661 CREATE TABLE change_tag (
662   ct_rc_id INTEGER,
663   ct_log_id INTEGER,
664   ct_rev_id INTEGER,
665   ct_tag varchar(255) NOT NULL,
666   ct_params CLOB(64K) INLINE LENGTH 4096
667 );
668 CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag (ct_rc_id,ct_tag);
669 CREATE UNIQUE INDEX change_tag_log_tag ON change_tag (ct_log_id,ct_tag);
670 CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag (ct_rev_id,ct_tag);
671 -- Covering index, so we can pull all the info only out of the index.
672 CREATE INDEX change_tag_tag_id ON change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
673
674
675 -- Rollup table to pull a LIST of tags simply
676 CREATE TABLE tag_summary (
677   ts_rc_id INTEGER,
678   ts_log_id INTEGER,
679   ts_rev_id INTEGER,
680   ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
681 );
682 CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary (ts_rc_id);
683 CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary (ts_log_id);
684 CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary (ts_rev_id);
685
686
687 CREATE TABLE valid_tag (
688   vt_tag varchar(255) NOT NULL PRIMARY KEY
689 );
690
691 --
692 -- User preferences and perhaps other fun stuff. :)
693 -- Replaces the old user.user_options blob, with a couple nice properties:
694 --
695 -- 1) We only store non-default settings, so changes to the defaults
696 --    are now reflected for everybody, not just new accounts.
697 -- 2) We can more easily do bulk lookups, statistics, or modifications of
698 --    saved options since it's a sane table structure.
699 --
700 CREATE TABLE user_properties (
701   -- Foreign key to user.user_id
702   up_user BIGINT NOT NULL,
703   
704   -- Name of the option being saved. This is indexed for bulk lookup.
705   up_property VARCHAR(32) FOR BIT DATA NOT NULL,
706   
707   -- Property value as a string.
708   up_value CLOB(64K) INLINE LENGTH 4096
709 );
710 CREATE UNIQUE INDEX user_properties_user_property ON user_properties (up_user,up_property);
711 CREATE INDEX user_properties_property ON user_properties (up_property);
712
713 CREATE TABLE log_search (
714   -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
715   ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
716   -- The value of the ID
717   ls_value varchar(255) NOT NULL,
718   -- Key to log_id
719   ls_log_id BIGINT NOT NULL default 0
720 );
721 CREATE UNIQUE INDEX ls_field_val ON log_search (ls_field,ls_value,ls_log_id);
722 CREATE INDEX ls_log_id ON log_search (ls_log_id);
723
724 CREATE TABLE mediawiki_version (
725   type         VARCHAR(1024)         NOT NULL,
726   mw_version   VARCHAR(1024)         NOT NULL,
727   notes        VARCHAR(1024)         ,
728
729   pg_version   VARCHAR(1024)         ,
730   pg_dbname    VARCHAR(1024)         ,
731   pg_user      VARCHAR(1024)         ,
732   pg_port      VARCHAR(1024)         ,
733   mw_schema    VARCHAR(1024)         ,
734   ts2_schema   VARCHAR(1024)         ,
735   ctype        VARCHAR(1024)         ,
736
737   sql_version  VARCHAR(1024)         ,
738   sql_date     VARCHAR(1024)         ,
739   cdate        TIMESTAMP(3)  NOT NULL DEFAULT CURRENT TIMESTAMP
740 );
741
742 INSERT INTO mediawiki_version (type,mw_version,sql_version,sql_date)
743   VALUES ('Creation','??','$LastChangedRevision: 34049 $','$LastChangedDate: 2008-04-30 10:20:36 -0400 (Wed, 30 Apr 2008) $');
744
745 -- Table for storing localisation data
746 CREATE TABLE l10n_cache (
747   -- Language code
748   lc_lang                       VARCHAR(32) NOT NULL,
749   -- Cache key
750   lc_key                        VARCHAR(255) NOT NULL,
751   -- Value
752   lc_value                      CLOB(16M) INLINE LENGTH 4096 NOT NULL
753 );
754 CREATE INDEX lc_lang_key ON l10n_cache (lc_lang, lc_key);
755