diff --git a/doc/src/sgml/ref/truncate.sgml b/doc/src/sgml/ref/truncate.sgml
new file mode 100644
index 0000000000..998f826d9c
--- /dev/null
+++ b/doc/src/sgml/ref/truncate.sgml
@@ -0,0 +1,133 @@
+
+
+
+
+
+ TRUNCATE
+
+ SQL - Language Statements
+
+
+
+ TRUNCATE
+
+
+ Close a cursor
+
+
+
+
+ 1999-07-20
+
+
+TRUNCATE TABLE table
+
+
+
+
+ 1998-09-08
+
+
+ Inputs
+
+
+
+
+
+ table
+
+
+ The table name to truncate.
+
+
+
+
+
+
+
+
+
+ 1998-09-08
+
+
+ Outputs
+
+
+
+
+
+
+TRUNCATE
+
+
+
+ Message returned if the table is successfully truncated.
+
+
+
+
+
+
+
+
+
+
+ 1998-09-08
+
+
+ Description
+
+
+ TRUNCATE quickly removes all rows from a table.
+
+
+
+
+ Usage
+
+
+ Truncate the table bigtable.
+
+
+TRUNCATE TABLE bigtable;
+
+
+
+
+
+ Compatibility
+
+
+
+
+ 1998-09-08
+
+
+ SQL92
+
+
+ There is no TRUNCATE in SQL92.
+
+
+
+
+
+
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 644f03eba8..e225a5834d 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.96 1999/09/18 19:06:33 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.97 1999/09/23 17:02:34 momjian Exp $
*
*
* INTERFACE ROUTINES
@@ -30,6 +30,7 @@
#include "miscadmin.h"
#include "access/heapam.h"
+#include "access/genam.h"
#include "access/xact.h"
#include "catalog/catalog.h"
#include "catalog/catname.h"
@@ -40,6 +41,7 @@
#include "catalog/pg_index.h"
#include "catalog/pg_inherits.h"
#include "catalog/pg_ipl.h"
+#include "catalog/pg_proc.h"
#include "catalog/pg_relcheck.h"
#include "commands/trigger.h"
#include "optimizer/tlist.h"
@@ -49,6 +51,7 @@
#include "storage/smgr.h"
#include "tcop/tcopprot.h"
#include "utils/builtins.h"
+#include "utils/portal.h"
#include "utils/relcache.h"
#include "utils/syscache.h"
#include "utils/temprel.h"
@@ -1056,6 +1059,233 @@ DeleteRelationTuple(Relation rel)
heap_close(pg_class_desc, RowExclusiveLock);
}
+/* --------------------------------
+ * RelationTruncateIndexes - This routine is used to truncate all
+ * indices associated with the heap relation to zero tuples.
+ * The routine will truncate and then reconstruct the indices on
+ * the relation specified by the heapRelation parameter.
+ * --------------------------------
+*/
+
+static void
+RelationTruncateIndexes(Relation heapRelation) {
+
+ Relation indexRelation, currentIndex;
+ ScanKeyData entry;
+ HeapScanDesc scan;
+ HeapTuple indexTuple, procTuple, classTuple;
+ Form_pg_index index;
+ Oid heapId, indexId, procId, accessMethodId;
+ Node *oldPred = NULL;
+ PredInfo *predInfo;
+ List *cnfPred = NULL;
+ AttrNumber *attributeNumberA;
+ FuncIndexInfo fInfo, *funcInfo = NULL;
+ int i, numberOfAttributes;
+ char *predString;
+
+ /*** Save the id of the heap relation ***/
+
+ heapId = RelationGetRelid(heapRelation);
+
+ /*** Open the System relation, pg_index ***/
+
+ indexRelation = heap_openr(IndexRelationName);
+
+ /*** Scan pg_index For indexes related to heap relation ***/
+
+ ScanKeyEntryInitialize(&entry, 0x0, Anum_pg_index_indrelid, F_OIDEQ,
+ ObjectIdGetDatum(heapId));
+
+ scan = heap_beginscan(indexRelation, false, SnapshotNow, 1, &entry);
+ while (HeapTupleIsValid(indexTuple = heap_getnext(scan, 0))) {
+
+ /*** For each index, fetch index attributes ***/
+
+ index = (Form_pg_index) GETSTRUCT(indexTuple);
+ indexId = index->indexrelid;
+ procId = index->indproc;
+
+ for (i = 0; i < INDEX_MAX_KEYS; i++) {
+ if (index->indkey[i] == InvalidAttrNumber) break;
+ }
+ numberOfAttributes = i;
+
+ /*** If a valid where predicate, compute predicate Node ***/
+
+ if (VARSIZE(&index->indpred) != 0) {
+ predString = fmgr(F_TEXTOUT, &index->indpred);
+ oldPred = stringToNode(predString);
+ pfree(predString);
+ }
+
+ predInfo = (PredInfo *) palloc(sizeof(PredInfo));
+ predInfo->pred = (Node *) cnfPred;
+ /* predInfo->pred = (Node *) oldPred; */
+ predInfo->oldPred = oldPred;
+
+ /*** Assign Index keys to attributes array ***/
+
+ attributeNumberA = (AttrNumber *) palloc(numberOfAttributes *
+ sizeof(attributeNumberA[0]));
+ for (i = 0; i < numberOfAttributes; i++) {
+ attributeNumberA[i] = index->indkey[i];
+ }
+
+ /*** If this is a procedural index, initialize our FuncIndexInfo ***/
+
+ if (procId != InvalidOid) {
+ funcInfo = &fInfo;
+ FIsetnArgs(funcInfo, numberOfAttributes);
+ procTuple = SearchSysCacheTuple(PROOID, ObjectIdGetDatum(procId),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(procTuple)) {
+ elog(ERROR, "RelationTruncateIndexes: index procedure not found");
+ }
+ namecpy(&(funcInfo->funcName),
+ &(((Form_pg_proc) GETSTRUCT(procTuple))->proname));
+ FIsetProcOid(funcInfo, procTuple->t_data->t_oid);
+ }
+
+ /*** Fetch the classTuple associated with this index ***/
+
+ classTuple = SearchSysCacheTupleCopy(RELOID, ObjectIdGetDatum(indexId),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(classTuple)) {
+ elog(ERROR, "RelationTruncateIndexes: index access method not found");
+ }
+ accessMethodId = ((Form_pg_class) GETSTRUCT(classTuple))->relam;
+
+ /*** Open our index relation ***/
+
+ currentIndex = index_open(indexId);
+ if (currentIndex == NULL) {
+ elog(ERROR, "RelationTruncateIndexes: can't open index relation");
+ }
+
+ /*** Truncate the index before building ***/
+
+ smgrtruncate(DEFAULT_SMGR, currentIndex, 0);
+ currentIndex->rd_nblocks = 0;
+
+ /*** Initialize the index and rebuild ***/
+
+ InitIndexStrategy(numberOfAttributes, currentIndex, accessMethodId);
+ index_build(heapRelation, currentIndex, numberOfAttributes,
+ attributeNumberA, 0, NULL, funcInfo, predInfo);
+
+ /*** Re-open our heap relation and re-lock, since index_build ***/
+ /*** will close and unlock the relation ***/
+
+ heapRelation = heap_open(heapId);
+ LockRelation(heapRelation, AccessExclusiveLock);
+
+ /*** RelationUnsetLockForWrite(currentIndex); ***/
+
+ }
+
+ /*** Complete the scan and close the Catalogueindex Relation ***/
+
+ heap_endscan(scan);
+ heap_close(indexRelation);
+
+}
+
+/* ----------------------------
+ * heap_truncate
+ *
+ * This routine is used to truncate the data from the
+ * storange manager of any data within the relation handed
+ * to this routine. The routine assumes that the relation
+ * handed to this routine is an open relation.
+ *
+ * ----------------------------
+ */
+
+void
+heap_truncate(char *relname) {
+
+ Relation rel;
+ Oid rid;
+ Portal portal;
+ char *pname;
+ MemoryContext old;
+ PortalVariableMemory pmem;
+ NameData truncRel;
+
+ /*
+ * Create a portal for safe memory across transctions. We need to
+ * palloc the name space for it because our hash function expects the
+ * name to be on a longword boundary. CreatePortal copies the name to
+ * safe storage for us.
+ */
+
+ pname = (char *) palloc(strlen(TRUNCPNAME) + 1);
+ strcpy(pname, TRUNCPNAME);
+ portal = CreatePortal(pname);
+ pfree(pname);
+
+ /* relname gets de-allocated on transaction commit */
+
+ strcpy(truncRel.data, relname);
+
+ pmem = PortalGetVariableMemory(portal);
+ old = MemoryContextSwitchTo((MemoryContext) pmem);
+ MemoryContextSwitchTo(old);
+
+ /* Commit the current transaction */
+
+ CommitTransactionCommand();
+ StartTransactionCommand();
+
+ /* Open relation for processing */
+
+ rel = heap_openr(truncRel.data);
+ if (rel == NULL)
+ elog(ERROR, "Relation %s Does Not Exist!", truncRel.data);
+ rid = rel->rd_id;
+
+ LockRelation(rel, AccessExclusiveLock);
+
+ /* Release any buffers associated with this relation */
+
+ ReleaseRelationBuffers(rel);
+ BlowawayRelationBuffers(rel, 0);
+
+ /* Now truncate the actual data and set blocks to zero */
+
+ smgrtruncate(DEFAULT_SMGR, rel, 0);
+ rel->rd_nblocks = 0;
+
+ /* If this relation has indexes, truncate the indexes, which */
+ /* will unlock the relation as a result. Otherwise, unlock */
+ /* the relation ourselves. */
+
+ if (rel->rd_rel->relhasindex) {
+ RelationTruncateIndexes(rel);
+ } else {
+ UnlockRelation(rel, AccessExclusiveLock);
+ }
+
+ /* Close our relation */
+
+ heap_close(rel);
+ RelationForgetRelation(rid);
+
+ /* Destoy cross-transaction memory */
+
+ PortalDestroy(&portal);
+
+ /* Start new transaction */
+
+ CommitTransactionCommand();
+ StartTransactionCommand();
+
+ return;
+
+}
+
+
/* --------------------------------
* DeleteAttributeTuples
*
diff --git a/src/backend/commands/creatinh.c b/src/backend/commands/creatinh.c
index c1069dd41e..c146afa1db 100644
--- a/src/backend/commands/creatinh.c
+++ b/src/backend/commands/creatinh.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.46 1999/09/18 19:06:40 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.47 1999/09/23 17:02:40 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -157,6 +157,26 @@ RemoveRelation(char *name)
heap_destroy_with_catalog(name);
}
+/*
+ * TruncateRelation --
+ * Removes all the rows from a relation
+ *
+ * Exceptions:
+ * BadArg if name is invalid
+ *
+ *
+ * Note:
+ * Rows are removed, indices are truncated and reconstructed.
+ */
+
+void
+TruncateRelation(char *name)
+{
+
+ AssertArg(name);
+ heap_truncate(name);
+
+}
/*
* MergeAttributes
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 20c33bc20c..32c46e05d1 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.98 1999/09/14 06:06:31 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.99 1999/09/23 17:02:46 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -122,6 +122,7 @@ Oid param_type(int t); /* used in parse_expr.c */
%type stmt,
AddAttrStmt, ClosePortalStmt,
CopyStmt, CreateStmt, CreateAsStmt, CreateSeqStmt, DefineStmt, DestroyStmt,
+ TruncateStmt,
ExtendStmt, FetchStmt, GrantStmt, CreateTrigStmt, DropTrigStmt,
CreatePLangStmt, DropPLangStmt,
IndexStmt, ListenStmt, UnlistenStmt, LockStmt, OptimizableStmt,
@@ -318,7 +319,7 @@ Oid param_type(int t); /* used in parse_expr.c */
OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT,
- TRUSTED,
+ TRUNCATE, TRUSTED,
UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
/* Special keywords, not in the query language - see the "lex" file */
@@ -383,7 +384,8 @@ stmt : AddAttrStmt
| CreateUserStmt
| ClusterStmt
| DefineStmt
- | DestroyStmt
+ | DestroyStmt
+ | TruncateStmt
| DropPLangStmt
| DropTrigStmt
| DropUserStmt
@@ -1607,6 +1609,20 @@ DestroyStmt: DROP TABLE relation_name_list
}
;
+/*****************************************************************************
+ *
+ * QUERY:
+ * truncate table relname
+ *
+ *****************************************************************************/
+
+TruncateStmt: TRUNCATE TABLE relation_name
+ {
+ TruncateStmt *n = makeNode(TruncateStmt);
+ n->relName = $3;
+ $$ = (Node *)n;
+ }
+ ;
/*****************************************************************************
*
@@ -2371,7 +2387,6 @@ ClusterStmt: CLUSTER index_name ON relation_name
}
;
-
/*****************************************************************************
*
* QUERY:
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index bd5b43ad1f..17a521337e 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.60 1999/07/17 20:17:22 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.61 1999/09/23 17:02:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -225,6 +225,7 @@ static ScanKeyword ScanKeywords[] = {
{"trigger", TRIGGER},
{"trim", TRIM},
{"true", TRUE_P},
+ {"truncate", TRUNCATE},
{"trusted", TRUSTED},
{"type", TYPE_P},
{"union", UNION},
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 29b4fb527c..26735a5d80 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.65 1999/09/18 19:07:44 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.66 1999/09/23 17:02:52 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -206,6 +206,38 @@ ProcessUtility(Node *parsetree,
}
break;
+ case T_TruncateStmt:
+ {
+
+ Relation rel;
+
+ PS_SET_STATUS(commandTag = "TRUNCATE");
+ CHECK_IF_ABORTED();
+
+ relname = ((TruncateStmt *) parsetree)->relName;
+ if (!allowSystemTableMods && IsSystemRelationName(relname)) {
+ elog(ERROR, "TRUNCATE cannot be used on system tables. '%s' is a system table",
+ relname);
+ }
+
+ rel = heap_openr(relname);
+ if (RelationIsValid(rel)) {
+ if (rel->rd_rel->relkind == RELKIND_SEQUENCE) {
+ elog(ERROR, "TRUNCATE cannot be used on sequences. '%s' is a sequence",
+ relname);
+ }
+ heap_close(rel);
+ }
+#ifndef NO_SECURITY
+ if (!pg_ownercheck(userName, relname, RELNAME)) {
+ elog(ERROR, "you do not own class \"%s\"", relname);
+ }
+#endif
+ TruncateRelation(((TruncateStmt *) parsetree)->relName);
+
+ }
+ break;
+
case T_CopyStmt:
{
CopyStmt *stmt = (CopyStmt *) parsetree;
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
index d625d25d5b..4120c24dd6 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.29 1999/09/09 16:25:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.30 1999/09/23 17:02:58 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -410,6 +410,8 @@ PortalNameIsSpecial(char *pname)
{
if (strcmp(pname, VACPNAME) == 0)
return true;
+ if (strcmp(pname, TRUNCPNAME) == 0)
+ return true;
return false;
}
diff --git a/src/bin/psql/psqlHelp.h b/src/bin/psql/psqlHelp.h
index 63540a7998..be2fb3fb0c 100644
--- a/src/bin/psql/psqlHelp.h
+++ b/src/bin/psql/psqlHelp.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: psqlHelp.h,v 1.72 1999/07/11 22:47:21 ishii Exp $
+ * $Id: psqlHelp.h,v 1.73 1999/09/23 17:03:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -23,11 +23,11 @@ static struct _helpStruct QL_HELP[] = {
"\
\tabort [transaction|work];"},
{"alter table",
- "add/rename attributes, rename tables",
+ "add/rename columns, rename tables",
"\
-\tALTER TABLE class_name [*] ADD COLUMN attr type\n\
-\tALTER TABLE class_name [*] RENAME [COLUMN] attr1 TO attr2\n\
-\tALTER TABLE class_name1 RENAME TO class_name2"},
+\tALTER TABLE tablename [*] ADD COLUMN colname type\n\
+\tALTER TABLE tablename [*] RENAME [COLUMN] colname1 TO colname2\n\
+\tALTER TABLE tablename1 RENAME TO tablename2"},
{"alter user",
"alter system information for a user",
"\
@@ -56,7 +56,7 @@ static struct _helpStruct QL_HELP[] = {
{"copy",
"copy data to and from a table",
"\
-\tCOPY [BINARY] class_name [WITH OIDS]\n\
+\tCOPY [BINARY] tablename [WITH OIDS]\n\
\tTO|FROM filename|STDIN|STDOUT [USING DELIMITERS 'delim'];"},
{"create",
"Please be more specific:",
@@ -93,8 +93,8 @@ static struct _helpStruct QL_HELP[] = {
{"create index",
"construct an index",
"\
-\tCREATE [UNIQUE] INDEX indexname ON class_name [USING access_method]\n\
-( attr1 [type_class1], ...attrN | funcname(attr1, ...) [type_class] );"},
+\tCREATE [UNIQUE] INDEX indexname ON tablename [USING access_method]\n\
+( colname1 [type_class1], ...colnameN | funcname(colname1, ...) [type_class] );"},
{"create operator",
"create a user-defined operator",
"\
@@ -124,16 +124,16 @@ static struct _helpStruct QL_HELP[] = {
{"create table",
"create a new table",
"\
-\tCREATE [TEMP] TABLE class_name\n\
-\t(attr1 type1 [DEFAULT expression] [NOT NULL], ...attrN\n\
+\tCREATE [TEMP] TABLE tablename\n\
+\t(colname1 type1 [DEFAULT expression] [NOT NULL], ...colnameN\n\
\t[[CONSTRAINT name] CHECK condition1, ...conditionN] )\n\
-\t[INHERITS (class_name1, ...class_nameN)\n\
+\t[INHERITS (tablename1, ...tablenameN)\n\
;"},
{"create trigger",
"create a new trigger",
"\
\tCREATE TRIGGER trigger_name AFTER|BEFORE event1 [OR event2 [OR event3] ]\n\
-\tON class_name FOR EACH ROW|STATEMENT\n\
+\tON tablename FOR EACH ROW|STATEMENT\n\
\tEXECUTE PROCEDURE func_name ([arguments])\n\
\n\
\teventX is one of INSERT, DELETE, UPDATE"},
@@ -159,8 +159,8 @@ static struct _helpStruct QL_HELP[] = {
"create a view",
"\
\tCREATE VIEW view_name AS\n\
-\tSELECT [DISTINCT [ON attrN]]\n\
-\texpr1 [AS attr1], ...exprN\n\
+\tSELECT [DISTINCT [ON colnameN]]\n\
+\texpr1 [AS colname1], ...exprN\n\
\t[FROM from_list]\n\
\t[WHERE qual]\n\
\t[GROUP BY group_list];"},
@@ -168,18 +168,18 @@ static struct _helpStruct QL_HELP[] = {
"set up a cursor",
"\
\tDECLARE cursorname [BINARY] CURSOR FOR\n\
-\tSELECT [DISTINCT [ON attrN]]\n\
-\texpr1 [AS attr1], ...exprN\n\
+\tSELECT [DISTINCT [ON colnameN]]\n\
+\texpr1 [AS colname1], ...exprN\n\
\t[FROM from_list]\n\
\t[WHERE qual]\n\
\t[GROUP BY group_list]\n\
\t[HAVING having_clause]\n\
-\t[ORDER BY attr1 [USING op1], ...attrN]\n\
+\t[ORDER BY colname1 [USING op1], ...colnameN]\n\
\t[ { UNION [ALL] | INTERSECT | EXCEPT } SELECT ...];"},
{"delete",
"delete tuples",
"\
-\tDELETE FROM class_name [WHERE qual];"},
+\tDELETE FROM tablename [WHERE qual];"},
{"drop",
"Please be more specific:",
"\
@@ -225,11 +225,11 @@ static struct _helpStruct QL_HELP[] = {
{"drop table",
"remove a table",
"\
-\tDROP TABLE class_name1, ...class_nameN;"},
+\tDROP TABLE tablename1, ...tablenameN;"},
{"drop trigger",
"remove a trigger",
"\
-\tDROP TRIGGER trigger_name ON class_name;"},
+\tDROP TRIGGER trigger_name ON tablename;"},
{"drop type",
"remove a user-defined base type",
"\
@@ -263,9 +263,9 @@ static struct _helpStruct QL_HELP[] = {
{"insert",
"insert tuples",
"\
-\tINSERT INTO class_name [(attr1, ...attrN)]\n\
+\tINSERT INTO tablename [(colname1, ...colnameN)]\n\
\tVALUES (expr1,..exprN) |\n\
-\tSELECT [DISTINCT [ON attrN]]\n\
+\tSELECT [DISTINCT [ON colnameN]]\n\
\texpr1, ...exprN\n\
\t[FROM from_clause]\n\
\t[WHERE qual]\n\
@@ -283,7 +283,7 @@ static struct _helpStruct QL_HELP[] = {
{"lock",
"exclusive lock a table inside a transaction",
"\
-\tLOCK [TABLE] class_name \n\
+\tLOCK [TABLE] tablename \n\
\t[IN [ROW|ACCESS] [SHARE|EXCLUSIVE] | [SHARE ROW EXCLUSIVE] MODE];"},
{"move",
"move an cursor position",
@@ -311,15 +311,15 @@ TIMEZONE|XACTISOLEVEL|CLIENT_ENCODING|SERVER_ENCODING"},
{"select",
"retrieve tuples",
"\
-\tSELECT [DISTINCT [ON attrN]] expr1 [AS attr1], ...exprN\n\
-\t[INTO [TEMP] [TABLE] class_name]\n\
+\tSELECT [DISTINCT [ON colnameN]] expr1 [AS colname1], ...exprN\n\
+\t[INTO [TEMP] [TABLE] tablename]\n\
\t[FROM from_list]\n\
\t[WHERE qual]\n\
\t[GROUP BY group_list]\n\
\t[HAVING having_clause]\n\
\t[ { UNION [ALL] | INTERSECT | EXCEPT } SELECT ...]\n\
-\t[ORDER BY attr1 [ASC|DESC] [USING op1], ...attrN ]\n\
-\t[FOR UPDATE [OF class_name...]]\n\
+\t[ORDER BY colname1 [ASC|DESC] [USING op1], ...colnameN ]\n\
+\t[FOR UPDATE [OF tablename...]]\n\
\t[LIMIT count [OFFSET|, count]];"},
{"set",
"set run-time environment",
@@ -346,10 +346,14 @@ TIMEZONE|XACTISOLEVEL|CLIENT_ENCODING|SERVER_ENCODING"},
"stop listening for notification on a condition name",
"\
\tUNLISTEN name|\"non-name string\"|\"*\""},
+ {"truncate",
+ "quickly removes all rows from a table",
+ "\
+\tTRUNCATE TABLE tablename"},
{"update",
"update tuples",
"\
-\tUPDATE class_name SET attr1 = expr1, ...attrN = exprN\n\
+\tUPDATE tablename SET colname1 = expr1, ...colnameN = exprN\n\
\t[FROM from_clause]\n\
\t[WHERE qual];"},
{"vacuum",
@@ -357,7 +361,7 @@ TIMEZONE|XACTISOLEVEL|CLIENT_ENCODING|SERVER_ENCODING"},
"\
\tVACUUM [VERBOSE] [ANALYZE] [table]\n\
\tor\n\
-\tVACUUM [VERBOSE] ANALYZE [table [(attr1, ...attrN)]];"},
+\tVACUUM [VERBOSE] ANALYZE [table [(colname1, ...colnameN)]];"},
{NULL, NULL, NULL} /* important to keep a NULL terminator
* here! */
};
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index b8e89d8c39..c8c130da96 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: heap.h,v 1.20 1999/07/15 23:03:41 momjian Exp $
+ * $Id: heap.h,v 1.21 1999/09/23 17:03:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -23,6 +23,7 @@ extern Oid heap_create_with_catalog(char *relname,
TupleDesc tupdesc, char relkind, bool istemp);
extern void heap_destroy_with_catalog(char *relname);
+extern void heap_truncate(char *relname);
extern void heap_destroy(Relation rel);
extern void InitNoNameRelList(void);
diff --git a/src/include/commands/creatinh.h b/src/include/commands/creatinh.h
index 60b5ae0d04..ffb111937a 100644
--- a/src/include/commands/creatinh.h
+++ b/src/include/commands/creatinh.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: creatinh.h,v 1.9 1999/02/13 23:21:18 momjian Exp $
+ * $Id: creatinh.h,v 1.10 1999/09/23 17:03:16 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -17,5 +17,6 @@
extern void DefineRelation(CreateStmt *stmt, char relkind);
extern void RemoveRelation(char *name);
+extern void TruncateRelation(char *name);
#endif /* CREATINH_H */
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 37f47c5306..da8a06af42 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: nodes.h,v 1.51 1999/08/16 02:17:39 tgl Exp $
+ * $Id: nodes.h,v 1.52 1999/09/23 17:03:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -151,6 +151,7 @@ typedef enum NodeTag
T_VersionStmt,
T_DefineStmt,
T_DestroyStmt,
+ T_TruncateStmt,
T_ExtendStmt,
T_FetchStmt,
T_IndexStmt,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 5a1d07ec39..66c5a9132a 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: parsenodes.h,v 1.78 1999/08/21 03:49:09 tgl Exp $
+ * $Id: parsenodes.h,v 1.79 1999/09/23 17:03:22 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -282,6 +282,16 @@ typedef struct DestroyStmt
bool sequence;
} DestroyStmt;
+/* ----------------------
+ * Truncate Table Statement
+ * ----------------------
+ */
+typedef struct TruncateStmt
+{
+ NodeTag type;
+ char *relName; /* relation to be truncated */
+} TruncateStmt;
+
/* ----------------------
* Extend Index Statement
* ----------------------
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index 195401e23f..b55230e136 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: bufmgr.h,v 1.29 1999/07/17 20:18:33 momjian Exp $
+ * $Id: bufmgr.h,v 1.30 1999/09/23 17:03:27 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -161,6 +161,7 @@ extern void BufferRefCountReset(int *refcountsave);
extern void BufferRefCountRestore(int *refcountsave);
extern int SetBufferWriteMode(int mode);
extern void SetBufferCommitInfoNeedsSave(Buffer buffer);
+extern int BlowawayRelationBuffers(Relation rel, BlockNumber block);
extern void UnlockBuffers(void);
extern void LockBuffer(Buffer buffer, int mode);
diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h
index c299f9a6d5..62d0880460 100644
--- a/src/include/utils/portal.h
+++ b/src/include/utils/portal.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: portal.h,v 1.18 1999/09/09 16:25:23 tgl Exp $
+ * $Id: portal.h,v 1.19 1999/09/23 17:03:33 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -60,6 +60,7 @@ struct PortalD
* Special portals (well, their names anyway)
*/
#define VACPNAME ""
+#define TRUNCPNAME ""
extern bool PortalNameIsSpecial(char *pname);
extern void AtEOXact_portals(void);
diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent
index 06802edbee..ddffb937b6 100755
--- a/src/tools/pgindent/pgindent
+++ b/src/tools/pgindent/pgindent
@@ -163,6 +163,7 @@ do
-TDepth \
-TDestReceiver \
-TDestroyStmt \
+-TTruncateStmt \
-TDestroydbStmt \
-TDisplay \
-TDl_info \