mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Update 3.0 protocol support to match recent agreements about how to
handle multiple 'formats' for data I/O. Restructure CommandDest and DestReceiver stuff one more time (it's finally starting to look a bit clean though). Code now matches latest 3.0 protocol document as far as message formats go --- but there is no support for binary I/O yet.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.197 2003/04/25 02:28:22 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.198 2003/05/08 18:16:36 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -125,8 +125,8 @@ static int server_encoding;
|
||||
/*
|
||||
* Internal communications functions
|
||||
*/
|
||||
static void SendCopyBegin(bool binary);
|
||||
static void ReceiveCopyBegin(bool binary);
|
||||
static void SendCopyBegin(bool binary, int natts);
|
||||
static void ReceiveCopyBegin(bool binary, int natts);
|
||||
static void SendCopyEnd(bool binary);
|
||||
static void CopySendData(void *databuf, int datasize);
|
||||
static void CopySendString(const char *str);
|
||||
@@ -143,15 +143,20 @@ static void CopyDonePeek(int c, bool pickup);
|
||||
* in past protocol redesigns.
|
||||
*/
|
||||
static void
|
||||
SendCopyBegin(bool binary)
|
||||
SendCopyBegin(bool binary, int natts)
|
||||
{
|
||||
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
|
||||
{
|
||||
/* new way */
|
||||
StringInfoData buf;
|
||||
int16 format = (binary ? 1 : 0);
|
||||
int i;
|
||||
|
||||
pq_beginmessage(&buf, 'H');
|
||||
pq_sendbyte(&buf, binary ? 1 : 0);
|
||||
pq_sendbyte(&buf, format); /* overall format */
|
||||
pq_sendint(&buf, natts, 2);
|
||||
for (i = 0; i < natts; i++)
|
||||
pq_sendint(&buf, format, 2); /* per-column formats */
|
||||
pq_endmessage(&buf);
|
||||
copy_dest = COPY_NEW_FE;
|
||||
copy_msgbuf = makeStringInfo();
|
||||
@@ -179,15 +184,20 @@ SendCopyBegin(bool binary)
|
||||
}
|
||||
|
||||
static void
|
||||
ReceiveCopyBegin(bool binary)
|
||||
ReceiveCopyBegin(bool binary, int natts)
|
||||
{
|
||||
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
|
||||
{
|
||||
/* new way */
|
||||
StringInfoData buf;
|
||||
int16 format = (binary ? 1 : 0);
|
||||
int i;
|
||||
|
||||
pq_beginmessage(&buf, 'G');
|
||||
pq_sendbyte(&buf, binary ? 1 : 0);
|
||||
pq_sendbyte(&buf, format); /* overall format */
|
||||
pq_sendint(&buf, natts, 2);
|
||||
for (i = 0; i < natts; i++)
|
||||
pq_sendint(&buf, format, 2); /* per-column formats */
|
||||
pq_endmessage(&buf);
|
||||
copy_dest = COPY_NEW_FE;
|
||||
copy_msgbuf = makeStringInfo();
|
||||
@@ -682,7 +692,7 @@ DoCopy(const CopyStmt *stmt)
|
||||
if (pipe)
|
||||
{
|
||||
if (IsUnderPostmaster)
|
||||
ReceiveCopyBegin(binary);
|
||||
ReceiveCopyBegin(binary, length(attnumlist));
|
||||
else
|
||||
copy_file = stdin;
|
||||
}
|
||||
@@ -724,7 +734,7 @@ DoCopy(const CopyStmt *stmt)
|
||||
if (pipe)
|
||||
{
|
||||
if (IsUnderPostmaster)
|
||||
SendCopyBegin(binary);
|
||||
SendCopyBegin(binary, length(attnumlist));
|
||||
else
|
||||
copy_file = stdout;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.108 2003/05/06 20:26:26 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.109 2003/05/08 18:16:36 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -179,7 +179,7 @@ ExplainOneQuery(Query *query, ExplainStmt *stmt, TupOutputState *tstate)
|
||||
plan = planner(query, isCursor, cursorOptions);
|
||||
|
||||
/* Create a QueryDesc requesting no output */
|
||||
queryDesc = CreateQueryDesc(query, plan, None_Receiver, NULL, NULL,
|
||||
queryDesc = CreateQueryDesc(query, plan, None_Receiver, NULL,
|
||||
stmt->analyze);
|
||||
|
||||
ExplainOnePlan(queryDesc, stmt, tstate);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.15 2003/05/06 20:26:26 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.16 2003/05/08 18:16:36 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#include "commands/portalcmds.h"
|
||||
#include "executor/executor.h"
|
||||
#include "executor/tstoreReceiver.h"
|
||||
#include "optimizer/planner.h"
|
||||
#include "rewrite/rewriteHandler.h"
|
||||
#include "tcop/pquery.h"
|
||||
@@ -145,7 +144,6 @@ PerformPortalFetch(FetchStmt *stmt,
|
||||
DestReceiver *dest,
|
||||
char *completionTag)
|
||||
{
|
||||
DestReceiver *mydest = dest;
|
||||
Portal portal;
|
||||
long nprocessed;
|
||||
|
||||
@@ -168,35 +166,21 @@ PerformPortalFetch(FetchStmt *stmt,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adjust dest if needed. MOVE wants destination None.
|
||||
*
|
||||
* If fetching from a binary cursor and the requested destination is
|
||||
* Remote, change it to RemoteInternal. Note we do NOT change if the
|
||||
* destination is RemoteExecute --- so the Execute message's format
|
||||
* specification wins out over the cursor's type.
|
||||
*/
|
||||
/* Adjust dest if needed. MOVE wants destination None */
|
||||
if (stmt->ismove)
|
||||
mydest = CreateDestReceiver(None);
|
||||
else if (dest->mydest == Remote &&
|
||||
(portal->cursorOptions & CURSOR_OPT_BINARY))
|
||||
mydest = CreateDestReceiver(RemoteInternal);
|
||||
dest = None_Receiver;
|
||||
|
||||
/* Do it */
|
||||
nprocessed = PortalRunFetch(portal,
|
||||
stmt->direction,
|
||||
stmt->howMany,
|
||||
mydest);
|
||||
dest);
|
||||
|
||||
/* Return command status if wanted */
|
||||
if (completionTag)
|
||||
snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "%s %ld",
|
||||
stmt->ismove ? "MOVE" : "FETCH",
|
||||
nprocessed);
|
||||
|
||||
/* Clean up if we created a local destination */
|
||||
if (mydest != dest)
|
||||
(mydest->destroy) (mydest);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -329,8 +313,7 @@ PersistHoldablePortal(Portal portal)
|
||||
ExecutorRewind(queryDesc);
|
||||
|
||||
/* Change the destination to output to the tuplestore */
|
||||
queryDesc->dest = CreateTuplestoreDestReceiver(portal->holdStore,
|
||||
portal->holdContext);
|
||||
queryDesc->dest = CreateDestReceiver(Tuplestore, portal);
|
||||
|
||||
/* Fetch the result set into the tuplestore */
|
||||
ExecutorRun(queryDesc, ForwardScanDirection, 0L);
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
* Copyright (c) 2002-2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.17 2003/05/06 21:51:41 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.18 2003/05/08 18:16:36 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -528,7 +528,7 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate)
|
||||
}
|
||||
|
||||
/* Create a QueryDesc requesting no output */
|
||||
qdesc = CreateQueryDesc(query, plan, None_Receiver, NULL,
|
||||
qdesc = CreateQueryDesc(query, plan, None_Receiver,
|
||||
paramLI, stmt->analyze);
|
||||
|
||||
ExplainOnePlan(qdesc, stmt, tstate);
|
||||
|
||||
Reference in New Issue
Block a user