in dev/bench/odbc/main.cc [77:214]
int main(int argc, char** argv) {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLHSTMT stmt1;
if (argc != 2) {
std::cerr << "Expected exactly 1 argument: the DSN for connecting, got " << argc - 1
<< "arguments. exiting...";
return 1;
}
std::string dsn(argv[1]);
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
// we want ODBC3 support, set env handle
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, reinterpret_cast<void*>(SQL_OV_ODBC3_80), 0);
// allocate connection handle
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
// connect to the DSN using dbc handle
CHECK_OK(SQLDriverConnectA(dbc, nullptr,
reinterpret_cast<SQLCHAR*>(const_cast<char*>(dsn.c_str())),
SQL_NTS, nullptr, 0, nullptr, SQL_DRIVER_COMPLETE),
"Error -- Driver Connect failed");
std::ofstream timing_output("odbc_perf_record");
for (size_t iter = 0; iter < 100; iter++) {
CHECK_OK(SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt),
"Error -- Statement handle alloc failed");
const auto start{std::chrono::steady_clock::now()};
CHECK_OK(SQLExecDirect(
stmt,
(SQLCHAR*)"SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1000.LINEITEM "
"LIMIT 100000000",
SQL_NTS),
"Error -- Statement execution failed");
const SQLULEN bulkSize = 10000;
CHECK_OK(SQLSetStmtAttr(stmt, SQL_ATTR_ROW_ARRAY_SIZE,
reinterpret_cast<SQLPOINTER>(bulkSize), 0),
"Error -- SetStmtAttr failed");
// bind columns to buffers
SQLINTEGER val_orderkey[bulkSize];
SQLINTEGER val_partkey[bulkSize];
SQLINTEGER val_suppkey[bulkSize];
SQLINTEGER val_linenumber[bulkSize];
SQLDOUBLE val_quantity[bulkSize];
SQLDOUBLE val_extendedprice[bulkSize];
SQLDOUBLE val_discount[bulkSize];
SQLDOUBLE val_tax[bulkSize];
SQLCHAR val_retflag[bulkSize][2];
SQLCHAR val_linestatus[bulkSize][2];
SQL_DATE_STRUCT val_shipdate[bulkSize];
SQL_DATE_STRUCT val_commitdate[bulkSize];
SQL_DATE_STRUCT val_receiptdate[bulkSize];
SQLCHAR val_shipinstruct[bulkSize][26];
SQLCHAR val_shipmode[bulkSize][11];
SQLCHAR val_comment[bulkSize][45];
CHECK_OK(SQLBindCol(stmt, 1, SQL_C_LONG, reinterpret_cast<SQLPOINTER>(val_orderkey),
sizeof(val_orderkey), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 2, SQL_C_LONG, reinterpret_cast<SQLPOINTER>(val_partkey),
sizeof(val_partkey), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 3, SQL_C_LONG, reinterpret_cast<SQLPOINTER>(val_suppkey),
sizeof(val_suppkey), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 4, SQL_C_LONG, reinterpret_cast<SQLPOINTER>(val_linenumber),
sizeof(val_linenumber), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 5, SQL_C_DOUBLE, reinterpret_cast<SQLPOINTER>(val_quantity),
sizeof(val_quantity), nullptr),
"BindCol failed");
CHECK_OK(
SQLBindCol(stmt, 6, SQL_C_DOUBLE, reinterpret_cast<SQLPOINTER>(val_extendedprice),
sizeof(val_extendedprice), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 7, SQL_C_DOUBLE, reinterpret_cast<SQLPOINTER>(val_discount),
sizeof(val_discount), nullptr),
"BindCol failed");
CHECK_OK(
SQLBindCol(stmt, 8, SQL_C_DOUBLE, (SQLPOINTER)val_tax, sizeof(val_tax), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 9, SQL_C_CHAR, (SQLPOINTER)val_retflag,
sizeof(val_retflag[0]), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 10, SQL_C_CHAR, (SQLPOINTER)val_linestatus,
sizeof(val_linestatus[0]), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 11, SQL_C_DATE, (SQLPOINTER)val_shipdate,
sizeof(val_shipdate), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 12, SQL_C_DATE, (SQLPOINTER)val_commitdate,
sizeof(val_commitdate), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 13, SQL_C_DATE, (SQLPOINTER)val_receiptdate,
sizeof(val_receiptdate), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 14, SQL_C_CHAR, (SQLPOINTER)val_shipinstruct,
sizeof(val_shipinstruct[0]), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 15, SQL_C_CHAR, (SQLPOINTER)val_shipmode,
sizeof(val_shipmode[0]), nullptr),
"BindCol failed");
CHECK_OK(SQLBindCol(stmt, 16, SQL_C_CHAR, (SQLPOINTER)val_comment,
sizeof(val_comment[0]), nullptr),
"BindCol failed");
SQLRETURN ret;
while (true) {
ret = SQLFetch(stmt);
if (checkError(ret, SQL_HANDLE_DBC, dbc, (SQLWCHAR*)L"fetch failed")) {
exit(1);
}
if (ret == SQL_NO_DATA) break;
}
const auto end{std::chrono::steady_clock::now()};
const std::chrono::duration<double> elapsed{end - start};
timing_output << elapsed.count() << std::endl;
SQLFreeStmt(stmt, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
if (iter % 10 == 0) {
std::cout << "Run " << iter << std::endl;
std::cout << "\tRuntime: " << elapsed.count() << " s" << std::endl;
}
}
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
}