/**********************************************************************
// @@@ 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 @@@
********************************************************************/
//
// MODULE: SrvrOther.cpp
//
// PURPOSE: Implements the following methods
//		odbc_SQLSvc_Prepare_sme_
//		odbc_SQLSvc_ExecuteN_sme_
//		odbc_SQLSvc_Close_sme_
//		odbc_SQLSvc_FetchN_sme_
//		odbc_SQLSvc_EndTransaction_sme_
//		odbc_SQLSvc_ExecuteCall_sme_
//
#include <platform_ndcs.h>
#include <platform_utils.h>
#include <stdio.h>
#include <stdlib.h>
#include <map>
#include <string>

//  Used to disable and enable dumps via setrlimit in a release env.
#ifndef _DEBUG
#include <sys/resource.h>
#endif

#include <sql.h>
#include <sqlext.h>
#include "odbcCommon.h"
#include "odbc_sv.h"
#include "srvrcommon.h"
#include "sqlinterface.h"
#include "srvrkds.h"
#include "SQLWrapper.h"
#include "CommonDiags.h"
#include "tdm_odbcSrvrMsg.h"
#include "ResStatistics.h"
#include "ResStatisticsSession.h"
#include "ResStatisticsStatement.h"
#include "NskUtil.h"

// reserved names for seabase metadata where SQL table information is kept
#ifndef SEABASE_MD_SCHEMA
#define SEABASE_MD_SCHEMA     "\"_MD_\""
#define SEABASE_MD_CATALOG     "TRAFODION"
#define SEABASE_COLUMNS         "COLUMNS"
#define SEABASE_DEFAULTS        "DEFAULTS"
#define SEABASE_INDEXES          "INDEXES"
#define SEABASE_KEYS                "KEYS"
#define SEABASE_OBJECTS          "OBJECTS"
#define SEABASE_OBJECTUID      "OBJECTUID"
#define SEABASE_TABLES            "TABLES"
#define SEABASE_VIEWS              "VIEWS"
#define SEABASE_VIEWS_USAGE  "VIEWS_USAGE"
#define SEABASE_VERSIONS        "VERSIONS"
#endif

//#include "zmxocfg.h"                //aruna
#include <dlfcn.h>
#include "sqlcli.h"

#include "TransportBase.h"
// #ifdef _TMP_SQ_SECURITY
#include "secsrvrmxo.h"
#include "dbUserAuth.h"
// #endif

#define SQL_API_TBLSYNONYM		1917
#define SQL_API_TBLMVS			1918

using namespace SRVR;

bool rePrepare2WouldLikeToExecute(Long stmtHandle
				, Int32 *returnCode
				, Int32 *sqlWarningOrErrorLength
				, char *&sqlWarningOrError);

short qrysrvcExecuteFinished(
				  const char *stmtLabel
				, const Long stmtHandle
				, const bool bCheckSqlQueryType
				, const short error_code
				, const bool bFetch
				, const bool bException
				, const bool bErase);

void AllocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt);
void DeallocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt);
void ClearAdaptiveSegment(short adapiveSeg = -1);

static void setAuthenticationError(
   bool & bSQLMessageSet, 
   odbc_SQLSvc_SQLError * SQLError,
   const char * externalUsername,
   bool isInternalError);

// Internal calls - Defined in libcli.so

int SQL_EXEC_AssignParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int flagbits);

int SQL_EXEC_GetParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int &flagbits);

void SQL_EXEC_SetParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int flagbits);

#define INTERNAL_QUERY_FROM_EXEUTIL 0x20000

//#define SRVR_PERFORMANCE

SMD_SELECT_TABLE SQLCommitStmt[] = {
	{ STRING_TYPE, "COMMIT WORK"},
	{ END_OF_TABLE}
};

SMD_SELECT_TABLE SQLRollbackStmt[] = {
	{ STRING_TYPE, "ROLLBACK WORK"},
	{ END_OF_TABLE}
};

SMD_QUERY_TABLE tranQueryTable[] = {
	{"SQL_COMMIT", SQLCommitStmt, TYPE_UNKNOWN, FALSE, FALSE},
	{"SQL_ROLLBACK", SQLRollbackStmt, TYPE_UNKNOWN, FALSE, FALSE},
	{NULL}
};

#define SQL_API_JDBC					9999
#define SQL_API_SQLTABLES_JDBC			SQL_API_SQLTABLES + SQL_API_JDBC
#define SQL_API_SQLGETTYPEINFO_JDBC		SQL_API_SQLGETTYPEINFO + SQL_API_JDBC
#define SQL_API_SQLCOLUMNS_JDBC			SQL_API_SQLCOLUMNS + SQL_API_JDBC
#define SQL_API_SQLSPECIALCOLUMNS_JDBC	SQL_API_SQLSPECIALCOLUMNS + SQL_API_JDBC
#define SQL_API_SQLPROCEDURES_JDBC     SQL_API_SQLPROCEDURES + SQL_API_JDBC
#define SQL_API_SQLPROCEDURECOLUMNS_JDBC      SQL_API_SQLPROCEDURECOLUMNS  + SQL_API_JDBC
// The value represents SQL version, MXCS module major version and MXCS module minor version.
#define MODULE_RELEASE_VERSION			200
#define	MODULE_MAJOR_VERSION			400
#define	MODULE_MINOR_VERSION			000

#define SQL_INVALID_USER_CODE -8837

// ResStatistics
ResStatisticsSession    *resStatSession;
ResStatisticsStatement  *resStatStatement;
BOOL					resStatCollectorError = false;
struct					collect_info setinit;
Int32					inState = STMTSTAT_NONE;
short					inSqlStmtType = TYPE_UNKNOWN;
double					inEstimatedCost = 0;
char					*inQueryId = NULL;
char					*inSqlString = NULL;
Int32					inErrorStatement = 0;
Int32					inWarningStatement = 0;
int64					inRowCount = 0;
Int32					inErrorCode = 0;
Int32					inSqlQueryType = 0;
Int32					inSqlNewQueryType = 0;
char					*inSqlError = NULL;
Int32					inSqlErrorLength = 0;
bool					setStatisticsFlag = FALSE;
// end ResStatistics

char b[317];

bool securitySetup = false;

//char		QueryQueue[1024];
//int64	queryId;

/*
 * Synchronous method function  for
 * operation 'odbc_SQLSvc_Prepare'
 */
extern "C" void
odbc_SQLSvc_Prepare_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_Prepare_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ const IDL_char *stmtExplainLabel
  , /* In    */ IDL_short stmtType
  , /* In    */ IDL_string sqlString
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *estimatedCost
  , /* Out   */ SQLItemDescList_def *inputDesc
  , /* Out   */ SQLItemDescList_def *outputDesc
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning)
{
	SRVRTRACE_ENTER(FILE_SME+1)

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQL_QUERY_COST_INFO cost_info;
	SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
	SQLRETURN rc = PROGRAM_ERROR;
    Int32 holdestimatedCost;
	bool flag_21036 = false;

	if (sqlString ==  NULL)
	{
		exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_NULL_SQL_STMT;
	}

	// resource statistics
	if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
	{
		inState = STMTSTAT_PREPARE;
		inSqlStmtType = TYPE_UNKNOWN;
		inEstimatedCost = 0;
		inQueryId = NULL;
		inSqlString = NULL;
		inErrorStatement = 0;
		inWarningStatement = 0;
		inRowCount = 0;
		inErrorCode = 0;
		inSqlQueryType = SQL_UNKNOWN;
		inSqlNewQueryType = SQL_UNKNOWN;
		inSqlError = NULL;
		inSqlErrorLength = 0;
		bzero(&cost_info, sizeof(cost_info));
   		resStatStatement->start(inState,
					inSqlQueryType,
					stmtLabel,
					NULL,
					inEstimatedCost,
					&flag_21036,
					sqlString);
	}

	if (exception_->exception_nr == 0)
	{
		if (stmtType != TYPE_SMD)
		{

			if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
			{
				pSrvrStmt->cleanupAll();
				pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
				pSrvrStmt->freeResourceOpt = SQL_DROP;
				FREESTATEMENT(pSrvrStmt);
			}
			// Need to validate the stmtLabel
			// Given a label find out the SRVR_STMT_HDL
			if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
			{
				exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
			}
			if (exception_->exception_nr == 0)
			{
				if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
					pSrvrStmt->inState = inState;
				rc = SQL_SUCCESS;
				if (!pSrvrStmt->isReadFromModule)
				{
					// cleanup all memory allocated in the previous operations
					pSrvrStmt->cleanupAll();
					pSrvrStmt->sqlStringLen = strlen(sqlString);
					pSrvrStmt->sqlString  = new char[pSrvrStmt->sqlStringLen+1];
					if (pSrvrStmt->sqlString == NULL)
					{
						SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
									srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
									srvrGlobal->srvrObjRef, 1, "Prepare");
						exit(0);
					}

					strcpy(pSrvrStmt->sqlString, sqlString);
					pSrvrStmt->stmtType = stmtType;
					pSrvrStmt->currentMethod = odbc_SQLSvc_Prepare_ldx_;
					rc = PREPARE(pSrvrStmt);
					switch (rc)
					{
					case SQL_SUCCESS:
						break;
					case SQL_SUCCESS_WITH_INFO:
						GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
						break;
					case SQL_ERROR:
						GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
						break;
					case ODBC_RG_WARNING:
						// if there is RG_WARNING, we don't pass SQL Warning to the application
						// Hence, we need to clear any warnings
						// call SQL_EXEC_ClearDiagnostics
//						CLEARDIAGNOSTICS(pSrvrStmt);
						rc = SQL_SUCCESS_WITH_INFO;
					case ODBC_SERVER_ERROR:
					case ODBC_RG_ERROR:
					default:
						break;
					}
				}

			}
		}
	/*	else 	//	added for user module support
		{
			char	*sqltoken;
			char	sqlseps[]   = " \t\n{(";
			int		ch = '.';
			int		TknLen = 0;
			int		SStrLen = 0;
			char	VariableValue[1000];

			VariableValue[0] = '\0';
			strcpy(VariableValue,sqlString);
			sqltoken = strtok(VariableValue, sqlseps);
			if (_stricmp(sqltoken, "SMD") == 0)
			{
				sqltoken = strtok(NULL, sqlseps);
				if (sqltoken != NULL)
				{
					UserModuleName[0] = '\0';
					UserStatementName[0] = '\0';
					TknLen = strrchr(sqltoken, ch) - sqltoken + 1;
					SStrLen = strlen(sqltoken);
					strncpy(UserModuleName,sqltoken, TknLen-1);
					UserModuleName[TknLen-1] = '\0';
					strncpy(UserStatementName,sqltoken + TknLen, SStrLen);
					UserStatementName[SStrLen-TknLen+1] = '\0';
					// Need to validate the stmtLabel
					// Given a label find out the SRVR_STMT_HDL
					pSrvrStmt = getSrvrStmt(UserStatementName, TRUE);
					strcpy(pSrvrStmt->stmtName, UserStatementName);
					strcpy(pSrvrStmt->cursorName, UserStatementName);
					pSrvrStmt->stmtType = stmtType;
					user_module.module_name = UserModuleName;
					user_module.module_name_len = strlen(UserModuleName);
					user_module.charset = "ISO88591";
					user_module.creation_timestamp = 1234567890;

					rc = pSrvrStmt->PrepareUserModule();
				}
				else
				{
					// Return Error Invalid Module Name.
				}
				sqltoken = strtok(NULL, sqlseps);
				if (sqltoken != NULL)
				{
					// Return Error Invalid Module Name.
				}
			}
			else
			{
				// Return Error Invalid Call.
			}
		}
		*/
		if (exception_->exception_nr == 0)
		{
			switch (rc)
			{
			case SQL_SUCCESS:
			case SQL_SUCCESS_WITH_INFO:
				exception_->exception_nr = 0;
				// Copy all the output parameters
				// Vijay - Changes to support not to parse tokens for statement type SELECT
				holdestimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime
				if ((pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)  || (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE))
					pSrvrStmt->sqlStmtType = TYPE_SELECT;
				*estimatedCost = pSrvrStmt->sqlQueryType;
				inputDesc->_length = pSrvrStmt->inputDescList._length;
				inputDesc->_buffer = pSrvrStmt->inputDescList._buffer;
				outputDesc->_length = pSrvrStmt->outputDescList._length;
				outputDesc->_buffer = pSrvrStmt->outputDescList._buffer;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
				break;
			case SQL_STILL_EXECUTING:
				exception_->exception_nr = odbc_SQLSvc_Prepare_SQLStillExecuting_exn_;
				break;

			case ODBC_RG_ERROR:
			case SQL_ERROR:
				ERROR_DESC_def *error_desc_def;
				error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
				if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
				{
					exception_->exception_nr = odbc_SQLSvc_Prepare_SQLQueryCancelled_exn_;
					exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_Prepare_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
				break;
			case PROGRAM_ERROR:
				exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_PREPARE_FAILED;
			default:
				break;
			}
		}
	}

	//  resource statistics
	if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
	{
		if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
		{
			inErrorStatement ++;

			ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
			inErrorCode = p_buffer->sqlcode;
			inSqlError = p_buffer->errorText;
			inSqlErrorLength = strlen(p_buffer->errorText);
		}

		if (sqlWarning->_length != 0)
			inWarningStatement ++;

		if (sqlString == NULL)
			sqlString = "";

		inSqlString = new char[strlen(sqlString) + 1];
		if (inSqlString == NULL)
		{
			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, "inSqlString");
			exit(0);
		}
		strcpy(inSqlString,sqlString);
		if (pSrvrStmt != NULL)
		{
			inEstimatedCost = pSrvrStmt->cost_info.totalTime;  // res stat reports estimated cost as double
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
		}
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &flag_21036,
							  inSqlNewQueryType);
		delete inSqlString;
	}
	//end rs
	pSrvrStmt->m_need_21036_end_msg = flag_21036;
	SRVRTRACE_EXIT(FILE_SME+1);
	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_ExecuteN'
 */
extern "C" void
odbc_SQLSvc_ExecuteN_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_ExecuteN_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_string cursorName
  , /* In    */ IDL_short sqlStmtType
  , /* In    */ Int32 inputRowCnt
  , /* In    */ const SQLValueList_def *inputValueList
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning)
{
	SRVRTRACE_ENTER(FILE_SME+2);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	bool bWMAutoCommitOff = false;

	if (inputRowCnt < 0)
	{
		exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
	}
	else
	{
		if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
		{
			exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT_AND_SELECT;
		}
		else
		{
			if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
			{
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
			}
		}
	}

	if (exception_->exception_nr == 0)
	{
		// resource statistics
		if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
			inSqlStmtType = sqlStmtType;
			inEstimatedCost = pSrvrStmt->cost_info.totalTime;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;

			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg,
						false,
						pSrvrStmt->sqlString); */
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg,
									pSrvrStmt->sqlString);
		}
		//end rs

		if (pSrvrStmt->bSQLMessageSet)
			pSrvrStmt->cleanupSQLMessage();
		if(pSrvrStmt->bSQLValueListSet)
			pSrvrStmt->cleanupSQLValueList();
		pSrvrStmt->inputRowCnt = inputRowCnt;
		pSrvrStmt->sqlStmtType = sqlStmtType;

		if (cursorName != NULL && cursorName[0] != '\0')
		{
			pSrvrStmt->cursorNameLen = strlen(cursorName);
			pSrvrStmt->cursorNameLen = pSrvrStmt->cursorNameLen < sizeof(pSrvrStmt->cursorName)? pSrvrStmt->cursorNameLen : sizeof(pSrvrStmt->cursorName);
			strncpy(pSrvrStmt->cursorName, cursorName, sizeof(pSrvrStmt->cursorName));
			pSrvrStmt->cursorName[sizeof(pSrvrStmt->cursorName)-1] = 0;
		}
		else
			pSrvrStmt->cursorName[0] = '\0';

		pSrvrStmt->inputValueList._buffer = inputValueList->_buffer;
		pSrvrStmt->inputValueList._length = inputValueList->_length;

		pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;

		// batch job support for T4
		// Fix for transaction issue 20/09/06
		if ((WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) != 0) && srvrGlobal->bAutoCommitOn == TRUE && sqlStmtType != TYPE_SELECT)
		{
			bWMAutoCommitOff = true;

			SRVR_STMT_HDL	*TranOffSrvrStmt;
			if ((TranOffSrvrStmt = getSrvrStmt("STMT_TRANS_OFF_1", FALSE)) == NULL)
			{
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
			}
			else
			{
				SQLValueList_def *inValueList;
				markNewOperator,inValueList = new SQLValueList_def();
				if (inValueList == NULL)
				{
					SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
							srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
							srvrGlobal->srvrObjRef, 1, "odbc_SQLSvc_ExecuteN_sme_");
					exit(0);
				}
				inValueList->_buffer = NULL;
				inValueList->_length = 0;
				rc = TranOffSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
				if (rc == SQL_ERROR)
				{
					exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
					exception_->u.SQLError.errorList._length = TranOffSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = TranOffSrvrStmt->sqlError.errorList._buffer;
				}
				else if (rc != SQL_SUCCESS)
				{
					exception_->exception_nr = 0;
					sqlWarning->_length = TranOffSrvrStmt->sqlWarning._length;
					sqlWarning->_buffer = TranOffSrvrStmt->sqlWarning._buffer;
				}
				delete inValueList;
			}
		}
		if (exception_->exception_nr == 0)
		{
			rc = EXECUTE(pSrvrStmt);
			switch (rc)
			{
			case ODBC_RG_WARNING:
				// if there is RG_WARNING, we don't pass SQL Warning to the application
				// Hence, we need to clear any warnings
				// call SQL_EXEC_ClearDiagnostics
				// CLEARDIAGNOSTICS(pSrvrStmt);
				rc = SQL_SUCCESS_WITH_INFO;
			case SQL_SUCCESS_WITH_INFO:
				GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
			case SQL_SUCCESS:
				exception_->exception_nr = 0;
				// Copy the output values
				*rowsAffected = pSrvrStmt->rowsAffected;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
				break;
			case SQL_STILL_EXECUTING:
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLStillExecuting_exn_;
				break;
			case SQL_INVALID_HANDLE:
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLInvalidHandle_exn_;
				break;
			case SQL_NEED_DATA:
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLNeedData_exn_;
				break;
			case SQL_ERROR:
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
			case ODBC_SERVER_ERROR:
				if (rc == ODBC_SERVER_ERROR)
				{
					// Allocate Error Desc
					kdsCreateSQLErrorException(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError, 1);
					// Add SQL Error
					kdsCopySQLErrorException(&pSrvrStmt->sqlError, NULL_VALUE_ERROR, NULL_VALUE_ERROR_SQLCODE,
							NULL_VALUE_ERROR_SQLSTATE);
				}
				ERROR_DESC_def *error_desc_def;
				error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
				if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
				{
					exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLQueryCancelled_exn_;
					exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
				break;
			case -8814:
			case 8814:
				rc = SQL_RETRY_COMPILE_AGAIN;
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLRetryCompile_exn_;
				break;
			case PROGRAM_ERROR:
				exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
			default:
				break;
			}
			if (resStatStatement != NULL)
			{
				resStatStatement->setStatistics(pSrvrStmt);
			}

			// batch job support for T4
			// Fix for transaction issue 20/09/06
			if ( bWMAutoCommitOff )
			{
				SQLValueList_def *inValueList;

				markNewOperator,inValueList = new SQLValueList_def();
				if (inValueList == NULL)
				{
					SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
							srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
							srvrGlobal->srvrObjRef, 1, "odbc_SQLSvc_ExecuteN_sme_");
					exit(0);
				}
				inValueList->_buffer = NULL;
				inValueList->_length = 0;

				if(WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
				{
					SRVR_STMT_HDL	*RbwSrvrStmt;
					SRVR_STMT_HDL	*CmwSrvrStmt;

					if (exception_->exception_nr != 0)
					{
						RbwSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
						rc = RbwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
					}
					else
					{
						CmwSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
						rc = CmwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
						if (rc == SQL_ERROR)
						{
							ERROR_DESC_def *error_desc_def = CmwSrvrStmt->sqlError.errorList._buffer;
							if (CmwSrvrStmt->sqlError.errorList._length != 0 )
							{
								if(error_desc_def->sqlcode != -8605 )
								{
									exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
									if (CEE_TMP_ALLOCATE(call_id_, 50, (void **)&(exception_->u.ParamError.ParamDesc)) == CEE_SUCCESS)
										sprintf(exception_->u.ParamError.ParamDesc, "%s (%d)",SQLSVC_EXCEPTION_EXECUTE_FAILED, error_desc_def->sqlcode);
									else
										exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
								}
								else
									rc = SQL_SUCCESS;
							}
							else
							{
								exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
								exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
							}
						}
						else if (rc != SQL_SUCCESS)
						{
							exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
							exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
						}
					}

				}

				// reset back to original setting
				SRVR_STMT_HDL	*TranOnSrvrStmt;
				if ((TranOnSrvrStmt = getSrvrStmt("STMT_TRANS_ON_1", FALSE)) == NULL)
				{
					exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
					exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
				}
				rc = TranOnSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
				if (rc == SQL_ERROR)
				{
					exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
					exception_->u.SQLError.errorList._length = TranOnSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = TranOnSrvrStmt->sqlError.errorList._buffer;
				}
				else if (rc != SQL_SUCCESS)
				{
					exception_->exception_nr = 0;
					sqlWarning->_length = TranOnSrvrStmt->sqlWarning._length;
					sqlWarning->_buffer = TranOnSrvrStmt->sqlWarning._buffer;
				}

				delete inValueList;
			}
		}
	}

	//  resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL  && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
		{
			inErrorStatement ++;

			ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
			inErrorCode = p_buffer->sqlcode;
			inSqlError = p_buffer->errorText;
			inSqlErrorLength = strlen(p_buffer->errorText);
		}
		if (sqlWarning->_length != 0)
			inWarningStatement ++;
		inRowCount = *rowsAffected;
		inQueryId = pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  pSrvrStmt->sqlNewQueryType,
							  pSrvrStmt->isClosed);
	}
	//end rs
	SRVRTRACE_EXIT(FILE_SME+2);
	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Prepare2'
 */
extern "C" void
odbc_SQLSvc_Prepare2_sme_(
    /* In    */ Int32 inputRowCnt
  , /* In    */ Int32 sqlStmtType
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_string sqlString
  , /* In    */ Int32 holdableCursor
  , /* Out   */ Int32 *returnCode
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE *&sqlWarningOrError
  , /* Out   */ Int32 *sqlQueryType
  , /* Out   */ Long *stmtHandle
  , /* Out   */ Int32 *estimatedCost
  , /* Out   */ Int32 *inputDescLength
  , /* Out   */ BYTE *&inputDesc
  , /* Out   */ Int32 *outputDescLength
  , /* Out   */ BYTE *&outputDesc
  , /* In    */ bool isFromExecDirect = false)
{
	SRVRTRACE_ENTER(FILE_SME+18);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQL_QUERY_COST_INFO cost_info;
	SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
	SQLRETURN rc = SQL_SUCCESS;

	bool bSkipWouldLikeToExecute = false; // some queries have to skip Would Like To Execute
	bool flag_21036 = false;

	if (sqlString ==  NULL)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY090", "Invalid SQL String.", sqlWarningOrErrorLength, sqlWarningOrError);
	}
	else
	{

		// resource statistics
		if (resStatStatement != NULL)
		{
			inState = STMTSTAT_PREPARE;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlQueryType = SQL_UNKNOWN;
			inSqlNewQueryType = SQL_UNKNOWN;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			bzero(&cost_info, sizeof(cost_info));
   			resStatStatement->start(inState,
									inSqlQueryType,
									stmtLabel,
									NULL,
									inEstimatedCost,
									&flag_21036,
									sqlString);
		}

		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
		{
			bSkipWouldLikeToExecute = pSrvrStmt->m_bSkipWouldLikeToExecute;

			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();
			if(pSrvrStmt->bSQLValueListSet)
				pSrvrStmt->cleanupSQLValueList();
			pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
			pSrvrStmt->freeResourceOpt = SQL_DROP;
			FREESTATEMENT(pSrvrStmt);
		}

		// Need to validate the stmtLabel
		// Given a label find out the SRVR_STMT_HDL
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
		{
				*returnCode = SQL_ERROR;
				GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label could not be allocated.", sqlWarningOrErrorLength, sqlWarningOrError);
		}
	}

	if (*returnCode == 0)
	{
		pSrvrStmt->m_bSkipWouldLikeToExecute = bSkipWouldLikeToExecute;

		*stmtHandle = (Long)pSrvrStmt;
		// cleanup all memory allocated in the previous operations
		pSrvrStmt->cleanupAll();
		if (resStatStatement != NULL)
			pSrvrStmt->inState = inState;
		pSrvrStmt->sqlStringLen = strlen(sqlString) + 1;
		pSrvrStmt->sqlString  = new char[pSrvrStmt->sqlStringLen];
		if (pSrvrStmt->sqlString == NULL)
		{

				SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
						srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
						srvrGlobal->srvrObjRef, 1, "Prepare2");
			exit(0);
		}

		strncpy(pSrvrStmt->sqlString, sqlString, pSrvrStmt->sqlStringLen);
		pSrvrStmt->sqlStmtType = (short)sqlStmtType;
		pSrvrStmt->maxRowsetSize = inputRowCnt;
		if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED) pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;

		if (srvrGlobal->srvrType == CORE_SRVR)
			AllocateAdaptiveSegment(pSrvrStmt);

		pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_;
		pSrvrStmt->holdableCursor = holdableCursor;
		rc = PREPARE2(pSrvrStmt,isFromExecDirect);

		if (srvrGlobal->srvrType == CORE_SRVR && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
			DeallocateAdaptiveSegment(pSrvrStmt);

		switch (rc)
		{
		case ODBC_RG_WARNING:
		case SQL_SHAPE_WARNING:
		case SQL_SUCCESS_WITH_INFO:
			*returnCode = SQL_SUCCESS_WITH_INFO;
			*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
			*sqlQueryType = pSrvrStmt->sqlQueryType;
			*inputDescLength = pSrvrStmt->inputDescBufferLength;
			inputDesc = pSrvrStmt->inputDescBuffer;
			*outputDescLength = pSrvrStmt->outputDescBufferLength;
			outputDesc = pSrvrStmt->outputDescBuffer;
			if (rc == SQL_SUCCESS_WITH_INFO)
			{
				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else if (rc == SQL_SHAPE_WARNING)
			{
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else
			{
				char *RGWarningOrError;
				RGWarningOrError = new char[256];
				sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
				sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
				GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
				delete RGWarningOrError;
			}
		break;
		case SQL_SUCCESS:
			*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
			*sqlQueryType = pSrvrStmt->sqlQueryType;
			*inputDescLength = pSrvrStmt->inputDescBufferLength;
			inputDesc = pSrvrStmt->inputDescBuffer;
			*outputDescLength = pSrvrStmt->outputDescBufferLength;
			outputDesc = pSrvrStmt->outputDescBuffer;
			break;
		case SQL_ERROR:
		case ODBC_RG_ERROR:
			*returnCode = SQL_ERROR;
			if (rc == SQL_ERROR)
			{
				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else
			{
				char *RGWarningOrError;
				RGWarningOrError = new char[256];
				sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
				sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
				GETMXCSWARNINGORERROR(-1, "HY000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
				delete RGWarningOrError;
			}
			break;
		case PROGRAM_ERROR:
				GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_PREPARE_FAILED, sqlWarningOrErrorLength, sqlWarningOrError);
			break;
		case INFOSTATS_SYNTAX_ERROR:
		case INFOSTATS_STMT_NOT_FOUND:
			*returnCode = SQL_ERROR;
			*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
			sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			break;

		default:
			break;
		}
	}

	//  resource statistics
	if (resStatStatement != NULL)
	{
		if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
		{
			inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
			inErrorStatement ++;
			inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
			inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
		}
		if (*returnCode == SQL_SUCCESS_WITH_INFO)
			inWarningStatement ++;

		if (sqlString == NULL)
			sqlString = "";


		if (pSrvrStmt != NULL)
		{
			inSqlString = new char[pSrvrStmt->sqlStringLen];
			if (inSqlString == NULL)
			{
				SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
						srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
						srvrGlobal->srvrObjRef, 1, "inSqlString");
				exit(0);
			}
			strncpy(inSqlString,sqlString,pSrvrStmt->sqlStringLen);

			inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
		}

		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &flag_21036,
							  inSqlNewQueryType);
		if(inSqlString != NULL)
			delete inSqlString;
	}
	//end rs


	if(pSrvrStmt != NULL)
		pSrvrStmt->m_need_21036_end_msg = flag_21036;

	SRVRTRACE_EXIT(FILE_SME+18);
	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Prepare2withRowsets'
 */
extern "C" void
odbc_SQLSvc_Prepare2withRowsets_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ Int32 sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* In    */ Int32 inputRowCnt
  , /* In    */ Int32 sqlStmtType
  , /* In    */ Int32 stmtLength
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ Int32 stmtLabelCharset
  , /* In    */ Int32 cursorLength
  , /* In    */ IDL_string cursorName
  , /* In    */ Int32 cursorCharset
  , /* In    */ Int32 moduleNameLength
  , /* In    */ const IDL_char *moduleName
  , /* In    */ Int32 moduleCharset
  , /* In    */ int64 moduleTimestamp
  , /* In    */ Int32 sqlStringLength
  , /* In    */ IDL_string sqlString
  , /* In    */ Int32 sqlStringCharset
  , /* In    */ Int32 setStmtOptionsLength
  , /* In    */ IDL_string setStmtOptions
  , /* In    */ Int32 holdableCursor
  , /* Out   */ Int32 *returnCode
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE *&sqlWarningOrError
  , /* Out   */ Int32 *sqlQueryType
  , /* Out   */ Long *stmtHandle
  , /* Out   */ Int32 *estimatedCost
  , /* Out   */ Int32 *inputDescLength
  , /* Out   */ BYTE *&inputDesc
  , /* Out   */ Int32 *outputDescLength
  , /* Out   */ BYTE *&outputDesc)
{
	SRVRTRACE_ENTER(FILE_SME+18);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQL_QUERY_COST_INFO cost_info;
	SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
	SQLRETURN rc = SQL_SUCCESS;
	bool flag_21036 = false;

	if (sqlString ==  NULL)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY090", "Invalid SQL String.", sqlWarningOrErrorLength, sqlWarningOrError);
	}
	else
	{

		// resource statistics
		if (resStatStatement != NULL)
		{
			inState = STMTSTAT_PREPARE;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlQueryType = SQL_UNKNOWN;
			inSqlNewQueryType = SQL_UNKNOWN;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			bzero(&cost_info, sizeof(cost_info));
   			resStatStatement->start(inState,
									inSqlQueryType,
									stmtLabel,
									NULL,
									inEstimatedCost,
									&flag_21036,
									sqlString);
		}

		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
		{
			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();
			if(pSrvrStmt->bSQLValueListSet)
				pSrvrStmt->cleanupSQLValueList();
			pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
			pSrvrStmt->freeResourceOpt = SQL_DROP;
			FREESTATEMENT(pSrvrStmt);
		}

		// Need to validate the stmtLabel
		// Given a label find out the SRVR_STMT_HDL
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
		{
				*returnCode = SQL_ERROR;
				GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
		}
	}
	if (*returnCode == 0)
	{
		*stmtHandle = (Long)pSrvrStmt;
		// cleanup all memory allocated in the previous operations
		pSrvrStmt->cleanupAll();
		if (resStatStatement != NULL)
			pSrvrStmt->inState = inState;
		pSrvrStmt->sqlStringLen = sqlStringLength;
		pSrvrStmt->sqlString  = new char[sqlStringLength];
		if (pSrvrStmt->sqlString == NULL)
		{

				SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
						srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
						srvrGlobal->srvrObjRef, 1, "Prepare2");
			exit(0);
		}

		strncpy(pSrvrStmt->sqlString, sqlString, sqlStringLength);
		pSrvrStmt->sqlStmtType = (short)sqlStmtType;
		pSrvrStmt->maxRowsetSize = inputRowCnt;
		if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED) pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;

