On Sat, 2007-03-03 at 10:57 -0800, Joe Conway wrote:
> I have used pfree(var.data) combined with initStringInfo(&var) in a few 
> places (e.g. in tablefunc.c).

Thanks, fixed. I also did a bit more searching and found some more
places where resetStringInfo() could be used to replace the previous
custom coding. Patch attached and applied.

-Neil

Index: contrib/tablefunc/tablefunc.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/contrib/tablefunc/tablefunc.c,v
retrieving revision 1.46
diff -c -p -r1.46 tablefunc.c
*** contrib/tablefunc/tablefunc.c	5 Jan 2007 22:19:18 -0000	1.46
--- contrib/tablefunc/tablefunc.c	3 Mar 2007 19:23:28 -0000
*************** build_tuplestore_recursively(char *key_f
*** 1378,1392 ****
  								   "incompatible.")));
  		}
  
  		for (i = 0; i < proc; i++)
  		{
- 			/* start a new branch */
- 			initStringInfo(&branchstr);
- 
- 			/* need these to check for recursion */
- 			initStringInfo(&chk_branchstr);
- 			initStringInfo(&chk_current_key);
- 
  			/* initialize branch for this pass */
  			appendStringInfo(&branchstr, "%s", branch);
  			appendStringInfo(&chk_branchstr, "%s%s%s", branch_delim, branch, branch_delim);
--- 1378,1389 ----
  								   "incompatible.")));
  		}
  
+ 		initStringInfo(&branchstr);
+ 		initStringInfo(&chk_branchstr);
+ 		initStringInfo(&chk_current_key);
+ 
  		for (i = 0; i < proc; i++)
  		{
  			/* initialize branch for this pass */
  			appendStringInfo(&branchstr, "%s", branch);
  			appendStringInfo(&chk_branchstr, "%s%s%s", branch_delim, branch, branch_delim);
*************** build_tuplestore_recursively(char *key_f
*** 1459,1468 ****
  													tupstore);
  
  			/* reset branch for next pass */
! 			xpfree(branchstr.data);
! 			xpfree(chk_branchstr.data);
! 			xpfree(chk_current_key.data);
  		}
  	}
  
  	return tupstore;
--- 1456,1469 ----
  													tupstore);
  
  			/* reset branch for next pass */
! 			resetStringInfo(&branchstr);
! 			resetStringInfo(&chk_branchstr);
! 			resetStringInfo(&chk_current_key);
  		}
+ 
+ 		xpfree(branchstr.data);
+ 		xpfree(chk_branchstr.data);
+ 		xpfree(chk_current_key.data);
  	}
  
  	return tupstore;
