Skip to content

Commit 8e0769c

Browse files
committed
add Testcases
add JsonPartial Update Testcases fix Operation compare logic code prettier
1 parent bdbeef8 commit 8e0769c

File tree

2 files changed

+172
-1
lines changed

2 files changed

+172
-1
lines changed

Diff for: pymysqlreplication/packet.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ def read_binary_json(self, size, is_partial):
356356
data = data[path_length:]
357357

358358
value_length, _, n = length_encoded_int(data)
359-
if operation_number == JsonDiffOperation.Remove:
359+
if json_operation == JsonDiffOperation.Remove:
360360
return JsonDiff(json_operation, path)
361361

362362
data = data[n:]

Diff for: pymysqlreplication/tests/test_basic.py

+171
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import time
33
import unittest
44

5+
from pymysqlreplication.json_binary import JsonDiff, JsonDiffOperation
56
from pymysqlreplication.tests import base
67
from pymysqlreplication import BinLogStreamReader
78
from pymysqlreplication.gtid import GtidSet, Gtid
@@ -22,6 +23,7 @@
2223
"TestRowsQueryLogEvents",
2324
"TestOptionalMetaData",
2425
"TestColumnValueNoneSources",
26+
"TestJsonPartialUpdate",
2527
]
2628

2729

@@ -1838,6 +1840,175 @@ def test_get_none_invalid(self):
18381840
self.assertEqual(after_none_sources["col4"], "empty set")
18391841

18401842

