Skip to content

Commit 61e3666

Browse files
committed
jdbc/test: Add test to check behavior when VECTOR type is used (if supported by server).
1 parent ed79920 commit 61e3666

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed

jdbc/test/unit/classes/preparedstatement.cpp

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,5 +1637,132 @@ void preparedstatement::queryAttributes() {
16371637
stmt->execute("UNINSTALL COMPONENT 'file://component_query_attributes'");
16381638
}
16391639

1640+
void preparedstatement::vectorType() {
1641+
stmt.reset(con->createStatement());
1642+
1643+
// ResultSetMetaData * meta_ps; // Note: To be used for PS scenario
1644+
ResultSetMetaData * meta_st;
1645+
ResultSet res_st;
1646+
1647+
try {
1648+
stmt->execute("DROP TABLE IF EXISTS vector_check");
1649+
} catch (...) {
1650+
}
1651+
1652+
try {
1653+
stmt->execute("CREATE TABLE vector_check(col_vec VECTOR(16))");
1654+
} catch (sql::SQLException &) {
1655+
SKIP("VECTOR type is not supported");
1656+
}
1657+
1658+
std::vector<float> float_buf = {
1659+
1.2345F, 2.3456E+10F, 3.4567F, -93.23F, 0.0F, -2, 5433.34F, 3.1415F,
1660+
2.7183F, 2.3456E-10F, 123.987F, 232.0F, 0.000001F, 3.33333333333E+0F,
1661+
10.0000009F, 9.9999998F
1662+
};
1663+
1664+
auto insert_as_blob = [this](const std::vector<float> &data)
1665+
{
1666+
pstmt.reset(con->prepareStatement("INSERT INTO vector_check VALUES (?)"));
1667+
std::istringstream iss(
1668+
std::string(reinterpret_cast<const char*>(data.data()), data.size() * sizeof(float)),
1669+
std::ios::binary
1670+
);
1671+
pstmt->setBlob(1, &iss);
1672+
ASSERT_EQUALS(1, pstmt->executeUpdate());
1673+
};
1674+
1675+
auto check_data = [](const float *f1, const float *f2, int N)
1676+
{
1677+
for (int i = 0; i < N; ++i) {
1678+
ASSERT(f1[i] == f2[i]);
1679+
}
1680+
};
1681+
1682+
auto check_result
1683+
= [&check_data](
1684+
testsuite::ResultSet &res, sql::ResultSetMetaData *meta,
1685+
const std::vector<float> &data
1686+
)
1687+
{
1688+
ASSERT_EQUALS(1, meta->getColumnCount());
1689+
1690+
ASSERT(res->next());
1691+
1692+
// Read as BLOB with numeric column index
1693+
auto bstr = res->getBlob(1);
1694+
float res_buf[16];
1695+
bstr->read(reinterpret_cast<char*>(res_buf), sizeof(res_buf));
1696+
check_data(data.data(), res_buf, data.size());
1697+
1698+
// Read as BLOB with string column index
1699+
bstr = res->getBlob("col_vec");
1700+
memset(res_buf, 0, sizeof(res_buf));
1701+
bstr->read(reinterpret_cast<char*>(res_buf), sizeof(res_buf));
1702+
check_data(data.data(), res_buf, data.size());
1703+
1704+
/*
1705+
Note: All meta data will be correct only when we have client library
1706+
that supports VECTOR data type and WL#16170 is implemented.
1707+
*/
1708+
1709+
// Column size does not change even for data shorter than column
1710+
// ASSERT_EQUALS(16 * 15 + 1, meta->getColumnDisplaySize(1));
1711+
ASSERT_EQUALS("col_vec", meta->getColumnName(1));
1712+
// ASSERT_EQUALS(sql::DataType::LONGVARBINARY, meta->getColumnType(1));
1713+
// ASSERT_EQUALS("VECTOR", meta->getColumnTypeName(1));
1714+
// ASSERT_EQUALS((unsigned int)(N * sizeof(float)), meta->getPrecision(1));
1715+
// ASSERT_EQUALS(0, meta->getScale(1));
1716+
};
1717+
1718+
auto check_selects
1719+
= [&res_st, &meta_st, &check_result, this](const std::vector<float> &data)
1720+
{
1721+
/*
1722+
Note: When client library does not support VECTOR data type it fails
1723+
to fetch prepared statement results with VECTOR columns. This should work
1724+
when client library becomes aware of the VECTOR data type.
1725+
*/
1726+
1727+
// pstmt.reset(con->prepareStatement("SELECT col_vec FROM vector_check"));
1728+
// res.reset(pstmt->executeQuery());
1729+
// meta_ps=res->getMetaData();
1730+
// check_result(res, meta_ps, N);
1731+
1732+
// Check for non-prepared statements reads
1733+
res_st.reset(stmt->executeQuery("SELECT col_vec FROM vector_check"));
1734+
meta_st = res_st->getMetaData();
1735+
check_result(res_st, meta_st, data);
1736+
};
1737+
1738+
logMsg("WL#16170 - Check 2: Insert VECTOR value as <BLOB_TYPE> data");
1739+
1740+
insert_as_blob(float_buf);
1741+
1742+
logMsg("WL#16170 - Check 3: Read VECTOR value as <BLOB_TYPE> data");
1743+
1744+
check_selects(float_buf);
1745+
1746+
stmt->execute("TRUNCATE TABLE vector_check");
1747+
1748+
logMsg("WL#16170 - Check 8: Working with vector sizes R > N");
1749+
1750+
float_buf.emplace_back(876.123);
1751+
1752+
try {
1753+
insert_as_blob(float_buf);
1754+
FAIL("Expected error not detected");
1755+
}
1756+
catch(sql::SQLException &) {}
1757+
1758+
logMsg("WL#16170 - Working with vector sizes M < N");
1759+
1760+
float_buf.resize(8);
1761+
stmt->execute("TRUNCATE TABLE vector_check");
1762+
1763+
insert_as_blob(float_buf);
1764+
check_selects(float_buf);
1765+
}
1766+
16401767
} /* namespace preparedstatement */
16411768
} /* namespace testsuite */

jdbc/test/unit/classes/preparedstatement.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class preparedstatement : public unit_fixture
6969
TEST_CASE(blob);
7070
TEST_CASE(executeQuery);
7171
TEST_CASE(queryAttributes);
72+
TEST_CASE(vectorType);
7273
}
7374

7475
/**
@@ -148,6 +149,10 @@ class preparedstatement : public unit_fixture
148149
*/
149150
void queryAttributes();
150151

152+
/**
153+
* Check vector data type
154+
*/
155+
void vectorType();
151156

152157
};
153158

0 commit comments

Comments
 (0)