/**********************************************************************
// @@@ 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];
	SRVR_STMT_HDL	*pSrvrStmt = NULL;
	bool isTransPending = (WSQL_EXEC_Xact(SQLTRANS_STATUS, 0) == 0);
	Int32 rc = SQL_SUCCESS;

	exception_->exception_nr = 0;
	sqlWarning->_buffer = NULL;
	sqlWarning->_length = 0;

	switch (transactionOpt) {
	case SQL_COMMIT:
		if (isTransPending)
			pSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
		else
			return;
		break;
	case SQL_ROLLBACK:
		if (isTransPending)
			pSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
		else
			return;
		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, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'INTEGER', 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0),"
                                 "('INTEGER SIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 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', 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;
        case SQL_API_SQLCOLUMNPRIVILEGES:
            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);
            convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
            convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
            inputParam[0] = catalogNmNoEsc;
            inputParam[1] = expCatalogNm;
            inputParam[2] = schemaNmNoEsc;
            inputParam[3] = expSchemaNm;
            inputParam[4] = tableNmNoEsc;
            inputParam[5] = expTableNm;
            inputParam[6] = columnNmNoEsc;
            inputParam[7] = expColumnNm;
            snprintf(CatalogQuery, sizeof(CatalogQuery), "select cast(mob.CATALOG_NAME as varchar(128)) TABLE_CAT,"
                    "cast(mob.SCHEMA_NAME as varchar(128)) TABLE_SCHEM,"
                    "cast(mob.OBJECT_NAME as varchar(128)) TABLE_NAME,"
                    "cast(mco.COLUMN_NAME as varchar(128)) COLUMN_NAME,"
                    "cast(pmcp.GRANTOR_NAME as varchar(128)) GRANTOR,"
                    "cast(pmcp.GRANTEE_NAME as varchar(128)) GRANTEE,"
                    "cast(trim(case pmcp.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 pmcp.GRANTABLE_BITMAP "
                    "when 0 then 'NO' else 'YES' "
                    "end) as varchar(128)) IS_GRANTABLE "
                    "from TRAFODION.\"_MD_\".OBJECTS as mob, TRAFODION.\"_MD_\".COLUMNS as mco, TRAFODION.\"_PRIVMGR_MD_\".COLUMN_PRIVILEGES as pmcp "
                    "where pmcp.OBJECT_UID = mob.OBJECT_UID "
                    "and pmcp.OBJECT_UID = mco.OBJECT_UID "
                    "and pmcp.COLUMN_NUMBER = mco.COLUMN_NUMBER "
                    "and mco.COLUMN_NAME <> 'SYSKEY' "
                    "and (mob.CATALOG_NAME = '%s' or trim(mob.CATALOG_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (mob.SCHEMA_NAME = '%s' or trim(mob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (mob.OBJECT_NAME = '%s' or trim(mob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
                    "and (mco.COLUMN_NAME = '%s' or trim(mco.COLUMN_NAME) LIKE '%s' ESCAPE '\\') "
                    "order by pmcp.COLUMN_NUMBER;",
                inputParam[0], inputParam[1],
                inputParam[2], inputParam[3],
                inputParam[4], inputParam[5],
                inputParam[6], inputParam[7]);

            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;

}
