Skip to content

partial update row event #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Oct 29, 2023
Merged

partial update row event #1

merged 9 commits into from
Oct 29, 2023

Conversation

sean-k1
Copy link
Owner

@sean-k1 sean-k1 commented Oct 14, 2023

Partial Update Row Event

Description

The partial update row event is an event introduced for performance in Mysql 8.0 JSON Update and is an inherited event of UpdateRowEvent.

The partial update row event is only heard for values that have changed for the Json column.
Therefore, it is not possible to determine if the value is actually null or has not changed.

To solve this issue, I think we need to further distinguish the Partial_Json_Null type like julien-duponchelle#489.

Example

SET  SESSION binlog_row_image = "FULL";
SET SESSION binlog_row_value_options = 'PARTIAL_JSON';
drop table if exists test_json_v2;
CREATE TABLE test_json_v2 (id INT, c JSON,PRIMARY KEY (id)) ;
ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL;
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"]}');
UPDATE test_json_v2 SET c = JSON_SET(c, '$.ab', '["ab_updatedccc"]') WHERE id = 101;
UPDATE test_json_v2 SET d = JSON_SET(d, '$.ab', '["ab_updatedddd"]') WHERE id = 101;
UPDATE test_json_v2 SET e = JSON_SET(e, '$.ab', '["ab_updatedeee"]') WHERE id = 101;
UPDATE test_json_v2 SET d = JSON_SET(d, '$.ab', '["ab_ddd"]'), e = json_set(e, '$.ab', '["ab_eee"]') WHERE id = 101;

Dump

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 412
Event size: 153
Read bytes: 153
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: DROP TABLE IF EXISTS `test_json_v2` /* generated by server */

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 692
Event size: 178
Read bytes: 178
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: CREATE TABLE test_json_v2 (
			id INT, 
			c JSON,
			PRIMARY KEY (id)
			)

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 984
Event size: 190
Read bytes: 190
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: ALTER TABLE test_json_v2 ADD COLUMN d JSON DEFAULT NULL, ADD COLUMN e JSON DEFAULT NULL

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 1157
Event size: 71
Read bytes: 71
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: BEGIN

=== TableMapEvent ===
Date: 2023-10-14T11:28:39
Log position: 1257
Event size: 77
Read bytes: 77
Table id: 3965
Schema: pymysqlreplication_test
Table: test_json_v2
Columns: 4
=== OptionalMetaData ===
unsigned_column_list: [False, False, False, False]
default_charset_collation: None
charset_collation: {}
column_charset: []
column_name_list: ['id', 'c', 'd', 'e']
set_str_value_list : []
set_enum_str_value_list : []
geometry_type_list : []
simple_primary_key_list: [0]
primary_keys_with_prefix: {}
visibility_list: [True, True, True, True]
charset_collation_list: []
enum_and_set_collation_list: []

=== WriteRowsEvent ===
Date: 2023-10-14T11:28:39
Log position: 1609
Event size: 329
Read bytes: 12
Table: pymysqlreplication_test.test_json_v2
Affected columns: 4
Changed rows: 1
Column Name Information Flag: True
Values:
--
* id : 101
* c : {b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}
* d : {b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}
* e : {b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}

=== XidEvent ===
Date: 2023-10-14T11:28:39
Log position: 1640
Event size: 8
Read bytes: 8
Transaction ID: 15864

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 1822
Event size: 80
Read bytes: 80
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: BEGIN

=== TableMapEvent ===
Date: 2023-10-14T11:28:39
Log position: 1922
Event size: 77
Read bytes: 77
Table id: 3965
Schema: pymysqlreplication_test
Table: test_json_v2
Columns: 4
=== OptionalMetaData ===
unsigned_column_list: [False, False, False, False]
default_charset_collation: None
charset_collation: {}
column_charset: []
column_name_list: ['id', 'c', 'd', 'e']
set_str_value_list : []
set_enum_str_value_list : []
geometry_type_list : []
simple_primary_key_list: [0]
primary_keys_with_prefix: {}
visibility_list: [True, True, True, True]
charset_collation_list: []
enum_and_set_collation_list: []

=== PartialUpdateRowsEvent ===
Date: 2023-10-14T11:28:39
Log position: 2320
Event size: 375
Read bytes: 13
Values:
--
*id:101=>101
*c:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>JsonDiff(op :JsonDiffOperation.Replace path :$.ab value :["ab_updatedccc"])
*d:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>None
*e:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>None

=== XidEvent ===
Date: 2023-10-14T11:28:39
Log position: 2351
Event size: 8
Read bytes: 8
Transaction ID: 15865

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 2533
Event size: 80
Read bytes: 80
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: BEGIN