Index: src/backend/catalog/pg_shdepend.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/catalog/pg_shdepend.c,v
retrieving revision 1.16
diff -c -p -r1.16 pg_shdepend.c
*** src/backend/catalog/pg_shdepend.c	5 Jan 2007 22:19:25 -0000	1.16
--- src/backend/catalog/pg_shdepend.c	3 Mar 2007 19:08:53 -0000
*************** checkSharedDependencies(Oid classId, Oid
*** 588,595 ****
  		 * Note: we don't ever suppress per-database totals, which should be
  		 * OK as long as there aren't too many databases ...
  		 */
! 		descs.len = 0;			/* reset to empty */
! 		descs.data[0] = '\0';
  
  		if (numLocalDeps > 0)
  		{
--- 588,594 ----
  		 * Note: we don't ever suppress per-database totals, which should be
  		 * OK as long as there aren't too many databases ...
  		 */
! 		resetStringInfo(&descs);
  
  		if (numLocalDeps > 0)
  		{
Index: src/backend/commands/copy.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/commands/copy.c,v
retrieving revision 1.276
diff -c -p -r1.276 copy.c
*** src/backend/commands/copy.c	20 Feb 2007 17:32:13 -0000	1.276
--- src/backend/commands/copy.c	3 Mar 2007 19:16:59 -0000
*************** CopySendEndOfRow(CopyState cstate)
*** 466,474 ****
  			break;
  	}
  
! 	/* Reset fe_msgbuf to empty */
! 	fe_msgbuf->len = 0;
! 	fe_msgbuf->data[0] = '\0';
  }
  
  /*
--- 466,472 ----
  			break;
  	}
  
! 	resetStringInfo(fe_msgbuf);
  }
  
  /*
*************** CopyReadLine(CopyState cstate)
*** 2193,2201 ****
  {
  	bool		result;
  
! 	/* Reset line_buf to empty */
! 	cstate->line_buf.len = 0;
! 	cstate->line_buf.data[0] = '\0';
  
  	/* Mark that encoding conversion hasn't occurred yet */
  	cstate->line_buf_converted = false;
--- 2191,2197 ----
  {
  	bool		result;
  
! 	resetStringInfo(&cstate->line_buf);
  
  	/* Mark that encoding conversion hasn't occurred yet */
  	cstate->line_buf_converted = false;
*************** CopyReadLine(CopyState cstate)
*** 2262,2269 ****
  		if (cvt != cstate->line_buf.data)
  		{
  			/* transfer converted data back to line_buf */
! 			cstate->line_buf.len = 0;
! 			cstate->line_buf.data[0] = '\0';
  			appendBinaryStringInfo(&cstate->line_buf, cvt, strlen(cvt));
  			pfree(cvt);
  		}
--- 2258,2264 ----
  		if (cvt != cstate->line_buf.data)
  		{
  			/* transfer converted data back to line_buf */
! 			resetStringInfo(&cstate->line_buf);
  			appendBinaryStringInfo(&cstate->line_buf, cvt, strlen(cvt));
  			pfree(cvt);
  		}
*************** CopyReadAttributesText(CopyState cstate,
*** 2686,2694 ****
  		return 0;
  	}
  
! 	/* reset attribute_buf to empty */
! 	cstate->attribute_buf.len = 0;
! 	cstate->attribute_buf.data[0] = '\0';
  
  	/*
  	 * The de-escaped attributes will certainly not be longer than the input
--- 2681,2687 ----
  		return 0;
  	}
  
! 	resetStringInfo(&cstate->attribute_buf);
  
  	/*
  	 * The de-escaped attributes will certainly not be longer than the input
*************** CopyReadAttributesCSV(CopyState cstate, 
*** 2886,2894 ****
  		return 0;
  	}
  
! 	/* reset attribute_buf to empty */
! 	cstate->attribute_buf.len = 0;
! 	cstate->attribute_buf.data[0] = '\0';
  
  	/*
  	 * The de-escaped attributes will certainly not be longer than the input
--- 2879,2885 ----
  		return 0;
  	}
  
! 	resetStringInfo(&cstate->attribute_buf);
  
  	/*
  	 * The de-escaped attributes will certainly not be longer than the input
*************** CopyReadBinaryAttribute(CopyState cstate
*** 3040,3051 ****
  				 errmsg("invalid field size")));
  
  	/* reset attribute_buf to empty, and load raw data in it */
! 	cstate->attribute_buf.len = 0;
! 	cstate->attribute_buf.data[0] = '\0';
! 	cstate->attribute_buf.cursor = 0;
  
  	enlargeStringInfo(&cstate->attribute_buf, fld_size);
- 
  	if (CopyGetData(cstate, cstate->attribute_buf.data,
  					fld_size, fld_size) != fld_size)
  		ereport(ERROR,
--- 3031,3039 ----
  				 errmsg("invalid field size")));
  
  	/* reset attribute_buf to empty, and load raw data in it */
! 	resetStringInfo(&cstate->attribute_buf);
  
  	enlargeStringInfo(&cstate->attribute_buf, fld_size);
  	if (CopyGetData(cstate, cstate->attribute_buf.data,
  					fld_size, fld_size) != fld_size)
  		ereport(ERROR,
Index: src/backend/lib/stringinfo.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/lib/stringinfo.c,v
retrieving revision 1.44
diff -c -p -r1.44 stringinfo.c
*** src/backend/lib/stringinfo.c	5 Jan 2007 22:19:29 -0000	1.44
--- src/backend/lib/stringinfo.c	3 Mar 2007 17:01:46 -0000
*************** initStringInfo(StringInfo str)
*** 49,56 ****
  
  	str->data = (char *) palloc(size);
  	str->maxlen = size;
! 	str->len = 0;
  	str->data[0] = '\0';
  	str->cursor = 0;
  }
  
--- 49,68 ----
  
  	str->data = (char *) palloc(size);
  	str->maxlen = size;
! 	resetStringInfo(str);
! }
! 
! /*
!  * resetStringInfo
!  *
!  * Reset the StringInfo: the data buffer remains valid, but its
!  * previous content, if any, is cleared.
!  */
! void
! resetStringInfo(StringInfo str)
! {
  	str->data[0] = '\0';
+ 	str->len = 0;
  	str->cursor = 0;
  }
  
