This is an automated email from the ASF dual-hosted git repository.
palashc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push:
new 6c4cb77ad6 PHOENIX-7691 : Handle empty bson doc in bson update
expression function (#2277)
6c4cb77ad6 is described below
commit 6c4cb77ad65b072761144ec592dee749160e6874
Author: Palash Chauhan <[email protected]>
AuthorDate: Fri Aug 22 10:09:24 2025 -0700
PHOENIX-7691 : Handle empty bson doc in bson update expression function
(#2277)
Co-authored-by: Palash Chauhan
<[email protected]>
---
.../function/BsonUpdateExpressionFunction.java | 2 +-
.../java/org/apache/phoenix/end2end/Bson4IT.java | 40 ++++++++++++++++++++++
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/expression/function/BsonUpdateExpressionFunction.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/expression/function/BsonUpdateExpressionFunction.java
index a86a523794..373cd5042e 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/expression/function/BsonUpdateExpressionFunction.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/expression/function/BsonUpdateExpressionFunction.java
@@ -95,7 +95,7 @@ public class BsonUpdateExpressionFunction extends
ScalarFunction {
updateExpressionBsonDoc = RawBsonDocument.parse(updateExpression);
} else {
updateExpressionBsonDoc = (RawBsonDocument) PBson.INSTANCE.toObject(ptr);
- if (updateExpressionBsonDoc == null ||
updateExpressionBsonDoc.isEmpty()) {
+ if (updateExpressionBsonDoc == null) {
return true;
}
}
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/Bson4IT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/Bson4IT.java
index f8884472ab..0c0d8bc471 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/Bson4IT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/Bson4IT.java
@@ -56,6 +56,7 @@ import org.bson.BsonNull;
import org.bson.BsonString;
import org.bson.Document;
import org.bson.RawBsonDocument;
+import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -505,6 +506,45 @@ public class Bson4IT extends ParallelStatsDisabledIT {
}
}
+ @Test
+ public void testBsonReturnValueWithEmptyUpdateExpression() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ String tableName = generateUniqueName();
+ try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+ conn.setAutoCommit(true);
+ conn.createStatement().execute("CREATE TABLE " + tableName + " (" +
+ " hk VARCHAR NOT NULL, " +
+ " sk VARCHAR NOT NULL, " +
+ " col BSON, " +
+ " CONSTRAINT pk PRIMARY KEY (hk, sk))");
+
+ RawBsonDocument bsonDoc = RawBsonDocument.parse("{\"a\":1,\"b\":2}");
+
+ PreparedStatement p = conn.prepareStatement("UPSERT INTO " + tableName +
" VALUES (?,?,?)");
+ p.setString(1, "h1");
+ p.setString(2, "s1");
+ p.setObject(3, bsonDoc);
+ p.execute();
+
+ p = conn.prepareStatement("UPSERT INTO " + tableName + " VALUES (?,?)
ON DUPLICATE KEY UPDATE\n" +
+ " COL = BSON_UPDATE_EXPRESSION(COL,'{}')");
+ p.setString(1, "h1");
+ p.setString(2, "s1");
+ Pair<Integer, ResultSet> resultPair =
p.unwrap(PhoenixPreparedStatement.class).executeAtomicUpdateReturnRow();
+ Assert.assertEquals(1, resultPair.getFirst().intValue());
+ Assert.assertEquals(bsonDoc, resultPair.getSecond().getObject(3));
+
+ p = conn.prepareStatement("UPSERT INTO " + tableName + " VALUES (?,?)
ON DUPLICATE KEY UPDATE\n" +
+ " COL = BSON_UPDATE_EXPRESSION(COL,?)");
+ p.setString(1, "h1");
+ p.setString(2, "s1");
+ p.setObject(3, new BsonDocument());
+ resultPair =
p.unwrap(PhoenixPreparedStatement.class).executeAtomicUpdateReturnRow();
+ Assert.assertEquals(1, resultPair.getFirst().intValue());
+ Assert.assertEquals(bsonDoc, resultPair.getSecond().getObject(3));
+ }
+ }
+
@Test
public void testConditionalUpsertReturnRow() throws Exception {
Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);