// this part is for NAR (not Atomic Rowset Recovery)
		if (pSrvrStmt->maxRowsetSize > 1
            && (pSrvrStmt->sqlStmtType == TYPE_INSERT_PARAM))
//	        || pSrvrStmt->sqlStmtType == TYPE_UPDATE
//	        || pSrvrStmt->sqlStmtType == TYPE_DELETE))
		{
			if (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
				rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_NOT_ATOMIC,0);
			else
				rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_ATOMIC, 0);
			if (rc < 0)
			{
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
				return;
			}
		}

		if (srvrGlobal->srvrType == CORE_SRVR)
			AllocateAdaptiveSegment(pSrvrStmt);

		pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_;
		pSrvrStmt->holdableCursor = holdableCursor;
		rc = PREPARE2withRowsets(pSrvrStmt);

		if (srvrGlobal->srvrType == CORE_SRVR && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
			DeallocateAdaptiveSegment(pSrvrStmt);

		switch (rc)
		{
		case ODBC_RG_WARNING:
		case SQL_SHAPE_WARNING:
		case SQL_SUCCESS_WITH_INFO:
			*returnCode = SQL_SUCCESS_WITH_INFO;
			*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
			if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
				*sqlQueryType = 10000;
			else
				*sqlQueryType = pSrvrStmt->sqlQueryType;
			*inputDescLength = pSrvrStmt->inputDescBufferLength;
			inputDesc = pSrvrStmt->inputDescBuffer;
			*outputDescLength = pSrvrStmt->outputDescBufferLength;
			outputDesc = pSrvrStmt->outputDescBuffer;
			if (rc == SQL_SUCCESS_WITH_INFO)
			{
				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else if (rc == SQL_SHAPE_WARNING)
			{
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else
			{
				char RGWarningOrError[256];

				sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
				sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
				GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
			}
		break;
		case SQL_SUCCESS:
			*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
			if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
				*sqlQueryType = 10000;
			else
				*sqlQueryType = pSrvrStmt->sqlQueryType;
			*inputDescLength = pSrvrStmt->inputDescBufferLength;
			inputDesc = pSrvrStmt->inputDescBuffer;
			*outputDescLength = pSrvrStmt->outputDescBufferLength;
			outputDesc = pSrvrStmt->outputDescBuffer;
			break;
		case SQL_ERROR:
		case ODBC_RG_ERROR:
			*returnCode = SQL_ERROR;
			if (rc == SQL_ERROR)
			{
				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
			}
			else
			{
				char *RGWarningOrError;
				RGWarningOrError = new char[256];
				sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
				sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
				GETMXCSWARNINGORERROR(-1, "HY000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
				delete RGWarningOrError;
			}
			break;
		case PROGRAM_ERROR:
				GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_PREPARE_FAILED, sqlWarningOrErrorLength, sqlWarningOrError);
			break;
		default:
			break;
		}
	}

	//  resource statistics
	if (resStatStatement != NULL)
	{
		if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
		{
			inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
			inErrorStatement ++;
			inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
			inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
		}
		if (*returnCode == SQL_SUCCESS_WITH_INFO)
			inWarningStatement ++;

		if (sqlString == NULL)
			sqlString = "";

		inSqlString = new char[sqlStringLength];
		if (inSqlString == NULL)
		{
			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, "inSqlString");
			exit(0);
		}
		strncpy(inSqlString,sqlString,sqlStringLength);
		if (pSrvrStmt != NULL)
		{
			inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
		}
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &flag_21036,
							  inSqlNewQueryType);
		delete inSqlString;
	}
	//end rs
	pSrvrStmt->m_need_21036_end_msg = flag_21036;
	SRVRTRACE_EXIT(FILE_SME+18);
	return;
}  // end SQLSvc_Prepare2withRowsets_sme

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Execute2'
 */
extern "C" void
odbc_SQLSvc_Execute2_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ Int32 sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* In    */ Int32 inputRowCnt
  , /* In    */ Int32 sqlStmtType
  , /* In    */ Long stmtHandle
  , /* In    */ Int32 cursorLength
  , /* In    */ IDL_string cursorName
  , /* In    */ Int32 cursorCharset
  , /* In    */ Int32 holdableCursor
  , /* In    */ Int32 inValuesLength
  , /* In    */ BYTE *inValues
  , /* Out   */ Int32 *returnCode
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE *&sqlWarningOrError
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ Int32 *outValuesLength
  , /* Out   */ BYTE *&outValues)
{
	SRVRTRACE_ENTER(FILE_SME+19);

	bool bRePrepare2 = false;
	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
	}
	else
	{
		if (pSrvrStmt->current_holdableCursor != holdableCursor)
		{
			rePrepare2( pSrvrStmt
				  , sqlStmtType
				  , inputRowCnt
				  , holdableCursor
				  , &rc
				  , returnCode
				  , sqlWarningOrErrorLength
				  , sqlWarningOrError
				  );
			bRePrepare2 = true;
		}

		if (*returnCode == 0 || *returnCode == 1)
		{
		// resource statistics
			// generate the actual start message after reprepare, if any.
		if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
			inSqlStmtType = sqlStmtType;
			inEstimatedCost = pSrvrStmt->cost_info.totalTime;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
				inSqlError = NULL;
				inSqlErrorLength = 0;
			// For UPSERT statements force it as INSERT if the driver has sent a unknown type.
			if( inSqlStmtType == TYPE_UNKNOWN && (pSrvrStmt->sqlQueryType == SQL_INSERT_UNIQUE || pSrvrStmt->sqlQueryType == SQL_INSERT_NON_UNIQUE) )
				inSqlStmtType = TYPE_INSERT;
		}
		//end rs

		if (inputRowCnt < 0)
		{
			*returnCode = SQL_ERROR;
			GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
		}
		else
		{
			if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
			{
				*returnCode = SQL_ERROR;
				GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
			}
		}

		if (*returnCode == 0 || *returnCode == 1)
		{
			if ((*returnCode == 0) && (pSrvrStmt->sqlWarningOrErrorLength > 0)) // To preserve warning returned at prepare time
			{
				if (pSrvrStmt->sqlWarningOrError != NULL)
					delete pSrvrStmt->sqlWarningOrError;
				pSrvrStmt->sqlWarningOrErrorLength = 0;
				pSrvrStmt->sqlWarningOrError = NULL;
			}
			pSrvrStmt->inputRowCnt = inputRowCnt;
			pSrvrStmt->sqlStmtType = (short)sqlStmtType;

			if (cursorLength > 0)
			{
				pSrvrStmt->cursorNameLen = cursorLength;
				memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
				pSrvrStmt->cursorName[cursorLength] = '\0';
			}
			else
				pSrvrStmt->cursorName[0] = '\0';

			if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
			{
				//memcpy(pSrvrStmt->inputDescVarBuffer, (void *)&pSrvrStmt->inputRowCnt , sizeof(pSrvrStmt->inputRowCnt) );
				//memcpy(pSrvrStmt->inputDescVarBuffer+4, (void *)&pSrvrStmt->maxRowLen, sizeof(pSrvrStmt->maxRowLen) );
				*((Int32 *)pSrvrStmt->inputDescVarBuffer) = pSrvrStmt->inputRowCnt;
				*((Int32 *)(pSrvrStmt->inputDescVarBuffer+4)) = pSrvrStmt->maxRowLen;
				//*((Int32)pSrvrStmt->inputDescVarBuffer+8) = inValues  ;
				*((BYTE **)(pSrvrStmt->inputDescVarBuffer+8)) = inValues  ;

			}
			else
			{

				if (pSrvrStmt->inputDescVarBufferLen == inValuesLength)
					memcpy(pSrvrStmt->inputDescVarBuffer, inValues, inValuesLength);
				else
				{
					*returnCode = SQL_ERROR;
					GETMXCSWARNINGORERROR(-1, "HY090", "Invalid param Values.", sqlWarningOrErrorLength, sqlWarningOrError);
				}
			}

				if (bRePrepare2)
				{
					rc = rePrepare2WouldLikeToExecute((Long)pSrvrStmt, (Int32*)returnCode, (Int32*)sqlWarningOrErrorLength, (char*&)sqlWarningOrError);
					if (rc == false)
					{
						*rowsAffected = -1;
						if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT))
						{
							// generate 21036 start message
							resStatStatement->start(inState,
											pSrvrStmt->sqlQueryType,
											pSrvrStmt->stmtName,
											pSrvrStmt,
											inEstimatedCost,
											&pSrvrStmt->m_need_21036_end_msg,
											pSrvrStmt->sqlString);
						}
						goto out0;
					}
				}

				if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
				{
					resStatStatement->start(inState,
											pSrvrStmt->sqlQueryType,
											pSrvrStmt->stmtName,
											pSrvrStmt,
											inEstimatedCost,
											&pSrvrStmt->m_need_21036_end_msg,
											pSrvrStmt->sqlString);
				}

			pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
			rc = EXECUTE2(pSrvrStmt);

//			char tmpString[32];
//			tmpString[0] = '\0';
//			sprintf(tmpString, "e: %Ld", pSrvrStmt->cliElapseTime);
//			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
//					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
//					srvrGlobal->srvrObjRef, 1, tmpString);

			switch (rc)
			{
			case SQL_SUCCESS_WITH_INFO:
				*returnCode = SQL_SUCCESS_WITH_INFO;
				*rowsAffected = pSrvrStmt->rowsAffected;
				if (   pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
				    || pSrvrStmt->sqlStmtType  == TYPE_CALL)
				{
					*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
					outValues = pSrvrStmt->outputDescVarBuffer;
				}
				else
				{
					if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
					{
						if (inValues != NULL)
							*pSrvrStmt->inputDescVarBuffer = NULL;
					}
					*outValuesLength = 0;
					outValues = 0;
				}

				if (pSrvrStmt->sqlWarningOrErrorLength > 0) // overwriting warning returned at prepare time
				{
					if (pSrvrStmt->sqlWarningOrError != NULL)
						delete pSrvrStmt->sqlWarningOrError;
					pSrvrStmt->sqlWarningOrErrorLength = 0;
					pSrvrStmt->sqlWarningOrError = NULL;
				}

				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				break;
			case SQL_SUCCESS:
				*returnCode = SQL_SUCCESS;
				*rowsAffected = pSrvrStmt->rowsAffected;
				if (   pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
				    || pSrvrStmt->sqlStmtType  == TYPE_CALL)
				{
					*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
					outValues = pSrvrStmt->outputDescVarBuffer;
				}
				else
				{
					if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
					{
						if (inValues != NULL)
							*pSrvrStmt->inputDescVarBuffer = NULL;
					}
					*outValuesLength = 0;
					outValues = 0;
				}
				break;
			case SQL_NO_DATA_FOUND:
				*returnCode = SQL_NO_DATA_FOUND;
				break;
			case SQL_INVALID_HANDLE:
				*returnCode = SQL_ERROR;
				GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
				break;
			case SQL_ERROR:
				if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
				{
					if (pSrvrStmt->sqlWarningOrError != NULL)
						delete pSrvrStmt->sqlWarningOrError;
					pSrvrStmt->sqlWarningOrErrorLength = 0;
					pSrvrStmt->sqlWarningOrError = NULL;
				}

				GETSQLWARNINGORERROR2(pSrvrStmt);
				*returnCode = SQL_ERROR;
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				break;
			default:
				break;
			}
			if (resStatStatement != NULL)
			{
				// Should avoid collecting statistics for
				// statement types that do not fetch until end of data or close the stmt
				// during execute since it's causing issues in RMS.
					if( pSrvrStmt->sqlQueryType != SQL_SELECT_NON_UNIQUE && pSrvrStmt->sqlQueryType != SQL_CALL_WITH_RESULT_SETS)
						resStatStatement->setStatistics(pSrvrStmt);
				}
			}
out0:
		//  resource statistics
		if (resStatStatement != NULL  && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
			{
				inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
				inErrorStatement ++;
					inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
					inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
			}
			if (*returnCode == SQL_SUCCESS_WITH_INFO)
				inWarningStatement ++;
			if (pSrvrStmt->rowsAffectedHigherBytes != 0)
				inRowCount = -1;
			else
				inRowCount = *rowsAffected;
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			resStatStatement->end(inState,
								  inSqlQueryType,
								  inSqlStmtType,
								  inQueryId,
								  inEstimatedCost,
								  inSqlString,
								  inErrorStatement,
								  inWarningStatement,
								  inRowCount,
								  inErrorCode,
								  resStatSession,
									  inSqlErrorLength,
									  inSqlError,
									  pSrvrStmt,
								  &pSrvrStmt->m_need_21036_end_msg,
									  pSrvrStmt->sqlNewQueryType,
								  pSrvrStmt->isClosed);
		}
		//end rs
	}
	}
	SRVRTRACE_EXIT(FILE_SME+19);
	return;
}

//--------------------------------------------------------------------------------
/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Execute2withRowsets'
 */
extern "C" void
odbc_SQLSvc_Execute2withRowsets_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ Int32 sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* In    */ Int32 inputRowCnt
  , /* In    */ Int32 sqlStmtType
  , /* In    */ Long stmtHandle
  , /* In    */ Int32 cursorLength
  , /* In    */ IDL_string cursorName
  , /* In    */ Int32 cursorCharset
  , /* In    */ Int32 holdableCursor
  , /* In    */ Int32 inValuesLength
  , /* In    */ BYTE *inValues
  , /* Out   */ Int32 *returnCode
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE *&sqlWarningOrError
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ Int32 *outValuesLength
  , /* Out   */ BYTE *&outValues)
{
	SRVRTRACE_ENTER(FILE_SME+19);

	bool bRePrepare2 = false;

       /*
        * The performance team wanted to be able to stub out the actual inserts
        * to measure the contributions of individual components to the overall
        * load times. If the env variable mxosrvr-stubout-EXECUTE2withRowsets
        * is set in ms.env, we will skip over the call to EXECUTE2withRowsets
        * and return sql_success, and rowsAffected = input row count
        */
        static bool bCheckStubExecute2WithRowsets = true;
        static bool bStubExecute2WithRowsets = false;

        if(bCheckStubExecute2WithRowsets)
        {
           char *env = getenv("mxosrvr-stubout-EXECUTE2withRowsets");
           if (env != NULL && strcmp(env,"true") == 0)
              bStubExecute2WithRowsets = true;
           bCheckStubExecute2WithRowsets = false;
        }



	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
	}
	else
	{
		*returnCode = SQL_SUCCESS;
		if (inputRowCnt < 0)
		{
		}
		else if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
		{
		}
		else if ((pSrvrStmt->maxRowsetSize < inputRowCnt)  || (pSrvrStmt->current_holdableCursor != holdableCursor))
		{
			rePrepare2( pSrvrStmt
				  , sqlStmtType
				  , inputRowCnt
				  , holdableCursor
				  ,&rc
				  , returnCode
				  , sqlWarningOrErrorLength
				  , sqlWarningOrError
				  );
			bRePrepare2 = true;
		}

		if (*returnCode == 0 || *returnCode == 1)
		{
			// resource statistics
			// generate the actual start message after reprepare, if any.
			if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
			{
				pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
				inSqlStmtType = sqlStmtType;
				inEstimatedCost = pSrvrStmt->cost_info.totalTime;
				inQueryId = NULL;
				inSqlString = NULL;
				inErrorStatement = 0;
				inWarningStatement = 0;
				inRowCount = 0;
				inErrorCode = 0;
				inSqlError = NULL;
				inSqlErrorLength = 0;
			}
			//end rs

			if (inputRowCnt < 0)
			{
				*returnCode = SQL_ERROR;
				GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
			}
			else
			{
				if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
				{
					*returnCode = SQL_ERROR;
					GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
				}
			}

			if (*returnCode == 0 || *returnCode == 1)
			{
				// Fix for CR 5763/6389 - added additional checks to make sure the warnings, if any, are not lost from the
				// rePrepare2() call in SrvrConnect.cpp (returnCode could be 0).
				if ((*returnCode == 0) && (pSrvrStmt->sqlWarningOrErrorLength > 0) && pSrvrStmt->reprepareWarn == FALSE) // To preserve warning returned at prepare time
				{
					if (pSrvrStmt->sqlWarningOrError != NULL)
						delete pSrvrStmt->sqlWarningOrError;
					pSrvrStmt->sqlWarningOrErrorLength = 0;
					pSrvrStmt->sqlWarningOrError = NULL;
				}

				if (pSrvrStmt->bSQLMessageSet)
					pSrvrStmt->cleanupSQLMessage();
				if(pSrvrStmt->bSQLValueListSet)
					pSrvrStmt->cleanupSQLValueList();


				if ( (*returnCode == 0 && rc == 0) || (*returnCode == 1 && rc == 1) )
				{
					pSrvrStmt->inputRowCnt = inputRowCnt;
					pSrvrStmt->sqlStmtType = (short)sqlStmtType;

					if (cursorLength > 0)
					{
						pSrvrStmt->cursorNameLen = cursorLength;
						memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
					}
					else
						pSrvrStmt->cursorName[0] = '\0';


					if (pSrvrStmt->preparedWithRowsets == TRUE)
					{
						pSrvrStmt->transportBuffer = inValues;
						pSrvrStmt->transportBufferLen = inValuesLength;
					}
					else if (pSrvrStmt->inputDescVarBufferLen == inValuesLength)
						memcpy(pSrvrStmt->inputDescVarBuffer, inValues, inValuesLength);
					else
					{
						*returnCode = SQL_ERROR;
						GETMXCSWARNINGORERROR( -1
							 , "HY090"
							 , "Invalid param Values."
								 , sqlWarningOrErrorLength
								 , sqlWarningOrError
								 );
						goto out;
					}

					if (bRePrepare2)
					{
						// Note: The below method ends in a dummy call in CommonNSKFunctions.cpp. CR 5763 takes care of this.
						rc = rePrepare2WouldLikeToExecute((Long)pSrvrStmt, (Int32*)returnCode, (Int32*)sqlWarningOrErrorLength, (char*&)sqlWarningOrError);
						if (rc == false)
						{
							*rowsAffected = -1;
							if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT))
							{
								// generate 21036 start message
								resStatStatement->start(inState,
												pSrvrStmt->sqlQueryType,
												pSrvrStmt->stmtName,
												pSrvrStmt,
												inEstimatedCost,
												&pSrvrStmt->m_need_21036_end_msg,
												pSrvrStmt->sqlString);
							}
							goto out;
						}
					}

					// resource statistics
					if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
					{
						resStatStatement->start(inState,
												pSrvrStmt->sqlQueryType,
												pSrvrStmt->stmtName,
												pSrvrStmt,
												inEstimatedCost,
												&pSrvrStmt->m_need_21036_end_msg,
												pSrvrStmt->sqlString);
					}
					//end rs

					pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
                                        if(!bStubExecute2WithRowsets)
					   rc = EXECUTE2withRowsets(pSrvrStmt);
                                        else {
                                           rc = SQL_SUCCESS;
                                           pSrvrStmt->rowsAffected = inputRowCnt;
                                        }

					switch (rc)
					{
					case ROWSET_SQL_ERROR:
					// Copy the output values
						*rowsAffected = -1;

						if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
						{
							if (pSrvrStmt->sqlWarningOrError != NULL)
								delete pSrvrStmt->sqlWarningOrError;
							pSrvrStmt->sqlWarningOrErrorLength = 0;
							pSrvrStmt->sqlWarningOrError = NULL;
						}

						GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
						*returnCode = SQL_ERROR;
						*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
						sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
						  break;
					case SQL_SUCCESS_WITH_INFO:
						*returnCode = SQL_SUCCESS_WITH_INFO;
						*rowsAffected = pSrvrStmt->rowsAffected;
						if (   pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
							|| pSrvrStmt->sqlStmtType  == TYPE_CALL)
						{
							*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
							outValues = pSrvrStmt->outputDescVarBuffer;
						}
						else
						{
							*outValuesLength = 0;
							outValues = 0;
						}
						if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
						{
							if (pSrvrStmt->sqlWarningOrError != NULL)
								delete pSrvrStmt->sqlWarningOrError;
							pSrvrStmt->sqlWarningOrErrorLength = 0;
							pSrvrStmt->sqlWarningOrError = NULL;
						}

						if (pSrvrStmt->sqlWarning._length > 0)
							GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
						else
							GETSQLWARNINGORERROR2(pSrvrStmt);
						*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
						sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
						break;
					case SQL_SUCCESS:
						*returnCode = SQL_SUCCESS;
						*rowsAffected = pSrvrStmt->rowsAffected;
						if (pSrvrStmt->sqlWarning._length > 0)
						{
							if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
							{
								if (pSrvrStmt->sqlWarningOrError != NULL)
									delete pSrvrStmt->sqlWarningOrError;
								pSrvrStmt->sqlWarningOrErrorLength = 0;
								pSrvrStmt->sqlWarningOrError = NULL;
							}

							GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
							*returnCode = SQL_SUCCESS_WITH_INFO;  // We have warnings so return success witn info.
							*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
							sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
						}

						if (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
							|| pSrvrStmt->sqlStmtType  == TYPE_CALL)
						{
							*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
							outValues = pSrvrStmt->outputDescVarBuffer;
						}
						else
						{
							*outValuesLength = 0;
							outValues = 0;
						}
						break;
					case SQL_NO_DATA_FOUND:
						*returnCode = SQL_NO_DATA_FOUND;
						break;
					case SQL_INVALID_HANDLE:
						*returnCode = SQL_ERROR;
						GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
						break;
					case SQL_ERROR:
						if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
						{
							if (pSrvrStmt->sqlWarningOrError != NULL)
								delete pSrvrStmt->sqlWarningOrError;
							pSrvrStmt->sqlWarningOrErrorLength = 0;
							pSrvrStmt->sqlWarningOrError = NULL;
						}

						GETSQLWARNINGORERROR2(pSrvrStmt);
						*returnCode = SQL_ERROR;
						*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
						sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
						break;
					default:
						break;
					}
					if (resStatStatement != NULL)
					{
						// We don't need a check here similar to odbc_SQLSvc_Execute2_sme_()
						// since for rowsets we don't call
						// WSQL_EXEC_Exec().
						resStatStatement->setStatistics(pSrvrStmt);
					}
							  //
							  // The following transaction check was taken from Zbig.
							  //

					if (  sqlStmtType == TYPE_INSERT_PARAM
									  && (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
									  && pSrvrStmt->NA_supported == false
									  && srvrGlobal->bAutoCommitOn == true)
					{
						if (SQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
						{
								  // transaction is running - do commit/rollback
							SQLValueList_def inValueList;
							inValueList._buffer = NULL;
							inValueList._length = 0;

							if (rc == ROWSET_SQL_ERROR)
							{
								SRVR_STMT_HDL *RbwSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
								RbwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,&inValueList,SQL_ASYNC_ENABLE_OFF,0);
							}
							else
							{
								SRVR_STMT_HDL *CmwSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
								CmwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,&inValueList,SQL_ASYNC_ENABLE_OFF,0);
							}
						  }
					  }

					}
				}  // end if (*returnCode == 0 && rc == 0)
				//  resource statistics
out:
				if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
				{
					if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
					{
						inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
						inErrorStatement ++;
						inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
						inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
					}
					if (*returnCode == SQL_SUCCESS_WITH_INFO)
						inWarningStatement ++;
					if (pSrvrStmt->rowsAffectedHigherBytes != 0)
						inRowCount = -1;
					else
						inRowCount = *rowsAffected;
					inQueryId = pSrvrStmt->sqlUniqueQueryID;
					inSqlQueryType = pSrvrStmt->sqlQueryType;
					resStatStatement->end(inState,
										  inSqlQueryType,
										  inSqlStmtType,
										  inQueryId,
										  inEstimatedCost,
										  inSqlString,
										  inErrorStatement,
										  inWarningStatement,
										  inRowCount,
										  inErrorCode,
										  resStatSession,
										  inSqlErrorLength,
										  inSqlError,
										  pSrvrStmt,
										  &pSrvrStmt->m_need_21036_end_msg,
										  pSrvrStmt->sqlNewQueryType,
										  pSrvrStmt->isClosed);
				}
			}
	}  // end else

outout:
	pSrvrStmt->returnCodeForDelayedError = *returnCode;
	SRVRTRACE_EXIT(FILE_SME+19);
	return;
}  // end odbc_SQLSvc_Execute2withRowsets_sme_

//------------------------------------------------------------------------------
extern "C" void
rePrepare2( SRVR_STMT_HDL *pSrvrStmt
			, Int32			sqlStmtType
			, Int32			inputRowCnt
			, Int32		holdableCursor
			, SQLRETURN     *rc
			, Int32          *returnCode
			, Int32      *sqlWarningOrErrorLength
			, BYTE          *&sqlWarningOrError
			)
{
	UInt32	tmpSqlStringLen  = pSrvrStmt->sqlStringLen;
	char	*tmpSqlString;
	short	tmpStmtType      = pSrvrStmt->stmtType;
	short	tmpSqlStmtType   = sqlStmtType; // need to do this since PREPARE does not pass this from driver
	Int32	tmpMaxRowsetSize = pSrvrStmt->maxRowsetSize;
	Int32	sqlQueryType;
	Int32	estimatedCost;

	if (pSrvrStmt->sqlWarningOrErrorLength > 0) // To preserve warning returned at prepare time
	{
		if (pSrvrStmt->sqlWarningOrError != NULL)
			delete pSrvrStmt->sqlWarningOrError;
		pSrvrStmt->sqlWarningOrErrorLength = 0;
		pSrvrStmt->sqlWarningOrError = NULL;
	}

	if (pSrvrStmt->bSQLMessageSet)
		pSrvrStmt->cleanupSQLMessage();
	if(pSrvrStmt->bSQLValueListSet)
		pSrvrStmt->cleanupSQLValueList();

	tmpSqlString = new char[tmpSqlStringLen+1];
	if (tmpSqlString == NULL)
    {

			SendEventMsg( MSG_MEMORY_ALLOCATION_ERROR
                                   , EVENTLOG_ERROR_TYPE
									, srvrGlobal->nskProcessInfo.processId
                                   , ODBCMX_SERVER
                                   , srvrGlobal->srvrObjRef
                                   , 1
                                   , "Execute2"
                                   );
		exit(0);
	}
	strcpy(tmpSqlString, pSrvrStmt->sqlString);

  // cleanup all memory allocated in the previous operations
	pSrvrStmt->cleanupAll();
	pSrvrStmt->sqlStringLen = tmpSqlStringLen;

	pSrvrStmt->sqlString  = new char[pSrvrStmt->sqlStringLen+1];
	if (pSrvrStmt->sqlString == NULL)
    {

			SendEventMsg( MSG_MEMORY_ALLOCATION_ERROR
                                   , EVENTLOG_ERROR_TYPE
                                   , srvrGlobal->nskProcessInfo.processId
                                   , ODBCMX_SERVER
                                   , srvrGlobal->srvrObjRef
                                   , 1
                                   , "Execute2"
                                   );
		exit(0);
	}
	strcpy(pSrvrStmt->sqlString, tmpSqlString);

	pSrvrStmt->stmtType      = tmpStmtType;
	pSrvrStmt->sqlStmtType   = tmpSqlStmtType;
	pSrvrStmt->maxRowsetSize = inputRowCnt;
	pSrvrStmt->holdableCursor= holdableCursor;

	if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED)
		pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;

	// resource statistics
	if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		pSrvrStmt->inState = inState = STMTSTAT_PREPARE;
		inSqlStmtType = TYPE_UNKNOWN;
		inEstimatedCost = 0;
		inQueryId = NULL;
		inSqlString = NULL;
		inErrorStatement = 0;
		inWarningStatement = 0;
		inRowCount = 0;
		inErrorCode = 0;
		inSqlQueryType = SQL_UNKNOWN;
		inSqlNewQueryType = SQL_UNKNOWN;
		inSqlError = NULL;
		inSqlErrorLength = 0;
   		/*resStatStatement->start(inState,
								inSqlQueryType,
								pSrvrStmt->stmtName,
								NULL,
					pSrvrStmt->cost_info,
					pSrvrStmt->comp_stats_info,
					inEstimatedCost,
					&pSrvrStmt->m_need_21036_end_msg,
					false,
					tmpSqlString);*/
   		resStatStatement->start(inState,
					inSqlQueryType,
					pSrvrStmt->stmtName,
					pSrvrStmt,
								inEstimatedCost,
								&pSrvrStmt->m_need_21036_end_msg,
								tmpSqlString);
	}

	*rc = REALLOCSQLMXHDLS(pSrvrStmt); // This is a workaround for executor when we switch between OLTP vs NON-OLTP
	if (*rc < 0)
    {
		GETSQLWARNINGORERROR2(pSrvrStmt);
		*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
		sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
		goto out;
	}

	if (pSrvrStmt->sqlStmtType == TYPE_INSERT_PARAM)
    {
		if (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
			*rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_NOT_ATOMIC,0);
		else
			*rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_ATOMIC, 0);
		if (*rc < 0)
		{
			GETSQLWARNINGORERROR2(pSrvrStmt);
			goto out;
		}
		WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
	}
	if (srvrGlobal->srvrType == CORE_SRVR)
		AllocateAdaptiveSegment(pSrvrStmt);

	pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_; // KAS - bug. This should be Prepare2.
	if(pSrvrStmt->maxRowsetSize > 1)
		*rc = PREPARE2withRowsets(pSrvrStmt);
	else
		*rc = PREPARE2(pSrvrStmt);

	if (srvrGlobal->srvrType == CORE_SRVR && *rc != SQL_SUCCESS && *rc != SQL_SUCCESS_WITH_INFO)
		DeallocateAdaptiveSegment(pSrvrStmt);

	switch (*rc)
    {
	case ODBC_RG_WARNING:
    case SQL_SUCCESS_WITH_INFO:
		*returnCode = SQL_SUCCESS_WITH_INFO;
        estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // change to double in future
        sqlQueryType = pSrvrStmt->sqlQueryType;

		if (*rc == SQL_SUCCESS_WITH_INFO)
		{
			GETSQLWARNINGORERROR2(pSrvrStmt);
			*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
			sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
		}
		else
		{
			char RGWarningOrError[256];

			sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
			sprintf( RGWarningOrError
                  , "The query's estimated cost: %.50s exceeded resource management attribute limit set."
                  , b
                  );
			GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
		}
		break;
	case SQL_SUCCESS:
		WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
		estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // change to double in future
		sqlQueryType = pSrvrStmt->sqlQueryType;
		break;
    case SQL_ERROR:
    case ODBC_RG_ERROR:
		*returnCode = SQL_ERROR;
		if (*rc == SQL_ERROR)
		{
			GETSQLWARNINGORERROR2(pSrvrStmt);
			*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
			sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
		}
		else
		{
			char *RGWarningOrError;

			RGWarningOrError = new char[256];
			sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
			sprintf( RGWarningOrError
                  , "The query's estimated cost: %.50s exceeded resource management attribute limit set."
                  , b
                  );
			GETMXCSWARNINGORERROR( -1
                               , "HY000"
                               , RGWarningOrError
                               , sqlWarningOrErrorLength
                               , sqlWarningOrError
                               );
			delete RGWarningOrError;
		}
		break;
	case PROGRAM_ERROR:
		GETMXCSWARNINGORERROR( -1
                              , "HY000"
                              , SQLSVC_EXCEPTION_PREPARE_FAILED
                              , sqlWarningOrErrorLength
                              , sqlWarningOrError
                              );
		break;
	default:
		break;
	}  // end switch
out:
	//  resource statistics
	if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
		{
			inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
			inErrorStatement ++;
			inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
			inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
		}
		if (*returnCode == SQL_SUCCESS_WITH_INFO)
			inWarningStatement ++;

		if (tmpSqlString == NULL)
			tmpSqlString = "";

		inSqlString = new char[pSrvrStmt->sqlStringLen];
		if (inSqlString == NULL)
		{
			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, "inSqlString");
			exit(0);
		}
		strncpy(inSqlString,tmpSqlString,pSrvrStmt->sqlStringLen);
		if (pSrvrStmt != NULL)
		{
			inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
		}
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  inSqlNewQueryType);
		delete inSqlString;
		delete tmpSqlString;
	}
	//end rs
}  // end rePrepare2

//------------------------------------------------------------------------------
//LCOV_EXCL_START
/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Fetch2'
 */
extern "C" void
odbc_SQLSvc_Fetch2_sme_(
    /* In    */ CEE_tag_def           objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* In    */ DIALOGUE_ID_def       dialogueId
  , /* In    */ Int32              sqlAsyncEnable
  , /* In    */ Int32              queryTimeout
  , /* In    */ Long              stmtHandle
  , /* In    */ Int32              maxRowCnt
  , /* In    */ Int32              cursorLength
  , /* In    */ IDL_string            cursorName
  , /* In    */ Int32              cursorCharset
  , /* Out   */ Int32             *returnCode
  , /* Out   */ Int32             *sqlWarningOrErrorLength
  , /* Out   */ BYTE                *&sqlWarningOrError
  , /* Out   */ Int32             *rowsAffected
  , /* Out   */ Int32             *outValuesFormat
  , /* Out   */ Int32             *outValuesLength
  , /* Out   */ BYTE                 *&outValues)
  {
  SRVRTRACE_ENTER(FILE_SME+20);

  SRVR_STMT_HDL      *pSrvrStmt;

  SQLRETURN rc = SQL_SUCCESS;

  if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
    {
    *returnCode = SQL_ERROR;
    GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
    }
  else if (maxRowCnt < 0)
    {
    *returnCode = SQL_ERROR;
    GETMXCSWARNINGORERROR(-1, "HY000", "Max row count < 0.", sqlWarningOrErrorLength, sqlWarningOrError);
    }
  else if (pSrvrStmt->isClosed)
    *returnCode = SQL_NO_DATA_FOUND;
  else
    {
    pSrvrStmt->maxRowCnt = maxRowCnt;
    // resource statistics
    if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
      {
      pSrvrStmt->inState = inState = STMTSTAT_FETCH;
      inSqlStmtType      = TYPE_UNKNOWN;
      inEstimatedCost    = 0;
      inQueryId          = NULL;
      inSqlString        = NULL;
      inErrorStatement   = 0;
      inWarningStatement = 0;
      inRowCount         = 0;
      inErrorCode        = 0;
      inSqlError         = NULL;
      inSqlErrorLength   = 0;
      /* resStatStatement->start(inState,
							  pSrvrStmt->sqlQueryType,
							  pSrvrStmt->stmtName,
							  pSrvrStmt->sqlUniqueQueryID,
			  pSrvrStmt->cost_info,
			  pSrvrStmt->comp_stats_info,
			  inEstimatedCost,
			  &pSrvrStmt->m_need_21036_end_msg);*/
      resStatStatement->start(inState,
			  pSrvrStmt->sqlQueryType,
			  pSrvrStmt->stmtName,
			  pSrvrStmt,
							  inEstimatedCost,
							  &pSrvrStmt->m_need_21036_end_msg);
      }  // end if resource statistics

    if (pSrvrStmt->sqlWarningOrErrorLength > 0)
      {
      if (pSrvrStmt->sqlWarningOrError != NULL)
	delete pSrvrStmt->sqlWarningOrError;
      pSrvrStmt->sqlWarningOrErrorLength = 0;
      pSrvrStmt->sqlWarningOrError = NULL;
      }

    if (cursorLength > 0)
      {
      pSrvrStmt->cursorNameLen = cursorLength;
      memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
      }
    else
      pSrvrStmt->cursorName[0] = '\0';

    pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_;  // KAS - bug. Should be  Fetch2

    //
    // We will either use fetch bulk (also known as fetch "row wise rowsets") or fetch rowsets
    // (also known as fetch "column wise rowsets").
    //
    if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
      {
      if (pSrvrStmt->outputDataValue._buffer != NULL)
	delete pSrvrStmt->outputDataValue._buffer;
      pSrvrStmt->outputDataValue._buffer = NULL;
      pSrvrStmt->outputDataValue._length = 0;
      rc = FETCH2bulk(pSrvrStmt);
      *outValuesFormat = ROWWISE_ROWSETS;
      if (pSrvrStmt->rowsAffected > 0)
	{
        if (pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
	  {
	  outValues       = pSrvrStmt->outputDescVarBuffer;
	  *outValuesLength = (Int32)(pSrvrStmt->outputDescVarBufferLen * pSrvrStmt->rowsAffected);
	  }
        else
	  {
	  outValues       = pSrvrStmt->outputDataValue._buffer;
	  *outValuesLength = (Int32)(pSrvrStmt->outputDataValue._length);
          }
	}
      else
        {
	outValues       = NULL;
	*outValuesLength = 0;
	}
      }
    else
      rc = FETCH2(pSrvrStmt, outValuesFormat, outValuesLength, outValues);

    switch (rc)
      {
      case SQL_SUCCESS_WITH_INFO:
	   *returnCode = SQL_SUCCESS_WITH_INFO;
           *rowsAffected = pSrvrStmt->rowsAffected;
	   GETSQLWARNINGORERROR2(pSrvrStmt);
	   *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	   sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
	   break;
      case SQL_SUCCESS:
	   *returnCode = SQL_SUCCESS;
	   *rowsAffected = pSrvrStmt->rowsAffected;
	   break;
      case SQL_NO_DATA_FOUND:
	   *returnCode = SQL_NO_DATA_FOUND;
	   break;
      case SQL_INVALID_HANDLE:
	   *returnCode = SQL_ERROR;
	   GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
	   break;
      case SQL_ERROR:
	   GETSQLWARNINGORERROR2(pSrvrStmt);
	   *returnCode = SQL_ERROR;
	   *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	   sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
	   break;
      default:
	   break;
      }  // end switch

    if (resStatStatement != NULL && (rc == SQL_NO_DATA_FOUND || (rc == SQL_SUCCESS && *rowsAffected < maxRowCnt)))
      {
      resStatStatement->setStatistics(pSrvrStmt);
      }

    //  resource statistics
    if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
      {
      if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
      {
         inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
         inErrorStatement ++;
	     inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
	     inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
      }
      if (*returnCode == SQL_SUCCESS_WITH_INFO)
        inWarningStatement ++;
      inRowCount = *rowsAffected;
      inQueryId = pSrvrStmt->sqlUniqueQueryID;
	  inSqlQueryType = pSrvrStmt->sqlQueryType;
      resStatStatement->end(inState,
							inSqlQueryType,
							inSqlStmtType,
							inQueryId,
							inEstimatedCost,
							inSqlString,
							inErrorStatement,
							inWarningStatement,
							inRowCount,
							inErrorCode,
							resStatSession,
							inSqlErrorLength,
							inSqlError,
							pSrvrStmt,
							&pSrvrStmt->m_need_21036_end_msg,
							pSrvrStmt->sqlNewQueryType,
							pSrvrStmt->isClosed);
      }  // end resStatStatement != NULL
    }  // end if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL) else

  SRVRTRACE_EXIT(FILE_SME+20);

  return;

  }  // end odbc_SQLSvc_Fetch2_sme_
//LCOV_EXCL_STOP

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Close'
 */
extern "C" void
odbc_SQLSvc_Close_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_Close_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_unsigned_short freeResourceOpt
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning
  )
{
	SRVRTRACE_ENTER(FILE_SME+3);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if (freeResourceOpt != SQL_CLOSE && freeResourceOpt != SQL_DROP &&
		freeResourceOpt != SQL_UNBIND && freeResourceOpt != SQL_RESET_PARAMS)
	{
		exception_->exception_nr = odbc_SQLSvc_Close_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_RESOURCE_OPT_CLOSE;
	}
	else
	{
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
			goto ret; // Statement was never allocated.
		if (freeResourceOpt == SQL_CLOSE && pSrvrStmt->isClosed)
			goto ret;
	}

	if (exception_->exception_nr == 0)
	{
		// resource statistics
		if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->inState = inState = STMTSTAT_CLOSE;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg);*/
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg);
			// if SQLClose is called after SQLExecute/SQLExecdirect of select stmt,
			// END:SQLFetch/END:QueryExecution still needs to be generated
//			if (pSrvrStmt->isClosed == FALSE) pSrvrStmt->bFetchStarted = TRUE;

			if (pSrvrStmt->isClosed == FALSE)
			{
				pSrvrStmt->bFetchStarted = FALSE;
				if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
				{
					inErrorStatement ++;

					ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
					inErrorCode = p_buffer->sqlcode;
					inSqlError = p_buffer->errorText;
					inSqlErrorLength = strlen(p_buffer->errorText);
				}
				inQueryId=pSrvrStmt->sqlUniqueQueryID;
				inSqlQueryType = pSrvrStmt->sqlQueryType;
				resStatStatement->end(inState,
									  inSqlQueryType,
									  inSqlStmtType,
									  inQueryId,
									  inEstimatedCost,
									  inSqlString,
									  inErrorStatement,
									  inWarningStatement,
									  inRowCount,
									  inErrorCode,
									  resStatSession,
									  inSqlErrorLength,
									  inSqlError,
									  pSrvrStmt,
									  &pSrvrStmt->m_need_21036_end_msg,
									  pSrvrStmt->sqlNewQueryType,
									  pSrvrStmt->isClosed);
			}
		}
		//end rs
		rc = SQL_SUCCESS;
		if (pSrvrStmt->stmtType != INTERNAL_STMT)
		{
			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();
			if(pSrvrStmt->bSQLValueListSet)
				pSrvrStmt->cleanupSQLValueList();
			pSrvrStmt->freeResourceOpt = freeResourceOpt;
			pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;

            if (pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET)
			{
				// The result set can not be re-used, so remove it completely.
			  	freeResourceOpt = SQL_DROP;
			  	pSrvrStmt->freeResourceOpt = freeResourceOpt;
				delete [] pSrvrStmt->SpjProxySyntaxString;
				pSrvrStmt->SpjProxySyntaxString = NULL;
				pSrvrStmt->SpjProxySyntaxStringLen = 0;

			  	// remove the result set from the call statement
                SRVR_STMT_HDL *prev = pSrvrStmt->previousSpjRs;
                SRVR_STMT_HDL *next = pSrvrStmt->nextSpjRs;

                prev->nextSpjRs = next;
                if (next != NULL)
                   next->previousSpjRs = prev;

                // If prev is the call statement itself, and the call statement has no more
			  	// result sets, then close the call statement.
                if (prev->sqlQueryType == SQL_CALL_WITH_RESULT_SETS && prev->nextSpjRs == NULL)
			    	rc = FREESTATEMENT(prev);
			}

			rc = FREESTATEMENT(pSrvrStmt);
			// Return back immediately since the pSrvrStmt is deleted and return SQL_SUCCESS always
			if (freeResourceOpt == SQL_DROP)
			{
				rc = SQL_SUCCESS;
			}
			else
			{
				switch (rc)
				{
				case SQL_SUCCESS:
					break;
				case SQL_SUCCESS_WITH_INFO:
					GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
					break;
				case SQL_ERROR:
					GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
					break;
				case ODBC_RG_WARNING:
					// if there is RG_WARNING, we don't pass SQL Warning to the application
					// Hence, we need to clear any warnings
					// call SQL_EXEC_ClearDiagnostics
					// CLEARDIAGNOSTICS(pSrvrStmt);
					rc = SQL_SUCCESS_WITH_INFO;
				case ODBC_SERVER_ERROR:
				case ODBC_RG_ERROR:
				default:
					break;
				}
			}
		}

		switch (rc)
		{
		case SQL_SUCCESS:
		case SQL_SUCCESS_WITH_INFO:
			exception_->exception_nr = 0;
			if (freeResourceOpt != SQL_DROP)
			{
				*rowsAffected = pSrvrStmt->rowsAffected;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
			}
			else
			{
				*rowsAffected = 0;
				sqlWarning->_length = 0;
				sqlWarning->_buffer = NULL;
			}
			break;
		case SQL_ERROR:
			exception_->exception_nr = odbc_SQLSvc_Close_SQLError_exn_;
			exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
			exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
			break;
		case PROGRAM_ERROR:
			exception_->exception_nr = odbc_SQLSvc_Close_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_CLOSE_FAILED;
		default:
			break;
		}
	}

ret:
/* This code is moved to the begining of this method since pSrvrStmt is deleted in case of a
   SQL_DROP.

	// resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		pSrvrStmt->bFetchStarted = FALSE;
		if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
		{
			inErrorStatement ++;
			inErrorCode = exception_->u.SQLError.errorList._buffer->sqlcode;
		}
		inQueryId=pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->end(inState,inSqlQueryType,inSqlStmtType,inQueryId,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode,resStatSession,pSrvrStmt->isClosed);
	}
*/
	SRVRTRACE_EXIT(FILE_SME+3);
	return;
}

//------------------------------------------------------------------------------
/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_Close'
 */
extern "C" void
odbc_SQLSrvr_Close_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_unsigned_short freeResourceOpt
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ Int32 *returnCode
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE *&sqlWarningOrError
  )
{
	SRVRTRACE_ENTER(FILE_SME+3);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if (freeResourceOpt != SQL_CLOSE && freeResourceOpt != SQL_DROP &&
		freeResourceOpt != SQL_UNBIND && freeResourceOpt != SQL_RESET_PARAMS)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_INVALID_RESOURCE_OPT_CLOSE, sqlWarningOrErrorLength, sqlWarningOrError);
	}
	else
	{
		pSrvrStmt = getSrvrStmt(stmtLabel, FALSE);
		if(pSrvrStmt == NULL)
			goto ret; // Statement was never allocated.
		else
		{
			if (pSrvrStmt->sqlWarningOrErrorLength > 0 &&
				pSrvrStmt->sqlWarningOrError != NULL)
			{
	           delete pSrvrStmt->sqlWarningOrError;
			}
            pSrvrStmt->sqlWarningOrErrorLength = 0;
            pSrvrStmt->sqlWarningOrError = NULL;
		}

		if (freeResourceOpt == SQL_CLOSE && pSrvrStmt->isClosed)
			goto ret;
	}

	if (*returnCode == SQL_SUCCESS)
	{
		// resource statistics
        if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->inState = inState = STMTSTAT_CLOSE;
			pSrvrStmt->m_bqueryFinish = true;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg);*/
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg);

			if (pSrvrStmt->isClosed == FALSE)
			{
				pSrvrStmt->bFetchStarted = FALSE;
				if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
				{
					inErrorStatement ++;
					inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
					inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
					inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
				}
				inQueryId=pSrvrStmt->sqlUniqueQueryID;
				inSqlQueryType = pSrvrStmt->sqlQueryType;

				if (pSrvrStmt->m_need_21036_end_msg)
				{
				resStatStatement->end(inState,
									  inSqlQueryType,
									  inSqlStmtType,
									  inQueryId,
									  inEstimatedCost,
									  inSqlString,
									  inErrorStatement,
									  inWarningStatement,
									  inRowCount,
									  inErrorCode,
									  resStatSession,
										inSqlErrorLength,
										inSqlError,
										pSrvrStmt,
									  &pSrvrStmt->m_need_21036_end_msg,
										pSrvrStmt->sqlNewQueryType,
									  pSrvrStmt->isClosed);
			}

			}
		}
		//end rs

		qrysrvcExecuteFinished(NULL, (Long)pSrvrStmt, false, *returnCode, false, false, true);

		if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT)) // if statement is on
		{

			resStatStatement->endRepository(pSrvrStmt,
						inSqlErrorLength,
						(BYTE*)inSqlError,
						true);
		}

		rc = SQL_SUCCESS;

		if (pSrvrStmt->stmtType != INTERNAL_STMT)
		{
			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();
			if(pSrvrStmt->bSQLValueListSet)
				pSrvrStmt->cleanupSQLValueList();
			pSrvrStmt->freeResourceOpt = freeResourceOpt;
			pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;

            if (pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET)
			{
				// The result set can not be re-used, so remove it completely.
			  	freeResourceOpt = SQL_DROP;
			  	pSrvrStmt->freeResourceOpt = freeResourceOpt;

				// Added deletion of proxy syntax
				delete [] pSrvrStmt->SpjProxySyntaxString;
				pSrvrStmt->SpjProxySyntaxString = NULL;
				pSrvrStmt->SpjProxySyntaxStringLen = 0;

			  	// remove the result set from the call statement
                SRVR_STMT_HDL *prev = pSrvrStmt->previousSpjRs;
                SRVR_STMT_HDL *next = pSrvrStmt->nextSpjRs;

                prev->nextSpjRs = next;
                if (next != NULL)
                   next->previousSpjRs = prev;

                // If prev is the call statement itself, and the call statement has no more
			  	// result sets, then close the call statement.
                if (prev->sqlQueryType == SQL_CALL_WITH_RESULT_SETS && prev->nextSpjRs == NULL)
			    	rc = FREESTATEMENT(prev);
			}

			rc = FREESTATEMENT(pSrvrStmt);
			// Return back immediately since the pSrvrStmt is deleted and return SQL_SUCCESS always
			if (freeResourceOpt == SQL_DROP)
			{
				rc = SQL_SUCCESS;
			}
			else
			{
				if(rc == SQL_SUCCESS_WITH_INFO ||
				   rc == SQL_ERROR )
				{
 		           GETSQLWARNINGORERROR2(pSrvrStmt);
  	               *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	               sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				}
			}
		}

		switch (rc)
		{
		   case SQL_SUCCESS:
		      *returnCode = SQL_SUCCESS;
			  if (freeResourceOpt != SQL_DROP)
			     *rowsAffected = pSrvrStmt->rowsAffected;
			  else
				  *rowsAffected = 0;
			  break;

		   case SQL_SUCCESS_WITH_INFO:
			  *returnCode = SQL_SUCCESS_WITH_INFO;
			  if (freeResourceOpt != SQL_DROP)
			     *rowsAffected = pSrvrStmt->rowsAffected;
			  else
				*rowsAffected = 0;
 			 break;

		   case SQL_ERROR:
		      *returnCode = SQL_ERROR;
			  break;

		   default:
		      break;
		}
	}

ret:
/* This code is moved to the begining of this method since pSrvrStmt is deleted in case of a
   SQL_DROP.

	// resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		pSrvrStmt->bFetchStarted = FALSE;
		if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
		{
			inErrorStatement ++;
			inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
		}
		inQueryId=pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->end(inState,inSqlQueryType,inSqlStmtType,inQueryId,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode,resStatSession,pSrvrStmt->isClosed);
	}
*/
	SRVRTRACE_EXIT(FILE_SME+3);
	return;

} /* odbc_SQLSrvr_Close_sme_() */


/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_FetchN'
 */
extern "C" void
odbc_SQLSvc_FetchN_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_FetchN_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ Int32 maxRowCnt
  , /* In    */ Int32 maxRowLen
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ SQLValueList_def *outputValueList
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning
  )
{
	SRVRTRACE_ENTER(FILE_SME+4);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if (maxRowCnt < 0)
	{
		exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
	}
	else
	{
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
		{
			exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
		}
	}
	if (exception_->exception_nr == 0)
	{
		// resource statistics
		if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->bFetchStarted = TRUE;
			pSrvrStmt->inState = inState = STMTSTAT_FETCH;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg);*/
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg);
		}
		 //end rs
		rc = SQL_SUCCESS;
		if (pSrvrStmt->bSQLMessageSet)
			pSrvrStmt->cleanupSQLMessage();
		if (pSrvrStmt->outputValueList._buffer == NULL  || pSrvrStmt->maxRowCnt < maxRowCnt)
		{
			if(pSrvrStmt->bSQLValueListSet)
				pSrvrStmt->cleanupSQLValueList();
			rc = AllocAssignValueBuffer(pSrvrStmt->bSQLValueListSet,&pSrvrStmt->outputDescList,
				&pSrvrStmt->outputValueList, pSrvrStmt->outputDescVarBufferLen,
				maxRowCnt, pSrvrStmt->outputValueVarBuffer);
		}
		else
			// Reset the length to 0, but the _buffer points to array of required SQLValue_defs
			pSrvrStmt->outputValueList._length = 0;

		if (rc == SQL_SUCCESS)
		{
			pSrvrStmt->maxRowCnt = maxRowCnt;
			pSrvrStmt->maxRowLen = maxRowLen;
			pSrvrStmt->currentMethod = odbc_SQLSvc_FetchN_ldx_;
			rc = FETCH(pSrvrStmt);
			switch (rc)
			{
			case SQL_SUCCESS:
				break;
			case SQL_SUCCESS_WITH_INFO:
				GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
				break;
			case SQL_ERROR:
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
				break;
			case ODBC_RG_WARNING:
				// if there is RG_WARNING, we don't pass SQL Warning to the application
				// Hence, we need to clear any warnings
				// call SQL_EXEC_ClearDiagnostics
				// CLEARDIAGNOSTICS(pSrvrStmt);
				rc = SQL_SUCCESS_WITH_INFO;
			case ODBC_SERVER_ERROR:
			case ODBC_RG_ERROR:
			default:
				break;
			}
		}
		switch (rc)
		{
		case SQL_SUCCESS:
		case SQL_SUCCESS_WITH_INFO:
			exception_->exception_nr = 0;
			*rowsAffected = pSrvrStmt->rowsAffected;
			outputValueList->_length = pSrvrStmt->outputValueList._length;
			outputValueList->_buffer = pSrvrStmt->outputValueList._buffer;
			sqlWarning->_length = pSrvrStmt->sqlWarning._length;
			sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
			break;
		case SQL_STILL_EXECUTING:
			exception_->exception_nr = odbc_SQLSvc_FetchN_SQLStillExecuting_exn_;
			break;
		case SQL_INVALID_HANDLE:
			exception_->exception_nr = odbc_SQLSvc_FetchN_SQLInvalidHandle_exn_;
			break;
		case SQL_NO_DATA_FOUND:
			exception_->exception_nr = odbc_SQLSvc_FetchN_SQLNoDataFound_exn_;
			break;
		case SQL_ERROR:
			ERROR_DESC_def *error_desc_def;
			error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
			if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
			{
				exception_->exception_nr = odbc_SQLSvc_FetchN_SQLQueryCancelled_exn_;
				exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
			}
			else
			{
				exception_->exception_nr = odbc_SQLSvc_FetchN_SQLError_exn_;
				exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
				exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
			}
			break;
		case PROGRAM_ERROR:
			exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_FETCH_FAILED;
		default:
			break;
		}
		if (resStatStatement != NULL && (rc == SQL_NO_DATA_FOUND || rc == SQL_ERROR || ((rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))
			resStatStatement->setStatistics(pSrvrStmt);
	}

	//resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		if (rc == SQL_ERROR  && exception_->u.SQLError.errorList._buffer != NULL)
		{
			ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
			inErrorCode = p_buffer->sqlcode;
			inSqlError = p_buffer->errorText;
			inSqlErrorLength = strlen(p_buffer->errorText);
		}
		pSrvrStmt->bFetchStarted = FALSE;
		Int32 inMaxRowCnt = 0;
		Int32 inMaxRowLen = 0;

		inMaxRowCnt = maxRowCnt;
		inMaxRowLen = maxRowLen;

		if (exception_->exception_nr != 0)
		  inErrorStatement ++;
		else
		  setStatisticsFlag = FALSE;

		if (sqlWarning->_length != 0)
			inWarningStatement ++;
		if (exception_->exception_nr == 5)
		{
			inErrorStatement = 0;
			inWarningStatement = 0;
			setStatisticsFlag = TRUE;
		}
		inQueryId = pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->setStatisticsFlag(setStatisticsFlag);
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  pSrvrStmt->sqlNewQueryType,
							  pSrvrStmt->isClosed);
	}
	// end rs
	SRVRTRACE_EXIT(FILE_SME+4);
	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_EndTransaction'
 */
extern "C" void
odbc_SQLSvc_EndTransaction_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_EndTransaction_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ IDL_unsigned_short transactionOpt
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning
 )
{
	SRVRTRACE_ENTER(FILE_SME+5);

	char stmtLabel[MAX_STMT_LABEL_LEN+1];
	Int32 rc = SQL_SUCCESS;
	SRVR_STMT_HDL	*pSrvrStmt = NULL;

	switch (transactionOpt) {
	case SQL_COMMIT:
		pSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
		break;
	case SQL_ROLLBACK:
		pSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
		break;
	default:
		exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_TRANSACT_OPT;
		return;
	}

	if (pSrvrStmt == NULL)
	{
		exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
	}
	else
	{
		if (pSrvrStmt->bSQLMessageSet)
			pSrvrStmt->cleanupSQLMessage();
		if(pSrvrStmt->bSQLValueListSet)
			pSrvrStmt->cleanupSQLValueList();
		pSrvrStmt->inputRowCnt = 1;
		pSrvrStmt->sqlStmtType = TYPE_UNKNOWN;
		pSrvrStmt->cursorName[0] = '\0';
		pSrvrStmt->cursorNameLen = 0;

		pSrvrStmt->inputValueList._buffer = NULL;
		pSrvrStmt->inputValueList._length = 0;

		pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;

		rc = EXECUTE(pSrvrStmt);
		if (rc == SQL_ERROR)
		{
			GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
			ERROR_DESC_def *error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
			if (pSrvrStmt->sqlError.errorList._length != 0 )
			{
				if (error_desc_def != NULL && (error_desc_def->sqlcode == -8605 || error_desc_def->sqlcode == -8607 ||	error_desc_def->sqlcode == -8609))
				{
					exception_->exception_nr = 0;
					sqlWarning->_length = 0;
					sqlWarning->_buffer = NULL;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_EndTransaction_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
			}
			else
			{
				exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_TRANSACT_OPT;
			}
		}
		else if (rc != SQL_SUCCESS)
		{
			GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
			exception_->exception_nr = 0;
			sqlWarning->_length = pSrvrStmt->sqlWarning._length;
			sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
		}
	}

	SRVRTRACE_EXIT(FILE_SME+5);
	return;
}
//LCOV_EXCL_START
/*
 * Synchronous method function prototype for
 * operation 'odbc_SQLSvc_ExecDirect'
 */
extern "C" void
odbc_SQLSvc_ExecDirect_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_ExecDirect_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_string cursorName
  , /* In    */ const IDL_char *stmtExplainLabel
  , /* In    */ IDL_short stmtType
  , /* In    */ IDL_short sqlStmtType
  , /* In    */ IDL_string sqlString
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *estimatedCost
  , /* Out   */ SQLItemDescList_def *outputDesc
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning)
{
	SRVRTRACE_ENTER(FILE_SME+6);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;
	Int32 holdestimatedCost;

	if (sqlString ==  NULL)
	{
		exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_NULL_SQL_STMT;
	}
	else
	{
		// resource statistics
		if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
		{
			inState = STMTSTAT_EXECDIRECT;
			inSqlStmtType = sqlStmtType;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
//			resStatStatement->start(inState, stmtLabel, NULL, inEstimatedCost, sqlString); called in EXECDIRECT
		}
		//end rs

		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
		{
			pSrvrStmt->cleanupAll();
			pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
			pSrvrStmt->freeResourceOpt = SQL_DROP;
			FREESTATEMENT(pSrvrStmt);
		}
		// Need to validate the stmtLabel
		// Given a label find out the SRVR_STMT_HDL
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
		{
			exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
		}
	}

	if (exception_->exception_nr == 0)
	{
		pSrvrStmt->cleanupAll();
		if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
			pSrvrStmt->inState = inState;
		pSrvrStmt->sqlStringLen = strlen(sqlString);
		pSrvrStmt->sqlString  = new char[pSrvrStmt->sqlStringLen+1];
		if (pSrvrStmt->sqlString == NULL)
		{

				SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
				srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
				srvrGlobal->srvrObjRef, 1, "ExecDirect");
			exit(0);
		}
		strcpy(pSrvrStmt->sqlString, sqlString);
		pSrvrStmt->sqlStmtType = sqlStmtType;

		if (exception_->exception_nr == 0)
		{
			pSrvrStmt->stmtType = stmtType;
			if (cursorName != NULL && cursorName[0] != '\0')
			{
				pSrvrStmt->cursorNameLen = strlen(cursorName);
				pSrvrStmt->cursorNameLen = pSrvrStmt->cursorNameLen < sizeof(pSrvrStmt->cursorName)? pSrvrStmt->cursorNameLen : sizeof(pSrvrStmt->cursorName);
				strncpy(pSrvrStmt->cursorName, cursorName, sizeof(pSrvrStmt->cursorName));
				pSrvrStmt->cursorName[sizeof(pSrvrStmt->cursorName)-1] = 0;
			}
			else
				pSrvrStmt->cursorName[0] = '\0';

			pSrvrStmt->currentMethod = odbc_SQLSvc_ExecDirect_ldx_;
			rc = EXECDIRECT(pSrvrStmt);
			switch (rc)
			{
			case SQL_SUCCESS:
				break;
			case SQL_SUCCESS_WITH_INFO:
				GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
				break;
			case SQL_ERROR:
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
				break;
			case ODBC_RG_WARNING:
				// if there is RG_WARNING, we don't pass SQL Warning to the application
				// Hence, we need to clear any warnings
				// call SQL_EXEC_ClearDiagnostics
				// CLEARDIAGNOSTICS(pSrvrStmt);
				rc = SQL_SUCCESS_WITH_INFO;
			case ODBC_SERVER_ERROR:
			case ODBC_RG_ERROR:
			default:
				break;
			}
			switch (rc)
			{
			case SQL_SUCCESS:
			case SQL_SUCCESS_WITH_INFO:
				break;
			default:
				break;
			}
			switch (rc)
			{
			case SQL_SUCCESS:
			case SQL_SUCCESS_WITH_INFO:
				exception_->exception_nr = 0;
				// Vijay - Changes to support not to parse tokens for statement type SELECT
				holdestimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime
				if ((pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)  || (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE))
					pSrvrStmt->sqlStmtType = TYPE_SELECT;
				*estimatedCost = pSrvrStmt->sqlQueryType;
				*rowsAffected = pSrvrStmt->rowsAffected;
				outputDesc->_length = pSrvrStmt->outputDescList._length;
				outputDesc->_buffer = pSrvrStmt->outputDescList._buffer;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
				break;
			case SQL_STILL_EXECUTING:
				exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLStillExecuting_exn_;
				break;
			case ODBC_RG_ERROR:
			case SQL_ERROR:
			case INFOSTATS_STMT_NOT_FOUND:
				ERROR_DESC_def *error_desc_def;
				error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
				if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
				{
					exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLQueryCancelled_exn_;
					exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
				break;
			case PROGRAM_ERROR:
				exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
				break;
			default:
				break;
			}
			if (resStatStatement != NULL)
				resStatStatement->setStatistics(pSrvrStmt);
		}
	}
	// resource statistics
	if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
	{
		if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
		{
			inErrorStatement ++;

			ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
			inErrorCode = p_buffer->sqlcode;
			inSqlError = p_buffer->errorText;
			inSqlErrorLength = strlen(p_buffer->errorText);
		}

		if (sqlWarning->_length != 0)
			inWarningStatement ++;
		inRowCount = *rowsAffected;
		if (sqlString == NULL)
			sqlString = "";

		inSqlString = new char[strlen(sqlString) + 1];
		if (inSqlString == NULL)
		{
			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, "inSqlString");
			exit(0);
		}
		strcpy(inSqlString,sqlString);
		if (pSrvrStmt != NULL)
		{
			if (holdestimatedCost == -1)
				inEstimatedCost = 0;
			else
				inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
			inQueryId = pSrvrStmt->sqlUniqueQueryID;
			inSqlQueryType = pSrvrStmt->sqlQueryType;
			inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
		}
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  inSqlNewQueryType,
							  pSrvrStmt->isClosed);
		delete inSqlString;
	}
	//end rs
	SRVRTRACE_EXIT(FILE_SME+6);
	return;
}
//LCOV_EXCL_STOP


// Cut extra parts of varchar in outputDataValue  to make data compaction
long long  clipVarchar(SRVR_STMT_HDL *pSrvrStmt )
{
    if(srvrGlobal->clipVarchar == 0)
    {
        return pSrvrStmt->outputDescVarBufferLen*pSrvrStmt->rowsAffected;
    }
    BYTE * desc = pSrvrStmt->outputDescBuffer; 
    BYTE *VarPtr = pSrvrStmt->outputDescVarBuffer;
    long long remainLen = 0;
    int numEntries = pSrvrStmt->columnCount;
    int rowsAffected = pSrvrStmt->rowsAffected ;
    int bufferRowLen = pSrvrStmt->outputDescVarBufferLen;
    long long * colBuferLen = new long long [numEntries] ;
    long startOffset = 0;
    long varcharCount = 0; //counter of varchar column per row 
    BYTE * cpStart = VarPtr;
    BYTE * cpEnd   = cpStart;
    BYTE * colEnd  = cpStart;
    BYTE * bufferOffset  = cpStart;
    int IndBuf,VarBuf;
    int i = 0,j = 0;
    for(j = 0 ; j < numEntries ; j++)//Calculate the data length of each column
    {
        if(pSrvrStmt->SqlDescInfo[j].DataType ==SQLTYPECODE_VARCHAR_WITH_LENGTH)
            varcharCount ++;
        if(j == numEntries -1 ){
            colBuferLen[j] = bufferRowLen - remainLen;
            if(varcharCount == 0)
            {
                // if there is no varchar in the data do nothing and  return
                delete [] colBuferLen;
                return pSrvrStmt->outputDescVarBufferLen*pSrvrStmt->rowsAffected;
            }
        }
        else
        {
            IndBuf = *(int*)(desc+pSrvrStmt->SqlDescInfo[j+1].IndBuf) ;
            VarBuf = *(int*)(desc+pSrvrStmt->SqlDescInfo[j+1].VarBuf);
            if(IndBuf == -1)
            {
                colBuferLen[j] = VarBuf - startOffset;
                startOffset = VarBuf;
            }
            else
            {
                colBuferLen[j] = IndBuf - startOffset;
                startOffset = IndBuf;
            }
            remainLen += colBuferLen[j];
        }
    }
    for( i = 0; i < rowsAffected ; i++){//do clip 
        for (j = 0 ; j < numEntries ; j++)
        {
            switch (pSrvrStmt->SqlDescInfo[j].DataType)
            {
                case SQLTYPECODE_VARCHAR_WITH_LENGTH:
                    /*
                                             |--------------column 1 ------|--------------column 2 ------|
                     column format nullable: |align_1|indPtr|align_2|varPtr|align_1|indPtr|align_2|varPtr|

                                             |--column 1--|--column 2--|
                     column format not null: |align|varPtr|align|varPtr|
                     indPtr is the pointer to store nullable info ,if column value is null indPtr = -1
                     if varPtr is pointer to store column value 
                     IndBuf is the offset of indPtr
                     VarBuf is the offset of varPtr

                    */
                    IndBuf = *(int*)(desc+pSrvrStmt->SqlDescInfo[j].IndBuf);
                    VarBuf = *(int*)(desc+pSrvrStmt->SqlDescInfo[j].VarBuf);
                    if(IndBuf != -1 && (*(short*)(VarPtr+IndBuf + i*bufferRowLen) == -1))
                    {
                        cpEnd = cpStart+VarBuf-IndBuf;
                        colEnd = cpStart + colBuferLen[j];
                        break;
                    }
                    if( pSrvrStmt->SqlDescInfo[j].Length > SHRT_MAX )
                    {
                        cpEnd = VarPtr+VarBuf + i*bufferRowLen + 4 + *(int*)(VarPtr+VarBuf+i*bufferRowLen);
                    }
                    else
                    {
                        cpEnd =  VarPtr+VarBuf + i*bufferRowLen + 2 + *(short*)(VarPtr+VarBuf+i*bufferRowLen);

                    }
                    colEnd = cpStart + colBuferLen[j];
                    break;
                default:
                    cpEnd = cpStart + colBuferLen[j];
                    colEnd = cpEnd;
                    break;
            }
            if(cpStart != bufferOffset)
            {
                memcpy(bufferOffset,cpStart,cpEnd-cpStart);
            }

            bufferOffset += cpEnd-cpStart;
            cpStart = colEnd;
        }
    }

    delete [] colBuferLen;
    return bufferOffset-VarPtr;
}
//for setting in the indicator and Varpointers.


//LCOV_EXCL_START
/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_FetchPerf'
 */
extern "C" void
odbc_SQLSvc_FetchPerf_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_FetchPerf_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ Int32 maxRowCnt
  , /* In    */ Int32 maxRowLen
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ SQL_DataValue_def *outputDataValue
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning)
{
	SRVRTRACE_ENTER(FILE_SME+8);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	if (maxRowCnt < 0)
	{
		exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
	}
	else
	{
		if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
		{
			exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
		}
	}
	if (exception_->exception_nr == 0)
	{
		// resource statistics
		if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->bFetchStarted = TRUE;
			pSrvrStmt->inState = inState = STMTSTAT_FETCH;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg);*/
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg);
		}
		// end rs
		if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
		{
			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();
			pSrvrStmt->outputDataValue._length = 0;
			pSrvrStmt->outputDataValue._buffer = 0;

			if (pSrvrStmt->isClosed)
			{
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
				goto ret;
			}


			pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_;
			if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
			{
				if (pSrvrStmt->outputDataValue._buffer != NULL)
					delete pSrvrStmt->outputDataValue._buffer;
				pSrvrStmt->outputDataValue._buffer = NULL;
				pSrvrStmt->outputDataValue._length = 0;
				rc = FETCH2bulk(pSrvrStmt);
				if (pSrvrStmt->rowsAffected > 0)
				{
					if(pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
					{
						outputDataValue->_buffer = pSrvrStmt->outputDescVarBuffer;
						outputDataValue->_length = pSrvrStmt->outputDescVarBufferLen*pSrvrStmt->rowsAffected;
					}
					else
					{
						outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
						outputDataValue->_length = pSrvrStmt->outputDataValue._length;
					}
				}
				else
				{
					outputDataValue->_buffer = NULL;
					outputDataValue->_length = 0;
				}
//				if (pSrvrStmt->PerfFetchRetcode == SQL_NO_DATA_FOUND)
//				{
//					char tmpString[32];
//					tmpString[0] = '\0';
//					sprintf(tmpString, "f: %Ld %d", pSrvrStmt->cliElapseTime, pSrvrStmt->rowsAffected);
//					SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
//							srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
//							srvrGlobal->srvrObjRef, 1, tmpString);
//				}
			}
			else
			{
				pSrvrStmt->maxRowCnt = maxRowCnt;
				pSrvrStmt->maxRowLen = maxRowLen;
				rc = FETCHPERF(pSrvrStmt, outputDataValue);
			}

			switch (rc)
			{
			case ODBC_SERVER_ERROR:
			case ODBC_RG_ERROR:
			default:
				break;
			}
			switch (rc)
			{
			case ODBC_RG_WARNING:
				// if there is RG_WARNING, we don't pass SQL Warning to the application
				// Hence, we need to clear any warnings
				// call SQL_EXEC_ClearDiagnostics
				// CLEARDIAGNOSTICS(pSrvrStmt);
				rc = SQL_SUCCESS_WITH_INFO;
			case SQL_SUCCESS_WITH_INFO:
				GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
			case SQL_SUCCESS:
				exception_->exception_nr = 0;
				*rowsAffected = pSrvrStmt->rowsAffected;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
				break;
			case SQL_STILL_EXECUTING:
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLStillExecuting_exn_;
				break;
			case SQL_INVALID_HANDLE:
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLInvalidHandle_exn_;
				break;
			case SQL_NO_DATA_FOUND:
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
				break;
			case SQL_ERROR:
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
				ERROR_DESC_def *error_desc_def;
				error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
				if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
				{
					exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLQueryCancelled_exn_;
					exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
				break;
			case PROGRAM_ERROR:
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_FETCH_FAILED;
			default:
				break;
			}
		 }
		else
		{ // Catalog APIs

			pSrvrStmt->maxRowCnt = maxRowCnt;
			pSrvrStmt->maxRowLen = maxRowLen;
			rc = FETCHPERF(pSrvrStmt, outputDataValue);

			if (pSrvrStmt->sqlError.errorList._buffer != NULL)
			{
				rc = SQL_ERROR;
				ERROR_DESC_def *error_desc_def;
				error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
				if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
				{
					exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLQueryCancelled_exn_;
					exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
			}
			else if (pSrvrStmt->rowsAffected == 0 || pSrvrStmt->rowsAffected == -1)
			{
				if (pSrvrStmt->bSQLMessageSet)
						pSrvrStmt->cleanupSQLMessage();
				pSrvrStmt->outputDataValue._length = 0;
				pSrvrStmt->outputDataValue._buffer = 0;
				pSrvrStmt->InternalStmtClose(SQL_CLOSE);
				rc = SQL_NO_DATA_FOUND;
				exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
			}
			else
			{
				exception_->exception_nr = 0;
				*rowsAffected = pSrvrStmt->rowsAffected;
				outputDataValue->_length = pSrvrStmt->outputDataValue._length;
				outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
				if (pSrvrStmt->sqlWarning._length != 0)
					rc = SQL_SUCCESS_WITH_INFO;
				else
					rc = SQL_SUCCESS;
				pSrvrStmt->rowsAffected = 0;
			}
		}

ret:
		if (exception_->exception_nr != 0)
		{
			if (pSrvrStmt->outputDataValue._buffer != NULL)
				delete pSrvrStmt->outputDataValue._buffer;
			pSrvrStmt->outputDataValue._length = 0;
			pSrvrStmt->outputDataValue._buffer = NULL;
		}
		if (resStatStatement != NULL && pSrvrStmt->bFetchStarted == TRUE &&
						(rc == SQL_NO_DATA_FOUND || rc == SQL_ERROR ||
						((rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))
		{
			resStatStatement->setStatistics(pSrvrStmt);
		}
	}

	// resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		if (rc == SQL_ERROR  && exception_->u.SQLError.errorList._buffer != NULL)
		{
			ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
			inErrorCode = p_buffer->sqlcode;
			inSqlError = p_buffer->errorText;
			inSqlErrorLength = strlen(p_buffer->errorText);
		}
		pSrvrStmt->bFetchStarted = FALSE;
		Int32 inMaxRowCnt = 0;
		Int32 inMaxRowLen = 0;

		inMaxRowCnt = maxRowCnt;
		inMaxRowLen = maxRowLen;

		if (exception_->exception_nr != 0)
			inErrorStatement ++;
		else
			setStatisticsFlag  = FALSE;

		if (sqlWarning->_length != 0)
			inWarningStatement ++;
		if (exception_->exception_nr == 5)
		{
			inErrorStatement = 0;
			inWarningStatement = 0;
			setStatisticsFlag = TRUE;

		}
		inQueryId = pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->setStatisticsFlag(setStatisticsFlag);
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  pSrvrStmt->sqlNewQueryType,
							  pSrvrStmt->isClosed);
	}
	//end rs

	SRVRTRACE_EXIT(FILE_SME+8);

	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_ExecuteCall'
 */
extern "C" void
odbc_SQLSvc_ExecuteCall_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_ExecuteCall_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_string cursorName
  , /* In    */ IDL_short sqlStmtType
  , /* In    */ Int32 inputRowCnt
  , /* In    */ const SQLValueList_def *inputValueList
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ SQLValueList_def *outputValueList
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning)
{
	SRVRTRACE_ENTER(FILE_SME+13);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;

	/*
	// resource statistics
	inState = STMTSTAT_EXECUTE;
	inSqlStmtType = sqlStmtType;
	inEstimatedCost = 0;
	inSqlString = NULL;
	inErrorStatement = 0;
	inWarningStatement = 0;
	inRowCount = 0;
	inErrorCode = 0;
	if (resStatStatement != NULL)
		resStatStatement->start(inState, stmtLabel);
	//end rs
	*/

	if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
	{
		exception_->exception_nr = odbc_SQLSvc_ExecuteCall_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
		return;
	}
	if (exception_->exception_nr == 0)
	{
		rc = SQL_SUCCESS;
		if (pSrvrStmt->bSQLMessageSet)
			pSrvrStmt->cleanupSQLMessage();
		if(pSrvrStmt->bSQLValueListSet)
			pSrvrStmt->cleanupSQLValueList();
		pSrvrStmt->inputValueList._buffer = inputValueList->_buffer;
		pSrvrStmt->inputValueList._length = inputValueList->_length;

		if (pSrvrStmt->outputValueList._buffer == NULL)
		{
			rc = AllocAssignValueBuffer(pSrvrStmt->bSQLValueListSet,&pSrvrStmt->outputDescList,
				&pSrvrStmt->outputValueList, pSrvrStmt->outputDescVarBufferLen,
				1, pSrvrStmt->outputValueVarBuffer);
		}
		else
			pSrvrStmt->outputValueList._length = 0;

		if (rc == SQL_SUCCESS)
		{
			pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteCall_ldx_;
			 rc = EXECUTECALL(pSrvrStmt);
			switch (rc)
			{
			case SQL_SUCCESS:
				break;
			case SQL_SUCCESS_WITH_INFO:
				GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
				break;
			case SQL_ERROR:
				GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
				break;
			case ODBC_RG_WARNING:
				// if there is RG_WARNING, we don't pass SQL Warning to the application
				// Hence, we need to clear any warnings
				// call SQL_EXEC_ClearDiagnostics
				// CLEARDIAGNOSTICS(pSrvrStmt);
				rc = SQL_SUCCESS_WITH_INFO;
			case ODBC_SERVER_ERROR:
			case ODBC_RG_ERROR:
			default:
				break;
			}

			switch (rc)
			{
			case SQL_SUCCESS:
			case SQL_SUCCESS_WITH_INFO:
				break;
			case ODBC_SERVER_ERROR:
				// Allocate Error Desc
				kdsCreateSQLErrorException(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError, 1);
				// Add SQL Error
				kdsCopySQLErrorException(&pSrvrStmt->sqlError, NULL_VALUE_ERROR, NULL_VALUE_ERROR_SQLCODE,
						NULL_VALUE_ERROR_SQLSTATE);
				break;
			case -8814:
			case 8814:
				rc = SQL_RETRY_COMPILE_AGAIN;
				break;
			default:
				break;
			}
		}

		switch (rc)
		{
		case SQL_SUCCESS:
		case SQL_SUCCESS_WITH_INFO:
			exception_->exception_nr = 0;
			// Copy the output values
			*rowsAffected = 0;
			outputValueList->_length = pSrvrStmt->outputValueList._length;
			outputValueList->_buffer = pSrvrStmt->outputValueList._buffer;
			sqlWarning->_length = pSrvrStmt->sqlWarning._length;
			sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
			break;
		case SQL_STILL_EXECUTING:
			exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLStillExecuting_exn_;
			break;
		case SQL_INVALID_HANDLE:
			exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLInvalidHandle_exn_;
			break;
		case SQL_NO_DATA_FOUND:
			// Added this for JDBC T4 driver since its uses this interface to get zero or one row
			// for select statement besides CALL statement.
			exception_->exception_nr = 100;
			break;
		case SQL_NEED_DATA:
			exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLNeedData_exn_;
			break;
		case ODBC_SERVER_ERROR:
		case SQL_ERROR:
			ERROR_DESC_def *error_desc_def;
			error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
			if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
			{
				exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLQueryCancelled_exn_;
				exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
			}
			else
			{
				exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLError_exn_;
				exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
				exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
			}
			break;
		case -8814:
		case 8814:
			exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLRetryCompile_exn_;
			break;
		case PROGRAM_ERROR:
			exception_->exception_nr = odbc_SQLSvc_ExecuteCall_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
		default:
			break;
		}

		/* SQL doesn't return statistics for Call statement?
		if (resStatStatement != NULL && (srvrGlobal->resourceStatistics & STMTSTAT_EXECUTE))
			resStatStatement->setStatistics(pSrvrStmt);
		*/
	}

	/* SQL doesn't return statistics for Call statement?
	//  resource statistics
	if (exception_.exception_nr != 0 && exception_.u.SQLError.errorList._buffer != NULL)
	{
		inErrorCode = exception_.u.SQLError.errorList._buffer->sqlcode;
		inErrorStatement ++;
	}
	if (sqlWarning._length != 0)
		inWarningStatement ++;
	inRowCount = rowsAffected;
	if (resStatStatement != NULL)
		resStatStatement->end(inState,inSqlStmtType,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode, resStatSession);
	//end rs
	*/

	SRVRTRACE_EXIT(FILE_SME+13);
	return;
}
//LCOV_EXCL_STOP


/*
 * * Synchronous method function prototype for
 * * operation 'odbc_SQLSvc_GetSQLCatalogs'
 * */
extern "C" void
odbc_SQLSvc_GetSQLCatalogs_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_GetSQLCatalogs_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ IDL_short APIType
  , /* In    */ const IDL_char *catalogNm
  , /* In    */ const IDL_char *schemaNm
  , /* In    */ const IDL_char *tableNm
  , /* In    */ const IDL_char *tableTypeList
  , /* In    */ const IDL_char *columnNm
  , /* In    */ Int32 columnType
  , /* In    */ Int32 rowIdScope
  , /* In    */ Int32 nullable
  , /* In    */ Int32 uniqueness
  , /* In    */ Int32 accuracy
  , /* In    */ IDL_short sqlType
  , /* In    */ UInt32 metadataId
  , /* In    */ const IDL_char *fkcatalogNm
  , /* In    */ const IDL_char *fkschemaNm
  , /* In    */ const IDL_char *fktableNm
  , /* Out   */ IDL_char *catStmtLabel
  , /* Out   */ SQLItemDescList_def *outputDesc
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning
  )
{
        SRVRTRACE_ENTER(FILE_SME+14);

	enum CATAPI_TABLE_INDEX {
		COLUMNS = 0,
                DEFAULTS,
                INDEXES,
		KEYS,
		OBJECTS,
                OBJECTUID,
		TABLES,
		VIEWS,
		VIEWS_USAGE,
                VERSIONS
	};

	char *smdCatAPITablesList[] = {
		"COLUMNS",
                "DEFAULTS",
                "INDEXES",
		"KEYS",
		"OBJECTS",
                "OBJECTUID",
		"TABLES",
		"VIEWS",
		"VIEWS_USAGE",
                "VERSIONS"
        };

        char                          CatalogQuery[20000];
        SRVR_STMT_HDL                 *QryCatalogSrvrStmt = NULL;
        odbc_SQLSvc_Prepare_exc_      prepareException;
        odbc_SQLSvc_ExecuteN_exc_     executeException;
        char                          *inputParam[16];
        char                          *tableParam[20];

        short                         retCode;
        char                          RequestError[200 + 1];
	char ConvertAPITypeToString[30];

	Int32 curRowNo = 0;
	Int32 numOfCols = 0;
	Int32 curColNo = 0;
	Int32 rowsAffected = 0;
	Int32 rowsFetched;
	char SQLObjType[2];
	short EnvSetting = 0;
	char MapDataType[2] = "0";
	short retcode = 0;
	char tmpBuf[20];
	char odbcAppVersion[20];
        char lc_tableTypeList[MAX_ANSI_NAME_LEN+1];
	char *token;
	char* saveptr;

	odbc_SQLSvc_FetchN_exc_ fetchException;
	odbc_SQLSvc_Close_exc_ CloseException;
	CloseException.exception_nr=0;
	fetchException.exception_nr=0;

	if (resStatSession != NULL)
		resStatSession->totalCatalogStatements++;
	char catalogNmNoEsc[MAX_ANSI_NAME_LEN+1];
	char schemaNmNoEsc[MAX_ANSI_NAME_LEN+1];
	char tableNmNoEsc[MAX_ANSI_NAME_LEN+1];
	char columnNmNoEsc[MAX_ANSI_NAME_LEN+1];

	char expCatalogNm[MAX_ANSI_NAME_LEN+1];
	char expSchemaNm[MAX_ANSI_NAME_LEN+1];
	char expTableNm[MAX_ANSI_NAME_LEN+1];
	char expColumnNm[MAX_ANSI_NAME_LEN+1];

	char tableName1[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];
	char tableName2[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];
	char tableName3[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];

	_itoa(srvrGlobal->appVersion.majorVersion, odbcAppVersion, 10);

        if(diagnostic_flags)
        {
                       switch (APIType)
                       {
                              case SQL_API_SQLTABLES:
                                      sprintf(ConvertAPITypeToString, "SQLTables (%d)", SQL_API_SQLTABLES);
                                      break;
                               case SQL_API_SQLCOLUMNS:
                                      sprintf(ConvertAPITypeToString, "SQLColumns (%d)", SQL_API_SQLCOLUMNS);
                                      break;
                              case SQL_API_SQLCOLUMNPRIVILEGES:
                                      sprintf(ConvertAPITypeToString, "SQLColumnPrivileges (%d)", SQL_API_SQLCOLUMNPRIVILEGES);
                                      break;
                              case SQL_API_SQLFOREIGNKEYS:
                                      sprintf(ConvertAPITypeToString, "SQLForeignKeys (%d)", SQL_API_SQLFOREIGNKEYS);
                                      break;
                              case SQL_API_SQLPRIMARYKEYS:
                                      sprintf(ConvertAPITypeToString, "SQLPrimaryKeys (%d)", SQL_API_SQLPRIMARYKEYS);
                                      break;
                              case SQL_API_SQLSPECIALCOLUMNS:
                                      sprintf(ConvertAPITypeToString, "SQLSpecialColumns (%d)", SQL_API_SQLSPECIALCOLUMNS);
                                      break;
                              case SQL_API_SQLSTATISTICS:
                                      sprintf(ConvertAPITypeToString, "SQLStatistics (%d)", SQL_API_SQLSTATISTICS);
                                      break;
                              case SQL_API_SQLTABLEPRIVILEGES:
                                      sprintf(ConvertAPITypeToString, "SQLTablePrivileges (%d)", SQL_API_SQLTABLEPRIVILEGES);
                                      break;
                              case SQL_API_SQLGETTYPEINFO:
                                      sprintf(ConvertAPITypeToString, "SQLGetTypeInfo (%d)", SQL_API_SQLGETTYPEINFO);
                                      break;
                              case SQL_API_SQLPROCEDURES:
                                      sprintf(ConvertAPITypeToString, "SQLProcedures (%d)", SQL_API_SQLPROCEDURES);
                                      break;
                              case SQL_API_SQLPROCEDURECOLUMNS:
                                      sprintf(ConvertAPITypeToString, "SQLProcedureColumns (%d)", SQL_API_SQLPROCEDURECOLUMNS);
                                      break;
                              case SQL_API_TBLSYNONYM:
                                      sprintf(ConvertAPITypeToString, "SQLTblsynonym (%d)", SQL_API_TBLSYNONYM);
                                      break;
                              case SQL_API_TBLMVS:
                                      sprintf(ConvertAPITypeToString, "SQLTblMvs (%d)", SQL_API_TBLMVS);
                                      break;
                              default:
                                      sprintf(ConvertAPITypeToString, "Invalid Catalog API (%d)", APIType);
                                      break;
                       }
                       TraceOut(TR_SRVR_KRYPTON_API,"odbc_SQLSvc_GetSQLCatalogs_sme_(%#x, %#x, %#x, %ld, %s, %s, %s, %s, %s, %s, %s, %ld, %ld, %ld, %ld, %ld, %d, %s, %#x, %#x)",
                              objtag_,
                              call_id_,
                              exception_,
                              dialogueId,
                              stmtLabel,
                              ConvertAPITypeToString,
                              catalogNm,
                              schemaNm,
                              tableNm,
                              tableTypeList,
                              columnNm,
                              columnType,
                              rowIdScope,
                              nullable,
                              uniqueness,
                              accuracy,
                              sqlType,
                              fkcatalogNm,
                              fkschemaNm,
                              fktableNm,
                              catStmtLabel,
                              outputDesc,
                              sqlWarning);
        }

        if (stmtLabel != NULL)
               odbc_SQLSvc_Close_sme_(objtag_, call_id_, &CloseException, dialogueId, stmtLabel,
                                             SQL_DROP, &rowsAffected, sqlWarning);

        if ((tableNm[0] == '\0') && (columnNm[0] == '\0') && (metadataId == 1))
                metadataId = 0;

        if (APIType != SQL_API_SQLTABLES && APIType != SQL_API_SQLTABLES_JDBC)
        {
                if (tableNm[0] == '\0')
                        strcpy((char *)tableNm,"%");
                if (columnNm[0] == '\0')
                        strcpy((char *)columnNm,"%");
        }

        exception_->exception_nr = 0;
        CatalogQuery[0] = '\0';
        strcpy(catStmtLabel, stmtLabel);
        switch(APIType)
        {
               case SQL_API_SQLTABLES :
               case SQL_API_SQLTABLES_JDBC :
                       if ((strcmp(catalogNm,"%") == 0) && (strcmp(schemaNm,"") == 0) && (strcmp(tableNm,"") == 0))
                       {
                              strcpy(catalogNmNoEsc, SEABASE_MD_CATALOG);
                              inputParam[0] = catalogNmNoEsc;
                              inputParam[1] = inputParam[0];
                              inputParam[2] = NULL;

                              if (APIType == SQL_API_SQLTABLES)
                              {
                                 // strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q1");
                                 snprintf(CatalogQuery, sizeof(CatalogQuery),
"select distinct(cast('%s' as varchar(128))) TABLE_CAT, "
  "cast(NULL as varchar(128) ) TABLE_SCHEM, "
  "cast(NULL as varchar(128) ) TABLE_NAME, "
  "cast(NULL as varchar(128) ) TABLE_TYPE, "
  "cast(NULL as varchar(128)) REMARKS "
"from TRAFODION.\"_MD_\".objects "
"where CATALOG_NAME = '%s' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;", 
                                inputParam[0], inputParam[1]);
                              }
                              else
                              {
                                // strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q1");
                                snprintf(CatalogQuery, sizeof(CatalogQuery),
"select distinct(cast('%s' as varchar(128) )) TABLE_CAT "
"from TRAFODION.\"_MD_\".objects "
"where CATALOG_NAME = '%s' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 1;", 
                                inputParam[0], inputParam[1]);
                              }
                       }
                       else
                       if ((strcmp(catalogNm,"") == 0) && (strcmp(schemaNm,"%") == 0) && (strcmp(tableNm,"") == 0))
                       {
                              convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
                              strcpy(catalogNmNoEsc, SEABASE_MD_CATALOG);
                              inputParam[0] = catalogNmNoEsc;
                              inputParam[1] = inputParam[0];
                              inputParam[2] = (char*) schemaNm;
                              inputParam[3] = expSchemaNm;
                              inputParam[4] = NULL;

                              if (APIType == SQL_API_SQLTABLES)
                              {
                                 // strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q2");
                                 snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select distinct cast(NULL as varchar(128) ) TABLE_CAT, "
   "cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
   "cast(NULL as varchar(128) ) TABLE_NAME, "
   "cast(NULL as varchar(128) ) TABLE_TYPE, "
   "cast(NULL as varchar(128)) REMARKS "
 "from TRAFODION.\"_MD_\".objects "
 "where "
   "(CATALOG_NAME = '%s' or "
   " CATALOG_NAME LIKE '%s' ESCAPE '\\') "
   "and (SCHEMA_NAME = '%s' or "
   "SCHEMA_NAME LIKE '%s' ESCAPE '\\') "
 "FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;", 
                                 inputParam[0], inputParam[1], inputParam[2],
                                 inputParam[3]);
                              }
                              else
                              {
                                      // strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q2");
                                 snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select distinct "
   "cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
   "cast(trim(CATALOG_NAME) as varchar(128) ) TABLE_CATALOG "
 "from TRAFODION.\"_MD_\".objects "
 "where "
   "(CATALOG_NAME = '%s' or "
   " CATALOG_NAME LIKE '%s' ESCAPE '\\') "
   "and (SCHEMA_NAME = '%s' or "
   "SCHEMA_NAME LIKE '%s' ESCAPE '\\') "
 "FOR READ UNCOMMITTED ACCESS ORDER BY 2;", 
                                 inputParam[0], inputParam[1], inputParam[2],
                                 inputParam[3]);
                              }
                       }
                        else
                        if ((strcmp(catalogNm,"") == 0) && (strcmp(schemaNm,"") 
== 0) && (strcmp(tableNm,"") == 0) && (strcmp(tableTypeList,"%") == 0))
                        {
                                strcpy(catalogNmNoEsc, "%");
                                strcpy(schemaNmNoEsc, "%");
                                strcpy(tableNmNoEsc, "%");
                                // strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q4");
                                tableParam[0] = NULL;
                                inputParam[0] = NULL;
                                snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select cast(NULL as varchar(128) ) TABLE_CAT,"
    "cast(NULL as varchar(128) ) TABLE_SCHEM, "
    "cast(NULL as varchar(128) ) TABLE_NAME,"
    "trim(TABLE_TYPE) TABLE_TYPE,"
    "cast(NULL as varchar(128)) REMARKS " 
 " from (VALUES "
         "('TABLE'),"
         "('SYSTEM TABLE'),"
         "('VIEW'))"
     " tp (\"TABLE_TYPE\")"
 " FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;");
                        }
                        else
                        {
                                if (tableNm[0] == '\0')
                                        strcpy((char *)tableNmNoEsc,"%");
                                if (! checkIfWildCard(catalogNm, expCatalogNm))
                                {
                                        exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                                        exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
                                        goto MapException;
                                }
                                if (strcmp(catalogNm,"") == 0) // If catalog empty default to system catalog
                                        strcpy(tableName1,SEABASE_MD_CATALOG);
                                else
                                {
                                        strncpy(tableName1,catalogNm, sizeof(tableName1));
                                        tableName1[sizeof(tableName1)-1] = 0;
                                }
                                tableParam[0] = tableName1;
                                tableParam[1] = NULL;
                                convertWildcardNoEsc(metadataId, TRUE, schemaNm,schemaNmNoEsc);
                                convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
                                if (tableNm[0] == '\0')
                                {
                                convertWildcardNoEsc(metadataId, TRUE, tableNmNoEsc, tableNmNoEsc);
                                convertWildcard(metadataId, TRUE, tableNmNoEsc, expTableNm);
                                }
                                else
                                {
                                convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
                                convertWildcard(metadataId, TRUE, tableNm, expTableNm);
                                }

                                inputParam[0] = schemaNmNoEsc;
                                inputParam[1] = expSchemaNm;
                                inputParam[2] = tableNmNoEsc;
                                inputParam[3] = expTableNm;
                                if (tableTypeList == NULL || strlen(tableTypeList) == 0 || strcmp(tableTypeList,"%") == 0)
                                {
                                        inputParam[4]  = "UT"; // User Table
                                        inputParam[5]  = "BT";
                                        inputParam[6]  = "VI"; 
                                        inputParam[7]  = "SM"; // System MetaData
                                        inputParam[8]  = "BT";
                                        inputParam[9] = NULL;
                                }
                                else
                                {
                                        inputParam[4]  = "";
                                        inputParam[5]  = "";
                                        inputParam[6]  = "";
                                        inputParam[7]  = "";
                                        inputParam[8]  = "";
                                        inputParam[9] = NULL;

                                        strncpy(lc_tableTypeList, tableTypeList, sizeof(lc_tableTypeList));
                                        lc_tableTypeList[sizeof(lc_tableTypeList)-1] = 0;
                                        token = strtok_r(lc_tableTypeList, " ,'", &saveptr);
                                        while (token != NULL)
                                        {
                                                if (strcmp(token, "SYSTEM") == 0
)
                                                {
                                                        token = strtok_r(NULL, ",'", &saveptr);
                                                        if (token != NULL && strcmp(token, "TABLE") == 0)
                                                        {
                                                                inputParam[7] = "SM";
                                                                inputParam[8] = "BT";
                                                        }
                                                        else
                                                                continue;
                                                }
                                                else
                                                if (strcmp(token, "TABLE") == 0)                                                {
                                                        inputParam[4]  = "UT";
                                                        inputParam[5]  = "BT";
                                                }
                                                else
                                                if (strcmp(token, "VIEW") == 0)
                                                {
                                                        inputParam[4]  = "UT";
                                                        inputParam[6]  = "VI";
                                                }

                                                token = strtok_r(NULL, " ,'", &saveptr);
                                        }
                                }

                                if (APIType == SQL_API_SQLTABLES)
                                {
                                   // strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q7");
                                   snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select cast('%s' as varchar(128) ) TABLE_CAT,"
   "cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
   "cast(trim(OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
   "trim(case OBJECT_TYPE "
       "when 'BT' then 'TABLE' "
       "when 'VI' then 'VIEW' "
      "end) TABLE_TYPE,"
   "cast(NULL as varchar(128)) REMARKS "
 " from TRAFODION.\"_MD_\".OBJECTS "
 " where (SCHEMA_NAME = '%s' or "
 " trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\')"
 " and (OBJECT_NAME = '%s' or"
 " trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
 "  and ((SCHEMA_NAME <> '_MD_' and '%s'='UT' and OBJECT_TYPE in ('%s', '%s'))"
 "  or   (SCHEMA_NAME = '_MD_' and '%s'='SM' and OBJECT_TYPE in ('%s')))"
 " FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;", 
                                   tableParam[0], inputParam[0], inputParam[1],
                                   inputParam[2], inputParam[3], inputParam[4],
                                   inputParam[5], inputParam[6], inputParam[7],
                                   inputParam[8]);

                                }
                                else
                                {
                                   // strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q7");
                                   snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select cast('%s' as varchar(128) ) TABLE_CAT,"
  "cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
  "cast(trim(OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
  "trim(case OBJECT_TYPE "
       "when 'BT' then 'TABLE' "
       "when 'VI' then 'VIEW' "
       "end) TABLE_TYPE,"
  "cast(NULL as varchar(128)) REMARKS, "
  "cast(NULL as varchar(128)) TYPE_CAT,"
  "cast(NULL as varchar(128)) TYPE_SCHEM, "
  "cast(NULL as varchar(128)) TYPE_NAME,"
  "cast(NULL as varchar(128)) SELF_REFERENCING_COL_NAME, "
  "cast(NULL as varchar(128)) REF_GENERATION"
 " from TRAFODION.\"_MD_\".OBJECTS "
 " where (SCHEMA_NAME = '%s' or "
 " trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\')"
 " and (OBJECT_NAME = '%s' or"
 " trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
 "  and ((SCHEMA_NAME <> '_MD_' and '%s'='UT' and OBJECT_TYPE in ('%s', '%s'))"
 "  or   (SCHEMA_NAME = '_MD_' and '%s'='SM' and OBJECT_TYPE in ('%s')))"
 " FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;", 
                                   tableParam[0], inputParam[0], inputParam[1],
                                   inputParam[2], inputParam[3], inputParam[4],
                                   inputParam[5], inputParam[6], inputParam[7],
                                   inputParam[8]);

                                }

                       }
                       break;
                case SQL_API_SQLGETTYPEINFO :
                     {
                         char condExpression[20] = {0};
                        
                         switch(sqlType) {
                             case SQL_DATE:
                                 sqlType == SQL_TYPE_DATE;
                                 break;
                             case SQL_TIME:
                                 sqlType == SQL_TYPE_TIME;
                                 break;
                             case SQL_TIMESTAMP:
                                 sqlType == SQL_TYPE_TIMESTAMP;
                                 break;
                             default:
                                 break;
                         }

                         if(sqlType == SQL_ALL_TYPES)
                             sprintf(condExpression, "1=1");
                         else
                             sprintf(condExpression, "DATA_TYPE=%d", sqlType);

                         snprintf(CatalogQuery,sizeof(CatalogQuery),
                                 "select distinct TYPE_NAME TYPE_NAME,"
                                 "DATA_TYPE DATA_TYPE,PREC COLUMN_SIZE,"
                                 "LITERAL_PREFIX LITERAL_PREFIX,"
                                 "LITERAL_SUFFIX LITERAL_SUFFIX,"
                                 "CREATE_PARAMS CREATE_PARAMS,"
                                 "IS_NULLABLE NULLABLE,"
                                 "CASE_SENSITIVE CASE_SENSITIVE,"
                                 "SEARCHABLE SEARCHABLE,"
                                 "UNSIGNED_ATTRIBUTE UNSIGNED_ATTRIBUTE,"
                                 "FIXED_PREC_SCALE FIXED_PREC_SCALE,"
                                 "AUTO_UNIQUE_VALUE AUTO_UNIQUE_VALUE,"
                                 "LOCAL_TYPE_NAME LOCAL_TYPE_NAME,"
                                 "MINIMUM_SCALE MINIMUM_SCALE,"
                                 "MAXIMUM_SCALE MAXIMUM_SCALE,"
                                 "SQL_DATA_TYPE SQL_DATA_TYPE,"
                                 "SQL_DATETIME_SUB SQL_DATETIME_SUB,"
                                 "NUM_PREC_RADIX NUM_PREC_RADIX,"
                                 "INTERVAL_PRECISION INTERVAL_PRECISION "
                                 " from "
                                 " (VALUES "
                                 "(cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)),"
                                 "cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint),"
                                 "cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('LARGEINT' as varchar(128)),"
                                 "cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint),"
                                 "cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)),"
                                 "('BIGINT SIGNED', -5, 19, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'LARGEINT', NULL, NULL, 'SIGNED LARGEINT', 19, 19, -1, -5, NULL, NULL, 0, 0, 3, 0),"
                                 "('BIGINT UNSIGNED', -5, 20, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'LARGEINT', NULL, NULL, 'UNSIGNED LARGEINT', 20, 20, -1, -405, NULL, NULL, 0, 0, 3, 0),"
                                 "('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0),"
                                 "('NCHAR', -8, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'WCHAR', NULL, NULL, 'WCHAR', NULL, -1, -1, -8, NULL, NULL, 0, 0, 3, 0),"
                                 "('NCHAR VARYING', -9, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'WCHAR VARYING', NULL, NULL, 'VARWCHAR', NULL, -1, -1, -9, NULL, NULL, 0, 0, 3, 0),"
                                 "('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0),"
                                 "('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'DECIMAL', 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0),"
                                 "('DECIMAL SIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0),"
                                 "('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0),"
                                 "('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE PRECISION', 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0),"
                                 "('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0),"
                                 "('FLOAT', 6, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'FLOAT', NULL, NULL, 'FLOAT', 2, -2, -1, 6, NULL, NULL, 0, 0, 3, 0),"
                                 "('INTEGER', 4, 9, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'INTEGER', 9, 9, -1, 4, NULL, NULL, 0, 0, 3, 0),"
                                 "('INTEGER SIGNED', 4, 9, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 9, 9, -1, 4, NULL, NULL, 0, 0, 3, 0),"
                                 "('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0),"
                                 "('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0),"
                                 "('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0),"
                                 "('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0),"
                                 "('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0),"
                                 "('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0),"
                                 "('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0),"
                                 "('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0),"
                                 "('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0),"
                                 "('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0),"
                                 "('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0),"
                                 "('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0),"
                                 "('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0),"
                                 "('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0),"
                                 "('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
                                 "('NUMERIC SIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
                                 "('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
                                 "('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0),"
                                 "('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SMALLINT', 5, 5, -1, 5, NULL, NULL, 0, 0, 3, 0),"
                                 "('SMALLINT SIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 5, 5, -1, 5, NULL, NULL, 0, 0, 3, 0),"
                                 "('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 5, 5, -1, -502, NULL, NULL, 0, 0, 3, 0),"
                                 "('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0),"
                                 "('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0),"
                                 "('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0),"
                                 "('LONG VARCHAR', -1, 2000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'LONG VARCHAR', NULL, NULL, 'VARCHAR', NULL, -1, -1, -1, NULL, NULL, 0, 0, 3, 0),"
                                 "('TINYINT', -6, 3, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'TINYINT', NULL, NULL, 'TINYINT', 3, 3, -1, 4, NULL, NULL, 0, 0, 3, 0),"
                                 "('TINYINT SIGNED', -6, 3, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'TINYINT', NULL, NULL, 'SIGNED TINYINT', 3, 3, -1, 4, NULL, NULL, 0, 0, 3, 0),"
                                 "('TINYINT UNSIGNED', -6, 3, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'TINYINT', NULL, NULL, 'UNSIGNED TINYINT', 3, 3, -1, -404, NULL, NULL, 0, 0, 3, 0)"
                                 " ) "
                                 " dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\","
                                 "\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\","
                                 "\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\","
                                 "\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\")"
                                 " WHERE %s" 
                                 " ORDER BY 2,1 FOR READ UNCOMMITTED ACCESS ;", condExpression);
                           break;
                     }

		case SQL_API_SQLPROCEDURES :
		case SQL_API_SQLPROCEDURES_JDBC:
		//	strcpy((char *)catStmtLabel, "SQL_PROCEDURES_ANSI_Q4");

			if (!checkIfWildCard(catalogNm, expCatalogNm) && !metadataId)
			{
				exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
				goto MapException;
			}
			if (strcmp(catalogNm,"") == 0)
				strcpy(tableName1,SEABASE_MD_CATALOG);
			else
				strcpy(tableName1,catalogNm);
			tableParam[0] = tableName1;
                        tableParam[1] = NULL;
			convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
			convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
			convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
			convertWildcard(metadataId, TRUE, tableNm, expTableNm);
			inputParam[0] = schemaNmNoEsc;
			inputParam[1] = expSchemaNm;
			inputParam[2] = tableNmNoEsc;
			inputParam[3] = expTableNm;
			inputParam[4] = NULL;

			if( APIType == SQL_API_SQLPROCEDURES )
			{
                        	snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select "
  "cast('%s' as varchar(128) ) PROCEDURE_CAT, "
  "cast(trim(SCHEMA_NAME) as varchar(128) ) PROCEDURE_SCHEM, "
  "cast(trim(OBJECT_NAME)   as varchar(128) ) PROCEDURE_NAME, "
  "cast (NULL as smallint) NUM_INPUT_PARAMS, "
  "cast (NULL as smallint) NUM_OUTPUT_PARAMS, "
  "cast (NULL as smallint) NUM_RESULT_SETS, "
  "cast (NULL as varchar(128)) REMARKS, "
  "(case OBJECT_TYPE "
        "when 'UR' then cast(1 as smallint) "
        "else cast(0 as smallint) end) PROCEDURE_TYPE "
 "from "
 "TRAFODION.\"_MD_\".OBJECTS "
 "where (SCHEMA_NAME = '%s' "
        "or trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
  "and (OBJECT_NAME = '%s' "
        "or trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
  "and OBJECT_TYPE = 'UR' "
 "FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
                               tableParam[0], inputParam[0], inputParam[1],
                               inputParam[2], inputParam[3]);
			}
			else
			{
				snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEMA,"
"obj.OBJECT_NAME PROCEDURE_NAME, cast(NULL as varchar(10)) R1,cast(NULL as varchar(10)) R2,"
"cast(NULL as varchar(10)) R3, cast(NULL as varchar(10)) REMARKS,"
"cast(case when routines.UDR_TYPE = 'P' then 1"
"    when routines.UDR_TYPE = 'F' or routines.UDR_TYPE = 'T'"
"    then 2 else 0 end as smallint) PROCEDURE_TYPE,"
"obj.OBJECT_NAME SPECIFIC_NAME "
"from "
"TRAFODION.\"_MD_\".OBJECTS obj "
"left join TRAFODION.\"_MD_\".ROUTINES routines on obj.OBJECT_UID = routines.UDR_UID "
"where (obj.SCHEMA_NAME = '%s' "
"or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (obj.OBJECT_NAME = '%s' "
"or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and obj.OBJECT_TYPE = 'UR' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
                              inputParam[0], inputParam[1],
                              inputParam[2], inputParam[3]);
			}
			break;
		case SQL_API_SQLPROCEDURECOLUMNS:
		case SQL_API_SQLPROCEDURECOLUMNS_JDBC:
			if (!checkIfWildCard(catalogNm, expCatalogNm) && !metadataId)
			{
			exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
			goto MapException;
			}
			if (strcmp(catalogNm,"") == 0)
			strcpy(tableName1,SEABASE_MD_CATALOG);
			else
			strcpy(tableName1,catalogNm);
			tableParam[0] = tableName1;
				tableParam[1] = NULL;
			convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
			convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
			convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
			convertWildcard(metadataId, TRUE, tableNm, expTableNm);
			convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
			convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
			inputParam[0] = schemaNmNoEsc;
			inputParam[1] = expSchemaNm;
			inputParam[2] = tableNmNoEsc;
			inputParam[3] = expTableNm;
			inputParam[4] = columnNmNoEsc;
			inputParam[5] = expColumnNm;
			inputParam[6] = NULL;
			if( APIType == SQL_API_SQLPROCEDURECOLUMNS )
			{
				snprintf(CatalogQuery,sizeof(CatalogQuery),
"select obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEM,"
"obj.OBJECT_NAME PROCEDURE_NAME, cols.COLUMN_NAME COLUMN_NAME,"
"cast((case when cols.DIRECTION='I' then 1 when cols.DIRECTION='N' "
"then 2 when cols.DIRECTION='O' then 3 else 0 end) as smallint) COLUMN_TYPE,"
"cols.FS_DATA_TYPE DATA_TYPE, cols.SQL_DATA_TYPE TYPE_NAME,"
"cols.COLUMN_PRECISION \"PRECISION\", cols.COLUMN_SIZE LENGTH, cols.COLUMN_SCALE SCALE,"
"cast(1 as smallint) RADIX, cols.NULLABLE NULLABLE, cast(NULL as varchar(10)) REMARKS,"
"cols.DEFAULT_VALUE COLUMN_DEF, cols.FS_DATA_TYPE SQL_DATA_TYPE, cast(0 as smallint) SQL_DATETIME_SUB,"
"cols.COLUMN_SIZE CHAR_OCTET_LENGTH, cols.COLUMN_NUMBER ORDINAL_POSITION,"
"cols.NULLABLE IS_NULLABLE"
" from TRAFODION.\"_MD_\".OBJECTS obj"
" left join TRAFODION.\"_MD_\".COLUMNS cols on obj.OBJECT_UID=cols.OBJECT_UID"
" where"
" (obj.SCHEMA_NAME = '%s' or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
" and (obj.OBJECT_NAME = '%s' or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and (cols.COLUMN_NAME = '%s' or trim(cols.COLUMN_NAME) LIKE '%s' ESCAPE '\\')"
" order by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, ORDINAL_POSITION"
" FOR READ UNCOMMITTED ACCESS",
			       inputParam[0], inputParam[1],
                               inputParam[2], inputParam[3],
                               inputParam[4], inputParam[5]);
			}
            else
            {
				snprintf(CatalogQuery,sizeof(CatalogQuery),
"select obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEM,"
"obj.OBJECT_NAME PROCEDURE_NAME, cols.COLUMN_NAME COLUMN_NAME,"
"cast((case when cols.DIRECTION='I' then 1 when cols.DIRECTION='N' then 2 when cols.DIRECTION='O' then 3 else 0 end) as smallint) COLUMN_TYPE,"
"cols.FS_DATA_TYPE DATA_TYPE, cols.SQL_DATA_TYPE TYPE_NAME,"
"cols.COLUMN_PRECISION \"PRECISION\", cols.COLUMN_SIZE LENGTH, cols.COLUMN_SCALE SCALE,"
"cast(1 as smallint) RADIX, cols.NULLABLE NULLABLE, cast(NULL as varchar(10)) REMARKS,"
"cols.DEFAULT_VALUE COLUMN_DEF, cols.FS_DATA_TYPE SQL_DATA_TYPE, cast(0 as smallint) SQL_DATETIME_SUB,"
"cols.COLUMN_SIZE CHAR_OCTET_LENGTH, cols.COLUMN_NUMBER ORDINAL_POSITION,"
"cols.NULLABLE IS_NULLABLE, cols.COLUMN_NAME SPECIFIC_NAME"
" from TRAFODION.\"_MD_\".OBJECTS obj"
" left join TRAFODION.\"_MD_\".COLUMNS cols on obj.OBJECT_UID=cols.OBJECT_UID"
" where"
" (obj.SCHEMA_NAME = '%s' or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
" and (obj.OBJECT_NAME = '%s' or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and (cols.COLUMN_NAME = '%s' or trim(cols.COLUMN_NAME) LIKE '%s' ESCAPE '\\')"
" order by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, ORDINAL_POSITION"
" FOR READ UNCOMMITTED ACCESS",
			       inputParam[0], inputParam[1],
                               inputParam[2], inputParam[3],
                               inputParam[4], inputParam[5]);
			}
			break;
		case SQL_API_SQLCOLUMNS :
			if (!checkIfWildCard(catalogNm, catalogNmNoEsc) && !metadataId)
			{
				exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
				goto MapException;
			}
			if (tableNm[0] != '$' && tableNm[0] != '\\')
			{
				if (strcmp(catalogNm,"") == 0)
					strcpy(tableName1,SEABASE_MD_CATALOG);
				else
					strcpy(tableName1, catalogNm);

/*
				if (APIType == SQL_API_SQLCOLUMNS)
						strcpy((char *)catStmtLabel, "SQL_COLUMNS_UNICODE_Q4");

				else
					strcpy((char *)catStmtLabel, "SQL_JAVA_COLUMNS_ANSI_Q4");
*/
				tableParam[0] = tableName1;
				convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
				convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
				convertWildcard(metadataId, TRUE, tableNm, expTableNm);
				convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
				convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
				convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
				inputParam[0] = schemaNmNoEsc;
				inputParam[1] = expSchemaNm;
				inputParam[2] = tableNmNoEsc;
				inputParam[3] = expTableNm;
				inputParam[4] = columnNmNoEsc;
				inputParam[5] = expColumnNm;
				inputParam[6] = odbcAppVersion;
				inputParam[7] = NULL;

                if (strncmp(odbcAppVersion, "3", 1) == 0)
                {
                                snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
  "cast('%s' as varchar(128) ) TABLE_CAT, "
"cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
  "cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME, "
  "cast(trim(co.COLUMN_NAME) as varchar(128) ) COLUMN_NAME, "
   "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
     "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.DATA_TYPE end) as smallint) DATA_TYPE, "
  "trim(dt.TYPE_NAME) TYPE_NAME, "
  "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
    "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
    "when dt.USEPRECISION = -1 then co.COLUMN_SIZE when dt.USEPRECISION = -2 then co.COLUMN_PRECISION "
    "when co.FS_DATA_TYPE = 192 then dt.USEPRECISION "
    "when co.FS_DATA_TYPE >= 195 and co.FS_DATA_TYPE <= 207 then dt.USEPRECISION + 1 "
    "else dt.USEPRECISION end) as integer) COLUMN_SIZE, "
"cast((case when dt.USELENGTH = -1 then co.COLUMN_SIZE when dt.USELENGTH = -2 then co.COLUMN_PRECISION "
   "when dt.USELENGTH = -3 then co.COLUMN_PRECISION + 2  "
   "else dt.USELENGTH end) as integer) BUFFER_LENGTH, "
  "cast(co.COLUMN_SCALE as smallint) DECIMAL_DIGITS, "
"cast(dt.NUM_PREC_RADIX as smallint) NUM_PREC_RADIX, "
 "cast(co.NULLABLE as smallint) NULLABLE, "
 "cast('' as varchar(128)) REMARKS, "
"trim(co.DEFAULT_VALUE) COLUMN_DEF, "
  "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
     "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.SQL_DATA_TYPE end) as smallint) SQL_DATA_TYPE, "
  "cast(dt.SQL_DATETIME_SUB as smallint) SQL_DATETIME_SUB, cast((case dt.DATA_TYPE when 1 then co.COLUMN_SIZE "
    "when -1 then co.COLUMN_SIZE when 12 then co.COLUMN_SIZE else NULL end) as integer) CHAR_OCTET_LENGTH, "
  "cast((case when (trim(co1.COLUMN_CLASS) <> 'S') then co.column_number+1 else "
    "co.column_number end) as integer) ORDINAL_POSITION, "
  "cast((case when co.NULLABLE = 0 then 'NO' else 'YES' end) as varchar(3)) IS_NULLABLE  "
"from  "
"TRAFODION.\"_MD_\".objects ob, "
"TRAFODION.\"_MD_\".columns co, "
"TRAFODION.\"_MD_\".columns co1, "
  "(VALUES ("
  "cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)), "
  "cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint), "
  "cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('SIGNED LARGEINT' as varchar(128)), cast(134 as integer), "
  "cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint), "
  "cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)), "
  "('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', 0, NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0), "
  "('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', 192, NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0), "
  "('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 152, 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0), "
  "('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 150, 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0), "
  "('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 143, 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0), "
  "('INTEGER', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 132, 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0), "
  "('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 133, 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0), "
  "('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 205, NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0), "
  "('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 201, NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0), "
  "('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 195, NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0), "
  "('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 204, NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0), "
  "('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 199, NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0), "
  "('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 197, NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0), "
  "('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 200, NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0), "
  "('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 196, NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0), "
  "('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 202, NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0), "
  "('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 206, NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0), "
  "('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 207, NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0), "
  "('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 203, NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0), "
  "('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 198, NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0), "
  "('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 156, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
  "('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 155, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
  "('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 142, 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0), "
  "('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 130, 10, 5, -1, 5, NULL, NULL, 0, 0, 3, 0), "
  "('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 131, 10, 5, -1, -502, NULL, NULL, 0, 0, 3, 0), "
  "('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', 192, NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0), "
  "('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', 192, NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0), "
  "('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', 64, NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0) "
  " ) "
  "dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\", "
     "\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\", \"FS_DATA_TYPE\", "
     "\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\", "
     "\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\") "
"where  ob.OBJECT_UID = co.OBJECT_UID "
  "and dt.FS_DATA_TYPE = co.FS_DATA_TYPE "
  "and co.OBJECT_UID = co1.OBJECT_UID and co1.COLUMN_NUMBER = 0 "
  "and (dt.DATETIMESTARTFIELD = co.DATETIME_START_FIELD) "
  "and (dt.DATETIMEENDFIELD = co.DATETIME_END_FIELD) "
  "and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
  "and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
  "and (co.COLUMN_NAME = '%s' or trim(co.COLUMN_NAME) LIKE '%s' ESCAPE '\\')  "
  "and (ob.OBJECT_TYPE in ('BT' , 'VI') ) "
  "and (trim(co.COLUMN_CLASS) not in ('S', 'M')) "
  "and dt.APPLICATION_VERSION = %s "
"FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, co.COLUMN_NUMBER ; ",
                               tableParam[0], inputParam[0], inputParam[1],
                               inputParam[2], inputParam[3], inputParam[4],
                               inputParam[5], inputParam[6]);
                }
                else
                {
                                snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
  "cast('%s' as varchar(128) ) TABLE_CAT, "
"cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
  "cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME, "
  "cast(trim(co.COLUMN_NAME) as varchar(128) ) COLUMN_NAME, "
   "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
     "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.DATA_TYPE end) as smallint) DATA_TYPE, "
  "trim(dt.TYPE_NAME) TYPE_NAME, "
  "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
    "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
    "when dt.USEPRECISION = -1 then co.COLUMN_SIZE when dt.USEPRECISION = -2 then co.COLUMN_PRECISION "
    "when co.FS_DATA_TYPE = 192 then dt.USEPRECISION + 1 "
    "when co.FS_DATA_TYPE >= 195 and co.FS_DATA_TYPE <= 207 then dt.USEPRECISION + 1 "
    "else dt.USEPRECISION end) as integer) COLUMN_SIZE, "
"cast((case when dt.USELENGTH = -1 then co.COLUMN_SIZE when dt.USELENGTH = -2 then co.COLUMN_PRECISION "
   "when dt.USELENGTH = -3 then co.COLUMN_PRECISION + 2  "
   "else dt.USELENGTH end) as integer) BUFFER_LENGTH, "
  "cast(co.COLUMN_SCALE as smallint) DECIMAL_DIGITS, "
"cast(dt.NUM_PREC_RADIX as smallint) NUM_PREC_RADIX, "
 "cast(co.NULLABLE as smallint) NULLABLE, "
 "cast('' as varchar(128)) REMARKS "
"from  "
"TRAFODION.\"_MD_\".objects ob, "
"TRAFODION.\"_MD_\".columns co, "
"TRAFODION.\"_MD_\".columns co1, "
  "(VALUES ("
  "cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)), "
  "cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint), "
  "cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('SIGNED LARGEINT' as varchar(128)), cast(134 as integer), "
  "cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint), "
  "cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)), "
  "('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', 0, NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0), "
  "('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', 192, NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0), "
  "('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 152, 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0), "
  "('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 150, 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0), "
  "('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 143, 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0), "
  "('INTEGER', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 132, 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0), "
  "('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 133, 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0), "
  "('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 205, NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0), "
  "('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 201, NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0), "
  "('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 195, NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0), "
  "('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 204, NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0), "
  "('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 199, NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0), "
  "('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 197, NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0), "
  "('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 200, NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0), "
  "('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 196, NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0), "
  "('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 202, NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0), "
  "('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 206, NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0), "
  "('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 207, NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0), "
  "('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 203, NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0), "
  "('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 198, NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0), "
  "('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 156, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
  "('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 155, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
  "('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 142, 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0), "
  "('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 130, 10, 5, -1, 5, NULL, NULL, 0, 0, 3, 0), "
  "('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 131, 10, 5, -1, -502, NULL, NULL, 0, 0, 3, 0), "
  "('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', 192, NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0), "
  "('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', 192, NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0), "
  "('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', 64, NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0) "
  " ) "
  "dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\", "
     "\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\", \"FS_DATA_TYPE\", "
     "\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\", "
     "\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\") "
"where  ob.OBJECT_UID = co.OBJECT_UID "
  "and dt.FS_DATA_TYPE = co.FS_DATA_TYPE "
  "and co.OBJECT_UID = co1.OBJECT_UID and co1.COLUMN_NUMBER = 0 "
  "and (dt.DATETIMESTARTFIELD = co.DATETIME_START_FIELD) "
  "and (dt.DATETIMEENDFIELD = co.DATETIME_END_FIELD) "
  "and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
  "and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
  "and (co.COLUMN_NAME = '%s' or trim(co.COLUMN_NAME) LIKE '%s' ESCAPE '\\')  "
  "and (ob.OBJECT_TYPE in ('BT' , 'VI') ) "
  "and (trim(co.COLUMN_CLASS) not in ('S', 'M')) "
"FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, co.COLUMN_NUMBER ; ",
                               tableParam[0], inputParam[0], inputParam[1],
                               inputParam[2], inputParam[3], inputParam[4],
                               inputParam[5]);
                }
			}
			break;
        case SQL_API_SQLCOLUMNS_JDBC :

            if (!checkIfWildCard(catalogNm, catalogNmNoEsc) && !metadataId)
            {
                exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
                goto MapException;
            }
            if (tableNm[0] != '$' && tableNm[0] != '\\')
            {
                if (strcmp(catalogNm,"") == 0)
                    strcpy(tableName1,SEABASE_MD_CATALOG);
                else
                    strcpy(tableName1, catalogNm);

                /*
                   if (APIType == SQL_API_SQLCOLUMNS)
                   strcpy((char *)catStmtLabel, "SQL_COLUMNS_UNICODE_Q4");

                   else
                   strcpy((char *)catStmtLabel, "SQL_JAVA_COLUMNS_ANSI_Q4");
                   */
                tableParam[0] = tableName1;
                convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
                convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
                convertWildcard(metadataId, TRUE, tableNm, expTableNm);
                convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
                convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
                convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
                inputParam[0] = schemaNmNoEsc;
                inputParam[1] = expSchemaNm;
                inputParam[2] = tableNmNoEsc;
                inputParam[3] = expTableNm;
                inputParam[4] = columnNmNoEsc;
                inputParam[5] = expColumnNm;
                inputParam[6] = odbcAppVersion;
                inputParam[7] = NULL;

                snprintf(CatalogQuery,sizeof(CatalogQuery),
                        "select "
                        "cast('%s' as varchar(128) ) TABLE_CAT, "
                        "cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
                        "cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME, "
                        "cast(trim(co.COLUMN_NAME) as varchar(128) ) COLUMN_NAME, "
                        "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
                        "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.DATA_TYPE end) as smallint) DATA_TYPE, "
                        "trim(dt.TYPE_NAME) TYPE_NAME, "
                        "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
                        "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
                        "when dt.USEPRECISION = -1 then co.COLUMN_SIZE when dt.USEPRECISION = -2 then co.COLUMN_PRECISION "
                        "when co.FS_DATA_TYPE = 192 then dt.USEPRECISION "
                        "when co.FS_DATA_TYPE >= 195 and co.FS_DATA_TYPE <= 207 then dt.USEPRECISION + 1 "
                        "else dt.USEPRECISION end) as integer) COLUMN_SIZE, "
                        "cast((case when dt.USELENGTH = -1 then co.COLUMN_SIZE when dt.USELENGTH = -2 then co.COLUMN_PRECISION "
                        "when dt.USELENGTH = -3 then co.COLUMN_PRECISION + 2  "
                        "else dt.USELENGTH end) as integer) BUFFER_LENGTH, "
                        "cast(co.COLUMN_SCALE as smallint) DECIMAL_DIGITS, "
                        "cast(dt.NUM_PREC_RADIX as smallint) NUM_PREC_RADIX, "
                        "cast(co.NULLABLE as smallint) NULLABLE, "
                        "cast('' as varchar(128)) REMARKS, "
                        "trim(co.DEFAULT_VALUE) COLUMN_DEF, "
                        "cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
                        "when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.SQL_DATA_TYPE end) as smallint) SQL_DATA_TYPE, "
                        "cast(dt.SQL_DATETIME_SUB as smallint) SQL_DATETIME_SUB, cast((case dt.DATA_TYPE when 1 then co.COLUMN_SIZE "
                        "when -1 then co.COLUMN_SIZE when 12 then co.COLUMN_SIZE else NULL end) as integer) CHAR_OCTET_LENGTH, "
                        "cast((case when (trim(co1.COLUMN_CLASS) <> 'S') then co.column_number+1 else "
                        "co.column_number end) as integer) ORDINAL_POSITION, "
                        "cast((case when co.NULLABLE = 0 then 'NO' else 'YES' end) as varchar(3)) IS_NULLABLE,  "
                        "cast(NULL as varchar(128)) SCOPE_CATALOG, "
                        "cast(NULL as varchar(128)) SCOPE_SCHEMA, "
                        "cast(NULL as varchar(128)) SCOPE_TABLE, "
                        "cast(NULL as smallint) SOURCE_DATA_TYPE, "
                        "cast((case when co.DEFAULT_CLASS = 6 then 'YES' else 'NO' end) as varchar(8)) IS_AUTOINCREMENT, "
                        "cast((case when co.DEFAULT_CLASS = 5 then 'YES' else 'NO' end) as varchar(8)) IS_GENERATEDCOLUMN "
                        "from  "
                        "TRAFODION.\"_MD_\".objects ob, "
                        "TRAFODION.\"_MD_\".columns co, "
                        "TRAFODION.\"_MD_\".columns co1, "
                        "(VALUES ("
                        "cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)), "
                        "cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint), "
                        "cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('SIGNED LARGEINT' as varchar(128)), cast(134 as integer), "
                        "cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint), "
                        "cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)), "
                        "('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', 0, NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0), "
                        "('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', 192, NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0), "
                        "('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 152, 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0), "
                        "('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 150, 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0), "
                        "('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 143, 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0), "
                        "('INTEGER', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 132, 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0), "
                        "('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 133, 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0), "
                        "('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 205, NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0), "
                        "('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 201, NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0), "
                        "('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 195, NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0), "
                        "('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 204, NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0), "
                        "('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 199, NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0), "
                        "('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 197, NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0), "
                        "('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 200, NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0), "
                        "('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 196, NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0), "
                        "('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 202, NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0), "
                        "('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 206, NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0), "
                        "('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 207, NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0), "
                        "('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 203, NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0), "
                        "('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 198, NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0), "
                        "('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 156, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
                        "('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 155, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
                        "('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 142, 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0), "
                        "('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 130, 10, 5, -1, 5, NULL, NULL, 0, 0, 3, 0), "
                        "('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 131, 10, 5, -1, -502, NULL, NULL, 0, 0, 3, 0), "
                        "('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', 192, NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0), "
                        "('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', 192, NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0), "
                        "('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', 64, NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0) "
                        " ) "
                        "dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\", "
                        "\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\", \"FS_DATA_TYPE\", "
                        "\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\", "
                        "\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\") "
                        "where  ob.OBJECT_UID = co.OBJECT_UID "
                        "and dt.FS_DATA_TYPE = co.FS_DATA_TYPE "
                        "and co.OBJECT_UID = co1.OBJECT_UID and co1.COLUMN_NUMBER = 0 "
                        "and (dt.DATETIMESTARTFIELD = co.DATETIME_START_FIELD) "
                        "and (dt.DATETIMEENDFIELD = co.DATETIME_END_FIELD) "
                        "and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                        "and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
                        "and (co.COLUMN_NAME = '%s' or trim(co.COLUMN_NAME) LIKE '%s' ESCAPE '\\')  "
                        "and (ob.OBJECT_TYPE in ('BT' , 'VI') ) "
                        "and (trim(co.COLUMN_CLASS) not in ('S', 'M')) "
                        "and dt.APPLICATION_VERSION = 3 "
                        "FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, co.COLUMN_NUMBER ; ",
                    tableParam[0], inputParam[0], inputParam[1],
                    inputParam[2], inputParam[3], inputParam[4],
                    inputParam[5], inputParam[6]);
            }
            break;
		case SQL_API_SQLPRIMARYKEYS :
			if ((!checkIfWildCard(catalogNm, catalogNmNoEsc) || !checkIfWildCard(schemaNm, schemaNmNoEsc) || !checkIfWildCard(tableNm, tableNmNoEsc)) && !metadataId)
			{
				exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
				goto MapException;
			}
			// strcpy((char *)catStmtLabel, "SQL_PRIMARYKEYS_ANSI_Q4");

			if (strcmp(catalogNm,"") == 0)
                                strcpy(tableName1,SEABASE_MD_CATALOG);
			else
				strcpy(tableName1, catalogNm);
			tableParam[0] = tableName1;
