OSDN Git Service

Avoid performing encoding conversion on command tag strings during EndCommand.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 30 Jan 2010 20:09:53 +0000 (20:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 30 Jan 2010 20:09:53 +0000 (20:09 +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 ac0dc5e..4488f12 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.76 2010/01/02 16:57:52 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/tcop/dest.c,v 1.77 2010/01/30 20:09:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -142,7 +142,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:
@@ -183,7 +187,7 @@ NullCommand(CommandDest dest)
                        if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
                                pq_putemptymessage('I');
                        else
-                               pq_puttextmessage('I', "");
+                               pq_putmessage('I', "", 1);
                        break;
 
                case DestNone: