• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <string>
17 
18 #include "common.h"
19 #include "grd_api_manager.h"
20 #include "rd_utils.h"
21 #include "rdb_errno.h"
22 #include "rdb_helper.h"
23 #include "rdb_open_callback.h"
24 
25 using namespace testing::ext;
26 using namespace OHOS::NativeRdb;
27 
28 class RdbExecuteRdTest : public testing::TestWithParam<bool> {
29 public:
30     static void SetUpTestCase(void);
31     static void TearDownTestCase(void);
32     void SetUp();
33     void TearDown();
34 
35     static const std::string databaseName;
36     static std::shared_ptr<RdbStore> store;
37     static const std::string restoreDatabaseName;
38     static const std::string backupDatabaseName;
39 };
40 
41 INSTANTIATE_TEST_CASE_P(, RdbExecuteRdTest, testing::Values(false, true));
42 
43 const std::string RdbExecuteRdTest::databaseName = RDB_TEST_PATH + "execute_test.db";
44 const std::string RdbExecuteRdTest::restoreDatabaseName = RDB_TEST_PATH + "execute_test_restore.db";
45 const std::string RdbExecuteRdTest::backupDatabaseName = RDB_TEST_PATH + "execute_test_backup.db";
46 std::shared_ptr<RdbStore> RdbExecuteRdTest::store = nullptr;
47 const bool IS_TESTING_PERFORMANCE = false;
48 const int BATCH_TOTAL_SIZE = IS_TESTING_PERFORMANCE ? 12000 : 120;
49 const int BATCH_SIZE = IS_TESTING_PERFORMANCE ? 100 : 10;
50 const int MAX_VARIABLE_NUM = 32766;
51 
52 class ExecuteTestOpenRdCallback : public RdbOpenCallback {
53 public:
54     int OnCreate(RdbStore &store) override;
55     int OnUpgrade(RdbStore &store, int oldVersion, int newVersion) override;
56 };
57 
OnCreate(RdbStore & store)58 int ExecuteTestOpenRdCallback::OnCreate(RdbStore &store)
59 {
60     return E_OK;
61 }
62 
OnUpgrade(RdbStore & store,int oldVersion,int newVersion)63 int ExecuteTestOpenRdCallback::OnUpgrade(RdbStore &store, int oldVersion, int newVersion)
64 {
65     return E_OK;
66 }
67 
SetUpTestCase(void)68 void RdbExecuteRdTest::SetUpTestCase(void)
69 {
70 }
71 
TearDownTestCase(void)72 void RdbExecuteRdTest::TearDownTestCase(void)
73 {
74 }
75 
SetUp(void)76 void RdbExecuteRdTest::SetUp(void)
77 {
78     if (!IsUsingArkData()) {
79         GTEST_SKIP() << "Current testcase is not compatible from current rdb";
80     }
81     int errCode = E_OK;
82     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
83     RdbStoreConfig config(RdbExecuteRdTest::databaseName);
84     config.SetIsVector(true);
85     config.SetEncryptStatus(GetParam());
86     ExecuteTestOpenRdCallback helper;
87     RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
88     EXPECT_NE(RdbExecuteRdTest::store, nullptr);
89     EXPECT_EQ(errCode, E_OK);
90 }
91 
TearDown(void)92 void RdbExecuteRdTest::TearDown(void)
93 {
94     RdbExecuteRdTest::store = nullptr;
95     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
96 }
97 
98 /**
99 @tc.name: RdbStore_Execute_001
100 @tc.desc: test RdbStore Execute in vector mode
101 @tc.type: FUNC
102 */
103 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_001, TestSize.Level1)
104 {
105     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
106 
107     int64_t id = 0;
108     ValuesBucket values;
109     values.PutInt("id", 1);
110     values.PutString("name", std::string("zhangsan"));
111     values.PutInt("age", 18);
112     values.PutDouble("salary", 100.5);
113     values.PutBlob("blobType", std::vector<uint8_t>{ 1, 2, 3 });
114 
115     values.Clear();
116     values.PutInt("id", 2);
117     values.PutString("name", std::string("lisi"));
118     values.PutInt("age", 19);
119     values.PutDouble("salary", 200.5);
120     values.PutBlob("blobType", std::vector<uint8_t>{ 4, 5, 6 });
121 
122     values.Clear();
123     values.PutInt("id", 3);
124     values.PutString("name", std::string("wangyjing"));
125     values.PutInt("age", 20);
126     values.PutDouble("salary", 300.5);
127     values.PutBlob("blobType", std::vector<uint8_t>{ 7, 8, 9 });
128     std::vector bindArgs = std::vector{ ValueObject(std::string("18")), ValueObject(std ::string("20")) };
129 
130     std::string sqlDelNoBind = "DELETE FROM test WHERE age = 19";
131     std::string sqlSelect = "SELECT * FROM test WHERE age = ? OR age = ?";
132     std::string sqlDelete = "DELETE FROM test WHERE age = ? OR age = ?";
133     EXPECT_EQ(store->ExecuteSql(sqlDelete.c_str(), bindArgs), E_NOT_SUPPORT);
134     EXPECT_EQ(store->ExecuteSql(sqlDelNoBind.c_str()), E_NOT_SUPPORT);
135 
136     int64_t count = 0;
137     EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT() FROM test where age = 19"), E_NOT_SUPPORT);
138     EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT() FROM test"), E_NOT_SUPPORT);
139     EXPECT_EQ(store->ExecuteAndGetLong(count, "SELECT COUNT(*) FROM test"), E_NOT_SUPPORT);
140     EXPECT_EQ(store->Insert(id, "test", values), E_NOT_SUPPORT);
141 }
142 
143 /**
144 @tc.name: RdbStore_Execute_002
145 @tc.desc: test RdbStore Execute in vector mode
146 @tc.type: FUNC
147 */
148 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_002, TestSize.Level1)
149 {
150     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
151     std::pair<int, uint64_t> res1 = {};
152     std::pair<int, uint64_t> res2 = {};
153     res1 = store->BeginTrans();
154     EXPECT_EQ(res1.first, E_OK);
155     EXPECT_NE(res1.second, 0);
156     res2 = store->BeginTrans();
157     EXPECT_EQ(res2.first, E_OK);
158     EXPECT_NE(res2.second, 0);
159     EXPECT_EQ(store->RollBack(res1.second), E_OK);
160     EXPECT_EQ(store->Commit(res2.second), E_OK);
161 }
162 
163 /**
164 @tc.name: RdbStore_Execute_003
165 @tc.desc: test RdbStore Execute in vector mode. Repeatly require trx.
166 @tc.type: FUNC
167 */
168 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_003, TestSize.Level1)
169 {
170     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
171     std::vector<std::pair<int, uint64_t>> results = {};
172     for (uint32_t i = 0; i < 100; i++) { // Get 100 trxs
173         std::pair<int, uint64_t> res = {};
174         res = store->BeginTrans();
175         EXPECT_TRUE((res.first == E_OK) || (res.first == E_DATABASE_BUSY));
176         results.push_back(res);
177     }
178     for (uint32_t i = 0; i < 100; i++) { // Commit 100 trxs
179         if (results[i].first == E_OK) {
180             EXPECT_EQ(store->RollBack(results[i].second), E_OK);
181         }
182     }
183 }
184 
185 /**
186 @tc.name: RdbStore_Execute_004
187 @tc.desc: test RdbStore Execute in vector mode
188 @tc.type: FUNC
189 */
190 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_004, TestSize.Level1)
191 {
192     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
193     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
194     std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
195     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;";
196 
197     std::pair<int32_t, ValueObject> res = {};
198     res = store->Execute(sqlCreateTable.c_str(), {}, 0);
199     EXPECT_EQ(res.first, E_OK);
200 
201     std::pair<int, uint64_t> res1 = {};
202     res1 = store->BeginTrans();
203     EXPECT_EQ(res1.first, E_OK);
204     EXPECT_NE(res1.second, 0);
205 
206     res = store->Execute(sqlInsert.c_str(), {}, res1.second);
207     EXPECT_EQ(res.first, E_OK);
208     EXPECT_EQ(store->Commit(res1.second), E_OK);
209     res = store->Execute("DROP TABLE test;", {}, 0);
210     EXPECT_EQ(res.first, E_OK);
211 }
212 
213 /**
214 @tc.name: RdbStore_Execute_005
215 @tc.desc: test RdbStore Execute in vector mode
216 @tc.type: FUNC
217 */
218 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_005, TestSize.Level1)
219 {
220     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
221     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
222     std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
223     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;";
224 
225     std::pair<int32_t, ValueObject> res = {};
226     res = store->Execute(sqlCreateTable.c_str(), {});
227     EXPECT_EQ(res.first, E_OK);
228     res = store->Execute(sqlInsert.c_str(), {});
229     EXPECT_EQ(res.first, E_OK);
230     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery.c_str(), std::vector<ValueObject>());
231     EXPECT_NE(resultSet, nullptr);
232     EXPECT_EQ(resultSet->GoToNextRow(), E_OK);
233     std::vector<std::string> colNames = {};
234     resultSet->GetAllColumnNames(colNames);
235     EXPECT_EQ(colNames.size(), 1);
236     int columnIndex = 0;
237     int intVal = 0;
238     resultSet->GetColumnIndex("id", columnIndex);
239     resultSet->GetInt(columnIndex, intVal);
240     EXPECT_EQ(columnIndex, 0);
241     EXPECT_EQ(intVal, 1);
242     EXPECT_EQ(E_OK, resultSet->Close());
243     res = store->Execute("DROP TABLE test;");
244     EXPECT_EQ(E_OK, res.first);
245 }
246 
247 /**
248 @tc.name: RdbStore_Execute_006
249 @tc.desc: test RdbStore Execute in vector mode
250 @tc.type: FUNC
251 */
252 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_006, TestSize.Level1)
253 {
254     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
255     std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
256     std::string sqlBeginTrans = "begin;";
257 
258     std::string dbPath = "/data/test/execute_test1.db";
259     std::string configStr =
260     "{\"pageSize\":8, \"crcCheckEnable\":0, \"redoFlushByTrx\":1, \"bufferPoolSize\":10240,"
261     "\"sharedModeEnable\":1, \"metaInfoBak\":1, \"maxConnNum\":500, \"defaultIsolationLevel\":2 }";
262 
263     GRD_DB *db2 = nullptr;
264     GRD_DB *db4 = nullptr;
265     EXPECT_EQ(RdUtils::RdDbOpen(dbPath.c_str(), configStr.c_str(),
266         GRD_DB_OPEN_CREATE | GRD_DB_OPEN_IGNORE_DATA_CORRPUPTION, &db2), E_OK);
267     EXPECT_EQ(RdUtils::RdDbOpen(dbPath.c_str(), configStr.c_str(),
268         GRD_DB_OPEN_CREATE | GRD_DB_OPEN_IGNORE_DATA_CORRPUPTION, &db4), E_OK);
269 
270     GRD_SqlStmt *stmt = nullptr;
271     EXPECT_EQ(RdUtils::RdSqlPrepare(db2, sqlCreateTable.c_str(), sqlCreateTable.size(), &stmt, nullptr), E_OK);
272     EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
273     EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
274 
275     stmt = nullptr;
276     EXPECT_EQ(RdUtils::RdSqlPrepare(db4, sqlBeginTrans.c_str(), sqlBeginTrans.size(), &stmt, nullptr), E_OK);
277     EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
278     EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
279 
280     stmt = nullptr;
281     EXPECT_EQ(RdUtils::RdSqlPrepare(db4, sqlInsert.c_str(), sqlInsert.size(), &stmt, nullptr), E_OK);
282     EXPECT_EQ(RdUtils::RdSqlStep(stmt), E_OK);
283     EXPECT_EQ(RdUtils::RdSqlFinalize(stmt), E_OK);
284     EXPECT_EQ(RdUtils::RdDbClose(db2, 0), E_OK);
285     EXPECT_EQ(RdUtils::RdDbClose(db4, 0), E_OK);
286 }
287 
GetRandVector(uint32_t maxElementNum,uint16_t dim)288 std::string GetRandVector(uint32_t maxElementNum, uint16_t dim)
289 {
290     if (maxElementNum == 0) {
291         return "";
292     }
293     unsigned int randomNumberSeed = time(nullptr);
294     std::string res = "[";
295     for (uint16_t i = 0; i < dim; i++) {
296         uint32_t intPart = (rand_r(&randomNumberSeed) % maxElementNum);
297         intPart += 1;
298         uint32_t tenths = (rand_r(&randomNumberSeed) % 10); // 10是用来限制小数点后的数字不能超过10
299         res += std::to_string(intPart);
300         res += ".";
301         res += std::to_string(tenths);
302         res += ", ";
303     }
304     res.pop_back();
305     res.pop_back();
306     res += "]";
307     return res;
308 }
309 
310 constexpr uint32_t MAX_INT_PART = 10;
311 constexpr uint16_t LARGE_ANN_INDEX_DIM = 8;
CreateIdxAndSelect(std::string & sqlSelect)312 std::shared_ptr<ResultSet> CreateIdxAndSelect(std::string &sqlSelect)
313 {
314     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
315 
316     std::string sqlCreateTable =
317         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
318     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
319 
320     std::pair<int32_t, ValueObject> res = {};
321     res = store->Execute(sqlCreateTable.c_str(), {});
322     EXPECT_EQ(res.first, E_OK);
323     res = store->Execute(sqlCreateIndex.c_str(), {});
324     EXPECT_EQ(res.first, E_OK);
325     for (uint16_t i = 0; i < 10; i++) { // iterate 10 times to insert 10 data
326         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
327                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
328         res = store->Execute(sqlInsert.c_str(), {});
329         EXPECT_EQ(res.first, E_OK);
330     }
331     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
332     EXPECT_NE(resultSet, nullptr);
333 
334     bool isStarted = false;
335     bool isAtFirstRow = false;
336     EXPECT_EQ(E_OK, resultSet->IsStarted(isStarted));
337     EXPECT_EQ(E_OK, resultSet->IsAtFirstRow(isAtFirstRow));
338     EXPECT_EQ(false, isStarted);
339     EXPECT_EQ(false, isAtFirstRow);
340 
341     EXPECT_EQ(E_OK, resultSet->GoToNextRow());
342     EXPECT_EQ(E_OK, resultSet->IsStarted(isStarted));
343     EXPECT_EQ(E_OK, resultSet->IsAtFirstRow(isAtFirstRow));
344     EXPECT_EQ(true, isStarted);
345     EXPECT_EQ(true, isAtFirstRow);
346 
347     std::vector<std::string> colNames = {};
348     resultSet->GetAllColumnNames(colNames);
349     EXPECT_EQ(colNames.size(), 2); // Expect 2 columns
350     return resultSet;
351 }
352 
353 /**
354 @tc.name: RdbStore_Execute_007
355 @tc.desc: test RdbStore Execute in vector mode
356 @tc.type: FUNC
357 */
358 constexpr uint16_t SELECT_RES_NUM = 3;
359 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_007, TestSize.Level1)
360 {
361     std::string sqlSelect = "SELECT * FROM test ORDER BY repr <-> '" +
362                             GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "' LIMIT " +
363                             std::to_string(SELECT_RES_NUM) + ";";
364     std::shared_ptr<ResultSet> resultSet = CreateIdxAndSelect(sqlSelect);
365     int columnIndex = 0;
366     size_t vectSize = 0;
367     ValueObject::FloatVector vecs = {};
368     EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
369     EXPECT_EQ(columnIndex, 1);
370 
371     ColumnType colType = ColumnType::TYPE_NULL;
372     EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
373     EXPECT_EQ(ColumnType::TYPE_FLOAT32_ARRAY, colType);
374 
375     EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
376     EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
377     EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
378     EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
379 
380     int idVal = 0;
381     EXPECT_EQ(E_OK, resultSet->GetColumnIndex("id", columnIndex));
382     EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, idVal));
383 
384     int ret = E_OK;
385     int resCnt = 0;
386     vecs.clear();
387     while ((ret = resultSet->GoToNextRow() == E_OK)) {
388         EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
389         EXPECT_EQ(1, columnIndex); // 1是向量的列
390 
391         resultSet->GetColumnType(columnIndex, colType);
392         EXPECT_EQ(colType, ColumnType::TYPE_FLOAT32_ARRAY);
393 
394         EXPECT_EQ(E_COLUMN_OUT_RANGE, resultSet->GetColumnType(100, colType)); // 100是一个不存在的col, 所以预期返回NULL
395 
396         EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
397         EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
398         EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
399         EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
400         resCnt++;
401     }
402     EXPECT_EQ(SELECT_RES_NUM - 1, resCnt);
403     EXPECT_EQ(E_OK, resultSet->Close());
404     std::pair<int32_t, ValueObject> res = RdbExecuteRdTest::store->Execute("DROP TABLE test;");
405     EXPECT_EQ(E_OK, res.first);
406 }
407 
408 /**
409 @tc.name: RdbStore_Execute_008
410 @tc.desc: test RdbStore Execute in vector mode
411 @tc.type: FUNC
412 */
413 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_008, TestSize.Level1)
414 {
415     std::string sqlSelect = "SELECT * FROM test;";
416     std::shared_ptr<ResultSet> resultSet = CreateIdxAndSelect(sqlSelect);
417     int columnIndex = 0;
418     size_t vectSize = 0;
419     ValueObject::FloatVector vecs = {};
420     EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
421     EXPECT_EQ(columnIndex, 1);
422 
423     ColumnType colType = ColumnType::TYPE_NULL;
424     EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
425     EXPECT_EQ(ColumnType::TYPE_FLOAT32_ARRAY, colType);
426 
427     int idVal = 0;
428     EXPECT_EQ(E_OK, resultSet->GetColumnIndex("id", columnIndex));
429     EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, idVal));
430 
431     int ret = E_OK;
432     int resCnt = 1;
433     vecs.clear();
434     EXPECT_EQ(E_OK, resultSet->GoToFirstRow());
435     while ((ret = resultSet->GoToNextRow() == E_OK)) {
436         EXPECT_EQ(E_OK, resultSet->GetColumnIndex("repr", columnIndex));
437         EXPECT_EQ(1, columnIndex); // 1是向量的列, columnIndex期望是1
438 
439         resultSet->GetColumnType(columnIndex, colType);
440         EXPECT_EQ(colType, ColumnType::TYPE_FLOAT32_ARRAY);
441 
442         EXPECT_EQ(E_OK, resultSet->GetFloat32Array(columnIndex, vecs));
443         EXPECT_EQ(E_OK, resultSet->GetSize(columnIndex, vectSize));
444         EXPECT_EQ(vecs.size(), LARGE_ANN_INDEX_DIM);
445         EXPECT_EQ(sizeof(float) * LARGE_ANN_INDEX_DIM, vectSize);
446         resCnt++;
447     }
448     EXPECT_EQ(10, resCnt); // 期待resCnt是10
449     EXPECT_EQ(E_OK, resultSet->Close());
450     std::pair<int32_t, ValueObject> res = RdbExecuteRdTest::store->Execute("DROP TABLE test;");
451     EXPECT_EQ(E_OK, res.first);
452 }
453 
454 /**
455 @tc.name: RdbStore_Execute_009
456 @tc.desc: test RdbStore Execute in vector mode
457 @tc.type: FUNC
458 */
459 constexpr uint32_t EXPEC_INSERT_CNT_FOR = 10;
460 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_009, TestSize.Level1)
461 {
462     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
463 
464     std::string sqlCreateTable =
465         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
466     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
467     std::string sqlSelect = "SELECT * FROM test;";
468 
469     std::pair<int32_t, ValueObject> res = {};
470     res = store->Execute(sqlCreateTable.c_str(), {});
471     EXPECT_EQ(res.first, E_OK);
472 
473     std::pair<int32_t, int64_t> trx = {};
474     trx = store->BeginTrans();
475     EXPECT_EQ(trx.first, E_OK);
476 
477     for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
478         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
479                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
480         res = store->Execute(sqlInsert.c_str(), {}, trx.second);
481         EXPECT_EQ(res.first, E_OK);
482     }
483     EXPECT_EQ(E_OK, store->Commit(trx.second));
484 
485     res = store->Execute(sqlCreateIndex.c_str(), {});
486     EXPECT_EQ(res.first, E_OK);
487 
488     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
489     EXPECT_NE(resultSet, nullptr);
490 
491     int32_t resCnt = 0;
492     while (resultSet->GoToNextRow() == E_OK) {
493         resCnt++;
494     }
495     EXPECT_EQ(EXPEC_INSERT_CNT_FOR, resCnt);
496 }
497 
498 /**
499 @tc.name: RdbStore_Execute_010
500 @tc.desc: test RdbStore Execute in vector mode
501 @tc.type: FUNC
502 */
503 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_010, TestSize.Level1)
504 {
505     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
506 
507     std::string sqlCreateTable =
508         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
509     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
510     std::string sqlSelect = "SELECT * FROM test;";
511 
512     std::pair<int32_t, ValueObject> res = {};
513     res = store->Execute(sqlCreateTable.c_str(), {});
514     EXPECT_EQ(res.first, E_OK);
515 
516     for (uint16_t i = 0; i < 10; i++) {
517         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
518                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
519         res = store->Execute(sqlInsert.c_str(), {}, 0);
520         EXPECT_EQ(res.first, E_OK);
521     }
522 
523     std::pair<int32_t, int64_t> trx = {};
524     trx = store->BeginTrans();
525     EXPECT_EQ(trx.first, E_OK);
526     EXPECT_NE(trx.second, 0);
527 
528     for (uint16_t i = 0; i < 10; i++) {
529         std::string sqlDelete = "DELETE FROM test WHERE id = 1000000" + std::to_string(i) + ";";
530         res = store->Execute(sqlDelete.c_str(), {}, trx.second);
531         EXPECT_EQ(res.first, E_OK);
532     }
533 
534     EXPECT_EQ(E_OK, store->Commit(trx.second));
535 
536     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
537     EXPECT_NE(resultSet, nullptr);
538     EXPECT_EQ(E_ROW_OUT_RANGE, resultSet->GoToNextRow());
539 }
540 
541 /**
542 @tc.name: RdbStore_Execute_011
543 @tc.desc: test RdbStore Execute in vector mode
544 @tc.type: FUNC
545 */
546 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_011, TestSize.Level1)
547 {
548     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
549 
550     std::string sqlCreateTable = "CREATE TABLE test(id int primary key, day int, repr floatvector(" +
551                                  std::to_string(LARGE_ANN_INDEX_DIM) + "));";
552     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
553     std::string sqlSelect = "SELECT * FROM test;";
554 
555     std::pair<int32_t, ValueObject> res = {};
556     res = store->Execute(sqlCreateTable.c_str(), {});
557     EXPECT_EQ(res.first, E_OK);
558 
559     for (uint16_t i = 0; i < 10; i++) {
560         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", 0, '" +
561                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
562         res = store->Execute(sqlInsert.c_str(), {}, 0);
563         EXPECT_EQ(res.first, E_OK);
564     }
565 
566     std::pair<int32_t, int64_t> trx = {};
567     trx = store->BeginTrans();
568     EXPECT_EQ(trx.first, E_OK);
569     EXPECT_NE(trx.second, 0);
570 
571     for (uint16_t i = 0; i < 10; i++) {
572         std::string sqlDelete = "UPDATE test SET day = 1 WHERE id = 1000000" + std::to_string(i) + ";";
573         res = store->Execute(sqlDelete.c_str(), {}, trx.second);
574         EXPECT_EQ(res.first, E_OK);
575     }
576 
577     EXPECT_EQ(E_OK, store->Commit(trx.second));
578     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
579     EXPECT_NE(resultSet, nullptr);
580 
581     uint32_t resCnt = 0;
582     int64_t intVal = 0;
583     int columnIndex = 0;
584     ColumnType colType = ColumnType::TYPE_NULL;
585 
586     while (resultSet->GoToNextRow() == E_OK) {
587         std::vector<std::string> colNames = {};
588         resultSet->GetAllColumnNames(colNames);
589         EXPECT_STREQ("id", colNames[0].c_str());
590         EXPECT_STREQ("day", colNames[1].c_str());
591         EXPECT_STREQ("repr", colNames[2].c_str());
592 
593         EXPECT_EQ(E_OK, resultSet->GetColumnIndex("day", columnIndex));
594         EXPECT_EQ(1, columnIndex); // 1是day的列
595 
596         EXPECT_EQ(E_OK, resultSet->GetColumnType(columnIndex, colType));
597         EXPECT_EQ(colType, ColumnType::TYPE_INTEGER);
598 
599         EXPECT_EQ(
600             E_COLUMN_OUT_RANGE, resultSet->GetColumnType(100, colType)); // 100是一个不存在的col, 所以预期返回错误码
601         EXPECT_EQ(colType, ColumnType::TYPE_INTEGER);                    // 值不会被更新
602 
603         EXPECT_EQ(E_OK, resultSet->GetLong(columnIndex, intVal));
604         EXPECT_EQ(1, intVal);
605 
606         resCnt++;
607     }
608 }
609 
610 /**
611 @tc.name: RdbStore_Execute_012
612 @tc.desc: test RdbStore Execute in vector mode
613 @tc.type: FUNC
614 */
615 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_012, TestSize.Level1)
616 {
617     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
618 
619     std::string sqlCreateTable =
620         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
621     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
622     std::string sqlSelect = "SELECT * FROM test;";
623 
624     std::pair<int32_t, ValueObject> res = {};
625     res = store->Execute(sqlCreateTable.c_str(), {});
626     EXPECT_EQ(res.first, E_OK);
627 
628     std::pair<int32_t, int64_t> trx = {};
629     trx = store->BeginTrans();
630     EXPECT_EQ(trx.first, E_OK);
631 
632     for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
633         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
634                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
635         res = store->Execute(sqlInsert.c_str(), {}, trx.second);
636         EXPECT_EQ(res.first, E_OK);
637     }
638     EXPECT_EQ(E_OK, store->RollBack(trx.second));
639 
640     res = store->Execute(sqlCreateIndex.c_str(), {});
641     EXPECT_EQ(res.first, E_OK);
642 
643     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
644     EXPECT_NE(resultSet, nullptr);
645 
646     int32_t resCnt = 0;
647     while (resultSet->GoToNextRow() == E_OK) {
648         resCnt++;
649     }
650     EXPECT_EQ(0, resCnt);
651 }
652 
653 /**
654 @tc.name: RdbStore_Execute_013
655 @tc.desc: test RdbStore Execute in vector mode
656 @tc.type: FUNC
657 */
658 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_013, TestSize.Level1)
659 {
660     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
661 
662     std::string sqlCreateTable =
663         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(LARGE_ANN_INDEX_DIM) + "));";
664     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
665     std::string sqlSelect = "SELECT * FROM test;";
666 
667     std::pair<int32_t, ValueObject> res = {};
668     res = store->Execute(sqlCreateTable.c_str(), {});
669     EXPECT_EQ(res.first, E_OK);
670 
671     std::pair<int32_t, int64_t> trx = {};
672     trx = store->BeginTrans();
673     EXPECT_EQ(trx.first, E_OK);
674 
675     for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
676         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
677                                 GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
678         res = store->Execute(sqlInsert.c_str(), {}, trx.second);
679         EXPECT_EQ(res.first, E_OK);
680     }
681     EXPECT_EQ(E_OK, store->RollBack(trx.second));
682 
683     res = store->Execute(sqlCreateIndex.c_str(), {});
684     EXPECT_EQ(res.first, E_OK);
685 
686     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
687     EXPECT_NE(resultSet, nullptr);
688 
689     int32_t resCnt = 0;
690     while (resultSet->GoToNextRow() == E_OK) {
691         resCnt++;
692     }
693     EXPECT_EQ(0, resCnt);
694 }
695 
696 /**
697 @tc.name: RdbStore_Execute_014
698 @tc.desc: test RdbStore Execute update in transaction
699 @tc.type: FUNC
700 */
701 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_014, TestSize.Level1)
702 {
703     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
704 
705     std::string sqlCreateTable = "CREATE TABLE test(id int primary key, age int, repr floatvector(" +
706                                  std::to_string(LARGE_ANN_INDEX_DIM) + "));";
707     std::string sqlCreateIndex = "CREATE INDEX diskann_l2_idx ON test USING GSIVFFLAT(repr L2);";
708     std::string sqlSelect = "SELECT * FROM test;";
709 
710     std::pair<int32_t, ValueObject> res = {};
711     res = store->Execute(sqlCreateTable.c_str(), {});
712     EXPECT_EQ(res.first, E_OK);
713 
714     for (uint16_t i = 0; i < 10; i++) {
715         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", " + std::to_string(i) +
716                                 ", '" + GetRandVector(MAX_INT_PART, LARGE_ANN_INDEX_DIM) + "');";
717         res = store->Execute(sqlInsert.c_str(), {}, 0);
718         EXPECT_EQ(res.first, E_OK);
719     }
720 
721     std::pair<int32_t, int64_t> trx = {};
722     trx = store->BeginTrans();
723     EXPECT_EQ(trx.first, E_OK);
724     EXPECT_NE(trx.second, 0);
725 
726     for (uint16_t i = 0; i < 10; i++) {
727         std::string sqlUpdate = "UPDATE test SET age = 1 WHERE id = 1000000" + std::to_string(i) + ";";
728         res = store->Execute(sqlUpdate.c_str(), {}, trx.second);
729         EXPECT_EQ(res.first, E_OK);
730     }
731 
732     EXPECT_EQ(E_OK, store->Commit(trx.second));
733     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
734     int columnIndex = 0;
735     while (resultSet->GoToNextRow() == E_OK) {
736         std::vector<std::string> colNames = {};
737         resultSet->GetAllColumnNames(colNames);
738         EXPECT_STREQ("id", colNames[0].c_str());
739         EXPECT_STREQ("age", colNames[1].c_str());
740         EXPECT_STREQ("repr", colNames[2].c_str());
741 
742         EXPECT_EQ(E_OK, resultSet->GetColumnIndex("age", columnIndex));
743         EXPECT_EQ(1, columnIndex); // 1是age的列
744         int result;
745         EXPECT_EQ(E_OK, resultSet->GetInt(columnIndex, result));
746         EXPECT_EQ(result, 1);
747     }
748 }
749 
750 /**
751 @tc.name: RdbStore_Execute_014
752 @tc.desc: test RdbStore Execute Repeatly Get Transaction
753 @tc.type: FUNC
754 */
755 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_015, TestSize.Level1)
756 {
757     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
758 
759     std::string sqlCreateTable = "CREATE TABLE test2 (id INTEGER PRIMARY KEY, repr INTEGER);";
760     std::string sqlSelect = "SELECT * FROM test2;";
761 
762     std::pair<int32_t, ValueObject> res = {};
763     res = store->Execute(sqlCreateTable.c_str(), {});
764     EXPECT_EQ(res.first, E_OK);
765 
766     for (uint32_t i = 0; i < 10; i++) {
767         std::pair<int32_t, int64_t> trx = {};
768         trx = store->BeginTrans();
769         EXPECT_EQ(trx.first, E_OK);
770         std::string sqlInsert = "INSERT INTO test2 VALUES(" + std::to_string(i) + ", 1);";
771         res = store->Execute(sqlInsert.c_str(), {}, trx.second);
772         EXPECT_EQ(res.first, E_OK);
773         EXPECT_EQ(E_OK, store->Commit(trx.second));
774     }
775 
776     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
777     EXPECT_NE(resultSet, nullptr);
778 
779     int32_t resCnt = 0;
780     while (resultSet->GoToNextRow() == E_OK) {
781         int rowIdx = 0;
782         resultSet->GetRowIndex(rowIdx);
783         EXPECT_EQ(resCnt, rowIdx);
784         resCnt++;
785     }
786     EXPECT_EQ(10, resCnt);
787 }
788 
789 /**
790 @tc.name: RdbStore_Execute_016
791 @tc.desc: test RdbStore Execute Repeatly Get Transaction
792 @tc.type: FUNC
793 */
794 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_016, TestSize.Level1)
795 {
796     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
797     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test1 (docId Text, str Text, repr floatvector(4));";
798     std::string sqlCreateIdx = "CREATE INDEX test_idx ON test1 USING GSIVFFLAT(repr L2);";
799     std::string sqlSelect = "SELECT * FROM test1 ORDER BY repr <-> '[1.0, 2.0, 3.0, 4.0]' LIMIT 2;";
800 
801     std::pair<int32_t, ValueObject> res = store->Execute(sqlCreateTable.c_str(), {});
802     EXPECT_EQ(res.first, E_OK);
803     res = store->Execute(sqlCreateIdx.c_str(), {});
804     EXPECT_EQ(res.first, E_OK);
805 
806     std::vector<std::vector<float>> vectorSamples = { { 1.0, 2.0, 3.0, 4.0 }, { 10, 20, 30, 40 },
807         { 100, 200, 300, 400 } };
808 
809     for (uint32_t i = 0; i < vectorSamples.size(); i++) {
810         std::pair<int32_t, int64_t> trx = {};
811         trx = store->BeginTrans();
812         EXPECT_EQ(trx.first, E_OK);
813         std::string sqlInsert = "insert into test1 values('" + std::to_string(i) + "', ?, ?);";
814         ValueObject floatObj = ValueObject(vectorSamples[i]);
815         ValueObject::FloatVector vector = {};
816         EXPECT_EQ(floatObj.GetVecs(vector), E_OK);
817         EXPECT_EQ(vectorSamples[i].size(), vector.size());
818         for (size_t j = 0; j < vector.size(); j++) {
819             EXPECT_FLOAT_EQ(vectorSamples[i][j], vector[j]);
820         }
821 
822         res = store->Execute(sqlInsert.c_str(), { ValueObject(std::string("textVal")), floatObj }, trx.second);
823         EXPECT_EQ(res.first, E_OK);
824         EXPECT_EQ(E_OK, store->Commit(trx.second));
825     }
826 
827     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
828     EXPECT_NE(resultSet, nullptr);
829 
830     int32_t resCnt = 0;
831     while (resultSet->GoToNextRow() == E_OK) {
832         std::string primaryStrVal = "";
833         std::string textStrVal = "";
834         ValueObject::FloatVector floatVector = {};
835         resultSet->GetString(0, primaryStrVal);     // 0 is the index of primary String column in select projection
836         resultSet->GetString(1, textStrVal);        // 1 is the index of TEXT column in select projection
837         resultSet->GetFloat32Array(2, floatVector); // 2 is the index of vector column in select projection
838         EXPECT_STREQ(std::to_string(resCnt).c_str(), primaryStrVal.c_str());
839         EXPECT_STREQ("textVal", textStrVal.c_str());
840         EXPECT_EQ(vectorSamples[resCnt].size(), floatVector.size());
841         for (size_t i = 0; i < floatVector.size(); i++) {
842             EXPECT_FLOAT_EQ(vectorSamples[resCnt][i], floatVector[i]);
843         }
844         resCnt++;
845     }
846     EXPECT_EQ(2, resCnt); // Expect 2 result due to limit 2
847 }
848 
849 /**
850 @tc.name: RdbStore_Execute_017
851 @tc.desc: test RdbStore Execute Getting or Setting version
852 @tc.type: FUNC
853 */
854 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_017, TestSize.Level1)
855 {
856     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
857     int versionToGet = 0;
858     int versionToSet = 1;
859     EXPECT_EQ(E_OK, store->SetVersion(versionToSet));
860     EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
861     EXPECT_EQ(versionToGet, versionToSet);
862 
863     std::string sqlPragmaSetVersion = "PRAGMA user_version = 3";
864     std::pair<int32_t, ValueObject> res = {};
865     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
866     EXPECT_EQ(res.first, E_OK);
867     EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
868     EXPECT_EQ(versionToGet, 3); // 3 is set by sql
869 
870     sqlPragmaSetVersion = "PRAGMA user_version = 4;";
871     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
872     EXPECT_EQ(res.first, E_OK);
873     EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
874     EXPECT_EQ(versionToGet, 4); // 4 is set by sql
875 
876     sqlPragmaSetVersion = "PRAGMA user_version = 35678";
877     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
878     EXPECT_EQ(res.first, E_OK);
879     EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
880     EXPECT_EQ(versionToGet, 35678); // 35678 is set by sql
881 
882     sqlPragmaSetVersion = "PRAGMA user_version = asdfds";
883     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
884     EXPECT_EQ(res.first, E_INCORRECT_SQL);
885 
886     sqlPragmaSetVersion = "PRAGMA user_version = ;";
887     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
888     EXPECT_EQ(res.first, E_INCORRECT_SQL);
889 
890     sqlPragmaSetVersion = "PRAGMA user_version = 456   ";
891     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
892     EXPECT_EQ(res.first, E_OK);
893     EXPECT_EQ(E_OK, store->GetVersion(versionToGet));
894     EXPECT_EQ(versionToGet, 456); // 456 is set by sql
895 
896     sqlPragmaSetVersion = "PRAGMA user_version = 456  1231 ";
897     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
898     EXPECT_EQ(res.first, E_INCORRECT_SQL);
899 
900     sqlPragmaSetVersion = "PRAGMA user_version = 456  1asdf231 ";
901     res = store->Execute(sqlPragmaSetVersion.c_str(), {}, 0);
902     EXPECT_EQ(res.first, E_INCORRECT_SQL);
903 }
904 
905 /**
906 @tc.name: RdbStore_Execute_018
907 @tc.desc: test RdbStore create encrypted db from non-encrypted db
908 @tc.type: FUNC
909 */
910 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_018, TestSize.Level1)
911 {
912     RdbExecuteRdTest::store = nullptr;
913     bool isOriginDbEncrypt = GetParam();
914 
915     RdbStoreConfig config(RdbExecuteRdTest::databaseName);
916     config.SetIsVector(true);
917     config.SetEncryptStatus(!isOriginDbEncrypt);
918     ExecuteTestOpenRdCallback helper;
919     int errCode = E_OK;
920     RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
921     // open encrypted-db in un-encrypted mode is not allowed
922     // open un-encrypted db in encrypted-db is allowed
923     EXPECT_TRUE((isOriginDbEncrypt && RdbExecuteRdTest::store == nullptr) ||
924                 (!isOriginDbEncrypt && RdbExecuteRdTest::store != nullptr));
925     if (!isOriginDbEncrypt) {
926         RdbExecuteRdTest::store = nullptr;
927         config.SetEncryptStatus(false); // open encrypted-db update from un-encrypt in un-encrypted mode is not allowed
928         RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
929         EXPECT_EQ(store, nullptr);
930     }
931 }
932 
933 /**
934 @tc.name: RdbStore_Execute_019
935 @tc.desc: test RdbStore Execute in vector mode, empty string bind case.
936 @tc.type: FUNC
937 */
938 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_019, TestSize.Level1)
939 {
940     std::string sqlCreateTable
941         = "CREATE TABLE IF NOT EXISTS testEmptyString (id INTEGER PRIMARY KEY, name text, repr floatvector(8));";
942     std::string sqlInsert = "INSERT INTO testEmptyString VALUES(?, ?, ?);";
943     std::string sqlQuery = "SELECT id FROM testEmptyString";
944     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
945     std::vector<float> floatVector = { 1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4 };
946     std::vector bindArgs = std::vector{ ValueObject(1), ValueObject(""), ValueObject(floatVector)};
947 
948     EXPECT_EQ(store->Execute(sqlCreateTable).first, E_OK);
949     EXPECT_EQ(store->Execute(sqlInsert, bindArgs).first, E_OK);
950 
951     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery);
952     ASSERT_NE(resultSet, nullptr);
953     int32_t rowCount = 0;
954     EXPECT_EQ(resultSet->GetRowCount(rowCount), E_OK);
955     EXPECT_EQ(rowCount, 1);
956 }
957 
958 /**
959  * @tc.name: RdbStore_Execute_020
960  * @tc.desc: Vector database transaction testing. If the SQL execution fails, the transaction is not closed.
961  * @tc.type: FUNC
962 */
963 HWTEST_P(RdbExecuteRdTest, RdbStore_Execute_020, TestSize.Level0)
964 {
965     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
966     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
967     std::string sqlInsert1 = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
968     std::string sqlInsert2 = "INSERT INTO test VALUES(2, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
969     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;";
970 
971     std::pair<int32_t, ValueObject> res = {};
972     res = store->Execute(sqlCreateTable, {}, 0);
973     EXPECT_EQ(res.first, E_OK);
974 
975     auto [ret1, transId1] = store->BeginTrans();
976     EXPECT_EQ(ret1, E_OK);
977     EXPECT_GE(transId1, 0);
978 
979     res = store->Execute(sqlInsert1, {}, transId1);
980     EXPECT_EQ(res.first, E_OK);
981 
982     auto [ret2, transId2] = store->BeginTrans();
983     EXPECT_EQ(ret2, E_OK);
984     EXPECT_GE(transId2, 0);
985 
986     res = store->Execute(sqlInsert2, {}, transId2);
987     EXPECT_EQ(res.first, E_DATABASE_BUSY);
988 
989     EXPECT_EQ(store->Commit(transId2), E_OK);
990     EXPECT_EQ(store->Commit(transId1), E_OK);
991     res = store->Execute("DROP TABLE test;", {}, 0);
992     EXPECT_EQ(res.first, E_OK);
993 }
994 
995 /* *
996  * @tc.name: Rdb_BackupRestoreTest_001
997  * @tc.desc: backup and restore
998  * @tc.type: FUNC
999  */
1000 HWTEST_P(RdbExecuteRdTest, Rdb_BackupRestoreTest_001, TestSize.Level2)
1001 {
1002     //create new db instance
1003     int errCode = E_OK;
1004     RdbStoreConfig config(RdbExecuteRdTest::restoreDatabaseName);
1005     config.SetIsVector(true);
1006     config.SetSecurityLevel(SecurityLevel::S4);
1007     config.SetEncryptStatus(GetParam());
1008     if (GetParam()) { // check if encrypt
1009         config.SetHaMode(HAMode::MAIN_REPLICA);
1010     }
1011     config.SetAllowRebuild(true);
1012     ExecuteTestOpenRdCallback helper;
1013     auto store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
1014     EXPECT_EQ(errCode, E_OK);
1015     EXPECT_NE(store, nullptr);
1016 
1017     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
1018     std::string sqlInsert = "INSERT INTO test VALUES(1, '[1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4]');";
1019     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;";
1020 
1021     std::pair<int32_t, ValueObject> res = {};
1022     res = store->Execute(sqlCreateTable.c_str(), {});
1023     EXPECT_EQ(res.first, E_OK);
1024     res = store->Execute(sqlInsert.c_str(), {});
1025     EXPECT_EQ(res.first, E_OK);
1026 
1027     std::vector<uint8_t> encryptKey;
1028     if (GetParam()) {
1029         encryptKey = config.GetEncryptKey();
1030     }
1031 
1032     int ret = store->Backup(RdbExecuteRdTest::backupDatabaseName, encryptKey);
1033     EXPECT_EQ(ret, E_OK);
1034 
1035     res = store->Execute("delete from test where id = 1;");
1036     EXPECT_EQ(E_OK, res.first);
1037 
1038     ret = store->Restore(RdbExecuteRdTest::backupDatabaseName, encryptKey);
1039     EXPECT_EQ(ret, E_OK);
1040 
1041     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery.c_str(), std::vector<ValueObject>());
1042 
1043     //check the result
1044     EXPECT_NE(resultSet, nullptr);
1045     EXPECT_EQ(resultSet->GoToNextRow(), E_OK);
1046     std::vector<std::string> colNames = {};
1047     resultSet->GetAllColumnNames(colNames);
1048     EXPECT_EQ(colNames.size(), 1);
1049     int columnIndex = 0;
1050     int intVal = 0;
1051     resultSet->GetColumnIndex("id", columnIndex);
1052     resultSet->GetInt(columnIndex, intVal);
1053     EXPECT_EQ(columnIndex, 0);
1054     EXPECT_EQ(intVal, 1);
1055     EXPECT_EQ(E_OK, resultSet->Close());
1056     res = store->Execute("DROP TABLE test;");
1057     EXPECT_EQ(E_OK, res.first);
1058 
1059     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::restoreDatabaseName);
1060     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::backupDatabaseName);
1061 }
1062 
1063 /* *
1064  * @tc.name: Rdb_IsUsingArkDataTest_001
1065  * @tc.desc: IsUsingArkData function test
1066  * @tc.type: FUNC
1067  */
1068 HWTEST_P(RdbExecuteRdTest, Rdb_IsUsingArkDataTest_001, TestSize.Level2)
1069 {
1070     EXPECT_EQ(OHOS::NativeRdb::RdbHelper::IsSupportArkDataDb(), true);
1071 }
1072 
1073 /**
1074  * @tc.name: RdbStore_BatchInsert_001
1075  * @tc.desc: test RdbStore BatchInsert in vector mode
1076  * @tc.type: FUNC
1077  */
1078 HWTEST_P(RdbExecuteRdTest, RdbStore_BatchInsert_001, TestSize.Level1)
1079 {
1080     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1081     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, repr floatvector(8));";
1082     std::string sqlQuery = "SELECT * FROM test order by repr <-> '[1.1, 0.3, 2.2, 6.6, 1.5, 3.1, 0.6, 0.2]' limit 3;";
1083 
1084     std::pair<int32_t, ValueObject> res = {};
1085     std::pair<int, int64_t> resBatch = {};
1086     res = store->Execute(sqlCreateTable.c_str(), {}, 0);
1087     EXPECT_EQ(res.first, E_OK);
1088     std::vector<float> vec = {1.2, 0.3, 3.2, 1.6, 2.5, 3.1, 0.8, 0.4};
1089 
1090     int id = 0;
1091     std::cout << "Start BatchInsert" << std::endl;
1092     auto start = std::chrono::high_resolution_clock::now();
1093 
1094     for (int32_t batch = 0; batch < BATCH_TOTAL_SIZE / BATCH_SIZE; batch++) {
1095         ValuesBuckets rows;
1096         for (int32_t i = 0; i < BATCH_SIZE; i++) {
1097             ValuesBucket row;
1098             row.PutInt("id", id++);
1099             row.Put("repr", vec);
1100             rows.Put(row);
1101         }
1102         resBatch = store->BatchInsert("test", rows);
1103         EXPECT_EQ(resBatch.first, E_OK);
1104         EXPECT_EQ(resBatch.second, BATCH_SIZE);
1105     }
1106 
1107     auto end = std::chrono::high_resolution_clock::now();
1108     std::chrono::duration<double> duration = end - start;
1109     std::cout << "Insert Cost Time: " << duration.count() << " seconds" << std::endl;
1110     std::cout << "Ops: " << BATCH_TOTAL_SIZE / (duration.count() * 1000) << " Kops/s" << std::endl;
1111 
1112     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlQuery.c_str(), std::vector<ValueObject>());
1113 
1114     int32_t resCnt = 0;
1115     int32_t resId = -1;
1116     while (resultSet->GoToNextRow() == E_OK) {
1117         ValueObject::FloatVector floatVector = {};
1118         resultSet->GetInt(0, resId);                // 0 is the index of primary INTEGER column in select projection
1119         resultSet->GetFloat32Array(1, floatVector); // 1 is the index of vector column in select projection
1120         EXPECT_EQ(resCnt, resId);
1121         EXPECT_EQ(vec.size(), floatVector.size());
1122         for (size_t i = 0; i < floatVector.size(); i++) {
1123             EXPECT_FLOAT_EQ(vec[i], floatVector[i]);
1124         }
1125         resCnt++;
1126     }
1127     EXPECT_EQ(3, resCnt); // Expect 3 result due to limit 3
1128 
1129     res = store->Execute("DROP TABLE test;", {}, 0);
1130     EXPECT_EQ(res.first, E_OK);
1131 }
1132 
1133 /**
1134  * @tc.name: RdbStore_BatchInsert_002
1135  * @tc.desc: test RdbStore BatchInsert performance in vector mode
1136  * @tc.type: FUNC
1137  */
1138 HWTEST_P(RdbExecuteRdTest, RdbStore_BatchInsert_002, TestSize.Level1)
1139 {
1140     std::string testStr2k = R"(
1141 {"$type":"root", "width":"1260.000000", "height":"2720.000000", "$resolution":"3.250000", "pageUrl":"pages/AppIndex",
1142 "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":"__Common__", "$rect":"[0.00, 0.00],
1143 [1260.00, 2720.00]", "$attrs":{}, "$children":[{"$type":"Navigation", "$rect":"[0.00, 0.00], [1260.00, 2720.00]",
1144 "$attrs":{"id":"mixnavigator", "enabled":"1", "focusable":"1"}, "$children":[{"$type":"NavigationContent", "$rect":"
1145 [0.00, 0.00], [1260.00, 2720.00]", "$attrs":{}, "$children":[{"$type":"NavDestination", "$rect":"[0.00, 0.00],
1146 [1260.00, 2720.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":"NavDestinationContent",
1147 "$rect":"[0.00, 0.00], [1260.00, 2720.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":"Stack",
1148 "$rect":"[0.00, 0.00], [1260.00, 2720.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":
1149 "__Common__", "$rect":"[0.00, 0.00], [1260.00, 2629.00]", "$attrs":{}, "$children":[{"$type":"Stack", "$rect":"
1150 [0.00, 0.00], [1260.00, 2629.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":"Stack", "$rect":"
1151 [0.00, 0.00], [1260.00, 2629.00]", "$attrs":{"id":"0", "enabled":"1", "focusable":"1"}, "$children":[{"$type":"Column",
1152 "$rect":"[0.00, 0.00], [1260.00, 2629.00]", "$attrs":{"id":"1", "enabled":"1", "focusable":"1"}, "$children":[{"$type":
1153 "Tabs", "$rect":"[0.00, 0.00], [1260.00, 2629.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":
1154 "Swiper", "$rect":"[0.00, 0.00], [1260.00, 2460.00]", "$attrs":{"enabled":"1", "focusable":"1"}, "$children":[{"$type":
1155 "TabContent", "$rect":"[0.00, 0.00], [1260.00, 2460.00]", "$attrs":{}, "$children":[{"$type":"Column", "$rect":"
1156 [0.00, 0.00], [1260.00, 2460.00]", "$attrs":{"id":"14", "enabled":"1", "focusable":"1"}, "$children":[{"$type":
1157 "Column", "$rect":"[0.00, 0.00], [1260.00, 2460.00]", "$attrs":{""}, "$children":[{"$attrs":{"id":"540", "enabled":"1",
1158 "focusable":"1"}, "$children":[{"$type":"GridCol", "$children":[{"$type":"Column", "$rect":"[0.00, 2460.00],
1159 [315.00, 2629.00]", "$attrs":{"enabled":"1", "focusable":"0"}, "$children":[{")";
1160 
1161     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1162     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT);";
1163 
1164     std::pair<int32_t, ValueObject> res = {};
1165     std::pair<int, int64_t> resBatch = {};
1166     res = store->Execute(sqlCreateTable.c_str(), {}, 0);
1167     EXPECT_EQ(res.first, E_OK);
1168 
1169     int id = 0;
1170     std::cout << "Start BatchInsert" << std::endl;
1171     auto start = std::chrono::high_resolution_clock::now();
1172 
1173     for (int32_t batch = 0; batch < BATCH_TOTAL_SIZE / BATCH_SIZE; batch++) {
1174         ValuesBuckets rows;
1175         for (int32_t i = 0; i < BATCH_SIZE; i++) {
1176             ValuesBucket row;
1177             row.PutInt("id", id++);
1178             row.PutString("name", testStr2k);
1179             rows.Put(row);
1180         }
1181         resBatch = store->BatchInsert("test", rows);
1182         EXPECT_EQ(resBatch.first, E_OK);
1183         EXPECT_EQ(resBatch.second, BATCH_SIZE);
1184     }
1185 
1186     auto end = std::chrono::high_resolution_clock::now();
1187     std::chrono::duration<double> duration = end - start;
1188     std::cout << "Insert Cost Time: " << duration.count() << " seconds" << std::endl;
1189     std::cout << "Ops: " << BATCH_TOTAL_SIZE / (duration.count() * 1000) << " Kops/s" << std::endl;
1190 
1191     res = store->Execute("DROP TABLE test;", {}, 0);
1192     EXPECT_EQ(res.first, E_OK);
1193 }
1194 
1195 /**
1196  * @tc.name: RdbStore_BatchInsert_003
1197  * @tc.desc: test RdbStore BatchInsert performance in vector mode
1198  * @tc.type: FUNC
1199  */
1200 HWTEST_P(RdbExecuteRdTest, RdbStore_BatchInsert_003, TestSize.Level1)
1201 {
1202     std::string testStr2k = R"({"$type":"root"})";
1203 
1204     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1205     std::string sqlCreateTable = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT);";
1206 
1207     std::pair<int32_t, ValueObject> res = {};
1208     std::pair<int, int64_t> resBatch = {};
1209     res = store->Execute(sqlCreateTable.c_str(), {}, 0);
1210     EXPECT_EQ(res.first, E_OK);
1211 
1212     int id = 0;
1213     std::cout << "Start BatchInsert" << std::endl;
1214     auto start = std::chrono::high_resolution_clock::now();
1215     int maxVariableNum = MAX_VARIABLE_NUM / 2;
1216 
1217     for (int32_t batch = 0; batch < 1; batch++) {
1218         ValuesBuckets rows;
1219         for (int32_t i = 0; i < maxVariableNum; i++) {
1220             ValuesBucket row;
1221             row.PutInt("id", id++);
1222             row.PutString("name", testStr2k);
1223             rows.Put(row);
1224         }
1225         resBatch = store->BatchInsert("test", rows);
1226         EXPECT_EQ(resBatch.first, E_OK);
1227         EXPECT_EQ(resBatch.second, maxVariableNum);
1228     }
1229 
1230     auto end = std::chrono::high_resolution_clock::now();
1231     std::chrono::duration<double> duration = end - start;
1232     std::cout << "Insert Cost Time: " << duration.count() << " seconds" << std::endl;
1233     std::cout << "Ops: " << maxVariableNum / (duration.count() * 1000) << " Kops/s" << std::endl;
1234 
1235     res = store->Execute("DROP TABLE test;", {}, 0);
1236     EXPECT_EQ(res.first, E_OK);
1237 }
1238 
1239 constexpr uint16_t CLUSTER_INDEX_DIM = 256;
1240 
ClusterAlgoByEvenNumber(ClstAlgoParaT * para)1241 int32_t ClusterAlgoByEvenNumber(ClstAlgoParaT *para)
1242 {
1243     int *result = para->clusterResult;
1244     const int specialId = 985;
1245     for (uint32_t i = 0; i < para->newFeaturesNum; i++) {
1246         result[i] = specialId;
1247     }
1248     std::cout << "ClusterAlgoByEvenNumber exec!" << std::endl;
1249     return 0;
1250 }
1251 
1252 /**
1253  * @tc.name: RdbStore_RegisterAlgo_001
1254  * @tc.desc: test RdbStore RegisterAlgo in vector mode
1255  * @tc.type: FUNC
1256  */
1257 HWTEST_P(RdbExecuteRdTest, RdbStore_RegisterAlgo_001, TestSize.Level1)
1258 {
1259     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1260     std::string algoName = "clst_algo_v0";
1261     int ret = store->RegisterAlgo(algoName, nullptr);
1262     EXPECT_EQ(ret, E_NO_MORE_ROWS);
1263     ret = store->RegisterAlgo(algoName, ClusterAlgoByEvenNumber);
1264     EXPECT_EQ(ret, E_OK);
1265 
1266     std::string sqlCreateTable =
1267         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(CLUSTER_INDEX_DIM) + "));";
1268     std::string sqlCreateIndex =
1269         "CREATE INDEX ivfcluster_l2_idx ON test USING IVFCLUSTER(repr L2) with (CLUSTER_ALGO='clst_algo_v0');";
1270     std::string sqlSelect = "SELECT id, repr, CLUSTER_ID(repr) from test;";
1271 
1272     std::pair<int32_t, ValueObject> res = {};
1273     res = store->Execute(sqlCreateTable.c_str(), {});
1274     EXPECT_EQ(res.first, E_OK);
1275 
1276     res = store->Execute(sqlCreateIndex.c_str(), {});
1277     EXPECT_EQ(res.first, E_OK);
1278 
1279     for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
1280         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
1281                                 GetRandVector(MAX_INT_PART, CLUSTER_INDEX_DIM) + "');";
1282         res = store->Execute(sqlInsert.c_str(), {});
1283         EXPECT_EQ(res.first, E_OK);
1284     }
1285 
1286     ret = store->RegisterAlgo(algoName, nullptr);
1287     EXPECT_EQ(ret, E_OK);
1288 
1289     res = store->Execute("DROP TABLE test;", {}, 0);
1290     EXPECT_EQ(res.first, E_OK);
1291 }
1292 
1293 /**
1294  * @tc.name: RdbStore_RegisterAlgo_002
1295  * @tc.desc: test RdbStore RegisterAlgo in vector mode
1296  * @tc.type: FUNC
1297  */
1298 HWTEST_P(RdbExecuteRdTest, RdbStore_RegisterAlgo_002, TestSize.Level1)
1299 {
1300     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1301     std::string algoName = "clst_algo_v0";
1302     int ret = store->RegisterAlgo(algoName, ClusterAlgoByEvenNumber);
1303     EXPECT_EQ(ret, E_OK);
1304 
1305     std::string sqlCreateTable =
1306         "CREATE TABLE test(id int primary key, repr floatvector(" + std::to_string(CLUSTER_INDEX_DIM) + "));";
1307     std::string sqlCreateIndex =
1308         "CREATE INDEX ivfcluster_l2_idx ON test USING IVFCLUSTER(repr L2) with (CLUSTER_ALGO='clst_algo_v0');";
1309     std::string sqlSelect = "SELECT id, repr, CLUSTER_ID(repr) from test;";
1310 
1311     std::pair<int32_t, ValueObject> res = {};
1312     res = store->Execute(sqlCreateTable.c_str(), {});
1313     EXPECT_EQ(res.first, E_OK);
1314 
1315     res = store->Execute(sqlCreateIndex.c_str(), {});
1316     EXPECT_EQ(res.first, E_OK);
1317 
1318     for (uint16_t i = 0; i < EXPEC_INSERT_CNT_FOR; i++) {
1319         std::string sqlInsert = "INSERT INTO test VALUES(1000000" + std::to_string(i) + ", '" +
1320                                 GetRandVector(MAX_INT_PART, CLUSTER_INDEX_DIM) + "');";
1321         res = store->Execute(sqlInsert.c_str(), {});
1322         EXPECT_EQ(res.first, E_OK);
1323     }
1324 
1325     std::string sqlRunCluster = "PRAGMA CLUSTER_RUN test.ivfcluster_l2_idx;";
1326     res = store->Execute(sqlRunCluster.c_str(), {});
1327     EXPECT_EQ(res.first, E_OK);
1328 
1329     std::shared_ptr<ResultSet> resultSet = store->QueryByStep(sqlSelect.c_str(), std::vector<ValueObject>());
1330     EXPECT_NE(resultSet, nullptr);
1331 
1332     int32_t resCnt = 0;
1333     while (resultSet->GoToNextRow() == E_OK) {
1334         resCnt++;
1335     }
1336     EXPECT_EQ(EXPEC_INSERT_CNT_FOR, resCnt);
1337 
1338     res = store->Execute("DROP TABLE test;", {}, 0);
1339     EXPECT_EQ(res.first, E_OK);
1340 }
1341 
1342 /**
1343  * @tc.name: RdbStore_RegisterAlgo_003
1344  * @tc.desc: test sqlite don't support RegisterAlgo
1345  * @tc.type: FUNC
1346  */
1347 HWTEST_P(RdbExecuteRdTest, RdbStore_RegisterAlgo_003, TestSize.Level1)
1348 {
1349     RdbExecuteRdTest::store = nullptr;
1350     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
1351 
1352     int errCode = E_OK;
1353     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
1354     RdbStoreConfig config(RdbExecuteRdTest::databaseName);
1355     config.SetIsVector(false);
1356     config.SetEncryptStatus(GetParam());
1357     ExecuteTestOpenRdCallback helper;
1358     RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
1359     EXPECT_NE(RdbExecuteRdTest::store, nullptr);
1360     EXPECT_EQ(errCode, E_OK);
1361 
1362     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1363 
1364     std::string sqlCreateTable =
1365         "CREATE TABLE test(id int primary key, repr int);";
1366 
1367     std::pair<int32_t, ValueObject> res = {};
1368     res = store->Execute(sqlCreateTable.c_str(), {});
1369     EXPECT_EQ(res.first, E_OK);
1370 
1371     std::string algoName = "clst_algo_v0";
1372     int ret = store->RegisterAlgo(algoName, ClusterAlgoByEvenNumber);
1373     EXPECT_EQ(ret, E_NOT_SUPPORT);
1374 
1375     res = store->Execute("DROP TABLE test;", {}, 0);
1376     EXPECT_EQ(res.first, E_OK);
1377 }
1378 
1379 /**
1380  * @tc.name: RdbStore_RegisterAlgo_004
1381  * @tc.desc: test don't support RegisterAlgo
1382  * @tc.type: FUNC
1383  */
1384 HWTEST_P(RdbExecuteRdTest, RdbStore_RegisterAlgo_004, TestSize.Level1)
1385 {
1386     RdbExecuteRdTest::store = nullptr;
1387     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
1388 
1389     int errCode = E_OK;
1390     RdbStoreConfig config(RdbExecuteRdTest::databaseName);
1391     config.SetIsVector(true);
1392     config.SetReadOnly(true);
1393     config.SetEncryptStatus(GetParam());
1394     ExecuteTestOpenRdCallback helper;
1395     RdbExecuteRdTest::store = RdbHelper::GetRdbStore(config, 1, helper, errCode);
1396     EXPECT_NE(RdbExecuteRdTest::store, nullptr);
1397     EXPECT_EQ(errCode, E_OK);
1398 
1399     std::string algoName = "clst_algo_v0";
1400     int ret = RdbExecuteRdTest::store->RegisterAlgo(algoName, ClusterAlgoByEvenNumber);
1401     EXPECT_EQ(ret, E_NOT_SUPPORT);
1402 }
1403 
1404 /**
1405  * @tc.name: RdbStore_RegisterAlgo_005
1406  * @tc.desc: test RegisterAlgo after deleteRdbStore
1407  * @tc.type: FUNC
1408  */
1409 HWTEST_P(RdbExecuteRdTest, RdbStore_RegisterAlgo_005, TestSize.Level1)
1410 {
1411     RdbHelper::DeleteRdbStore(RdbExecuteRdTest::databaseName);
1412     std::shared_ptr<RdbStore> &store = RdbExecuteRdTest::store;
1413     std::string algoName = "clst_algo_v0";
1414     int ret = store->RegisterAlgo(algoName, ClusterAlgoByEvenNumber);
1415     EXPECT_EQ(ret, E_ALREADY_CLOSED);
1416 }
1417