1 /*
2
3 Copyright (c) 2024 Huawei Device Co., Ltd.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7 http://www.apache.org/licenses/LICENSE-2.0
8 Unless required by applicable law or agreed to in writing, software
9 distributed under the License is distributed on an "AS IS" BASIS,
10 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 See the License for the specific language governing permissions and
12 limitations under the License.
13 */
14 #include <gtest/gtest.h>
15
16 #include <random>
17 #include <string>
18
19 #include "common.h"
20 #include "grd_api_manager.h"
21 #include "rd_utils.h"
22 #include "rdb_errno.h"
23 #include "rdb_helper.h"
24 #include "rdb_open_callback.h"
25
26 using namespace testing::ext;
27 using namespace OHOS::NativeRdb;
28
29 class RdbExecuteRdTest : public testing::TestWithParam<bool> {
30 public:
31 static void SetUpTestCase(void);
32 static void TearDownTestCase(void);
33 void SetUp();
34 void TearDown();
35
36 static const std::string databaseName;
37 static std::shared_ptr<RdbStore> store;
38 static const std::string restoreDatabaseName;
39 static const std::string backupDatabaseName;
40 };
41
42 INSTANTIATE_TEST_CASE_P(, RdbExecuteRdTest, testing::Values(false, true));
43
44 const std::string RdbExecuteRdTest::databaseName = RDB_TEST_PATH + "execute_test.db";
45 const std::string RdbExecuteRdTest::restoreDatabaseName = RDB_TEST_PATH + "execute_test_restore.db";
46 const std::string RdbExecuteRdTest::backupDatabaseName = RDB_TEST_PATH + "execute_test_backup.db";
47 std::shared_ptr<RdbStore> RdbExecuteRdTest::store = nullptr;
48
49 class ExecuteTestOpenRdCallback : public RdbOpenCallback {
50 public:
51 int OnCreate(RdbStore &store) override;
52 int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
53 };
54
OnCreate(RdbStore & store)55 int ExecuteTestOpenRdCallback::OnCreate(RdbStore &store)
56 {
57 return E_OK;
58 }
59
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)60 int ExecuteTestOpenRdCallback::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
61 {
62 return E_OK;
63 }
64
SetUpTestCase(void)65 void RdbExecuteRdTest::SetUpTestCase(void)
66 {
67 }
68
TearDownTestCase(void)69 void RdbExecuteRdTest::TearDownTestCase(void)
70 {
71 }
72
SetUp(void)73 void RdbExecuteRdTest::SetUp(void)
74 {
75 if (!IsUsingArkData()) {
76 GTEST_SKIP() << "Current testcase is not compatible from current rdb";
77 }
78 int errCode = E_OK;
79 RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
80 RdbStoreConfig config(RdbExecuteRdTest::databaseName);
81 config.SetIsVector(true);
82 config.SetEncryptStatus(GetParam());
83 int num = 300;
84 config.SetNcandidates(num);
85 ExecuteTestOpenRdCallback helper;
86 RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
87 EXPECT_NE(RdbExecuteRdTest::store, nullptr);
88 EXPECT_EQ(errCode, E_OK);
89 }
90
TearDown(void)91 void RdbExecuteRdTest::TearDown(void)
92 {
93 RdbExecuteRdTest::store = nullptr;
94 RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
95 }
96
97 std::random_device g_rd;
98 std::mt19937 g_gen(g_rd());
99 std::uniform_real_distribution<> dis(-1.0, 1.0);
100
101 /**
102 @tc.name: RdbStore_Execute_001
103 @tc.desc: test RdbStore Execute in vector mode
104 @tc.type: FUNC
105 */
106 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_001, TestSize.Level1)
107 {
108 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
109
110 int64_t id = 0;
111 ValuesBucket values;
112 values.PutInt("id", 1);
113 values.PutString("name", std::string("zhangsan"));
114 values.PutInt("age", 18);
115 values.PutDouble("salary", 100.5);
116 values.PutBlob("blobType", std::vector<uint8_t>{ 1, 2, 3 });
117
118 values.Clear();
119 values.PutInt("id", 2);
120 values.PutString("name", std::string("lisi"));
121 values.PutInt("age", 19);
122 values.PutDouble("salary", 200.5);
123 values.PutBlob("blobType", std::vector<uint8_t>{ 4, 5, 6 });
124
125 values.Clear();
126 values.PutInt("id", 3);
127 values.PutString("name", std::string("wangyjing"));
128 values.PutInt("age", 20);
129 values.PutDouble("salary", 300.5);
130 values.PutBlob("blobType", std::vector<uint8_t>{ 7, 8, 9 });
131 std::vector bindArgs = std::vector{ ValueObject(std::string("18")), ValueObject(std ::string("20")) };
132
133 std::string sqlDelNoBind = "DELETE FROM test WHERE age = 19";
134 std::string sqlSelect = "SELECT * FROM test WHERE age = ? OR age = ?";
135 std::string sqlDelete = "DELETE FROM test WHERE age = ? OR age = ?";
136 EXPECT_EQ(store->ExecuteSql(sqlDelete.c_str(), bindArgs), E_NOT_SUPPORT);
137 EXPECT_EQ(store->ExecuteSql(sqlDelNoBind.c_str()), E_NOT_SUPPORT);
138
139 int64_t count = 0;
140 EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT() FROM test where age = 19"), E_NOT_SUPPORT);
141 EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT() FROM test"), E_NOT_SUPPORT);
142 EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT(*) FROM test"), E_NOT_SUPPORT);
143 EXPECT_EQ(store->Insert(id, "test", values), E_NOT_SUPPORT);
144 }
145
146 /**
147 @tc.name: RdbStore_Execute_002
148 @tc.desc: test RdbStore Execute in vector mode
149 @tc.type: FUNC
150 */
151 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_002, TestSize.Level1)
152 {
153 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
154 std::pair<int, uint64_t> res1 = {};
155 std::pair<int, uint64_t> res2 = {};
156 res1 = store->BeginTrans();
157 EXPECT_EQ(res1.first, E_OK);
158 EXPECT_NE(res1.second, 0);
159 res2 = store->BeginTrans();
160 EXPECT_EQ(res2.first, E_OK);
161 EXPECT_NE(res2.second, 0);
162 EXPECT_EQ(store->RollBack(res1.second), E_OK);
163 EXPECT_EQ(store->Commit(res2.second), E_OK);
164 }
165
166 /**
167 @tc.name: RdbStore_Execute_003
168 @tc.desc: test RdbStore Execute in vector mode. Repeatly require trx.
169 @tc.type: FUNC
170 */
171 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_003, TestSize.Level1)
172 {
173 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
174 std::vector<std::pair<int, uint64_t>> results = {};
175 for (uint32_t i = 0; i < 100; i++) { // Get 100 trxs
176 std::pair<int, uint64_t> res = {};
177 res = store->BeginTrans();
178 EXPECT_TRUE((res.first == E_OK) || (res.first == E_DATABASE_BUSY));
179 results.push_back(res);
180 }
181 for (uint32_t i = 0; i < 100; i++) { // Commit 100 trxs
182 if (results[i].first == E_OK) {
183 EXPECT_EQ(store->RollBack(results[i].second), E_OK);
184 }
185 }
186 }
187
188 /**
189 @tc.name: RdbStore_Execute_004
190 @tc.desc: test RdbStore Execute in vector mode
191 @tc.type: FUNC
192 */
193 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_004, TestSize.Level1)
194 {
195 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
196 std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
197 std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
198 std::string sqlQuery = "SELECT id FROM test order by repr <-> '[1.1, 0.3, 2.2, 6.6, 1.5, 3.1, 0.6, 0.2]' limit 3;";
199
200 std::pair<int32_t, ValueObject> res = {};
201 res = store->Execute(sqlCreateTable.c_str(), {}, 0);
202 EXPECT_EQ(res.first, E_OK);
203
204 std::pair<int, uint64_t> res1 = {};
205 res1 = store->BeginTrans();
206 EXPECT_EQ(res1.first, E_OK);
207 EXPECT_NE(res1.second, 0);
208
209 res = store->Execute(sqlInsert.c_str(), {}, res1.second);
210 EXPECT_EQ(res.first, E_OK);
211 EXPECT_EQ(store->Commit(res1.second), E_OK);
212 res = store->Execute("DROP TABLE test;", {}, 0);
213 EXPECT_EQ(res.first, E_OK);
214 }
215
216 /**
217 @tc.name: RdbStore_Execute_005
218 @tc.desc: test RdbStore Execute in vector mode
219 @tc.type: FUNC
220 */
221 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_005, TestSize.Level1)
222 {
223 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
224 std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
225 std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
226 std::string sqlQuery = "SELECT id FROM test order by repr <-> '[1.1, 0.3, 2.2, 6.6, 1.5, 3.1, 0.6, 0.2]' limit 3;";
227
228 std::pair<int32_t, ValueObject> res = {};
229 res = store->Execute(sqlCreateTable.c_str(), {});
230 EXPECT_EQ(res.first, E_OK);
231 res = store->Execute(sqlInsert.c_str(), {});
232 EXPECT_EQ(res.first, E_OK);
233 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery.c_str(), std::vector<ValueObject>());
234 EXPECT_NE(resultSet, nullptr);
235 EXPECT_EQ(resultSet->GoToNextRow(), E_OK);
236 std::vector<std::string> colNames = {};
237 resultSet->GetAllColumnNames(colNames);
238 EXPECT_EQ(colNames.size(), 1);
239 int columnIndex = 0;
240 int intVal = 0;
241 resultSet->GetColumnIndex("id", columnIndex);
242 resultSet->GetInt(columnIndex, intVal);
243 EXPECT_EQ(columnIndex, 0);
244 EXPECT_EQ(intVal, 1);
245 EXPECT_EQ(E_OK, resultSet->Close());
246 res = store->Execute("DROP TABLE test;");
247 EXPECT_EQ(E_OK, res.first);
248 }
249
250 /**
251 @tc.name: RdbStore_Execute_006
252 @tc.desc: test RdbStore Execute in vector mode
253 @tc.type: FUNC
254 */
255 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_006, TestSize.Level1)
256 {
257 std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
258 std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
259 std::string sqlBeginTrans = "begin;";
260
261 std::string dbPath = "/data/test/execute_test1.db";
262 std::string configStr =
263 "{\"pageSize\":8, \"crcCheckEnable\":0, \"redoFlushByTrx\":1, \"bufferPoolSize\":10240,"
264 "\"sharedModeEnable\":1, \"metaInfoBak\":1, \"maxConnNum\":500 }";
265
266 GRD_DB *db2 = nullptr;
267 GRD_DB *db4 = nullptr;
268 EXPECT_EQ(RdUtils::RdDbOpen(dbPath.c_str(), configStr.c_str(),
269 GRD_DB_OPEN_CREATE | GRD_DB_OPEN_IGNORE_DATA_CORRPUPTION, &db2), E_OK);
270 EXPECT_EQ(RdUtils::RdDbOpen(dbPath.c_str(), configStr.c_str(),
271 GRD_DB_OPEN_CREATE | GRD_DB_OPEN_IGNORE_DATA_CORRPUPTION, &db4), E_OK);
272
273 GRD_SqlStmt *stmt = nullptr;
274 EXPECT_EQ(RdUtils::RdSqlPrepare(db2, sqlCreateTable.c_str(), sqlCreateTable.size(), &stmt, nullptr), E_OK);
275 EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
276 EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
277
278 stmt = nullptr;
279 EXPECT_EQ(RdUtils::RdSqlPrepare(db4, sqlBeginTrans.c_str(), sqlBeginTrans.size(), &stmt, nullptr), E_OK);
280 EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
281 EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
282
283 stmt = nullptr;
284 EXPECT_EQ(RdUtils::RdSqlPrepare(db4, sqlInsert.c_str(), sqlInsert.size(), &stmt, nullptr), E_OK);
285 EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
286 EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
287 EXPECT_EQ(RdUtils::RdDbClose(db2, 0), E_OK);
288 EXPECT_EQ(RdUtils::RdDbClose(db4, 0), E_OK);
289 }
290
GetRandVector(uint32_t maxElementNum,uint16_t dim)291 std::string GetRandVector(uint32_t maxElementNum, uint16_t dim)
292 {
293 if (maxElementNum == 0) {
294 return "";
295 }
296 unsigned int randomNumberSeed = time(nullptr);
297 std::string res = "[";
298 for (uint16_t i = 0; i < dim; i++) {
299 uint32_t intPart = (rand_r(&randomNumberSeed) % maxElementNum);
300 intPart += 1;
301 uint32_t tenths = (rand_r(&randomNumberSeed) % 10); // 10是用来限制小数点后的数字不能超过10
302 res += std::to_string(intPart);
303 res += ".";
304 res += std::to_string(tenths);
305 res += ", ";
306 }
307 res.pop_back();
308 res.pop_back();
309 res += "]";
310 return res;
311 }
312
313 constexpr uint32_t MAX_INT_PART = 10;
314 constexpr uint16_t LARGE_ANN_INDEX_DIM = 8;
CreateIdxAndSelect(std::string & sqlSelect)315 std::shared_ptr<ResultSet> CreateIdxAndSelect(std::string &sqlSelect)
316 {
317 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
318
319 std::string sqlCreateTable =
320 "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
321 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
322
323 std::pair<int32_t, ValueObject> res = {};
324 res = store->Execute(sqlCreateTable.c_str(), {});
325 EXPECT_EQ(res.first, E_OK);
326 res = store->Execute(sqlCreateIndex.c_str(), {});
327 EXPECT_EQ(res.first, E_OK);
328 for (uint16_t i = 0; i < 10; i++) { // iterate 10 times to insert 10 data
329 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
330 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
331 res = store->Execute(sqlInsert.c_str(), {});
332 EXPECT_EQ(res.first, E_OK);
333 }
334 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
335 EXPECT_NE(resultSet, nullptr);
336
337 bool isStarted = false;
338 bool isAtFirstRow = false;
339 EXPECT_EQ(E_OK, resultSet->IsStarted(isStarted));
340 EXPECT_EQ(E_OK, resultSet->IsAtFirstRow(isAtFirstRow));
341 EXPECT_EQ(false, isStarted);
342 EXPECT_EQ(false, isAtFirstRow);
343
344 EXPECT_EQ(E_OK, resultSet->GoToNextRow());
345 EXPECT_EQ(E_OK, resultSet->IsStarted(isStarted));
346 EXPECT_EQ(E_OK, resultSet->IsAtFirstRow(isAtFirstRow));
347 EXPECT_EQ(true, isStarted);
348 EXPECT_EQ(true, isAtFirstRow);
349
350 std::vector<std::string> colNames = {};
351 resultSet->GetAllColumnNames(colNames);
352 EXPECT_EQ(colNames.size(), 2); // Expect 2 columns
353 return resultSet;
354 }
355
356 /**
357 @tc.name: RdbStore_Execute_007
358 @tc.desc: test RdbStore Execute in vector mode
359 @tc.type: FUNC
360 */
361 constexpr uint16_t SELECT_RES_NUM = 3;
362 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_007, TestSize.Level1)
363 {
364 std::string sqlSelect = "SELECT * FROM test ORDER BY repr <-> '" +
365 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "' LIMIT " +
366 std::to_string(SELECT_RES_NUM) + ";";
367 std::shared_ptr<ResultSet> resultSet = CreateIdxAndSelect(sqlSelect);
368 int columnIndex = 0;
369 size_t vectSize = 0;
370 ValueObject::FloatVector vecs = {};
371 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
372 EXPECT_EQ(columnIndex, 1);
373
374 ColumnType colType = ColumnType::TYPE_NULL;
375 EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
376 EXPECT_EQ(ColumnType::TYPE_FLOAT32_ARRAY, colType);
377
378 EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
379 EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
380 EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
381 EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
382
383 int idVal = 0;
384 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("id", columnIndex));
385 EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, idVal));
386
387 int ret = E_OK;
388 int resCnt = 0;
389 vecs.clear();
390 while ((ret = resultSet->GoToNextRow() == E_OK)) {
391 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
392 EXPECT_EQ(1, columnIndex); // 1是向量的列
393
394 resultSet->GetColumnType(columnIndex, colType);
395 EXPECT_EQ(colType, ColumnType::TYPE_FLOAT32_ARRAY);
396
397 EXPECT_EQ(E_COLUMN_OUT_RANGE, resultSet->GetColumnType(100, colType)); // 100是一个不存在的col, 所以预期返回NULL
398
399 EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
400 EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
401 EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
402 EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
403 resCnt++;
404 }
405 EXPECT_EQ(SELECT_RES_NUM - 1, resCnt);
406 EXPECT_EQ(E_OK, resultSet->Close());
407 std::pair<int32_t, ValueObject> res = RdbExecuteRdTest::store->Execute("DROP TABLE test;");
408 EXPECT_EQ(E_OK, res.first);
409 }
410
411 /**
412 @tc.name: RdbStore_Execute_008
413 @tc.desc: test RdbStore Execute in vector mode
414 @tc.type: FUNC
415 */
416 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_008, TestSize.Level1)
417 {
418 std::string sqlSelect = "SELECT * FROM test;";
419 std::shared_ptr<ResultSet> resultSet = CreateIdxAndSelect(sqlSelect);
420 int columnIndex = 0;
421 size_t vectSize = 0;
422 ValueObject::FloatVector vecs = {};
423 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
424 EXPECT_EQ(columnIndex, 1);
425
426 ColumnType colType = ColumnType::TYPE_NULL;
427 EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
428 EXPECT_EQ(ColumnType::TYPE_FLOAT32_ARRAY, colType);
429
430 int idVal = 0;
431 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("id", columnIndex));
432 EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, idVal));
433
434 int ret = E_OK;
435 int resCnt = 1;
436 vecs.clear();
437 EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
438 while ((ret = resultSet->GoToNextRow() == E_OK)) {
439 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
440 EXPECT_EQ(1, columnIndex); // 1是向量的列, columnIndex期望是1
441
442 resultSet->GetColumnType(columnIndex, colType);
443 EXPECT_EQ(colType, ColumnType::TYPE_FLOAT32_ARRAY);
444
445 EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
446 EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
447 EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
448 EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
449 resCnt++;
450 }
451 EXPECT_EQ(10, resCnt); // 期待resCnt是10
452 EXPECT_EQ(E_OK, resultSet->Close());
453 std::pair<int32_t, ValueObject> res = RdbExecuteRdTest::store->Execute("DROP TABLE test;");
454 EXPECT_EQ(E_OK, res.first);
455 }
456
457 /**
458 @tc.name: RdbStore_Execute_009
459 @tc.desc: test RdbStore Execute in vector mode
460 @tc.type: FUNC
461 */
462 constexpr uint32_t EXPEC_INSERT_CNT_FOR = 10;
463 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_009, TestSize.Level1)
464 {
465 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
466
467 std::string sqlCreateTable =
468 "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
469 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
470 std::string sqlSelect = "SELECT * FROM test;";
471
472 std::pair<int32_t, ValueObject> res = {};
473 res = store->Execute(sqlCreateTable.c_str(), {});
474 EXPECT_EQ(res.first, E_OK);
475
476 std::pair<int32_t, int64_t> trx = {};
477 trx = store->BeginTrans();
478 EXPECT_EQ(trx.first, E_OK);
479
480 for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
481 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
482 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
483 res = store->Execute(sqlInsert.c_str(), {}, trx.second);
484 EXPECT_EQ(res.first, E_OK);
485 }
486 EXPECT_EQ(E_OK, store->Commit(trx.second));
487
488 res = store->Execute(sqlCreateIndex.c_str(), {});
489 EXPECT_EQ(res.first, E_OK);
490
491 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
492 EXPECT_NE(resultSet, nullptr);
493
494 int32_t resCnt = 0;
495 while (resultSet->GoToNextRow() == E_OK) {
496 resCnt++;
497 }
498 EXPECT_EQ(EXPEC_INSERT_CNT_FOR, resCnt);
499 }
500
501 /**
502 @tc.name: RdbStore_Execute_010
503 @tc.desc: test RdbStore Execute in vector mode
504 @tc.type: FUNC
505 */
506 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_010, TestSize.Level1)
507 {
508 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
509
510 std::string sqlCreateTable =
511 "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
512 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
513 std::string sqlSelect = "SELECT * FROM test;";
514
515 std::pair<int32_t, ValueObject> res = {};
516 res = store->Execute(sqlCreateTable.c_str(), {});
517 EXPECT_EQ(res.first, E_OK);
518
519 for (uint16_t i = 0; i < 10; i++) {
520 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
521 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
522 res = store->Execute(sqlInsert.c_str(), {}, 0);
523 EXPECT_EQ(res.first, E_OK);
524 }
525
526 std::pair<int32_t, int64_t> trx = {};
527 trx = store->BeginTrans();
528 EXPECT_EQ(trx.first, E_OK);
529 EXPECT_NE(trx.second, 0);
530
531 for (uint16_t i = 0; i < 10; i++) {
532 std::string sqlDelete = "DELETE FROM test WHERE id = 1000000" + std::to_string(i) + ";";
533 res = store->Execute(sqlDelete.c_str(), {}, trx.second);
534 EXPECT_EQ(res.first, E_OK);
535 }
536
537 EXPECT_EQ(E_OK, store->Commit(trx.second));
538
539 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
540 EXPECT_NE(resultSet, nullptr);
541 EXPECT_EQ(E_ROW_OUT_RANGE, resultSet->GoToNextRow());
542 }
543
544 /**
545 @tc.name: RdbStore_Execute_011
546 @tc.desc: test RdbStore Execute in vector mode
547 @tc.type: FUNC
548 */
549 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_011, TestSize.Level1)
550 {
551 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
552
553 std::string sqlCreateTable = "CREATE TABLE test(id int primary key, day int, repr floatvector(" +
554 std::to_string(LARGE_ANN_INDEX_DIM) + "));";
555 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
556 std::string sqlSelect = "SELECT * FROM test;";
557
558 std::pair<int32_t, ValueObject> res = {};
559 res = store->Execute(sqlCreateTable.c_str(), {});
560 EXPECT_EQ(res.first, E_OK);
561
562 for (uint16_t i = 0; i < 10; i++) {
563 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", 0, '" +
564 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
565 res = store->Execute(sqlInsert.c_str(), {}, 0);
566 EXPECT_EQ(res.first, E_OK);
567 }
568
569 std::pair<int32_t, int64_t> trx = {};
570 trx = store->BeginTrans();
571 EXPECT_EQ(trx.first, E_OK);
572 EXPECT_NE(trx.second, 0);
573
574 for (uint16_t i = 0; i < 10; i++) {
575 std::string sqlDelete = "UPDATE test SET day = 1 WHERE id = 1000000" + std::to_string(i) + ";";
576 res = store->Execute(sqlDelete.c_str(), {}, trx.second);
577 EXPECT_EQ(res.first, E_OK);
578 }
579
580 EXPECT_EQ(E_OK, store->Commit(trx.second));
581 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
582 EXPECT_NE(resultSet, nullptr);
583
584 uint32_t resCnt = 0;
585 int64_t intVal = 0;
586 int columnIndex = 0;
587 ColumnType colType = ColumnType::TYPE_NULL;
588
589 while (resultSet->GoToNextRow() == E_OK) {
590 std::vector<std::string> colNames = {};
591 resultSet->GetAllColumnNames(colNames);
592 EXPECT_STREQ("id", colNames[0].c_str());
593 EXPECT_STREQ("day", colNames[1].c_str());
594 EXPECT_STREQ("repr", colNames[2].c_str());
595
596 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("day", columnIndex));
597 EXPECT_EQ(1, columnIndex); // 1是day的列
598
599 EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
600 EXPECT_EQ(colType, ColumnType::TYPE_INTEGER);
601
602 EXPECT_EQ(
603 E_COLUMN_OUT_RANGE, resultSet->GetColumnType(100, colType)); // 100是一个不存在的col, 所以预期返回错误码
604 EXPECT_EQ(colType, ColumnType::TYPE_INTEGER); // 值不会被更新
605
606 EXPECT_EQ(E_OK, resultSet->GetLong(columnIndex, intVal));
607 EXPECT_EQ(1, intVal);
608
609 resCnt++;
610 }
611 }
612
613 /**
614 @tc.name: RdbStore_Execute_012
615 @tc.desc: test RdbStore Execute in vector mode
616 @tc.type: FUNC
617 */
618 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_012, TestSize.Level1)
619 {
620 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
621
622 std::string sqlCreateTable =
623 "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
624 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
625 std::string sqlSelect = "SELECT * FROM test;";
626
627 std::pair<int32_t, ValueObject> res = {};
628 res = store->Execute(sqlCreateTable.c_str(), {});
629 EXPECT_EQ(res.first, E_OK);
630
631 std::pair<int32_t, int64_t> trx = {};
632 trx = store->BeginTrans();
633 EXPECT_EQ(trx.first, E_OK);
634
635 for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
636 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
637 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
638 res = store->Execute(sqlInsert.c_str(), {}, trx.second);
639 EXPECT_EQ(res.first, E_OK);
640 }
641 EXPECT_EQ(E_OK, store->RollBack(trx.second));
642
643 res = store->Execute(sqlCreateIndex.c_str(), {});
644 EXPECT_EQ(res.first, E_OK);
645
646 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
647 EXPECT_NE(resultSet, nullptr);
648
649 int32_t resCnt = 0;
650 while (resultSet->GoToNextRow() == E_OK) {
651 resCnt++;
652 }
653 EXPECT_EQ(0, resCnt);
654 }
655
656 /**
657 @tc.name: RdbStore_Execute_013
658 @tc.desc: test RdbStore Execute in vector mode
659 @tc.type: FUNC
660 */
661 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_013, TestSize.Level1)
662 {
663 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
664
665 std::string sqlCreateTable =
666 "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
667 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
668 std::string sqlSelect = "SELECT * FROM test;";
669
670 std::pair<int32_t, ValueObject> res = {};
671 res = store->Execute(sqlCreateTable.c_str(), {});
672 EXPECT_EQ(res.first, E_OK);
673
674 std::pair<int32_t, int64_t> trx = {};
675 trx = store->BeginTrans();
676 EXPECT_EQ(trx.first, E_OK);
677
678 for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
679 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
680 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
681 res = store->Execute(sqlInsert.c_str(), {}, trx.second);
682 EXPECT_EQ(res.first, E_OK);
683 }
684 EXPECT_EQ(E_OK, store->RollBack(trx.second));
685
686 res = store->Execute(sqlCreateIndex.c_str(), {});
687 EXPECT_EQ(res.first, E_OK);
688
689 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
690 EXPECT_NE(resultSet, nullptr);
691
692 int32_t resCnt = 0;
693 while (resultSet->GoToNextRow() == E_OK) {
694 resCnt++;
695 }
696 EXPECT_EQ(0, resCnt);
697 }
698
699 /**
700 @tc.name: RdbStore_Execute_014
701 @tc.desc: test RdbStore Execute update in transaction
702 @tc.type: FUNC
703 */
704 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_014, TestSize.Level1)
705 {
706 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
707
708 std::string sqlCreateTable = "CREATE TABLE test(id int primary key, age int, repr floatvector(" +
709 std::to_string(LARGE_ANN_INDEX_DIM) + "));";
710 std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
711 std::string sqlSelect = "SELECT * FROM test;";
712
713 std::pair<int32_t, ValueObject> res = {};
714 res = store->Execute(sqlCreateTable.c_str(), {});
715 EXPECT_EQ(res.first, E_OK);
716
717 for (uint16_t i = 0; i < 10; i++) {
718 std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", " + std::to_string(i) +
719 ", '" + GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
720 res = store->Execute(sqlInsert.c_str(), {}, 0);
721 EXPECT_EQ(res.first, E_OK);
722 }
723
724 std::pair<int32_t, int64_t> trx = {};
725 trx = store->BeginTrans();
726 EXPECT_EQ(trx.first, E_OK);
727 EXPECT_NE(trx.second, 0);
728
729 for (uint16_t i = 0; i < 10; i++) {
730 std::string sqlUpdate = "UPDATE test SET age = 1 WHERE id = 1000000" + std::to_string(i) + ";";
731 res = store->Execute(sqlUpdate.c_str(), {}, trx.second);
732 EXPECT_EQ(res.first, E_OK);
733 }
734
735 EXPECT_EQ(E_OK, store->Commit(trx.second));
736 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
737 int columnIndex = 0;
738 while (resultSet->GoToNextRow() == E_OK) {
739 std::vector<std::string> colNames = {};
740 resultSet->GetAllColumnNames(colNames);
741 EXPECT_STREQ("id", colNames[0].c_str());
742 EXPECT_STREQ("age", colNames[1].c_str());
743 EXPECT_STREQ("repr", colNames[2].c_str());
744
745 EXPECT_EQ(E_OK, resultSet->GetColumnIndex("age", columnIndex));
746 EXPECT_EQ(1, columnIndex); // 1是age的列
747 int result;
748 EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, result));
749 EXPECT_EQ(result, 1);
750 }
751 }
752
753 /**
754 @tc.name: RdbStore_Execute_014
755 @tc.desc: test RdbStore Execute Repeatly Get Transaction
756 @tc.type: FUNC
757 */
758 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_015, TestSize.Level1)
759 {
760 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
761
762 std::string sqlCreateTable = "CREATE TABLE test2 (id INTEGER PRIMARY KEY, repr INTEGER);";
763 std::string sqlSelect = "SELECT * FROM test2;";
764
765 std::pair<int32_t, ValueObject> res = {};
766 res = store->Execute(sqlCreateTable.c_str(), {});
767 EXPECT_EQ(res.first, E_OK);
768
769 for (uint32_t i = 0; i < 10; i++) {
770 std::pair<int32_t, int64_t> trx = {};
771 trx = store->BeginTrans();
772 EXPECT_EQ(trx.first, E_OK);
773 std::string sqlInsert = "INSERT INTO test2 VALUES(" + std::to_string(i) + ", 1);";
774 res = store->Execute(sqlInsert.c_str(), {}, trx.second);
775 EXPECT_EQ(res.first, E_OK);
776 EXPECT_EQ(E_OK, store->Commit(trx.second));
777 }
778
779 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
780 EXPECT_NE(resultSet, nullptr);
781
782 int32_t resCnt = 0;
783 while (resultSet->GoToNextRow() == E_OK) {
784 int rowIdx = 0;
785 resultSet->GetRowIndex(rowIdx);
786 EXPECT_EQ(resCnt, rowIdx);
787 resCnt++;
788 }
789 EXPECT_EQ(10, resCnt);
790 }
791
792 /**
793 @tc.name: RdbStore_Execute_016
794 @tc.desc: test RdbStore Execute Repeatly Get Transaction
795 @tc.type: FUNC
796 */
797 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_016, TestSize.Level1)
798 {
799 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
800 std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test1 (docId Text, str Text, repr floatvector(4));";
801 std::string sqlCreateIdx = "CREATE INDEX test_idx ON test1 USING GSIVFFLAT(repr L2);";
802 std::string sqlSelect = "SELECT * FROM test1 ORDER BY repr <-> '[1.0, 2.0, 3.0, 4.0]' LIMIT 2;";
803
804 std::pair<int32_t, ValueObject> res = store->Execute(sqlCreateTable.c_str(), {});
805 EXPECT_EQ(res.first, E_OK);
806 res = store->Execute(sqlCreateIdx.c_str(), {});
807 EXPECT_EQ(res.first, E_OK);
808
809 std::vector<std::vector<float>> vectorSamples = { { 1.0, 2.0, 3.0, 4.0 }, { 10, 20, 30, 40 },
810 { 100, 200, 300, 400 } };
811
812 for (uint32_t i = 0; i < vectorSamples.size(); i++) {
813 std::pair<int32_t, int64_t> trx = {};
814 trx = store->BeginTrans();
815 EXPECT_EQ(trx.first, E_OK);
816 std::string sqlInsert = "insert into test1 values('" + std::to_string(i) + "', ?, ?);";
817 ValueObject floatObj = ValueObject(vectorSamples[i]);
818 ValueObject::FloatVector vector = {};
819 EXPECT_EQ(floatObj.GetVecs(vector), E_OK);
820 EXPECT_EQ(vectorSamples[i].size(), vector.size());
821 for (size_t j = 0; j < vector.size(); j++) {
822 EXPECT_FLOAT_EQ(vectorSamples[i][j], vector[j]);
823 }
824
825 res = store->Execute(sqlInsert.c_str(), { ValueObject(std::string("textVal")), floatObj }, trx.second);
826 EXPECT_EQ(res.first, E_OK);
827 EXPECT_EQ(E_OK, store->Commit(trx.second));
828 }
829
830 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
831 EXPECT_NE(resultSet, nullptr);
832
833 int32_t resCnt = 0;
834 while (resultSet->GoToNextRow() == E_OK) {
835 std::string primaryStrVal = "";
836 std::string textStrVal = "";
837 ValueObject::FloatVector floatVector = {};
838 resultSet->GetString(0, primaryStrVal); // 0 is the index of primary String column in select projection
839 resultSet->GetString(1, textStrVal); // 1 is the index of TEXT column in select projection
840 resultSet->GetFloat32Array(2, floatVector); // 2 is the index of vector column in select projection
841 EXPECT_STREQ(std::to_string(resCnt).c_str(), primaryStrVal.c_str());
842 EXPECT_STREQ("textVal", textStrVal.c_str());
843 EXPECT_EQ(vectorSamples[resCnt].size(), floatVector.size());
844 for (size_t i = 0; i < floatVector.size(); i++) {
845 EXPECT_FLOAT_EQ(vectorSamples[resCnt][i], floatVector[i]);
846 }
847 resCnt++;
848 }
849 EXPECT_EQ(2, resCnt); // Expect 2 result due to limit 2
850 }
851
852 /**
853 @tc.name: RdbStore_Execute_017
854 @tc.desc: test RdbStore Execute Getting or Setting version
855 @tc.type: FUNC
856 */
857 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_017, TestSize.Level1)
858 {
859 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
860 int versionToGet = 0;
861 int versionToSet = 1;
862 EXPECT_EQ(E_OK, store->SetVersion(versionToSet));
863 EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
864 EXPECT_EQ(versionToGet, versionToSet);
865
866 std::string sqlPragmaSetVersion = "PRAGMA user_version = 3";
867 std::pair<int32_t, ValueObject> res = {};
868 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
869 EXPECT_EQ(res.first, E_OK);
870 EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
871 EXPECT_EQ(versionToGet, 3); // 3 is set by sql
872
873 sqlPragmaSetVersion = "PRAGMA user_version = 4;";
874 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
875 EXPECT_EQ(res.first, E_OK);
876 EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
877 EXPECT_EQ(versionToGet, 4); // 4 is set by sql
878
879 sqlPragmaSetVersion = "PRAGMA user_version = 35678";
880 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
881 EXPECT_EQ(res.first, E_OK);
882 EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
883 EXPECT_EQ(versionToGet, 35678); // 35678 is set by sql
884
885 sqlPragmaSetVersion = "PRAGMA user_version = asdfds";
886 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
887 EXPECT_EQ(res.first, E_INCORRECT_SQL);
888
889 sqlPragmaSetVersion = "PRAGMA user_version = ;";
890 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
891 EXPECT_EQ(res.first, E_INCORRECT_SQL);
892
893 sqlPragmaSetVersion = "PRAGMA user_version = 456 ";
894 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
895 EXPECT_EQ(res.first, E_OK);
896 EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
897 EXPECT_EQ(versionToGet, 456); // 456 is set by sql
898
899 sqlPragmaSetVersion = "PRAGMA user_version = 456 1231 ";
900 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
901 EXPECT_EQ(res.first, E_INCORRECT_SQL);
902
903 sqlPragmaSetVersion = "PRAGMA user_version = 456 1asdf231 ";
904 res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
905 EXPECT_EQ(res.first, E_INCORRECT_SQL);
906 }
907
908 /**
909 @tc.name: RdbStore_Execute_018
910 @tc.desc: test RdbStore create encrypted db from non-encrypted db
911 @tc.type: FUNC
912 */
913 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_018, TestSize.Level1)
914 {
915 RdbExecuteRdTest::store = nullptr;
916 bool isOriginDbEncrypt = GetParam();
917
918 RdbStoreConfig config(RdbExecuteRdTest::databaseName);
919 config.SetIsVector(true);
920 config.SetEncryptStatus(!isOriginDbEncrypt);
921 ExecuteTestOpenRdCallback helper;
922 int errCode = E_OK;
923 RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
924 // open encrypted-db in un-encrypted mode is not allowed
925 // open un-encrypted db in encrypted-db is allowed
926 EXPECT_TRUE((isOriginDbEncrypt && RdbExecuteRdTest::store == nullptr) ||
927 (!isOriginDbEncrypt && RdbExecuteRdTest::store != nullptr));
928 if (!isOriginDbEncrypt) {
929 RdbExecuteRdTest::store = nullptr;
930 config.SetEncryptStatus(false); // open encrypted-db update from un-encrypt in un-encrypted mode is not allowed
931 RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
932 EXPECT_EQ(store, nullptr);
933 }
934 }
935
936 /**
937 * @tc.name: RdbStore_Execute_019
938 * @tc.desc: test RdbStore Execute in vector mode
939 * @tc.type: FUNC
940 */
941 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_019, TestSize.Level1)
942 {
943 std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
944 const char *sqlCreateTable = "CREATE TABLE vecTable(inode int primary key, embedding floatvector(4));";
945 auto res = store->Execute(sqlCreateTable);
946 EXPECT_EQ(E_OK, res.first);
947
948 const char *sqlCreateIndex = "CREATE INDEX diskann_cos_idx ON vecTable USING GSDISKANN(embedding COSINE);";
949 res = store->Execute(sqlCreateIndex);
950 EXPECT_EQ(E_OK, res.first);
951
952 std::string sqlInsert = "INSERT INTO vecTable VALUES(1, '[1,2,-3,4]'), (2, '[2,2,-3,4]'), (3, '[3,2,3,4]'), (4, "
953 "'[4,2,3,4]'), (5, '[5,2,-3,4]')";
954 for (int i = 6; i <= 1000; i++) {
955 std::string tmpStr = ", (" + std::to_string(i) + ", '[" + std::to_string(dis(g_gen)) + "," +
956 std::to_string(dis(g_gen)) + "," + std::to_string(dis(g_gen)) + "," +
957 std::to_string(dis(g_gen)) + "]')";
958 sqlInsert.append(tmpStr);
959 }
960 sqlInsert.append(";");
961 res = store->Execute(sqlInsert);
962 EXPECT_EQ(E_OK, res.first);
963
964 const char *sqlSelect = "SELECT inode, embedding, embedding<=>'[1,1,1,1]' AS score FROM vecTable ORDER BY "
965 "embedding<=>'[1,1,1,1]' LIMIT 501;";
966 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect, std::vector<ValueObject>());
967 EXPECT_NE(resultSet, nullptr);
968 int count = 0;
969 resultSet->GetRowCount(count);
970 EXPECT_EQ(count, 299);
971 const char *sqlDelete = "DELETE FROM vecTable";
972 res = store->Execute(sqlDelete);
973 EXPECT_EQ(E_OK, res.first);
974 }
975
976 /* *
977 * @tc.name: Rdb_BackupRestoreTest_001
978 * @tc.desc: backup and restore
979 * @tc.type: FUNC
980 */
981 HWTEST_P(RdbExecuteRdTest, Rdb_BackupRestoreTest_001, TestSize.Level2)
982 {
983 //create new db instance
984 int errCode = E_OK;
985 RdbStoreConfig config(RdbExecuteRdTest::restoreDatabaseName);
986 config.SetIsVector(true);
987 config.SetSecurityLevel(SecurityLevel::S4);
988 config.SetEncryptStatus(GetParam());
989 if (GetParam()) { // check if encrypt
990 config.SetHaMode(HAMode::MAIN_REPLICA);
991 }
992 config.SetAllowRebuild(true);
993 ExecuteTestOpenRdCallback helper;
994 auto store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
995 EXPECT_EQ(errCode, E_OK);
996 EXPECT_NE(store, nullptr);
997
998 std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
999 std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
1000 std::string sqlQuery = "SELECT id FROM test order by repr <-> '[1.1, 0.3, 2.2, 6.6, 1.5, 3.1, 0.6, 0.2]' limit 3;";
1001
1002 std::pair<int32_t, ValueObject> res = {};
1003 res = store->Execute(sqlCreateTable.c_str(), {});
1004 EXPECT_EQ(res.first, E_OK);
1005 res = store->Execute(sqlInsert.c_str(), {});
1006 EXPECT_EQ(res.first, E_OK);
1007
1008 std::vector<uint8_t> encryptKey;
1009 if (GetParam()) {
1010 encryptKey = config.GetEncryptKey();
1011 }
1012
1013 int ret = store->Backup(RdbExecuteRdTest::backupDatabaseName, encryptKey);
1014 EXPECT_EQ(ret, E_OK);
1015
1016 res = store->Execute("delete from test where id = 1;");
1017 EXPECT_EQ(E_OK, res.first);
1018
1019 ret = store->Restore(RdbExecuteRdTest::backupDatabaseName, encryptKey);
1020 EXPECT_EQ(ret, E_OK);
1021
1022 std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery.c_str(), std::vector<ValueObject>());
1023
1024 //check the result
1025 EXPECT_NE(resultSet, nullptr);
1026 EXPECT_EQ(resultSet->GoToNextRow(), E_OK);
1027 std::vector<std::string> colNames = {};
1028 resultSet->GetAllColumnNames(colNames);
1029 EXPECT_EQ(colNames.size(), 1);
1030 int columnIndex = 0;
1031 int intVal = 0;
1032 resultSet->GetColumnIndex("id", columnIndex);
1033 resultSet->GetInt(columnIndex, intVal);
1034 EXPECT_EQ(columnIndex, 0);
1035 EXPECT_EQ(intVal, 1);
1036 EXPECT_EQ(E_OK, resultSet->Close());
1037 res = store->Execute("DROP TABLE test;");
1038 EXPECT_EQ(E_OK, res.first);
1039
1040 RdbHelper::DeleteRdbStore(RdbExecuteRdTest::restoreDatabaseName);
1041 RdbHelper::DeleteRdbStore(RdbExecuteRdTest::backupDatabaseName);
1042 }
1043
1044 /* *
1045 * @tc.name: Rdb_IsUsingArkDataTest_001
1046 * @tc.desc: IsUsingArkData function test
1047 * @tc.type: FUNC
1048 */
1049 HWTEST_P(RdbExecuteRdTest, Rdb_IsUsingArkDataTest_001, TestSize.Level2)
1050 {
1051 EXPECT_EQ(OHOS::NativeRdb::RdbHelper::IsSupportArkDataDb(), true);
1052 }