/*
			strcpy(tableName2, SEABASE_MD_CATALOG);
			strcat(tableName2, ".");
			strcat(tableName2, SEABASE_MD_SCHEMA);
			strcat(tableName2, ".");
			strcat(tableName2, smdCatAPITablesList[OBJECTS]);
			tableParam[1] = tableName2;
			strcpy(tableName3, SEABASE_MD_CATALOG);
			strcat(tableName3, ".");
			strcat(tableName3, SEABASE_MD_SCHEMA);
			strcat(tableName3, ".");
			strcat(tableName3, smdCatAPITablesList[KEYS]);
			tableParam[2] = tableName3;
			tableParam[3] = NULL;
*/
			convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
			convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
			convertWildcard(metadataId, TRUE, tableNm, expTableNm);
			convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
			inputParam[0] = schemaNmNoEsc;
			inputParam[1] = expSchemaNm;
			inputParam[2] = tableNmNoEsc;
			inputParam[3] = expTableNm;
			inputParam[4] = NULL;

                        snprintf(CatalogQuery,sizeof(CatalogQuery),
 "select "
 "cast('%s' as varchar(128) ) TABLE_CAT,"
 "cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
 "cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
 "trim(ky.COLUMN_NAME) COLUMN_NAME,"
 "cast((ky.keyseq_number) as smallint) KEY_SEQ,"
 "trim(ob.OBJECT_NAME) PK_NAME "
 " from TRAFODION.\"_MD_\".OBJECTS ob, "
       "TRAFODION.\"_MD_\".KEYS ky "
 " where (ob.SCHEMA_NAME = '%s' or "
 " trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
 " and (ob.OBJECT_NAME = '%s' or "
 " trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
  " and ob.OBJECT_UID = ky.OBJECT_UID and ky.COLUMN_NAME <> '_SALT_' "
  " FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, 5 ;",
                        tableParam[0], inputParam[0], inputParam[1],
                        inputParam[2], inputParam[3]);


			break;

        case SQL_API_SQLFOREIGNKEYS:
            if ((!checkIfWildCard(catalogNm, catalogNmNoEsc) ||
                 !checkIfWildCard(schemaNm, schemaNmNoEsc)  ||
                 !checkIfWildCard(tableNm, tableNmNoEsc))    &&
                 !metadataId)
            {
                exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
                goto MapException;
            }

            convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
            convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
            convertWildcard(metadataId, TRUE, tableNm, expTableNm);
            convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);

            char fkcatalogNmNoEsc[MAX_ANSI_NAME_LEN + 1];
            char fkschemaNmNoEsc[MAX_ANSI_NAME_LEN + 1];
            char fktableNmNoEsc[MAX_ANSI_NAME_LEN + 1];
            char fkexpCatalogNm[MAX_ANSI_NAME_LEN + 1];
            char fkexpSchemaNm[MAX_ANSI_NAME_LEN + 1];
            char fkexpTableNm[MAX_ANSI_NAME_LEN + 1];

            if (strcmp(fktableNm, "") == 0)
                strcpy((char *)fktableNm, "%");
            if (strcmp(fkschemaNm, "") == 0)
                strcpy((char *)fkschemaNm, "%");

            convertWildcard(metadataId, TRUE, fkcatalogNm, fkexpCatalogNm);
            convertWildcardNoEsc(metadataId, TRUE, fkcatalogNm, fkcatalogNmNoEsc);

            convertWildcard(metadataId, TRUE, fkschemaNm, fkexpSchemaNm);
            convertWildcardNoEsc(metadataId, TRUE, fkschemaNm, fkschemaNmNoEsc);

            convertWildcard(metadataId, TRUE, fktableNm, fkexpTableNm);
            convertWildcardNoEsc(metadataId, TRUE, fktableNm, fktableNmNoEsc);

            snprintf(CatalogQuery, sizeof(CatalogQuery),
                    "select "
                    "cast(PKCO.CATALOG_NAME as varchar(128)) PKTABLE_CAT, "
                    "cast(PKCO.SCHEMA_NAME as varchar(128)) PKTABLE_SCHEM, "
                    "cast(PKCO.TABLE_NAME as varchar(128)) PKTABLE_NAME, "
                    "cast(PKCO.COLUMN_NAME as varchar(128)) PKCOLUMN_NAME, "
                    "cast(FKCO.CATALOG_NAME as varchar(128)) FKTABLE_CAT, "
                    "cast(PKCO.SCHEMA_NAME as varchar(128)) FKTABLE_SCHEM, "
                    "cast(FKCO.TABLE_NAME as varchar(128)) FKTABLE_NAME, "
                    "cast(FKCO.COLUMN_NAME as varchar(128)) FKCOLUMN_NAME, "
                    "cast(FKKV.ORDINAL_POSITION as smallint) KEY_SEQ, "
                    "cast(0 as smallint) update_rule, " // not support
                    "cast(0 as smallint) delete_rule, " // not support
                    "cast(FKKV.CONSTRAINT_NAME as varchar(128)) FK_NAME, "
                    "cast(PKKV.CONSTRAINT_NAME as varchar(128)) PK_NAME, "
                    "cast(0 as smallint) DEFERRABILITY " // not support
                    "from "
                    "TRAFODION.\"_MD_\".REF_CONSTRAINTS_VIEW rcv, "
                    "TRAFODION.\"_MD_\".KEYS_VIEW PKKV, "
                    "TRAFODION.\"_MD_\".KEYS_VIEW FKKV, "
                    "TRAFODION.\"_MD_\".COLUMNS_VIEW PKCO, "
                    "TRAFODION.\"_MD_\".COLUMNS_VIEW FKCO "
                    "where "
                    "FKKV.CONSTRAINT_NAME = rcv.CONSTRAINT_NAME "
                    "and PKKV.CONSTRAINT_NAME = rcv.UNIQUE_CONSTRAINT_NAME "
                    "and PKCO.TABLE_NAME = PKKV.TABLE_NAME "
                    "and FKCO.TABLE_NAME = FKKV.TABLE_NAME "
                    "and PKCO.COLUMN_NAME = PKKV.COLUMN_NAME "
                    "and FKCO.COLUMN_NAME = FKKV.COLUMN_NAME "
                    "and (PKCO.SCHEMA_NAME = '%s' or trim(PKCO.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (PKCO.TABLE_NAME = '%s' or trim(PKCO.TABLE_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (FKCO.SCHEMA_NAME = '%s' or trim(FKCO.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (FKCO.TABLE_NAME = '%s' or trim(FKCO.TABLE_NAME) LIKE '%s' ESCAPE '\\') "
                    "FOR READ UNCOMMITTED ACCESS ORDER BY 1, 2, 3, 5, 6, 7, 9;",
                schemaNmNoEsc, expSchemaNm,
                tableNmNoEsc, expTableNm,
                fkschemaNmNoEsc, fkexpSchemaNm,
                fktableNmNoEsc, fkexpTableNm
                    );
            break;
        case SQL_API_SQLSTATISTICS:
            if (!checkIfWildCard(catalogNm, catalogNmNoEsc) && !metadataId)
            {
                exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
            }
            if (tableNm[0] != '$' && tableNm[0] != '\\')
            {
                if (strcmp(catalogNm, "") == 0)
                    strcpy(tableName1, SEABASE_MD_CATALOG);
                else
                    strcpy(tableName1, catalogNm);
            }

            tableParam[0] = tableName1;
            convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
            convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
            convertWildcard(metadataId, TRUE, tableNm, expTableNm);
            convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
            inputParam[0] = schemaNmNoEsc;
            inputParam[1] = expSchemaNm;
            inputParam[2] = tableNmNoEsc;
            inputParam[3] = expTableNm;

            snprintf(CatalogQuery, sizeof(CatalogQuery),
                    "select "
                    "cast('%s' as varchar(128)) TABLE_CAT, "
                    "cast(trim(ob.SCHEMA_NAME) as varchar(128)) TABLE_SCHEM, "
                    "cast(trim(ob.OBJECT_NAME) as varchar(128)) TABLE_NAME, "
                    "cast(NULL as smallint) NON_UNIQUE, " // return NULL if TYPE is SQL_TABLE_STAT
                    "cast(NULL as varchar(128)) INDEX_QUALIFIER, " // return NULL if TYPE is SQL_TABLE_STAT
                    "cast(NULL as varchar(128)) INDEX_NAME, " // return NULL if TYPE is SQL_TABLE_STAT
                    "cast(0 as smallint) TYPE, " // TYPE is SQL_TABLE_STAT
                    "cast(NULL as smallint) ORDINAL_POSITION, " // return NULL if TYPE is SQL_TABLE_STAT
                    "cast(trim(co.COLUMN_NAME) as varchar(128)) COLUMN_NAME, "
                    "cast(NULL as char(1)) ASC_OR_DESC, " // return NULL if TYPE is SQL_TABLE_STAT
                    "cast(sb.rowcount as integer) CARDINALITY, " // number of rows
                    "cast(NULL as integer) PAGES, " // not support
                    "cast(NULL as varchar(128)) FILTER_CONDITION " // not support
                    "from "
                    "TRAFODION.\"_MD_\".OBJECTS ob, "
                    "TRAFODION.\"_MD_\".COLUMNS co, "
                    "TRAFODION.%s.sb_histograms sb "
                    "where "
                    "ob.OBJECT_UID = co.OBJECT_UID "
                    "and co.OBJECT_UID = sb.TABLE_UID "
                    "and co.COLUMN_NUMBER = sb.COLUMN_NUMBER "
                    "and sb.colcount = 1 "
                    "and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\')  "
                    "and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (ob.OBJECT_TYPE in ('BT', 'VI')) "
                    "and (trim(co.COLUMN_CLASS) not in('S', 'M')) "
                    "union "
                    "select "
                    "cast('%s' as varchar(128)) TABLE_CAT, "
                    "cast(trim(ob_table.SCHEMA_NAME) as varchar(128)) TABLE_SCHEM, "
                    "cast(trim(ob_table.OBJECT_NAME) as varchar(128)) TABLE_NAME, "
                    "cast(case when idx.is_unique = 1 then 0 else 1 end as smallint) NON_UNIQUE, "
                    "cast(NULL as varchar(128)) INDEX_QUALIFIER, " // not support
                    "cast(trim(ob.OBJECT_NAME) as varchar(128)) INDEX_NAME, "
                    "cast(3 as smallint) TYPE, " // SQL_INDEX_OTHER
                    "cast(0 as smallint) ORDINAL_POSITION, "
                    "cast('' as varchar(128)) COLUMN_NAME, " // return an empty string if the expression cannot be determined.
                    "cast(NULL as char(1)) ASC_OR_DESC, " // not subsequent
                    "cast(NULL as integer) CARDINALITY, "
                    "cast(NULL as integer) PAGES, "
                    "cast(NULL as varchar(128)) FILTER_CONDITION "
                    "from "
                    "TRAFODION.\"_MD_\".OBJECTS ob, "
                    "TRAFODION.\"_MD_\".INDEXES idx, "
                    "TRAFODION.\"_MD_\".OBJECTS ob_table, "
                    "TRAFODION.\"_MD_\".TABLES tb "
                    "where "
                    "idx.BASE_TABLE_UID=tb.TABLE_UID "
                    "and idx.INDEX_UID=ob.OBJECT_UID "
                    "and idx.BASE_TABLE_UID=ob_table.OBJECT_UID "
                    "and (ob_table.SCHEMA_NAME = '%s' or trim(ob_table.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (ob_table.OBJECT_NAME = '%s' or trim(ob_table.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (ob_table.OBJECT_TYPE in ('BT', 'VI')) "
                    "%s "
                    "ORDER BY 1, 2, 3, 7, 9, 6 ;",
                    tableParam[0],
                    inputParam[0],
                    inputParam[0], inputParam[1],
                    inputParam[2], inputParam[3],
                    tableParam[0],
                    inputParam[0], inputParam[1],
                    inputParam[2], inputParam[3],
                    uniqueness == 1 ? "" : "and idx.is_unique=1"
                    );
            break;
        case SQL_API_SQLTABLEPRIVILEGES:
            convertWildcard(metadataId, TRUE, catalogNm, expCatalogNm);
            convertWildcardNoEsc(metadataId, TRUE, catalogNm, catalogNmNoEsc);
            convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
            convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
            convertWildcard(metadataId, TRUE, tableNm, expTableNm);
            convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
            inputParam[0] = catalogNmNoEsc;
            inputParam[1] = expCatalogNm;
            inputParam[2] = schemaNmNoEsc;
            inputParam[3] = expSchemaNm;
            inputParam[4] = tableNmNoEsc;
            inputParam[5] = expTableNm;
            snprintf(CatalogQuery, sizeof(CatalogQuery), "select cast(ob.CATALOG_NAME as varchar(128) ) TABLE_CAT,"
                    "cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
                    "cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
                    "cast(trim(op.GRANTOR_NAME) as varchar(128) ) GRANTOR,"
                    "cast(trim(op.GRANTEE_NAME) as varchar(128) ) GRANTEE,"
                    "cast(trim(case op.PRIVILEGES_BITMAP "
                    "when 1 then 'SELECT' "
                    "when 2 then 'INSERT' "
                    "when 3 then 'SELECT,INSERT' "
                    "when 4 then 'DELETE' "
                    "when 5 then 'SELECT,DELETE' "
                    "when 6 then 'INSERT,DELETE' "
                    "when 7 then 'SELECT,INSERT,DELETE' "
                    "when 8 then 'UPDATE' "
                    "when 9 then 'SELECT,UPDATE' "
                    "when 10 then 'INSERT,UPDATE' "
                    "when 11 then 'SELECT,INSERT,UPDATE' "
                    "when 12 then 'DELETE,UPDATE' "
                    "when 13 then 'SELECT,DELETE,UPDATE' "
                    "when 14 then 'INSERT,DELETE,UPDATE' "
                    "when 15 then 'SELECT,INSERT,DELETE,UPDATE' "
                    "when 32 then 'REFERENCES' "
                    "when 33 then 'SELECT,REFERENCES' "
                    "when 34 then 'INSERT,REFERENCES' "
                    "when 35 then 'SELECT,INSERT,REFERENCES' "
                    "when 36 then 'DELETE,REFERENCES' "
                    "when 37 then 'SELECT,DELETE,REFERENCES' "
                    "when 38 then 'INSERT,DELETE,REFERENCES' "
                    "when 39 then 'SELECT,INSERT,DELETE,REFERENCES' "
                    "when 40 then 'UPDATE,REFERENCES' "
                    "when 41 then 'SELECT,UPDATE,REFERENCES' "
                    "when 42 then 'INSERT,UPDATE,REFERENCES' "
                    "when 43 then 'SELECT,INSERT,UPDATE,REFERENCES' "
                    "when 44 then 'DELETE,UPDATE,REFERENCES' "
                    "when 45 then 'SELECT,DELETE,UPDATE,REFERENCES' "
                    "when 46 then 'INSERT,DELETE,UPDATE,REFERENCES' "
                    "when 47 then 'SELECT,INSERT,DELETE,UPDATE,REFERENCES' end) as varchar(128)) PRIVILEGE,"
                    "cast (trim(case op.GRANTABLE_BITMAP "
                    "when 0 then 'NO' else 'YES' "
                    "end) as varchar(128)) IS_GRANTABLE "
                    "from TRAFODION.\"_PRIVMGR_MD_\".OBJECT_PRIVILEGES as op, TRAFODION.\"_MD_\".OBJECTS as ob "
                    "where ob.OBJECT_UID = op.OBJECT_UID "
                    "%s"
                    "and (ob.CATALOG_NAME = '%s' or trim(ob.CATALOG_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
                    , (strlen(inputParam[4]) == 0 || inputParam[4][0] == '%') ? " " : "and op.GRANTEE_NAME <> 'DB__ROOT' "
                    , inputParam[0], inputParam[1]
                    , inputParam[2], inputParam[3]
                    , inputParam[4], inputParam[5]
                    );
            break;
               default :
                       exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                       exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNSUPPORTED_SMD_API_TYPE;
                       break;
        }

        if (exception_->exception_nr == 0)
        {
           if ((QryCatalogSrvrStmt = getSrvrStmt(catStmtLabel, TRUE)) == NULL)
           {
              SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
                           EVENTLOG_ERROR_TYPE,
                           srvrGlobal->nskProcessInfo.processId,
                           ODBCMX_SERVER,
                           srvrGlobal->srvrObjRef,
                           2,
                           "CATALOG APIs",
                           "Allocate Statement");
              exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
              exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
           }
           else
           {
              // Temporary solution - bypass checks on metadata tables
              unsigned int savedParserFlags = 0;


              SQL_EXEC_GetParserFlagsForExSqlComp_Internal(savedParserFlags);

              try
              {
                 SQL_EXEC_SetParserFlagsForExSqlComp_Internal(INTERNAL_QUERY_FROM_EXEUTIL);

                 retcode = QryCatalogSrvrStmt->ExecDirect(NULL, CatalogQuery, EXTERNAL_STMT, TYPE_SELECT, SQL_ASYNC_ENABLE_OFF, 0);

                 SQL_EXEC_AssignParserFlagsForExSqlComp_Internal(savedParserFlags);
                 if (retcode == SQL_ERROR)
                 {
                    ERROR_DESC_def *p_buffer = QryCatalogSrvrStmt->sqlError.errorList._buffer;
                    char             errNumStr[128] = {0};
                    sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);
                    strncpy(RequestError, p_buffer->errorText,sizeof(RequestError) -1);
                    RequestError[sizeof(RequestError) - 1] = '\0';

                    SendEventMsg(MSG_SQL_ERROR,
                                 EVENTLOG_ERROR_TYPE,
                                 srvrGlobal->nskProcessInfo.processId,
                                 ODBCMX_SERVER,
                                 srvrGlobal->srvrObjRef,
                                 2,
                                 errNumStr,
                                 RequestError);

                    exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                    exception_->u.SQLError.errorList._length = QryCatalogSrvrStmt->sqlError.errorList._length;
                    exception_->u.SQLError.errorList._buffer = QryCatalogSrvrStmt->sqlError.errorList._buffer;
                    exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
                 }

              } //try
              catch (...)
              {
                 SQL_EXEC_AssignParserFlagsForExSqlComp_Internal(savedParserFlags);
                 SendEventMsg(MSG_PROGRAMMING_ERROR,
                              EVENTLOG_ERROR_TYPE,
                              srvrGlobal->nskProcessInfo.processId,
                              ODBCMX_SERVER,
                              srvrGlobal->srvrObjRef,
                              1,
                              "Exception in executing Catalog API");

                 exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
                 exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
              } // catch
           }
        }

        if (exception_->exception_nr == 0)
        {
           QryCatalogSrvrStmt->sqlStmtType = TYPE_SELECT_CATALOG;
           outputDesc->_length = QryCatalogSrvrStmt->outputDescList._length;
           outputDesc->_buffer = QryCatalogSrvrStmt->outputDescList._buffer;
        }

