Skip to content

Commit 620c10b

Browse files
committed
add integration test for mysql 8.0 json partial update
1 parent e775757 commit 620c10b

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

src/test/java/com/github/shyiko/mysql/binlog/event/deserialization/json/JsonBinaryValueIntegrationTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,72 @@ public void execute(Statement statement) throws SQLException {
106106
eventListener.reset();
107107
}
108108

109+
@Test
110+
public void testMysql8JsonSetPartialUpdateWithHoles() throws Exception {
111+
CountDownEventListener eventListener = new CountDownEventListener();
112+
client.registerEventListener(eventListener);
113+
CapturingEventListener capturingEventListener = new CapturingEventListener();
114+
client.registerEventListener(capturingEventListener);
115+
String json = "{\"age\":22,\"addr\":{\"code\":100,\"detail\":{\"ab\":\"970785C8-C299\"}},\"name\":\"Alice\"}";
116+
master.execute("DROP TABLE IF EXISTS json_test", "create table json_test (j JSON)",
117+
"INSERT INTO json_test VALUES ('" + json + "')",
118+
"UPDATE json_test SET j = JSON_SET(j, '$.addr.detail.ab', '970785C8')");
119+
eventListener.waitFor(WriteRowsEventData.class, 1, DEFAULT_TIMEOUT);
120+
eventListener.waitFor(UpdateRowsEventData.class, 1, DEFAULT_TIMEOUT);
121+
List<WriteRowsEventData> events = capturingEventListener.getEvents(WriteRowsEventData.class);
122+
Serializable[] insertData = events.iterator().next().getRows().get(0);
123+
assertEquals(JsonBinary.parseAsString((byte[]) insertData[0]), json);
124+
125+
List<UpdateRowsEventData> updateEvents = capturingEventListener.getEvents(UpdateRowsEventData.class);
126+
Serializable[] updateData = updateEvents.iterator().next().getRows().get(0).getValue();
127+
assertEquals(JsonBinary.parseAsString((byte[]) updateData[0]), json.replace("970785C8-C299", "970785C8"));
128+
assertEquals(((byte[]) updateData[0]).length, ((byte[]) insertData[0]).length);
129+
}
130+
131+
@Test
132+
public void testMysql8JsonRemovePartialUpdateWithHoles() throws Exception {
133+
CountDownEventListener eventListener = new CountDownEventListener();
134+
client.registerEventListener(eventListener);
135+
CapturingEventListener capturingEventListener = new CapturingEventListener();
136+
client.registerEventListener(capturingEventListener);
137+
String json = "{\"age\":22,\"addr\":{\"code\":100,\"detail\":{\"ab\":\"970785C8-C299\"}},\"name\":\"Alice\"}";
138+
master.execute("DROP TABLE IF EXISTS json_test", "create table json_test (j JSON)",
139+
"INSERT INTO json_test VALUES ('" + json + "')",
140+
"UPDATE json_test SET j = JSON_REMOVE(j, '$.addr.detail.ab')");
141+
eventListener.waitFor(WriteRowsEventData.class, 1, DEFAULT_TIMEOUT);
142+
eventListener.waitFor(UpdateRowsEventData.class, 1, DEFAULT_TIMEOUT);
143+
List<WriteRowsEventData> events = capturingEventListener.getEvents(WriteRowsEventData.class);
144+
Serializable[] insertData = events.iterator().next().getRows().get(0);
145+
assertEquals(JsonBinary.parseAsString((byte[]) insertData[0]), json);
146+
147+
List<UpdateRowsEventData> updateEvents = capturingEventListener.getEvents(UpdateRowsEventData.class);
148+
Serializable[] updateData = updateEvents.iterator().next().getRows().get(0).getValue();
149+
assertEquals(JsonBinary.parseAsString((byte[]) updateData[0]), json.replace("\"ab\":\"970785C8-C299\"", ""));
150+
assertEquals(((byte[]) updateData[0]).length, ((byte[]) insertData[0]).length);
151+
}
152+
153+
@Test
154+
public void testMysql8JsonReplacePartialUpdateWithHoles() throws Exception {
155+
CountDownEventListener eventListener = new CountDownEventListener();
156+
client.registerEventListener(eventListener);
157+
CapturingEventListener capturingEventListener = new CapturingEventListener();
158+
client.registerEventListener(capturingEventListener);
159+
String json = "{\"age\":22,\"addr\":{\"code\":100,\"detail\":{\"ab\":\"970785C8-C299\"}},\"name\":\"Alice\"}";
160+
master.execute("DROP TABLE IF EXISTS json_test", "create table json_test (j JSON)",
161+
"INSERT INTO json_test VALUES ('" + json + "')",
162+
"UPDATE json_test SET j = JSON_REPLACE(j, '$.addr.detail.ab', '9707')");
163+
eventListener.waitFor(WriteRowsEventData.class, 1, DEFAULT_TIMEOUT);
164+
eventListener.waitFor(UpdateRowsEventData.class, 1, DEFAULT_TIMEOUT);
165+
List<WriteRowsEventData> events = capturingEventListener.getEvents(WriteRowsEventData.class);
166+
Serializable[] insertData = events.iterator().next().getRows().get(0);
167+
assertEquals(JsonBinary.parseAsString((byte[]) insertData[0]), json);
168+
169+
List<UpdateRowsEventData> updateEvents = capturingEventListener.getEvents(UpdateRowsEventData.class);
170+
Serializable[] updateData = updateEvents.iterator().next().getRows().get(0).getValue();
171+
assertEquals(JsonBinary.parseAsString((byte[]) updateData[0]), json.replace("970785C8-C299", "9707"));
172+
assertEquals(((byte[]) updateData[0]).length, ((byte[]) insertData[0]).length);
173+
}
174+
109175
@Test
110176
public void testValueBoundariesAreHonored() throws Exception {
111177
CountDownEventListener eventListener = new CountDownEventListener();

0 commit comments

Comments
 (0)