diff options
author | Pavan Deolasee | 2015-04-27 06:23:11 +0000 |
---|---|---|
committer | Pavan Deolasee | 2015-04-27 06:23:11 +0000 |
commit | 4a9ab6d8619817f9e3989c99b65140e19041dab7 (patch) | |
tree | 10ded7e26abd78d93658cb72fc5cb9d4672eff2a /src/backend | |
parent | f205105325c2502852214872808941bc0794a59e (diff) |
Fix compilation issues post 9.4 merge.
This is the second step towards getting a build that works. Some of the merge
conflicts are rather handled in a trivial fashion and would definitely take
more work to get them working. A case in point example is aggregates. Its amply
clear that aggregate support is broken post merge. PostgreSQL 9.4 changed the
way results of transient functions are stored by aggregates and it nows used
INTERNALOID as a type. Since we need to send these transient results to
coordinators for collection and finalisation, we need to find out a way to do
that. We did some elemenatry changes to let compilation proceed, but its not
going to help ar run-time. There are more such issues post-merger.
Similarly, regression expected outputs are changed without much deliberation. A
complete regression test and analysis is required to fix them.
Diffstat (limited to 'src/backend')
43 files changed, 270 insertions, 124 deletions
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index 40be1579ed..b81bddf3c1 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -69,6 +69,7 @@ #include "access/tuptoaster.h" #include "executor/tuptable.h" #ifdef XCP +#include "lib/stringinfo.h" #include "utils/memutils.h" #endif diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 31fec2a365..0f866f0fa5 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5456,6 +5456,10 @@ getRecordTimestamp(XLogRecord *record, TimestampTz *recordXtime) static bool recoveryStopsBefore(XLogRecord *record) { +#ifdef PGXC + bool stopsAtThisBarrier = false; + char *recordBarrierId = NULL; +#endif bool stopsHere = false; uint8 record_info; bool isCommit; diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index beb3843c19..17e2e83744 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -383,7 +383,7 @@ AuxiliaryProcessMain(int argc, char *argv[]) { #ifdef PGXC /* Initialize pooler flag before creating PGPROC structure */ - if (auxType == PoolerProcess) + if (MyAuxProcType == PoolerProcess) PGXCPoolerProcessIam(); #endif diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index af4791bf58..fdffa6a6db 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -168,9 +168,9 @@ static const Oid object_classes[MAX_OCLASS] = { ForeignServerRelationId, /* OCLASS_FOREIGN_SERVER */ UserMappingRelationId, /* OCLASS_USER_MAPPING */ DefaultAclRelationId, /* OCLASS_DEFACL */ - ExtensionRelationId /* OCLASS_EXTENSION */ + ExtensionRelationId, /* OCLASS_EXTENSION */ #ifdef PGXC - ,PgxcClassRelationId /* OCLASS_PGXCCLASS */ + PgxcClassRelationId, /* OCLASS_PGXCCLASS */ #endif EventTriggerRelationId /* OCLASS_EVENT_TRIGGER */ }; diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index fe11f70ff1..21a4df6e9c 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -200,7 +200,7 @@ static FormData_pg_attribute a7 = { * at the Coordinator */ static FormData_pg_attribute a8 = { - 0, {"xc_node_id"}, INT4OID, 0, sizeof(int4), + 0, {"xc_node_id"}, INT4OID, 0, sizeof(int32), XC_NodeIdAttributeNumber, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0 }; diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 61b282bcf7..11a196bff3 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -297,7 +297,7 @@ AggregateCreate(const char *aggName, */ fnArgs[0] = aggCollectType; fnArgs[1] = aggTransType; - collectfn = lookup_agg_function(aggcollectfnName, 2, fnArgs, + collectfn = lookup_agg_function(aggcollectfnName, 2, fnArgs, variadicArgType, &rettype); if (rettype != aggCollectType) ereport(ERROR, @@ -316,7 +316,7 @@ AggregateCreate(const char *aggName, */ fnArgs[0] = aggTransType; fnArgs[1] = aggTransType; - collectfn = lookup_agg_function(aggcollectfnName, 2, fnArgs, + collectfn = lookup_agg_function(aggcollectfnName, 2, fnArgs, variadicArgType, &rettype); if (rettype != aggTransType) ereport(ERROR, diff --git a/src/backend/catalog/pgxc_class.c b/src/backend/catalog/pgxc_class.c index 1543a45342..297010be9f 100644 --- a/src/backend/catalog/pgxc_class.c +++ b/src/backend/catalog/pgxc_class.c @@ -12,6 +12,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/namespace.h" diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index b073fe5aed..bf21ef9a65 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -3030,10 +3030,10 @@ analyze_rel_coordinator(Relation onerel, bool inh, int attr_cnt, Datum value; bool isnull; int colnum = 1; - int2 attnum; + int16 attnum; // float4 reltuples; float4 nullfrac; - int4 width; + int32 width; float4 distinct; VacAttrStats *stats = NULL; @@ -3070,7 +3070,7 @@ analyze_rel_coordinator(Relation onerel, bool inh, int attr_cnt, /* Detailed statistics */ for (i = 1; i <= STATISTIC_NUM_SLOTS; i++) { - int2 kind; + int16 kind; float4 *numbers; Datum *values; int nnumbers, nvalues; diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index e2b2756bff..183f8485a3 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -834,7 +834,6 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed) bool is_from = stmt->is_from; bool pipe = (stmt->filename == NULL); Relation rel; - uint64 processed; #ifdef XCP int oldSeqRangeVal = SequenceRangeVal; #endif diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 96f926cbb2..e4cfcd282c 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -995,6 +995,11 @@ EventTriggerSupportsObjectClass(ObjectClass objclass) case OCLASS_USER_MAPPING: case OCLASS_DEFACL: case OCLASS_EXTENSION: +#ifdef PGXC + case OCLASS_PGXC_CLASS: + case OCLASS_PGXC_NODE: + case OCLASS_PGXC_GROUP: +#endif return true; case MAX_OCLASS: diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 108d637fcf..1a7675c673 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -536,12 +536,12 @@ DefineIndex(Oid relationId, #ifdef PGXC /* Make sure we can locally enforce the index */ - if (IS_PGXC_COORDINATOR && (primary || unique)) + if (IS_PGXC_COORDINATOR && (stmt->primary || stmt->unique)) { ListCell *elem; bool isSafe = false; - foreach(elem, attributeList) + foreach(elem, stmt->indexParams) { IndexElem *key = (IndexElem *) lfirst(elem); @@ -569,8 +569,8 @@ DefineIndex(Oid relationId, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("Unique index of partitioned table must contain the hash/modulo distribution column."))); /* create index still, just that it won't be unique */ - unique = false; - isconstraint = false; + stmt->unique = false; + stmt->isconstraint = false; } else ereport(ERROR, diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 67db471307..a223995c2f 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -39,6 +39,7 @@ #include "pgxc/nodemgr.h" #include "pgxc/execRemote.h" #include "catalog/pgxc_node.h" +#include "utils/resowner_private.h" #endif /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 86e59b40cc..cf453cae03 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -11934,6 +11934,6 @@ DropTableThrowErrorExternal(RangeVar *relation, ObjectType removeType, bool miss break; } - DropErrorMsgNonExistent(relation->relname, relkind, missing_ok); + DropErrorMsgNonExistent(relation, relkind, missing_ok); } #endif diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index f0c435ee9d..5e4455df3f 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1662,12 +1662,14 @@ vacuum_rel_coordinator(Relation onerel) idx_frozenxid = InvalidTransactionId; } /* save changes */ + /* !!TODO Get multi-xid from remote nodes */ vac_update_relstats(Irel[i], (BlockNumber) idx_pages, (double) idx_tuples, 0, false, - idx_frozenxid); + idx_frozenxid, + InvalidMultiXactId); } } } @@ -1690,7 +1692,8 @@ vacuum_rel_coordinator(Relation onerel) (double) num_tuples, visibilitymap_count(onerel), hasindex, - min_frozenxid); + min_frozenxid, + InvalidMultiXactId); } } #endif diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index a1677211ef..a3ebbee195 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -110,6 +110,9 @@ typedef struct WindowStatePerAggData /* Oids of transition functions */ Oid transfn_oid; Oid invtransfn_oid; /* may be InvalidOid */ +#ifdef PGXC + Oid collectfn_oid; +#endif Oid finalfn_oid; /* may be InvalidOid */ /* diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index fc025e31f7..63213fc048 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -51,7 +51,7 @@ static Portal SPI_cursor_open_internal(const char *name, SPIPlanPtr plan, #ifdef PGXC static void _SPI_pgxc_prepare_plan(const char *src, List *src_parsetree, - SPIPlanPtr plan, ParamListInfo boundParams); + SPIPlanPtr plan); #endif static void _SPI_prepare_plan(const char *src, SPIPlanPtr plan); @@ -404,7 +404,7 @@ SPI_execute_direct(const char *remote_sql, char *nodename) plan.cursor_options = 0; /* Now pass the ExecDirectStmt parsetree node */ - _SPI_pgxc_prepare_plan(execdirect.data, list_make1(stmt), &plan, NULL); + _SPI_pgxc_prepare_plan(execdirect.data, list_make1(stmt), &plan); res = _SPI_execute_plan(&plan, NULL, InvalidSnapshot, InvalidSnapshot, false, true, 0); @@ -1857,7 +1857,7 @@ static void _SPI_prepare_plan(const char *src, SPIPlanPtr plan) { #ifdef PGXC - _SPI_pgxc_prepare_plan(src, NULL, plan, boundParams); + _SPI_pgxc_prepare_plan(src, NULL, plan); } /* @@ -1867,7 +1867,7 @@ _SPI_prepare_plan(const char *src, SPIPlanPtr plan) * transparent to the user. */ static void -_SPI_pgxc_prepare_plan(const char *src, List *src_parsetree, SPIPlanPtr plan, ParamListInfo boundParams) +_SPI_pgxc_prepare_plan(const char *src, List *src_parsetree, SPIPlanPtr plan) { #endif List *raw_parsetree_list; diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 50c1a92748..0dbbf51972 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -2273,8 +2273,10 @@ List* get_parsed_hba(void) { FILE *file; List *hba_lines = NIL; List *hba_line_nums = NIL; + List *hba_raw_lines = NIL; ListCell *line, - *line_num; + *line_num, + *raw_line; List *new_parsed_lines = NIL; bool ok = true; MemoryContext linecxt; @@ -2294,10 +2296,10 @@ List* get_parsed_hba(void) { * the initial startup. If it happens on reload, we just keep the old * version around. */ - return false; + return NULL; } - linecxt = tokenize_file(HbaFileName, file, &hba_lines, &hba_line_nums); + linecxt = tokenize_file(HbaFileName, file, &hba_lines, &hba_line_nums, &hba_raw_lines); FreeFile(file); /* Now parse all the lines */ @@ -2307,11 +2309,11 @@ List* get_parsed_hba(void) { ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_MAXSIZE); oldcxt = MemoryContextSwitchTo(hbacxt); - forboth(line, hba_lines, line_num, hba_line_nums) + forthree(line, hba_lines, line_num, hba_line_nums, raw_line, hba_raw_lines) { HbaLine *newline; - if ((newline = parse_hba_line(lfirst(line), lfirst_int(line_num))) == NULL) + if ((newline = parse_hba_line(lfirst(line), lfirst_int(line_num), lfirst(raw_line))) == NULL) { /* * Parse error in the file, so indicate there's a problem. NB: a diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 3ba89d23eb..ad2ebd935b 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -2335,11 +2335,8 @@ _readFunctionScan(void) { READ_SCAN_FIELDS(FunctionScan); - READ_NODE_FIELD(funcexpr); - READ_NODE_FIELD(funccolnames); - READ_NODE_FIELD(funccoltypes); - READ_NODE_FIELD(funccoltypmods); - READ_NODE_FIELD(funccolcollations); + READ_NODE_FIELD(functions); + READ_BOOL_FIELD(funcordinality); READ_DONE(); } diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index f87a36efaf..88afebb99b 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -46,6 +46,7 @@ #include "parser/parse_clause.h" #include "parser/parsetree.h" #ifdef PGXC +#include "access/htup_details.h" #include "access/gtm.h" #include "parser/parse_coerce.h" #include "pgxc/pgxc.h" @@ -1925,7 +1926,7 @@ create_remotescan_plan(PlannerInfo *root, subplan = create_plan_recurse(root, best_path->subpath); /* We don't want any excess columns in the remote tuples */ - disuse_physical_tlist(subplan, best_path->subpath); + disuse_physical_tlist(root, subplan, best_path->subpath); plan = make_remotesubplan(root, subplan, best_path->path.distribution, @@ -1967,7 +1968,7 @@ find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent if (parent && IsA(plan, SubqueryScan)) { Plan *subplan = ((SubqueryScan *)plan)->subplan; - Plan *remote_plan = find_push_down_plan_int(root, ((SubqueryScan *)plan)->subplan, force, + RemoteSubplan *remote_plan = find_push_down_plan_int(root, ((SubqueryScan *)plan)->subplan, force, &((SubqueryScan *)plan)->subplan); /* @@ -1975,7 +1976,7 @@ find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent * subquery plan, then we must also update the link stored in the * RelOptInfo corresponding to this subquery */ - if ((remote_plan == subplan) && parent) + if ((((Plan *)remote_plan) == subplan) && parent) { Assert(root); RelOptInfo *rel = find_base_rel(root, ((SubqueryScan *)plan)->scan.scanrelid); diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 099939b3d7..88c6d23c27 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -1002,6 +1002,9 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, case RTE_RELATION: case RTE_JOIN: case RTE_CTE: +#ifdef XCP + case RTE_REMOTE_DUMMY: +#endif /* these can't contain any lateral references */ break; } @@ -1648,6 +1651,9 @@ replace_vars_in_jointree(Node *jtnode, case RTE_RELATION: case RTE_JOIN: case RTE_CTE: +#ifdef XCP + case RTE_REMOTE_DUMMY: +#endif /* these shouldn't be marked LATERAL */ Assert(false); break; diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 9ab2083c27..2dbf7f6619 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -113,6 +113,7 @@ static void transformLockingClause(ParseState *pstate, Query *qry, #ifdef XCP static void ParseAnalyze_rtable_walk(List *rtable); +static void ParseAnalyze_substitute_func(FuncExpr *funcexpr); #endif /* @@ -2965,59 +2966,69 @@ static void ParseAnalyze_rtable_walk(List *rtable) { ListCell *item; - StringInfoData buf; if (!IsUnderPostmaster || superuser()) return; - initStringInfo(&buf); foreach(item, rtable) { RangeTblEntry *rte = (RangeTblEntry *) lfirst(item); - resetStringInfo(&buf); - if (rte->rtekind == RTE_FUNCTION && - get_func_namespace(((FuncExpr *) rte->funcexpr)->funcid) == - PG_CATALOG_NAMESPACE) + if (rte->rtekind == RTE_FUNCTION) { - Oid funcid = InvalidOid; + ListCell *lc; + foreach(lc, rte->functions) + { + RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc); + ParseAnalyze_substitute_func((FuncExpr *) rtfunc->funcexpr); + } + } + else if (rte->rtekind == RTE_SUBQUERY) /* recurse for subqueries */ + ParseAnalyze_rtable_walk(rte->subquery->rtable); + } +} - FuncExpr *funcexpr = (FuncExpr *) rte->funcexpr; - const char *funcname = get_func_name(funcexpr->funcid); +static void +ParseAnalyze_substitute_func(FuncExpr *funcexpr) +{ + StringInfoData buf; + initStringInfo(&buf); - /* Check if the funcname is in storm_catalog_remap_string */ - appendStringInfoString(&buf, funcname); - appendStringInfoChar(&buf, ','); + if (get_func_namespace(funcexpr->funcid) == PG_CATALOG_NAMESPACE) + { + Oid funcid = InvalidOid; + const char *funcname = get_func_name(funcexpr->funcid); - elog(DEBUG2, "the constructed name is %s", buf.data); + /* Check if the funcname is in storm_catalog_remap_string */ + appendStringInfoString(&buf, funcname); + appendStringInfoChar(&buf, ','); - /* - * The unqualified function name should be satisfied from the - * storm_catalog appropriately. Just provide a warning for now if - * it is not.. - */ - if (strstr(storm_catalog_remap_string, buf.data)) - { - Oid *argtypes = NULL; - int nargs; + elog(DEBUG2, "the constructed name is %s", buf.data); - get_func_signature(funcexpr->funcid, &argtypes, &nargs); - funcid = get_funcid(funcname, buildoidvector(argtypes, nargs), - STORM_CATALOG_NAMESPACE); - } - else - continue; + /* + * The unqualified function name should be satisfied from the + * storm_catalog appropriately. Just provide a warning for now if + * it is not.. + */ + if (strstr(storm_catalog_remap_string, buf.data)) + { + Oid *argtypes = NULL; + int nargs; + + get_func_signature(funcexpr->funcid, &argtypes, &nargs); + funcid = get_funcid(funcname, buildoidvector(argtypes, nargs), + STORM_CATALOG_NAMESPACE); + } + else + return; - if (get_func_namespace(funcid) != STORM_CATALOG_NAMESPACE) - ereport(WARNING, + if (get_func_namespace(funcid) != STORM_CATALOG_NAMESPACE) + ereport(WARNING, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("Entry (%s) present in storm_catalog_remap_string " - "but object not picked from STORM_CATALOG", funcname))); - else /* change the funcid to the storm_catalog one */ - funcexpr->funcid = funcid; - } - else if (rte->rtekind == RTE_SUBQUERY) /* recurse for subqueries */ - ParseAnalyze_rtable_walk(rte->subquery->rtable); + "but object not picked from STORM_CATALOG", funcname))); + else /* change the funcid to the storm_catalog one */ + funcexpr->funcid = funcid; } } #endif diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 6a39dc8c41..5931e2847e 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -598,7 +598,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); OBJECT_P OF OFF OFFSET OIDS ON ONLY OPERATOR OPTION OPTIONS OR ORDER ORDINALITY OUT_P OUTER_P OVER OVERLAPS OVERLAY OWNED OWNER - PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POSITION + PARSER PARTIAL PARTITION PASSING PASSWORD PAUSE PLACING PLANS POSITION /* PGXC_BEGIN */ PRECEDING PRECISION PREFERRED PRESERVE PREPARE PREPARED PRIMARY /* PGXC_END */ diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index ae708a6da5..9e81051893 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -1352,7 +1352,7 @@ build_aggregate_fnexprs(Oid *agg_input_types, args, InvalidOid, agg_input_collation, - COERCE_DONTCARE); + COERCE_EXPLICIT_CALL); } else *collectfnexpr = NULL; diff --git a/src/backend/pgxc/cluster/pause.c b/src/backend/pgxc/cluster/pause.c index e5b4a000a3..164dafa0e8 100644 --- a/src/backend/pgxc/cluster/pause.c +++ b/src/backend/pgxc/cluster/pause.c @@ -472,7 +472,7 @@ ReleaseClusterLock(bool exclusive) * Decrement our count. If a PAUSE is waiting inside AcquireClusterLock * elsewhere, it will wake out of sleep and do the needful */ - if (clinfo->cl_process_count > 0); + if (clinfo->cl_process_count > 0) clinfo->cl_process_count--; } SpinLockRelease(&clinfo->cl_mutex); diff --git a/src/backend/pgxc/copy/remotecopy.c b/src/backend/pgxc/copy/remotecopy.c index f9a9f20b77..b5256f219c 100644 --- a/src/backend/pgxc/copy/remotecopy.c +++ b/src/backend/pgxc/copy/remotecopy.c @@ -21,6 +21,7 @@ #include "postgres.h" #include "miscadmin.h" #include "lib/stringinfo.h" +#include "nodes/pg_list.h" #include "optimizer/planner.h" #include "pgxc/pgxcnode.h" #include "pgxc/postgresql_fdw.h" diff --git a/src/backend/pgxc/locator/locator.c b/src/backend/pgxc/locator/locator.c index 96e6716fc4..9b98c38f05 100644 --- a/src/backend/pgxc/locator/locator.c +++ b/src/backend/pgxc/locator/locator.c @@ -1025,7 +1025,7 @@ RelationBuildLocator(Relation rel) pcrel = heap_open(PgxcClassRelationId, AccessShareLock); pcscan = systable_beginscan(pcrel, PgxcClassPgxcRelIdIndexId, true, - SnapshotNow, 1, &skey); + SnapshotSelf, 1, &skey); htup = systable_getnext(pcscan); if (!HeapTupleIsValid(htup)) diff --git a/src/backend/pgxc/nodemgr/groupmgr.c b/src/backend/pgxc/nodemgr/groupmgr.c index f16f4ec54b..b63b8cf44f 100644 --- a/src/backend/pgxc/nodemgr/groupmgr.c +++ b/src/backend/pgxc/nodemgr/groupmgr.c @@ -14,12 +14,14 @@ #include "miscadmin.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/indexing.h" #include "catalog/pg_type.h" #include "catalog/pgxc_node.h" #include "catalog/pgxc_group.h" #include "nodes/parsenodes.h" +#include "nodes/pg_list.h" #include "utils/builtins.h" #include "utils/rel.h" #include "utils/syscache.h" diff --git a/src/backend/pgxc/nodemgr/nodemgr.c b/src/backend/pgxc/nodemgr/nodemgr.c index 7fcf072786..7ff9fdabac 100644 --- a/src/backend/pgxc/nodemgr/nodemgr.c +++ b/src/backend/pgxc/nodemgr/nodemgr.c @@ -14,6 +14,7 @@ #include "access/hash.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/indexing.h" #include "catalog/pgxc_node.h" @@ -327,7 +328,7 @@ PgxcNodeListAndCount(void) * 3) Complete primary/preferred node information */ rel = heap_open(PgxcNodeRelationId, AccessShareLock); - scan = heap_beginscan(rel, SnapshotNow, 0, NULL); + scan = heap_beginscan(rel, SnapshotSelf, 0, NULL); while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) { Form_pgxc_node nodeForm = (Form_pgxc_node) GETSTRUCT(tuple); diff --git a/src/backend/pgxc/pool/execRemote.c b/src/backend/pgxc/pool/execRemote.c index e42a99d8a3..3ecca730e9 100644 --- a/src/backend/pgxc/pool/execRemote.c +++ b/src/backend/pgxc/pool/execRemote.c @@ -480,7 +480,7 @@ create_tuple_desc(char *msg_body, size_t len) msg_body += 2; /* Get the OID type and mode type from typename */ - parseTypeString(typname, &oidtypeid, NULL); + parseTypeString(typname, &oidtypeid, NULL, false); TupleDescInitEntry(result, attnum, attname, oidtypeid, typmod, 0); } @@ -8001,7 +8001,7 @@ determine_param_types(Plan *plan, struct find_params_context *context) break; case T_FunctionScan: - if (expression_tree_walker((Node *) ((FunctionScan *) plan)->funcexpr, + if (expression_tree_walker((Node *) ((FunctionScan *) plan)->functions, determine_param_types_walker, (void *) context)) return true; diff --git a/src/backend/pgxc/pool/poolcomm.c b/src/backend/pgxc/pool/poolcomm.c index 591aff0a39..4a3c755e7d 100644 --- a/src/backend/pgxc/pool/poolcomm.c +++ b/src/backend/pgxc/pool/poolcomm.c @@ -121,7 +121,7 @@ Lock_AF_UNIX(unsigned short port, const char *unixSocketName) { POOLER_UNIXSOCK_PATH(sock_path, port, unixSocketName); - CreateSocketLockFile(sock_path, true); + CreateSocketLockFile(sock_path, true, ""); unlink(sock_path); diff --git a/src/backend/pgxc/pool/poolmgr.c b/src/backend/pgxc/pool/poolmgr.c index cd76143350..8fc49c2016 100644 --- a/src/backend/pgxc/pool/poolmgr.c +++ b/src/backend/pgxc/pool/poolmgr.c @@ -410,20 +410,53 @@ GetPoolManagerHandle(void) return; #endif - /* Connect to the pooler */ - fdsock = pool_connect(PoolerPort, UnixSocketDir); - if (fdsock < 0) +#ifdef HAVE_UNIX_SOCKETS + if (Unix_socket_directories) { - int saved_errno = errno; + char *rawstring; + List *elemlist; + ListCell *l; + int success = 0; - ereport(ERROR, - (errcode(ERRCODE_CONNECTION_FAILURE), - errmsg("failed to connect to pool manager: %m"))); - errno = saved_errno; -#ifndef XCP - return NULL; -#endif + /* Need a modifiable copy of Unix_socket_directories */ + rawstring = pstrdup(Unix_socket_directories); + + /* Parse string into list of directories */ + if (!SplitDirectoriesString(rawstring, ',', &elemlist)) + { + /* syntax error in list */ + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid list syntax in parameter \"%s\"", + "unix_socket_directories"))); + } + + foreach(l, elemlist) + { + char *socketdir = (char *) lfirst(l); + int saved_errno; + + /* Connect to the pooler */ + fdsock = pool_connect(PoolerPort, socketdir); + if (fdsock < 0) + { + saved_errno = errno; + ereport(WARNING, + (errmsg("could not create Unix-domain socket in directory \"%s\"", + socketdir))); + } + else + break; + } + + if (!success && elemlist != NIL) + ereport(ERROR, + (errmsg("failed to connect to pool manager: %m"))); + + list_free_deep(elemlist); + pfree(rawstring); } +#endif /* Allocate handle */ /* @@ -2706,20 +2739,68 @@ PoolerLoop(void) StringInfoData input_message; #ifdef XCP time_t last_maintenance = (time_t) 0; + int nfds; + fd_set rfds; #endif - server_fd = pool_listen(PoolerPort, UnixSocketDir); - if (server_fd == -1) + FD_ZERO(&rfds); + +#ifdef HAVE_UNIX_SOCKETS + if (Unix_socket_directories) { - /* log error */ - return; + char *rawstring; + List *elemlist; + ListCell *l; + int success = 0; + + /* Need a modifiable copy of Unix_socket_directories */ + rawstring = pstrdup(Unix_socket_directories); + + /* Parse string into list of directories */ + if (!SplitDirectoriesString(rawstring, ',', &elemlist)) + { + /* syntax error in list */ + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid list syntax in parameter \"%s\"", + "unix_socket_directories"))); + } + + nfds = 0; + foreach(l, elemlist) + { + char *socketdir = (char *) lfirst(l); + int saved_errno; + + /* Connect to the pooler */ + server_fd = pool_listen(PoolerPort, socketdir); + if (server_fd < 0) + { + saved_errno = errno; + ereport(WARNING, + (errmsg("could not create Unix-domain socket in directory \"%s\"", + socketdir))); + } + else + { + /* watch for incoming connections */ + FD_SET(server_fd, &rfds); + nfds = Max(nfds, server_fd); + } + } + + if (!success && elemlist != NIL) + ereport(ERROR, + (errmsg("failed to connect to pool manager: %m"))); + + list_free_deep(elemlist); + pfree(rawstring); } +#endif initStringInfo(&input_message); for (;;) { - int nfds; - fd_set rfds; int retval; int i; @@ -2730,12 +2811,6 @@ PoolerLoop(void) if (!PostmasterIsAlive()) exit(1); - /* watch for incoming connections */ - FD_ZERO(&rfds); - FD_SET(server_fd, &rfds); - - nfds = server_fd; - /* watch for incoming messages */ for (i = 0; i < agentCount; i++) { diff --git a/src/backend/pgxc/pool/poolutils.c b/src/backend/pgxc/pool/poolutils.c index e383845101..9b4cbd7601 100644 --- a/src/backend/pgxc/pool/poolutils.c +++ b/src/backend/pgxc/pool/poolutils.c @@ -24,6 +24,7 @@ #include "pgxc/pgxc.h" #include "nodes/nodes.h" +#include "nodes/pg_list.h" #include "pgxc/poolmgr.h" #include "pgxc/locator.h" #include "pgxc/nodemgr.h" diff --git a/src/backend/pgxc/squeue/squeue.c b/src/backend/pgxc/squeue/squeue.c index fbe20d4a23..02d11d2430 100644 --- a/src/backend/pgxc/squeue/squeue.c +++ b/src/backend/pgxc/squeue/squeue.c @@ -26,6 +26,7 @@ #include "catalog/pgxc_node.h" #include "commands/prepare.h" #include "executor/executor.h" +#include "nodes/pg_list.h" #include "pgxc/nodemgr.h" #include "pgxc/pgxc.h" #include "pgxc/pgxcnode.h" diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 00b5b838d7..1fd9706914 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -132,6 +132,10 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogRecord *record) case RM_GIST_ID: case RM_SEQ_ID: case RM_SPGIST_ID: +#ifdef PGXC + case RM_BARRIER_ID: +#endif + break; case RM_NEXT_ID: elog(ERROR, "unexpected RM_NEXT_ID rmgr_id: %u", (RmgrIds) buf.record.xl_rmid); diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 6807c44679..a00564a002 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -3800,9 +3800,8 @@ QueryRewriteCTAS(Query *parsetree) deparse_query(cparsetree, &cquery, NIL); /* Finally, fire off the query to run the DDL */ - ProcessUtility(cparsetree->utilityStmt, cquery.data, NULL, true, NULL, - false, - NULL); + ProcessUtility(cparsetree->utilityStmt, cquery.data, PROCESS_UTILITY_QUERY, + NULL, NULL, false, NULL); /* * Now fold the CTAS statement into an INSERT INTO statement. The diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index f1c2e2bdb8..2395852fec 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -974,7 +974,7 @@ LockAcquireExtendedXC(const LOCKTAG *locktag, status = STATUS_FOUND; else status = LockCheckConflicts(lockMethodTable, lockmode, - lock, proclock); + lock, proclock, MyProc); if (status == STATUS_OK) { @@ -1319,7 +1319,8 @@ int LockCheckConflicts(LockMethod lockMethodTable, LOCKMODE lockmode, LOCK *lock, - PROCLOCK *proclock) + PROCLOCK *proclock, + PGPROC *proc) { int numLockModes = lockMethodTable->numLockModes; LOCKMASK myLocks; diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 771ebc9255..ac372831f0 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -1036,7 +1036,8 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) LockCheckConflicts(lockMethodTable, lockmode, lock, - proclock) == STATUS_OK) + proclock, + MyProc) == STATUS_OK) { /* Skip the wait and just grant myself the lock. */ GrantLock(lock, proclock, lockmode); @@ -1502,7 +1503,8 @@ ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock) LockCheckConflicts(lockMethodTable, lockmode, lock, - proc->waitProcLock) == STATUS_OK) + proc->waitProcLock, + proc) == STATUS_OK) { /* OK to waken */ GrantLock(lock, proc->waitProcLock, lockmode); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 0604369e13..e88f61bb19 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -1457,7 +1457,7 @@ exec_parse_message(const char *query_string, /* string to execute */ /* we don't expect type mod */ for (cnt_param = 0; cnt_param < numParams; cnt_param++) parseTypeString(paramTypeNames[cnt_param], ¶mTypes[cnt_param], - NULL); + NULL, false); } #endif /* PGXC */ @@ -1746,7 +1746,7 @@ exec_plan_message(const char *query_string, /* source of the query */ /* we don't expect type mod */ for (cnt_param = 0; cnt_param < numParams; cnt_param++) parseTypeString(paramTypeNames[cnt_param], ¶mTypes[cnt_param], - NULL); + NULL, false); } diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 04f17ac8eb..23b303fcbd 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -591,7 +591,7 @@ PortalStart(Portal portal, ParamListInfo params, /* No special ability is needed */ eflags = 0; /* Must set snapshot before starting executor. */ - if (use_active_snapshot) + if (snapshot) PushActiveSnapshot(GetActiveSnapshot()); else PushActiveSnapshot(GetTransactionSnapshot()); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 91408998f9..d09564f060 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -118,7 +118,15 @@ static void ProcessUtilitySlow(Node *parsetree, bool sentToRemote, #endif /* PGXC */ char *completionTag); + +#ifdef PGXC +static void ExecDropStmt(DropStmt *stmt, + const char *queryString, + bool sentToRemote, + bool isTopLevel); +#else static void ExecDropStmt(DropStmt *stmt, bool isTopLevel); +#endif /* @@ -421,7 +429,6 @@ standard_ProcessUtility(Node *parsetree, pgxc_lock_for_utility_stmt(parsetree); } #endif -+ check_xact_readonly(parsetree); @@ -1242,7 +1249,11 @@ standard_ProcessUtility(Node *parsetree, #endif completionTag); else +#ifdef PGXC + ExecDropStmt(stmt, queryString, sentToRemote, isTopLevel); +#else ExecDropStmt(stmt, isTopLevel); +#endif } break; @@ -1546,7 +1557,6 @@ ProcessUtilitySlow(Node *parsetree, PoolManagerSetCommand(POOL_CMD_TEMP, NULL); #endif #endif -+ /* Create the table itself */ relOid = DefineRelation((CreateStmt *) stmt, @@ -2221,7 +2231,11 @@ ProcessUtilitySlow(Node *parsetree, #endif case T_DropStmt: +#ifdef PGXC + ExecDropStmt((DropStmt *) parsetree, queryString, sentToRemote, isTopLevel); +#else ExecDropStmt((DropStmt *) parsetree, isTopLevel); +#endif break; case T_RenameStmt: @@ -2281,7 +2295,14 @@ ProcessUtilitySlow(Node *parsetree, * Dispatch function for DropStmt */ static void +#ifdef PGXC +ExecDropStmt(DropStmt *stmt, + const char *queryString, + bool sentToRemote, + bool isTopLevel) +#else ExecDropStmt(DropStmt *stmt, bool isTopLevel) +#endif { switch (stmt->removeType) { @@ -2302,7 +2323,7 @@ ExecDropStmt(DropStmt *stmt, bool isTopLevel) RemoteQueryExecType exec_type = EXEC_ON_ALL_NODES; /* Check restrictions on objects dropped */ - DropStmtPreTreatment((DropStmt *) parsetree, queryString, sentToRemote, + DropStmtPreTreatment((DropStmt *) stmt, queryString, sentToRemote, &is_temp, &exec_type); #endif RemoveRelations(stmt); @@ -2321,7 +2342,7 @@ ExecDropStmt(DropStmt *stmt, bool isTopLevel) RemoteQueryExecType exec_type = EXEC_ON_ALL_NODES; /* Check restrictions on objects dropped */ - DropStmtPreTreatment((DropStmt *) parsetree, queryString, sentToRemote, + DropStmtPreTreatment((DropStmt *) stmt, queryString, sentToRemote, &is_temp, &exec_type); #endif RemoveObjects(stmt); diff --git a/src/backend/utils/adt/pseudotypes.c b/src/backend/utils/adt/pseudotypes.c index 25ca02211d..cd9660c3fb 100644 --- a/src/backend/utils/adt/pseudotypes.c +++ b/src/backend/utils/adt/pseudotypes.c @@ -33,6 +33,7 @@ #include "utils/rangetypes.h" #ifdef XCP #include "access/htup.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "utils/lsyscache.h" #include "utils/syscache.h" diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index e38d5f18c6..20e6f80d82 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -4340,7 +4340,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, void deparse_query(Query *query, StringInfo buf, List *parentnamespace) { - get_query_def(query, buf, parentnamespace, NULL, 0, 0); + get_query_def(query, buf, parentnamespace, NULL, 0, 0, 0); } /* code borrowed from get_insert_query_def */ @@ -4364,7 +4364,7 @@ get_query_def_from_valuesList(Query *query, StringInfo buf) * consistent results. Note we assume it's OK to scribble on the passed * querytree! */ - AcquireRewriteLocks(query, false); + AcquireRewriteLocks(query, false, false); context.buf = buf; context.namespaces = NIL; @@ -4373,11 +4373,10 @@ get_query_def_from_valuesList(Query *query, StringInfo buf) context.varprefix = (list_length(query->rtable) != 1); context.prettyFlags = 0; context.indentLevel = 0; -#ifdef PGXC -#ifndef XCP + context.wrapColumn = 0; +#ifndef XCP context.finalise_aggs = query->qry_finalise_aggs; -#endif /* XCP */ -#endif /* PGXC */ +#endif dpns.rtable = query->rtable; dpns.ctes = query->cteList; @@ -4473,7 +4472,8 @@ get_query_def_from_valuesList(Query *query, StringInfo buf) { /* Add the SELECT */ get_query_def(select_rte->subquery, buf, NIL, NULL, - context.prettyFlags, context.indentLevel); + context.prettyFlags, context.wrapColumn, + context.indentLevel); } else if (values_rte) { @@ -9095,7 +9095,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) */ appendStringInfo(buf, " %s", quote_identifier(rte->eref->aliasname)); - gavealias = true; + printalias = true; } #endif else if (rte->rtekind == RTE_FUNCTION) diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index 024d7ad911..fba60a20b9 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -21,6 +21,9 @@ #include "postgres.h" #include "access/hash.h" +#ifdef PGXC +#include "commands/prepare.h" +#endif #include "storage/predicate.h" #include "storage/proc.h" #include "utils/memutils.h" @@ -415,7 +418,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, char *stmt = owner->stmts + ((owner->nstmts - 1) * CNAME_MAXLEN); if (isCommit) PrintPreparedStmtLeakWarning(stmt); - DropPreparedStatement(stmt); + DropPreparedStatement(stmt, false); } #endif |