Avoid performing encoding conversion on command tag strings during EndCommand.
authorTom Lane <[email protected]>
Sat, 30 Jan 2010 20:10:16 +0000 (20:10 +0000)
committerTom Lane <[email protected]>
Sat, 30 Jan 2010 20:10:16 +0000 (20:10 +0000)
Since all current and foreseeable future command tags will be pure ASCII,
there is no need to do conversion on them.  This saves a few cycles and also
avoids polluting otherwise-pristine subtransaction memory contexts, which
is the cause of the backend memory leak exhibited in bug #5302.  (Someday
we'll probably want to have a better method of determining whether
subtransaction contexts need to be kept around, but today is not that day.)

Backpatch to 8.0.  The cycle-shaving aspect of this would work in 7.4
too, but without subtransactions the memory-leak aspect doesn't apply,
so it doesn't seem worth touching 7.4.

src/backend/tcop/dest.c

index aed37bace39e3a61e8f50aa5b0fc1cc82d059530..00578c7b38da62677175bf22d6545247b0e70007 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/tcop/dest.c,v 1.67 2005/11/03 17:11:38 alvherre Exp $
+ *   $PostgreSQL: pgsql/src/backend/tcop/dest.c,v 1.67.2.1 2010/01/30 20:10:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -141,7 +141,11 @@ EndCommand(const char *commandTag, CommandDest dest)
    {
        case DestRemote:
        case DestRemoteExecute:
-           pq_puttextmessage('C', commandTag);
+           /*
+            * We assume the commandTag is plain ASCII and therefore
+            * requires no encoding conversion.
+            */
+           pq_putmessage('C', commandTag, strlen(commandTag) + 1);
            break;
 
        case DestNone:
@@ -179,7 +183,7 @@ NullCommand(CommandDest dest)
            if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
                pq_putemptymessage('I');
            else
-               pq_puttextmessage('I', "");
+               pq_putmessage('I', "", 1);
            break;
 
        case DestNone: