#include "TestLib.h"
int dpiTest__execStatement(dpiTestCase *testCase, dpiConn *conn,
const char *sql, int cols)
{
uint32_t numQueryColumns;
dpiStmt *stmt;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_release(stmt);
if (cols >= 0) {
if (dpiTestCase_expectUintEqual(testCase, numQueryColumns, cols) < 0)
return DPI_FAILURE;
}
return DPI_SUCCESS;
}
int dpiTest__insertIntoTestLongs(dpiTestCase *testCase, dpiConn *conn)
{
uint32_t longValueLength, numQueryColumns, arraySize =3, numOfRows = 2;
const char *insertSql = "insert into TestLongs values (:1, :2)";
const char *dropSql = "delete from TestLongs";
uint32_t iter, sizeIncrement = 50000;
dpiData *intColValue, *longColValue;
dpiVar *intColVar, *longColVar;
char *longValue;
dpiStmt *stmt;
if (dpiTest__execStatement(testCase, conn, dropSql, -1) < 0)
return DPI_FAILURE;
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_INT64,
arraySize, 0, 0, 0, NULL, &intColVar, &intColValue) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_LONG_VARCHAR,
DPI_NATIVE_TYPE_BYTES, arraySize, 0, 0, 0, NULL, &longColVar,
&longColValue) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiConn_prepareStmt(conn, 0, insertSql, strlen(insertSql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
for (iter = 1; iter <= numOfRows; iter++) {
if (dpiStmt_bindByPos(stmt, 1, intColVar) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_bindByPos(stmt, 2, longColVar) < 0)
return dpiTestCase_setFailedFromError(testCase);
longValueLength = iter * sizeIncrement;
longValue = malloc(longValueLength);
if (!longValue)
return dpiTestCase_setFailed(testCase, "Out of memory!");
memset(longValue, 'A', longValueLength);
intColValue->isNull = 0;
intColValue->value.asInt64 = iter;
if (dpiVar_setFromBytes(longColVar, 0, longValue, longValueLength) < 0)
return dpiTestCase_setFailedFromError(testCase);
free(longValue);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
}
if (dpiConn_commit(conn) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_release(stmt);
dpiVar_release(intColVar);
dpiVar_release(longColVar);
return DPI_SUCCESS;
}
int dpiTest_700_checkFetchArraySize(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs order by IntCol";
uint32_t arraySize, setArraySize = 3;
dpiConn *conn;
dpiStmt *stmt;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql),
NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getFetchArraySize(stmt, &arraySize)< 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, arraySize, 100) < 0)
return DPI_FAILURE;
if (dpiStmt_setFetchArraySize(stmt, setArraySize) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getFetchArraySize(stmt, &arraySize)< 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, arraySize, setArraySize) < 0)
return DPI_FAILURE;
setArraySize = 0;
if (dpiStmt_setFetchArraySize(stmt, setArraySize) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getFetchArraySize(stmt, &arraySize)< 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, arraySize, 100) < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_701_fetchArraySizeTooLarge(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs order by IntCol";
uint32_t arraySize = 3, setArraySize = 3333;
uint32_t numQueryColumns;
dpiData *intColValue;
dpiVar *intColVar;
dpiConn *conn;
dpiStmt *stmt;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql),
NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_INT64,
arraySize, 0, 0, 0, NULL, &intColVar, &intColValue) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_define(stmt, 1, intColVar) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_setFetchArraySize(stmt, setArraySize);
if (dpiTestCase_expectError(testCase, "DPI-1015:") < 0)
return DPI_FAILURE;
dpiVar_release(intColVar);
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_702_fetchArraySizeTooSmall(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs order by IntCol";
uint32_t numQueryColumns, bufferRowIndex;
uint32_t arraySize = 3, setArraySize = 5;
dpiData *intColValue;
dpiVar *intColVar;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_newVar(conn, DPI_ORACLE_TYPE_NUMBER, DPI_NATIVE_TYPE_INT64,
arraySize, 0, 0, 0, NULL, &intColVar, &intColValue) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql),
NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_setFetchArraySize(stmt, setArraySize) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_define(stmt, 1, intColVar) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_fetch(stmt, &found, &bufferRowIndex);
if (dpiTestCase_expectError(testCase, "DPI-1018:") < 0)
return DPI_FAILURE;
dpiVar_release(intColVar);
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_703_getQueryValueNoDefine(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs";
uint32_t numQueryColumns, bufferRowIndex;
dpiNativeTypeNum nativeTypeNum;
dpiConn *conn;
dpiStmt *stmt;
dpiData *data;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiTest__insertIntoTestLongs(testCase, conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getQueryValue(stmt, 1, &nativeTypeNum, &data) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, nativeTypeNum,
DPI_NATIVE_TYPE_INT64) < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_704_getQueryValueDiffPos(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs";
uint32_t numQueryColumns, bufferRowIndex;
dpiNativeTypeNum nativeTypeNum;
dpiData *data;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_getQueryValue(stmt, 0, &nativeTypeNum, &data);
if (dpiTestCase_expectError(testCase, "DPI-1028:") < 0)
return DPI_FAILURE;
dpiStmt_getQueryValue(stmt, 3, &nativeTypeNum, &data);
if (dpiTestCase_expectError(testCase, "DPI-1028:") < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_705_getQueryValueNoQuery(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *sql = "select * from TestLongs";
dpiNativeTypeNum nativeTypeNum;
dpiData *data;
dpiConn *conn;
dpiStmt *stmt;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql),
NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_getQueryValue(stmt, 0, &nativeTypeNum, &data);
if (dpiTestCase_expectError(testCase, "DPI-1007:") < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_706_getQueryValueAfterFetch(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *querySql = "select * from TestLongs";
const char *deleteSql = "delete from TestLongs";
uint32_t numQueryColumns, bufferRowIndex;
dpiNativeTypeNum nativeTypeNum;
dpiData *data;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, deleteSql, -1) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, querySql, strlen(querySql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_getQueryValue(stmt, 1, &nativeTypeNum, &data);
if (dpiTestCase_expectError(testCase, "DPI-1029:") < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_707_getQueryInfo(dpiTestCase *testCase, dpiTestParams *params)
{
const char *sql = "select * from TestLongs";
uint32_t numQueryColumns, bufferRowIndex;
dpiQueryInfo info;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getQueryInfo(stmt, 1, &info) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase,
info.typeInfo.defaultNativeTypeNum, DPI_NATIVE_TYPE_INT64) < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_708_queryAfterDropColumn(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *querySql = "select * from TestLongsAlter";
const char *alterDropSql =
"alter table TestLongsAlter drop column IntCol";
const char *dropSql = "drop table TestLongsAlter";
const char *createSql =
"create table TestLongsAlter (IntCol number(9), LongCol long)";
dpiConn *conn;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, dropSql, -1) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, createSql, -1) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, querySql, 2) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, alterDropSql, -1) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, querySql, 1) < 0)
return DPI_FAILURE;
if (dpiTest__execStatement(testCase, conn, querySql, -1) < 0)
return DPI_FAILURE;
return DPI_SUCCESS;
}
int dpiTest_709_fetchRowCheckCount(dpiTestCase *testCase,
dpiTestParams *params)
{
uint32_t numQueryColumns, bufferRowIndex, iter, numOfRows = 2;
const char *sql = "select * from TestLongs";
uint64_t rowCount;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
for (iter = 1; iter <= numOfRows; iter++) {
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getRowCount(stmt, &rowCount) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, rowCount, iter) < 0)
return DPI_FAILURE;
if (!found)
return DPI_FAILURE;
}
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_710_fetchRowsCheckCount(dpiTestCase *testCase,
dpiTestParams *params)
{
uint32_t numQueryColumns, bufferRowIndex, numRowsFetched, maxRows = 2;
const char *sql = "select * from TestLongs";
uint64_t rowCount;
dpiConn *conn;
dpiStmt *stmt;
int moreRows;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiTest__insertIntoTestLongs(testCase, conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, &numQueryColumns) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetchRows(stmt, maxRows, &bufferRowIndex, &numRowsFetched,
&moreRows) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getRowCount(stmt, &rowCount) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectUintEqual(testCase, rowCount, maxRows) < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_711_verifyStmtFuncs(dpiTestCase *testCase, dpiTestParams *params)
{
const char *expectedError = "ORA-24338:";
const char *sql = "select * from TestLongs";
uint32_t bufferRowIndex;
dpiQueryInfo info;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_fetch(stmt, &found, &bufferRowIndex);
if (dpiTestCase_expectError(testCase, expectedError) < 0)
return DPI_FAILURE;
dpiStmt_getQueryInfo(stmt, 1, &info);
if (dpiTestCase_expectError(testCase, expectedError) < 0)
return DPI_FAILURE;
dpiStmt_define(stmt, 1, NULL);
if (dpiTestCase_expectError(testCase, expectedError) < 0)
return DPI_FAILURE;
dpiStmt_release(stmt);
return DPI_SUCCESS;
}
int dpiTest_712_fetchDataToSmallLenStrVar(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *insertSql = "insert into TestTempTable values(1,'TestString')";
const char *selectSql = "select StringCol from TestTempTable";
const char *truncateSql = "truncate table TestTempTable";
uint32_t bufferRowIndex;
dpiConn *conn;
dpiStmt *stmt;
int found;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_prepareStmt(conn, 0, truncateSql, strlen(truncateSql),
NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, 0, NULL) < 0)
dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_release(stmt) < 0)
dpiTestCase_setFailedFromError(testCase);
if (dpiConn_prepareStmt(conn, 0, insertSql, strlen(insertSql), NULL, 0,
&stmt) < 0)
dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, 0, NULL) < 0)
dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_release(stmt) < 0)
dpiTestCase_setFailedFromError(testCase);
if (dpiConn_prepareStmt(conn, 0, selectSql, strlen(selectSql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, 0, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_defineValue(stmt, 1, DPI_ORACLE_TYPE_VARCHAR,
DPI_NATIVE_TYPE_BYTES, 2, 1, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiStmt_fetch(stmt, &found, &bufferRowIndex);
if (dpiTestCase_expectError(testCase, "DPI-1037:") < 0)
return DPI_FAILURE;
if (dpiStmt_release(stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
return DPI_SUCCESS;
}
int main(int argc, char **argv)
{
dpiTestSuite_initialize(700);
dpiTestSuite_addCase(dpiTest_700_checkFetchArraySize,
"check get / set array size with various values");
dpiTestSuite_addCase(dpiTest_701_fetchArraySizeTooLarge,
"dpiStmt_setFetchArraySize() with value too large");
dpiTestSuite_addCase(dpiTest_702_fetchArraySizeTooSmall,
"dpiStmt_setFetchArraySize() with value too small");
dpiTestSuite_addCase(dpiTest_703_getQueryValueNoDefine,
"dpiStmt_getQueryValue() without define");
dpiTestSuite_addCase(dpiTest_704_getQueryValueDiffPos,
"dpiStmt_getQueryValue() with invalid position values");
dpiTestSuite_addCase(dpiTest_705_getQueryValueNoQuery,
"dpiStmt_getQueryValue() called when no query has been executed");
dpiTestSuite_addCase(dpiTest_706_getQueryValueAfterFetch,
"dpiStmt_getQueryValue() called after all rows fetched");
dpiTestSuite_addCase(dpiTest_707_getQueryInfo,
"dpiStmt_getQueryInfo() information is correct");
dpiTestSuite_addCase(dpiTest_708_queryAfterDropColumn,
"query all columns from table before and after column dropped");
dpiTestSuite_addCase(dpiTest_709_fetchRowCheckCount,
"dpiStmt_fetch() increments rowcount");
dpiTestSuite_addCase(dpiTest_710_fetchRowsCheckCount,
"dpiStmt_fetchRows() increments rowcount");
dpiTestSuite_addCase(dpiTest_711_verifyStmtFuncs,
"dpiStmt_fetchRows() increments rowcount");
dpiTestSuite_addCase(dpiTest_712_fetchDataToSmallLenStrVar,
"fetch data to a string variable which is smaller and verify");
return dpiTestSuite_run();
}