? cvs_get_vanilla.sh
? drupal-head-revisions_43+pgsql_2.diff
? database/updates.inc-1.114
? database/updates.inc-pgsql_fix4.diff
Index: database/database.pgsql
===================================================================
RCS file: /cvs/drupal/drupal/database/database.pgsql,v
retrieving revision 1.140
diff -u -r1.140 database.pgsql
--- database/database.pgsql	18 Oct 2005 14:41:26 -0000	1.140
+++ database/database.pgsql	28 Oct 2005 11:48:09 -0000
@@ -138,7 +138,6 @@
   weight smallint NOT NULL default '0',
   PRIMARY KEY (vid)
 );
-CREATE INDEX book_vid_idx ON book(vid);
 CREATE INDEX book_nid_idx ON book(nid);
 CREATE INDEX book_parent ON book(parent);
 
@@ -295,7 +294,6 @@
   nid integer NOT NULL default '0',
   vid integer NOT NULL default '0',
   tid integer NOT NULL default '0',
-  shadow integer NOT NULL default '0',
   PRIMARY KEY (nid)
 );
 CREATE INDEX forum_tid_idx ON forum(tid);
@@ -424,7 +422,7 @@
   PRIMARY KEY (nid)
 );
 CREATE INDEX node_type_idx ON node(type);
-CREATE INDEX node_title_idx ON node(title,type);
+CREATE INDEX node_title_type_idx ON node(title,type);
 CREATE INDEX node_status_idx ON node(status);
 CREATE INDEX node_uid_idx ON node(uid);
 CREATE INDEX node_moderate_idx ON node (moderate);
@@ -432,6 +430,7 @@
 CREATE INDEX node_created ON node(created);
 CREATE INDEX node_changed ON node(changed);
 CREATE INDEX node_vid_idx ON node(vid);
+CREATE INDEX node_status_type_nid_idx ON node(status,type,nid);
 
 --
 -- Table structure for table `node_access`
@@ -522,7 +521,7 @@
   PRIMARY KEY (pid)
 );
 CREATE INDEX url_alias_dst_idx ON url_alias(dst);
-CREATE INDEX url_alias_src ON url_alias(src);
+CREATE INDEX url_alias_src_idx ON url_alias(src);
 --
 -- Table structure for permission
 --
@@ -577,9 +576,9 @@
 CREATE TABLE search_dataset (
   sid integer NOT NULL default '0',
   type varchar(16) default NULL,
-  data text NOT NULL default '',
-  KEY sid_type (sid, type)
+  data text NOT NULL default ''
 );
+CREATE INDEX search_dataset_sid_type_idx on search_dataset(sid, type);
 
 --
 -- Table structure for search_index
@@ -594,7 +593,7 @@
   score float default NULL
 );
 CREATE INDEX search_index_sid_type_idx ON search_index(sid, type);
-CREATE INDEX search_index_from_sid_type_idx ON search_index(fromsid, fromtype);
+CREATE INDEX search_index_fromsid_fromtype_idx ON search_index(fromsid, fromtype);
 CREATE INDEX search_index_word_idx ON search_index(word);
 
 --
@@ -603,9 +602,9 @@
 
 CREATE TABLE search_total (
   word varchar(50) NOT NULL default '',
-  count float default NULL
+  count float default NULL,
+  PRIMARY KEY(word)
 );
-CREATE INDEX search_total_word_idx ON search_total(word);
 
 --
 -- Table structure for sessions
Index: database/updates.inc
===================================================================
RCS file: /cvs/drupal/drupal/database/updates.inc,v
retrieving revision 1.140
diff -u -r1.140 updates.inc
--- database/updates.inc	22 Oct 2005 15:14:46 -0000	1.140
+++ database/updates.inc	28 Oct 2005 11:48:10 -0000
@@ -67,7 +67,8 @@
   "2005-09-07" => "update_147",
   "2005-09-18" => "update_148",
   "2005-09-27" => "update_149",
-  "2005-10-15" => "update_150"
+  "2005-10-15" => "update_150",
+  "2005-10-28" => "update_151"
 );
 
 function update_110() {
@@ -519,7 +520,7 @@
     $ret[] = update_sql("ALTER TABLE {vocabulary} ADD tags tinyint(3) unsigned default '0' NOT NULL");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {vocabulary} ADD tags smallint default '0' NOT NULL");
+    db_add_column($ret, 'vocabulary', 'tags', 'smallint', array('unsigned' => TRUE, 'default' => 0, 'not null' => TRUE));
   }
 
   return $ret;
