From 31bcef5516beee095d5afe0fa0090183dbfdff9d Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Tue, 8 Dec 2020 16:43:23 +0300 Subject: [PATCH 2/7] 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 24f8b3e42e..15a781fcc3 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -920,6 +920,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. */ @@ -930,7 +931,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. */ @@ -939,7 +940,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 7357458db9..8b0d2b13ac 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -704,9 +704,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 1b05b39df4..ac0d7bf730 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -213,6 +213,7 @@ typedef struct WalRcvExecResult char *err; Tuplestorestate *tuplestore; TupleDesc tupledesc; + int ntuples; } WalRcvExecResult; /* WAL receiver - libpqwalreceiver hooks */ -- 2.19.0