diff options
Diffstat (limited to 'src/backend/commands')
| -rw-r--r-- | src/backend/commands/tablecmds.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 04126f60f4c..ff27b7371f4 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@   *   *   * IDENTIFICATION - *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.332.2.1 2010/07/23 20:04:09 petere Exp $ + *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.332.2.2 2010/07/29 19:23:28 tgl Exp $   *   *-------------------------------------------------------------------------   */ @@ -7051,11 +7051,20 @@ static void  copy_relation_data(SMgrRelation src, SMgrRelation dst,  				   ForkNumber forkNum, bool istemp)  { +	char	   *buf; +	Page		page;  	bool		use_wal;  	BlockNumber nblocks;  	BlockNumber blkno; -	char		buf[BLCKSZ]; -	Page		page = (Page) buf; + +	/* +	 * palloc the buffer so that it's MAXALIGN'd.  If it were just a local +	 * char[] array, the compiler might align it on any byte boundary, which +	 * can seriously hurt transfer speed to and from the kernel; not to +	 * mention possibly making log_newpage's accesses to the page header fail. +	 */ +	buf = (char *) palloc(BLCKSZ); +	page = (Page) buf;  	/*  	 * We need to log the copied data in WAL iff WAL archiving/streaming is @@ -7084,6 +7093,8 @@ copy_relation_data(SMgrRelation src, SMgrRelation dst,  		smgrextend(dst, forkNum, blkno, buf, true);  	} +	pfree(buf); +  	/*  	 * If the rel isn't temp, we must fsync it down to disk before it's safe  	 * to commit the transaction.  (For a temp rel we don't care since the rel  | 