Index: src/backend/libpq/pqcomm.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/libpq/pqcomm.c,v
retrieving revision 1.190
diff -c -p -r1.190 pqcomm.c
*** src/backend/libpq/pqcomm.c	13 Feb 2007 19:18:53 -0000	1.190
--- src/backend/libpq/pqcomm.c	3 Mar 2007 19:05:07 -0000
*************** pq_getstring(StringInfo s)
*** 860,869 ****
  {
  	int			i;
  
! 	/* Reset string to empty */
! 	s->len = 0;
! 	s->data[0] = '\0';
! 	s->cursor = 0;
  
  	/* Read until we get the terminating '\0' */
  	for (;;)
--- 860,866 ----
  {
  	int			i;
  
! 	resetStringInfo(s);
  
  	/* Read until we get the terminating '\0' */
  	for (;;)
*************** pq_getmessage(StringInfo s, int maxlen)
*** 915,924 ****
  {
  	int32		len;
  
! 	/* Reset message buffer to empty */
! 	s->len = 0;
! 	s->data[0] = '\0';
! 	s->cursor = 0;
  
  	/* Read message length word */
  	if (pq_getbytes((char *) &len, 4) == EOF)
--- 912,918 ----
  {
  	int32		len;
  
! 	resetStringInfo(s);
  
  	/* Read message length word */
  	if (pq_getbytes((char *) &len, 4) == EOF)
Index: src/backend/storage/lmgr/deadlock.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/storage/lmgr/deadlock.c,v
retrieving revision 1.45
diff -c -p -r1.45 deadlock.c
*** src/backend/storage/lmgr/deadlock.c	3 Mar 2007 18:46:40 -0000	1.45
--- src/backend/storage/lmgr/deadlock.c	3 Mar 2007 19:09:53 -0000
*************** DeadLockReport(void)
*** 933,940 ****
  			appendStringInfoChar(&buf, '\n');
  
  		/* reset buf2 to hold next object description */
! 		buf2.len = 0;
! 		buf2.data[0] = '\0';
  
  		DescribeLockTag(&buf2, &info->locktag);
  
--- 933,939 ----
  			appendStringInfoChar(&buf, '\n');
  
  		/* reset buf2 to hold next object description */
! 		resetStringInfo(&buf2);
  
  		DescribeLockTag(&buf2, &info->locktag);
  
Index: src/backend/tcop/fastpath.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/tcop/fastpath.c,v
retrieving revision 1.95
diff -c -p -r1.95 fastpath.c
*** src/backend/tcop/fastpath.c	5 Jan 2007 22:19:39 -0000	1.95
--- src/backend/tcop/fastpath.c	3 Mar 2007 17:04:53 -0000
*************** parse_fcall_arguments(StringInfo msgBuf,
*** 480,489 ****
  						 argsize)));
  
  			/* Reset abuf to empty, and insert raw data into it */
! 			abuf.len = 0;
! 			abuf.data[0] = '\0';
! 			abuf.cursor = 0;
! 
  			appendBinaryStringInfo(&abuf,
  								   pq_getmsgbytes(msgBuf, argsize),
  								   argsize);
--- 480,486 ----
  						 argsize)));
  
  			/* Reset abuf to empty, and insert raw data into it */
! 			resetStringInfo(&abuf);
  			appendBinaryStringInfo(&abuf,
  								   pq_getmsgbytes(msgBuf, argsize),
  								   argsize);
*************** parse_fcall_arguments_20(StringInfo msgB
*** 613,622 ****
  						 argsize)));
  
  		/* Reset abuf to empty, and insert raw data into it */
! 		abuf.len = 0;
! 		abuf.data[0] = '\0';
! 		abuf.cursor = 0;
! 
  		appendBinaryStringInfo(&abuf,
  							   pq_getmsgbytes(msgBuf, argsize),
  							   argsize);
--- 610,616 ----
  						 argsize)));
  
  		/* Reset abuf to empty, and insert raw data into it */
