From e6c50bfe35f96d29c8bc2ec3b57c92dd5376a46a Mon Sep 17 00:00:00 2001 From: Euler Taveira Date: Fri, 9 Mar 2018 17:37:36 +0000 Subject: [PATCH 2/8] Store number of tuples in WalRcvExecResult It seems to be a useful information while allocating memory for queries that returns more than one row. It reduces memory allocation for initial table synchronization. --- src/backend/replication/libpqwalreceiver/libpqwalreceiver.c | 5 +++-- src/backend/replication/logical/tablesync.c | 5 ++--- src/include/replication/walreceiver.h | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 545d2fcd05..1a32dbd2e6 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -878,6 +878,7 @@ libpqrcv_processTuples(PGresult *pgres, WalRcvExecResult *walres, errdetail("Expected %d fields, got %d fields.", nRetTypes, nfields))); + walres->ntuples = PQntuples(pgres); walres->tuplestore = tuplestore_begin_heap(true, false, work_mem); /* Create tuple descriptor corresponding to expected result. */ @@ -888,7 +889,7 @@ libpqrcv_processTuples(PGresult *pgres, WalRcvExecResult *walres, attinmeta = TupleDescGetAttInMetadata(walres->tupledesc); /* No point in doing more here if there were no tuples returned. */ - if (PQntuples(pgres) == 0) + if (walres->ntuples == 0) return; /* Create temporary context for local allocations. */ @@ -897,7 +898,7 @@ libpqrcv_processTuples(PGresult *pgres, WalRcvExecResult *walres, ALLOCSET_DEFAULT_SIZES); /* Process returned rows. */ - for (tupn = 0; tupn < PQntuples(pgres); tupn++) + for (tupn = 0; tupn < walres->ntuples; tupn++) { char *cstrs[MaxTupleAttributeNumber]; diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index b437e093b1..205f2a4979 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -702,9 +702,8 @@ fetch_remote_table_info(char *nspname, char *relname, (errmsg("could not fetch table info for table \"%s.%s\": %s", nspname, relname, res->err))); - /* We don't know the number of rows coming, so allocate enough space. */ - lrel->attnames = palloc0(MaxTupleAttributeNumber * sizeof(char *)); - lrel->atttyps = palloc0(MaxTupleAttributeNumber * sizeof(Oid)); + lrel->attnames = palloc0(res->ntuples * sizeof(char *)); + lrel->atttyps = palloc0(res->ntuples * sizeof(Oid)); lrel->attkeys = NULL; natt = 0; diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index e12a934966..0d32d598d8 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -196,6 +196,7 @@ typedef struct WalRcvExecResult char *err; Tuplestorestate *tuplestore; TupleDesc tupledesc; + int ntuples; } WalRcvExecResult; /* libpqwalreceiver hooks */ -- 2.11.0