@@ -528,10 +529,10 @@
 function update_130() {
   $ret = array();
   if ($GLOBALS['db_type'] == 'mysql') {
-    $ret[] = update_sql("ALTER TABLE {sessions} ADD cache int(11) NOT NULL default '0' AFTER timestamp");
+    $ret[] = update_sql("ALTER TABLE {sessions} ADD cache int(11) NOT NULL default '0'"); // It is said that we should not depend on column orders thus removing "AFTER column" 
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {sessions} ADD cache int(11) NOT NULL default '0' AFTER timestamp");
+    db_add_column($ret, 'sessions', 'cache', 'int', array('default' => 0, 'not null' => TRUE));
   }
   return $ret;
 }
@@ -541,11 +542,10 @@
 
   if ($GLOBALS['db_type'] == 'mysql') {
     $ret[] = update_sql("ALTER TABLE {boxes} DROP INDEX title");
-    $ret[] = update_sql("ALTER TABLE {boxes} ADD INDEX title (title)");
+    // Removed recreation of the index, which is not present in the db schema
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("DROP INDEX boxes_title_idx");;
-    $ret[] = update_sql("CREATE INDEX title ON {boxes} (title)");
+    $ret[] = update_sql("ALTER TABLE {boxes} DROP CONSTRAINT {boxes}_title_key;");
   }
 
   return $ret;
@@ -575,31 +575,34 @@
 }
 
 function update_133() {
-  $ret[] = update_sql("CREATE TABLE {contact} (
-    subject varchar(255) NOT NULL default '',
-    recipients longtext NOT NULL default '',
-    reply longtext NOT NULL default ''
-    )");
-
+  $ret = array();
+  
   if ($GLOBALS['db_type'] == 'mysql') {
+    $ret[] = update_sql("CREATE TABLE {contact} (
+      subject varchar(255) NOT NULL default '',
+      recipients longtext NOT NULL default '',
+      reply longtext NOT NULL default ''
+      )");
     $ret[] = update_sql("ALTER TABLE {users} ADD login int(11) NOT NULL default '0'");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {users} ADD login integer");
-    $ret[] = update_sql("ALTER TABLE {users} ALTER COLUMN login SET NOT NULL");
-    $ret[] = update_sql("ALTER TABLE {users} ALTER COLUMN login SET DEFAULT '0'");
+    // Table {contact} is changed in update_143() so I have moved it's creation there.
+    // It was never created here for postgres because of errors.
+    
+    db_add_column($ret, 'users', 'login', 'int', array('default' => 0, 'not null' => TRUE));
   }
 
   return $ret;
 }
 
 function update_134() {
+  $ret = array();
   if ($GLOBALS['db_type'] == 'mysql') {
     $ret[] = update_sql('ALTER TABLE {blocks} DROP types');
   }
   else {
-    // Postgres can only drop columns since 7.4
-    #$ret[] = update_sql('ALTER TABLE {blocks} DROP types');
+    // We rename the column to note it's not longer used
+    db_drop_column($ret, 'blocks', 'types');
   }
   return $ret;
 }
@@ -615,7 +618,19 @@
 
 function update_136() {
   $ret = array();
-  $ret[] = update_sql("ALTER TABLE {users} CHANGE COLUMN changed access int(11) NOT NULL default '0'");
+  
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':      
+      $ret[] = update_sql("DROP INDEX {users}_changed_idx"); // We drop the index first because it won't be renamed
+      $ret[] = update_sql("ALTER TABLE {users} RENAME changed TO access");
+      db_add_key($ret, 'users', 'access'); // Re-add the index
+      break;
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("ALTER TABLE {users} CHANGE COLUMN changed access int(11) NOT NULL default '0'");
+      break;
+  }
+  
   $ret[] = update_sql('UPDATE {users} SET access = login WHERE login > created');
   $ret[] = update_sql('UPDATE {users} SET access = created WHERE access = 0');
   return $ret;
