tables.sql 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. -- defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
  2. define mw_prefix='{$wgDBprefix}';
  3. -- Package to help with making Oracle more like other DBs with respect to
  4. -- auto-incrementing columns.
  5. /*$mw$*/
  6. CREATE PACKAGE &mw_prefix.lastval_pkg IS
  7. lastval NUMBER;
  8. PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER);
  9. FUNCTION getLastval RETURN NUMBER;
  10. END;
  11. /*$mw$*/
  12. /*$mw$*/
  13. CREATE PACKAGE BODY &mw_prefix.lastval_pkg IS
  14. PROCEDURE setLastval(val IN NUMBER, field OUT NUMBER) IS BEGIN
  15. lastval := val;
  16. field := val;
  17. END;
  18. FUNCTION getLastval RETURN NUMBER IS BEGIN
  19. RETURN lastval;
  20. END;
  21. END;
  22. /*$mw$*/
  23. CREATE SEQUENCE user_user_id_seq;
  24. CREATE TABLE &mw_prefix.mwuser ( -- replace reserved word 'user'
  25. user_id NUMBER NOT NULL,
  26. user_name VARCHAR2(255) NOT NULL,
  27. user_real_name VARCHAR2(512),
  28. user_password VARCHAR2(255),
  29. user_newpassword VARCHAR2(255),
  30. user_newpass_time TIMESTAMP(6) WITH TIME ZONE,
  31. user_token VARCHAR2(32),
  32. user_email VARCHAR2(255),
  33. user_email_token VARCHAR2(32),
  34. user_email_token_expires TIMESTAMP(6) WITH TIME ZONE,
  35. user_email_authenticated TIMESTAMP(6) WITH TIME ZONE,
  36. user_options CLOB,
  37. user_touched TIMESTAMP(6) WITH TIME ZONE,
  38. user_registration TIMESTAMP(6) WITH TIME ZONE,
  39. user_editcount NUMBER,
  40. user_password_expires TIMESTAMP(6) WITH TIME ZONE
  41. );
  42. ALTER TABLE &mw_prefix.mwuser ADD CONSTRAINT &mw_prefix.mwuser_pk PRIMARY KEY (user_id);
  43. CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
  44. CREATE INDEX &mw_prefix.mwuser_i01 ON &mw_prefix.mwuser (user_email_token);
  45. CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
  46. /*$mw$*/
  47. CREATE TRIGGER &mw_prefix.mwuser_seq_trg BEFORE INSERT ON &mw_prefix.mwuser
  48. FOR EACH ROW WHEN (new.user_id IS NULL)
  49. BEGIN
  50. &mw_prefix.lastval_pkg.setLastval(user_user_id_seq.nextval, :new.user_id);
  51. END;
  52. /*$mw$*/
  53. -- Create a dummy user to satisfy fk contraints especially with revisions
  54. INSERT INTO &mw_prefix.mwuser
  55. (user_id, user_name, user_options, user_touched, user_registration, user_editcount)
  56. VALUES (0,'Anonymous','', current_timestamp, current_timestamp,0);
  57. CREATE SEQUENCE actor_actor_id_seq;
  58. CREATE TABLE &mw_prefix.actor (
  59. actor_id NUMBER NOT NULL,
  60. actor_user NUMBER,
  61. actor_name VARCHAR2(255) NOT NULL
  62. );
  63. ALTER TABLE &mw_prefix.actor ADD CONSTRAINT &mw_prefix.actor_pk PRIMARY KEY (actor_id);
  64. /*$mw$*/
  65. CREATE TRIGGER &mw_prefix.actor_seq_trg BEFORE INSERT ON &mw_prefix.actor
  66. FOR EACH ROW WHEN (new.actor_id IS NULL)
  67. BEGIN
  68. &mw_prefix.lastval_pkg.setLastval(actor_actor_id_seq.nextval, :new.actor_id);
  69. END;
  70. /*$mw$*/
  71. -- Create a dummy actor to satisfy fk contraints
  72. INSERT INTO &mw_prefix.actor (actor_id, actor_name) VALUES (0,'##Anonymous##');
  73. CREATE TABLE &mw_prefix.user_groups (
  74. ug_user NUMBER DEFAULT 0 NOT NULL,
  75. ug_group VARCHAR2(255) NOT NULL,
  76. ug_expiry TIMESTAMP(6) WITH TIME ZONE NULL
  77. );
  78. ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_pk PRIMARY KEY (ug_user,ug_group);
  79. ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  80. CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
  81. CREATE INDEX &mw_prefix.user_groups_i02 ON &mw_prefix.user_groups (ug_expiry);
  82. CREATE TABLE &mw_prefix.user_former_groups (
  83. ufg_user NUMBER DEFAULT 0 NOT NULL,
  84. ufg_group VARCHAR2(255) NOT NULL
  85. );
  86. ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  87. CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
  88. CREATE TABLE &mw_prefix.user_newtalk (
  89. user_id NUMBER DEFAULT 0 NOT NULL,
  90. user_ip VARCHAR2(40) NULL,
  91. user_last_timestamp TIMESTAMP(6) WITH TIME ZONE
  92. );
  93. ALTER TABLE &mw_prefix.user_newtalk ADD CONSTRAINT &mw_prefix.user_newtalk_fk1 FOREIGN KEY (user_id) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  94. CREATE INDEX &mw_prefix.user_newtalk_i01 ON &mw_prefix.user_newtalk (user_id);
  95. CREATE INDEX &mw_prefix.user_newtalk_i02 ON &mw_prefix.user_newtalk (user_ip);
  96. CREATE TABLE &mw_prefix.user_properties (
  97. up_user NUMBER NOT NULL,
  98. up_property VARCHAR2(255) NOT NULL,
  99. up_value CLOB
  100. );
  101. CREATE UNIQUE INDEX &mw_prefix.user_properties_u01 on &mw_prefix.user_properties (up_user,up_property);
  102. CREATE INDEX &mw_prefix.user_properties_i01 on &mw_prefix.user_properties (up_property);
  103. CREATE SEQUENCE page_page_id_seq;
  104. CREATE TABLE &mw_prefix.page (
  105. page_id NUMBER NOT NULL,
  106. page_namespace NUMBER DEFAULT 0 NOT NULL,
  107. page_title VARCHAR2(255) NOT NULL,
  108. page_restrictions VARCHAR2(255),
  109. page_is_redirect CHAR(1) DEFAULT '0' NOT NULL,
  110. page_is_new CHAR(1) DEFAULT '0' NOT NULL,
  111. page_random NUMBER(15,14) NOT NULL,
  112. page_touched TIMESTAMP(6) WITH TIME ZONE,
  113. page_links_updated TIMESTAMP(6) WITH TIME ZONE,
  114. page_latest NUMBER DEFAULT 0 NOT NULL, -- FK?
  115. page_len NUMBER DEFAULT 0 NOT NULL,
  116. page_content_model VARCHAR2(32),
  117. page_lang VARCHAR2(35) DEFAULT NULL
  118. );
  119. ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_id);
  120. CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
  121. CREATE INDEX &mw_prefix.page_i01 ON &mw_prefix.page (page_random);
  122. CREATE INDEX &mw_prefix.page_i02 ON &mw_prefix.page (page_len);
  123. CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
  124. /*$mw$*/
  125. CREATE TRIGGER &mw_prefix.page_seq_trg BEFORE INSERT ON &mw_prefix.page
  126. FOR EACH ROW WHEN (new.page_id IS NULL)
  127. BEGIN
  128. &mw_prefix.lastval_pkg.setLastval(page_page_id_seq.nextval, :new.page_id);
  129. END;
  130. /*$mw$*/
  131. -- Create a dummy page to satisfy fk contraints especially with revisions
  132. INSERT INTO &mw_prefix.page
  133. VALUES (0, 0, ' ', NULL, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL, NULL);
  134. /*$mw$*/
  135. CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
  136. FOR EACH ROW WHEN (new.page_random IS NULL)
  137. BEGIN
  138. SELECT dbms_random.value INTO :NEW.page_random FROM dual;
  139. END;
  140. /*$mw$*/
  141. CREATE SEQUENCE comment_comment_id_seq;
  142. CREATE TABLE &mw_prefix."COMMENT" (
  143. comment_id NUMBER NOT NULL,
  144. comment_hash NUMBER NOT NULL,
  145. comment_text CLOB,
  146. comment_data CLOB
  147. );
  148. CREATE INDEX &mw_prefix.comment_hash ON &mw_prefix."COMMENT" (comment_hash);
  149. /*$mw$*/
  150. CREATE TRIGGER &mw_prefix.comment_seq_trg BEFORE INSERT ON &mw_prefix."COMMENT"
  151. FOR EACH ROW WHEN (new.comment_id IS NULL)
  152. BEGIN
  153. &mw_prefix.lastval_pkg.setLastval(comment_comment_id_seq.nextval, :new.comment_id);
  154. END;
  155. /*$mw$*/
  156. -- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
  157. INSERT INTO &mw_prefix."COMMENT" (comment_hash, comment_text) VALUES (-1, '** dummy **');
  158. CREATE SEQUENCE revision_rev_id_seq;
  159. CREATE TABLE &mw_prefix.revision (
  160. rev_id NUMBER NOT NULL,
  161. rev_page NUMBER NOT NULL,
  162. rev_text_id NUMBER NULL,
  163. rev_comment VARCHAR2(255),
  164. rev_user NUMBER DEFAULT 0 NOT NULL,
  165. rev_user_text VARCHAR2(255) NOT NULL,
  166. rev_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  167. rev_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
  168. rev_deleted CHAR(1) DEFAULT '0' NOT NULL,
  169. rev_len NUMBER NULL,
  170. rev_parent_id NUMBER DEFAULT NULL,
  171. rev_sha1 VARCHAR2(32) NULL,
  172. rev_content_model VARCHAR2(32),
  173. rev_content_format VARCHAR2(64)
  174. );
  175. ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
  176. ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  177. ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk2 FOREIGN KEY (rev_user) REFERENCES &mw_prefix.mwuser(user_id) DEFERRABLE INITIALLY DEFERRED;
  178. CREATE UNIQUE INDEX &mw_prefix.revision_u01 ON &mw_prefix.revision (rev_page, rev_id);
  179. CREATE INDEX &mw_prefix.revision_i01 ON &mw_prefix.revision (rev_timestamp);
  180. CREATE INDEX &mw_prefix.revision_i02 ON &mw_prefix.revision (rev_page,rev_timestamp);
  181. CREATE INDEX &mw_prefix.revision_i03 ON &mw_prefix.revision (rev_user,rev_timestamp);
  182. CREATE INDEX &mw_prefix.revision_i04 ON &mw_prefix.revision (rev_user_text,rev_timestamp);
  183. CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
  184. /*$mw$*/
  185. CREATE TRIGGER &mw_prefix.revision_seq_trg BEFORE INSERT ON &mw_prefix.revision
  186. FOR EACH ROW WHEN (new.rev_id IS NULL)
  187. BEGIN
  188. &mw_prefix.lastval_pkg.setLastval(revision_rev_id_seq.nextval, :new.rev_id);
  189. END;
  190. /*$mw$*/
  191. CREATE TABLE &mw_prefix.revision_comment_temp (
  192. revcomment_rev NUMBER NOT NULL,
  193. revcomment_comment_id NUMBER NOT NULL
  194. );
  195. ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_pk PRIMARY KEY (revcomment_rev, revcomment_comment_id);
  196. ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk1 FOREIGN KEY (revcomment_rev) REFERENCES &mw_prefix.revision(rev_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  197. ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk2 FOREIGN KEY (revcomment_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  198. CREATE UNIQUE INDEX &mw_prefix.revcomment_rev ON &mw_prefix.revision_comment_temp (revcomment_rev);
  199. CREATE TABLE &mw_prefix.revision_actor_temp (
  200. revactor_rev NUMBER NOT NULL,
  201. revactor_actor NUMBER NOT NULL,
  202. revactor_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  203. revactor_page NUMBER NOT NULL
  204. );
  205. ALTER TABLE &mw_prefix.revision_actor_temp ADD CONSTRAINT &mw_prefix.revision_actor_temp_pk PRIMARY KEY (revactor_rev, revactor_actor);
  206. CREATE UNIQUE INDEX &mw_prefix.revactor_rev ON &mw_prefix.revision_actor_temp (revactor_rev);
  207. CREATE INDEX &mw_prefix.actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_actor,revactor_timestamp);
  208. CREATE INDEX &mw_prefix.page_actor_timestamp ON &mw_prefix.revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
  209. CREATE SEQUENCE text_old_id_seq;
  210. CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
  211. old_id NUMBER NOT NULL,
  212. old_text CLOB,
  213. old_flags VARCHAR2(255)
  214. );
  215. ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
  216. /*$mw$*/
  217. CREATE TRIGGER &mw_prefix.pagecontent_seq_trg BEFORE INSERT ON &mw_prefix.pagecontent
  218. FOR EACH ROW WHEN (new.old_id IS NULL)
  219. BEGIN
  220. &mw_prefix.lastval_pkg.setLastval(text_old_id_seq.nextval, :new.old_id);
  221. END;
  222. /*$mw$*/
  223. CREATE SEQUENCE archive_ar_id_seq;
  224. CREATE TABLE &mw_prefix.archive (
  225. ar_id NUMBER NOT NULL,
  226. ar_namespace NUMBER DEFAULT 0 NOT NULL,
  227. ar_title VARCHAR2(255) NOT NULL,
  228. ar_comment VARCHAR2(255),
  229. ar_comment_id NUMBER DEFAULT 0 NOT NULL,
  230. ar_user NUMBER DEFAULT 0 NOT NULL,
  231. ar_user_text VARCHAR2(255) NULL,
  232. ar_actor NUMBER DEFAULT 0 NOT NULL,
  233. ar_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  234. ar_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
  235. ar_rev_id NUMBER NOT NULL,
  236. ar_text_id NUMBER DEFAULT 0 NOT NULL,
  237. ar_deleted CHAR(1) DEFAULT '0' NOT NULL,
  238. ar_len NUMBER,
  239. ar_page_id NUMBER,
  240. ar_parent_id NUMBER,
  241. ar_sha1 VARCHAR2(32),
  242. ar_content_model VARCHAR2(32),
  243. ar_content_format VARCHAR2(64)
  244. );
  245. ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
  246. ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  247. ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY (ar_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  248. CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
  249. CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
  250. CREATE INDEX &mw_prefix.ar_actor_timestamp ON &mw_prefix.archive (ar_actor,ar_timestamp);
  251. CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
  252. /*$mw$*/
  253. CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
  254. FOR EACH ROW WHEN (new.ar_id IS NULL)
  255. BEGIN
  256. &mw_prefix.lastval_pkg.setLastval(archive_ar_id_seq.nextval, :new.ar_id);
  257. END;
  258. /*$mw$*/
  259. CREATE TABLE &mw_prefix.slots (
  260. slot_revision_id NUMBER NOT NULL,
  261. slot_role_id NUMBER NOT NULL,
  262. slot_content_id NUMBER NOT NULL,
  263. slot_origin NUMBER NOT NULL
  264. );
  265. ALTER TABLE &mw_prefix.slots ADD CONSTRAINT &mw_prefix.slots_pk PRIMARY KEY (slot_revision_id, slot_role_id);
  266. CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
  267. CREATE SEQUENCE content_content_id_seq;
  268. CREATE TABLE &mw_prefix.content (
  269. content_id NUMBER NOT NULL,
  270. content_size NUMBER NOT NULL,
  271. content_sha1 VARCHAR2(32) NOT NULL,
  272. content_model NUMBER NOT NULL,
  273. content_address VARCHAR2(255) NOT NULL
  274. );
  275. ALTER TABLE &mw_prefix.content ADD CONSTRAINT &mw_prefix.content_pk PRIMARY KEY (content_id);
  276. /*$mw$*/
  277. CREATE TRIGGER &mw_prefix.content_seq_trg BEFORE INSERT ON &mw_prefix.content
  278. FOR EACH ROW WHEN (new.content_id IS NULL)
  279. BEGIN
  280. &mw_prefix.lastval_pkg.setLastval(content_content_id_seq.nextval, :new.content_id);
  281. END;
  282. /*$mw$*/
  283. CREATE SEQUENCE slot_roles_role_id_seq;
  284. CREATE TABLE &mw_prefix.slot_roles (
  285. role_id NUMBER NOT NULL,
  286. role_name VARCHAR2(64) NOT NULL
  287. );
  288. ALTER TABLE &mw_prefix.slot_roles ADD CONSTRAINT &mw_prefix.slot_roles_pk PRIMARY KEY (role_id);
  289. CREATE UNIQUE INDEX &mw_prefix.role_name_u01 ON &mw_prefix.slot_roles (role_name);
  290. /*$mw$*/
  291. CREATE TRIGGER &mw_prefix.slot_roles_seq_trg BEFORE INSERT ON &mw_prefix.slot_roles
  292. FOR EACH ROW WHEN (new.role_id IS NULL)
  293. BEGIN
  294. &mw_prefix.lastval_pkg.setLastval(slot_roles_role_id_seq.nextval, :new.role_id);
  295. END;
  296. /*$mw$*/
  297. CREATE SEQUENCE content_models_model_id_seq;
  298. CREATE TABLE &mw_prefix.content_models (
  299. model_id NUMBER NOT NULL,
  300. model_name VARCHAR2(64) NOT NULL
  301. );
  302. ALTER TABLE &mw_prefix.content_models ADD CONSTRAINT &mw_prefix.content_models_pk PRIMARY KEY (model_id);
  303. CREATE UNIQUE INDEX &mw_prefix.model_name_u01 ON &mw_prefix.content_models (model_name);
  304. /*$mw$*/
  305. CREATE TRIGGER &mw_prefix.content_models_seq_trg BEFORE INSERT ON &mw_prefix.content_models
  306. FOR EACH ROW WHEN (new.model_id IS NULL)
  307. BEGIN
  308. &mw_prefix.lastval_pkg.setLastval(content_models_model_id_seq.nextval, :new.model_id);
  309. END;
  310. /*$mw$*/
  311. CREATE TABLE &mw_prefix.pagelinks (
  312. pl_from NUMBER NOT NULL,
  313. pl_namespace NUMBER DEFAULT 0 NOT NULL,
  314. pl_title VARCHAR2(255) NOT NULL
  315. );
  316. ALTER TABLE &mw_prefix.pagelinks ADD CONSTRAINT &mw_prefix.pagelinks_fk1 FOREIGN KEY (pl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  317. CREATE UNIQUE INDEX &mw_prefix.pagelinks_u01 ON &mw_prefix.pagelinks (pl_from,pl_namespace,pl_title);
  318. CREATE UNIQUE INDEX &mw_prefix.pagelinks_u02 ON &mw_prefix.pagelinks (pl_namespace,pl_title,pl_from);
  319. CREATE TABLE &mw_prefix.templatelinks (
  320. tl_from NUMBER NOT NULL,
  321. tl_namespace NUMBER DEFAULT 0 NOT NULL,
  322. tl_title VARCHAR2(255) NOT NULL
  323. );
  324. ALTER TABLE &mw_prefix.templatelinks ADD CONSTRAINT &mw_prefix.templatelinks_fk1 FOREIGN KEY (tl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  325. CREATE UNIQUE INDEX &mw_prefix.templatelinks_u01 ON &mw_prefix.templatelinks (tl_from,tl_namespace,tl_title);
  326. CREATE UNIQUE INDEX &mw_prefix.templatelinks_u02 ON &mw_prefix.templatelinks (tl_namespace,tl_title,tl_from);
  327. CREATE TABLE &mw_prefix.imagelinks (
  328. il_from NUMBER NOT NULL,
  329. il_to VARCHAR2(255) NOT NULL
  330. );
  331. ALTER TABLE &mw_prefix.imagelinks ADD CONSTRAINT &mw_prefix.imagelinks_fk1 FOREIGN KEY (il_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  332. CREATE UNIQUE INDEX &mw_prefix.imagelinks_u01 ON &mw_prefix.imagelinks (il_from,il_to);
  333. CREATE UNIQUE INDEX &mw_prefix.imagelinks_u02 ON &mw_prefix.imagelinks (il_to,il_from);
  334. CREATE TABLE &mw_prefix.categorylinks (
  335. cl_from NUMBER NOT NULL,
  336. cl_to VARCHAR2(255) NOT NULL,
  337. cl_sortkey VARCHAR2(230),
  338. cl_sortkey_prefix VARCHAR2(255),
  339. cl_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  340. cl_collation VARCHAR2(32),
  341. cl_type VARCHAR2(6) DEFAULT 'page' NOT NULL
  342. );
  343. ALTER TABLE &mw_prefix.categorylinks ADD CONSTRAINT &mw_prefix.categorylinks_fk1 FOREIGN KEY (cl_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  344. CREATE UNIQUE INDEX &mw_prefix.categorylinks_u01 ON &mw_prefix.categorylinks (cl_from,cl_to);
  345. CREATE INDEX &mw_prefix.categorylinks_i01 ON &mw_prefix.categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
  346. CREATE INDEX &mw_prefix.categorylinks_i02 ON &mw_prefix.categorylinks (cl_to,cl_timestamp);
  347. CREATE INDEX &mw_prefix.categorylinks_i03 ON &mw_prefix.categorylinks (cl_collation);
  348. CREATE SEQUENCE category_cat_id_seq;
  349. CREATE TABLE &mw_prefix.category (
  350. cat_id NUMBER NOT NULL,
  351. cat_title VARCHAR2(255) NOT NULL,
  352. cat_pages NUMBER DEFAULT 0 NOT NULL,
  353. cat_subcats NUMBER DEFAULT 0 NOT NULL,
  354. cat_files NUMBER DEFAULT 0 NOT NULL
  355. );
  356. ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KEY (cat_id);
  357. CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
  358. CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
  359. /*$mw$*/
  360. CREATE TRIGGER &mw_prefix.category_seq_trg BEFORE INSERT ON &mw_prefix.category
  361. FOR EACH ROW WHEN (new.cat_id IS NULL)
  362. BEGIN
  363. &mw_prefix.lastval_pkg.setLastval(category_cat_id_seq.nextval, :new.cat_id);
  364. END;
  365. /*$mw$*/
  366. CREATE SEQUENCE externallinks_el_id_seq;
  367. CREATE TABLE &mw_prefix.externallinks (
  368. el_id NUMBER NOT NULL,
  369. el_from NUMBER NOT NULL,
  370. el_to VARCHAR2(2048) NOT NULL,
  371. el_index VARCHAR2(2048) NOT NULL,
  372. el_index_60 VARCHAR2(60)
  373. );
  374. ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
  375. ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  376. CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
  377. CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
  378. CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
  379. CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
  380. CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
  381. /*$mw$*/
  382. CREATE TRIGGER &mw_prefix.externallinks_seq_trg BEFORE INSERT ON &mw_prefix.externallinks
  383. FOR EACH ROW WHEN (new.el_id IS NULL)
  384. BEGIN
  385. &mw_prefix.lastval_pkg.setLastval(externallinks_el_id_seq.nextval, :new.el_id);
  386. END;
  387. /*$mw$*/
  388. -- Table defining tag names for IDs. Also stores hit counts to avoid expensive queries on change_tag
  389. CREATE SEQUENCE change_tag_def_ctd_id_seq;
  390. CREATE TABLE &mw_prefix.change_tag_def (
  391. -- Numerical ID of the tag (ct_tag_id refers to this)
  392. ctd_id NUMBER NOT NULL,
  393. -- Symbolic name of the tag (what would previously be put in ct_tag)
  394. ctd_name VARCHAR2(255) NOT NULL,
  395. -- Whether this tag was defined manually by a privileged user using Special:Tags
  396. ctd_user_defined CHAR(1) DEFAULT '0' NOT NULL,
  397. -- Number of times this tag was used
  398. ctd_count NUMBER NOT NULL DEFAULT 0
  399. );
  400. ALTER TABLE &mw_prefix.change_tag_def ADD CONSTRAINT &mw_prefix.change_tag_def_pk PRIMARY KEY (ctd_id);
  401. CREATE UNIQUE INDEX &mw_prefix.ctd_name ON &mw_prefix.change_tag_def (ctd_name);
  402. CREATE INDEX &mw_prefix.ctd_count ON &mw_prefix.change_tag_def (ctd_count);
  403. CREATE INDEX &mw_prefix.ctd_user_defined ON &mw_prefix.change_tag_def (ctd_user_defined);
  404. /*$mw$*/
  405. CREATE TRIGGER &mw_prefix.change_tag_def_seq_trg BEFORE INSERT ON &mw_prefix.change_tag_def
  406. FOR EACH ROW WHEN (new.ctd_id IS NULL)
  407. BEGIN
  408. &mw_prefix.lastval_pkg.setLastval(change_tag_def_ctd_id_seq.nextval, :new.ctd_id);
  409. END;
  410. /*$mw$*/
  411. CREATE TABLE &mw_prefix.langlinks (
  412. ll_from NUMBER NOT NULL,
  413. ll_lang VARCHAR2(20),
  414. ll_title VARCHAR2(255)
  415. );
  416. ALTER TABLE &mw_prefix.langlinks ADD CONSTRAINT &mw_prefix.langlinks_fk1 FOREIGN KEY (ll_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  417. CREATE UNIQUE INDEX &mw_prefix.langlinks_u01 ON &mw_prefix.langlinks (ll_from, ll_lang);
  418. CREATE INDEX &mw_prefix.langlinks_i01 ON &mw_prefix.langlinks (ll_lang, ll_title);
  419. CREATE TABLE &mw_prefix.iwlinks (
  420. iwl_from NUMBER DEFAULT 0 NOT NULL,
  421. iwl_prefix VARCHAR2(20),
  422. iwl_title VARCHAR2(255)
  423. );
  424. CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui01 ON &mw_prefix.iwlinks (iwl_from, iwl_prefix, iwl_title);
  425. CREATE UNIQUE INDEX &mw_prefix.iwlinks_ui02 ON &mw_prefix.iwlinks (iwl_prefix, iwl_title, iwl_from);
  426. CREATE TABLE &mw_prefix.site_stats (
  427. ss_row_id NUMBER NOT NULL PRIMARY KEY,
  428. ss_total_edits NUMBER DEFAULT NULL,
  429. ss_good_articles NUMBER DEFAULT NULL,
  430. ss_total_pages NUMBER DEFAULT NULL,
  431. ss_users NUMBER DEFAULT NULL,
  432. ss_active_users NUMBER DEFAULT NULL,
  433. ss_images NUMBER DEFAULT NULL
  434. );
  435. CREATE SEQUENCE ipblocks_ipb_id_seq;
  436. CREATE TABLE &mw_prefix.ipblocks (
  437. ipb_id NUMBER NOT NULL,
  438. ipb_address VARCHAR2(255) NULL,
  439. ipb_user NUMBER DEFAULT 0 NOT NULL,
  440. ipb_by NUMBER DEFAULT 0 NOT NULL,
  441. ipb_by_text VARCHAR2(255) NULL,
  442. ipb_by_actor NUMBER DEFAULT 0 NOT NULL,
  443. ipb_reason VARCHAR2(255) NULL,
  444. ipb_reason_id NUMBER DEFAULT 0 NOT NULL,
  445. ipb_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  446. ipb_auto CHAR(1) DEFAULT '0' NOT NULL,
  447. ipb_anon_only CHAR(1) DEFAULT '0' NOT NULL,
  448. ipb_create_account CHAR(1) DEFAULT '1' NOT NULL,
  449. ipb_enable_autoblock CHAR(1) DEFAULT '1' NOT NULL,
  450. ipb_expiry TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  451. ipb_range_start VARCHAR2(255),
  452. ipb_range_end VARCHAR2(255),
  453. ipb_deleted CHAR(1) DEFAULT '0' NOT NULL,
  454. ipb_block_email CHAR(1) DEFAULT '0' NOT NULL,
  455. ipb_allow_usertalk CHAR(1) DEFAULT '0' NOT NULL,
  456. ipb_parent_block_id NUMBER DEFAULT NULL,
  457. ipb_sitewide CHAR(1) DEFAULT '1' NOT NULL
  458. );
  459. ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
  460. ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  461. ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  462. ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk3 FOREIGN KEY (ipb_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  463. CREATE UNIQUE INDEX &mw_prefix.ipblocks_u01 ON &mw_prefix.ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
  464. CREATE INDEX &mw_prefix.ipblocks_i01 ON &mw_prefix.ipblocks (ipb_user);
  465. CREATE INDEX &mw_prefix.ipblocks_i02 ON &mw_prefix.ipblocks (ipb_range_start, ipb_range_end);
  466. CREATE INDEX &mw_prefix.ipblocks_i03 ON &mw_prefix.ipblocks (ipb_timestamp);
  467. CREATE INDEX &mw_prefix.ipblocks_i04 ON &mw_prefix.ipblocks (ipb_expiry);
  468. CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
  469. /*$mw$*/
  470. CREATE TRIGGER &mw_prefix.ipblocks_seq_trg BEFORE INSERT ON &mw_prefix.ipblocks
  471. FOR EACH ROW WHEN (new.ipb_id IS NULL)
  472. BEGIN
  473. &mw_prefix.lastval_pkg.setLastval(ipblocks_ipb_id_seq.nextval, :new.ipb_id);
  474. END;
  475. /*$mw$*/
  476. CREATE TABLE &mw_prefix.ipblocks_restrictions (
  477. ir_ipb_id NUMBER NOT NULL,
  478. ir_type NUMBER NOT NULL,
  479. ir_value NUMBER NOT NULL
  480. );
  481. ALTER TABLE &mw_prefix.ipblocks_restrictions ADD CONSTRAINT ipblocks_restrictions_pk PRIMARY KEY (ir_ipb_id, ir_type, ir_value);
  482. CREATE INDEX &mw_prefix.ir_type_value ON &mw_prefix.ipblocks_restrictions (ir_type, ir_value);
  483. CREATE TABLE &mw_prefix.image (
  484. img_name VARCHAR2(255) NOT NULL,
  485. img_size NUMBER DEFAULT 0 NOT NULL,
  486. img_width NUMBER DEFAULT 0 NOT NULL,
  487. img_height NUMBER DEFAULT 0 NOT NULL,
  488. img_metadata CLOB,
  489. img_bits NUMBER DEFAULT 0 NOT NULL,
  490. img_media_type VARCHAR2(32),
  491. img_major_mime VARCHAR2(32) DEFAULT 'unknown',
  492. img_minor_mime VARCHAR2(100) DEFAULT 'unknown',
  493. img_description VARCHAR2(255),
  494. img_description_id NUMBER DEFAULT 0 NOT NULL,
  495. img_user NUMBER DEFAULT 0 NOT NULL,
  496. img_user_text VARCHAR2(255) NULL,
  497. img_actor NUMBER DEFAULT 0 NOT NULL,
  498. img_timestamp TIMESTAMP(6) WITH TIME ZONE,
  499. img_sha1 VARCHAR2(32)
  500. );
  501. ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_pk PRIMARY KEY (img_name);
  502. ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  503. ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk2 FOREIGN KEY (img_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  504. CREATE INDEX &mw_prefix.image_i01 ON &mw_prefix.image (img_user_text,img_timestamp);
  505. CREATE INDEX &mw_prefix.image_i02 ON &mw_prefix.image (img_size);
  506. CREATE INDEX &mw_prefix.image_i03 ON &mw_prefix.image (img_timestamp);
  507. CREATE INDEX &mw_prefix.image_i04 ON &mw_prefix.image (img_sha1);
  508. CREATE INDEX &mw_prefix.img_actor_timestamp ON &mw_prefix.image (img_actor, img_timestamp);
  509. CREATE TABLE &mw_prefix.image_comment_temp (
  510. imgcomment_name VARCHAR2(255) NOT NULL,
  511. imgcomment_description_id NUMBER NOT NULL
  512. );
  513. ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_pk PRIMARY KEY (imgcomment_name, imgcomment_description_id);
  514. ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk1 FOREIGN KEY (imgcomment_name) REFERENCES &mw_prefix.image(img_name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  515. ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk2 FOREIGN KEY (imgcomment_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  516. CREATE UNIQUE INDEX &mw_prefix.imgcomment_name ON &mw_prefix.image_comment_temp (imgcomment_name);
  517. CREATE TABLE &mw_prefix.oldimage (
  518. oi_name VARCHAR2(255) DEFAULT 0 NOT NULL,
  519. oi_archive_name VARCHAR2(255),
  520. oi_size NUMBER DEFAULT 0 NOT NULL,
  521. oi_width NUMBER DEFAULT 0 NOT NULL,
  522. oi_height NUMBER DEFAULT 0 NOT NULL,
  523. oi_bits NUMBER DEFAULT 0 NOT NULL,
  524. oi_description VARCHAR2(255),
  525. oi_description_id NUMBER DEFAULT 0 NOT NULL,
  526. oi_user NUMBER DEFAULT 0 NOT NULL,
  527. oi_user_text VARCHAR2(255) NULL,
  528. oi_actor NUMBER DEFAULT 0 NOT NULL,
  529. oi_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  530. oi_metadata CLOB,
  531. oi_media_type VARCHAR2(32) DEFAULT NULL,
  532. oi_major_mime VARCHAR2(32) DEFAULT 'unknown',
  533. oi_minor_mime VARCHAR2(100) DEFAULT 'unknown',
  534. oi_deleted NUMBER DEFAULT 0 NOT NULL,
  535. oi_sha1 VARCHAR2(32)
  536. );
  537. ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  538. ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  539. ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk3 FOREIGN KEY (oi_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  540. CREATE INDEX &mw_prefix.oldimage_i01 ON &mw_prefix.oldimage (oi_user_text,oi_timestamp);
  541. CREATE INDEX &mw_prefix.oi_actor_timestamp ON &mw_prefix.oldimage (oi_actor,oi_timestamp);
  542. CREATE INDEX &mw_prefix.oldimage_i02 ON &mw_prefix.oldimage (oi_name,oi_timestamp);
  543. CREATE INDEX &mw_prefix.oldimage_i03 ON &mw_prefix.oldimage (oi_name,oi_archive_name);
  544. CREATE INDEX &mw_prefix.oldimage_i04 ON &mw_prefix.oldimage (oi_sha1);
  545. CREATE SEQUENCE filearchive_fa_id_seq;
  546. CREATE TABLE &mw_prefix.filearchive (
  547. fa_id NUMBER NOT NULL,
  548. fa_name VARCHAR2(255) NOT NULL,
  549. fa_archive_name VARCHAR2(255),
  550. fa_storage_group VARCHAR2(16),
  551. fa_storage_key VARCHAR2(64),
  552. fa_deleted_user NUMBER DEFAULT 0 NOT NULL,
  553. fa_deleted_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  554. fa_deleted_reason CLOB,
  555. fa_deleted_reason_id NUMBER DEFAULT 0 NOT NULL,
  556. fa_size NUMBER DEFAULT 0 NOT NULL,
  557. fa_width NUMBER DEFAULT 0 NOT NULL,
  558. fa_height NUMBER DEFAULT 0 NOT NULL,
  559. fa_metadata CLOB,
  560. fa_bits NUMBER DEFAULT 0 NOT NULL,
  561. fa_media_type VARCHAR2(32) DEFAULT NULL,
  562. fa_major_mime VARCHAR2(32) DEFAULT 'unknown',
  563. fa_minor_mime VARCHAR2(100) DEFAULT 'unknown',
  564. fa_description VARCHAR2(255),
  565. fa_description_id NUMBER DEFAULT 0 NOT NULL,
  566. fa_user NUMBER DEFAULT 0 NOT NULL,
  567. fa_user_text VARCHAR2(255) NULL,
  568. fa_actor NUMBER DEFAULT 0 NOT NULL,
  569. fa_timestamp TIMESTAMP(6) WITH TIME ZONE,
  570. fa_deleted NUMBER DEFAULT 0 NOT NULL,
  571. fa_sha1 VARCHAR2(32)
  572. );
  573. ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_pk PRIMARY KEY (fa_id);
  574. ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  575. ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  576. ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk3 FOREIGN KEY (fa_deleted_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  577. ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk4 FOREIGN KEY (fa_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  578. CREATE INDEX &mw_prefix.filearchive_i01 ON &mw_prefix.filearchive (fa_name, fa_timestamp);
  579. CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_group, fa_storage_key);
  580. CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
  581. CREATE INDEX &mw_prefix.filearchive_i04 ON &mw_prefix.filearchive (fa_user_text,fa_timestamp);
  582. CREATE INDEX &mw_prefix.fa_actor_timestamp ON &mw_prefix.filearchive (fa_actor,fa_timestamp);
  583. CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
  584. /*$mw$*/
  585. CREATE TRIGGER &mw_prefix.filearchive_seq_trg BEFORE INSERT ON &mw_prefix.filearchive
  586. FOR EACH ROW WHEN (new.fa_id IS NULL)
  587. BEGIN
  588. &mw_prefix.lastval_pkg.setLastval(filearchive_fa_id_seq.nextval, :new.fa_id);
  589. END;
  590. /*$mw$*/
  591. CREATE SEQUENCE uploadstash_us_id_seq;
  592. CREATE TABLE &mw_prefix.uploadstash (
  593. us_id NUMBER NOT NULL,
  594. us_user NUMBER DEFAULT 0 NOT NULL,
  595. us_key VARCHAR2(255) NOT NULL,
  596. us_orig_path VARCHAR2(255) NOT NULL,
  597. us_path VARCHAR2(255) NOT NULL,
  598. us_source_type VARCHAR2(50),
  599. us_timestamp TIMESTAMP(6) WITH TIME ZONE,
  600. us_status VARCHAR2(50) NOT NULL,
  601. us_chunk_inx NUMBER,
  602. us_size NUMBER NOT NULL,
  603. us_sha1 VARCHAR2(32) NOT NULL,
  604. us_mime VARCHAR2(255),
  605. us_media_type VARCHAR2(32) DEFAULT NULL,
  606. us_image_width NUMBER,
  607. us_image_height NUMBER,
  608. us_image_bits NUMBER,
  609. us_props BLOB
  610. );
  611. ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_pk PRIMARY KEY (us_id);
  612. ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_fk1 FOREIGN KEY (us_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  613. CREATE INDEX &mw_prefix.uploadstash_i01 ON &mw_prefix.uploadstash (us_user);
  614. CREATE INDEX &mw_prefix.uploadstash_i02 ON &mw_prefix.uploadstash (us_timestamp);
  615. CREATE UNIQUE INDEX &mw_prefix.uploadstash_u01 ON &mw_prefix.uploadstash (us_key);
  616. /*$mw$*/
  617. CREATE TRIGGER &mw_prefix.uploadstash_seq_trg BEFORE INSERT ON &mw_prefix.uploadstash
  618. FOR EACH ROW WHEN (new.us_id IS NULL)
  619. BEGIN
  620. &mw_prefix.lastval_pkg.setLastval(uploadstash_us_id_seq.nextval, :new.us_id);
  621. END;
  622. /*$mw$*/
  623. CREATE SEQUENCE recentchanges_rc_id_seq;
  624. CREATE TABLE &mw_prefix.recentchanges (
  625. rc_id NUMBER NOT NULL,
  626. rc_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  627. rc_cur_time TIMESTAMP(6) WITH TIME ZONE,
  628. rc_user NUMBER DEFAULT 0 NOT NULL,
  629. rc_user_text VARCHAR2(255) NULL,
  630. rc_actor NUMBER DEFAULT 0 NOT NULL,
  631. rc_namespace NUMBER DEFAULT 0 NOT NULL,
  632. rc_title VARCHAR2(255) NOT NULL,
  633. rc_comment VARCHAR2(255),
  634. rc_comment_id NUMBER DEFAULT 0 NOT NULL,
  635. rc_minor CHAR(1) DEFAULT '0' NOT NULL,
  636. rc_bot CHAR(1) DEFAULT '0' NOT NULL,
  637. rc_new CHAR(1) DEFAULT '0' NOT NULL,
  638. rc_cur_id NUMBER DEFAULT 0 NOT NULL,
  639. rc_this_oldid NUMBER DEFAULT 0 NOT NULL,
  640. rc_last_oldid NUMBER DEFAULT 0 NOT NULL,
  641. rc_type CHAR(1) DEFAULT '0' NOT NULL,
  642. rc_source VARCHAR2(16),
  643. rc_patrolled CHAR(1) DEFAULT '0' NOT NULL,
  644. rc_ip VARCHAR2(15),
  645. rc_old_len NUMBER,
  646. rc_new_len NUMBER,
  647. rc_deleted CHAR(1) DEFAULT '0' NOT NULL,
  648. rc_logid NUMBER DEFAULT 0 NOT NULL,
  649. rc_log_type VARCHAR2(255),
  650. rc_log_action VARCHAR2(255),
  651. rc_params CLOB
  652. );
  653. ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_pk PRIMARY KEY (rc_id);
  654. ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  655. ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  656. ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk3 FOREIGN KEY (rc_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  657. CREATE INDEX &mw_prefix.recentchanges_i01 ON &mw_prefix.recentchanges (rc_timestamp);
  658. CREATE INDEX &mw_prefix.recentchanges_i09 ON &mw_prefix.recentchanges (rc_namespace, rc_title, rc_timestamp);
  659. CREATE INDEX &mw_prefix.recentchanges_i03 ON &mw_prefix.recentchanges (rc_cur_id);
  660. CREATE INDEX &mw_prefix.recentchanges_i04 ON &mw_prefix.recentchanges (rc_new,rc_namespace,rc_timestamp);
  661. CREATE INDEX &mw_prefix.recentchanges_i05 ON &mw_prefix.recentchanges (rc_ip);
  662. CREATE INDEX &mw_prefix.recentchanges_i06 ON &mw_prefix.recentchanges (rc_namespace, rc_user_text);
  663. CREATE INDEX &mw_prefix.recentchanges_i07 ON &mw_prefix.recentchanges (rc_user_text, rc_timestamp);
  664. CREATE INDEX &mw_prefix.rc_ns_actor ON &mw_prefix.recentchanges (rc_namespace, rc_actor);
  665. CREATE INDEX &mw_prefix.rc_actor ON &mw_prefix.recentchanges (rc_actor, rc_timestamp);
  666. CREATE INDEX &mw_prefix.recentchanges_i08 ON &mw_prefix.recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
  667. CREATE INDEX &mw_prefix.recentchanges_i10 ON &mw_prefix.recentchanges (rc_this_oldid);
  668. /*$mw$*/
  669. CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
  670. FOR EACH ROW WHEN (new.rc_id IS NULL)
  671. BEGIN
  672. &mw_prefix.lastval_pkg.setLastval(recentchanges_rc_id_seq.nextval, :new.rc_id);
  673. END;
  674. /*$mw$*/
  675. CREATE TABLE &mw_prefix.watchlist (
  676. wl_id NUMBER NOT NULL,
  677. wl_user NUMBER NOT NULL,
  678. wl_namespace NUMBER DEFAULT 0 NOT NULL,
  679. wl_title VARCHAR2(255) NOT NULL,
  680. wl_notificationtimestamp TIMESTAMP(6) WITH TIME ZONE
  681. );
  682. ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_pk PRIMARY KEY (wl_id);
  683. ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  684. CREATE UNIQUE INDEX &mw_prefix.watchlist_u01 ON &mw_prefix.watchlist (wl_user, wl_namespace, wl_title);
  685. CREATE INDEX &mw_prefix.watchlist_i01 ON &mw_prefix.watchlist (wl_namespace, wl_title);
  686. CREATE TABLE &mw_prefix.searchindex (
  687. si_page NUMBER NOT NULL,
  688. si_title VARCHAR2(255),
  689. si_text CLOB NOT NULL
  690. );
  691. CREATE UNIQUE INDEX &mw_prefix.searchindex_u01 ON &mw_prefix.searchindex (si_page);
  692. CREATE TABLE &mw_prefix.interwiki (
  693. iw_prefix VARCHAR2(32) NOT NULL,
  694. iw_url VARCHAR2(127) NOT NULL,
  695. iw_api BLOB NOT NULL,
  696. iw_wikiid VARCHAR2(64),
  697. iw_local CHAR(1) NOT NULL,
  698. iw_trans CHAR(1) DEFAULT '0' NOT NULL
  699. );
  700. CREATE UNIQUE INDEX &mw_prefix.interwiki_u01 ON &mw_prefix.interwiki (iw_prefix);
  701. CREATE TABLE &mw_prefix.querycache (
  702. qc_type VARCHAR2(32) NOT NULL,
  703. qc_value NUMBER DEFAULT 0 NOT NULL,
  704. qc_namespace NUMBER DEFAULT 0 NOT NULL,
  705. qc_title VARCHAR2(255) NOT NULL
  706. );
  707. CREATE INDEX &mw_prefix.querycache_u01 ON &mw_prefix.querycache (qc_type,qc_value);
  708. CREATE TABLE &mw_prefix.objectcache (
  709. keyname VARCHAR2(255) ,
  710. value BLOB,
  711. exptime TIMESTAMP(6) WITH TIME ZONE NOT NULL
  712. );
  713. CREATE INDEX &mw_prefix.objectcache_i01 ON &mw_prefix.objectcache (exptime);
  714. CREATE SEQUENCE logging_log_id_seq;
  715. CREATE TABLE &mw_prefix.logging (
  716. log_id NUMBER NOT NULL,
  717. log_type VARCHAR2(10) NOT NULL,
  718. log_action VARCHAR2(10) NOT NULL,
  719. log_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  720. log_user NUMBER DEFAULT 0 NOT NULL,
  721. log_user_text VARCHAR2(255),
  722. log_actor NUMBER DEFAULT 0 NOT NULL,
  723. log_namespace NUMBER DEFAULT 0 NOT NULL,
  724. log_title VARCHAR2(255) NOT NULL,
  725. log_page NUMBER,
  726. log_comment VARCHAR2(255),
  727. log_comment_id NUMBER DEFAULT 0 NOT NULL,
  728. log_params CLOB,
  729. log_deleted CHAR(1) DEFAULT '0' NOT NULL
  730. );
  731. ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_pk PRIMARY KEY (log_id);
  732. ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
  733. ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk2 FOREIGN KEY (log_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  734. CREATE INDEX &mw_prefix.logging_i01 ON &mw_prefix.logging (log_type, log_timestamp);
  735. CREATE INDEX &mw_prefix.logging_i02 ON &mw_prefix.logging (log_user, log_timestamp);
  736. CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
  737. CREATE INDEX &mw_prefix.logging_i04 ON &mw_prefix.logging (log_timestamp);
  738. CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
  739. CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
  740. CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
  741. CREATE INDEX &mw_prefix.actor_time ON &mw_prefix.logging (log_actor, log_timestamp);
  742. CREATE INDEX &mw_prefix.log_actor_type_time ON &mw_prefix.logging (log_actor, log_type, log_timestamp);
  743. /*$mw$*/
  744. CREATE TRIGGER &mw_prefix.logging_seq_trg BEFORE INSERT ON &mw_prefix.logging
  745. FOR EACH ROW WHEN (new.log_id IS NULL)
  746. BEGIN
  747. &mw_prefix.lastval_pkg.setLastval(logging_log_id_seq.nextval, :new.log_id);
  748. END;
  749. /*$mw$*/
  750. CREATE TABLE &mw_prefix.log_search (
  751. ls_field VARCHAR2(32) NOT NULL,
  752. ls_value VARCHAR2(255) NOT NULL,
  753. ls_log_id NuMBER DEFAULT 0 NOT NULL
  754. );
  755. ALTER TABLE &mw_prefix.log_search ADD CONSTRAINT log_search_pk PRIMARY KEY (ls_field,ls_value,ls_log_id);
  756. CREATE INDEX &mw_prefix.log_search_i01 ON &mw_prefix.log_search (ls_log_id);
  757. CREATE SEQUENCE job_job_id_seq;
  758. CREATE TABLE &mw_prefix.job (
  759. job_id NUMBER NOT NULL,
  760. job_cmd VARCHAR2(60) NOT NULL,
  761. job_namespace NUMBER DEFAULT 0 NOT NULL,
  762. job_title VARCHAR2(255) NOT NULL,
  763. job_timestamp TIMESTAMP(6) WITH TIME ZONE NULL,
  764. job_params CLOB NOT NULL,
  765. job_random NUMBER DEFAULT 0 NOT NULL,
  766. job_token VARCHAR2(32),
  767. job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
  768. job_sha1 VARCHAR2(32),
  769. job_attempts NUMBER DEFAULT 0 NOT NULL
  770. );
  771. ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
  772. CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
  773. CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
  774. CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
  775. CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
  776. CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
  777. /*$mw$*/
  778. CREATE TRIGGER &mw_prefix.job_seq_trg BEFORE INSERT ON &mw_prefix.job
  779. FOR EACH ROW WHEN (new.job_id IS NULL)
  780. BEGIN
  781. &mw_prefix.lastval_pkg.setLastval(job_job_id_seq.nextval, :new.job_id);
  782. END;
  783. /*$mw$*/
  784. CREATE TABLE &mw_prefix.querycache_info (
  785. qci_type VARCHAR2(32) NOT NULL,
  786. qci_timestamp TIMESTAMP(6) WITH TIME ZONE NULL
  787. );
  788. CREATE UNIQUE INDEX &mw_prefix.querycache_info_u01 ON &mw_prefix.querycache_info (qci_type);
  789. CREATE TABLE &mw_prefix.redirect (
  790. rd_from NUMBER NOT NULL,
  791. rd_namespace NUMBER DEFAULT 0 NOT NULL,
  792. rd_title VARCHAR2(255) NOT NULL,
  793. rd_interwiki VARCHAR2(32),
  794. rd_fragment VARCHAR2(255)
  795. );
  796. ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  797. CREATE INDEX &mw_prefix.redirect_i01 ON &mw_prefix.redirect (rd_namespace,rd_title,rd_from);
  798. CREATE TABLE &mw_prefix.querycachetwo (
  799. qcc_type VARCHAR2(32) NOT NULL,
  800. qcc_value NUMBER DEFAULT 0 NOT NULL,
  801. qcc_namespace NUMBER DEFAULT 0 NOT NULL,
  802. qcc_title VARCHAR2(255),
  803. qcc_namespacetwo NUMBER DEFAULT 0 NOT NULL,
  804. qcc_titletwo VARCHAR2(255)
  805. );
  806. CREATE INDEX &mw_prefix.querycachetwo_i01 ON &mw_prefix.querycachetwo (qcc_type,qcc_value);
  807. CREATE INDEX &mw_prefix.querycachetwo_i02 ON &mw_prefix.querycachetwo (qcc_type,qcc_namespace,qcc_title);
  808. CREATE INDEX &mw_prefix.querycachetwo_i03 ON &mw_prefix.querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
  809. CREATE SEQUENCE page_restrictions_pr_id_seq;
  810. CREATE TABLE &mw_prefix.page_restrictions (
  811. pr_id NUMBER NOT NULL,
  812. pr_page NUMBER NOT NULL,
  813. pr_type VARCHAR2(255) NOT NULL,
  814. pr_level VARCHAR2(255) NOT NULL,
  815. pr_cascade NUMBER NOT NULL,
  816. pr_user NUMBER NULL,
  817. pr_expiry TIMESTAMP(6) WITH TIME ZONE NULL
  818. );
  819. ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_id);
  820. ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  821. CREATE UNIQUE INDEX &mw_prefix.page_restrictions_u01 ON &mw_prefix.page_restrictions (pr_page,pr_type);
  822. CREATE INDEX &mw_prefix.page_restrictions_i01 ON &mw_prefix.page_restrictions (pr_type,pr_level);
  823. CREATE INDEX &mw_prefix.page_restrictions_i02 ON &mw_prefix.page_restrictions (pr_level);
  824. CREATE INDEX &mw_prefix.page_restrictions_i03 ON &mw_prefix.page_restrictions (pr_cascade);
  825. /*$mw$*/
  826. CREATE TRIGGER &mw_prefix.page_restrictions_seq_trg BEFORE INSERT ON &mw_prefix.page_restrictions
  827. FOR EACH ROW WHEN (new.pr_id IS NULL)
  828. BEGIN
  829. &mw_prefix.lastval_pkg.setLastval(page_restrictions_pr_id_seq.nextval, :new.pr_id);
  830. END;
  831. /*$mw$*/
  832. CREATE TABLE &mw_prefix.protected_titles (
  833. pt_namespace NUMBER DEFAULT 0 NOT NULL,
  834. pt_title VARCHAR2(255) NOT NULL,
  835. pt_user NUMBER NOT NULL,
  836. pt_reason VARCHAR2(255),
  837. pt_reason_id NUMBER DEFAULT 0 NOT NULL,
  838. pt_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
  839. pt_expiry VARCHAR2(14) NOT NULL,
  840. pt_create_perm VARCHAR2(60) NOT NULL
  841. );
  842. ALTER TABLE &mw_prefix.protected_titles ADD CONSTRAINT &mw_prefix.protected_titles_fk1 FOREIGN KEY (pt_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
  843. CREATE UNIQUE INDEX &mw_prefix.protected_titles_u01 ON &mw_prefix.protected_titles (pt_namespace,pt_title);
  844. CREATE INDEX &mw_prefix.protected_titles_i01 ON &mw_prefix.protected_titles (pt_timestamp);
  845. CREATE TABLE &mw_prefix.page_props (
  846. pp_page NUMBER NOT NULL,
  847. pp_propname VARCHAR2(60) NOT NULL,
  848. pp_value BLOB NOT NULL
  849. );
  850. CREATE UNIQUE INDEX &mw_prefix.page_props_u01 ON &mw_prefix.page_props (pp_page,pp_propname);
  851. CREATE TABLE &mw_prefix.updatelog (
  852. ul_key VARCHAR2(255) NOT NULL,
  853. ul_value BLOB
  854. );
  855. ALTER TABLE &mw_prefix.updatelog ADD CONSTRAINT &mw_prefix.updatelog_pk PRIMARY KEY (ul_key);
  856. CREATE TABLE &mw_prefix.change_tag (
  857. ct_id NUMBER NOT NULL,
  858. ct_rc_id NUMBER NULL,
  859. ct_log_id NUMBER NULL,
  860. ct_rev_id NUMBER NULL,
  861. ct_tag VARCHAR2(255) DEFAULT '///invalid///' NOT NULL,
  862. ct_params BLOB NULL,
  863. ct_tag_id NUMBER NULL
  864. );
  865. ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id);
  866. CREATE INDEX &mw_prefix.change_tag_i03 ON &mw_prefix.change_tag (ct_rc_id,ct_tag);
  867. CREATE INDEX &mw_prefix.change_tag_i04 ON &mw_prefix.change_tag (ct_log_id,ct_tag);
  868. CREATE INDEX &mw_prefix.change_tag_i05 ON &mw_prefix.change_tag (ct_rev_id,ct_tag);
  869. CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id);
  870. CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id);
  871. CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id);
  872. CREATE INDEX &mw_prefix.change_tag_i01 ON &mw_prefix.change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
  873. CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
  874. CREATE TABLE &mw_prefix.tag_summary (
  875. ts_id NUMBER NOT NULL,
  876. ts_rc_id NUMBER NULL,
  877. ts_log_id NUMBER NULL,
  878. ts_rev_id NUMBER NULL,
  879. ts_tags BLOB NOT NULL
  880. );
  881. ALTER TABLE &mw_prefix.tag_summary ADD CONSTRAINT &mw_prefix.tag_summary_pk PRIMARY KEY (ts_id);
  882. CREATE UNIQUE INDEX &mw_prefix.tag_summary_u01 ON &mw_prefix.tag_summary (ts_rc_id);
  883. CREATE UNIQUE INDEX &mw_prefix.tag_summary_u02 ON &mw_prefix.tag_summary (ts_log_id);
  884. CREATE UNIQUE INDEX &mw_prefix.tag_summary_u03 ON &mw_prefix.tag_summary (ts_rev_id);
  885. CREATE TABLE &mw_prefix.valid_tag (
  886. vt_tag VARCHAR2(255) NOT NULL
  887. );
  888. ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY KEY (vt_tag);
  889. -- This table is not used unless profiling is turned on
  890. --CREATE TABLE &mw_prefix.profiling (
  891. -- pf_count NUMBER DEFAULT 0 NOT NULL,
  892. -- pf_time NUMBER(18,10) DEFAULT 0 NOT NULL,
  893. -- pf_memory NUMBER(18,10) DEFAULT 0 NOT NULL,
  894. -- pf_name VARCHAR2(255),
  895. -- pf_server VARCHAR2(30)
  896. --);
  897. --CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
  898. CREATE INDEX &mw_prefix.si_title_idx ON &mw_prefix.searchindex(si_title) INDEXTYPE IS ctxsys.context;
  899. CREATE INDEX &mw_prefix.si_text_idx ON &mw_prefix.searchindex(si_text) INDEXTYPE IS ctxsys.context;
  900. CREATE TABLE &mw_prefix.l10n_cache (
  901. lc_lang varchar2(32) NOT NULL,
  902. lc_key varchar2(255) NOT NULL,
  903. lc_value clob NOT NULL
  904. );
  905. CREATE INDEX &mw_prefix.l10n_cache_u01 ON &mw_prefix.l10n_cache (lc_lang, lc_key);
  906. CREATE TABLE &mw_prefix.module_deps (
  907. md_module VARCHAR2(255) NOT NULL,
  908. md_skin VARCHAR2(32) NOT NULL,
  909. md_deps BLOB NOT NULL
  910. );
  911. CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
  912. CREATE SEQUENCE sites_site_id_seq MINVALUE 0 START WITH 0;
  913. CREATE TABLE &mw_prefix.sites (
  914. site_id NUMBER NOT NULL,
  915. site_global_key VARCHAR2(32) NOT NULL,
  916. site_type VARCHAR2(32) NOT NULL,
  917. site_group VARCHAR2(32) NOT NULL,
  918. site_source VARCHAR2(32) NOT NULL,
  919. site_language VARCHAR2(32) NOT NULL,
  920. site_protocol VARCHAR2(32) NOT NULL,
  921. site_domain VARCHAR2(255) NOT NULL,
  922. site_data BLOB NOT NULL,
  923. site_forward NUMBER(1) NOT NULL,
  924. site_config BLOB NOT NULL
  925. );
  926. ALTER TABLE &mw_prefix.sites ADD CONSTRAINT &mw_prefix.sites_pk PRIMARY KEY (site_id);
  927. CREATE UNIQUE INDEX &mw_prefix.sites_u01 ON &mw_prefix.sites (site_global_key);
  928. CREATE INDEX &mw_prefix.sites_i01 ON &mw_prefix.sites (site_type);
  929. CREATE INDEX &mw_prefix.sites_i02 ON &mw_prefix.sites (site_group);
  930. CREATE INDEX &mw_prefix.sites_i03 ON &mw_prefix.sites (site_source);
  931. CREATE INDEX &mw_prefix.sites_i04 ON &mw_prefix.sites (site_language);
  932. CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
  933. CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
  934. CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
  935. /*$mw$*/
  936. CREATE TRIGGER &mw_prefix.sites_seq_trg BEFORE INSERT ON &mw_prefix.sites
  937. FOR EACH ROW WHEN (new.site_id IS NULL)
  938. BEGIN
  939. &mw_prefix.lastval_pkg.setLastval(sites_site_id_seq.nextval, :new.site_id);
  940. END;
  941. /*$mw$*/
  942. CREATE TABLE &mw_prefix.site_identifiers (
  943. si_site NUMBER NOT NULL,
  944. si_type VARCHAR2(32) NOT NULL,
  945. si_key VARCHAR2(32) NOT NULL
  946. );
  947. CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
  948. CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
  949. CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
  950. -- do not prefix this table as it breaks parserTests
  951. CREATE TABLE wiki_field_info_full (
  952. table_name VARCHAR2(35) NOT NULL,
  953. column_name VARCHAR2(35) NOT NULL,
  954. data_default VARCHAR2(4000),
  955. data_length NUMBER NOT NULL,
  956. data_type VARCHAR2(106),
  957. not_null CHAR(1) NOT NULL,
  958. prim NUMBER(1),
  959. uniq NUMBER(1),
  960. nonuniq NUMBER(1)
  961. );
  962. ALTER TABLE wiki_field_info_full ADD CONSTRAINT wiki_field_info_full_pk PRIMARY KEY (table_name, column_name);
  963. /*$mw$*/
  964. CREATE PROCEDURE fill_wiki_info IS
  965. BEGIN
  966. DELETE wiki_field_info_full;
  967. FOR x_rec IN (SELECT t.table_name table_name, t.column_name,
  968. t.data_default, t.data_length, t.data_type,
  969. DECODE (t.nullable, 'Y', '1', 'N', '0') not_null,
  970. (SELECT 1
  971. FROM user_cons_columns ucc,
  972. user_constraints uc
  973. WHERE ucc.table_name = t.table_name
  974. AND ucc.column_name = t.column_name
  975. AND uc.constraint_name = ucc.constraint_name
  976. AND uc.constraint_type = 'P'
  977. AND ROWNUM < 2) prim,
  978. (SELECT 1
  979. FROM user_ind_columns uic,
  980. user_indexes ui
  981. WHERE uic.table_name = t.table_name
  982. AND uic.column_name = t.column_name
  983. AND ui.index_name = uic.index_name
  984. AND ui.uniqueness = 'UNIQUE'
  985. AND ROWNUM < 2) uniq,
  986. (SELECT 1
  987. FROM user_ind_columns uic,
  988. user_indexes ui
  989. WHERE uic.table_name = t.table_name
  990. AND uic.column_name = t.column_name
  991. AND ui.index_name = uic.index_name
  992. AND ui.uniqueness = 'NONUNIQUE'
  993. AND ROWNUM < 2) nonuniq
  994. FROM user_tab_columns t, user_tables ut
  995. WHERE ut.table_name = t.table_name)
  996. LOOP
  997. INSERT INTO wiki_field_info_full
  998. (table_name, column_name,
  999. data_default, data_length,
  1000. data_type, not_null, prim,
  1001. uniq, nonuniq
  1002. )
  1003. VALUES (x_rec.table_name, x_rec.column_name,
  1004. x_rec.data_default, x_rec.data_length,
  1005. x_rec.data_type, x_rec.not_null, x_rec.prim,
  1006. x_rec.uniq, x_rec.nonuniq
  1007. );
  1008. END LOOP;
  1009. COMMIT;
  1010. END;
  1011. /*$mw$*/
  1012. /*$mw$*/
  1013. CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname IN VARCHAR2,
  1014. p_oldprefix IN VARCHAR2,
  1015. p_newprefix IN VARCHAR2,
  1016. p_temporary IN BOOLEAN) IS
  1017. e_table_not_exist EXCEPTION;
  1018. PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
  1019. l_temp_ei_sql VARCHAR2(2000);
  1020. l_temporary BOOLEAN := p_temporary;
  1021. BEGIN
  1022. BEGIN
  1023. EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
  1024. ' CASCADE CONSTRAINTS PURGE';
  1025. EXCEPTION
  1026. WHEN e_table_not_exist THEN
  1027. NULL;
  1028. END;
  1029. IF (p_tabname = 'SEARCHINDEX') THEN
  1030. l_temporary := FALSE;
  1031. END IF;
  1032. IF (l_temporary) THEN
  1033. EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
  1034. p_tabname ||
  1035. ' ON COMMIT PRESERVE ROWS AS SELECT * FROM ' ||
  1036. p_oldprefix || p_tabname || ' WHERE ROWNUM = 0';
  1037. ELSE
  1038. EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
  1039. ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
  1040. ' WHERE ROWNUM = 0';
  1041. END IF;
  1042. FOR rc IN (SELECT column_name, data_default
  1043. FROM user_tab_columns
  1044. WHERE table_name = p_oldprefix || p_tabname
  1045. AND data_default IS NOT NULL) LOOP
  1046. EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
  1047. ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
  1048. SUBSTR(rc.data_default, 1, 2000);
  1049. END LOOP;
  1050. FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
  1051. constraint_name),
  1052. 32767,
  1053. 1),
  1054. USER || '"."' || p_oldprefix,
  1055. USER || '"."' || p_newprefix),
  1056. '"' || constraint_name || '"',
  1057. '"' || p_newprefix || constraint_name || '"') DDLVC2,
  1058. constraint_name
  1059. FROM user_constraints uc
  1060. WHERE table_name = p_oldprefix || p_tabname
  1061. AND constraint_type = 'P') LOOP
  1062. l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
  1063. l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
  1064. 1,
  1065. INSTR(l_temp_ei_sql,
  1066. ')',
  1067. INSTR(l_temp_ei_sql, 'PRIMARY KEY') + 1) + 1);
  1068. IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
  1069. EXECUTE IMMEDIATE l_temp_ei_sql;
  1070. END IF;
  1071. END LOOP;
  1072. IF (NOT l_temporary) THEN
  1073. FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
  1074. constraint_name),
  1075. 32767,
  1076. 1),
  1077. USER || '"."' || p_oldprefix,
  1078. USER || '"."' || p_newprefix) DDLVC2,
  1079. constraint_name
  1080. FROM user_constraints uc
  1081. WHERE table_name = p_oldprefix || p_tabname
  1082. AND constraint_type = 'R') LOOP
  1083. IF nvl(length(l_temp_ei_sql), 0) > 0 AND
  1084. INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
  1085. EXECUTE IMMEDIATE l_temp_ei_sql;
  1086. END IF;
  1087. END LOOP;
  1088. END IF;
  1089. FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
  1090. index_name),
  1091. 32767,
  1092. 1),
  1093. USER || '"."' || p_oldprefix,
  1094. USER || '"."' || p_newprefix),
  1095. '"' || index_name || '"',
  1096. '"' || p_newprefix || index_name || '"') DDLVC2,
  1097. index_name,
  1098. index_type
  1099. FROM user_indexes ui
  1100. WHERE table_name = p_oldprefix || p_tabname
  1101. AND index_type NOT IN ('LOB', 'DOMAIN')
  1102. AND NOT EXISTS
  1103. (SELECT NULL
  1104. FROM user_constraints
  1105. WHERE table_name = ui.table_name
  1106. AND constraint_name = ui.index_name)) LOOP
  1107. l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
  1108. l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
  1109. 1,
  1110. INSTR(l_temp_ei_sql,
  1111. ')',
  1112. INSTR(l_temp_ei_sql,
  1113. '"' || USER || '"."' || p_newprefix || '"') + 1) + 1);
  1114. IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
  1115. EXECUTE IMMEDIATE l_temp_ei_sql;
  1116. END IF;
  1117. END LOOP;
  1118. FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
  1119. index_name),
  1120. 32767,
  1121. 1),
  1122. USER || '"."' || p_oldprefix,
  1123. USER || '"."' || p_newprefix),
  1124. '"' || index_name || '"',
  1125. '"' || p_newprefix || index_name || '"') DDLVC2,
  1126. index_name,
  1127. index_type
  1128. FROM user_indexes ui
  1129. WHERE table_name = p_oldprefix || p_tabname
  1130. AND index_type = 'DOMAIN'
  1131. AND NOT EXISTS
  1132. (SELECT NULL
  1133. FROM user_constraints
  1134. WHERE table_name = ui.table_name
  1135. AND constraint_name = ui.index_name)) LOOP
  1136. l_temp_ei_sql := rc.ddlvc2;
  1137. IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
  1138. EXECUTE IMMEDIATE l_temp_ei_sql;
  1139. END IF;
  1140. END LOOP;
  1141. FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
  1142. trigger_name),
  1143. 32767,
  1144. 1)),
  1145. USER || '"."' || p_oldprefix,
  1146. USER || '"."' || p_newprefix),
  1147. ' ON ' || p_oldprefix || p_tabname,
  1148. ' ON ' || p_newprefix || p_tabname) DDLVC2,
  1149. trigger_name
  1150. FROM user_triggers
  1151. WHERE table_name = p_oldprefix || p_tabname) LOOP
  1152. l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
  1153. IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
  1154. EXECUTE IMMEDIATE l_temp_ei_sql;
  1155. END IF;
  1156. END LOOP;
  1157. END;
  1158. /*$mw$*/
  1159. /*$mw$*/
  1160. CREATE OR REPLACE FUNCTION BITOR (x IN NUMBER, y IN NUMBER) RETURN NUMBER AS
  1161. BEGIN
  1162. RETURN (x + y - BITAND(x, y));
  1163. END;
  1164. /*$mw$*/
  1165. /*$mw$*/
  1166. CREATE OR REPLACE FUNCTION BITNOT (x IN NUMBER) RETURN NUMBER AS
  1167. BEGIN
  1168. RETURN (4294967295 - x);
  1169. END;
  1170. /*$mw$*/
  1171. CREATE OR REPLACE TYPE GET_OUTPUT_TYPE IS TABLE OF VARCHAR2(255);
  1172. /*$mw$*/
  1173. CREATE OR REPLACE FUNCTION GET_OUTPUT_LINES RETURN GET_OUTPUT_TYPE PIPELINED AS
  1174. v_line VARCHAR2(255);
  1175. v_status INTEGER := 0;
  1176. BEGIN
  1177. LOOP
  1178. DBMS_OUTPUT.GET_LINE(v_line, v_status);
  1179. IF (v_status = 0) THEN RETURN; END IF;
  1180. PIPE ROW (v_line);
  1181. END LOOP;
  1182. RETURN;
  1183. EXCEPTION
  1184. WHEN OTHERS THEN
  1185. RETURN;
  1186. END;
  1187. /*$mw$*/
  1188. /*$mw$*/
  1189. CREATE OR REPLACE FUNCTION GET_SEQUENCE_VALUE(seq IN VARCHAR2) RETURN NUMBER AS
  1190. v_value NUMBER;
  1191. BEGIN
  1192. EXECUTE IMMEDIATE 'SELECT '||seq||'.NEXTVAL INTO :outVar FROM DUAL' INTO v_value;
  1193. RETURN v_value;
  1194. END;
  1195. /*$mw$*/