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 \