Index: src/backend/access/transam/xact.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xact.c,v
retrieving revision 1.234
diff -c -r1.234 xact.c
*** src/backend/access/transam/xact.c	9 Feb 2007 03:35:33 -0000	1.234
--- src/backend/access/transam/xact.c	26 Feb 2007 22:04:44 -0000
***************
*** 58,63 ****
--- 58,66 ----
  int			CommitDelay = 0;	/* precommit delay in microseconds */
  int			CommitSiblings = 5; /* # concurrent xacts needed to sleep */
  
+ bool		DefaultXactCommitWait = true;
+ bool		XactCommitWait = true;
+ 
  
  /*
   *	transaction states - transaction state from server perspective
***************
*** 789,795 ****
  		 * Note: if we generated a commit record above, MyXactMadeXLogEntry
  		 * will certainly be set now.
  		 */
! 		if (MyXactMadeXLogEntry)
  		{
  			/*
  			 * Sleep before flush! So we can flush more than one commit
--- 792,798 ----
  		 * Note: if we generated a commit record above, MyXactMadeXLogEntry
  		 * will certainly be set now.
  		 */
! 		if (MyXactMadeXLogEntry && XactCommitWait)
  		{
  			/*
  			 * Sleep before flush! So we can flush more than one commit
Index: src/backend/parser/gram.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.580
diff -c -r2.580 gram.y
*** src/backend/parser/gram.y	20 Feb 2007 17:32:16 -0000	2.580
--- src/backend/parser/gram.y	26 Feb 2007 22:05:01 -0000
***************
*** 4813,4818 ****
--- 4813,4819 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_ROLLBACK;
  					n->options = NIL;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| BEGIN_P opt_transaction transaction_mode_list_or_empty
***************
*** 4820,4825 ****
--- 4821,4827 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_BEGIN;
  					n->options = $3;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| START TRANSACTION transaction_mode_list_or_empty
***************
*** 4827,4832 ****
--- 4829,4835 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_START;
  					n->options = $3;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| COMMIT opt_transaction
***************
*** 4834,4839 ****
--- 4837,4851 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_COMMIT;
  					n->options = NIL;
+ 					n->wait = true;
+ 					$$ = (Node *)n;
+ 				}
+ 			| COMMIT opt_transaction_write NOWAIT opt_transaction_immed
+ 				{
+ 					TransactionStmt *n = makeNode(TransactionStmt);
+ 					n->kind = TRANS_STMT_COMMIT;
+ 					n->options = NIL;
+ 					n->wait = false;
  					$$ = (Node *)n;
  				}
  			| END_P opt_transaction
***************
*** 4841,4846 ****
--- 4853,4859 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_COMMIT;
  					n->options = NIL;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| ROLLBACK opt_transaction
***************
*** 4848,4853 ****
--- 4861,4867 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_ROLLBACK;
  					n->options = NIL;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| SAVEPOINT ColId
***************
*** 4856,4861 ****
--- 4870,4876 ----
  					n->kind = TRANS_STMT_SAVEPOINT;
  					n->options = list_make1(makeDefElem("savepoint_name",
  														(Node *)makeString($2)));
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| RELEASE SAVEPOINT ColId
***************
*** 4864,4869 ****
--- 4879,4885 ----
  					n->kind = TRANS_STMT_RELEASE;
  					n->options = list_make1(makeDefElem("savepoint_name",
  														(Node *)makeString($3)));
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| RELEASE ColId
***************
*** 4872,4877 ****
--- 4888,4894 ----
  					n->kind = TRANS_STMT_RELEASE;
  					n->options = list_make1(makeDefElem("savepoint_name",
  														(Node *)makeString($2)));
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| ROLLBACK opt_transaction TO SAVEPOINT ColId
***************
*** 4880,4885 ****
--- 4897,4903 ----
  					n->kind = TRANS_STMT_ROLLBACK_TO;
  					n->options = list_make1(makeDefElem("savepoint_name",
  														(Node *)makeString($5)));
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| ROLLBACK opt_transaction TO ColId
***************
*** 4888,4893 ****
--- 4906,4912 ----
  					n->kind = TRANS_STMT_ROLLBACK_TO;
  					n->options = list_make1(makeDefElem("savepoint_name",
  														(Node *)makeString($4)));
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| PREPARE TRANSACTION Sconst
***************
*** 4895,4900 ****
--- 4914,4920 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_PREPARE;
  					n->gid = $3;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| COMMIT PREPARED Sconst
***************
*** 4902,4907 ****
--- 4922,4928 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_COMMIT_PREPARED;
  					n->gid = $3;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  			| ROLLBACK PREPARED Sconst
***************
*** 4909,4914 ****
--- 4930,4936 ----
  					TransactionStmt *n = makeNode(TransactionStmt);
  					n->kind = TRANS_STMT_ROLLBACK_PREPARED;
  					n->gid = $3;
+ 					n->wait = true;
  					$$ = (Node *)n;
  				}
  		;
***************
*** 4918,4923 ****
--- 4940,4955 ----
  			| /*EMPTY*/								{}
  		;
  
+ opt_transaction_write:
+ 			   WRITE								{}
+ 			| /* EMPTY */							{}
+ 		;
+ 
+ opt_transaction_immed:
+ 				IMMEDIATE							{}
+ 			| /* EMPTY */							{}
+ 		;
+ 
  transaction_mode_item:
  			ISOLATION LEVEL iso_level
  					{ $$ = makeDefElem("transaction_isolation",
Index: src/backend/tcop/utility.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/tcop/utility.c,v
retrieving revision 1.273
diff -c -r1.273 utility.c
*** src/backend/tcop/utility.c	20 Feb 2007 17:32:16 -0000	1.273
--- src/backend/tcop/utility.c	26 Feb 2007 22:05:12 -0000
***************
*** 432,437 ****
--- 432,444 ----
  							if (completionTag)
  								strcpy(completionTag, "ROLLBACK");
  						}
+ 						else
+ 						{
+ 							if (stmt->wait)
+ 								XactCommitWait = DefaultXactCommitWait;
+ 							else
+ 								XactCommitWait = false;
+ 						}
  						break;
  
  					case TRANS_STMT_PREPARE:
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.377
diff -c -r1.377 guc.c
*** src/backend/utils/misc/guc.c	23 Feb 2007 21:36:18 -0000	1.377
--- src/backend/utils/misc/guc.c	26 Feb 2007 22:05:21 -0000
***************
*** 871,876 ****
--- 871,884 ----
  		true, assign_phony_autocommit, NULL
  	},
  	{
+ 		{"commit_wait_default", PGC_USERSET, WAL_SETTINGS,
+ 			gettext_noop("Sets the default of wait-for-commit."),
+ 			NULL
+ 		},
+ 		&DefaultXactCommitWait,
+ 		true, NULL, NULL
+ 	},
+ 	{
  		{"default_transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT,
  			gettext_noop("Sets the default read-only status of new transactions."),
  			NULL
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.209
diff -c -r1.209 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample	16 Feb 2007 17:07:00 -0000	1.209
--- src/backend/utils/misc/postgresql.conf.sample	26 Feb 2007 22:05:22 -0000
***************
*** 161,166 ****
--- 161,167 ----
  #full_page_writes = on			# recover from partial page writes
  #wal_buffers = 64kB			# min 32kB
  					# (change requires restart)
+ #commit_wait_default = on		# default wait-at-commit
  #commit_delay = 0			# range 0-100000, in microseconds
  #commit_siblings = 5			# range 1-1000
  
Index: src/include/access/xact.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/access/xact.h,v
retrieving revision 1.84
diff -c -r1.84 xact.h
*** src/include/access/xact.h	5 Jan 2007 22:19:51 -0000	1.84
--- src/include/access/xact.h	26 Feb 2007 22:05:28 -0000
***************
*** 41,46 ****
--- 41,49 ----
  extern bool DefaultXactReadOnly;
  extern bool XactReadOnly;
  
+ extern bool DefaultXactCommitWait;
+ extern bool XactCommitWait;
+ 
  /*
   *	start- and end-of-transaction callbacks for dynamically loaded modules
   */
Index: src/include/nodes/parsenodes.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v
retrieving revision 1.341
diff -c -r1.341 parsenodes.h
*** src/include/nodes/parsenodes.h	20 Feb 2007 17:32:17 -0000	1.341
--- src/include/nodes/parsenodes.h	26 Feb 2007 22:05:30 -0000
***************
*** 1689,1694 ****
--- 1689,1695 ----
  	NodeTag		type;
  	TransactionStmtKind kind;	/* see above */
  	List	   *options;		/* for BEGIN/START and savepoint commands */
+ 	bool		wait;		/* explicit NOWAIT or use default wait-at-commit */
  	char	   *gid;			/* for two-phase-commit related commands */
  } TransactionStmt;
  
