citus/src/include/distributed/version_compat.h

225 lines
5.7 KiB
C

/*-------------------------------------------------------------------------
*
* version_compat.h
* Compatibility macros for writing code agnostic to PostgreSQL versions
*
* Copyright (c) 2017, Citus Data, Inc.
*
*-------------------------------------------------------------------------
*/
#ifndef VERSION_COMPAT_H
#define VERSION_COMPAT_H
#include "postgres.h"
#include "commands/explain.h"
#include "catalog/namespace.h"
#include "nodes/parsenodes.h"
#if (PG_VERSION_NUM >= 90600 && PG_VERSION_NUM < 90700)
/* Backports from PostgreSQL 10 */
/* Accessor for the i'th attribute of tupdesc. */
#define TupleDescAttr(tupdesc, i) ((tupdesc)->attrs[(i)])
#endif
#if (PG_VERSION_NUM < 100000)
struct QueryEnvironment; /* forward-declare to appease compiler */
#endif
#if (PG_VERSION_NUM >= 90600 && PG_VERSION_NUM < 110000)
#include "access/hash.h"
#include "storage/fd.h"
#include "optimizer/prep.h"
#include "postmaster/bgworker.h"
#include "utils/memutils.h"
/* PostgreSQL 11 splits hash procs into "standard" and "extended" */
#define HASHSTANDARD_PROC HASHPROC
/* following functions are renamed in PG11 */
#define PreventInTransactionBlock PreventTransactionChain
#define DatumGetJsonbP(d) DatumGetJsonb(d)
#define RequireTransactionBlock RequireTransactionChain
/* following defines also exist for PG11 */
#define RELATION_OBJECT_TYPE ACL_OBJECT_RELATION
#define IndexInfoAttributeNumberArray(indexinfo) (indexinfo->ii_KeyAttrNumbers)
/* CreateTrigger api is changed in PG11 */
#define CreateTriggerInternal(stmt, queryString, relOid, refRelOid, constraintOid, \
indexOid, funcoid, parentTriggerOid, whenClause, isInternal, \
in_partition) \
CreateTrigger(stmt, queryString, relOid, refRelOid, constraintOid, indexOid, \
isInternal)
#define get_attname_internal(relationId, columnNumber, false) \
get_attname(relationId, columnNumber)
#define BackgroundWorkerInitializeConnectionByOid(dboid, useroid, flags) \
BackgroundWorkerInitializeConnectionByOid(dboid, useroid)
#define AtEOXact_Files(isCommit) \
AtEOXact_Files()
#define ACLCHECK_OBJECT_TABLE ACL_KIND_CLASS
#define ACLCHECK_OBJECT_SCHEMA ACL_KIND_NAMESPACE
#define ACLCHECK_OBJECT_INDEX ACL_KIND_CLASS
static inline int
BasicOpenFilePerm(FileName fileName, int fileFlags, int fileMode)
{
return BasicOpenFile(fileName, fileFlags, fileMode);
}
static inline File
PathNameOpenFilePerm(FileName fileName, int fileFlags, int fileMode)
{
return PathNameOpenFile(fileName, fileFlags, fileMode);
}
static inline MemoryContext
AllocSetContextCreateExtended(MemoryContext parent, const char *name, Size minContextSize,
Size initBlockSize, Size maxBlockSize)
{
return AllocSetContextCreate(parent, name, minContextSize, initBlockSize,
maxBlockSize);
}
static inline void
ExplainPropertyIntegerInternal(const char *qlabel, const char *unit, int64 value,
ExplainState *es)
{
return ExplainPropertyInteger(qlabel, value, es);
}
static inline List *
ExtractVacuumTargetRels(VacuumStmt *vacuumStmt)
{
List *vacuumList = NIL;
if (vacuumStmt->relation != NULL)
{
vacuumList = list_make1(vacuumStmt->relation);
}
return vacuumList;
}
static inline List *
VacuumColumnList(VacuumStmt *vacuumStmt, int relationIndex)
{
Assert(relationIndex == 0);
return vacuumStmt->va_cols;
}
#define RVR_MISSING_OK 1
#define RVR_NOWAIT 2
static inline Oid
RangeVarGetRelidInternal(const RangeVar *relation, LOCKMODE lockmode, uint32 flags,
RangeVarGetRelidCallback callback, void *callback_arg)
{
bool missingOK = ((flags & RVR_MISSING_OK) != 0);
bool noWait = ((flags & RVR_NOWAIT) != 0);
return RangeVarGetRelidExtended(relation, lockmode, missingOK, noWait,
callback, callback_arg);
}
static inline Expr *
canonicalize_qual_compat(Expr *qual, bool is_check)
{
return canonicalize_qual(qual);
}
#endif
#if (PG_VERSION_NUM >= 110000)
#include "optimizer/prep.h"
/* following macros should be removed when we drop support for PG10 and below */
#define RELATION_OBJECT_TYPE OBJECT_TABLE
#define IndexInfoAttributeNumberArray(indexinfo) (indexinfo->ii_IndexAttrNumbers)
#define CreateTriggerInternal CreateTrigger
#define get_attname_internal get_attname
#define ACLCHECK_OBJECT_TABLE OBJECT_TABLE
#define ACLCHECK_OBJECT_SCHEMA OBJECT_SCHEMA
#define ACLCHECK_OBJECT_INDEX OBJECT_INDEX
#define ConstraintRelidIndexId ConstraintRelidTypidNameIndexId
static inline void
ExplainPropertyIntegerInternal(const char *qlabel, const char *unit, int64 value,
ExplainState *es)
{
return ExplainPropertyInteger(qlabel, unit, value, es);
}
static inline Expr *
canonicalize_qual_compat(Expr *qual, bool is_check)
{
return canonicalize_qual(qual, is_check);
}
/*
* ExtractVacuumTargetRels returns list of target
* relations from vacuum statement.
*/
static inline List *
ExtractVacuumTargetRels(VacuumStmt *vacuumStmt)
{
List *vacuumList = NIL;
ListCell *vacuumRelationCell = NULL;
foreach(vacuumRelationCell, vacuumStmt->rels)
{
VacuumRelation *vacuumRelation = (VacuumRelation *) lfirst(vacuumRelationCell);
vacuumList = lappend(vacuumList, vacuumRelation->relation);
}
return vacuumList;
}
/*
* VacuumColumnList returns list of columns from relation
* in the vacuum statement at specified relationIndex.
*/
static inline List *
VacuumColumnList(VacuumStmt *vacuumStmt, int relationIndex)
{
VacuumRelation *vacuumRelation = (VacuumRelation *) list_nth(vacuumStmt->rels,
relationIndex);
return vacuumRelation->va_cols;
}
static inline Oid
RangeVarGetRelidInternal(const RangeVar *relation, LOCKMODE lockmode, uint32 flags,
RangeVarGetRelidCallback callback, void *callback_arg)
{
return RangeVarGetRelidExtended(relation, lockmode, flags, callback, callback_arg);
}
#endif
#endif /* VERSION_COMPAT_H */