@@ -1637,5 +1637,132 @@ void preparedstatement::queryAttributes() {
1637
1637
stmt->execute (" UNINSTALL COMPONENT 'file://component_query_attributes'" );
1638
1638
}
1639
1639
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
+
1640
1767
} /* namespace preparedstatement */
1641
1768
} /* namespace testsuite */
0 commit comments