summaryrefslogtreecommitdiff
path: root/src/backend/commands/command.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-08-10 18:57:42 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-08-10 18:57:42 +0000
commitbf56f0759bdfa87f143c3abd09f893a5f530fe88 (patch)
tree10555a5e46bcfdfd9799b8f0e13ab48101d766de /src/backend/commands/command.c
parentd062f0f4e91f68b1f55b04691bd92d1efc83dc54 (diff)
Make OIDs optional, per discussions in pghackers. WITH OIDS is still the
default, but OIDS are removed from many system catalogs that don't need them. Some interesting side effects: TOAST pointers are 20 bytes not 32 now; pg_description has a three-column key instead of one. Bugs fixed in passing: BINARY cursors work again; pg_class.relhaspkey has some usefulness; pg_dump dumps comments on indexes, rules, and triggers in a valid order. initdb forced.
Diffstat (limited to 'src/backend/commands/command.c')
-rw-r--r--src/backend/commands/command.c84
1 files changed, 45 insertions, 39 deletions
diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c
index 3d02fdb5fd2..1e8b7c56992 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.139 2001/08/10 14:30:14 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.140 2001/08/10 18:57:34 tgl Exp $
*
* NOTES
* The PerformAddAttribute() code, like most of the relation
@@ -102,7 +102,7 @@ PerformPortalFetch(char *name,
QueryDesc *queryDesc;
EState *estate;
MemoryContext oldcontext;
- bool faked_desc = false;
+ bool temp_desc = false;
/*
* sanity checks
@@ -130,24 +130,33 @@ PerformPortalFetch(char *name,
oldcontext = MemoryContextSwitchTo(PortalGetHeapMemory(portal));
/*
- * tell the destination to prepare to receive some tuples.
+ * If the requested destination is not the same as the query's
+ * original destination, make a temporary QueryDesc with the proper
+ * destination. This supports MOVE, for example, which will pass in
+ * dest = None.
*
- * If we've been asked for a MOVE, make a temporary QueryDesc with the
- * appropriate dummy destination.
+ * EXCEPTION: if the query's original dest is RemoteInternal (ie, it's
+ * a binary cursor) and the request is Remote, we do NOT override the
+ * original dest. This is necessary since a FETCH command will pass
+ * dest = Remote, not knowing whether the cursor is binary or not.
*/
queryDesc = PortalGetQueryDesc(portal);
estate = PortalGetState(portal);
- if (dest != queryDesc->dest) /* MOVE */
+ if (dest != queryDesc->dest &&
+ !(queryDesc->dest == RemoteInternal && dest == Remote))
{
QueryDesc *qdesc = (QueryDesc *) palloc(sizeof(QueryDesc));
memcpy(qdesc, queryDesc, sizeof(QueryDesc));
qdesc->dest = dest;
queryDesc = qdesc;
- faked_desc = true;
+ temp_desc = true;
}
+ /*
+ * tell the destination to prepare to receive some tuples.
+ */
BeginCommand(name,
queryDesc->operation,
PortalGetTupleDesc(portal),
@@ -156,7 +165,7 @@ PerformPortalFetch(char *name,
false, /* this is a portal fetch, not a "retrieve
* portal" */
tag,
- dest);
+ queryDesc->dest);
/*
* Determine which direction to go in, and check to see if we're
@@ -205,7 +214,7 @@ PerformPortalFetch(char *name,
/*
* Clean up and switch back to old context.
*/
- if (faked_desc) /* MOVE */
+ if (temp_desc)
pfree(queryDesc);
MemoryContextSwitchTo(oldcontext);
@@ -1004,8 +1013,7 @@ AlterTableDropColumn(const char *relationName,
#ifdef _DROP_COLUMN_HACK__
Relation rel,
attrdesc;
- Oid myrelid,
- attoid;
+ Oid myrelid;
HeapTuple reltup;
HeapTupleData classtuple;
Buffer buffer;
@@ -1094,7 +1102,6 @@ AlterTableDropColumn(const char *relationName,
if (attnum <= 0)
elog(ERROR, "ALTER TABLE: column name \"%s\" was already dropped",
colName);
- attoid = tup->t_data->t_oid;
/*
* Check constraints/indices etc here
@@ -1124,8 +1131,9 @@ AlterTableDropColumn(const char *relationName,
heap_close(attrdesc, NoLock);
heap_freetuple(tup);
- /* delete comments */
- DeleteComments(attoid);
+ /* delete comment for this attribute only */
+ CreateComments(RelationGetRelid(rel), RelOid_pg_class,
+ (int32) attnum, NULL);
/* delete attrdef */
drop_default(myrelid, attnum);
@@ -1750,9 +1758,8 @@ AlterTableCreateToastTable(const char *relationName, bool silent)
Oid toast_idxid;
char toast_relname[NAMEDATALEN + 1];
char toast_idxname[NAMEDATALEN + 1];
- Relation toast_idxrel;
IndexInfo *indexInfo;
- Oid classObjectId[1];
+ Oid classObjectId[2];
/*
* permissions checking. XXX exactly what is appropriate here?
@@ -1870,50 +1877,49 @@ AlterTableCreateToastTable(const char *relationName, bool silent)
* so there's no need to handle the toast rel as temp.
*/
toast_relid = heap_create_with_catalog(toast_relname, tupdesc,
- RELKIND_TOASTVALUE,
+ RELKIND_TOASTVALUE, false,
false, true);
/* make the toast relation visible, else index creation will fail */
CommandCounterIncrement();
- /* create index on chunk_id */
+ /*
+ * Create unique index on chunk_id, chunk_seq.
+ *
+ * NOTE: the tuple toaster could actually function with a single-column
+ * index on chunk_id only. However, it couldn't be unique then. We
+ * want it to be unique as a check against the possibility of duplicate
+ * TOAST chunk OIDs. Too, the index might be a little more efficient this
+ * way, since btree isn't all that happy with large numbers of equal keys.
+ */
indexInfo = makeNode(IndexInfo);
- indexInfo->ii_NumIndexAttrs = 1;
- indexInfo->ii_NumKeyAttrs = 1;
+ indexInfo->ii_NumIndexAttrs = 2;
+ indexInfo->ii_NumKeyAttrs = 2;
indexInfo->ii_KeyAttrNumbers[0] = 1;
+ indexInfo->ii_KeyAttrNumbers[1] = 2;
indexInfo->ii_Predicate = NIL;
indexInfo->ii_FuncOid = InvalidOid;
- indexInfo->ii_Unique = false;
+ indexInfo->ii_Unique = true;
classObjectId[0] = OID_OPS_OID;
+ classObjectId[1] = INT4_OPS_OID;
- index_create(toast_relname, toast_idxname, indexInfo,
- BTREE_AM_OID, classObjectId,
- false, false, true);
+ toast_idxid = index_create(toast_relname, toast_idxname, indexInfo,
+ BTREE_AM_OID, classObjectId,
+ false, true, true);
/*
* Update toast rel's pg_class entry to show that it has an index.
+ * The index OID is stored into the reltoastidxid field for
+ * easy access by the tuple toaster.
*/
- setRelhasindex(toast_relid, true);
-
- /*
- * Make index visible
- */
- CommandCounterIncrement();
-
- /*
- * Get the OID of the newly created index
- */
- toast_idxrel = index_openr(toast_idxname);
- toast_idxid = RelationGetRelid(toast_idxrel);
- index_close(toast_idxrel);
+ setRelhasindex(toast_relid, true, true, toast_idxid);
/*
- * Store the toast table- and index-Oid's in the relation tuple
+ * Store the toast table's OID in the parent relation's tuple
*/
((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid;
- ((Form_pg_class) GETSTRUCT(reltup))->reltoastidxid = toast_idxid;
simple_heap_update(class_rel, &reltup->t_self, reltup);
/*