//////////////////////////////////////////////////////////////// // Constructor for class ExExeUtilTcb /////////////////////////////////////////////////////////////// ExExeUtilTcb::ExExeUtilTcb(const ComTdbExeUtil & exe_util_tdb, const ex_tcb * child_tcb, // for child queue ex_globals * glob) : ex_tcb( exe_util_tdb, 1, glob), workAtp_(NULL), query_(NULL), infoList_(NULL), infoListIsOutputInfo_(TRUE), explQuery_(NULL), childQueryId_(NULL), childQueryIdLen_(0), outputBuf_(NULL) { Space * space = (glob ? glob->getSpace() : 0); CollHeap * heap = (glob ? glob->getDefaultHeap() : 0); // Allocate the buffer pool #pragma nowarn(1506) // warning elimination pool_ = new(space) sql_buffer_pool(exe_util_tdb.numBuffers_, exe_util_tdb.bufferSize_, space); #pragma warn(1506) // warning elimination childTcb_ = child_tcb; if (childTcb_) { qchild_ = childTcb_->getParentQueue(); } // Allocate the queue to communicate with parent qparent_.down = new(space) ex_queue(ex_queue::DOWN_QUEUE, exe_util_tdb.queueSizeDown_, exe_util_tdb.criDescDown_, space); qparent_.up = new(space) ex_queue(ex_queue::UP_QUEUE, exe_util_tdb.queueSizeUp_, exe_util_tdb.criDescUp_, space); if (exe_util_tdb.workCriDesc_) { workAtp_ = allocateAtp(exe_util_tdb.workCriDesc_, glob->getSpace()); pool_->get_free_tuple(workAtp_->getTupp(((ComTdbExeUtil&)exe_util_tdb).workAtpIndex()), 0); } tcbFlags_ = 0; if (exe_util_tdb.inputExpr_) (void)exe_util_tdb.inputExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); if (exe_util_tdb.outputExpr_) (void)exe_util_tdb.outputExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); if (exe_util_tdb.scanExpr_) (void)exe_util_tdb.scanExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); ContextCli * currContext = (glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals() ? glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()->getStatement()->getContext() : NULL); // internal queries are already in isoMapping and do not need to be // translated before sending to mxcmp. // Set the ISO_MAPPING charset code to indicate that. char *parentQid; if (glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()) parentQid = glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()->getStatement()->getUniqueStmtId(); else if (glob->castToExExeStmtGlobals()->castToExEspStmtGlobals() && glob->castToExExeStmtGlobals()->castToExEspStmtGlobals()->getStmtStats()) parentQid = glob->castToExExeStmtGlobals()->castToExEspStmtGlobals()->getStmtStats()->getQueryId(); else parentQid = NULL; cliInterface_ = new(heap) ExeCliInterface(heap, SQLCHARSETCODE_ISO88591, // ISO_MAPPING=ISO88591 currContext, parentQid); cliInterface2_ = new(heap) ExeCliInterface(heap, SQLCHARSETCODE_ISO88591, // ISO_MAPPING=ISO88591 currContext, parentQid); //diagsArea_ = NULL; setDiagsArea(ComDiagsArea::allocate(getHeap())); pqStep_ = PROLOGUE_; VersionToString(COM_VERS_MXV, versionStr_); versionStrLen_ = DIGITS_IN_VERSION_NUMBER; VersionToString(COM_VERS_MXV, sysVersionStr_); sysVersionStrLen_ = DIGITS_IN_VERSION_NUMBER; extractedPartsObj_ = NULL; };
short ExExeUtilPopulateInMemStatsTcb::work() { // short rc = 0; Lng32 cliRC = 0; // if no parent request, return if (qparent_.down->isEmpty()) return WORK_OK; // if no room in up queue, won't be able to return data/status. // Come back later. if (qparent_.up->isFull()) return WORK_OK; ex_queue_entry * pentry_down = qparent_.down->getHeadEntry(); ExExeUtilPrivateState & pstate = *((ExExeUtilPrivateState*) pentry_down->pstate); // Get the globals stucture of the master executor. ExExeStmtGlobals *exeGlob = getGlobals()->castToExExeStmtGlobals(); ExMasterStmtGlobals *masterGlob = exeGlob->castToExMasterStmtGlobals(); ContextCli * currContext = masterGlob->getStatement()->getContext(); while (1) { switch (step_) { case INITIAL_: { if (getDiagsArea()) { getDiagsArea()->clear(); getDiagsArea()->deAllocate(); } setDiagsArea(ComDiagsArea::allocate(getHeap())); step_ = PROLOGUE_; } break; case PROLOGUE_: { if (disableCQS()) { step_ = ERROR_; break; } if (setSchemaVersion(pimsTdb().sourceTableCatName_)) { step_ = ERROR_; break; } // set sqlparserflags to allow use of volatile schema in queries. masterGlob->getStatement()->getContext()-> setSqlParserFlags(0x10000);//ALLOW_VOLATILE_SCHEMA_IN_TABLE_NAME step_ = DELETE_STATS_; } break; case DELETE_STATS_: { Int32 qry_array_size = sizeof(deleteStatsQuery) / sizeof(QueryString); const QueryString * queryString = deleteStatsQuery;; char * gluedQuery; Lng32 gluedQuerySize; glueQueryFragments(qry_array_size, queryString, gluedQuery, gluedQuerySize); Lng32 extraSpace = ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /* fullyQualTableName */ + 20 /* UID */ + 200 /* overhead */; char * query = new(getHeap()) char[gluedQuerySize + extraSpace]; str_sprintf(query, gluedQuery, (char*)pimsTdb().inMemHistogramsTableName_, pimsTdb().uid_); cliRC = cliInterface()->executeImmediate(query); if (cliRC >= 0) { str_sprintf(query, gluedQuery, (char*)pimsTdb().inMemHistintsTableName_, pimsTdb().uid_); cliRC = cliInterface()->executeImmediate(query); } // Delete new'd string NADELETEBASIC(gluedQuery, getHeap()); gluedQuery = NULL; NADELETEBASIC(query, getHeap()); query = NULL; if (cliRC < 0) { cliInterface()->allocAndRetrieveSQLDiagnostics(diagsArea_); step_ = ERROR_; } else step_ = POPULATE_HISTOGRAMS_STATS_; } break; case POPULATE_HISTOGRAMS_STATS_: { Int32 qry_array_size = sizeof(populateHistogramsStatsQuery) / sizeof(QueryString); const QueryString * queryString = populateHistogramsStatsQuery;; char * gluedQuery; Lng32 gluedQuerySize; glueQueryFragments(qry_array_size, queryString, gluedQuery, gluedQuerySize); Lng32 extraSpace = ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /* fullyQualInMemHistTableName */ + 20 /* UID */ + ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /* fullyQualSourceHistTableName */ + 2 * 10 /*segment name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*cat name*/ + 10 /*version*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*cat name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*sch name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*obj name*/ + 200 /* overhead */; char * query = new(getHeap()) char[gluedQuerySize + extraSpace]; str_sprintf(query, gluedQuery, (char*)pimsTdb().inMemHistogramsTableName_, pimsTdb().uid_, (char*)pimsTdb().sourceHistogramsTableName_, (char*)pimsTdb().sourceTableCatName_, (char*)pimsTdb().sourceTableCatName_, (char*)pimsTdb().sourceTableSchName_, (char*)pimsTdb().sourceTableObjName_ ); cliRC = cliInterface()->executeImmediate(query); // Delete new'd string NADELETEBASIC(gluedQuery, getHeap()); gluedQuery = NULL; NADELETEBASIC(query, getHeap()); query = NULL; if (cliRC < 0) { cliInterface()->allocAndRetrieveSQLDiagnostics(diagsArea_); step_ = ERROR_; } else step_ = POPULATE_HISTINTS_STATS_; } break; case POPULATE_HISTINTS_STATS_: { Int32 qry_array_size = sizeof(populateHistintsStatsQuery) / sizeof(QueryString); const QueryString * queryString = populateHistintsStatsQuery;; char * gluedQuery; Lng32 gluedQuerySize; glueQueryFragments(qry_array_size, queryString, gluedQuery, gluedQuerySize); Lng32 extraSpace = ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /* fullyQualInMemHistTableName */ + 20 /* UID */ + ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /* fullyQualSourceHistTableName */ + 2 * 10 /*segment name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*cat name*/ + 10 /*version*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*cat name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*sch name*/ + ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES /*obj name*/ + 200 /* overhead */; char * query = new(getHeap()) char[gluedQuerySize + extraSpace]; str_sprintf(query, gluedQuery, (char*)pimsTdb().inMemHistintsTableName_, pimsTdb().uid_, (char*)pimsTdb().sourceHistintsTableName_, (char*)pimsTdb().sourceTableCatName_, (char*)pimsTdb().sourceTableCatName_, (char*)pimsTdb().sourceTableSchName_, (char*)pimsTdb().sourceTableObjName_ ); cliRC = cliInterface()->executeImmediate(query); // Delete new'd string NADELETEBASIC(gluedQuery, getHeap()); gluedQuery = NULL; NADELETEBASIC(query, getHeap()); query = NULL; if (cliRC < 0) { cliInterface()->allocAndRetrieveSQLDiagnostics(diagsArea_); step_ = ERROR_; } else step_ = EPILOGUE_; } break; case EPILOGUE_: case EPILOGUE_AND_ERROR_RETURN_: { // reset sqlparserflags masterGlob->getStatement()->getContext()-> resetSqlParserFlags(0x10000);//ALLOW_VOLATILE_SCHEMA_IN_TABLE_NAME restoreCQS(); if (step_ == EPILOGUE_AND_ERROR_RETURN_) step_ = ERROR_RETURN_; else step_ = DONE_; } break; case ERROR_: { step_ = EPILOGUE_AND_ERROR_RETURN_; } break; case ERROR_RETURN_: { if (qparent_.up->isFull()) return WORK_OK; // Return EOF. ex_queue_entry * up_entry = qparent_.up->getTailEntry(); up_entry->upState.parentIndex = pentry_down->downState.parentIndex; up_entry->upState.setMatchNo(0); up_entry->upState.status = ex_queue::Q_SQLERROR; ComDiagsArea *diagsArea = up_entry->getDiagsArea(); if (diagsArea == NULL) diagsArea = ComDiagsArea::allocate(this->getGlobals()->getDefaultHeap()); if (getDiagsArea()) diagsArea->mergeAfter(*getDiagsArea()); up_entry->setDiagsArea (diagsArea); // insert into parent qparent_.up->insert(); step_ = DONE_; } break; case DONE_: { if (qparent_.up->isFull()) return WORK_OK; // Return EOF. ex_queue_entry * up_entry = qparent_.up->getTailEntry(); up_entry->upState.parentIndex = pentry_down->downState.parentIndex; up_entry->upState.setMatchNo(0); up_entry->upState.status = ex_queue::Q_NO_DATA; // insert into parent qparent_.up->insert(); qparent_.down->removeHead(); step_ = INITIAL_; return WORK_OK; } break; default: break; } } return 0; }