@@ -106,6 +106,72 @@ public void execute(Statement statement) throws SQLException {
106
106
eventListener .reset ();
107
107
}
108
108
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
+
109
175
@ Test
110
176
public void testValueBoundariesAreHonored () throws Exception {
111
177
CountDownEventListener eventListener = new CountDownEventListener ();
0 commit comments