blob: f13d27e0b4408c24fbf2bcdf05bc0a8d8b88c36a [file]
/*-------------------------------------------------------------------------
*
* cdbrelsize.c
*
* Portions Copyright (c) 2006-2008, Greenplum inc
* Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
*
*
* IDENTIFICATION
* src/backend/cdb/cdbrelsize.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "utils/lsyscache.h"
#include "utils/relcache.h"
#include "utils/syscache.h"
#include "catalog/catalog.h"
#include "cdb/cdbvars.h"
#include "miscadmin.h"
#include "cdb/cdbdisp_query.h"
#include "cdb/cdbdispatchresult.h"
#include "libpq-fe.h"
#include "lib/stringinfo.h"
#include "utils/lsyscache.h"
#include "utils/builtins.h"
#include "utils/rel.h"
#include "cdb/cdbrelsize.h"
/*
* Get the max size of the relation across segments
*/
int64
cdbRelMaxSegSize(Relation rel)
{
int64 size = 0;
int i;
CdbPgResults cdb_pgresults = {NULL, 0};
char *sql;
/*
* Let's ask the QEs for the size of the relation
*
* Relation Oids are assumed to be in sync in all nodes.
*/
sql = psprintf("select pg_catalog.pg_relation_size(%u)",
RelationGetRelid(rel));
CdbDispatchCommand(sql, DF_WITH_SNAPSHOT, &cdb_pgresults);
for (i = 0; i < cdb_pgresults.numResults; i++)
{
struct pg_result *pgresult = cdb_pgresults.pg_results[i];
if (PQresultStatus(pgresult) != PGRES_TUPLES_OK)
{
cdbdisp_clearCdbPgResults(&cdb_pgresults);
elog(ERROR, "cdbRelMaxSegSize: resultStatus not tuples_Ok: %s %s",
PQresStatus(PQresultStatus(pgresult)), PQresultErrorMessage(pgresult));
}
else
{
Assert(PQntuples(pgresult) == 1);
int64 tempsize = 0;
tempsize = pg_strtoint64(PQgetvalue(pgresult, 0, 0));
if (tempsize > size)
size = tempsize;
}
}
pfree(sql);
cdbdisp_clearCdbPgResults(&cdb_pgresults);
return size;
}