Files
openGauss-connector-odbc/odbc-test-gauss/stmthandles-test.c
2020-06-24 16:11:37 +08:00

70 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "common.h"
/*
* This test case tests that things still work when you have a lot of
* statements open simultaneously.
*
* As of writing this, there's an internal limit of just below 2^15 stmt
* handles. Also, unixodbc's method of checking if a handle is valid, by
* scanning a linked list of statements, grinds to a halt as you have
* a lot of statements. If you want to test those limits, increase
* NUM_STMT_HANDLES value.
*/
#define NUM_STMT_HANDLES 100
int main(int argc, char **argv)
{
HSTMT hstmt[NUM_STMT_HANDLES];
SQLRETURN rc;
int i, nhandles;
test_connect();
/* Allocate a lot of stmt handles */
for (i = 0; i < NUM_STMT_HANDLES; i++)
{
rc = SQLAllocStmt(conn, &hstmt[i]);
if (!SQL_SUCCEEDED(rc))
{
printf("failed to allocate stmt handle %d\n", i + 1);
print_diag(NULL, SQL_HANDLE_DBC, conn);
break;
}
if ((i + 1) % (NUM_STMT_HANDLES / 10) == 0)
{
printf("%d statements allocated...\n", i + 1);
fflush(stdout);
}
}
nhandles = i;
/* Execute a query using each of them to verify they all work */
for (i = 0; i < nhandles; i++)
{
char sqlbuf[100];
snprintf(sqlbuf, sizeof(sqlbuf), "SELECT 'stmt no %d'", i + 1);
rc = SQLExecDirect(hstmt[i], (SQLCHAR *) sqlbuf, SQL_NTS);
if (!SQL_SUCCEEDED(rc))
{
print_diag("SQLExecDirect failed", SQL_HANDLE_STMT, hstmt);
exit(1);
}
if ((i + 1) % (NUM_STMT_HANDLES / 10) == 0)
{
printf("%d statements executed...\n", i + 1);
fflush(stdout);
}
}
for (i = 0; i < nhandles; i += (NUM_STMT_HANDLES / 10))
{
print_result(hstmt[i]);
fflush(stdout);
}
test_disconnect();
}