aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/command.c
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2000-07-05 16:17:43 +0000
committerJan Wieck <JanWieck@Yahoo.com>2000-07-05 16:17:43 +0000
commit6534444d191a56afba36e0e1b58e9d18fc28a578 (patch)
tree66c8e924aeda67beef872bd48b89138e3ce0771d /src/backend/commands/command.c
parent01e1d8fa9a7395f75204834be6a93e56c38bdc1f (diff)
downloadpostgresql-6534444d191a56afba36e0e1b58e9d18fc28a578.tar.gz
postgresql-6534444d191a56afba36e0e1b58e9d18fc28a578.zip
Changed TOAST relations to have relkind RELKIND_TOASTVALUE.
Special handling of TOAST relations during VACUUM. TOAST relations are vacuumed while the lock on the master table is still active. The ANALYZE flag doesn't propagate to their vacuuming because the toaster access routines allways use index access ignoring stats, so why compute them at all. Protection of TOAST relations against normal INSERT/UPDATE/DELETE while offering SELECT for debugging purposes. Jan
Diffstat (limited to 'src/backend/commands/command.c')
-rw-r--r--src/backend/commands/command.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c
index af5c49af5eb..e3847ab5f4d 100644
--- a/src/backend/commands/command.c
+++ b/src/backend/commands/command.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.86 2000/07/05 13:50:59 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.87 2000/07/05 16:17:38 wieck Exp $
*
* NOTES
* The PerformAddAttribute() code, like most of the relation
@@ -1319,14 +1319,14 @@ AlterTableCreateToastTable(const char *relationName, bool silent)
-1, 0, false);
TupleDescInitEntry(tupdesc, (AttrNumber) 3,
"chunk_data",
- TEXTOID, /* XXX wouldn't BYTEAOID be better? */
+ BYTEAOID,
-1, 0, false);
- /* XXX use RELKIND_TOASTVALUE here? */
/* XXX what if owning relation is temp? need we mark toasttable too? */
- /* !!! No need to worry about temp. It'll go away when it's master */
- /* table is deleted. Jan */
- heap_create_with_catalog(toast_relname, tupdesc, RELKIND_RELATION,
+ /* XXX How do we know? No naming collisions possible because names */
+ /* are OID based. And toast table disappears when master table */
+ /* is destroyed. So what is it good for anyway? Jan */
+ heap_create_with_catalog(toast_relname, tupdesc, RELKIND_TOASTVALUE,
false, true);
/* make the toast relation visible, else index creation will fail */
@@ -1368,6 +1368,39 @@ AlterTableCreateToastTable(const char *relationName, bool silent)
heap_freetuple(reltup);
+ /*
+ * Finally update the toast relations pg_class tuple to say
+ * it has an index.
+ */
+ reltup = SearchSysCacheTuple(RELNAME, PointerGetDatum(toast_relname),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(reltup))
+ elog(ERROR, "ALTER TABLE: just created toast relation \"%s\" not found",
+ toast_relname);
+ classtuple.t_self = reltup->t_self;
+ switch (heap_mark4update(class_rel, &classtuple, &buffer))
+ {
+ case HeapTupleSelfUpdated:
+ case HeapTupleMayBeUpdated:
+ break;
+ default:
+ elog(ERROR, "couldn't lock pg_class tuple");
+ }
+ reltup = heap_copytuple(&classtuple);
+ ReleaseBuffer(buffer);
+
+ ((Form_pg_class) GETSTRUCT(reltup))->relhasindex = true;
+ heap_update(class_rel, &reltup->t_self, reltup, NULL);
+
+ CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
+ CatalogIndexInsert(ridescs, Num_pg_class_indices, class_rel, reltup);
+ CatalogCloseIndices(Num_pg_class_indices, ridescs);
+
+ heap_freetuple(reltup);
+
+ /*
+ * Close relatons and make changes visible
+ */
heap_close(class_rel, NoLock);
heap_close(rel, NoLock);