=== TableMapEvent ===
Date: 2023-10-14T11:28:39
Log position: 2633
Event size: 77
Read bytes: 77
Table id: 3965
Schema: pymysqlreplication_test
Table: test_json_v2
Columns: 4
=== OptionalMetaData ===
unsigned_column_list: [False, False, False, False]
default_charset_collation: None
charset_collation: {}
column_charset: []
column_name_list: ['id', 'c', 'd', 'e']
set_str_value_list : []
set_enum_str_value_list : []
geometry_type_list : []
simple_primary_key_list: [0]
primary_keys_with_prefix: {}
visibility_list: [True, True, True, True]
charset_collation_list: []
enum_and_set_collation_list: []

=== PartialUpdateRowsEvent ===
Date: 2023-10-14T11:28:39
Log position: 3031
Event size: 375
Read bytes: 13
Values:
--
*id:101=>101
*c:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedccc"]'}=>None
*d:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>JsonDiff(op :JsonDiffOperation.Replace path :$.ab value :["ab_updatedddd"])
*e:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>None

=== XidEvent ===
Date: 2023-10-14T11:28:39
Log position: 3062
Event size: 8
Read bytes: 8
Transaction ID: 15866

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 3244
Event size: 80
Read bytes: 80
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: BEGIN

=== TableMapEvent ===
Date: 2023-10-14T11:28:39
Log position: 3344
Event size: 77
Read bytes: 77
Table id: 3965
Schema: pymysqlreplication_test
Table: test_json_v2
Columns: 4
=== OptionalMetaData ===
unsigned_column_list: [False, False, False, False]
default_charset_collation: None
charset_collation: {}
column_charset: []
column_name_list: ['id', 'c', 'd', 'e']
set_str_value_list : []
set_enum_str_value_list : []
geometry_type_list : []
simple_primary_key_list: [0]
primary_keys_with_prefix: {}
visibility_list: [True, True, True, True]
charset_collation_list: []
enum_and_set_collation_list: []

=== PartialUpdateRowsEvent ===
Date: 2023-10-14T11:28:39
Log position: 3742
Event size: 375
Read bytes: 13
Values:
--
*id:101=>101
*c:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedccc"]'}=>None
*d:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedddd"]'}=>None
*e:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': [b'abababababababa', b'babababababab']}=>JsonDiff(op :JsonDiffOperation.Replace path :$.ab value :["ab_updatedeee"])

=== XidEvent ===
Date: 2023-10-14T11:28:39
Log position: 3773
Event size: 8
Read bytes: 8
Transaction ID: 15868

=== QueryEvent ===
Date: 2023-10-14T11:28:39
Log position: 3955
Event size: 80
Read bytes: 80
Schema: b'pymysqlreplication_test'
Execution time: 0
Query: BEGIN

=== TableMapEvent ===
Date: 2023-10-14T11:28:39
Log position: 4055
Event size: 77
Read bytes: 77
Table id: 3965
Schema: pymysqlreplication_test
Table: test_json_v2
Columns: 4
=== OptionalMetaData ===
unsigned_column_list: [False, False, False, False]
default_charset_collation: None
charset_collation: {}
column_charset: []
column_name_list: ['id', 'c', 'd', 'e']
set_str_value_list : []
set_enum_str_value_list : []
geometry_type_list : []
simple_primary_key_list: [0]
primary_keys_with_prefix: {}
visibility_list: [True, True, True, True]
charset_collation_list: []
enum_and_set_collation_list: []

=== PartialUpdateRowsEvent ===
Date: 2023-10-14T11:28:39
Log position: 4465
Event size: 387
Read bytes: 13
Values:
--
*id:101=>101
*c:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedccc"]'}=>None
*d:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedddd"]'}=>JsonDiff(op :JsonDiffOperation.Replace path :$.ab value :["ab_ddd"])
*e:{b'a': b'aaaaaaaaaaaaa', b'c': b'ccccccccccccccc', b'ab': b'["ab_updatedeee"]'}=>JsonDiff(op :JsonDiffOperation.Replace path :$.ab value :["ab_eee"])

=== XidEvent ===
Date: 2023-10-14T11:28:39
Log position: 4496
Event size: 8
Read bytes: 8
Transaction ID: 15869

Ref

https://dev.mysql.com/blog-archive/partial-update-of-json-values/

@sean-k1 sean-k1 force-pushed the feature/partial-update-row-event branch 2 times, most recently from 06c9225 to 8e0769c Compare October 14, 2023 15:14
add JsonPartial Update Testcases
fix Operation compare logic
code prettier

typo error
@sean-k1 sean-k1 force-pushed the feature/partial-update-row-event branch from 8e0769c to 6f77f70 Compare October 16, 2023 04:00
add some comment

 test code prettier
@sean-k1 sean-k1 force-pushed the feature/partial-update-row-event branch from f4b18ab to 3f11f3d Compare October 16, 2023 05:31
@sean-k1 sean-k1 merged commit 362b489 into main Oct 29, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant