Fix some compatibility issue with pg12.

Based on 3bb72b7492 and
4e6fce31c7.  A lot more is still needed to get
the hypothetical partitionning part compatible with pg12.
This commit is contained in:
Julien Rouhaud 2020-03-30 15:27:54 +02:00
parent 6435708a96
commit ea1fd27765
6 changed files with 98 additions and 20 deletions

View file

@ -21,6 +21,9 @@
#if PG_VERSION_NUM >= 90300
#include "access/htup_details.h"
#endif
#if PG_VERSION_NUM >= 120000
#include "access/table.h"
#endif
#if PG_VERSION_NUM >= 100000
#include "access/xact.h"
#endif
@ -208,22 +211,22 @@ hypo_getNewOid(Oid relid)
char relpersistence;
/* Open the relation on which we want a new OID */
relation = heap_open(relid, AccessShareLock);
relation = table_open(relid, AccessShareLock);
reltablespace = relation->rd_rel->reltablespace;
relpersistence = relation->rd_rel->relpersistence;
/* Close the relation and release the lock now */
heap_close(relation, AccessShareLock);
table_close(relation, AccessShareLock);
/* Open pg_class to aks a new OID */
pg_class = heap_open(RelationRelationId, RowExclusiveLock);
pg_class = table_open(RelationRelationId, RowExclusiveLock);
/* ask for a new relfilenode */
newoid = GetNewRelFileNode(reltablespace, pg_class, relpersistence);
/* Close pg_class and release the lock now */
heap_close(pg_class, RowExclusiveLock);
table_close(pg_class, RowExclusiveLock);
return newoid;
}
@ -542,7 +545,7 @@ hypo_get_relation_info_hook(PlannerInfo *root,
#endif
/* Open the current relation */
relation = heap_open(relationObjectId, AccessShareLock);
relation = table_open(relationObjectId, AccessShareLock);
if (relation->rd_rel->relkind == RELKIND_RELATION
#if PG_VERSION_NUM >= 90300
@ -632,7 +635,7 @@ hypo_get_relation_info_hook(PlannerInfo *root,
}
}
/* Close the relation and keep the lock, it might be reopened later */
heap_close(relation, NoLock);
table_close(relation, NoLock);
}
if (prev_get_relation_info_hook)
prev_get_relation_info_hook(root, relationObjectId, inhparent, rel);

View file

@ -29,10 +29,18 @@
#if PG_VERSION_NUM >= 90300
#include "access/htup_details.h"
#endif
#if PG_VERSION_NUM >= 120000
#include "access/table.h"
#endif
#include "commands/vacuum.h"
#include "executor/spi.h"
#if PG_VERSION_NUM < 120000
#include "optimizer/clauses.h"
#include "optimizer/cost.h"
#else
#include"nodes/makefuncs.h"
#include"optimizer/optimizer.h"
#endif
#include "parser/parsetree.h"
#include "rewrite/rewriteManip.h"
#include "utils/attoptcache.h"
@ -617,15 +625,15 @@ HYPO_PARTITION_NOT_SUPPORTED();
HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
}
onerel = heap_open(root_tableid, AccessShareLock);
pgstats = heap_open(StatisticRelationId, AccessShareLock);
onerel = table_open(root_tableid, AccessShareLock);
pgstats = table_open(StatisticRelationId, AccessShareLock);
hypo_do_analyze_tree(onerel, pgstats, fraction, root_entry);
/* release SPI related resources (and return to caller's context) */
SPI_finish();
relation_close(onerel, AccessShareLock);
relation_close(pgstats, AccessShareLock);
table_close(onerel, AccessShareLock);
table_close(pgstats, AccessShareLock);
return (Datum) 0;
@ -682,7 +690,7 @@ HYPO_PARTITION_NOT_SUPPORTED();
if (!hypoStatsHash)
return (Datum) 0;
pgstats = heap_open(StatisticRelationId, AccessShareLock);
pgstats = table_open(StatisticRelationId, AccessShareLock);
hash_seq_init(&hash_seq, hypoStatsHash);
while ((entry = hash_seq_search(&hash_seq)) != NULL)
@ -699,7 +707,7 @@ HYPO_PARTITION_NOT_SUPPORTED();
tuplestore_putvalues(tupstore, tupdesc, values, nulls);
}
relation_close(pgstats, AccessShareLock);
table_close(pgstats, AccessShareLock);
/* clean up and return the tuplestore */
tuplestore_donestoring(tupstore);

