static int extractFrozenQueryPlanAndExecute(char *pcQuery) { Assert(pcQuery); ULONG ulQueryLen = -1; memcpy(&ulQueryLen, pcQuery, sizeof(ULONG)); pcQuery+=sizeof(ULONG); Query *pquery = (Query *) readNodeFromBinaryString(pcQuery, ulQueryLen); pcQuery+=ulQueryLen; PlannedStmt *pplstmt = pg_plan_query(pquery, NULL); if (!pplstmt) { elog(ERROR, "Problem with planned statement of query tree %s", gpdb::SzNodeToString(pquery)); } // The following steps are required to be able to execute the query. DestReceiver *pdest = CreateDestReceiver(DestNone, NULL); QueryDesc *pqueryDesc = CreateQueryDesc(pplstmt, PStrDup("Internal Query") /*plan->query */, ActiveSnapshot, InvalidSnapshot, pdest, NULL /*paramLI*/, false); // Do not record gpperfmon information about internal queries pqueryDesc->gpmon_pkt = NULL; elog(NOTICE, "Executing thawed plan..."); ExecutorStart(pqueryDesc, 0); ExecutorRun(pqueryDesc, ForwardScanDirection, 0); ExecutorEnd(pqueryDesc); int iProcessed = (int) pqueryDesc->es_processed; FreeQueryDesc(pqueryDesc); return iProcessed; }
static int extractFrozenPlanAndExecute(char *pcSerializedPS) { Assert(pcSerializedPS); ULONG ulPlannedStmtLen = -1; memcpy(&ulPlannedStmtLen, pcSerializedPS, sizeof(ULONG)); pcSerializedPS+=sizeof(ULONG); PlannedStmt *pplstmt = (PlannedStmt *) readNodeFromBinaryString(pcSerializedPS, ulPlannedStmtLen); pcSerializedPS+=ulPlannedStmtLen; //The following steps are required to be able to execute the query. DestReceiver *pdest = CreateDestReceiver(DestNone, NULL); QueryDesc *pqueryDesc = CreateQueryDesc(pplstmt, PStrDup("Internal Query") /*plan->query */, ActiveSnapshot, InvalidSnapshot, pdest, NULL /*paramLI*/, false); // Do not record gpperfmon information about internal queries pqueryDesc->gpmon_pkt = NULL; elog(NOTICE, "Executing thawed plan..."); ExecutorStart(pqueryDesc, 0); ExecutorRun(pqueryDesc, ForwardScanDirection, 0); ExecutorEnd(pqueryDesc); int iProcessed = (int) pqueryDesc->es_processed; FreeQueryDesc(pqueryDesc); return iProcessed; }
/* * deserializeNode - * This is used on the qExecs to deserialize serialized Plan and Query Trees * received from the dispatcher. * The returned node is palloc'ed in the current memory context. */ Node * deserializeNode(const char *strNode, int size) { char *sNode; Node *node; int uncompressed_len; Assert(strNode != NULL); START_MEMORY_ACCOUNT(MemoryAccounting_CreateAccount(0, MEMORY_OWNER_TYPE_Deserializer)); { sNode = uncompress_string(strNode, size, &uncompressed_len); Assert(sNode != NULL); node = readNodeFromBinaryString(sNode, uncompressed_len); pfree(sNode); } END_MEMORY_ACCOUNT(); return node; }