1843+
class TestJsonPartialUpdate(base.PyMySQLReplicationTestCase):
1844+
def setUp(self):
1845+
super(TestJsonPartialUpdate, self).setUp()
1846+
self.stream.close()
1847+
self.stream = BinLogStreamReader(
1848+
self.database,
1849+
server_id=1024,
1850+
only_events=(PartialUpdateRowsEvent,),
1851+
)
1852+
if not self.isMySQL8014AndMore():
1853+
self.skipTest("Mysql version is under 8.0.14 - pass TestJsonPartialUpdate")
1854+
self.execute("SET SESSION binlog_row_image = 'FULL';")
1855+
self.execute("SET SESSION binlog_row_value_options = 'PARTIAL_JSON';")
1856+
1857+
def test_json_partial_update(self):
1858+
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
1859+
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1860+
insert_query = """INSERT INTO test_json_v2 VALUES (101,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}', '{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}','{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}');"""
1861+
update_query = """UPDATE test_json_v2 SET c = JSON_SET(c, '$.ab', '["ab_updatedccc"]') WHERE id = 101;"""
1862+
1863+
self.execute(create_query)
1864+
self.execute(column_add_query)
1865+
self.execute(insert_query)
1866+
self.execute(update_query)
1867+
1868+
self.execute("COMMIT;")
1869+
event = self.stream.fetchone()
1870+
1871+
if event.table_map[event.table_id].column_name_flag:
1872+
self.assertEqual(
1873+
event.rows[0]["before_values"]["c"],
1874+
{
1875+
b"a": b"aaaaaaaaaaaaa",
1876+
b"c": b"ccccccccccccccc",
1877+
b"ab": [b"abababababababa", b"babababababab"],
1878+
},
1879+
),
1880+
after_value_c: JsonDiff = event.rows[0]["after_values"]["c"]
1881+
self.assertEqual(after_value_c.op, JsonDiffOperation.Replace)
1882+
self.assertEqual(after_value_c.path, b"$.ab")
1883+
self.assertEqual(after_value_c.value, b'["ab_updatedccc"]')
1884+
1885+
after_none_sources = event.rows[0].get("after_none_sources")
1886+
self.assertEqual(after_none_sources["d"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
1887+
self.assertEqual(after_none_sources["e"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
1888+
1889+
def test_json_partial_update_column_value_none(self):
1890+
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
1891+
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
1892+
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1893+
insert_query = """INSERT INTO test_json_v2 VALUES (101,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1894+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1895+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}');"""
1896+
update_query = """UPDATE test_json_v2 SET e = JSON_SET(e, '$.ab', '["ab_updatedeee"]'), c=NULL WHERE id = 101;"""
1897+
1898+
self.execute(drop_table_if_exists_query)
1899+
self.execute(create_query)
1900+
self.execute(column_add_query)
1901+
self.execute(insert_query)
1902+
self.execute(update_query)
1903+
1904+
self.execute("COMMIT;")
1905+
event = self.stream.fetchone()
1906+
1907+
if event.table_map[event.table_id].column_name_flag:
1908+
self.assertEqual(
1909+
event.rows[0]["before_values"]["e"],
1910+
{
1911+
b"a": b"aaaaaaaaaaaaa",
1912+
b"c": b"ccccccccccccccc",
1913+
b"ab": [b"abababababababa", b"babababababab"],
1914+
},
1915+
),
1916+
after_value_e: JsonDiff = event.rows[0]["after_values"]["e"]
1917+
self.assertEqual(after_value_e.op, JsonDiffOperation.Replace)
1918+
self.assertEqual(after_value_e.path, b"$.ab")
1919+
self.assertEqual(after_value_e.value, b'["ab_updatedeee"]')
1920+
1921+
after_none_sources = event.rows[0].get("after_none_sources")
1922+
self.assertEqual(after_none_sources["c"], NONE_SOURCE.NULL)
1923+
self.assertEqual(after_none_sources["d"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
1924+
1925+
def test_json_partial_update_json_remove(self):
1926+
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
1927+
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
1928+
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1929+
insert_query = """INSERT INTO test_json_v2 VALUES (101,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1930+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1931+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}');"""
1932+
update_query = (
1933+
"""UPDATE test_json_v2 SET e = JSON_REMOVE(e, '$.ab') WHERE id = 101;"""
1934+
)
1935+
1936+
self.execute(drop_table_if_exists_query)
1937+
self.execute(create_query)
1938+
self.execute(column_add_query)
1939+
self.execute(insert_query)
1940+
self.execute(update_query)
1941+
1942+
self.execute("COMMIT;")
1943+
event = self.stream.fetchone()
1944+
1945+
if event.table_map[event.table_id].column_name_flag:
1946+
self.assertEqual(
1947+
event.rows[0]["before_values"]["e"],
1948+
{
1949+
b"a": b"aaaaaaaaaaaaa",
1950+
b"c": b"ccccccccccccccc",
1951+
b"ab": [b"abababababababa", b"babababababab"],
1952+
},
1953+
),
1954+
after_value_e: JsonDiff = event.rows[0]["after_values"]["e"]
1955+
self.assertEqual(after_value_e.op, JsonDiffOperation.Remove)
1956+
self.assertEqual(after_value_e.path, b"$.ab")
1957+
self.assertEqual(after_value_e.value, None)
1958+
1959+
after_none_sources = event.rows[0].get("after_none_sources")
1960+
self.assertEqual(after_none_sources["c"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
1961+
self.assertEqual(after_none_sources["d"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
1962+
1963+
def test_json_partial_update_two_column(self):
1964+
drop_table_if_exists_query = "DROP TABLE IF EXISTS test_json_v2;"
1965+
create_query = "CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;"
1966+
column_add_query = "ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;"
1967+
insert_query = """INSERT INTO test_json_v2 VALUES (101,'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1968+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}',
1969+
'{"a":"aaaaaaaaaaaaa", "c":"ccccccccccccccc", "ab":["abababababababa", "babababababab"]}');"""
1970+
update_query = """UPDATE test_json_v2 SET d = JSON_SET(d, '$.ab', '["ab_ddd"]'), e = JSON_REMOVE(e, '$.ab') WHERE id = 101;"""
1971+
1972+
self.execute(drop_table_if_exists_query)
1973+
self.execute(create_query)
1974+
self.execute(column_add_query)
1975+
self.execute(insert_query)
1976+
self.execute(update_query)
1977+
1978+
self.execute("COMMIT;")
1979+
event = self.stream.fetchone()
1980+
1981+
if event.table_map[event.table_id].column_name_flag:
1982+
self.assertEqual(
1983+
event.rows[0]["before_values"]["d"],
1984+
{
1985+
b"a": b"aaaaaaaaaaaaa",
1986+
b"c": b"ccccccccccccccc",
1987+
b"ab": [b"abababababababa", b"babababababab"],
1988+
},
1989+
),
1990+
self.assertEqual(
1991+
event.rows[0]["before_values"]["e"],
1992+
{
1993+
b"a": b"aaaaaaaaaaaaa",
1994+
b"c": b"ccccccccccccccc",
1995+
b"ab": [b"abababababababa", b"babababababab"],
1996+
},
1997+
),
1998+
after_value_d: JsonDiff = event.rows[0]["after_values"]["d"]
1999+
self.assertEqual(after_value_d.op, JsonDiffOperation.Replace)
2000+
self.assertEqual(after_value_d.path, b"$.ab")
2001+
self.assertEqual(after_value_d.value, b'["ab_ddd"]')
2002+
2003+
after_value_e: JsonDiff = event.rows[0]["after_values"]["e"]
2004+
self.assertEqual(after_value_e.op, JsonDiffOperation.Remove)
2005+
self.assertEqual(after_value_e.path, b"$.ab")
2006+
self.assertEqual(after_value_e.value, None)
2007+
2008+
after_none_sources = event.rows[0].get("after_none_sources")
2009+
self.assertEqual(after_none_sources["c"], NONE_SOURCE.JSON_PARTIAL_UPDATE)
2010+
2011+
18412012
if __name__ == "__main__":
18422013
import unittest
18432014

0 commit comments

Comments
 (0)