diff options
author | Andrei Martsinchyk | 2014-06-06 11:04:44 +0000 |
---|---|---|
committer | Pavan Deolasee | 2014-09-01 14:20:28 +0000 |
commit | 15b720fb3f9f6c8557a626f895e654013313ded1 (patch) | |
tree | 7b83d68773a8c9530ceaa589cdf19fc048093815 | |
parent | 61f2c978d89475e7123e32479e2f30a743fdbe19 (diff) |
Many compiler warnings are fixed.
Many of the fixes are contributed by Pavan Deolasee
30 files changed, 65 insertions, 53 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index eee79ce74a..5aafe6817e 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -25,6 +25,10 @@ #include <netinet/in.h> #include <arpa/inet.h> +#ifdef XCP +#include "pgstat.h" +#endif + #include "access/heapam.h" #include "access/sysattr.h" #include "access/xact.h" diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index e638d2898b..14291a26a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -57,6 +57,7 @@ #include "pgxc/pgxc.h" #endif #ifdef XCP +#include "access/visibilitymap.h" #include "executor/executor.h" #include "nodes/makefuncs.h" #include "pgxc/execRemote.h" diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 7685152285..17eec5cb25 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -399,7 +399,7 @@ ExecFinishInitProcNode(PlanState *node) case T_AppendState: { - AppendState *append = (RemoteSubplanState *) node; + AppendState *append = (AppendState *) node; int i; for (i = 0; i < append->as_nplans; i++) diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 0652e9d34b..9f171d4e4d 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -102,6 +102,7 @@ #include "utils/typcache.h" #ifdef XCP #include "pgxc/pgxc.h" +#include "utils/memutils.h" #endif static TupleDesc ExecTypeFromTLInternal(List *targetList, diff --git a/src/backend/executor/producerReceiver.c b/src/backend/executor/producerReceiver.c index b7339f16c6..3b82a0acef 100644 --- a/src/backend/executor/producerReceiver.c +++ b/src/backend/executor/producerReceiver.c @@ -257,7 +257,6 @@ void SetProducerTempMemory(DestReceiver *self, MemoryContext tmpcxt) { ProducerState *myState = (ProducerState *) self; - DestReceiver *oldconsumer; Assert(myState->pub.mydest == DestProducer); myState->tmpcxt = tmpcxt; diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 6817fe73a1..4e4603cd4d 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -2381,7 +2381,7 @@ _equalXmlSerialize(const XmlSerialize *a, const XmlSerialize *b) #ifdef XCP static bool -_equalDistribution(Distribution *a, Distribution *b) +_equalDistribution(const Distribution *a, const Distribution *b) { COMPARE_SCALAR_FIELD(distributionType); COMPARE_NODE_FIELD(distributionExpr); @@ -2497,7 +2497,7 @@ _equalBarrierStmt(const BarrierStmt *a, const BarrierStmt *b) * Lock Cluster stuff */ static bool -_equalPauseClusterStmt(PauseClusterStmt *a, PauseClusterStmt *b) +_equalPauseClusterStmt(const PauseClusterStmt *a, const PauseClusterStmt *b) { COMPARE_SCALAR_FIELD(pause); return true; diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 88a6ca1eae..b2d9f968d6 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -6180,7 +6180,6 @@ make_windowagg(PlannerInfo *root, List *tlist, WindowAgg *node = makeNode(WindowAgg); Plan *plan = &node->plan; Path windowagg_path; /* dummy for result of cost_windowagg */ - QualCost qual_cost; node->winref = winref; node->partNumCols = partNumCols; diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index b8e8f6fc11..79dc1dab43 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -1880,7 +1880,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) if (!IsA(sort_plan, Sort)) { RemoteSubplan *pushdown; - pushdown = find_push_down_plan(sort_plan, true); + pushdown = find_push_down_plan((Plan *)sort_plan, true); Assert(pushdown && pushdown->sort); get_column_info_for_window(root, wc, tlist, pushdown->sort->numCols, diff --git a/src/backend/pgxc/copy/remotecopy.c b/src/backend/pgxc/copy/remotecopy.c index 2422f25de8..f9a9f20b77 100644 --- a/src/backend/pgxc/copy/remotecopy.c +++ b/src/backend/pgxc/copy/remotecopy.c @@ -47,8 +47,6 @@ RemoteCopy_GetRelationLoc(RemoteCopyData *state, { #ifndef XCP ExecNodes *exec_nodes = makeNode(ExecNodes); -#else - ExecNodes *exec_nodes = NULL; #endif /* diff --git a/src/backend/pgxc/locator/locator.c b/src/backend/pgxc/locator/locator.c index ff531649cb..96e6716fc4 100644 --- a/src/backend/pgxc/locator/locator.c +++ b/src/backend/pgxc/locator/locator.c @@ -1275,7 +1275,7 @@ createLocator(char locatorType, RelationAccessType accessType, { Locator *locator; ListCell *lc; - void *nodeMap; + void *nodeMap = NULL; int i; locator = (Locator *) palloc(sizeof(Locator)); @@ -1287,7 +1287,6 @@ createLocator(char locatorType, RelationAccessType accessType, { case LOCATOR_LIST_NONE: /* No map, return indexes */ - nodeMap = NULL; break; case LOCATOR_LIST_INT: /* Copy integer array */ diff --git a/src/backend/pgxc/locator/redistrib.c b/src/backend/pgxc/locator/redistrib.c index 98a6f6e355..8a5ab4e551 100644 --- a/src/backend/pgxc/locator/redistrib.c +++ b/src/backend/pgxc/locator/redistrib.c @@ -469,10 +469,10 @@ distrib_copy_from(RedistribState *distribState, ExecNodes *exec_nodes) TupleDesc tupdesc; #ifdef XCP /* May be needed to decode partitioning value */ - int partIdx; + int partIdx = -1; FmgrInfo in_function; Oid typioparam; - int typmod; + int typmod = 0; #endif /* Nothing to do if on remote node */ @@ -577,6 +577,7 @@ distrib_copy_from(RedistribState *distribState, ExecNodes *exec_nodes) */ fields = CopyOps_RawDataToArrayField(tupdesc, data, len - 1); + Assert(partIdx >= 0); /* Determine partitioning value */ if (fields[partIdx]) { diff --git a/src/backend/pgxc/nodemgr/nodemgr.c b/src/backend/pgxc/nodemgr/nodemgr.c index dc77212dfd..844c2fa9f2 100644 --- a/src/backend/pgxc/nodemgr/nodemgr.c +++ b/src/backend/pgxc/nodemgr/nodemgr.c @@ -206,7 +206,7 @@ check_node_options(const char *node_name, List *options, char **node_host, node_name))); #ifdef XCP - if (node_type == PGXC_NODE_DATANODE && NumDataNodes >= MaxDataNodes) + if (*node_type == PGXC_NODE_DATANODE && NumDataNodes >= MaxDataNodes) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("Too many datanodes, current value of max_data_nodes is %d", @@ -607,7 +607,10 @@ PgxcNodeAlter(AlterNodeStmt *stmt) { const char *node_name = stmt->node_name; char *node_host; - char node_type, node_type_old; + char node_type; +#ifndef XCP + char node_type_old; +#endif int node_port; bool is_preferred; bool is_primary; @@ -649,7 +652,9 @@ PgxcNodeAlter(AlterNodeStmt *stmt) is_preferred = is_pgxc_nodepreferred(nodeOid); is_primary = is_pgxc_nodeprimary(nodeOid); node_type = get_pgxc_nodetype(nodeOid); +#ifndef XCP node_type_old = node_type; +#endif node_id = get_pgxc_node_id(nodeOid); /* Filter options */ diff --git a/src/backend/pgxc/plan/planner.c b/src/backend/pgxc/plan/planner.c index d294063f5c..7d6692c458 100644 --- a/src/backend/pgxc/plan/planner.c +++ b/src/backend/pgxc/plan/planner.c @@ -2166,7 +2166,7 @@ PlannedStmt * pgxc_direct_planner(Query *query, int cursorOptions, ParamListInfo boundParams) { PlannedStmt *result; - RemoteQuery *query_step; + RemoteQuery *query_step = NULL; /* build the PlannedStmt result */ result = makeNode(PlannedStmt); @@ -2190,6 +2190,7 @@ pgxc_direct_planner(Query *query, int cursorOptions, ParamListInfo boundParams) } } + Assert(query_step); /* Optimize multi-node handling */ query_step->read_only = query->commandType == CMD_SELECT; diff --git a/src/backend/pgxc/pool/execRemote.c b/src/backend/pgxc/pool/execRemote.c index 14c75747c0..d4cc1dd17d 100644 --- a/src/backend/pgxc/pool/execRemote.c +++ b/src/backend/pgxc/pool/execRemote.c @@ -1629,7 +1629,7 @@ FetchTuple(ResponseCombiner *combiner) /* Advance subplan in a loop until we have something to return */ for (;;) { - Datum value = NULL; + Datum value = (Datum) 0; bool isnull; int numnodes; int i; @@ -2474,7 +2474,6 @@ is_data_node_ready(PGXCNodeHandle * conn) char *msg; int msg_len; char msg_type; - bool suspended = false; for (;;) { @@ -2496,23 +2495,18 @@ is_data_node_ready(PGXCNodeHandle * conn) return false; msg_type = get_message(conn, &msg_len, &msg); - switch (msg_type) + if (msg_type == 'Z') { - case 's': /* PortalSuspended */ - suspended = true; - break; - - case 'Z': /* ReadyForQuery */ - /* - * Return result depends on previous connection state. - * If it was PORTAL_SUSPENDED Coordinator want to send down - * another EXECUTE to fetch more rows, otherwise it is done - * with the connection - */ - conn->transaction_status = msg[0]; - conn->state = DN_CONNECTION_STATE_IDLE; - conn->combiner = NULL; - return true; + /* + * Return result depends on previous connection state. + * If it was PORTAL_SUSPENDED Coordinator want to send down + * another EXECUTE to fetch more rows, otherwise it is done + * with the connection + */ + conn->transaction_status = msg[0]; + conn->state = DN_CONNECTION_STATE_IDLE; + conn->combiner = NULL; + return true; } } /* never happen, but keep compiler quiet */ @@ -9068,7 +9062,7 @@ get_success_nodes(int node_count, PGXCNodeHandle **handles, char node_type, Stri for (i = 0; i < node_count; i++) { PGXCNodeHandle *handle = handles[i]; - int nodenum = PGXCNodeGetNodeId(handle->nodeoid, node_type); + int nodenum = PGXCNodeGetNodeId(handle->nodeoid, &node_type); if (!handle->error) { diff --git a/src/backend/pgxc/pool/pgxcnode.c b/src/backend/pgxc/pool/pgxcnode.c index 0431a2257b..0a40dfbfc0 100644 --- a/src/backend/pgxc/pool/pgxcnode.c +++ b/src/backend/pgxc/pool/pgxcnode.c @@ -2742,6 +2742,7 @@ PGXCNodeResetParams(bool only_local) } +#ifdef NOT_USED static char * quote_ident_cstr(char *rawstr) { @@ -2756,6 +2757,8 @@ quote_ident_cstr(char *rawstr) return result; } +#endif + static void get_set_command(HTAB *table, StringInfo command, bool local) diff --git a/src/backend/pgxc/squeue/squeue.c b/src/backend/pgxc/squeue/squeue.c index 0418779199..82ecfb39f1 100644 --- a/src/backend/pgxc/squeue/squeue.c +++ b/src/backend/pgxc/squeue/squeue.c @@ -1005,7 +1005,7 @@ SharedQueueReset(SharedQueue squeue, int consumerIdx) * That should allow to Finish/UnBind the queue gracefully and prevent * producer hanging. */ -int +void SharedQueueResetNotConnected(SharedQueue squeue) { SQueueSync *sqsync = squeue->sq_sync; diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c index e7fc308e7d..0f6cf950f3 100644 --- a/src/backend/tcop/dest.c +++ b/src/backend/tcop/dest.c @@ -170,6 +170,7 @@ EndCommand(const char *commandTag, CommandDest dest) case DestIntoRel: case DestCopyOut: case DestSQLFunction: + case DestProducer: break; } } @@ -211,6 +212,7 @@ NullCommand(CommandDest dest) case DestIntoRel: case DestCopyOut: case DestSQLFunction: + case DestProducer: break; } } @@ -254,6 +256,7 @@ ReadyForQuery(CommandDest dest) case DestIntoRel: case DestCopyOut: case DestSQLFunction: + case DestProducer: break; } } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 53fdaf4e12..eb234a0806 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -1695,7 +1695,7 @@ exec_plan_message(const char *query_string, /* source of the query */ MemoryContext oldcontext; bool save_log_statement_stats = log_statement_stats; char msec_str[32]; - Oid *paramTypes; + Oid *paramTypes = NULL; CachedPlanSource *psrc; /* Statement name should not be empty */ @@ -4941,8 +4941,6 @@ PostgresMain(int argc, char *argv[], const char *username) /* can't get here because the above loop never exits */ Assert(false); - - return 1; /* keep compiler quiet */ } diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index 35e171017e..63f6dde981 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -1000,7 +1000,7 @@ pgxc_execute_on_nodes(int numnodes, Oid *nodelist, char *query) bool isnull; char *nodename; #endif - Datum datum; + Datum datum = (Datum) 0; #ifdef XCP EState *estate; diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index c34d514997..bd33e39cb6 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -77,8 +77,10 @@ #include "pgxc/pgxc.h" +#ifndef XCP static void drop_datanode_statements(Plan *plannode); #endif +#endif /* @@ -1126,6 +1128,7 @@ GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams, * Find and release all Datanode statements referenced by the plan node and subnodes */ #ifdef PGXC +#ifndef XCP static void drop_datanode_statements(Plan *plannode) { @@ -1144,6 +1147,7 @@ drop_datanode_statements(Plan *plannode) drop_datanode_statements(outerPlan(plannode)); } #endif +#endif /* * ReleaseCachedPlan: release active use of a cached plan. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index cdd82bcdc4..429ab9c067 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3689,8 +3689,9 @@ static struct config_enum ConfigureNamesEnum[] = {"remotetype", PGC_BACKEND, CONN_AUTH, #ifdef XCP gettext_noop("Sets the type of Postgres-XL remote connection"), -#endif +#else gettext_noop("Sets the type of Postgres-XC remote connection"), +#endif NULL }, &remoteConnType, diff --git a/src/gtm/client/fe-protocol.c b/src/gtm/client/fe-protocol.c index 1ebf067ec9..7ef689042e 100644 --- a/src/gtm/client/fe-protocol.c +++ b/src/gtm/client/fe-protocol.c @@ -587,7 +587,7 @@ gtmpqParseSuccess(GTM_Conn *conn, GTM_Result *result) } result->gr_resdata.grd_seq_list.seq = - (GTM_SeqInfo **)malloc(sizeof(GTM_SeqInfo) * + (GTM_SeqInfo *)malloc(sizeof(GTM_SeqInfo) * result->gr_resdata.grd_seq_list.seq_count); for (i = 0 ; i < result->gr_resdata.grd_seq_list.seq_count; i++) diff --git a/src/gtm/common/gtm_serialize.c b/src/gtm/common/gtm_serialize.c index 9b870957b9..a73a67b548 100644 --- a/src/gtm/common/gtm_serialize.c +++ b/src/gtm/common/gtm_serialize.c @@ -824,7 +824,7 @@ gtm_serialize_pgxcnodeinfo(GTM_PGXCNodeInfo *data, char *buf, size_t buflen) */ #ifdef XCP size_t -gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *data, const char *buf, size_t buflen, PQExpBuffer *errorbuf) +gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *data, const char *buf, size_t buflen, PQExpBuffer errorbuf) #else size_t gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *data, const char *buf, size_t buflen) diff --git a/src/gtm/libpq/pqcomm.c b/src/gtm/libpq/pqcomm.c index d9a19a4707..f123b8f139 100644 --- a/src/gtm/libpq/pqcomm.c +++ b/src/gtm/libpq/pqcomm.c @@ -133,7 +133,6 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber, { int fd, err; - int maxconn; int ret; char portNumberStr[32]; const char *familyDesc; diff --git a/src/gtm/main/gtm_txn.c b/src/gtm/main/gtm_txn.c index 475a861458..6fe3370ba9 100644 --- a/src/gtm/main/gtm_txn.c +++ b/src/gtm/main/gtm_txn.c @@ -493,7 +493,8 @@ GTM_SetDoVacuum(GTM_TransactionHandle handle) GlobalTransactionId GTM_GetGlobalTransactionIdMulti(GTM_TransactionHandle handle[], int txn_count) { - GlobalTransactionId xid, start_xid = InvalidGlobalTransactionId; + GlobalTransactionId xid = InvalidGlobalTransactionId; + GlobalTransactionId start_xid = InvalidGlobalTransactionId; GTM_TransactionInfo *gtm_txninfo = NULL; int ii; #ifdef XCP @@ -581,7 +582,8 @@ GTM_GetGlobalTransactionIdMulti(GTM_TransactionHandle handle[], int txn_count) /* Periodically write the xid and sequence info out to the control file. * Try and handle wrapping, too. */ - if (xid - ControlXid > CONTROL_INTERVAL || xid < ControlXid) + if (GlobalTransactionIdIsValid(xid) && + (xid - ControlXid > CONTROL_INTERVAL || xid < ControlXid)) { save_control = true; ControlXid = xid; @@ -1272,7 +1274,7 @@ GTM_BkupBeginTransactionGetGXIDMulti(char *coord_name, #ifdef XCP bool save_control = false; - GlobalTransactionId xid; + GlobalTransactionId xid = InvalidGlobalTransactionId; #endif oldContext = MemoryContextSwitchTo(TopMostMemoryContext); @@ -1309,7 +1311,8 @@ GTM_BkupBeginTransactionGetGXIDMulti(char *coord_name, /* Periodically write the xid and sequence info out to the control file. * Try and handle wrapping, too. */ - if (xid - ControlXid > CONTROL_INTERVAL || xid < ControlXid) + if (GlobalTransactionIdIsValid(xid) && + (xid - ControlXid > CONTROL_INTERVAL || xid < ControlXid)) { save_control = true; ControlXid = xid; diff --git a/src/gtm/recovery/register_common.c b/src/gtm/recovery/register_common.c index 4de2299b47..9f579a8c58 100644 --- a/src/gtm/recovery/register_common.c +++ b/src/gtm/recovery/register_common.c @@ -819,7 +819,6 @@ Recovery_PGXCNodeRegisterCoordProcess(char *coord_node, int coord_procid, int coord_backendid) { GTM_PGXCNodeInfo *nodeinfo; - GTM_PGXCSession *session; int i; /* diff --git a/src/include/gtm/gtm_serialize.h b/src/include/gtm/gtm_serialize.h index 2cabeb1a5e..8d4077500e 100644 --- a/src/include/gtm/gtm_serialize.h +++ b/src/include/gtm/gtm_serialize.h @@ -37,7 +37,7 @@ size_t gtm_deserialize_transactions(GTM_Transactions *, const char *, size_t); size_t gtm_get_pgxcnodeinfo_size(GTM_PGXCNodeInfo *); size_t gtm_serialize_pgxcnodeinfo(GTM_PGXCNodeInfo *, char *, size_t); #ifdef XCP -size_t gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *, const char *, size_t, PQExpBuffer *); +size_t gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *, const char *, size_t, PQExpBuffer); #else size_t gtm_deserialize_pgxcnodeinfo(GTM_PGXCNodeInfo *, const char *, size_t); #endif diff --git a/src/include/pgxc/execRemote.h b/src/include/pgxc/execRemote.h index f52bb3181b..d596f95efc 100644 --- a/src/include/pgxc/execRemote.h +++ b/src/include/pgxc/execRemote.h @@ -374,6 +374,7 @@ extern bool FinishRemotePreparedTransaction(char *prepareGID, bool commit); extern void ExecSetTempObjectIncluded(void); extern bool ExecIsTempObjectIncluded(void); extern void ExecRemoteQueryStandard(Relation resultRelationDesc, RemoteQueryState *resultRemoteRel, TupleTableSlot *slot); +#endif extern void pgxc_all_success_nodes(ExecNodes **d_nodes, ExecNodes **c_nodes, char **failednodes_msg); extern void AtEOXact_DBCleanup(bool isCommit); @@ -381,4 +382,3 @@ extern void AtEOXact_DBCleanup(bool isCommit); extern void set_dbcleanup_callback(xact_callback function, void *paraminfo, int paraminfo_size); #endif -#endif diff --git a/src/include/pgxc/squeue.h b/src/include/pgxc/squeue.h index 4cac658fb4..ad1873e0a0 100644 --- a/src/include/pgxc/squeue.h +++ b/src/include/pgxc/squeue.h @@ -54,7 +54,7 @@ extern void SharedQueueWrite(SharedQueue squeue, int consumerIdx, extern bool SharedQueueRead(SharedQueue squeue, int consumerIdx, TupleTableSlot *slot, bool canwait); extern void SharedQueueReset(SharedQueue squeue, int consumerIdx); -extern int SharedQueueResetNotConnected(SharedQueue squeue); +extern void SharedQueueResetNotConnected(SharedQueue squeue); extern bool SharedQueueCanPause(SharedQueue squeue); #endif diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 3a5b6a6053..d7d68e92ab 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -376,8 +376,8 @@ typedef struct StdRdOptions */ #ifdef XCP #define RelationUsesLocalBuffers(relation) \ - !OidIsValid(MyCoordId) && \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP) + (!OidIsValid(MyCoordId) && \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)) #else #define RelationUsesLocalBuffers(relation) \ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP) |