blob: d3b4a260625ba20190748ec31d1566595137f537 [file] [log] [blame]
/*
* 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.
*/
#ifdef _WIN32
# include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#include <vector>
#include <string>
#include <algorithm>
#ifndef _MSC_VER
# define BOOST_TEST_DYN_LINK
#endif
#include <boost/test/unit_test.hpp>
#include "ignite/ignition.h"
#include "ignite/common/fixed_size_array.h"
#include "ignite/impl/binary/binary_utils.h"
#include "test_type.h"
#include "complex_type.h"
#include "test_utils.h"
#include "odbc_test_suite.h"
using namespace ignite;
using namespace ignite::cache;
using namespace ignite::cache::query;
using namespace ignite::common;
using namespace ignite_test;
using namespace ignite::binary;
using namespace ignite::impl::binary;
using namespace ignite::impl::interop;
using namespace boost::unit_test;
/**
* Test setup fixture.
*/
struct MetaQueriesTestSuiteFixture : public odbc::OdbcTestSuite
{
/**
* Start additional node with the specified name.
*
* @param name Node name.
*/
static Ignite StartAdditionalNode(const char* name)
{
return StartPlatformNode("queries-test.xml", name);
}
/**
* Checks single row result set for correct work with SQLGetData.
*
* @param stmt Statement.
*/
void CheckSingleRowResultSetWithGetData(SQLHSTMT stmt)
{
SQLRETURN ret = SQLFetch(stmt);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
char buf[1024];
SQLLEN bufLen = sizeof(buf);
ret = SQLGetData(stmt, 1, SQL_C_CHAR, buf, sizeof(buf), &bufLen);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
ret = SQLFetch(stmt);
BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
ret = SQLGetData(stmt, 1, SQL_C_CHAR, buf, sizeof(buf), &bufLen);
BOOST_REQUIRE_EQUAL(ret, SQL_ERROR);
BOOST_CHECK_EQUAL(GetOdbcErrorState(SQL_HANDLE_STMT, stmt), "24000");
}
/**
* Check string column.
*
* @param stmt Statement.
* @param colId Column ID to check.
* @param value Expected value.
*/
void CheckStringColumn(SQLHSTMT stmt, int colId, const std::string& value)
{
char buf[1024];
SQLLEN bufLen = sizeof(buf);
SQLRETURN ret = SQLGetData(stmt, colId, SQL_C_CHAR, buf, sizeof(buf), &bufLen);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
if (bufLen <= 0)
BOOST_CHECK(value.empty());
else
BOOST_CHECK_EQUAL(std::string(buf, static_cast<size_t>(bufLen)), value);
}
/**
* Constructor.
*/
MetaQueriesTestSuiteFixture() :
grid(0),
cache1(0),
cache2(0)
{
grid = StartPlatformNode("queries-test.xml", "NodeMain");
cache1 = grid.GetCache<int64_t, TestType>("cache");
cache2 = grid.GetCache<int64_t, ComplexType>("cache2");
}
/**
* Destructor.
*/
~MetaQueriesTestSuiteFixture()
{
// No-op.
}
/** Node started during the test. */
Ignite grid;
/** Frist cache instance. */
Cache<int64_t, TestType> cache1;
/** Second cache instance. */
Cache<int64_t, ComplexType> cache2;
};
BOOST_FIXTURE_TEST_SUITE(MetaQueriesTestSuite, MetaQueriesTestSuiteFixture)
BOOST_AUTO_TEST_CASE(TestGetTypeInfoAllTypes)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLRETURN ret = SQLGetTypeInfo(stmt, SQL_ALL_TYPES);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
}
BOOST_AUTO_TEST_CASE(TestColAttributesColumnLength)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR req[] = "select strField from TestType";
SQLExecDirect(stmt, req, SQL_NTS);
SQLLEN intVal;
SQLCHAR strBuf[1024];
SQLSMALLINT strLen;
SQLRETURN ret = SQLColAttribute(stmt, 1, SQL_COLUMN_LENGTH, strBuf, sizeof(strBuf), &strLen, &intVal);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
BOOST_CHECK_EQUAL(intVal, 60);
}
BOOST_AUTO_TEST_CASE(TestColAttributesColumnPresicion)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR req[] = "select strField from TestType";
SQLExecDirect(stmt, req, SQL_NTS);
SQLLEN intVal;
SQLCHAR strBuf[1024];
SQLSMALLINT strLen;
SQLRETURN ret = SQLColAttribute(stmt, 1, SQL_COLUMN_PRECISION, strBuf, sizeof(strBuf), &strLen, &intVal);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
BOOST_CHECK_EQUAL(intVal, 60);
}
BOOST_AUTO_TEST_CASE(TestColAttributesColumnScale)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR req[] = "select strField from TestType";
SQLExecDirect(stmt, req, SQL_NTS);
SQLLEN intVal;
SQLCHAR strBuf[1024];
SQLSMALLINT strLen;
SQLRETURN ret = SQLColAttribute(stmt, 1, SQL_COLUMN_SCALE, strBuf, sizeof(strBuf), &strLen, &intVal);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
}
BOOST_AUTO_TEST_CASE(TestGetDataWithGetTypeInfo)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLRETURN ret = SQLGetTypeInfo(stmt, SQL_VARCHAR);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckSingleRowResultSetWithGetData(stmt);
}
BOOST_AUTO_TEST_CASE(TestGetDataWithTables)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR empty[] = "";
SQLCHAR table[] = "TestType";
SQLRETURN ret = SQLTables(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, empty, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckSingleRowResultSetWithGetData(stmt);
}
BOOST_AUTO_TEST_CASE(TestGetDataWithColumns)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR empty[] = "";
SQLCHAR table[] = "TestType";
SQLCHAR column[] = "strField";
SQLRETURN ret = SQLColumns(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, column, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckSingleRowResultSetWithGetData(stmt);
}
BOOST_AUTO_TEST_CASE(TestGetDataWithSelectQuery)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR insertReq[] = "insert into TestType(_key, strField) VALUES(1, 'Lorem ipsum')";
SQLRETURN ret = SQLExecDirect(stmt, insertReq, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
SQLCHAR selectReq[] = "select strField from TestType";
ret = SQLExecDirect(stmt, selectReq, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckSingleRowResultSetWithGetData(stmt);
}
BOOST_AUTO_TEST_CASE(TestInsertTooLongValueFail)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLCHAR insertReq[] =
"insert into TestType(_key, strField) VALUES(42, '0123456789012345678901234567890123456789012345678901234567891')";
SQLRETURN ret = SQLExecDirect(stmt, insertReq, SQL_NTS);
if (SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
}
BOOST_AUTO_TEST_CASE(TestGetInfoScrollOptions)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=cache");
SQLUINTEGER val = 0;
SQLRETURN ret = SQLGetInfo(dbc, SQL_SCROLL_OPTIONS, &val, 0, 0);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_DBC, dbc));
BOOST_CHECK_NE(val, 0);
}
BOOST_AUTO_TEST_CASE(TestDdlTablesMeta)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC");
SQLCHAR createTable[] = "create table TestTable(id int primary key, testColumn varchar)";
SQLRETURN ret = SQLExecDirect(stmt, createTable, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
SQLCHAR empty[] = "";
SQLCHAR table[] = "TestTable";
ret = SQLTables(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, empty, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
ret = SQLFetch(stmt);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckStringColumn(stmt, 1, "");
CheckStringColumn(stmt, 2, "\"PUBLIC\"");
CheckStringColumn(stmt, 3, "TESTTABLE");
CheckStringColumn(stmt, 4, "TABLE");
ret = SQLFetch(stmt);
BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
}
BOOST_AUTO_TEST_CASE(TestDdlTablesMetaTableTypeList)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC");
SQLCHAR createTable[] = "create table TestTable(id int primary key, testColumn varchar)";
SQLRETURN ret = SQLExecDirect(stmt, createTable, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
SQLCHAR empty[] = "";
SQLCHAR table[] = "TestTable";
SQLCHAR typeList[] = "TABLE,VIEW";
ret = SQLTables(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, typeList, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
ret = SQLFetch(stmt);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckStringColumn(stmt, 1, "");
CheckStringColumn(stmt, 2, "\"PUBLIC\"");
CheckStringColumn(stmt, 3, "TESTTABLE");
CheckStringColumn(stmt, 4, "TABLE");
ret = SQLFetch(stmt);
BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
}
BOOST_AUTO_TEST_CASE(TestDdlColumnsMeta)
{
Connect("DRIVER={Apache Ignite};ADDRESS=127.0.0.1:11110;SCHEMA=PUBLIC");
SQLCHAR createTable[] = "create table TestTable(id int primary key, testColumn varchar)";
SQLRETURN ret = SQLExecDirect(stmt, createTable, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
SQLCHAR empty[] = "";
SQLCHAR table[] = "TestTable";
ret = SQLColumns(stmt, empty, SQL_NTS, empty, SQL_NTS, table, SQL_NTS, empty, SQL_NTS);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
ret = SQLFetch(stmt);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckStringColumn(stmt, 1, "");
CheckStringColumn(stmt, 2, "\"PUBLIC\"");
CheckStringColumn(stmt, 3, "TESTTABLE");
CheckStringColumn(stmt, 4, "ID");
ret = SQLFetch(stmt);
if (!SQL_SUCCEEDED(ret))
BOOST_FAIL(GetOdbcErrorMessage(SQL_HANDLE_STMT, stmt));
CheckStringColumn(stmt, 1, "");
CheckStringColumn(stmt, 2, "\"PUBLIC\"");
CheckStringColumn(stmt, 3, "TESTTABLE");
CheckStringColumn(stmt, 4, "TESTCOLUMN");
ret = SQLFetch(stmt);
BOOST_REQUIRE_EQUAL(ret, SQL_NO_DATA);
}
BOOST_AUTO_TEST_SUITE_END()