! 		resetStringInfo(&abuf);
  		appendBinaryStringInfo(&abuf,
  							   pq_getmsgbytes(msgBuf, argsize),
  							   argsize);
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.526
diff -c -p -r1.526 postgres.c
*** src/backend/tcop/postgres.c	2 Mar 2007 23:37:22 -0000	1.526
--- src/backend/tcop/postgres.c	3 Mar 2007 19:04:57 -0000
*************** InteractiveBackend(StringInfo inBuf)
*** 205,214 ****
  	printf("backend> ");
  	fflush(stdout);
  
! 	/* Reset inBuf to empty */
! 	inBuf->len = 0;
! 	inBuf->data[0] = '\0';
! 	inBuf->cursor = 0;
  
  	for (;;)
  	{
--- 205,211 ----
  	printf("backend> ");
  	fflush(stdout);
  
! 	resetStringInfo(inBuf);
  
  	for (;;)
  	{
Index: src/backend/utils/adt/rowtypes.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/utils/adt/rowtypes.c,v
retrieving revision 1.18
diff -c -p -r1.18 rowtypes.c
*** src/backend/utils/adt/rowtypes.c	5 Jan 2007 22:19:42 -0000	1.18
--- src/backend/utils/adt/rowtypes.c	3 Mar 2007 17:01:06 -0000
*************** record_in(PG_FUNCTION_ARGS)
*** 168,175 ****
  			/* Extract string for this column */
  			bool		inquote = false;
  
! 			buf.len = 0;
! 			buf.data[0] = '\0';
  			while (inquote || !(*ptr == ',' || *ptr == ')'))
  			{
  				char		ch = *ptr++;
--- 168,174 ----
  			/* Extract string for this column */
  			bool		inquote = false;
  
! 			resetStringInfo(&buf);
  			while (inquote || !(*ptr == ',' || *ptr == ')'))
  			{
  				char		ch = *ptr++;
Index: src/backend/utils/adt/xml.c
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/backend/utils/adt/xml.c,v
retrieving revision 1.33
diff -c -p -r1.33 xml.c
*** src/backend/utils/adt/xml.c	1 Mar 2007 14:52:04 -0000	1.33
--- src/backend/utils/adt/xml.c	3 Mar 2007 19:06:03 -0000
*************** xml_init(void)
*** 835,842 ****
  	else
  	{
  		/* Reset pre-existing buffer to empty */
! 		xml_err_buf->data[0] = '\0';
! 		xml_err_buf->len = 0;
  	}
  	/* Now that xml_err_buf exists, safe to call xml_errorHandler */
  	xmlSetGenericErrorFunc(NULL, xml_errorHandler);
--- 835,841 ----
  	else
  	{
  		/* Reset pre-existing buffer to empty */
! 		resetStringInfo(xml_err_buf);
  	}
  	/* Now that xml_err_buf exists, safe to call xml_errorHandler */
  	xmlSetGenericErrorFunc(NULL, xml_errorHandler);
*************** xml_ereport(int level, int sqlcode,
*** 1197,1204 ****
  	if (xml_err_buf->len > 0)
  	{
  		detail = pstrdup(xml_err_buf->data);
! 		xml_err_buf->data[0] = '\0';
! 		xml_err_buf->len = 0;
  	}
  	else
  		detail = NULL;
--- 1196,1202 ----
  	if (xml_err_buf->len > 0)
  	{
  		detail = pstrdup(xml_err_buf->data);
! 		resetStringInfo(xml_err_buf);
  	}
  	else
  		detail = NULL;
Index: src/include/lib/stringinfo.h
===================================================================
RCS file: /home/neilc/postgres/cvs_root/pgsql/src/include/lib/stringinfo.h,v
retrieving revision 1.33
diff -c -p -r1.33 stringinfo.h
*** src/include/lib/stringinfo.h	5 Jan 2007 22:19:55 -0000	1.33
--- src/include/lib/stringinfo.h	3 Mar 2007 17:01:46 -0000
*************** extern StringInfo makeStringInfo(void);
*** 79,84 ****
--- 79,91 ----
  extern void initStringInfo(StringInfo str);
  
  /*------------------------
+  * resetStringInfo
+  * Clears the current content of the StringInfo, if any. The
+  * StringInfo remains valid.
+  */
+ extern void resetStringInfo(StringInfo str);
+ 
+ /*------------------------
   * appendStringInfo
   * Format text data under the control of fmt (an sprintf-style format string)
   * and append it to whatever is already in str.  More space is allocated
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to