diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd/src/interface/src/document_store.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd/src/interface/src/document_store.cpp index 5d9f8a14b53af7255993e836d44449f04be463ca..43a459ed64cb386a9c9ef5c34c99eff152393cef 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd/src/interface/src/document_store.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd/src/interface/src/document_store.cpp @@ -330,6 +330,10 @@ int GetUpsertRePlaceData(ResultSet &resultSet, JsonObject &documentObj, bool isR int errCode = resultSet.GetValue(valStr); if (errCode != E_OK || isReplace) { valStr = documentObj.Print(); // If cant not find data, insert it. + if (valStr.length() >= JSON_LENS_MAX) { + GLOGE("document's length is too long"); + return -E_OVER_LIMIT; + } return E_OK; } if (errCode != E_OK && errCode != -E_NOT_FOUND) { diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_data_test.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_data_test.cpp index 1ea370b55ac52d7a3030dae6a46ad713cfc50cca..7c08e72d40413b5b1660727c33c5d00f1ef4b05f 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_data_test.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd/test/unittest/api/documentdb_data_test.cpp @@ -32,7 +32,7 @@ namespace { std::string g_path = "./document.db"; GRD_DB *g_db = nullptr; const char *g_coll = "student"; - +constexpr int JSON_LENS_MAX = 1024 * 1024; class DocumentDBDataTest : public testing::Test { public: static void SetUpTestCase(void); @@ -174,8 +174,12 @@ HWTEST_F(DocumentDBDataTest, UpsertDataTest008, TestSize.Level0) HWTEST_F(DocumentDBDataTest, UpsertDataTest009, TestSize.Level0) { std::string filter = R""({"_id":"abcde"})""; - std::string document = R"({"field1": ")" + string(1024 * 1024 + 1, 'a') + "\"}"; - EXPECT_EQ(GRD_UpsertDoc(g_db, g_coll, filter.c_str(), document.c_str(), GRD_DOC_REPLACE), GRD_OVER_LIMIT); + std::string head = R"({"field1": ")"; + std::string document = + head + string(JSON_LENS_MAX - filter.size() - head.size() - 1, 'a') + "\"}"; // 13 is {"field1": size + EXPECT_EQ(GRD_UpsertDoc(g_db, g_coll, filter.c_str(), document.c_str(), GRD_DOC_APPEND), 1); + std::string document2 = head + string(JSON_LENS_MAX - filter.size() - head.size(), 'a') + "\"}"; + EXPECT_EQ(GRD_UpsertDoc(g_db, g_coll, filter.c_str(), document2.c_str(), GRD_DOC_REPLACE), GRD_OVER_LIMIT); } HWTEST_F(DocumentDBDataTest, UpsertDataTest010, TestSize.Level0)