• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <gtest/gtest.h>
17 
18 #include <map>
19 #include <string>
20 
21 #include "common.h"
22 #include "connection_pool.h"
23 #include "rdb_errno.h"
24 #include "rdb_predicates.h"
25 #include "sqlite_sql_builder.h"
26 #include "trans_db.h"
27 using namespace testing::ext;
28 using namespace OHOS::NativeRdb;
29 namespace Test {
30 class RdbTransDBTest : public testing::Test {
31 public:
32     static void SetUpTestCase(void);
33     static void TearDownTestCase(void);
34     void SetUp();
35     void TearDown();
36 
37 protected:
38     static constexpr const char *CREATE_TABLE = "CREATE TABLE IF NOT EXISTS TEST (id INT PRIMARY KEY, name TEXT, "
39                                                 "extend BLOB, code REAL, years UNLIMITED INT, attachment ASSET, "
40                                                 "attachments ASSETS)";
41     static constexpr const char *DROP_TABLE = "DROP TABLE IF EXISTS TEST";
42     static constexpr const char *TABLE_NAME = "TEST";
43     static std::shared_ptr<ConnectionPool> connPool_;
44     static RdbStoreConfig config_;
45     static ValuesBucket row_;
46     std::shared_ptr<RdbStore> transDB_;
47     std::shared_ptr<Connection> conn_;
48 };
49 std::shared_ptr<ConnectionPool> RdbTransDBTest::connPool_ = nullptr;
50 RdbStoreConfig RdbTransDBTest::config_(RDB_TEST_PATH + "transDb_test.db");
51 ValuesBucket RdbTransDBTest::row_(std::map<std::string, ValueObject>{
52     { "id", ValueObject(1) },
53     { "name", ValueObject("xiaoming") },
54     { "extend", ValueObject(std::vector<uint8_t>(100, 128)) },
55     { "code", ValueObject(3.1415926) },
56     { "years", ValueObject(BigInteger(0, { 128, 225 })) },
57     { "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111" }) },
58     { "attachments", ValueObject(ValueObject::Assets{
59                          AssetValue{ .id = "120", .name = "picture2", .hash = "112" },
60                          AssetValue{ .id = "121", .name = "picture3", .hash = "113" },
61                          AssetValue{ .id = "122", .name = "picture4", .hash = "114" },
62                          AssetValue{ .id = "123", .name = "picture5", .hash = "115" }
63                      })
64     }
65 });
66 
SetUpTestCase(void)67 void RdbTransDBTest::SetUpTestCase(void)
68 {
69     config_.SetBundleName("arkdata_test");
70     config_.SetSecurityLevel(OHOS::NativeRdb::SecurityLevel::S1);
71     Connection::Delete(config_);
72     int32_t errCode = E_OK;
73     connPool_ = ConnectionPool::Create(config_, errCode);
74     EXPECT_TRUE(connPool_ != nullptr);
75 }
76 
TearDownTestCase(void)77 void RdbTransDBTest::TearDownTestCase(void)
78 {
79     connPool_ = nullptr;
80     Connection::Delete(config_);
81 }
82 
SetUp()83 void RdbTransDBTest::SetUp()
84 {
85     auto [errCode, conn] = connPool_->CreateTransConn();
86     ASSERT_NE(conn, nullptr);
87     ASSERT_EQ(errCode, E_OK);
88     transDB_ = std::make_shared<TransDB>(conn, config_.GetName());
89     ASSERT_NE(transDB_, nullptr);
90     auto [err, object] = transDB_->Execute(DROP_TABLE);
91     ASSERT_EQ(err, E_OK);
92     std::tie(err, object) = transDB_->Execute(CREATE_TABLE);
93     ASSERT_EQ(err, E_OK);
94     conn_ = conn;
95 }
96 
TearDown()97 void RdbTransDBTest::TearDown()
98 {
99     transDB_ = nullptr;
100     conn_ = nullptr;
101 }
102 
103 /* *
104  * @tc.name: ALREADY_CLOSED_001
105  * @tc.desc: closed db
106  * @tc.type: FUNC
107  */
108 HWTEST_F(RdbTransDBTest, ALREADY_CLOSED_001, TestSize.Level1)
109 {
110     conn_ = nullptr;
111     ValuesBucket row = row_;
112     int32_t changed = 0;
113     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
114     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
115     std::tie(errCode, changed) = transDB_->Update(TABLE_NAME, row);
116     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
117     errCode = transDB_->Delete(changed, TABLE_NAME);
118     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
119     auto resultSet = transDB_->QueryByStep("select * from TEST");
120     ASSERT_NE(resultSet, nullptr);
121     errCode = resultSet->GoToNextRow();
122     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
123     resultSet = transDB_->QuerySql("select * from TEST");
124     ASSERT_NE(resultSet, nullptr);
125     errCode = resultSet->GoToNextRow();
126     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
127 }
128 
129 /* *
130  * @tc.name: ALREADY_CLOSED_002
131  * @tc.desc: closed db
132  * @tc.type: FUNC
133  */
134 HWTEST_F(RdbTransDBTest, ALREADY_CLOSED_002, TestSize.Level1)
135 {
136     ValuesBucket row = row_;
137     int32_t changed = 0;
138     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
139     ASSERT_EQ(errCode, E_OK);
140     auto resultSet = transDB_->QueryByStep("select * from TEST");
141     ASSERT_NE(resultSet, nullptr);
142     errCode = resultSet->GoToNextRow();
143     ASSERT_EQ(errCode, E_OK);
144     conn_ = nullptr;
145     resultSet->Close();
146     errCode = transDB_->Delete(changed, TABLE_NAME);
147     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
148     errCode = resultSet->GoToNextRow();
149     ASSERT_EQ(errCode, E_ALREADY_CLOSED);
150 }
151 
152 /* *
153  * @tc.name: Insert_NEW_001
154  * @tc.desc: insert into test(...) values(?)
155  * @tc.type: FUNC
156  */
157 HWTEST_F(RdbTransDBTest, Insert_NEW_001, TestSize.Level1)
158 {
159     ValuesBucket row = row_;
160     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
161     ASSERT_EQ(errCode, E_OK);
162     ASSERT_EQ(rowId, 1);
163     auto resultSet = transDB_->QueryByStep("select * from TEST");
164     ASSERT_NE(resultSet, nullptr);
165     errCode = resultSet->GoToNextRow();
166     ASSERT_EQ(errCode, E_OK);
167     RowEntity rowEntity;
168     errCode = resultSet->GetRow(rowEntity);
169     ASSERT_EQ(errCode, E_OK);
170     ASSERT_TRUE(row.values_ == rowEntity.Get());
171 }
172 
173 /* *
174  * @tc.name: Insert_NEW_002
175  * @tc.desc: insert or replace into test(...) values(?)
176  * @tc.type: FUNC
177  */
178 HWTEST_F(RdbTransDBTest, Insert_NEW_002, TestSize.Level1)
179 {
180     ValuesBucket row = row_;
181     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
182     ASSERT_EQ(errCode, E_OK);
183     ASSERT_EQ(rowId, 1);
184     row.Put("name", "xiaohua");
185     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
186     ASSERT_EQ(errCode, E_INVALID_ARGS);
187     row.Put("attachments", ValueObject());
188     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
189     ASSERT_EQ(errCode, E_OK);
190     auto resultSet = transDB_->QueryByStep("select * from TEST");
191     ASSERT_NE(resultSet, nullptr);
192     errCode = resultSet->GoToNextRow();
193     ASSERT_EQ(errCode, E_OK);
194     RowEntity rowEntity;
195     errCode = resultSet->GetRow(rowEntity);
196     ASSERT_EQ(errCode, E_OK);
197     ASSERT_TRUE(row.values_ == rowEntity.Get());
198 }
199 
200 /* *
201  * @tc.name: Insert_NEW_003
202  * @tc.desc: insert or ignore into test(...) values(?)
203  * @tc.type: FUNC
204  */
205 HWTEST_F(RdbTransDBTest, Insert_NEW_003, TestSize.Level1)
206 {
207     ValuesBucket row = row_;
208     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
209     ASSERT_EQ(errCode, E_OK);
210     ASSERT_EQ(rowId, 1);
211     row.Put("name", "xiaohua");
212     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_IGNORE);
213     ASSERT_EQ(errCode, E_OK);
214     auto resultSet = transDB_->QueryByStep("select * from TEST");
215     ASSERT_NE(resultSet, nullptr);
216     errCode = resultSet->GoToNextRow();
217     ASSERT_EQ(errCode, E_OK);
218     RowEntity rowEntity;
219     errCode = resultSet->GetRow(rowEntity);
220     ASSERT_EQ(errCode, E_OK);
221     row = row_;
222     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
223     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
224     ASSERT_TRUE(row.values_ == rowEntity.Get());
225 }
226 
227 /* *
228  * @tc.name: Insert_NEW_003
229  * @tc.desc: insert or fail into test(...) values(?)
230  * @tc.type: FUNC
231  */
232 HWTEST_F(RdbTransDBTest, Insert_NEW_004, TestSize.Level1)
233 {
234     ValuesBucket row = row_;
235     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
236     ASSERT_EQ(errCode, E_OK);
237     ASSERT_EQ(rowId, 1);
238     row.Put("name", "xiaohua");
239     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_FAIL);
240     ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
241     auto resultSet = transDB_->QueryByStep("select * from TEST");
242     ASSERT_NE(resultSet, nullptr);
243     errCode = resultSet->GoToNextRow();
244     ASSERT_EQ(errCode, E_OK);
245     RowEntity rowEntity;
246     errCode = resultSet->GetRow(rowEntity);
247     ASSERT_EQ(errCode, E_OK);
248     row = row_;
249     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
250     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
251     ASSERT_TRUE(row.values_ == rowEntity.Get());
252 }
253 
254 /* *
255  * @tc.name: Insert_NEW_003
256  * @tc.desc: insert or abort into test(...) values(?)
257  * @tc.type: FUNC
258  */
259 HWTEST_F(RdbTransDBTest, Insert_NEW_005, TestSize.Level1)
260 {
261     ValuesBucket row = row_;
262     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
263     ASSERT_EQ(errCode, E_OK);
264     ASSERT_EQ(rowId, 1);
265     row.Put("name", "xiaohua");
266     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_ABORT);
267     ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
268     auto resultSet = transDB_->QueryByStep("select * from TEST");
269     ASSERT_NE(resultSet, nullptr);
270     errCode = resultSet->GoToNextRow();
271     ASSERT_EQ(errCode, E_OK);
272     RowEntity rowEntity;
273     errCode = resultSet->GetRow(rowEntity);
274     ASSERT_EQ(errCode, E_OK);
275     row = row_;
276     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
277     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
278     ASSERT_TRUE(row.values_ == rowEntity.Get());
279 }
280 
281 /* *
282  * @tc.name: Insert_NEW_006
283  * @tc.desc: insert or rollback into test(...) values(?)
284  * @tc.type: FUNC
285  */
286 HWTEST_F(RdbTransDBTest, Insert_NEW_006, TestSize.Level1)
287 {
288     ValuesBucket row = row_;
289     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
290     ASSERT_EQ(errCode, E_OK);
291     ASSERT_EQ(rowId, 1);
292     row.Put("name", "xiaohua");
293     std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_ROLLBACK);
294     ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
295     auto resultSet = transDB_->QueryByStep("select * from TEST");
296     ASSERT_NE(resultSet, nullptr);
297     errCode = resultSet->GoToNextRow();
298     ASSERT_EQ(errCode, E_OK);
299     RowEntity rowEntity;
300     errCode = resultSet->GetRow(rowEntity);
301     ASSERT_EQ(errCode, E_OK);
302     row = row_;
303     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
304     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
305     ASSERT_TRUE(row.values_ == rowEntity.Get());
306 }
307 
308 /* *
309  * @tc.name: Insert_001
310  * @tc.desc: insert into test(...) values(?)
311  * @tc.type: FUNC
312  */
313 HWTEST_F(RdbTransDBTest, Insert_001, TestSize.Level1)
314 {
315     int64_t rowId = -1;
316     ValuesBucket row = row_;
317     auto errCode = transDB_->Insert(rowId, TABLE_NAME, row);
318     ASSERT_EQ(errCode, E_OK);
319     ASSERT_EQ(rowId, 1);
320     auto resultSet = transDB_->QueryByStep("select * from TEST");
321     ASSERT_NE(resultSet, nullptr);
322     errCode = resultSet->GoToNextRow();
323     ASSERT_EQ(errCode, E_OK);
324     RowEntity rowEntity;
325     errCode = resultSet->GetRow(rowEntity);
326     ASSERT_EQ(errCode, E_OK);
327     ASSERT_TRUE(row.values_ == rowEntity.Get());
328 }
329 
330 /* *
331  * @tc.name: Insert_002
332  * @tc.desc: insert into test(...) values(?)
333  * @tc.type: FUNC
334  */
335 HWTEST_F(RdbTransDBTest, Insert_002, TestSize.Level1)
336 {
337     int64_t rowId = -1;
338     ValuesBucket row = row_;
339     auto errCode = transDB_->Insert(rowId, TABLE_NAME, row);
340     ASSERT_EQ(errCode, E_OK);
341     ASSERT_EQ(rowId, 1);
342     errCode = transDB_->Insert(rowId, TABLE_NAME, row);
343     ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
344 }
345 
346 /* *
347  * @tc.name: InsertWithConflictResolution_001
348  * @tc.desc: insert or replace into test(...) values(?)
349  * @tc.type: FUNC
350  */
351 HWTEST_F(RdbTransDBTest, InsertWithConflictResolution_001, TestSize.Level1)
352 {
353     ValuesBucket row = row_;
354     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
355     ASSERT_EQ(errCode, E_OK);
356     ASSERT_EQ(rowId, 1);
357     row.Put("name", "xiaohua");
358     errCode = transDB_->InsertWithConflictResolution(rowId, TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
359     ASSERT_EQ(errCode, E_INVALID_ARGS);
360     row.Put("attachments", ValueObject());
361     errCode = transDB_->InsertWithConflictResolution(rowId, TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
362     ASSERT_EQ(errCode, E_OK);
363     auto resultSet = transDB_->QueryByStep("select * from TEST");
364     ASSERT_NE(resultSet, nullptr);
365     errCode = resultSet->GoToNextRow();
366     ASSERT_EQ(errCode, E_OK);
367     RowEntity rowEntity;
368     errCode = resultSet->GetRow(rowEntity);
369     ASSERT_EQ(errCode, E_OK);
370     ASSERT_TRUE(row.values_ == rowEntity.Get());
371 }
372 
373 /* *
374  * @tc.name: Replace_001
375  * @tc.desc: insert or replace into test(...) values(?)
376  * @tc.type: FUNC
377  */
378 HWTEST_F(RdbTransDBTest, Replace_001, TestSize.Level1)
379 {
380     ValuesBucket row = row_;
381     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
382     ASSERT_EQ(errCode, E_OK);
383     ASSERT_EQ(rowId, 1);
384     row.Put("name", "xiaohua");
385     errCode = transDB_->Replace(rowId, TABLE_NAME, row);
386     ASSERT_EQ(errCode, E_INVALID_ARGS);
387     row.Put("attachments", ValueObject());
388     errCode = transDB_->Replace(rowId, TABLE_NAME, row);
389     ASSERT_EQ(errCode, E_OK);
390     auto resultSet = transDB_->QueryByStep("select * from TEST");
391     ASSERT_NE(resultSet, nullptr);
392     errCode = resultSet->GoToNextRow();
393     ASSERT_EQ(errCode, E_OK);
394     RowEntity rowEntity;
395     errCode = resultSet->GetRow(rowEntity);
396     ASSERT_EQ(errCode, E_OK);
397     ASSERT_TRUE(row.values_ == rowEntity.Get());
398 }
399 
400 /* *
401  * @tc.name: BatchInsert
402  * @tc.desc: insert Normal ValuesBucket to db
403  * @tc.type: FUNC
404  */
405 HWTEST_F(RdbTransDBTest, BatchInsert_001, TestSize.Level1)
406 {
407     int64_t changedNum = -1;
408     std::vector<ValuesBucket> rows;
409     for (int i = 0; i < 20; i++) {
410         ValuesBucket row = row_;
411         row.Put("id", i);
412         row.Put("name", "xiaoming_" + std::to_string(i));
413         row.Put("years", BigInteger(i % 2, { 128, 225 }));
414         rows.push_back(std::move(row));
415     }
416     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
417     ASSERT_EQ(errCode, E_OK);
418     ASSERT_EQ(changedNum, 20);
419     auto resultSet = transDB_->QueryByStep("select * from TEST order by id");
420     ASSERT_NE(resultSet, nullptr);
421     size_t index = 0;
422     while (resultSet->GoToNextRow() == E_OK && index < rows.size()) {
423         RowEntity rowEntity;
424         errCode = resultSet->GetRow(rowEntity);
425         ASSERT_EQ(errCode, E_OK);
426         auto row = rowEntity.Steal();
427         SqliteSqlBuilder::UpdateAssetStatus(rows[index].values_["attachment"], AssetValue::STATUS_INSERT);
428         SqliteSqlBuilder::UpdateAssetStatus(rows[index].values_["attachments"], AssetValue::STATUS_INSERT);
429         ASSERT_TRUE(rows[index].values_ == row);
430         index++;
431     }
432     int32_t rowCount = 0;
433     errCode = resultSet->GetRowCount(rowCount);
434     ASSERT_EQ(errCode, E_OK);
435     ASSERT_EQ(rowCount, rows.size());
436 }
437 
438 /* *
439  * @tc.name: BatchInsert
440  * @tc.desc: insert RefRows to db
441  * @tc.type: FUNC
442  */
443 HWTEST_F(RdbTransDBTest, BatchInsert_002, TestSize.Level1)
444 {
445     ValuesBuckets rows;
446     for (int i = 0; i < 20; i++) {
447         ValuesBucket row = row_;
448         row.Put("id", i);
449         row.Put("name", "xiaoming_" + std::to_string(i));
450         row.Put("years", BigInteger(i % 2, { 128, 225 }));
451         rows.Put(row);
452     }
453     auto [errCode, changedNum] = transDB_->BatchInsert(TABLE_NAME, rows);
454     ASSERT_EQ(errCode, E_OK);
455     ASSERT_EQ(changedNum, 20);
456     auto resultSet = transDB_->QueryByStep("select * from TEST order by id");
457     ASSERT_NE(resultSet, nullptr);
458     size_t index = 0;
459     while (resultSet->GoToNextRow() == E_OK) {
460         RowEntity rowEntity;
461         errCode = resultSet->GetRow(rowEntity);
462         ASSERT_EQ(errCode, E_OK);
463         auto row = rowEntity.Steal();
464         for (auto &[key, value] : row) {
465             auto [ret, val] = rows.Get(index, ValuesBuckets::FieldType(key));
466             ASSERT_EQ(ret, E_OK);
467             ASSERT_TRUE(val.get() == value);
468         }
469         index++;
470     }
471     int32_t rowCount = 0;
472     errCode = resultSet->GetRowCount(rowCount);
473     ASSERT_EQ(errCode, E_OK);
474     ASSERT_EQ(rows.RowSize(), size_t(rowCount));
475 }
476 
477 /* *
478  * @tc.name: Update_001
479  * @tc.desc: update test set(id=?,...)
480  * @tc.type: FUNC
481  */
482 HWTEST_F(RdbTransDBTest, Update_001, TestSize.Level1)
483 {
484     ValuesBucket row = row_;
485     int32_t changed = -1;
486     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
487     ASSERT_EQ(errCode, E_OK);
488     ASSERT_EQ(rowId, 1);
489     row.Put("name", "xiaohua");
490     row.Put(
491         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
492     std::tie(errCode, changed) = transDB_->Update(TABLE_NAME, row);
493     ASSERT_EQ(errCode, E_OK);
494     auto resultSet = transDB_->QueryByStep("select * from TEST");
495     ASSERT_NE(resultSet, nullptr);
496     errCode = resultSet->GoToNextRow();
497     ASSERT_EQ(errCode, E_OK);
498     RowEntity rowEntity;
499     errCode = resultSet->GetRow(rowEntity);
500     ASSERT_EQ(errCode, E_OK);
501     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_UPDATE);
502     ASSERT_TRUE(row.values_ == rowEntity.Get());
503 }
504 
505 /* *
506  * @tc.name: Update_002
507  * @tc.desc: update test set(id=?,...) where id > ? and  id < ?
508  * @tc.type: FUNC
509  */
510 HWTEST_F(RdbTransDBTest, Update_002, TestSize.Level1)
511 {
512     int64_t changedNum = -1;
513     std::vector<ValuesBucket> rows;
514     for (int i = 0; i < 20; i++) {
515         ValuesBucket row = row_;
516         row.Put("id", i);
517         row.Put("name", "xiaoming_" + std::to_string(i));
518         row.Put("years", BigInteger(i % 2, { 128, 225 }));
519         rows.push_back(std::move(row));
520     }
521     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
522     ASSERT_EQ(errCode, E_OK);
523     ASSERT_EQ(changedNum, 20);
524     auto updateRow = row_;
525     updateRow.values_.erase("id");
526     updateRow.Put(
527         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
528     int32_t updatedNum = -1;
529     std::tie(errCode, updatedNum) = transDB_->Update(TABLE_NAME, updateRow, "id > ? and  id < ?", { 0, 10 });
530     ASSERT_EQ(errCode, E_OK);
531     ASSERT_EQ(updatedNum, 9);
532     auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and  id < ? order by id", { 0, 10 });
533     ASSERT_NE(resultSet, nullptr);
534     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
535     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
536     size_t index = 0;
537     while (resultSet->GoToNextRow() == E_OK) {
538         RowEntity rowEntity;
539         errCode = resultSet->GetRow(rowEntity);
540         ASSERT_EQ(errCode, E_OK);
541         auto row = rowEntity.Steal();
542         row.erase("id");
543         ASSERT_TRUE(updateRow.values_ == row);
544         index++;
545     }
546     ASSERT_EQ(index, 9);
547 }
548 
549 /* *
550  * @tc.name: Update_003
551  * @tc.desc: update test set(id=?,...) where id > ? and  id < ?
552  * @tc.type: FUNC
553  */
554 HWTEST_F(RdbTransDBTest, Update_003, TestSize.Level1)
555 {
556     int64_t changedNum = -1;
557     std::vector<ValuesBucket> rows;
558     for (int i = 0; i < 20; i++) {
559         ValuesBucket row = row_;
560         row.Put("id", i);
561         row.Put("name", "xiaoming_" + std::to_string(i));
562         row.Put("years", BigInteger(i % 2, { 128, 225 }));
563         rows.push_back(std::move(row));
564     }
565     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
566     ASSERT_EQ(errCode, E_OK);
567     ASSERT_EQ(changedNum, 20);
568     auto updateRow = row_;
569     updateRow.values_.erase("id");
570     updateRow.Put(
571         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
572     int32_t updatedNum = -1;
573     std::tie(errCode, updatedNum) = transDB_->Update(
574         TABLE_NAME, updateRow, "id > ? and  id < ?", { 0, 10 }, ConflictResolution::ON_CONFLICT_ROLLBACK);
575     ASSERT_EQ(errCode, E_OK);
576     ASSERT_EQ(updatedNum, 9);
577     auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and  id < ? order by id", { 0, 10 });
578     ASSERT_NE(resultSet, nullptr);
579     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
580     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
581     size_t index = 0;
582     while (resultSet->GoToNextRow() == E_OK) {
583         RowEntity rowEntity;
584         errCode = resultSet->GetRow(rowEntity);
585         ASSERT_EQ(errCode, E_OK);
586         auto row = rowEntity.Steal();
587         row.erase("id");
588         ASSERT_TRUE(updateRow.values_ == row);
589         index++;
590     }
591     ASSERT_EQ(index, 9);
592 }
593 
594 /* *
595  * @tc.name: Update_004
596  * @tc.desc: update test set(id=?,...)
597  * @tc.type: FUNC
598  */
599 HWTEST_F(RdbTransDBTest, Update_004, TestSize.Level1)
600 {
601     ValuesBucket row = row_;
602     int32_t changed = -1;
603     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
604     ASSERT_EQ(errCode, E_OK);
605     ASSERT_EQ(rowId, 1);
606     row.Put("name", "xiaohua");
607     row.Put(
608         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
609     errCode = transDB_->Update(changed, TABLE_NAME, row);
610     ASSERT_EQ(errCode, E_OK);
611     auto resultSet = transDB_->QueryByStep("select * from TEST");
612     ASSERT_NE(resultSet, nullptr);
613     errCode = resultSet->GoToNextRow();
614     ASSERT_EQ(errCode, E_OK);
615     RowEntity rowEntity;
616     errCode = resultSet->GetRow(rowEntity);
617     ASSERT_EQ(errCode, E_OK);
618     SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_UPDATE);
619     ASSERT_TRUE(row.values_ == rowEntity.Get());
620 }
621 
622 /* *
623  * @tc.name: Update_005
624  * @tc.desc: update test set(id=?,...) where id > ? and  id < ?
625  * @tc.type: FUNC
626  */
627 HWTEST_F(RdbTransDBTest, Update_005, TestSize.Level1)
628 {
629     int64_t changedNum = -1;
630     std::vector<ValuesBucket> rows;
631     for (int i = 0; i < 20; i++) {
632         ValuesBucket row = row_;
633         row.Put("id", i);
634         row.Put("name", "xiaoming_" + std::to_string(i));
635         row.Put("years", BigInteger(i % 2, { 128, 225 }));
636         rows.push_back(std::move(row));
637     }
638     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
639     ASSERT_EQ(errCode, E_OK);
640     ASSERT_EQ(changedNum, 20);
641     auto updateRow = row_;
642     updateRow.values_.erase("id");
643     updateRow.Put(
644         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
645     int32_t updatedNum = -1;
646     RdbPredicates rdbPredicates(TABLE_NAME);
647     rdbPredicates.GreaterThan("id", 0);
648     rdbPredicates.And();
649     rdbPredicates.LessThan("id", 10);
650     errCode = transDB_->Update(updatedNum, updateRow, rdbPredicates);
651     ASSERT_EQ(errCode, E_OK);
652     ASSERT_EQ(updatedNum, 9);
653     auto resultSet = transDB_->QueryByStep(rdbPredicates);
654     ASSERT_NE(resultSet, nullptr);
655     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
656     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
657     size_t index = 0;
658     while (resultSet->GoToNextRow() == E_OK) {
659         RowEntity rowEntity;
660         errCode = resultSet->GetRow(rowEntity);
661         ASSERT_EQ(errCode, E_OK);
662         auto row = rowEntity.Steal();
663         row.erase("id");
664         ASSERT_TRUE(updateRow.values_ == row);
665         index++;
666     }
667     ASSERT_EQ(index, 9);
668 }
669 
670 /* *
671  * @tc.name: UpdateWithConflictResolution_001
672  * @tc.desc: update test set(id=?,...) where id > ? and  id < ?
673  * @tc.type: FUNC
674  */
675 HWTEST_F(RdbTransDBTest, UpdateWithConflictResolution_001, TestSize.Level1)
676 {
677     int64_t changedNum = -1;
678     std::vector<ValuesBucket> rows;
679     for (int i = 0; i < 20; i++) {
680         ValuesBucket row = row_;
681         row.Put("id", i);
682         row.Put("name", "xiaoming_" + std::to_string(i));
683         row.Put("years", BigInteger(i % 2, { 128, 225 }));
684         rows.push_back(std::move(row));
685     }
686     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
687     ASSERT_EQ(errCode, E_OK);
688     ASSERT_EQ(changedNum, 20);
689     auto updateRow = row_;
690     updateRow.values_.erase("id");
691     updateRow.Put(
692         "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
693     int32_t updatedNum = -1;
694     errCode =
695         transDB_->UpdateWithConflictResolution(updatedNum, TABLE_NAME, updateRow, "id > ? and  id < ?", { 0, 10 });
696     ASSERT_EQ(errCode, E_OK);
697     ASSERT_EQ(updatedNum, 9);
698     auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and  id < ? order by id", { 0, 10 });
699     ASSERT_NE(resultSet, nullptr);
700     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
701     SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
702     size_t index = 0;
703     while (resultSet->GoToNextRow() == E_OK) {
704         RowEntity rowEntity;
705         errCode = resultSet->GetRow(rowEntity);
706         ASSERT_EQ(errCode, E_OK);
707         auto row = rowEntity.Steal();
708         row.erase("id");
709         ASSERT_TRUE(updateRow.values_ == row);
710         index++;
711     }
712     ASSERT_EQ(index, 9);
713 }
714 
715 /* *
716  * @tc.name: Delete_001
717  * @tc.desc: delete from test where id > ? and  id < ?
718  * @tc.type: FUNC
719  */
720 HWTEST_F(RdbTransDBTest, Delete_001, TestSize.Level1)
721 {
722     int64_t changedNum = -1;
723     std::vector<ValuesBucket> rows;
724     for (int i = 0; i < 20; i++) {
725         ValuesBucket row = row_;
726         row.Put("id", i);
727         row.Put("name", "xiaoming_" + std::to_string(i));
728         row.Put("years", BigInteger(i % 2, { 128, 225 }));
729         rows.push_back(std::move(row));
730     }
731     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
732     ASSERT_EQ(errCode, E_OK);
733     ASSERT_EQ(changedNum, 20);
734     int32_t deleteNum = -1;
735     RdbPredicates rdbPredicates(TABLE_NAME);
736     rdbPredicates.GreaterThan("id", 0);
737     rdbPredicates.And();
738     rdbPredicates.LessThan("id", 10);
739     errCode = transDB_->Delete(deleteNum, rdbPredicates);
740     ASSERT_EQ(errCode, E_OK);
741     ASSERT_EQ(deleteNum, 9);
742     auto resultSet = transDB_->QueryByStep(rdbPredicates);
743     ASSERT_NE(resultSet, nullptr);
744     int32_t count = -1;
745     errCode = resultSet->GetRowCount(count);
746     ASSERT_EQ(errCode, E_OK);
747     ASSERT_EQ(count, 0);
748 }
749 
750 /* *
751  * @tc.name: Delete_002
752  * @tc.desc: delete from test where id > ? and  id < ?
753  * @tc.type: FUNC
754  */
755 HWTEST_F(RdbTransDBTest, Delete_002, TestSize.Level1)
756 {
757     int64_t changedNum = -1;
758     std::vector<ValuesBucket> rows;
759     for (int i = 0; i < 20; i++) {
760         ValuesBucket row = row_;
761         row.Put("id", i);
762         row.Put("name", "xiaoming_" + std::to_string(i));
763         row.Put("years", BigInteger(i % 2, { 128, 225 }));
764         rows.push_back(std::move(row));
765     }
766     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
767     ASSERT_EQ(errCode, E_OK);
768     ASSERT_EQ(changedNum, 20);
769     int32_t deleteNum = -1;
770     errCode = transDB_->Delete(deleteNum, TABLE_NAME, "id > ? and  id < ?", { 0, 10 });
771     ASSERT_EQ(errCode, E_OK);
772     ASSERT_EQ(deleteNum, 9);
773     auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and  id < ? order by id", { 0, 10 });
774     ASSERT_NE(resultSet, nullptr);
775     int32_t count = -1;
776     errCode = resultSet->GetRowCount(count);
777     ASSERT_EQ(errCode, E_OK);
778     ASSERT_EQ(count, 0);
779 }
780 
781 /* *
782  * @tc.name: QueryByStep_001
783  * @tc.desc: select id, name, yeas from test where id > ? and  id < ? order by id asc
784  * @tc.type: FUNC
785  */
786 HWTEST_F(RdbTransDBTest, QueryByStep_001, TestSize.Level1)
787 {
788     int64_t changedNum = -1;
789     std::vector<ValuesBucket> rows;
790     for (int i = 0; i < 20; i++) {
791         ValuesBucket row = row_;
792         row.Put("id", i);
793         row.Put("name", "xiaoming_" + std::to_string(i));
794         row.Put("years", BigInteger(i % 2, { 128, 225 }));
795         rows.push_back(std::move(row));
796     }
797     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
798     ASSERT_EQ(errCode, E_OK);
799     ASSERT_EQ(changedNum, 20);
800     RdbPredicates rdbPredicates(TABLE_NAME);
801     rdbPredicates.GreaterThan("id", 0);
802     rdbPredicates.And();
803     rdbPredicates.LessThan("id", 10);
804     rdbPredicates.OrderByAsc("id");
805     auto resultSet = transDB_->QueryByStep(rdbPredicates, { "id", "name", "years" });
806     ASSERT_NE(resultSet, nullptr);
807     int64_t index = 1;
808     while (resultSet->GoToNextRow() == E_OK) {
809         RowEntity rowEntity;
810         errCode = resultSet->GetRow(rowEntity);
811         ASSERT_EQ(errCode, E_OK);
812         auto row = rowEntity.Steal();
813         ASSERT_TRUE(row.size() == 3);
814         ASSERT_TRUE(row["id"] == ValueObject(index));
815         ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
816         ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
817         index++;
818     }
819     int32_t count = -1;
820     errCode = resultSet->GetRowCount(count);
821     ASSERT_EQ(errCode, E_OK);
822     ASSERT_EQ(count, 9);
823 }
824 
825 /* *
826  * @tc.name: Query_001
827  * @tc.desc: select id, name, yeas from test where id > ? and  id < ? order by id asc
828  * @tc.type: FUNC
829  */
830 HWTEST_F(RdbTransDBTest, Query_001, TestSize.Level1)
831 {
832     int64_t changedNum = -1;
833     std::vector<ValuesBucket> rows;
834     for (int i = 0; i < 20; i++) {
835         ValuesBucket row = row_;
836         row.Put("id", i);
837         row.Put("name", "xiaoming_" + std::to_string(i));
838         row.Put("years", BigInteger(i % 2, { 128, 225 }));
839         rows.push_back(std::move(row));
840     }
841     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
842     ASSERT_EQ(errCode, E_OK);
843     ASSERT_EQ(changedNum, 20);
844     RdbPredicates rdbPredicates(TABLE_NAME);
845     rdbPredicates.GreaterThan("id", 0);
846     rdbPredicates.And();
847     rdbPredicates.LessThan("id", 10);
848     rdbPredicates.OrderByAsc("id");
849     auto resultSet = transDB_->Query(rdbPredicates, { "id", "name", "years" });
850     ASSERT_NE(resultSet, nullptr);
851     int64_t index = 1;
852     while (resultSet->GoToNextRow() == E_OK) {
853         RowEntity rowEntity;
854         errCode = resultSet->GetRow(rowEntity);
855         ASSERT_EQ(errCode, E_OK);
856         auto row = rowEntity.Steal();
857         ASSERT_TRUE(row.size() == 3);
858         ASSERT_TRUE(row["id"] == ValueObject(index));
859         ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
860         ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
861         index++;
862     }
863     int32_t count = -1;
864     errCode = resultSet->GetRowCount(count);
865     ASSERT_EQ(errCode, E_OK);
866     ASSERT_EQ(count, 9);
867 }
868 
869 /* *
870  * @tc.name: QuerySql_001
871  * @tc.desc: select * from test where id > ? and  id < ? order by id asc
872  * @tc.type: FUNC
873  */
874 HWTEST_F(RdbTransDBTest, QuerySql_001, TestSize.Level1)
875 {
876     int64_t changedNum = -1;
877     std::vector<ValuesBucket> rows;
878     for (int i = 0; i < 20; i++) {
879         ValuesBucket row = row_;
880         row.Put("id", i);
881         row.Put("name", "xiaoming_" + std::to_string(i));
882         row.Put("years", BigInteger(i % 2, { 128, 225 }));
883         rows.push_back(std::move(row));
884     }
885     auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
886     ASSERT_EQ(errCode, E_OK);
887     ASSERT_EQ(changedNum, 20);
888     auto resultSet = transDB_->QuerySql("select * from TEST where id > ? and  id < ? order by id", { 0, 10 });
889     ASSERT_NE(resultSet, nullptr);
890     int64_t index = 1;
891     while (resultSet->GoToNextRow() == E_OK) {
892         RowEntity rowEntity;
893         errCode = resultSet->GetRow(rowEntity);
894         ASSERT_EQ(errCode, E_OK);
895         auto row = rowEntity.Steal();
896         ASSERT_TRUE(row["id"] == ValueObject(index));
897         ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
898         ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
899         index++;
900     }
901     int32_t count = -1;
902     errCode = resultSet->GetRowCount(count);
903     ASSERT_EQ(errCode, E_OK);
904     ASSERT_EQ(count, 9);
905 }
906 
907 /* *
908  * @tc.name: Execute_001
909  * @tc.desc: PRAGMA user_version
910  * @tc.type: FUNC
911  */
912 HWTEST_F(RdbTransDBTest, Execute_PRAGMA_001, TestSize.Level1)
913 {
914     auto [errCode, value] = transDB_->Execute("PRAGMA user_version=100");
915     ASSERT_EQ(errCode, E_OK);
916     std::tie(errCode, value) = transDB_->Execute("PRAGMA user_version");
917     ASSERT_EQ(errCode, E_OK);
918     ASSERT_TRUE(value == ValueObject(100));
919 }
920 
921 /* *
922  * @tc.name: Execute_DDL_001
923  * @tc.desc: PRAGMA user_version
924  * @tc.type: FUNC
925  */
926 HWTEST_F(RdbTransDBTest, Execute_DDL_001, TestSize.Level1)
927 {
928     auto [errCode, value] = transDB_->Execute("PRAGMA schema_version");
929     ASSERT_EQ(errCode, E_OK);
930     ASSERT_NE(value, ValueObject());
931     auto oldVer = value;
932     std::tie(errCode, value) = transDB_->Execute("CREATE TABLE IF NOT EXISTS TEST1 (id INT PRIMARY KEY, name TEXT)");
933     ASSERT_EQ(errCode, E_OK);
934     ASSERT_TRUE(value == ValueObject());
935     std::tie(errCode, value) = transDB_->Execute("DROP TABLE IF EXISTS TEST1");
936     ASSERT_EQ(errCode, E_OK);
937     ASSERT_TRUE(value == ValueObject());
938     std::tie(errCode, value) = transDB_->Execute("PRAGMA schema_version");
939     ASSERT_EQ(errCode, E_OK);
940     ASSERT_FALSE(value == ValueObject());
941     ASSERT_FALSE(value == oldVer);
942 }
943 
944 /* *
945  * @tc.name: Execute_Insert_001
946  * @tc.desc: INSERT INTO TEST(id, name) VALUES(?,?)
947  * @tc.type: FUNC
948  */
949 HWTEST_F(RdbTransDBTest, Execute_Insert_001, TestSize.Level1)
950 {
951     auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
952     ASSERT_EQ(errCode, E_OK);
953     ASSERT_EQ(value, ValueObject(1));
954     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
955     ASSERT_NE(resultSet, nullptr);
956     errCode = resultSet->GoToNextRow();
957     ASSERT_EQ(errCode, E_OK);
958     RowEntity rowEntity;
959     errCode = resultSet->GetRow(rowEntity);
960     ASSERT_EQ(errCode, E_OK);
961     auto row = rowEntity.Steal();
962     ASSERT_TRUE(row["id"] == ValueObject(100));
963     ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
964     ASSERT_TRUE(row["years"] == ValueObject());
965     int32_t count = -1;
966     errCode = resultSet->GetRowCount(count);
967     ASSERT_EQ(errCode, E_OK);
968     ASSERT_EQ(count, 1);
969 }
970 
971 /* *
972  * @tc.name: Execute_Insert_002
973  * @tc.desc: INSERT OR IGNORE INTO TEST(id, name) VALUES(?,?)
974  * @tc.type: FUNC
975  */
976 HWTEST_F(RdbTransDBTest, Execute_Insert_002, TestSize.Level1)
977 {
978     auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
979     ASSERT_EQ(errCode, E_OK);
980     ASSERT_EQ(value, ValueObject(1));
981     std::tie(errCode, value) =
982         transDB_->Execute("INSERT OR IGNORE INTO TEST(id, name) VALUES (?,?)", { 100, "xiaoming" });
983     ASSERT_EQ(errCode, E_OK);
984     ASSERT_EQ(value, ValueObject(-1));
985     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
986     ASSERT_NE(resultSet, nullptr);
987     errCode = resultSet->GoToNextRow();
988     ASSERT_EQ(errCode, E_OK);
989     RowEntity rowEntity;
990     errCode = resultSet->GetRow(rowEntity);
991     ASSERT_EQ(errCode, E_OK);
992     auto row = rowEntity.Steal();
993     ASSERT_TRUE(row["id"] == ValueObject(100));
994     ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
995     int32_t count = -1;
996     errCode = resultSet->GetRowCount(count);
997     ASSERT_EQ(errCode, E_OK);
998     ASSERT_EQ(count, 1);
999 }
1000 
1001 /* *
1002  * @tc.name: Execute_Update_001
1003  * @tc.desc: UPDATE TEST SET id=?, name=?
1004  * @tc.type: FUNC
1005  */
1006 HWTEST_F(RdbTransDBTest, Execute_Update_001, TestSize.Level1)
1007 {
1008     auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1009     ASSERT_EQ(errCode, E_OK);
1010     ASSERT_EQ(value, ValueObject(1));
1011     std::tie(errCode, value) = transDB_->Execute("UPDATE TEST SET id=?, name=?", { 100, "xiaoming" });
1012     ASSERT_EQ(errCode, E_OK);
1013     ASSERT_EQ(value, ValueObject(1));
1014     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1015     ASSERT_NE(resultSet, nullptr);
1016     errCode = resultSet->GoToNextRow();
1017     ASSERT_EQ(errCode, E_OK);
1018     RowEntity rowEntity;
1019     errCode = resultSet->GetRow(rowEntity);
1020     ASSERT_EQ(errCode, E_OK);
1021     auto row = rowEntity.Steal();
1022     ASSERT_TRUE(row["id"] == ValueObject(100));
1023     ASSERT_TRUE(row["name"] == ValueObject("xiaoming"));
1024     int32_t count = -1;
1025     errCode = resultSet->GetRowCount(count);
1026     ASSERT_EQ(errCode, E_OK);
1027     ASSERT_EQ(count, 1);
1028 }
1029 
1030 /* *
1031  * @tc.name: Execute_Transaction_001
1032  * @tc.desc: UPDATE TEST SET(id=?, name=?)
1033  * @tc.type: FUNC
1034  */
1035 HWTEST_F(RdbTransDBTest, Execute_Transaction_001, TestSize.Level1)
1036 {
1037     auto [errCode, value] = transDB_->Execute("BEGIN");
1038     ASSERT_EQ(errCode, E_OK);
1039     ASSERT_TRUE(value == ValueObject());
1040     std::tie(errCode, value) = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1041     ASSERT_EQ(errCode, E_OK);
1042     ASSERT_TRUE(value == ValueObject(1));
1043     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1044     ASSERT_NE(resultSet, nullptr);
1045     int32_t count = -1;
1046     errCode = resultSet->GetRowCount(count);
1047     ASSERT_EQ(errCode, E_OK);
1048     ASSERT_EQ(count, 1);
1049     std::tie(errCode, value) = transDB_->Execute("ROLLBACK");
1050     ASSERT_EQ(errCode, E_OK);
1051     resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1052     ASSERT_NE(resultSet, nullptr);
1053     count = -1;
1054     errCode = resultSet->GetRowCount(count);
1055     ASSERT_EQ(errCode, E_OK);
1056     ASSERT_EQ(count, 0);
1057 }
1058 
1059 /* *
1060  * @tc.name: Execute_Transaction_002
1061  * @tc.desc: BEGIN, COMMIT, ROLLBACK
1062  * @tc.type: FUNC
1063  */
1064 HWTEST_F(RdbTransDBTest, Execute_Transaction_002, TestSize.Level1)
1065 {
1066     auto [errCode, value] = transDB_->Execute("BEGIN");
1067     ASSERT_EQ(errCode, E_OK);
1068     ASSERT_TRUE(value == ValueObject());
1069     std::tie(errCode, value) = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1070     ASSERT_EQ(errCode, E_OK);
1071     ASSERT_TRUE(value == ValueObject(1));
1072     std::tie(errCode, value) = transDB_->Execute("COMMIT");
1073     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1074     ASSERT_NE(resultSet, nullptr);
1075     int32_t count = -1;
1076     errCode = resultSet->GetRowCount(count);
1077     ASSERT_EQ(errCode, E_OK);
1078     ASSERT_EQ(count, 1);
1079     std::tie(errCode, value) = transDB_->Execute("ROLLBACK");
1080     resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1081     ASSERT_NE(resultSet, nullptr);
1082     count = -1;
1083     errCode = resultSet->GetRowCount(count);
1084     ASSERT_EQ(errCode, E_OK);
1085     ASSERT_EQ(count, 1);
1086 }
1087 
1088 /* *
1089  * @tc.name: Execute_INVALID_001
1090  * @tc.desc: attach detach select and etc.
1091  * @tc.type: FUNC
1092  */
1093 HWTEST_F(RdbTransDBTest, Execute_INVALID_001, TestSize.Level1)
1094 {
1095     auto [errCode, value] = transDB_->Execute(" ATTACH DATABASE ? AS ? ", { "/data/test/a.db", "a" });
1096     ASSERT_EQ(errCode, E_INVALID_ARGS);
1097     std::tie(errCode, value) = transDB_->Execute(" DETACH DATABASE ?", { "/data/test/a.db" });
1098     ASSERT_EQ(errCode, E_INVALID_ARGS);
1099     std::tie(errCode, value) = transDB_->Execute(" select * from TEST where id == ?", RdbStore::Values{ 100 });
1100     ASSERT_EQ(errCode, E_INVALID_ARGS);
1101 }
1102 
1103 /* *
1104  * @tc.name: QueryByStep_ThreadSafe_001
1105  * @tc.desc: multi-thread use resultSet and closed etc.
1106  * @tc.type: FUNC
1107  */
1108 HWTEST_F(RdbTransDBTest, QueryByStep_ThreadSafe_001, TestSize.Level1)
1109 {
1110     ValuesBucket row = row_;
1111     auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
1112     ASSERT_EQ(errCode, E_OK);
1113     ASSERT_EQ(rowId, 1);
1114     auto resultSet = transDB_->QueryByStep("select * from TEST");
1115     ASSERT_NE(resultSet, nullptr);
1116     errCode = resultSet->GoToNextRow();
1117     ASSERT_EQ(errCode, E_OK);
1118     std::shared_ptr<std::thread> threads[4];
1119     for (int i = 0; i < 4; ++i) {
__anon18d5abb60102() 1120         threads[i] = std::make_shared<std::thread>([resultSet]() {
1121             RowEntity rowEntity;
1122             while (resultSet->GetRow(rowEntity) != E_ALREADY_CLOSED) {
1123             };
1124         });
1125     }
1126     usleep(200);
1127     resultSet->Close();
1128     for (int i = 0; i < 4; ++i) {
1129         if (threads[i] == nullptr) {
1130             continue;
1131         }
1132         threads[i]->join();
1133         threads[i] = nullptr;
1134     }
1135 }
1136 
1137 /* *
1138  * @tc.name: ExecuteForLastInsertRowId_001
1139  * @tc.desc: INSERT OR IGNORE INTO TEST(id, name) VALUES(?,?)
1140  * @tc.type: FUNC
1141  */
1142 HWTEST_F(RdbTransDBTest, ExecuteForLastInsertRowId_001, TestSize.Level1)
1143 {
1144     int64_t rowId = 0;
1145     auto errCode =
1146         transDB_->ExecuteForLastInsertedRowId(rowId, "INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1147     ASSERT_EQ(errCode, E_OK);
1148     ASSERT_EQ(rowId, 1);
1149     errCode = transDB_->ExecuteForLastInsertedRowId(
1150         rowId, "INSERT OR IGNORE INTO TEST(id, name) VALUES (?,?)", { 100, "xiaoming" });
1151     ASSERT_EQ(errCode, E_OK);
1152     ASSERT_EQ(rowId, -1);
1153     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1154     ASSERT_NE(resultSet, nullptr);
1155     errCode = resultSet->GoToNextRow();
1156     ASSERT_EQ(errCode, E_OK);
1157     RowEntity rowEntity;
1158     errCode = resultSet->GetRow(rowEntity);
1159     ASSERT_EQ(errCode, E_OK);
1160     auto row = rowEntity.Steal();
1161     ASSERT_TRUE(row["id"] == ValueObject(100));
1162     ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
1163     int32_t count = -1;
1164     errCode = resultSet->GetRowCount(count);
1165     ASSERT_EQ(errCode, E_OK);
1166     ASSERT_EQ(count, 1);
1167 }
1168 
1169 /* *
1170  * @tc.name: ExecuteForChangedRowCount_001
1171  * @tc.desc: UPDATE TEST SET id=?, name=?
1172  * @tc.type: FUNC
1173  */
1174 HWTEST_F(RdbTransDBTest, ExecuteForChangedRowCount_001, TestSize.Level1)
1175 {
1176     auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1177     ASSERT_EQ(errCode, E_OK);
1178     ASSERT_EQ(value, ValueObject(1));
1179     int64_t changedRow = 0;
1180     errCode = transDB_->ExecuteForChangedRowCount(changedRow, "UPDATE TEST SET id=?, name=?", { 100, "xiaoming" });
1181     ASSERT_EQ(errCode, E_OK);
1182     ASSERT_EQ(changedRow, 1);
1183     auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1184     ASSERT_NE(resultSet, nullptr);
1185     errCode = resultSet->GoToNextRow();
1186     ASSERT_EQ(errCode, E_OK);
1187     RowEntity rowEntity;
1188     errCode = resultSet->GetRow(rowEntity);
1189     ASSERT_EQ(errCode, E_OK);
1190     auto row = rowEntity.Steal();
1191     ASSERT_TRUE(row["id"] == ValueObject(100));
1192     ASSERT_TRUE(row["name"] == ValueObject("xiaoming"));
1193     int32_t count = -1;
1194     errCode = resultSet->GetRowCount(count);
1195     ASSERT_EQ(errCode, E_OK);
1196     ASSERT_EQ(count, 1);
1197 }
1198 } // namespace Test
1199