@@ -628,12 +643,7 @@
     $ret[] = update_sql("ALTER TABLE {locales_source} CHANGE location location varchar(255) NOT NULL default ''");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {locales_source} RENAME location TO location_old");
-    $ret[] = update_sql("ALTER TABLE {locales_source} ADD location varchar(255)");
-    $ret[] = update_sql("UPDATE {locales_source} SET location = location_old");
-    $ret[] = update_sql("ALTER TABLE {locales_source} ALTER location SET NOT NULL");
-    $ret[] = update_sql("ALTER TABLE {locales_source} ALTER location SET DEFAULT ''");
-    $ret[] = update_sql("ALTER TABLE {locales_source} DROP location_old");
+    db_change_column($ret, 'locales_source', 'location', 'location', 'varchar(255)', array('not null' => TRUE, 'default' => ''));
   }
   return $ret;
 }
@@ -647,7 +657,7 @@
 
 function update_139() {
   $ret = array();
-  $ret[] = update_sql("ALTER TABLE {accesslog} ADD timer int(10) unsigned NOT NULL default '0'");
+  db_add_column($ret, 'accesslog', 'timer', 'int', array('unsigned' => TRUE, 'not null' => TRUE, 'default' => 0));
   return $ret;
 }
 
@@ -658,7 +668,7 @@
     $ret[] = update_sql("ALTER TABLE {url_alias} ADD INDEX (src)");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("CREATE INDEX url_alias_src ON {url_alias}(src)");
+    db_add_key($ret, 'url_alias', 'src');
   }
   return $ret;
 }
@@ -673,7 +683,7 @@
 
 function update_142() {
   $ret = array();
-  $ret[] = update_sql("ALTER TABLE {watchdog} ADD COLUMN referer varchar(128) NOT NULL");
+  db_add_column($ret, 'watchdog', 'referer', 'varchar(128)', array('not null' => TRUE, 'default' => ''));
   return $ret;
 }
 
@@ -682,11 +692,16 @@
 
   if ($GLOBALS['db_type'] == 'mysql') {
     $ret[] = update_sql("ALTER TABLE {contact} CHANGE subject category VARCHAR(255) NOT NULL ");
+    $ret[] = update_sql("ALTER TABLE {contact} ADD PRIMARY KEY (category)");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {contact} RENAME COLUMN subject TO category");
+    // Why the table is created here? See update_133().
+    $ret[] = update_sql("CREATE TABLE {contact} (
+      category varchar(255) NOT NULL default '',
+      recipients text NOT NULL default '',
+      reply text NOT NULL default '',
+      PRIMARY KEY (category))");
   }
-  $ret[] = update_sql("ALTER TABLE {contact} ADD PRIMARY KEY (category)");
 
   return $ret;
 }
@@ -697,12 +712,12 @@
     $ret[] = update_sql("ALTER TABLE {node} CHANGE type type VARCHAR(32) NOT NULL");
   }
   elseif ($GLOBALS['db_type'] == 'pgsql') {
-    $ret[] = update_sql("ALTER TABLE {node} RENAME type TO type_old");
-    $ret[] = update_sql("ALTER TABLE {node} ADD type varchar(32)");
-    $ret[] = update_sql("ALTER TABLE {node} ALTER type SET NOT NULL");
-    $ret[] = update_sql("ALTER TABLE {node} ALTER type SET DEFAULT ''");
-    $ret[] = update_sql("UPDATE {node} SET type = type_old");
-    $ret[] = update_sql("ALTER TABLE {node} DROP type_old");
+    $ret[] = update_sql("DROP INDEX {node}_type_idx"); // Drop indexes using "type"
+    $ret[] = update_sql("DROP INDEX {node}_title_idx");
+    db_change_column($ret, 'node', 'type', 'type', 'varchar(32)', array('not null' => TRUE, 'default' => ''));
+    db_add_key($ret, 'node', 'type'); // Let's recreate the indexes
+    $ret = update_sql("CREATE INDEX {node}_title_type_idx ON {node}(title,type)"); // TODO multi-keys indexes function?
+    $ret = update_sql("CREATE INDEX {node}_status_type_nid_idx ON {node}(status,type,nid)");
   }
   return $ret;
 }
