/**********************************************************************
// @@@ 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;
}