MapException:
        // resource statistics
        if (resStatSession != NULL)
        {
               if (exception_->exception_nr != 0)
                              resStatSession->totalCatalogErrors ++;
               if (sqlWarning->_length != 0)
                              resStatSession->totalCatalogWarnings ++;
        }
        if (resStatStatement != NULL)
               resStatStatement->catFlagOn = FALSE;
        if (exception_->exception_nr != 0)
        {
               SRVR_STMT_HDL *pSrvrStmt = NULL;
               if ((pSrvrStmt = getSrvrStmt(catStmtLabel, FALSE)) != NULL)
               {
                       exception_->exception_nr = 0;
                       exception_->exception_detail = 0;
                       pSrvrStmt->rowsAffected = 0;
                       // CLEARDIAGNOSTICS(pSrvrStmt);
                       if (pSrvrStmt->bSQLMessageSet)
                              pSrvrStmt->cleanupSQLMessage();
               }
        }

        SRVRTRACE_EXIT(FILE_SME+14);
        return;
}

/*
 * Synchronous method function prototype for
 * operation 'odbc_SQLSvc_InitializeDialogue'
 */
extern "C" void
odbc_SQLSvc_InitializeDialogue_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_InitializeDialogue_exc_ *exception_
  , /* In    */ const USER_DESC_def *userDesc
  , /* In    */ const CONNECTION_CONTEXT_def *inContext
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* Out	 */ OUT_CONNECTION_CONTEXT_def *outContext
  )
{
	SRVRTRACE_ENTER(FILE_SME+15);

	exception_->exception_nr = 0;
	Int32 retcode = SQL_SUCCESS;
	char userSid[MAX_TEXT_SID_LEN+1];
	char pwd[387];
	pwd[0] = '\0';

	__int64			julian = 0;
	char primary_rolename[MAX_ROLENAME_LEN+1];
	char logon_rolename[MAX_ROLENAME_LEN+1];
	short logon_roleLen = 0;
        __int64 redefTime = 0;
	Int32  authIDType = 0;
	int encryption = 1;
	int refresh = 0;
	char* pPWD = (char*)userDesc->password._buffer;

	bzero(primary_rolename, sizeof(primary_rolename));

//	volatile int done = 0;
//	while (!done) {
//		sleep(10);
//	}



	userSid[0]  = 0;

// #ifdef _TMP_SQ_SECURITY

UA_Status       authErrorDetail;
DBUserAuth     *userSession = DBUserAuth::GetInstance();
size_t          passwordLen = 0;
CLIENT_INFO     client_info;
PERFORMANCE_INFO performanceInfo;
AUTHENTICATION_INFO authenticationInfo;

	if (userDesc->userDescType != AUTHENTICATED_USER_TYPE)
	{
	        srvrGlobal->QSRoleName[0] = '\0';
		int64 tempStartTime, tempEndTime = 0;
		int64 loginStartTime = JULIANTIMESTAMP();
		client_info.client_name = setinit.clientId;
		client_info.client_user_name = setinit.clientUserName;
		client_info.application_name = setinit.applicationId;

#ifndef _DEBUG
		// Disable generation of cores in release version
		struct rlimit rlim;
		int limit, ret_rlimit;

		// Get the current limit and save.
		ret_rlimit = getrlimit(RLIMIT_CORE, &rlim);
		limit = rlim.rlim_cur;

		// Set the current limit to 0, disabling generation of core
		rlim.rlim_cur = 0;
		ret_rlimit = setrlimit(RLIMIT_CORE, &rlim);
#endif

		retcode = decrypt_message(pPWD,primary_rolename);

		tempStartTime = JULIANTIMESTAMP() ;

		if (retcode == SECMXO_NO_ERROR)
         	{
                        size_t length = strlen(userDesc->userName);
 	                for (size_t i = 0; i < length; i++)
	                   userDesc->userName[i] = toupper(userDesc->userName[i]);

	                retcode = userSession->verify(userDesc->userName
						      ,pPWD
                                                      ,authErrorDetail
						      ,authenticationInfo
						      ,client_info
						      ,performanceInfo
						      );
		}
		if (retcode == 0)
		{
			srvrGlobal->redefTime = authenticationInfo.usersInfo.redefTime;
			strcpy(srvrGlobal->QSRoleName, "NONE");
		}

#ifndef _DEBUG
		// Revert to the previous setting for core generation
		rlim.rlim_cur = limit;
		ret_rlimit = setrlimit(RLIMIT_CORE, &rlim);
#endif

		tempEndTime = JULIANTIMESTAMP();
		setinit.ldapLoginTime = tempEndTime - tempStartTime;
		setinit.totalLoginTime = tempEndTime - loginStartTime;
                setinit.sqlUserTime = performanceInfo.sqlUserTime;
                setinit.searchConnectionTime = performanceInfo.searchConnectionTime;
                setinit.searchTime = performanceInfo.searchTime;
                setinit.authenticationConnectionTime = performanceInfo.authenticationConnectionTime;
                setinit.authenticationTime = performanceInfo.authenticationTime;
		
		if (retcode != SECMXO_NO_ERROR)
		{
			exception_->exception_detail = retcode;
			exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_SQLError_exn_;
			srvrGlobal->QSRoleName[0] = '\0';
			SETSECURITYERROR(retcode, &exception_->u.SQLError.errorList);
			SRVRTRACE_EXIT(FILE_SME+15);
			if (retcode == SECMXO_INTERNAL_ERROR_FATAL)
			{
				SendEventMsg(MSG_PROGRAMMING_ERROR, EVENTLOG_ERROR_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER, srvrGlobal->srvrObjRef,
					1, "Security layer returned fatal error. Server exiting.");
				exit(0);
			}
			return;
		}

		tempEndTime = JULIANTIMESTAMP();
		setinit.totalLoginTime = tempEndTime - loginStartTime;
                
		if (authenticationInfo.error == 0)
          		retcode = WSQL_EXEC_SetAuthID(userDesc->userName,
                                                      authenticationInfo.usersInfo.databaseUsername, 
                                                      authenticationInfo.tokenKey,
                                                      authenticationInfo.tokenKeySize,
                                                      authenticationInfo.usersInfo.effectiveUserID,
                                                      authenticationInfo.usersInfo.sessionUserID);
                else
		{
			bool bSQLMessageSet;
			exception_->exception_detail = -8837;
			if (authenticationInfo.errorDetail == 1)
                        {
                           setAuthenticationError(bSQLMessageSet,&(exception_->u.SQLError),userDesc->userName,false);
			   exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_InvalidUser_exn_;
                        }
			else
			{
                           setAuthenticationError(bSQLMessageSet,&(exception_->u.SQLError),userDesc->userName,true);
			   exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_SQLError_exn_;
			   ERROR_DESC_def *sqlError = exception_->u.SQLError.errorList._buffer;
			   SendEventMsg(MSG_SQL_ERROR, EVENTLOG_ERROR_TYPE,
			     	srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER, srvrGlobal->srvrObjRef,
			     	3, ODBCMX_SERVER, sqlError->sqlstate, sqlError->errorText);
			}
		}
	}

	SRVRTRACE_EXIT(FILE_SME+15);
	return;
}

/*
 * Synchronous method function for
 * operation 'odbc_SQLSvc_TerminateDialogue'
 */
extern "C" void
odbc_SQLSvc_TerminateDialogue_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_TerminateDialogue_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  )
{
	SRVRTRACE_ENTER(FILE_SME+16);

	exception_->exception_nr = 0;
	//odbc_SQLSvc_EndTransaction_exc_ endTransactionException;
	//ERROR_DESC_LIST_def	sqlWarning;


	// Rollback the transaction, Don't bother to check if autocommit is on or off, since SQL
	// doesn't check for it
	// When there is no transaction outstanding, SQL would give an error and ignore this error.

	if (WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
		EXECDIRECT("ROLLBACK WORK");
	//odbc_SQLSvc_EndTransaction_sme_(objtag_, call_id_, &endTransactionException,
	//								dialogueId, SQL_ROLLBACK
	//								,&sqlWarning
	//									);

	// resource statistics resStatSession->end() is called in SRVR::BreakDialogue()
	//if (resStatSession != NULL)
	//	resStatSession->end();
	//end rs

	SRVRTRACE_EXIT(FILE_SME+16);
	return;
}

/*
 *
 * Synchronous method function for
 * operation 'odbc_SQLSvc_SetConnectionOption'
 */
extern "C" void
odbc_SQLSvc_SetConnectionOption_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLSvc_SetConnectionOption_exc_ *exception_
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ IDL_short connectionOption
  , /* In    */ Int32  optionValueNum
  , /* In    */ IDL_string optionValueStr
  , /* Out   */ ERROR_DESC_LIST_def *sqlWarning
 )
{
	SRVRTRACE_ENTER(FILE_SME+17);

	char stmtLabel[MAX_STMT_LABEL_LEN+1];
	char sqlString[256];
	Int32 retcode = 0;
	bool sqlStringNeedsExecution = true;

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SRVR_STMT_HDL *resStmt;

	int64 	local_xid;
	UINT	xid_length = sizeof(local_xid);
	char buffer[100];
	char valueStr[MAX_SQL_IDENTIFIER_LEN+1];
	char schemaValueStr[MAX_SQL_IDENTIFIER_LEN+MAX_SQL_IDENTIFIER_LEN+5+1]; // 5 for quotes + dot
	char	*CatalogNameTypeStr = '\0';
	char *endPtr;

	exception_->exception_nr = CEE_SUCCESS;
	sqlWarning->_length = 0;
	sqlWarning->_buffer = NULL;
	memset(sqlString, 0, 256);

	// Given a label find out the SRVR_STMT_HDL
	if ((pSrvrStmt = getSrvrStmt("STMT_INTERNAL_1", TRUE)) == NULL)
	{
		exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
		return;
	}
	// clientLCID = srvrGlobal->clientLCID, is done during the creation of statement
	// handle. However, the in InitializeDialog(), the correct value of
	// srvrGlobal->clientLCID is set only after the creation of statement handle.
	// This causes an incorrect clientLCID value (the initalized value zero) to
	// be set on pSrvrStmt. This value dectates the character set translations.
	// An incorrect value of clientLCID causes incorrect translations for all the
	// executions on that statement. The fix is to set the correct value after the
	// creation of the statement.
	pSrvrStmt->setclientLCID(srvrGlobal->clientLCID);

	switch (connectionOption) {
//Special Case//
   
	case SQL_ACCESSMODE_AND_ISOLATION:
			switch (optionValueNum) {
		case SQL_TXN_READ_UNCOMMITTED:
			//Modified it, since on setting at DS level to uncommitted the subsequent connections were not going through.
			strcpy(sqlString, "SET TRANSACTION READ ONLY, ISOLATION LEVEL READ UNCOMMITTED");
			break;
		case SQL_TXN_READ_COMMITTED:
			//Modified it, since on setting at DS level to uncommitted the subsequent connections were not going through.
			strcpy(sqlString, "SET TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED");
			break;
		default:
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
			return;
		}
		break;
//Special Case//
	case SQL_ACCESS_MODE:
		strcpy(sqlString, "SET TRANSACTION ");
		switch (optionValueNum) {
		case SQL_MODE_READ_WRITE:
			strcat(sqlString, "READ WRITE");
			break;
		case SQL_MODE_READ_ONLY:
			if ((srvrGlobal->EnvironmentType & MXO_MSACCESS_1997) || (srvrGlobal->EnvironmentType & MXO_MSACCESS_2000)) // change this to fix MS Access problem. Since it insert, update and delete while SQL_ACCESS_MODE is SQL_MODE_READ_ONLY.
				strcat(sqlString, "READ WRITE");
			else
				strcat(sqlString, "READ ONLY");
			break;
		case SQL_MODE_NULL:
		// Need to find out from profile what is the access Mode
		// at present return ParamError. Note there is no break
		default:
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
			return;
		}
		break;
	case SQL_TXN_ISOLATION:
		strcpy(sqlString, "SET TRANSACTION ISOLATION LEVEL ");
			switch (optionValueNum) {
		case SQL_TXN_READ_UNCOMMITTED:
			strcat(sqlString, "READ UNCOMMITTED");
			break;
		case SQL_TXN_READ_COMMITTED:
			strcat(sqlString, "READ COMMITTED");
			break;
		case SQL_TXN_REPEATABLE_READ:
			strcat(sqlString, "REPEATABLE READ");
			break;
		case SQL_TXN_SERIALIZABLE:
			strcat(sqlString, "SERIALIZABLE");
			break;
		default:
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
			return;
		}
		break;
	case SQL_ATTR_ENLIST_IN_DTC:

#ifdef TIP_DEFINED
		if (srvrGlobal->tip_gateway != NULL) {
			tip_close(srvrGlobal->tip_gateway);
			srvrGlobal->tip_gateway = NULL;
		}

		// Check for non-DTC transaction
		if (optionValueNum == NULL){
			SetTipUrl((IDL_char *)NULL);
			SetLocalXid(NULL, 0);
			exception_->exception_nr = 0;
			sqlWarning->_length = 0;
			sqlWarning->_buffer = NULL;
			return;
		}

		// Check for previous DTC transaction
		if(GetTipUrl() != (IDL_char *)NULL){
			SetTipUrl((IDL_char *)NULL);
			SetLocalXid(NULL, 0);
		}

		retcode = tip_open(&(srvrGlobal->tip_gateway));

		if (retcode != TIPOK){
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_OPEN_TIP_GATEWAY_FAILED;

			switch (retcode) {
			case TIPNOTCONNECTED:

					SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONNECTED,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
				break;
			case TIPNOTCONFIGURED:

					SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONFIGURED,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
				break;
			default:

					SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
				break;
			}
			return;
		}

		strncpy(buffer, optionValueStr, sizeof(buffer));
		buffer[sizeof(buffer)-1] = 0;

		retcode = tip_pull(srvrGlobal->tip_gateway,
							(IDL_char *)buffer,
							&local_xid,
							xid_length);

		if (retcode != TIPOK){
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_PULL_TIP_FAILED;

			switch (retcode) {
			case TIPNOTCONNECTED:

					SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONNECTED,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
				break;
			case TIPNOTCONFIGURED:

					SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONFIGURED,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
			break;
			default:

					SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
									EVENTLOG_WARNING_TYPE,
									srvrGlobal->nskProcessInfo.processId,
									ODBCMX_SERVER,
									srvrGlobal->srvrObjRef,
									0);
				break;
			}
		return;
		}

		SetTipUrl((IDL_char *)buffer);
		SetLocalXid(local_xid,
					xid_length);

		exception_->exception_nr = 0;
		sqlWarning->_length = 0;
		sqlWarning->_buffer = NULL;
#else
		// RS we'll return an error just in case a user tries to use TIP until we get the libraries
		sqlWarning->_length = 0;
		sqlWarning->_buffer = NULL;

		exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_OPEN_TIP_GATEWAY_FAILED;
		SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
						EVENTLOG_WARNING_TYPE,
						srvrGlobal->nskProcessInfo.processId,
						ODBCMX_SERVER,
						srvrGlobal->srvrObjRef,
						0);