@@ -710,8 +725,18 @@
 function update_145() {
   $default_theme = variable_get('theme_default', 'bluemarine');
   $ret = array();
-  $ret[] = update_sql("ALTER TABLE {blocks} CHANGE region region varchar(64) default 'left' NOT NULL");
-  $ret[] = update_sql("ALTER TABLE {blocks} ADD theme varchar(255) NOT NULL default ''");
+  
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':
+      db_change_column($ret, 'blocks', 'region', 'region', 'varchar(64)', array('default' => 'left', 'not null' => TRUE));
+      db_add_column($ret, 'blocks', 'theme', 'varchar(255)', array('not null' => TRUE, 'default' => ''));
+      break;
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("ALTER TABLE {blocks} CHANGE region region varchar(64) default 'left' NOT NULL");
+      $ret[] = update_sql("ALTER TABLE {blocks} ADD theme varchar(255) NOT NULL default ''");
+      break;
+  }
 
   // Intialize block data for default theme
   $ret[] = update_sql("UPDATE {blocks} SET region = 'left' WHERE region = '0'");
@@ -770,16 +795,47 @@
     $ret[] = update_sql("INSERT INTO {sequences} (name, id) VALUES ('{node_revisions}_vid', $vid)");
   }
   else { // pgsql
-    $ret[] = update_sql("CREATE TABLE {node_revisions} AS
-                                SELECT nid, nid AS vid, uid, type, title, body, teaser, changed AS timestamp, format
+    $ret[] = update_sql("CREATE TABLE {node_revisions} (
+      nid integer NOT NULL default '0',
+      vid integer NOT NULL default '0',
+      uid integer NOT NULL default '0',
+      title varchar(128) NOT NULL default '',
+      body text NOT NULL default '',
+      teaser text NOT NULL default '',
+      log text NOT NULL default '',
+      timestamp integer NOT NULL default '0',
+      format int NOT NULL default '0',
+      PRIMARY KEY  (nid,vid))");
+    $ret[] = update_sql("INSERT INTO {node_revisions}  
+                                SELECT nid, nid AS vid, uid, title, body, teaser, changed AS timestamp, format
                                 FROM {node}");
+    db_add_key($ret, 'node_revisions', 'uid');
+    $vid = db_next_id('{node}_nid');
+    $ret[] = update_sql("CREATE SEQUENCE {node_revisions}_vid_seq INCREMENT 1 START $vid");
 
+    db_add_column($ret, 'node',  'vid', 'int', array('not null' => TRUE, 'default' => 0));
+    db_add_column($ret, 'files', 'vid', 'int', array('not null' => TRUE, 'default' => 0));
+    db_add_column($ret, 'book',  'vid', 'int', array('not null' => TRUE, 'default' => 0));
+    db_add_column($ret, 'forum', 'vid', 'int', array('not null' => TRUE, 'default' => 0));
+    
+    db_drop_primary_key($ret, 'book');
+    db_drop_primary_key($ret, 'forum');
+    db_drop_primary_key($ret, 'files');
+    
     $ret[] = update_sql("UPDATE {node} SET vid = nid");
     $ret[] = update_sql("UPDATE {forum} SET vid = nid");
     $ret[] = update_sql("UPDATE {book} SET vid = nid");
     $ret[] = update_sql("UPDATE {files} SET vid = nid");
-
+    
+    db_add_primary_key($ret, 'book', 'vid');
+    db_add_primary_key($ret, 'node', 'vid'); // This was not in mysql update but is in database.*
+    db_add_primary_key($ret, 'forum', 'nid'); // We, The Postgres, will do it database.* way, not update() way.
+    
     $ret[] = update_sql("CREATE TABLE {old_revisions} AS SELECT nid, type, revisions FROM {node} WHERE revisions != ''");
+    
+    db_add_key($ret, 'forum', 'vid');
+    db_add_key($ret, 'files', 'fid');
+    db_add_key($ret, 'files', 'vid');
   }
 
   // Move logs too.
@@ -796,6 +852,11 @@
     $ret[] = update_sql("ALTER TABLE {node} DROP revisions");
   }
   else { // pgsql
+    db_drop_column($ret, 'book', 'log');
+    db_drop_column($ret, 'node', 'teaser');
+    db_drop_column($ret, 'node', 'body');
+    db_drop_column($ret, 'node', 'format');
+    db_drop_column($ret, 'node', 'revisions');
   }
 
   return $ret;
@@ -818,9 +879,7 @@
   // Add support for tracking users' session ids (useful for tracking anon users)
   switch ($GLOBALS['db_type']) {
     case 'pgsql':
-      $ret[] = update_sql("ALTER TABLE {accesslog} ADD sid varchar(32)");
-      $ret[] = update_sql("ALTER TABLE {accesslog} ALTER sid SET NOT NULL");
-      $ret[] = update_sql("ALTER TABLE {accesslog} ALTER sid SET DEFAULT ''");
+      db_add_column($ret, 'accesslog', 'sid', 'varchar(32)', array('not null' => TRUE, 'default' => ''));
       break;
     case 'mysql':
     case 'mysqli':
@@ -836,6 +895,8 @@
 
   switch ($GLOBALS['db_type']) {
     case 'pgsql':
+      db_add_column($ret, 'files', 'description', 'varchar(255)', array('not null' => TRUE, 'default' => ''));
+      break;
     case 'mysql':
     case 'mysqli':
       $ret[] = update_sql("ALTER TABLE {files} ADD COLUMN description VARCHAR(255) NOT NULL DEFAULT ''");
@@ -888,30 +949,27 @@
                            )");
       break;
     case 'pgsql':
-      $ret[] = update_sql("CREATE TABLE {search_dataset} (
-                           sid integer NOT NULL default '0',
-                           type varchar(16) default NULL,
-                           data text NOT NULL default '',
-                           KEY sid_type (sid, type)
-                           )");
-
-      $ret[] = update_sql("CREATE TABLE {search_index} (
-                           word varchar(50) NOT NULL default '',
-                           sid integer NOT NULL default '0',
-                           type varchar(16) default NULL,
-                           fromsid integer NOT NULL default '0',
-                           fromtype varchar(16) default NULL,
-                           score float default NULL
-                           )");
-      $ret[] = update_sql("CREATE INDEX search_index_sid_type_idx ON {search_index}(sid, type)");
-      $ret[] = update_sql("CREATE INDEX search_index_from_sid_type_idx ON {search_index}(fromsid, fromtype)");
-      $ret[] = update_sql("CREATE INDEX search_index_word_idx ON {search_index}(word)");
-
-      $ret[] = update_sql("CREATE TABLE {search_total} (
-                           word varchar(50) NOT NULL default '',
-                           count float default NULL
-                           )");
-      $ret[] = update_sql("CREATE INDEX search_total_word_idx ON {search_total}(word)");
+      $ret[] = update_sql("CREATE TABLE search_dataset (
+        sid integer NOT NULL default '0',
+        type varchar(16) default NULL,
+        data text NOT NULL default '')");
+      $ret[] = update_sql("CREATE INDEX search_dataset_sid_type_idx on search_dataset(sid, type)");
+    
+      $ret[] = update_sql("CREATE TABLE search_index (
+        word varchar(50) NOT NULL default '',
+        sid integer NOT NULL default '0',
+        type varchar(16) default NULL,
+        fromsid integer NOT NULL default '0',
+        fromtype varchar(16) default NULL,
+        score float default NULL)");
+      $ret[] = update_sql("CREATE INDEX search_index_sid_type_idx ON search_index(sid, type)");
+      $ret[] = update_sql("CREATE INDEX search_index_fromsid_fromtype_idx ON search_index(fromsid, fromtype)");
+      $ret[] = update_sql("CREATE INDEX search_index_word_idx ON search_index(word)");
+
+      $ret[] = update_sql("CREATE TABLE search_total (
+        word varchar(50) NOT NULL default '',
+        count float default NULL,
+        PRIMARY KEY(word))");
       break;
     default:
       break;
@@ -919,6 +977,23 @@
   return $ret;
 }
 
+function update_151() {
+  $ret = array();
+  
+  // Postgresql only update
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':    
+      db_drop_column($ret, 'forum', 'shadow');
+      break;
+    case 'mysql':
+    case 'mysqli':
+      break;
+  }
+ 
+  return $ret;
+}
+
+
 function update_sql($sql) {
   $edit = $_POST["edit"];
   $result = db_query($sql);
