1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-30 06:01:21 +03:00

Add a new DestReceiver for printing tuples without catalog access.

If you create a DestReciver of type DestRemote and try to use it from
a replication connection that is not bound to a specific daabase, or
any other hypothetical type of backend that is not bound to a specific
database, it will fail because it doesn't have a pg_proc catalog to
look up properties of the types being printed.  In general, that's
an unavoidable problem, but we can hardwire the properties of a few
builtin types in order to support utility commands.  This new
DestReceiver of type DestRemoteSimple does just that.

Patch by me, reviewed by Michael Paquier.

Discussion: http://postgr.es/m/CA+TgmobNo4qz06wHEmy9DszAre3dYx-WNhHSCbU9SAwf+9Ft6g@mail.gmail.com
This commit is contained in:
Robert Haas
2017-01-24 16:53:56 -05:00
parent 7b4ac19982
commit a84069d935
5 changed files with 148 additions and 2 deletions

View File

@@ -28,6 +28,7 @@
#include "postgres.h"
#include "access/printsimple.h"
#include "access/printtup.h"
#include "access/xact.h"
#include "commands/copy.h"
@@ -76,6 +77,11 @@ static DestReceiver debugtupDR = {
DestDebug
};
static DestReceiver printsimpleDR = {
printsimple, printsimple_startup, donothingCleanup, donothingCleanup,
DestRemoteSimple
};
static DestReceiver spi_printtupDR = {
spi_printtup, spi_dest_startup, donothingCleanup, donothingCleanup,
DestSPI
@@ -108,6 +114,9 @@ CreateDestReceiver(CommandDest dest)
case DestRemoteExecute:
return printtup_create_DR(dest);
case DestRemoteSimple:
return &printsimpleDR;
case DestNone:
return &donothingDR;
@@ -151,6 +160,7 @@ EndCommand(const char *commandTag, CommandDest dest)
{
case DestRemote:
case DestRemoteExecute:
case DestRemoteSimple:
/*
* We assume the commandTag is plain ASCII and therefore requires
@@ -191,6 +201,7 @@ NullCommand(CommandDest dest)
{
case DestRemote:
case DestRemoteExecute:
case DestRemoteSimple:
/*
* tell the fe that we saw an empty query string. In protocols
@@ -233,6 +244,7 @@ ReadyForQuery(CommandDest dest)
{
case DestRemote:
case DestRemoteExecute:
case DestRemoteSimple:
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
{
StringInfoData buf;