View file

@ -32,6 +32,10 @@
#include "access/htup_details.h"
#endif
#include "access/nbtree.h"
#if PG_VERSION_NUM >= 120000
#include "access/relation.h"
#include "access/table.h"
#endif
#include "access/reloptions.h"
#include "access/spgist.h"
#include "access/spgist_private.h"
@ -44,11 +48,19 @@
#include "catalog/pg_opclass.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
#if PG_VERSION_NUM < 120000
#include "nodes/relation.h"
#else
#include "nodes/makefuncs.h"
#endif
#include "optimizer/clauses.h"
#include "optimizer/cost.h"
#include "optimizer/pathnode.h"
#if PG_VERSION_NUM < 120000
#include "optimizer/var.h"
#else
#include "optimizer/optimizer.h"
#endif
#include "parser/parse_utilcmd.h"
#include "parser/parser.h"
#include "parser/parsetree.h"
@ -128,6 +140,7 @@ hypo_newIndex(Oid relid, char *accessMethod, int nkeycolumns, int ninccolumns,
hypoIndex *volatile entry;
MemoryContext oldcontext;
HeapTuple tuple;
Oid oid;
#if PG_VERSION_NUM >= 90600
IndexAmRoutine *amroutine;
@ -146,13 +159,19 @@ hypo_newIndex(Oid relid, char *accessMethod, int nkeycolumns, int ninccolumns,
accessMethod)));
}
hypo_discover_am(accessMethod, HeapTupleGetOid(tuple));
#if PG_VERSION_NUM < 120000
oid = HeapTupleGetOid(tuple);
#else
oid = ((Form_pg_am) GETSTRUCT(tuple))->oid;
#endif
hypo_discover_am(accessMethod, oid);
oldcontext = MemoryContextSwitchTo(HypoMemoryContext);
entry = palloc0(sizeof(hypoIndex));
entry->relam = HeapTupleGetOid(tuple);
entry->relam = oid;
#if PG_VERSION_NUM >= 90600
@ -664,10 +683,17 @@ hypo_index_store_parsetree(IndexStmt *node, const char *queryString)
}
/* get the opclass */
#if PG_VERSION_NUM < 100000
opclass= GetIndexOpClass(attribute->opclass,
atttype,
node->accessMethod,
entry->relam);
#else
opclass = ResolveOpClass(attribute->opclass,
atttype,
node->accessMethod,
entry->relam);
#endif
entry->opclass[attn] = opclass;
/* setup the opfamily */
entry->opfamily[attn] = get_opclass_family(opclass);
@ -726,7 +752,11 @@ hypo_index_store_parsetree(IndexStmt *node, const char *queryString)
{
AttrNumber attno = entry->indexkeys[attn];
if (attno < 0 && attno != ObjectIdAttributeNumber)
if (attno < 0
#if PG_VERSION_NUM < 120000
&& attno != ObjectIdAttributeNumber
#endif
)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("hypopg: index creation on system columns is not supported")));
@ -824,7 +854,10 @@ hypo_index_store_parsetree(IndexStmt *node, const char *queryString)
for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
{
if (i != ObjectIdAttributeNumber &&
if (
#if PG_VERSION_NUM < 120000
i != ObjectIdAttributeNumber &&
#endif
bms_is_member(i - FirstLowInvalidHeapAttributeNumber,
indexattrs))
ereport(ERROR,
@ -1759,7 +1792,7 @@ hypo_estimate_index_simple(hypoIndex *entry, BlockNumber *pages, double *tuples)
rel = makeNode(RelOptInfo);
/* Open the hypo index' relation */
relation = heap_open(entry->relid, AccessShareLock);
relation = table_open(entry->relid, AccessShareLock);
if (!RelationNeedsWAL(relation) && RecoveryInProgress())
ereport(ERROR,
@ -1787,7 +1820,7 @@ hypo_estimate_index_simple(hypoIndex *entry, BlockNumber *pages, double *tuples)
&rel->pages, &rel->tuples, &rel->allvisfrac);
/* Close the relation and release the lock now */
heap_close(relation, AccessShareLock);
table_close(relation, AccessShareLock);
hypo_estimate_index(entry, rel, NULL);
*pages = entry->pages;

View file

@ -36,16 +36,22 @@
#include "catalog/pg_opclass.h"
#include "catalog/pg_type.h"
#include "nodes/makefuncs.h"
#if PG_VERSION_NUM < 120000
#include "nodes/relation.h"
#endif
#include "nodes/nodes.h"
#include "nodes/pg_list.h"
#include "optimizer/clauses.h"
#include "optimizer/cost.h"
#include "optimizer/pathnode.h"
#if PG_VERSION_NUM < 120000
#include "optimizer/predtest.h"
#endif
#include "optimizer/prep.h"
#include "optimizer/restrictinfo.h"
#if PG_VERSION_NUM < 120000
#include "optimizer/var.h"
#endif
#include "parser/parsetree.h"
#include "parser/parse_utilcmd.h"
#include "rewrite/rewriteManip.h"
@ -58,6 +64,9 @@
#include "utils/partcache.h"
#include "partitioning/partbounds.h"
#endif
#if PG_VERSION_NUM >= 120000
#include "partitioning/partdesc.h"
#endif
#include "utils/ruleutils.h"
#include "utils/syscache.h"
#endif /* pg10+ */

View file

@ -22,6 +22,9 @@
#include "nodes/makefuncs.h"
#include "nodes/pg_list.h"
#include "optimizer/clauses.h"
#if PG_VERSION_NUM >= 120000
#include "optimizer/optimizer.h"
#endif
#include "optimizer/planner.h"
#include "optimizer/pathnode.h"
#if PG_VERSION_NUM >= 110000
@ -63,8 +66,11 @@ build_index_tlist(PlannerInfo *root, IndexOptInfo *index,
const FormData_pg_attribute *att_tup;
if (indexkey < 0)
att_tup = SystemAttributeDefinition(indexkey,
heapRelation->rd_rel->relhasoids);
att_tup = SystemAttributeDefinition(indexkey
#if PG_VERSION_NUM < 120000
,heapRelation->rd_rel->relhasoids
#endif
);
else
#if PG_VERSION_NUM >= 110000
att_tup = TupleDescAttr(heapRelation->rd_att, indexkey - 1);

View file

@ -19,6 +19,25 @@
#include "include/hypopg_import.h"
/* Provide backward compatibility macros for table.c API on pre v12 versions */
#if PG_VERSION_NUM < 120000
#define table_open(r, l) heap_open(r, l)
#define table_close(r, l) heap_close(r, l)
#endif
/*
* Hacky macro to provide backward compatibility with either 1 or 2 arg lnext()
* on pre v13 versions
*/
#if PG_VERSION_NUM < 130000
#define LNEXT(_1, _2, NAME, ...) NAME
#undef lnext
#define lnext(...) LNEXT(__VA_ARGS__, LNEXT2, LNEXT1) (__VA_ARGS__)
#define LNEXT1(lc) ((lc)->next)
#define LNEXT2(list, lc) ((lc)->next)
#endif
extern bool isExplain;
/* GUC for enabling / disabling hypopg during EXPLAIN */