blob: e430c8595a04df126d0b96830c16d6a447239ee2 [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/* -*-C++-*-
*****************************************************************************
*
* File: SessionDefaults.cpp
* Description: Default settings for cli.
*
* Created: 9/8/2005
* Language: C++
*
*
*
*
*****************************************************************************
*/
#include "Platform.h"
#include "cli_stdh.h"
#include "ex_stdh.h"
#include "ex_tcb.h"
#include "ExExeUtil.h"
#include "SessionDefaults.h"
#include "exp_clause_derived.h"
#include "sql_id.h"
#include "SQLCLIdev.h"
#include "charinfo.h"
#include "ComRtUtils.h"
#include "ComTdbExeUtil.h"
#include "NLSConversion.h"
#define SDEntry(sesDef, sesDefStr, datatype, isCQD, defTab, isSSD, ext) {sesDef, "" # sesDefStr "", datatype, isCQD, defTab, isSSD, ext}
static const SessionDefaults::SessionDefaultMap sessionDefaultMap[] =
{
// Attribute Attr String Attr Datatype IsCQD InDef IsSSD Ext
// Table
// ==============================================================================================================================================
SDEntry(SessionDefaults::AQR_ENTRIES, AQR_ENTRIES, SessionDefaults::SDT_ASCII, FALSE, TRUE, TRUE, FALSE),
SDEntry(SessionDefaults::AUTO_QUERY_RETRY_WARNINGS,AUTO_QUERY_RETRY_WARNINGS, SessionDefaults::SDT_BOOLEAN, TRUE, TRUE, FALSE, FALSE),
SDEntry(SessionDefaults::CALL_EMBEDDED_ARKCMP, CALL_EMBEDDED_ARKCMP, SessionDefaults::SDT_BOOLEAN, TRUE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_ESCALATION_INTERVAL,CANCEL_ESCALATION_INTERVAL,SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_ESCALATION_MXOSRVR_INTERVAL,
CANCEL_ESCALATION_MXOSRVR_INTERVAL,
SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_ESCALATION_SAVEABEND,
CANCEL_ESCALATION_SAVEABEND,
SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_LOGGING, CANCEL_LOGGING, SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_QUERY_ALLOWED, CANCEL_QUERY_ALLOWED, SessionDefaults::SDT_BOOLEAN, TRUE, TRUE, TRUE, FALSE),
SDEntry(SessionDefaults::CANCEL_UNIQUE_QUERY, CANCEL_UNIQUE_QUERY, SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::CATALOG, CATALOG, SessionDefaults::SDT_ASCII, TRUE, TRUE, FALSE, FALSE),
SDEntry(SessionDefaults::COMPILER_IDLE_TIMEOUT, COMPILER_IDLE_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::DBTR_PROCESS, DBTR_PROCESS, SessionDefaults::SDT_BOOLEAN, TRUE, FALSE, FALSE, FALSE),
SDEntry(SessionDefaults::ESP_ASSIGN_DEPTH, ESP_ASSIGN_DEPTH, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_ASSIGN_TIME_WINDOW, ESP_ASSIGN_TIME_WINDOW, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_CLOSE_ERROR_LOGGING, ESP_CLOSE_ERROR_LOGGING, SessionDefaults::SDT_BOOLEAN, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_FREEMEM_TIMEOUT, ESP_FREEMEM_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_IDLE_TIMEOUT, ESP_IDLE_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_INACTIVE_TIMEOUT, ESP_INACTIVE_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_STOP_IDLE_TIMEOUT, ESP_STOP_IDLE_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::ESP_RELEASE_WORK_TIMEOUT, ESP_RELEASE_WORK_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::INTERNAL_FORMAT_IO, INTERNAL_FORMAT_IO, SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::ISO_MAPPING, ISO_MAPPING, SessionDefaults::SDT_ASCII, FALSE, TRUE, TRUE, FALSE),
SDEntry(SessionDefaults::MAX_POLLING_INTERVAL, MAX_POLLING_INTERVAL, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::PARENT_QID, PARENT_QID, SessionDefaults::SDT_ASCII, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::PARENT_QID_SYSTEM, PARENT_QID_SYSTEM, SessionDefaults::SDT_ASCII, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::PARSER_FLAGS, PARSER_FLAGS, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::PERSISTENT_OPENS, PERSISTENT_OPENS, SessionDefaults::SDT_BINARY_SIGNED, FALSE, TRUE, TRUE, TRUE),
SDEntry(SessionDefaults::RECLAIM_FREE_MEMORY_RATIO, RECLAIM_FREE_MEMORY_RATIO, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::RECLAIM_FREE_PFS_RATIO, RECLAIM_FREE_PFS_RATIO, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::RECLAIM_MEMORY_AFTER, RECLAIM_MEMORY_AFTER, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::ROWSET_ATOMICITY, ROWSET_ATOMICITY, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, FALSE, FALSE),
SDEntry(SessionDefaults::RTS_TIMEOUT, RTS_TIMEOUT, SessionDefaults::SDT_BINARY_SIGNED, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::SCHEMA, SCHEMA, SessionDefaults::SDT_ASCII, TRUE, TRUE, FALSE, FALSE),
SDEntry(SessionDefaults::STATISTICS_VIEW_TYPE, STATISTICS_VIEW_TYPE, SessionDefaults::SDT_ASCII, FALSE, FALSE, TRUE, TRUE),
SDEntry(SessionDefaults::SUSPEND_LOGGING, SUSPEND_LOGGING, SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE),
SDEntry(SessionDefaults::USE_LIBHDFS, USE_LIBHDFS, SessionDefaults::SDT_BOOLEAN, TRUE, TRUE, FALSE, FALSE),
SDEntry(SessionDefaults::USER_EXPERIENCE_LEVEL, USER_EXPERIENCE_LEVEL, SessionDefaults::SDT_ASCII, TRUE, TRUE, FALSE, FALSE),
SDEntry(SessionDefaults::WMS_PROCESS, WMS_PROCESS, SessionDefaults::SDT_BOOLEAN, FALSE, FALSE, TRUE, FALSE)
};
SessionDefaults::SessionDefaults(CollHeap * heap)
: heap_(heap),
dbtrProcess_(FALSE),
nvciProcess_(FALSE),
mariaQuestProcess_(FALSE),
internalCli_(FALSE),
espCloseErrorLogging_(FALSE), // Don't log EMS event for outstanding request at close time
cliBulkMove_(TRUE),
aqrEmsEvent_(FALSE),
aqrType_(1), // SYSTEM
catalog_(NULL),
schema_(NULL),
uel_(NULL),
internalFormatIO_(FALSE),
isoMappingName_(NULL),
isoMappingEnum_(0),
parserFlags_(0),
rowsetAtomicity_(-1),
parentQid_(NULL),
wmsProcess_(FALSE),
cancelEscalationInterval_(60),
cancelEscalationMxosrvrInterval_(120),
cancelEscalationSaveabend_(FALSE),
cancelQueryAllowed_(TRUE),
cancelUniqueQuery_(FALSE),
cancelLogging_(TRUE),
suspendLogging_(TRUE),
aqrWarn_(0),
redriveCTAS_(FALSE),
callEmbeddedArkcmp_(FALSE),
exsmTraceLevel_(0),
exsmTraceFilePrefix_(NULL)
{
parentQidSystem_[0] = '\0';
Lng32 len = sizeof(sessionDefaultMap) / sizeof(SessionDefaultMap);
ex_assert(len == LAST_SESSION_DEFAULT_ATTRIBUTE, "Mismatch between sessionDefaultMap and SessionDefaultAttribute");
defaultsValueString_ = new(heap) char * [len];
for (Int32 i = 0; i < len; i++)
{
defaultsValueString_[i] = NULL;
}
savedDefaultsValueString_ = new(heap) char * [len];
for (Int32 i = 0; i < len; i++)
{
savedDefaultsValueString_[i] = NULL;
}
setJdbcProcess(FALSE);
setOdbcProcess(FALSE);
setMxciProcess(FALSE);
char *enableValue;
enableValue = getenv("ENABLE_EMBEDDED_ARKCMP");
if (enableValue != NULL && enableValue[0] == '0')
setCallEmbeddedArkcmp(FALSE);
else
setCallEmbeddedArkcmp(TRUE);
char *espAssignDepthEnvvar = getenv("ESP_ASSIGN_DEPTH");
if (espAssignDepthEnvvar != NULL)
setEspAssignDepth(atoi(espAssignDepthEnvvar));
else
setEspAssignDepth(-1);
// Default is 60 (master won't use this esp if it has this or less seconds
// left to be idle timed out.
// This value can not be less 30, see ex_control.cpp how it is handled
// when processing this set session default command
setEspAssignTimeWindow(60);
// Default is 60 (master kills ESPs that were idling for 1 minute or more)
setEspStopIdleTimeout(60);
// Default is 1800 (idle ESPs time out in 30 minutes)
setEspIdleTimeout(30*60);
// Default is 1800 (Compiler Idle time out in 30 minutes)
setCompilerIdleTimeout(30*60);
// Default is 0 (inactive ESPs never time out)
setEspInactiveTimeout(0);
// how long master waits for release work reply from esps (default is 15
// minutes)
setEspReleaseWorkTimeout(15*60);
setMaxPollingInterval(300);
char *perOpenssEnvvar = getenv("ESP_PERSISTENT_OPENS");
if (perOpenssEnvvar != NULL)
setPersistentOpens(atoi(perOpenssEnvvar));
else
setPersistentOpens(0);
// Default idle esp freemem timeout is 10 seconds
setEspFreeMemTimeout(10);
setRtsTimeout(0);
setEspFreeMemTimeout(espFreeMemTimeout_);
setEspCloseErrorLogging(espCloseErrorLogging_);
// set the default to ISO88591
setIsoMappingName(SQLCHARSETSTRING_ISO88591, strlen(SQLCHARSETSTRING_ISO88591));
sessionEnvvars_ = new(heap) NAList<SessionEnvvar>(heap);
setParentQid(NULL, 0);
setParentQidSystem(NULL, 0);
setWmsProcess(FALSE);
aqrInfo_ = new(heap) AQRInfo(heap);
setRtsTimeout(rtsTimeout_);
setStatisticsViewType(SQLCLI_PERTABLE_STATS);
setReclaimTotalMemorySize(DEFAULT_RECLAIM_MEMORY_AFTER);
setReclaimFreeMemoryRatio(DEFAULT_RECLAIM_FREE_MEMORY_RATIO);
setReclaimFreePFSRatio(DEFAULT_RECLAIM_FREE_PFS_RATIO);
setCancelEscalationInterval(60);
setCancelEscalationMxosrvrInterval(120);
setCancelEscalationSaveabend(FALSE);
setUseLibHdfs(FALSE);
}
SessionDefaults::~SessionDefaults()
{
delete sessionEnvvars_;
}
SessionDefaults::SessionDefaultMap SessionDefaults::getSessionDefaultMap
(char * attribute, Lng32 attrLen)
{
Lng32 len = sizeof(sessionDefaultMap) / sizeof(SessionDefaultMap);
for (Int32 i = 0; i < len; i++)
{
if ((sessionDefaultMap[i].fromDefaultsTable) &&
(strcmp(sessionDefaultMap[i].attributeString, attribute)
== 0))
{
return sessionDefaultMap[i];
}
}
SessionDefaultMap sdm;
sdm.attribute = INVALID_SESSION_DEFAULT;
sdm.attributeString = NULL;
sdm.attributeType = SessionDefaults::SDT_BOOLEAN;
sdm.fromDefaultsTable = sdm.isCQD = sdm.isSSD = sdm.externalized = FALSE;
return sdm;
}
void SessionDefaults::setIsoMappingName(const char * attrValue, Lng32 attrValueLen)
{
if (isoMappingName_)
{
NADELETEBASIC(isoMappingName_, heap_);
}
isoMappingName_ = new(heap_) char[attrValueLen + 1];
strncpy(isoMappingName_, attrValue, attrValueLen);
isoMappingName_[attrValueLen] = '\0';
// upcase isoMappingName_
str_cpy_convert(isoMappingName_, isoMappingName_, attrValueLen, 1);
setIsoMappingEnum();
}
void SessionDefaults::setIsoMappingEnum()
{
isoMappingEnum_ = (Lng32)CharInfo::getCharSetEnum(isoMappingName_);
}
void SessionDefaults::setSessionDefaultAttributeValue
(SessionDefaultMap sda, char * attrValue, Lng32 attrValueLen)
{
Lng32 defaultValueAsLong = -1;
NABoolean defaultValueAsBoolean = FALSE;
if (attrValue)
{
if (sda.attributeType == SessionDefaults::SDT_BINARY_SIGNED)
{
ex_expr::exp_return_type rc =
convDoIt(attrValue, attrValueLen, REC_BYTE_F_ASCII,
0, 0,
(char*)&defaultValueAsLong, sizeof(Lng32),
REC_BIN32_SIGNED,
0, 0,
NULL, 0);
if (rc != ex_expr::EXPR_OK)
{
return; // error
}
}
else if (sda.attributeType == SessionDefaults::SDT_BOOLEAN)
{
if ((strcmp(attrValue, "ON") == 0) ||
(strcmp(attrValue, "TRUE") == 0))
defaultValueAsBoolean = TRUE;
}
}
switch (sda.attribute)
{
case AQR_ENTRIES:
{
aqrInfo()->setAQREntriesFromInputStr(attrValue, attrValueLen);
}
break;
case AUTO_QUERY_RETRY_WARNINGS:
{
if (defaultValueAsBoolean)
setAQRWarnings(1);
else
setAQRWarnings(0);
}
break;
case DBTR_PROCESS:
{
setDbtrProcess(defaultValueAsBoolean);
}
break;
case ESP_ASSIGN_DEPTH:
{
setEspAssignDepth(defaultValueAsLong);
}
break;
case ESP_ASSIGN_TIME_WINDOW:
{
setEspAssignTimeWindow(defaultValueAsLong);
}
break;
case ESP_STOP_IDLE_TIMEOUT:
{
setEspStopIdleTimeout(defaultValueAsLong);
}
break;
case ESP_IDLE_TIMEOUT:
{
setEspIdleTimeout(defaultValueAsLong);
}
break;
case COMPILER_IDLE_TIMEOUT:
{
setCompilerIdleTimeout(defaultValueAsLong);
}
break;
case ESP_INACTIVE_TIMEOUT:
{
setEspInactiveTimeout(defaultValueAsLong);
}
break;
case ESP_RELEASE_WORK_TIMEOUT:
{
setEspReleaseWorkTimeout(defaultValueAsLong);
}
break;
case MAX_POLLING_INTERVAL:
{
setMaxPollingInterval(defaultValueAsLong);
}
break;
case PERSISTENT_OPENS:
{
setPersistentOpens(defaultValueAsLong);
}
break;
case ESP_CLOSE_ERROR_LOGGING:
{
setEspCloseErrorLogging(defaultValueAsBoolean);
}
break;
case CATALOG:
{
setCatalog(attrValue, attrValueLen);
};
break;
case SCHEMA:
{
setSchema(attrValue, attrValueLen);
};
break;
case USE_LIBHDFS:
{
setUseLibHdfs(defaultValueAsBoolean);
}
break;
case USER_EXPERIENCE_LEVEL:
{
setUEL(attrValue, attrValueLen);
};
break;
case RTS_TIMEOUT:
{
setRtsTimeout(defaultValueAsLong);
}
break;
case INTERNAL_FORMAT_IO:
{
setInternalFormatIO(defaultValueAsBoolean);
}
break;
case ISO_MAPPING:
{
if (attrValueLen != strlen(SQLCHARSETSTRING_ISO88591) ||
strcmp(attrValue, SQLCHARSETSTRING_ISO88591) != 0)
{
// Ignore the specified ISO_MAPPING setting
}
setIsoMappingName(SQLCHARSETSTRING_ISO88591, strlen(SQLCHARSETSTRING_ISO88591));
}
break;
case PARENT_QID:
setParentQid(attrValue, attrValueLen);
break;
case PARENT_QID_SYSTEM:
setParentQidSystem(attrValue, attrValueLen);
break;
case WMS_PROCESS:
setWmsProcess(defaultValueAsBoolean);
break;
case ESP_FREEMEM_TIMEOUT:
{
setEspFreeMemTimeout(defaultValueAsLong);
}
break;
case STATISTICS_VIEW_TYPE:
setStatisticsViewType(defaultValueAsLong);
break;
case RECLAIM_MEMORY_AFTER:
setReclaimTotalMemorySize(defaultValueAsLong);
break;
case RECLAIM_FREE_MEMORY_RATIO:
setReclaimFreeMemoryRatio(defaultValueAsLong);
break;
case RECLAIM_FREE_PFS_RATIO:
setReclaimFreePFSRatio(defaultValueAsLong);
break;
case CANCEL_ESCALATION_INTERVAL:
{
setCancelEscalationInterval(defaultValueAsLong);
}
break;
case CANCEL_ESCALATION_MXOSRVR_INTERVAL:
{
setCancelEscalationMxosrvrInterval(defaultValueAsLong);
}
break;
case CANCEL_ESCALATION_SAVEABEND:
{
setCancelEscalationSaveabend(defaultValueAsBoolean);
}
break;
case CANCEL_LOGGING:
{
setCancelLogging(defaultValueAsBoolean);
}
break;
case CANCEL_QUERY_ALLOWED:
{
setCancelQueryAllowed(defaultValueAsBoolean);
}
break;
case CANCEL_UNIQUE_QUERY:
{
setCancelUniqueQuery(defaultValueAsBoolean);
}
break;
case SUSPEND_LOGGING:
{
setSuspendLogging(defaultValueAsBoolean);
}
break;
case CALL_EMBEDDED_ARKCMP:
{
setCallEmbeddedArkcmp(defaultValueAsBoolean);
}
break;
default:
{
}
break;
};
}
void SessionDefaults::initializeSessionDefault
(char * attribute, Lng32 attrLen,
char * attrValue, Lng32 attrValueLen)
{
SessionDefaultMap sda =
getSessionDefaultMap(attribute, attrLen);
if (sda.attribute == INVALID_SESSION_DEFAULT)
return;
setSessionDefaultAttributeValue(sda, attrValue, attrValueLen);
}
void SessionDefaults::updateDefaultsValueString(SessionDefaultAttribute sda,
const Int16 DisAmbiguate,
NABoolean value)
{
if (defaultsValueString_[sda])
NADELETEBASIC(defaultsValueString_[sda], heap_);
defaultsValueString_[sda] = new(heap_) char[6];
if (value == TRUE)
strcpy(defaultsValueString_[sda], "TRUE");
else
strcpy(defaultsValueString_[sda], "FALSE");
}
void SessionDefaults::updateDefaultsValueString(SessionDefaultAttribute sda,
Lng32 value)
{
if (defaultsValueString_[sda])
NADELETEBASIC(defaultsValueString_[sda], heap_);
defaultsValueString_[sda] = new(heap_) char[12];
if (value < 0)
{
defaultsValueString_[sda][0] = '-';
str_itoa((ULng32)(-value), &defaultsValueString_[sda][1]);
}
else
str_itoa((ULng32)(value), defaultsValueString_[sda]);
}
void SessionDefaults::updateDefaultsValueString(SessionDefaultAttribute sda,
char * value)
{
if (defaultsValueString_[sda])
NADELETEBASIC(defaultsValueString_[sda], heap_);
if (value)
{
defaultsValueString_[sda] = new(heap_) char[strlen(value) + 1];
strcpy(defaultsValueString_[sda], value);
}
else
defaultsValueString_[sda] = NULL;
}
Lng32 SessionDefaults::setIsoMappingDefine()
{
return 0;
}
void SessionDefaults::saveSessionDefaults()
{
Lng32 len = sizeof(sessionDefaultMap) / sizeof(SessionDefaultMap);
for (Int32 i = 0; i < len; i++)
{
NADELETEBASIC(savedDefaultsValueString_[i], heap_);
if (defaultsValueString_[i])
{
savedDefaultsValueString_[i] =
new(heap_) char[strlen(defaultsValueString_[i]) + 1];
strcpy(savedDefaultsValueString_[i], defaultsValueString_[i]);
}
else
{
savedDefaultsValueString_[i] = NULL;
}
}
}
void SessionDefaults::restoreSessionDefaults()
{
Lng32 len = sizeof(sessionDefaultMap) / sizeof(SessionDefaultMap);
for (Int32 i = 0; i < len; i++)
{
if (savedDefaultsValueString_[i])
{
setSessionDefaultAttributeValue(
sessionDefaultMap[i],
savedDefaultsValueString_[i],
strlen(savedDefaultsValueString_[i]));
}
}
}
Lng32 SessionDefaults::readFromDefaultsTable(CliGlobals * cliGlobals)
{
// Read system defaults from configuration file
// keep this name in sync with file sqlcomp/nadefaults.cpp
NAString confFile(getenv("TRAF_CONF"));
confFile += "/SQSystemDefaults.conf";
FILE *f = fopen(confFile, "r");
if (f)
{
char attrName[101];
char attrValue[4000];
int rc = 0;
while (rc = fscanf(f, " %100[A-Za-z0-9_#] ,", attrName) == 0)
{
fgets(attrValue, sizeof(attrValue), f);
NAString attrNameUp(attrName);
attrNameUp.toUpper();
if (attrNameUp[0] != '#')
initializeSessionDefault((char *) attrNameUp.data(),
attrNameUp.length(),
attrValue,
str_len(attrValue));
}
}
return 0;
}
void SessionDefaults::position()
{
currDef_ = 0;
}
short SessionDefaults::getNextSessionDefault(char* &attributeString,
char* &attributeValue,
Lng32 &isCQD,
Lng32 &fromDefaultsTable,
Lng32 &isSSD,
Lng32 &isExternalized)
{
Lng32 len = sizeof(sessionDefaultMap) / sizeof(SessionDefaultMap);
if (currDef_ == len)
return -1;
attributeString = (char*)sessionDefaultMap[currDef_].attributeString;
attributeValue =
defaultsValueString_[sessionDefaultMap[currDef_].attribute];
isCQD = sessionDefaultMap[currDef_].isCQD;
fromDefaultsTable = sessionDefaultMap[currDef_].fromDefaultsTable;
isSSD = sessionDefaultMap[currDef_].isSSD;
isExternalized = sessionDefaultMap[currDef_].externalized;
currDef_++;
return 0;
}
//////////////////////////////////////////////////////////////////////
// class AQRInfo
//////////////////////////////////////////////////////////////////////
static const QueryString cqdInfo[] =
{
{"unique_hash_joins"}, {"OFF"}
, {"transform_to_sidetree_insert"}, {"OFF"}
, {"METADATA_CACHE_SIZE"}, {"0"}
, {"QUERY_CACHE"}, {"0"}
, {"TRAF_RELOAD_NATABLE_CACHE"}, {"ON"}
};
static const AQRInfo::AQRErrorMap aqrErrorMap[] =
{
// SQLCODE NSKCODE RETRIES DELAY TYPE NUM CQD CMP INTERNAL
// CQDS STR INFO
// =====================================================================
// object does not exist in Trafodion
AQREntry( 1009, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 1254, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 1389, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 1584, 0, 1, 0, 1, 1, "03", 0, 0),
// process could not be created (40)
AQREntry( 2012, 0, 3, 60, 0, 0, "", 0, 0),
// comm failure with esp (201, 246, 249)
AQREntry( 2034, 0, 1, 0, 2, 0, "", 0, 0),
AQREntry( 2235, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 4001, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 4023, 0, 1, 0, 1, 1, "03", 0, 0),
AQREntry( 4039, 0, 1, 0, 1, 1, "03", 0, 0),
// parallel purgedata failed
AQREntry( 8022, 0, 3, 60, 0, 0, "", 0, 1),
// hive data modification timestamp mismatch.
// query will be AQR'd and hive metadata will be reloaded.
AQREntry( 8436, 0, 1, 0, 0, 2, "04:05", 0, 0),
// FS memory errors
AQREntry( 8550, 30, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8550, 31, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8550, 33, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8550, 35, 1, 60, 0, 0, "", 0, 0),
// locked row timeout
AQREntry( 8550, 73, 2, 0, 0, 0, "", 0, 0),
AQREntry( 8550, 78, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8551, 12, 1, 60, 0, 0, "", 0, 0),
// DP2/FS memory errors
AQREntry( 8551, 30, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8551, 31, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8551, 33, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8551, 35, 1, 60, 0, 0, "", 0, 0),
// operation timeout against dp2
AQREntry( 8551, 40, 1, 60, 0, 0, "", 0, 0),
// locked row timeout
AQREntry( 8551, 73, 2, 0, 0, 0, "", 0, 0),
AQREntry( 8551, 78, 1, 60, 0, 0, "", 0, 0),
AQREntry( 8551, 200, 1, 30, 0, 0, "", 0, 0),
AQREntry( 8551, 1054, 1, 60, 0, 0, "", 0, 0),
// out of sqlmxbufferspace in dp2
AQREntry( 8551, 1187, 1, 60, 0, 0, "", 0, 0),
// out of server storage
AQREntry( 8551, 3502, 1, 60, 0, 0, "", 0, 0),
// locked row timeout
AQREntry( 8558, 0 , 2, 10, 0, 0, "", 0, 0),
// lost open
AQREntry( 8574, 0, 1, 0, 1, 0, "", 0, 0),
// timestamp mismatch
AQREntry( 8575, 0, 1, 0, 1, 0, "", 0, 0),
// table not found
AQREntry( 8577, 0, 1, 0, 1, 2, "04:05", 0, 0),
// sim check failure
AQREntry( 8579, 0, 1, 0, 1, 0, "", 0, 0),
// unavailable partitions
AQREntry( 8580, 0, 1, 0, 0, 0, "", 0, 0),
// in-memory join out of memory
AQREntry( 8581, 0, 1, 0, 1, 1, "01", 0, 0),
// No generated plan
AQREntry( 8583, 0, 1, 0, 1, 0, "", 0, 1),
// Schema security changed
AQREntry( 8585, 0, 1, 0, 1, 0, "", 0, 0),
// esp could have died during fragment assignment
AQREntry( 8586, 0, 1, 60, 2, 0, "", 0, 0),
// could not transform to sidetree insert. Reprepare as regular no rollback insert.
AQREntry( 8587, 0, 1, 0, 1, 1, "02", 0, 0),
// dead esp
AQREntry( 8596, 0, 1, 0, 2, 0, "", 0, 0),
// view not found
AQREntry( 8598, 0, 1, 0, 1, 0, "", 0, 0),
AQREntry( 8606, 73, 3, 60, 0, 0, "", 0, 0),
AQREntry( 8606, 97, 1, 0, 5, 0, "", 0, 0),
// privileges may have been revoked
AQREntry( 8734, 0, 1, 0, 1, 0, "", 0, 0),
// DDL change detected before query started
AQREntry( 8738, 0, 1, 0, 1, 0, "", 0, 0),
// internal error, no entries in diags.
AQREntry( 8810, 0, 1, 60, 0, 0, "", 0, 1),
// transaction mode mismatch
AQREntry( 8814, 0, 1, 0, 0, 0, "", 0, 0),
// compiler died
AQREntry( 8838, 0, 1, 0, 0, 0, "", 0, 1),
// transaction state needs to be cleaned up in compiler - kill compiler
// only valid after prepare errors
AQREntry( 8841, 0, 1, 0, 4, 0, "", 0, 0),
// transaction state needs to be cleaned up in compiler - kill compiler
// only valid after prepare errors.
AQREntry( 8844, 0, 1, 0, 4, 0, "", 0, 0),
// Error was returned by the SeaMonster API
AQREntry( 8951, 10001, 1, 30, 0, 0, "", 0, 0),
AQREntry( 8951, 10012, 1, 0, 2, 0, "", 0, 0),
// transaction state needs to be cleaned up in compiler - kill compiler
// only valid after prepare errors.
AQREntry( 8613, 0, 1, 0, 4, 0, "", 0, 0),
// memory condition in compiler - kill compiler
// only valid after prepare errors.
AQREntry( 2008, 0, 1, 0, 4, 0, "", 0, 0),
// UNLOAD failed to open file
// all three UNLOAD errors are retried only in NO APPEND mode
AQREntry( 8960, 0, 1, 0, 2, 0, "", 0, 0),
// UNLOAD failed during write to file
AQREntry( 8961, 0, 1, 0, 2, 0, "", 0, 0),
// UNLOAD failed to allocate buffers at start of execution
AQREntry( 8962, 0, 1, 0, 2, 0, "", 0, 0)
};
AQRInfo::AQRInfo(CollHeap * heap)
: heap_(heap),
currErr_(0),
aqrStmtInfo_(NULL),
flags_(0)
{
Lng32 numEntries = sizeof(aqrErrorMap) / sizeof(AQRErrorMap);
aqrErrorList_ = new(heap) LIST(AQRErrorMap) (heap);
for (Int32 i = 0; i < numEntries; i++)
{
AQRErrorMap tgt;
AQRErrorMap src = aqrErrorMap[i];
tgt.sqlcode = src.sqlcode;
tgt.nskcode = src.nskcode;
tgt.retries = src.retries;
tgt.delay = src.delay;
tgt.type = src.type;
tgt.numCQDs = src.numCQDs;
tgt.cqdStr = NULL;
tgt.cmpInfo = src.cmpInfo;
tgt.intAQR = src.intAQR;
if (tgt.numCQDs > 0)
{
tgt.cqdStr = new(heap_) char[strlen(src.cqdStr) + 1];
strcpy((char*)tgt.cqdStr, src.cqdStr);
}
aqrErrorList_->insert(tgt); //aqrErrorMap[i]);
}
origAqrErrorList_ = new(heap) LIST(AQRErrorMap) (heap);
origAqrErrorList_->insert(*aqrErrorList_);
}
AQRInfo::~AQRInfo()
{
}
short AQRInfo::setAQREntry(Lng32 task,
Lng32 sqlcode, Lng32 nskcode,
Int32 retries, Int32 delay, Int32 type,
Int32 numCQDs, char * cqdStr,
Lng32 cmpInfo, Lng32 intAQR)
{
if ((sqlcode < 0) || (nskcode < 0) || (retries < 0) || (delay < 0) ||
(type < 0) || (numCQDs < 0) || (cmpInfo < 0) || (cmpInfo > 1))
return -1;
UInt32 entry = 0;
NABoolean found = FALSE;
while ((NOT found) && (entry < aqrErrorList_->entries()))
{
entry++;
Int64 currSqlcode = (*aqrErrorList_)[(entry-1)].sqlcode;
Int64 currNskcode = (*aqrErrorList_)[(entry-1)].nskcode;
if ((currSqlcode == sqlcode) &&
(currNskcode == nskcode))
{
found = TRUE;
}
} // while
switch (task)
{
case ComTdbExeUtilAQR::ADD_: // add
{
if (found)
{
// check if it's the same string
if ( ((*aqrErrorList_)[(entry-1)].delay == delay ) &&
((*aqrErrorList_)[(entry-1)].retries == retries ))
//ignore . it's the same entry
return 0;
else
{
return -1;
}
}
else
{
// insert the new entry sorted on sqlcode/nskcode.
AQRErrorMap r;
r.sqlcode = sqlcode;
r.nskcode = nskcode;
r.retries = retries;
r.delay = delay;
r.type = type;
r.numCQDs = numCQDs;
r.cqdStr = NULL;
if (r.numCQDs > 0)
{
r.cqdStr = new(heap_) char[strlen(cqdStr) + 1];
strcpy((char*)r.cqdStr, cqdStr);
}
r.cmpInfo = cmpInfo;
r.intAQR = intAQR;
NABoolean done = FALSE;
entry = 0;
while ((NOT done) && (entry < aqrErrorList_->entries()))
{
Int64 currSqlcode = (*aqrErrorList_)[entry].sqlcode;
Int64 currNskcode = (*aqrErrorList_)[entry].nskcode;
if ((sqlcode < currSqlcode) ||
((sqlcode == currSqlcode) &&
(nskcode < currNskcode)))
{
done = TRUE;
}
else
entry++;
} // while
aqrErrorList_->insertAt(entry, r);
}
} // add
break;
case ComTdbExeUtilAQR::DELETE_: // delete
{
// remove errors
if (found)
{
NADELETEBASIC((*aqrErrorList_)[(entry-1)].cqdStr, heap_);
aqrErrorList_->removeAt(entry-1);
}
else
{
// not found, ignore
return 0;
}
}
break;
case ComTdbExeUtilAQR::UPDATE_: // update
{
if (found)
if ( ((*aqrErrorList_)[(entry-1)].delay == delay ) &&
((*aqrErrorList_)[(entry-1)].retries == retries ))
{
// ignore the update - it's the same
return 0;
}
else
{
(*aqrErrorList_)[(entry-1)].retries = retries;
(*aqrErrorList_)[(entry-1)].delay = delay;
(*aqrErrorList_)[(entry-1)].type = type;
(*aqrErrorList_)[(entry-1)].cmpInfo = cmpInfo;
(*aqrErrorList_)[(entry-1)].intAQR = intAQR;
}
else
{
// not found, return error.
return -1;
}
}
break;
} // switch
return 0;
}
short AQRInfo::setAQREntriesFromInputStr(char * inStr, Lng32 inStrLen)
{
if ((! inStr) || (inStrLen <= 0))
return -1;
char * newStr = new(heap_) char[inStrLen + 1 + 1];
str_cpy_all(newStr, inStr, inStrLen);
newStr[inStrLen] = 0;
Lng32 n = 0;
Int32 i = 0;
while (i < inStrLen)
{
if ((inStr[i] != '+') &&
(inStr[i] != '-') &&
(inStr[i] != '.') &&
(inStr[i] != ' ') &&
(inStr[i] != ',') &&
(inStr[i] != '|') &&
(NOT ((inStr[i] >= '0') &&
(inStr[i] <= '9'))))
return -1;
if (inStr[i] != ' ')
{
newStr[n] = inStr[i];
n++;
}
i++;
}
if (newStr[n-1] != '|')
{
newStr[n] = '|';
n++;
}
newStr[n] = 0;
i = 0;
Int32 j = 0;
Int32 k = 1;
Lng32 sqlcode = -1;
Lng32 nskcode = 0;
Lng32 retries = 1;
Lng32 delay = 60;
Lng32 type = 0;
Lng32 numCQDs = 0;
char * cqdStr = NULL;
Lng32 cmpInfo = 0;
Lng32 intAQR = 0;
Lng32 task = ComTdbExeUtilAQR::NONE_;
NABoolean numberSeen = FALSE;
while (i < n)
{
if ((newStr[i] >= '0') &&
(newStr[i] <= '9'))
numberSeen = TRUE;
if (newStr[i] == '+')
{
if ((numberSeen) ||
(task != ComTdbExeUtilAQR::NONE_))
return -1;
task = ComTdbExeUtilAQR::ADD_;
j++;
}
else if (newStr[i] == '-')
{
if ((numberSeen) ||
(task != ComTdbExeUtilAQR::NONE_))
return -1;
task = ComTdbExeUtilAQR::DELETE_;
j++;
}
else if (newStr[i] == '.')
{
if ((numberSeen) ||
(task != ComTdbExeUtilAQR::NONE_))
return -1;
task = ComTdbExeUtilAQR::UPDATE_;
j++;
}
if ((newStr[i] == ',') ||
(newStr[i] == '|'))
{
if (i > j)
{
Lng32 v = 0;
if ((k < 7) || (k == 8) || (k == 9))
{
Int64 bigV = str_atoi(&newStr[j], i-j);
if (bigV == -1)
return -1;
if (bigV > INT_MAX)
return -1;
v = (Lng32)bigV;
}
switch (k)
{
case 1:
sqlcode = v;
break;
case 2:
nskcode = v;
break;
case 3:
retries = v;
break;
case 4:
delay = v;
break;
case 5:
type = v;
break;
case 6:
numCQDs = v;
break;
case 7:
cqdStr = new(heap_) char[i-j+1];
str_cpy_all(cqdStr, &newStr[j], i-j);
cqdStr[i-j] = 0;
break;
case 8:
cmpInfo = v;
break;
case 9:
intAQR = v;
break;
} // switch
}
k++;
j = i + 1;
}
if (newStr[i] == '|')
{
if (task == ComTdbExeUtilAQR::NONE_)
task = ComTdbExeUtilAQR::ADD_;
if (setAQREntry(task, sqlcode, nskcode, retries, delay, type,
numCQDs, cqdStr, cmpInfo, intAQR))
return -1;
sqlcode = -1;
nskcode = 0;
retries = 1;
delay = 60;
type = 0;
numCQDs = 0;
cqdStr = NULL;
cmpInfo = 0;
intAQR = 0;
numberSeen = FALSE;
task = ComTdbExeUtilAQR::NONE_;
k = 1;
j = i+1;
}
i++;
}
return 0;
}
short AQRInfo::getAQREntry(Lng32 sqlcode, Lng32 nskcode,
Lng32 &retries, Lng32 &delay,
Lng32 &type,
Int32 &numCQDs, char* &cqdStr,
Lng32 &cmpInfo, Lng32 &intAQR)
{
NABoolean sqlcodeZeroFound = FALSE;
UInt32 sqlcodeZeroEntryNum = 0;
NABoolean nskcodeZeroFound = FALSE;
UInt32 nskcodeZeroEntryNum = 0;
for (UInt32 i = 0; i < aqrErrorList_->entries(); i++)
{
NABoolean found = FALSE;
// if '0' has been set as sqlcode by user, then retry on all errors.
if (0 == (*aqrErrorList_)[i].sqlcode)
{
sqlcodeZeroFound = TRUE;
sqlcodeZeroEntryNum = i;
}
else if ((ABS(sqlcode) == (*aqrErrorList_)[i].sqlcode) &&
((*aqrErrorList_)[i].nskcode == 0))
{
nskcodeZeroFound = TRUE;
nskcodeZeroEntryNum = i;
}
else if ((ABS(sqlcode) == (*aqrErrorList_)[i].sqlcode) &&
(ABS(nskcode) == (*aqrErrorList_)[i].nskcode))
found = TRUE;
if (found)
{
retries = (Int32)(*aqrErrorList_)[i].retries;
delay = (Int32)(*aqrErrorList_)[i].delay;
type = (Int32)(*aqrErrorList_)[i].type;
numCQDs = (Int32)(*aqrErrorList_)[i].numCQDs;
cqdStr = (char*)(*aqrErrorList_)[i].cqdStr;
cmpInfo = (Int32)(*aqrErrorList_)[i].cmpInfo;
intAQR = (Int32)(*aqrErrorList_)[i].intAQR;
return 0;
}
}
if ((nskcodeZeroFound) || (sqlcodeZeroFound))
{
UInt32 i =
(nskcodeZeroFound ? nskcodeZeroEntryNum : sqlcodeZeroEntryNum);
retries = (Int32)(*aqrErrorList_)[i].retries;
delay = (Int32)(*aqrErrorList_)[i].delay;
type = (Int32)(*aqrErrorList_)[i].type;
numCQDs = (Int32)(*aqrErrorList_)[i].numCQDs;
cqdStr = (char*)(*aqrErrorList_)[i].cqdStr;
cmpInfo = (Int32)(*aqrErrorList_)[i].cmpInfo;
intAQR = (Int32)(*aqrErrorList_)[i].intAQR;
return 0;
}
return -1;
}
void AQRInfo::position()
{
currErr_ = 0;
}
short AQRInfo::getNextAQREntry(Lng32 &sqlcode, Lng32 &nskcode,
Lng32 &retries, Lng32 &delay,
Lng32 &type, Lng32 &intAQR)
{
if (currErr_ == aqrErrorList_->entries())
return -1;
sqlcode = (*aqrErrorList_)[currErr_].sqlcode;
nskcode = (*aqrErrorList_)[currErr_].nskcode;
retries = (*aqrErrorList_)[currErr_].retries;
delay = (*aqrErrorList_)[currErr_].delay;
type = (*aqrErrorList_)[currErr_].type;
intAQR = (*aqrErrorList_)[currErr_].intAQR;
currErr_++;
return 0;
}
void AQRInfo::saveAQRErrors()
{
aqrErrorList_->clear();
aqrErrorList_->insert(*origAqrErrorList_);
}
NABoolean AQRInfo::restoreAQRErrors()
{
if (origAqrErrorList_)
{
if (origAqrErrorList_->isEmpty())
{
return FALSE;
}
aqrErrorList_->clear();
aqrErrorList_->insert(*origAqrErrorList_);
}
return TRUE;
}
void AQRInfo::clearRetryInfo()
{
if (aqrStmtInfo_)
{
aqrStmtInfo_ = NULL;
}
flags_ = 0;
}
AQRStatementInfo::AQRStatementInfo(CollHeap * heap)
{
heap_ = heap;
savedStmtAttributes_ = new (heap) AQRStatementAttributes(heap);
clearRetryInfo();
}
void AQRStatementInfo::clearRetryInfo()
{
retryStatementId_ = NULL;
retrySqlSource_ = NULL;
retryInputDesc_ = NULL;
retryOutputDesc_ = NULL;
retryTempInputDesc_ = NULL;
retryTempOutputDesc_ = NULL;
retryPrepareFlags_ = 0;
retryFlags_ = 0;
retryStatementHandle_ = 0;
if (savedStmtAttributes_)
savedStmtAttributes_->clear();
}
void AQRStatementInfo::saveAttributesFromStmt(Statement *fromStmt)
{
if (savedStmtAttributes_)
savedStmtAttributes_->getAttributesFromStatement(fromStmt);
}
void AQRStatementInfo::copyAttributesToStmt(Statement *toStmt)
{
if (savedStmtAttributes_)
savedStmtAttributes_->setAttributesInStatement(toStmt);
}
AQRStatementAttributes::AQRStatementAttributes(CollHeap *heap)
{
heap_ = heap;
holdable_ = SQLCLIDEV_NONHOLDABLE;
rowsetAtomicity_ = Statement::UNSPECIFIED_;
inputArrayMaxsize_ = 0;
uniqueStmtId_ = NULL;
uniqueStmtIdLen_ = 0;
parentQID_ = NULL;
parentQIDSystem_[0] = '\0';
exeStartTime_ = -1;
}
AQRStatementAttributes::~AQRStatementAttributes()
{
if (uniqueStmtId_)
NADELETEBASIC(uniqueStmtId_,heap_);
if (parentQID_)
NADELETEBASIC(parentQID_,heap_);
}
void AQRStatementAttributes::clear()
{
holdable_ = SQLCLIDEV_NONHOLDABLE;
rowsetAtomicity_ = Statement::UNSPECIFIED_;
inputArrayMaxsize_ = 0;
uniqueStmtId_ = NULL;
uniqueStmtIdLen_ = 0;
parentQID_ = NULL;
parentQIDSystem_[0] = '\0';
exeStartTime_ = -1;
}
void AQRStatementAttributes::setAttributesInStatement(Statement *targetStmt)
{
ComDiagsArea d;
if(targetStmt)
{
targetStmt->setHoldable(holdable_);
targetStmt->setRowsetAtomicity(d,rowsetAtomicity_);
targetStmt->setInputArrayMaxsize(d,inputArrayMaxsize_);
targetStmt->setUniqueStmtId(uniqueStmtId_);
targetStmt->setParentQid(parentQID_);
targetStmt->setParentQidSystem(parentQIDSystem_);
targetStmt->setExeStartTime(exeStartTime_);
}
return;
}
void AQRStatementAttributes::getAttributesFromStatement(Statement *fromStmt)
{
Lng32 len;
if (fromStmt)
{
holdable_ = fromStmt->getHoldable();
rowsetAtomicity_ = fromStmt->getRowsetAtomicity();
inputArrayMaxsize_ = fromStmt->getInputArrayMaxsize();
if (fromStmt->getUniqueStmtId())
{
uniqueStmtId_ = new(heap_) char[fromStmt->getUniqueStmtIdLen() + 1];
str_cpy_all(uniqueStmtId_, fromStmt->getUniqueStmtId(), fromStmt->getUniqueStmtIdLen());
uniqueStmtId_[fromStmt->getUniqueStmtIdLen()] = 0;
}
uniqueStmtIdLen_ = fromStmt->getUniqueStmtIdLen();
if (fromStmt->getParentQid())
{
len = str_len(fromStmt->getParentQid());
parentQID_ = new(heap_) char[len+1];
str_cpy_all(parentQID_, fromStmt->getParentQid(),len);
parentQID_[len] = 0;
}
len = str_len(fromStmt->getParentQidSystem());
str_cpy_all(parentQIDSystem_, fromStmt->getParentQidSystem(), len);
parentQIDSystem_[len] = '\0';
if (fromStmt->getStatsArea() && fromStmt->getStatsArea()->getMasterStats())
exeStartTime_ = fromStmt->getStatsArea()->getMasterStats()->getExeStartTime();
}
return;
}
Lng32 AQRInfo::setCQDs(Lng32 numCQDs, char * cqdStr,
ContextCli * context)
{
Lng32 rc = 0;
if (numCQDs > 0)
{
for (Lng32 i = 0; i < numCQDs; i++)
{
// for each entry in the cqdStr, extract the corresponding
// entry from cqdInfo array and execute that cqd.
// Entries in cqdStr are of the form:
// NN:NN:....NN
// For ex: numCQDs=2 and cqdStr = 01:03
// would indicate that entries #1 and #3 from the cqdInfo
// array need to be executed and set.
Int64 v = str_atoi(&cqdStr[i*3], 2);
if (v <= 0)
return -1;
rc = context->holdAndSetCQD(cqdInfo[(v-1)*2].str,
cqdInfo[(v-1)*2+1].str);
if (rc < 0)
return rc;
}
}
return 0;
}
Lng32 AQRInfo::resetCQDs(Lng32 numCQDs, char * cqdStr,
ContextCli * context)
{
Lng32 rc = 0;
if (numCQDs > 0)
{
for (Lng32 i = 0; i < numCQDs; i++)
{
Int64 v = str_atoi(&cqdStr[i*3], 2);
if (v <= 0)
return -1;
rc = context->restoreCQD(cqdInfo[(v-1)*2].str);
if (rc < 0)
return rc;
}
}
return rc;
}
Lng32 AQRInfo::setCompilerInfo(char * queryId,
ComCondition * errCond,
ContextCli * context)
{
Lng32 rc = 0;
char * csVal = NULL;
Lng32 len = 0;
len = strlen("QUERY_ID: ") + strlen(queryId) + 1;
csVal = new(heap_) char[len];
str_sprintf(csVal, "QUERY_ID: %s", queryId);
rc = context->setCS("AQR_COMPILER_INFO",
csVal);
return rc;
}
Lng32 AQRInfo::resetCompilerInfo(char * queryId,
ComCondition * errCond,
ContextCli * context)
{
Lng32 rc = 0;
rc = context->resetCS("AQR_COMPILER_INFO");
return rc;
}
void SessionDefaults::resetSessionOnlyAttributes()
{
nvciProcess_ = FALSE;
internalCli_ = FALSE;
}
SessionEnvvar::SessionEnvvar(CollHeap * heap,
char * envvarName, char * envvarValue)
: heap_(heap),
envvarName_(NULL), envvarValue_(NULL)
{
if (! envvarName)
return;
envvarName_ = new(heap) char[strlen(envvarName)+1];
strcpy(envvarName_, envvarName);
if (envvarValue)
{
envvarValue_ = new(heap) char[strlen(envvarValue)+1];
strcpy(envvarValue_, envvarValue);
}
else
envvarValue_ = NULL;
}
SessionEnvvar::SessionEnvvar()
{
heap_ = NULL;
envvarName_ = NULL;
envvarValue_ = NULL;
}
SessionEnvvar::~SessionEnvvar()
{
if (envvarName_)
NADELETEBASIC(envvarName_, heap_);
if (envvarValue_)
NADELETEBASIC(envvarValue_, heap_);
}
NABoolean SessionEnvvar::operator ==(const SessionEnvvar &other) const
{
if ((! envvarName_) || (! other.envvarName_))
return FALSE;
if (strcmp(envvarName_, other.envvarName_) == 0)
return TRUE;
else
return FALSE;
}
SessionEnvvar& SessionEnvvar::operator =(const SessionEnvvar &other)
{
if (envvarName_)
NADELETEBASIC(envvarName_, heap_);
if (envvarValue_)
NADELETEBASIC(envvarValue_, heap_);
heap_ = other.heap_;
if (other.envvarName_)
{
envvarName_ = new(heap_) char[strlen(other.envvarName_)+1];
strcpy(envvarName_, other.envvarName_);
}
else
envvarName_ = NULL;
if (other.envvarValue_)
{
envvarValue_ = new(heap_) char[strlen(other.envvarValue_)+1];
strcpy(envvarValue_, other.envvarValue_);
}
else
envvarValue_ = NULL;
return (*this);
}
SessionEnvvar::SessionEnvvar(const SessionEnvvar &other)
{
*this = other;
}
void SessionDefaults::setParentQid(char *attrValue, Lng32 attrValueLen)
{
if (parentQid_)
{
NADELETEBASIC(parentQid_, heap_);
}
if (attrValue)
{
if (attrValueLen == 4 && strncmp(attrValue, "NONE", 4) == 0)
parentQid_ = NULL;
else
{
parentQid_ = new(heap_) char[attrValueLen + 1];
strncpy(parentQid_, attrValue, attrValueLen);
parentQid_[attrValueLen] = '\0';
}
}
else
parentQid_ = NULL;
updateDefaultsValueString(PARENT_QID, parentQid_);
}
void SessionDefaults::setParentQidSystem(char *attrValue, Lng32 attrValueLen)
{
if (attrValue != NULL)
{
if (attrValueLen == 4 && strncmp(attrValue, "NONE", 4) == 0)
parentQidSystem_[0] = '\0';
else
{
str_cpy_all(parentQidSystem_, attrValue, attrValueLen);
parentQidSystem_[attrValueLen] = '\0';
}
}
else
parentQidSystem_[0] = '\0';
updateDefaultsValueString(PARENT_QID_SYSTEM, parentQidSystem_);
}
void SessionDefaults::beginSession()
{
setParentQid(NULL, 0);
setParentQidSystem(NULL, 0);
setWmsProcess(FALSE);
setStatisticsViewType(SQLCLI_PERTABLE_STATS);
setReclaimTotalMemorySize(DEFAULT_RECLAIM_MEMORY_AFTER);
setReclaimFreeMemoryRatio(DEFAULT_RECLAIM_FREE_MEMORY_RATIO);
setReclaimFreePFSRatio(DEFAULT_RECLAIM_FREE_PFS_RATIO);
setRedriveCTAS(FALSE);
setExSMTraceFilePrefix(NULL, 0);
}
void SessionDefaults::setExSMTraceFilePrefix(const char *attrValue,
Int32 attrValueLen)
{
if (exsmTraceFilePrefix_)
{
NADELETEBASICARRAY(exsmTraceFilePrefix_, heap_);
exsmTraceFilePrefix_ = NULL;
}
if (attrValue == NULL || attrValue[0] == 0 || attrValueLen == 0)
return;
exsmTraceFilePrefix_ = new(heap_) char[attrValueLen + 1];
strncpy(exsmTraceFilePrefix_, attrValue, attrValueLen);
exsmTraceFilePrefix_[attrValueLen] = 0;
}