#endif
		return;

	case SET_AUTOBEGIN:
		strcpy(sqlString, "SET TRANSACTION AUTOBEGIN ON");
		break;
	case SQL_AUTOCOMMIT:
		// if a change is required
		sqlStringNeedsExecution = false;
		if ( ((srvrGlobal->bAutoCommitOn == TRUE) && (optionValueNum == 0 ))
			|| ((srvrGlobal->bAutoCommitOn == FALSE) && (optionValueNum == 1 )) )
		{
			//check for active txn, if yes commit them
			if ((srvrGlobal->bAutoCommitOn == FALSE) && (WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0))
				retcode = pSrvrStmt->ExecDirect(NULL, "COMMIT WORK", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
			if (retcode != SQL_ERROR)
			{
				if (optionValueNum)
				{
					if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, "SET TRANSACTION AUTOCOMMIT ON", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
						srvrGlobal->bAutoCommitOn = TRUE;
				}
				else
				{
					if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, "SET TRANSACTION AUTOCOMMIT OFF", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
						srvrGlobal->bAutoCommitOn = FALSE;
				}
		    }
		}
		else
			return;
		break;
	case SET_CATALOG:
	case SQL_ATTR_CURRENT_CATALOG:
	{
		sqlStringNeedsExecution = false;
		int len = 0;
		bool defaultCatalog = false;
		bool isDoubleQuoted = false;
		char* tempSqlString = NULL;

		if (optionValueStr == NULL || (optionValueStr != NULL && optionValueStr[0] == '\0'))
		{
			len = strlen(ODBCMX_DEFAULT_CATALOG);
			defaultCatalog = true;
		}
		else
			len = strlen(optionValueStr);

		tempSqlString = new char[len+20];
		if (tempSqlString == NULL)
		{
			SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
						srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
						srvrGlobal->srvrObjRef, 1, "SET CATALOG");
			exit(0);
		}
		if (!defaultCatalog && optionValueStr[0] == '"' && optionValueStr[len-1] == '"')
			isDoubleQuoted = true;

		strcpy(tempSqlString, "SET CATALOG ");
		if (!isDoubleQuoted)
			strcat(tempSqlString, "'");
		if (defaultCatalog)
			strcat(tempSqlString, ODBCMX_DEFAULT_CATALOG);
		else
			strcat(tempSqlString, optionValueStr);
		if (!isDoubleQuoted)
			strcat(tempSqlString, "'");

		if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, tempSqlString, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
		{
			if (defaultCatalog)
				strcpy(srvrGlobal->DefaultCatalog, ODBCMX_DEFAULT_CATALOG);
			else if (isDoubleQuoted)
			{
				strncpy(srvrGlobal->DefaultCatalog, optionValueStr+1, len-2);
				srvrGlobal->DefaultCatalog[len-2] = '\0';
			}
			else
				strcpy(srvrGlobal->DefaultCatalog, optionValueStr);
		}
		delete [] tempSqlString;
	}
		break;
	case SET_SCHEMA:
	{
		if (optionValueStr == NULL || (optionValueStr != NULL && optionValueStr[0] == '\0'))
			sprintf(schemaValueStr, "%s.%s", ODBCMX_DEFAULT_CATALOG, ODBCMX_DEFAULT_SCHEMA);
		else
		{
			if (strlen(optionValueStr) < sizeof(schemaValueStr))
				strcpy(schemaValueStr, optionValueStr);
			else
			{
				exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_STR;
				return;
			}
		}
		strcpy(sqlString, "SET SCHEMA ");
		strncat(sqlString, schemaValueStr, sizeof(sqlString));
		sqlString[sizeof(sqlString)-1] = 0;
	}
		break;
	case RESET_DEFAULTS:
		strcpy(sqlString, "CONTROL QUERY DEFAULT * RESET");
		break;
	case RESET_RESET_DEFAULTS:
		strcpy(sqlString, "CONTROL QUERY DEFAULT * RESET RESET");
		break;
	case CUT_CONTROLQUERYSHAPE:
		strcpy(sqlString, "CONTROL QUERY SHAPE CUT");
		break;
	case BEGIN_SESSION:
		if(optionValueStr != NULL && strlen(optionValueStr) > 0)
			sprintf(sqlString,"SET SESSION DEFAULT SQL_SESSION 'BEGIN:%0.200s';",optionValueStr);
		else
			strcpy(sqlString, "SET SESSION DEFAULT SQL_SESSION 'BEGIN';");
		break;
	// Added the below workaround for volatile table SQL problem
	// Not called any more from initailizeDialog since executor fixed it.
	case SET_SESSION_USERNAME:
		sprintf( sqlString, "CONTROL QUERY DEFAULT session_id '%s'", srvrGlobal->sessionId );
		break;
	case END_SESSION:
		strcpy(sqlString, "SET SESSION DEFAULT SQL_SESSION 'END'");
		break;
	case SET_CATALOGNAMETYPE:
		strcpy(sqlString, "SET NAMETYPE ANSI");
		break;
	case SET_SETANDCONTROLSTMTS:
		break;
	case SET_ODBC_PROCESS:
		strcpy(sqlString, "CONTROL QUERY DEFAULT ODBC_PROCESS 'TRUE'");
		break;
	case SET_JDBC_PROCESS:
		strcpy(sqlString, "CONTROL QUERY DEFAULT JDBC_PROCESS 'TRUE'");
		break;
	case SET_INFER_NCHAR:
		strcpy(sqlString, "CONTROL QUERY DEFAULT INFER_CHARSET 'ON'");
		break;
	case SET_EXPLAIN_PLAN:
		strcpy(sqlString,"CONTROL QUERY DEFAULT GENERATE_EXPLAIN 'ON'");
		break;
	case SQL_ATTR_ROWSET_RECOVERY:
		if (optionValueNum)
			srvrGlobal->EnvironmentType |= MXO_ROWSET_ERROR_RECOVERY;
		else
			srvrGlobal->EnvironmentType &= (0xFFFF-MXO_ROWSET_ERROR_RECOVERY);
		return;
	case SQL_ATTR_CONCURRENCY:
		strcpy(sqlString, "CONTROL QUERY DEFAULT READONLY_CURSOR ");
		switch (optionValueNum)
		{
			case SQL_CONCUR_READ_ONLY:
				strcat(sqlString, "'TRUE'");
				break;
			case SQL_CONCUR_LOCK:
			case SQL_CONCUR_ROWVER:
			case SQL_CONCUR_VALUES:
				strcat(sqlString, "'FALSE'");
				break;
			default:
				exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
				return;
		}
		break;
	case JDBC_ATTR_CONN_IDLE_TIMEOUT:
		if (srvrGlobal->drvrVersion.componentId == JDBC_DRVR_COMPONENT)
		{
			if (optionValueNum > JDBC_DATASOURCE_CONN_IDLE_TIMEOUT)
				srvrGlobal->javaConnIdleTimeout = optionValueNum;
			else
				srvrGlobal->javaConnIdleTimeout = JDBC_DATASOURCE_CONN_IDLE_TIMEOUT;
		}
		else
		{
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_CONNECTION_OPTION;
		}
		return;
	case CONN_IDLE_TIMER_RESET:
		// this connection attribute is JDBC exclusive, NDCS just need to recognize it and does nothing
		return;
		break;
	// Set priority of DP2 relative to master executor/ESPs
	case CONTROL_TABLE_PRIORITY:
		sprintf(sqlString,"CONTROL TABLE * PRIORITY_DELTA '%d'", optionValueNum);
		break;
	case SET_STATISTICS:
		strcpy(sqlString,"CONTROL QUERY DEFAULT detailed_statistics 'PERTABLE'");
		break;
	// JDBC sets this connection attribute to set the Proxy syntax for SPJ result sets
	case SET_SPJ_ENABLE_PROXY:
		if(optionValueNum)
			srvrGlobal->bSpjEnableProxy = true;
		else
			srvrGlobal->bSpjEnableProxy = false;
		return;
		break;
	case SQL_ATTR_JOIN_UDR_TRANSACTION:
		errno = 0;
		endPtr = NULL;
		srvrGlobal->spjTxnId = strtoll(optionValueStr, &endPtr, 10);
		//srvrGlobal->spjTxnId = atoll(optionValueStr);
		if( errno == 0 )
		{
#ifdef SPJ_TXN_TEST
			sprintf(msg, "SQL_ATTR_JOIN_UDR_TRANSACTION %lld", srvrGlobal->spjTxnId);
			SendEventMsg(MSG_SERVER_TRACE_INFO, EVENTLOG_INFORMATION_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, msg);
#endif

			retcode = JOINTRANSACTION( srvrGlobal->spjTxnId );
			if(retcode != 0)
			{
				sprintf(buffer,"Transaction join failed with error %d",retcode);
				exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = buffer;
			}
			else
				srvrGlobal->bspjTxnJoined = TRUE;
		}
		else
		{
			sprintf(buffer,"Unable to retrieve transaction ID. Error %d",errno);
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = buffer;
		}
		return;
		break;
	case SQL_ATTR_SUSPEND_UDR_TRANSACTION:
		endPtr = NULL;
		errno = 0;
		srvrGlobal->spjTxnId = strtoll(optionValueStr, &endPtr, 10);
		//srvrGlobal->spjTxnId = atoll(optionValueStr);
		if( errno == 0 )
		{
#ifdef SPJ_TXN_TEST
			sprintf(msg, "SQL_ATTR_SUSPEND_UDR_TRANSACTION %lld", srvrGlobal->spjTxnId);
			SendEventMsg(MSG_SERVER_TRACE_INFO, EVENTLOG_INFORMATION_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 1, msg);
#endif

			retcode = SUSPENDTRANSACTION( (short*)&(srvrGlobal->spjTxnId) );
			if(retcode != 0)
			{
				sprintf(buffer,"Transaction suspend failed with error %d",retcode);
				exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = buffer;
			}
			else
				srvrGlobal->bspjTxnJoined = FALSE;
		}
		else
		{
			sprintf(buffer,"Unable to retrieve transaction ID. Error %d",errno);
			exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
			exception_->u.ParamError.ParamDesc = buffer;
		}
		return;
		break;
	case SET_INPUT_CHARSET:
		snprintf(sqlString,200,"CONTROL QUERY DEFAULT input_charset '%s'", getCharsetStr(srvrGlobal->clientLCID));
		break;
	case SET_TERMINAL_CHARSET:
		snprintf(sqlString,200,"CONTROL QUERY DEFAULT terminal_charset '%s'", getCharsetStr(srvrGlobal->clientErrorLCID));
		break;
	case SET_NVCI_PROCESS:
		sprintf(sqlString, "CONTROL QUERY DEFAULT NVCI_PROCESS 'ON'");
		break;
	case WMS_QUERY_MONITORING:
		strcpy(sqlString, "CONTROL QUERY DEFAULT WMS_QUERY_MONITORING 'OFF'");
		break;
    case SQL_ATTR_CLIPVARCHAR:
        srvrGlobal->clipVarchar = optionValueNum;
		sqlStringNeedsExecution = false;
        break;
	default:
		exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_CONNECTION_OPTION;
		return;
	}

	if(sqlStringNeedsExecution)
	{
		if (connectionOption == SET_SETANDCONTROLSTMTS)
			retcode = pSrvrStmt->ExecDirect(NULL, optionValueStr, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
		else
			retcode = pSrvrStmt->ExecDirect(NULL, sqlString, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
	}
	switch (retcode)
		{
			case SQL_SUCCESS:
				exception_->exception_nr = 0;
				// Ignore estimatedCost and rowsAffected
				sqlWarning->_length = pSrvrStmt->sqlWarning._length;
				sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
			break;
			case SQL_ERROR:
				if(pSrvrStmt->sqlError.errorList._buffer->sqlcode == -15371) // Executor dev should be treated as warning.
				{
					exception_->exception_nr = 0;
					SendEventMsg(MSG_SQL_WARNING, EVENTLOG_WARNING_TYPE,
					srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
					srvrGlobal->srvrObjRef, 3, "SQL/MX", "15371", sqlString);
				}
				else
				{
					exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_SQLError_exn_;
					exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
					exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
				}
			break;
			case PROGRAM_ERROR:
				exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
				exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_SETCONNECTOPTION_FAILED;
			default:
			break;
	}

	SRVRTRACE_EXIT(FILE_SME+17);
	return;
}

extern "C" void
odbc_SQLSrvr_FetchPerf_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ Int32 *returnCode
  , /* In    */ DIALOGUE_ID_def dialogueId
  , /* In    */ const IDL_char *stmtLabel
  , /* In    */ Int32 maxRowCnt
  , /* In    */ Int32 maxRowLen
  , /* In    */ IDL_short sqlAsyncEnable
  , /* In    */ Int32 queryTimeout
  , /* Out   */ Int32 *rowsAffected
  , /* Out   */ Int32 *outValuesFormat
  , /* Out   */ SQL_DataValue_def *outputDataValue
  , /* Out   */ Int32 *sqlWarningOrErrorLength
  , /* Out   */ BYTE     *&sqlWarningOrError
)
{
	SRVRTRACE_ENTER(FILE_SME+8);

	SRVR_STMT_HDL *pSrvrStmt = NULL;
	SQLRETURN rc = SQL_SUCCESS;
	int outputDataOffset = 0;

	*returnCode = SQL_SUCCESS;
    long long tmpLength;
	if (maxRowCnt < 0)
	{
		*returnCode = SQL_ERROR;
		GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count", sqlWarningOrErrorLength, sqlWarningOrError);

	}
	else
	{
		pSrvrStmt = getSrvrStmt(stmtLabel, FALSE);

		if (pSrvrStmt == NULL)
		{
			*returnCode = SQL_ERROR;
			GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found", sqlWarningOrErrorLength, sqlWarningOrError);
		}
		else
		{
			if (pSrvrStmt->sqlWarningOrErrorLength > 0 &&
				pSrvrStmt->sqlWarningOrError != NULL)
			{
	           delete pSrvrStmt->sqlWarningOrError;
			}
            pSrvrStmt->sqlWarningOrErrorLength = 0;
            pSrvrStmt->sqlWarningOrError = NULL;
		}

	}

	if (*returnCode == SQL_SUCCESS)
	{
// limit on maxRowsFetched from WMS
		if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
		{
			if (srvrGlobal->maxRowsFetched != 0 && pSrvrStmt->m_bDoneWouldLikeToExecute)
			{
				if (srvrGlobal->maxRowsFetched <= pSrvrStmt->m_curRowsFetched)
				{
					WSQL_EXEC_CloseStmt(&pSrvrStmt->stmt);
					WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
					pSrvrStmt->isClosed = true;
					pSrvrStmt->bFirstSqlBulkFetch = false;
					pSrvrStmt->m_curRowsFetched = 0;
//					*returnCode = SQL_NO_DATA_FOUND;
					*returnCode = SQL_ERROR;
					GETMXCSWARNINGORERROR(-1, "HY000", "The limit for maximum rows to be returned for a query, as set by the administrator, was exceeded", sqlWarningOrErrorLength, sqlWarningOrError);
					goto ret;
				}
				else
				{
					if (pSrvrStmt->bFirstSqlBulkFetch == true)
						pSrvrStmt->m_curRowsFetched = 0;

					if (pSrvrStmt->m_curRowsFetched + maxRowCnt <= srvrGlobal->maxRowsFetched )
						pSrvrStmt->maxRowCnt = maxRowCnt;
					else
					{
						pSrvrStmt->maxRowCnt = srvrGlobal->maxRowsFetched - pSrvrStmt->m_curRowsFetched;
						if (pSrvrStmt->maxRowCnt <= 0)
							pSrvrStmt->maxRowCnt = 1;
					}
				}
			}
			else
				pSrvrStmt->maxRowCnt = maxRowCnt;
		}
		else
			pSrvrStmt->maxRowCnt = maxRowCnt;
		pSrvrStmt->maxRowLen = maxRowLen;

		// resource statistics
		if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
		{
			pSrvrStmt->bFetchStarted = TRUE;
			pSrvrStmt->inState = inState = STMTSTAT_FETCH;
			inSqlStmtType = TYPE_UNKNOWN;
			inEstimatedCost = 0;
			inQueryId = NULL;
			inSqlString = NULL;
			inErrorStatement = 0;
			inWarningStatement = 0;
			inRowCount = 0;
			inErrorCode = 0;
			inSqlError = NULL;
			inSqlErrorLength = 0;
			/*resStatStatement->start(inState,
									pSrvrStmt->sqlQueryType,
									stmtLabel,
									pSrvrStmt->sqlUniqueQueryID,
						pSrvrStmt->cost_info,
						pSrvrStmt->comp_stats_info,
						inEstimatedCost,
						&pSrvrStmt->m_need_21036_end_msg);*/
			resStatStatement->start(inState,
						pSrvrStmt->sqlQueryType,
						stmtLabel,
						pSrvrStmt,
									inEstimatedCost,
									&pSrvrStmt->m_need_21036_end_msg);
		}
		// end rs
		if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
		{
			if (pSrvrStmt->bSQLMessageSet)
				pSrvrStmt->cleanupSQLMessage();

			if(pSrvrStmt->outputDataValue._length > 0 &&
			   pSrvrStmt->outputDataValue._buffer != NULL)
			   delete pSrvrStmt->outputDataValue._buffer;

			pSrvrStmt->outputDataValue._length = 0;
			pSrvrStmt->outputDataValue._buffer = NULL;

			if (pSrvrStmt->isClosed)
			{
				pSrvrStmt->m_curRowsFetched = 0;
				pSrvrStmt->bFirstSqlBulkFetch = false;
				*returnCode = SQL_NO_DATA_FOUND;
				goto ret;
			}


			pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_;
//			if (pSrvrStmt->sqlBulkFetchPossible && (pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE || pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET))
			if (srvrGlobal->drvrVersion.buildId & ROWWISE_ROWSET)
			{
				*outValuesFormat = ROWWISE_ROWSETS;

				rc = FETCH2bulk(pSrvrStmt);
				tmpLength = clipVarchar(pSrvrStmt);
				if (pSrvrStmt->rowsAffected > 0){
					if(pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
					{
						outputDataValue->_buffer = pSrvrStmt->outputDescVarBuffer;
						outputDataValue->_length = tmpLength;
					}
					else
					{
						outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
						outputDataValue->_length = pSrvrStmt->outputDataValue._length;
					}
				}
				else
				{
					outputDataValue->_buffer = NULL;
					outputDataValue->_length = 0;
				}
			}
			else
			{
				*outValuesFormat = COLUMNWISE_ROWSETS;

				//pSrvrStmt->maxRowCnt = maxRowCnt;
				//pSrvrStmt->maxRowLen = maxRowLen;
                rc = FETCHPERF(pSrvrStmt, outputDataValue);
			}

			switch (rc)
			{
			   case ODBC_RG_WARNING:
			   case SQL_SUCCESS_WITH_INFO:
				   *returnCode = SQL_SUCCESS_WITH_INFO;
				   GETSQLWARNINGORERROR2(pSrvrStmt);
	               *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	               sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				   *rowsAffected = pSrvrStmt->rowsAffected;
				   if (*rowsAffected > 0)
						pSrvrStmt->m_curRowsFetched += *rowsAffected;
				   break;

			   case SQL_SUCCESS:
				   *returnCode = SQL_SUCCESS;
				   *rowsAffected = pSrvrStmt->rowsAffected;
				   if (*rowsAffected > 0)
						pSrvrStmt->m_curRowsFetched += *rowsAffected;
				   break;

			   case SQL_STILL_EXECUTING:
				   *returnCode = SQL_STILL_EXECUTING;
				   break;

			   case SQL_INVALID_HANDLE:
				   *returnCode = SQL_INVALID_HANDLE;
				   break;

			   case SQL_NO_DATA_FOUND:
				   pSrvrStmt->bFirstSqlBulkFetch = false;
				   *returnCode = SQL_NO_DATA_FOUND;
				   break;

			   case SQL_ERROR:
				   pSrvrStmt->bFirstSqlBulkFetch = false;
	               *returnCode = SQL_ERROR;
	               GETSQLWARNINGORERROR2(pSrvrStmt);
	               *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	               sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
	               break;

			   case PROGRAM_ERROR:
				   pSrvrStmt->bFirstSqlBulkFetch = false;
				   *returnCode = SQL_ERROR;
				   GETMXCSWARNINGORERROR(-1, "HY000", "Fetch Failed", sqlWarningOrErrorLength, sqlWarningOrError);
				   break;

			   default:
				   break;
			}
		}
		else
		{ // Catalog APIs
			outputDataOffset  = *(int*)pSrvrStmt->outputDataValue.pad_to_offset_8_;

			*outValuesFormat = COLUMNWISE_ROWSETS;
			rc = FETCHPERF(pSrvrStmt, &pSrvrStmt->outputDataValue);
			if (pSrvrStmt->sqlError.errorList._buffer != NULL)
			{
				*returnCode = SQL_ERROR;
				GETSQLWARNINGORERROR2(pSrvrStmt);
				*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
				sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				if (pSrvrStmt->outputDataValue._buffer != NULL)
					delete pSrvrStmt->outputDataValue._buffer;
				pSrvrStmt->outputDataValue._buffer = NULL;
				pSrvrStmt->outputDataValue._length = 0;

			}
			else if (pSrvrStmt->rowsAffected == 0 || pSrvrStmt->rowsAffected == -1)
			{
				if (pSrvrStmt->bSQLMessageSet)
						pSrvrStmt->cleanupSQLMessage();
				pSrvrStmt->outputDataValue._buffer = NULL;
				pSrvrStmt->outputDataValue._length = 0;
				*(int*)pSrvrStmt->outputDataValue.pad_to_offset_8_=0;
				outputDataOffset = 0;
				pSrvrStmt->InternalStmtClose(SQL_CLOSE);
				*returnCode = SQL_NO_DATA_FOUND;
			}
			else
			{
				*rowsAffected = pSrvrStmt->rowsAffected;

				if (pSrvrStmt->sqlWarning._length != 0)
				{
					*returnCode = SQL_SUCCESS_WITH_INFO;
                    GETSQLWARNINGORERROR2(pSrvrStmt);
	                *sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
	                sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
				}
				else
				{
					char *tmpByte = (char*)&pSrvrStmt->outputDataValue._length;
					for(int i=0; i<sizeof(pSrvrStmt->outputDataValue.pad_to_offset_8_); i++) {
						pSrvrStmt->outputDataValue.pad_to_offset_8_[i] = *tmpByte;
						tmpByte++;
					}
					
					*returnCode = SQL_SUCCESS;
				}

				pSrvrStmt->rowsAffected = 0;
			}

			outputDataValue->_length = pSrvrStmt->outputDataValue._length - outputDataOffset;
			outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer + outputDataOffset;
		}

ret:

		if (*returnCode != SQL_SUCCESS &&
				*returnCode != SQL_SUCCESS_WITH_INFO)
		{
			if (pSrvrStmt->outputDataValue._buffer != NULL)
				delete pSrvrStmt->outputDataValue._buffer;
			pSrvrStmt->outputDataValue._length = 0;
			pSrvrStmt->outputDataValue._buffer = NULL;
		}

		if (pSrvrStmt->sqlNewQueryType == SQL_SP_RESULT_SET)
		{
			if (pSrvrStmt->callStmtHandle->isClosed == true && *returnCode == SQL_NO_DATA_FOUND || *returnCode == SQL_ERROR)
			{
				pSrvrStmt->callStmtHandle->inState = STMTSTAT_CLOSE;
				// Fix for CR 6059
				if( resStatStatement != NULL )
					resStatStatement->setStatistics(pSrvrStmt->callStmtHandle);
			}
		}
		else if (resStatStatement != NULL && pSrvrStmt->bFetchStarted == TRUE &&
						(*returnCode == SQL_NO_DATA_FOUND || *returnCode == SQL_ERROR ||
						((*returnCode == SQL_SUCCESS || *returnCode == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))

		{
			resStatStatement->setStatistics(pSrvrStmt);
		}
	}

	// resource statistics
	if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
	{
		if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
		{
			inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
			inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
			inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
		}
		pSrvrStmt->bFetchStarted = FALSE;
		Int32 inMaxRowCnt = 0;
		Int32 inMaxRowLen = 0;

		inMaxRowCnt = maxRowCnt;
		inMaxRowLen = maxRowLen;

		if (*returnCode != SQL_SUCCESS &&
			*returnCode != SQL_SUCCESS_WITH_INFO)
			inErrorStatement ++;
		else
			setStatisticsFlag  = FALSE;

		if (*returnCode == SQL_SUCCESS_WITH_INFO)
			inWarningStatement ++;

		if (*returnCode == SQL_NO_DATA_FOUND)
		{
			inErrorStatement = 0;
			inWarningStatement = 0;
			setStatisticsFlag = TRUE;

		}
		inQueryId = pSrvrStmt->sqlUniqueQueryID;
		inSqlQueryType = pSrvrStmt->sqlQueryType;
		resStatStatement->setStatisticsFlag(setStatisticsFlag);
		resStatStatement->end(inState,
							  inSqlQueryType,
							  inSqlStmtType,
							  inQueryId,
							  inEstimatedCost,
							  inSqlString,
							  inErrorStatement,
							  inWarningStatement,
							  inRowCount,
							  inErrorCode,
							  resStatSession,
							  inSqlErrorLength,
							  inSqlError,
							  pSrvrStmt,
							  &pSrvrStmt->m_need_21036_end_msg,
							  pSrvrStmt->sqlNewQueryType,
							  pSrvrStmt->isClosed);
	}
	//end rs

	SRVRTRACE_EXIT(FILE_SME+8);

	return;

} // odbc_SQLSrvr_FetchPerf_sme_()


extern "C" void
odbc_SQLSrvr_ExtractLob_sme_(
    /* In    */ CEE_tag_def objtag_
  , /* In    */ const CEE_handle_def *call_id_
  , /* Out   */ odbc_SQLsrvr_ExtractLob_exc_ *exception_
  , /* In    */ IDL_short extractLobAPI
  , /* In    */ IDL_string lobHandle
  , /* In    */ IDL_long_long &lobLength
  , /* Out   */ IDL_long_long &extractLen
  , /* Out   */ BYTE *& extractData
  )
{
    char LobExtractQuery[1000] = {0};
    char RequestError[200] = {0};
    SRVR_STMT_HDL  *QryLobExtractSrvrStmt = NULL;

    if ((QryLobExtractSrvrStmt = getSrvrStmt("MXOSRVR_EXTRACRTLOB", TRUE)) == NULL)
    {
        SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
                     EVENTLOG_ERROR_TYPE,
                     srvrGlobal->nskProcessInfo.processId,
                     ODBCMX_SERVER,
                     srvrGlobal->srvrObjRef,
                     2,
                     "EXTRACT LOB APIs",
                     "Allocate Statement");
        exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
        exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
    }
    switch (extractLobAPI) {
    case 0:
        extractData = NULL;
        snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBLENGTH(LOB'%s') LOCATION %Ld", lobHandle, (Int64)&lobLength);
        break;
    case 1:
        extractData = new BYTE[extractLen + 1];
        if (extractData == NULL)
        {
            exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
            exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_BUFFER_ALLOC_FAILED;
        }

        snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBTOBUFFER(LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)extractData, &extractLen);
        break;
    case 102:
        extractLen = 0;
        extractData = NULL;
        snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBTOBUFFER(LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)extractData, &extractLen);
        break;
    default:
        return ;
    }

    try
    {
        short retcode = QryLobExtractSrvrStmt->ExecDirect(NULL, LobExtractQuery, EXTERNAL_STMT, TYPE_CALL, SQL_ASYNC_ENABLE_OFF, 0);

        if (retcode == SQL_ERROR)
        {
            ERROR_DESC_def *p_buffer = QryLobExtractSrvrStmt->sqlError.errorList._buffer;
            char            errNumStr[128] = {0};
            sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);
            strncpy(RequestError, p_buffer->errorText, sizeof(RequestError) - 1);

            SendEventMsg(MSG_SQL_ERROR,
                         EVENTLOG_ERROR_TYPE,
                         srvrGlobal->nskProcessInfo.processId,
                         ODBCMX_SERVER,
                         srvrGlobal->srvrObjRef,
                         2,
                         errNumStr,
                         RequestError);

            exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
            exception_->u.SQLError.errorList._length = QryLobExtractSrvrStmt->sqlError.errorList._length;
            exception_->u.SQLError.errorList._buffer = QryLobExtractSrvrStmt->sqlError.errorList._buffer;
            exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
        }
    }
    catch (...)
    {
        SendEventMsg(MSG_PROGRAMMING_ERROR,
                EVENTLOG_ERROR_TYPE,
                srvrGlobal->nskProcessInfo.processId,
                ODBCMX_SERVER,
                srvrGlobal->srvrObjRef,
                1,
                    //"Exception in executing EXTRACT LOBTOBUFFER");
                "Exception in executing EXTRACT LOBLENGTH");

        exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
        exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
    }

}

extern "C" void
odbc_SQLSrvr_UpdateLob_sme_(
    /* In   */ CEE_tag_def objtag_
  , /* In   */ const CEE_handle_def * call_id_
  , /* In   */ odbc_SQLSvc_UpdateLob_exc_ * exception_
  , /* In   */ IDL_short lobUpdateType
  , /* In   */ IDL_string lobHandle
  , /* In   */ IDL_long_long totalLength
  , /* In   */ IDL_long_long offset
  , /* In   */ IDL_long_long length
  , /* In   */ BYTE * data)
{
	char lobUpdateQuery[1000] = {0};
	char RequestError[200] = {0};

	SRVR_STMT_HDL * QryLobUpdateSrvrStmt = NULL;

	if ((QryLobUpdateSrvrStmt = getSrvrStmt("MXOSRVR_UPDATELOB", TRUE)) == NULL)
	{
		SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
			         EVENTLOG_ERROR_TYPE,
			         srvrGlobal->nskProcessInfo.processId,
			         ODBCMX_SERVER,
			         srvrGlobal->srvrObjRef,
			         2,
			         "LOB UPDATE APIs",
			         "Allocate Statement");

		exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
		exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
	}

    if (offset == 0)
    {
        snprintf(lobUpdateQuery, sizeof(lobUpdateQuery),  "UPDATE LOB (LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)data, length);
    }
    else
    {
        snprintf(lobUpdateQuery, sizeof(lobUpdateQuery),  "UPDATE LOB (LOB'%s', LOCATION %Ld, SIZE %Ld, APPEND)", lobHandle, (Int64)data, length);
    }

    short retcode = 0;
	try
	{
        retcode = QryLobUpdateSrvrStmt->ExecDirect(NULL, lobUpdateQuery, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);

        if (retcode == SQL_ERROR)
        {
            ERROR_DESC_def * p_buffer = QryLobUpdateSrvrStmt->sqlError.errorList._buffer;
            char             errNumStr[128] = {0};
            sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);

            strncpy(RequestError, p_buffer->errorText, sizeof(RequestError) - 1);

            SendEventMsg(MSG_SQL_ERROR,
                         EVENTLOG_ERROR_TYPE,
                         srvrGlobal->nskProcessInfo.processId,
                         ODBCMX_SERVER,
                         srvrGlobal->srvrObjRef,
                         2,
                         errNumStr,
                         RequestError);
            exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
            exception_->u.SQLError.errorList._length = QryLobUpdateSrvrStmt->sqlError.errorList._length;
            exception_->u.SQLError.errorList._buffer = QryLobUpdateSrvrStmt->sqlError.errorList._buffer;
            exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
        }
    }
    catch (...)
    {
        SendEventMsg(MSG_PROGRAMMING_ERROR,
                     EVENTLOG_ERROR_TYPE,
                     srvrGlobal->nskProcessInfo.processId,
                     ODBCMX_SERVER,
                     srvrGlobal->srvrObjRef,
                     1,
                     "Exception in executing UPDATE_LOB");

        exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
        exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
    }

    if (QryLobUpdateSrvrStmt != NULL) {
        QryLobUpdateSrvrStmt->Close(SQL_DROP);
    }
}

//========================================================================
//LCOV_EXCL_START
short qrysrvc_GetAdaptiveSegment()
{
	static ADAPTIVE_SEGMENT_DATA asd = {CATCHER, ASOPER_ALLOCATE, -1};

	_cc_status cc;
	short error;
	//short pHandle[10];
   TPT_DECL(pHandle);
	unsigned short wcount;
	SB_Tag_Type tag;
	Int32 timeout = AS_TIMEOUT;
	int size;

	if (srvrGlobal->bWMS_AdaptiveSegment == false)
		return -1;


	if ((error = getProcessHandle(srvrGlobal->QSProcessName,
                                  TPT_REF(pHandle))) != 0)
	{
		if (srvrGlobal->fnumAS != -1)
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
		return -1;
	}


	if (srvrGlobal->fnumAS == -1 || 2 != PROCESSHANDLE_COMPARE_(TPT_REF(pHandle), TPT_REF(srvrGlobal->pASHandle)))
	{
		if (srvrGlobal->fnumAS != -1)
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
		// bits <1> ON - nowait
		short option = 0x4000;

		error = FILE_OPEN_(srvrGlobal->QSProcessName
						, strlen(srvrGlobal->QSProcessName)
						, &srvrGlobal->fnumAS
						, 0			//access
						, 0			//exclusion
						, 1			//nowait_depth
						, 0			//sync-or-receive-depth
						, option	//options
						);
		if (error == 0)
		{
			cc = AWAITIOX(&srvrGlobal->fnumAS,OMITREF,OMITREF,OMITREF,timeout);
			if (_status_lt(cc))
				FILE_GETINFO_ (srvrGlobal->fnumAS, &error);
			else
				error = 0;
		}
		if (error == 0)
		{

			if ((error = getProcessHandle(srvrGlobal->QSProcessName,
                                  TPT_REF(srvrGlobal->pASHandle))) != 0)
					error = 1;
		}
		if (error)
		{
			if (srvrGlobal->fnumAS != -1)	//timeout
				FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
			return -1;
		}
	}

	size = sizeof(asd);
	short fnum = srvrGlobal->fnumAS;

	cc = WRITEREADX( fnum,
		(char*)&asd,
		size,
		size,
		&wcount,
		tag);
	if (_status_lt(cc))
	{
		FILE_CLOSE_(srvrGlobal->fnumAS);
		srvrGlobal->fnumAS = -1;
		return -1;
	}

	cc = AWAITIOX(&fnum,OMITREF,&wcount,&tag,timeout);
	if (_status_lt(cc))
	{
		FILE_CLOSE_(srvrGlobal->fnumAS);
		srvrGlobal->fnumAS = -1;
		return -1;
	}

	return asd.segment;
}

void AllocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt)
{
	if (srvrGlobal->bWMS_AdaptiveSegment == false)
		return;

	if (pSrvrStmt->m_isAdaptiveSegmentAllocated)
	{
		if (pSrvrStmt->m_adaptive_segment != -1)
			ClearAdaptiveSegment(pSrvrStmt->m_adaptive_segment);
	}
	pSrvrStmt->m_isAdaptiveSegmentAllocated = false;

	pSrvrStmt->m_adaptive_segment = qrysrvc_GetAdaptiveSegment();
	if (pSrvrStmt->m_adaptive_segment != -1)
		pSrvrStmt->m_isAdaptiveSegmentAllocated = true;

	if (pSrvrStmt->m_adaptive_segment != srvrGlobal->lastCQDAdaptiveSegment)
	{
		char AffinityCQD[64];
		sprintf(AffinityCQD, "CONTROL QUERY DEFAULT AFFINITY_VALUE '%d'", pSrvrStmt->m_adaptive_segment);
		EXECDIRECT(AffinityCQD);
		srvrGlobal->lastCQDAdaptiveSegment = pSrvrStmt->m_adaptive_segment;
	}
}

void DeallocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt)
{
	if (srvrGlobal->bWMS_AdaptiveSegment == false)
		return;

	if (pSrvrStmt->m_isAdaptiveSegmentAllocated)
	{
		if (pSrvrStmt->m_adaptive_segment != -1)
			ClearAdaptiveSegment(pSrvrStmt->m_adaptive_segment);
		pSrvrStmt->m_isAdaptiveSegmentAllocated = false;
	}
}

void ClearAdaptiveSegment(short adapiveSeg)
{
	static ADAPTIVE_SEGMENT_DATA asd = {CATCHER, ASOPER_INIT, -1};

	_cc_status cc;
	short error;
	//short pHandle[10];
   TPT_DECL(pHandle);
	unsigned short wcount;
	SB_Tag_Type tag;
	Int32 timeout = AS_TIMEOUT;

	if (srvrGlobal->bWMS_AdaptiveSegment == false)
		return;

	if ((error = getProcessHandle(srvrGlobal->QSProcessName,
                                  TPT_REF(pHandle))) != 0)
	{
		if (srvrGlobal->fnumAS != -1)
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
		return;
	}

	if (adapiveSeg == -1)
	{
		asd.operation = ASOPER_DEALLOCATE_ALL;
	}
	else
	{
		asd.operation = ASOPER_DEALLOCATE;
		asd.segment = adapiveSeg;
	}

	if (srvrGlobal->fnumAS == -1 || 2 != PROCESSHANDLE_COMPARE_(TPT_REF(pHandle),TPT_REF(srvrGlobal->pASHandle)))
	{
		if (srvrGlobal->fnumAS != -1)
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
		// bits <1> ON - nowait
		short option = 0x4000;

		error = FILE_OPEN_(srvrGlobal->QSProcessName
						, strlen(srvrGlobal->QSProcessName)
						, &srvrGlobal->fnumAS
						, 0			//access
						, 0			//exclusion
						, 1			//nowait_depth
						, 0			//sync-or-receive-depth
						, option	//options
						);
		if (error == 0)
		{
			cc = AWAITIOX(&srvrGlobal->fnumAS,OMITREF,OMITREF,OMITREF,timeout);
			if (_status_lt(cc))
				FILE_GETINFO_ (srvrGlobal->fnumAS, &error);
			else
				error = 0;
		}
		if (error == 0)
		{

			if ((error = getProcessHandle(srvrGlobal->QSProcessName,
                                  TPT_REF(srvrGlobal->pASHandle))) != 0)
					error = 1;
		}
		if (error)
		{
			if (srvrGlobal->fnumAS != -1)	//timeout
				FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
	}

	if (srvrGlobal->fnumAS != -1)
	{
		cc = WRITEREADX( srvrGlobal->fnumAS,
			(char*)&asd,
			sizeof(asd),
			sizeof(asd),
			&wcount,
			tag);

		if (_status_lt(cc))
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
			return;
		}

		cc = AWAITIOX(&(srvrGlobal->fnumAS),OMITREF,&wcount,&tag,timeout);

		if (_status_lt(cc))
		{
			FILE_CLOSE_(srvrGlobal->fnumAS);
			srvrGlobal->fnumAS = -1;
		}
	}
}
//LCOV_EXCL_STOP
//==========================================================

static void setAuthenticationError(
   bool & bSQLMessageSet, 
   odbc_SQLSvc_SQLError * SQLError,
   const char * externalUsername,
   bool isInternalError)

{

const char authErrorMessageHeader[] = "*** ERROR[8837] Invalid username or password";
const char authInternalErrorMessageHeader[] = "*** ERROR[8837] Internal error occurred";
char  strNow[TIMEBUFSIZE + 1];

   kdsCreateSQLErrorException(bSQLMessageSet,SQLError,1);
   
size_t messageHeaderLength;

   if (isInternalError)
      messageHeaderLength = strlen(authInternalErrorMessageHeader);
   else
      messageHeaderLength = strlen(authErrorMessageHeader);

size_t messageLength = (messageHeaderLength + 1) * 4 + TIMEBUFSIZE;

char *message = new char[messageLength];

   if (isInternalError)
      strcpy(message,authInternalErrorMessageHeader);
   else   
      strcpy(message,authErrorMessageHeader);
      
   strcat(message,".  User: ");
   strcat(message,externalUsername);
   time_t now = time(NULL);
   bzero(strNow,sizeof(strNow));
   strftime(strNow,sizeof(strNow)," [%Y-%m-%d %H:%M:%S]", localtime(&now));
   strcat(message,strNow);

   kdsCopySQLErrorExceptionAndRowCount(SQLError,message,-8837,"    ",-1);
   delete message;

}
