@@ -77,6 +77,30 @@ def create_table(self, create_query):
7777
7878 return event
7979
80+ def create_and_get_tablemap_event (self , bit ):
81+ """Create table and return tablemap event
82+
83+ Returns:
84+ Table map event
85+ """
86+ self .execute (create_query )
87+ self .execute (insert_query )
88+ self .execute ("COMMIT" )
89+
90+ self .assertIsInstance (self .stream .fetchone (), RotateEvent )
91+ self .assertIsInstance (self .stream .fetchone (), FormatDescriptionEvent )
92+ #QueryEvent for the Create Table
93+ self .assertIsInstance (self .stream .fetchone (), QueryEvent )
94+
95+ #QueryEvent for the BEGIN
96+ self .assertIsInstance (self .stream .fetchone (), QueryEvent )
97+
98+ event = self .stream .fetchone ()
99+
100+ self .assertEqual (event .event_type , TABLE_MAP_EVENT )
101+
102+ return event
103+
80104 def test_decimal (self ):
81105 create_query = "CREATE TABLE test (test DECIMAL(2,1))"
82106 insert_query = "INSERT INTO test VALUES(4.2)"
@@ -669,16 +693,75 @@ def test_status_vars(self):
669693 Note that if you change default db name 'pymysqlreplication_test',
670694 event.mts_accessed_db_names MUST be asserted against the changed db name.
671695
672- Returns:
673- binary string parsed from __data_buffer
674-
675696 Raises:
676- AssertionError: if no
697+ AssertionError: if status variables not set correctly
677698 """
678699 create_query = "CREATE TABLE test (id INTEGER)"
679700 event = self .create_table (create_query )
680701 self .assertEqual (event .catalog_nz_code , b'std' )
681702 self .assertEqual (event .mts_accessed_db_names , [b'pymysqlreplication_test' ])
682703
704+ def test_null_bitmask (self )
705+ """Test parse of null-bitmask in table map events
706+
707+ Create table with 16 columns with nullability specified by 'bit_mask' variable
708+ 'bit_mask' variable is asserted against null_bitmask attribute in table map event.
709+
710+ Raises:
711+ AssertionError: if null_bitmask isn't set as specified in 'bit_mask' variable
712+ """
713+
714+ # any 2-byte bitmask in little-endian hex bytes format (b'a\x03')
715+ ## b'a\x03' = 1101100001(2)
716+ bit_mask = b'a\x03 '
717+
718+ # Prepare create_query
719+ create_query = "CREATE TABLE test"
720+
721+ columns = []
722+ for i in range (16 ):
723+ # column_definition consists of...
724+ ## column name, column type, nullability
725+ column_definition = []
726+
727+ column_name = chr (ord ('a' ) + i )
728+ column_definition .append (column_name )
729+
730+ column_type = "INT"
731+ column_definition .append (column_type )
732+
733+ nullability = "NOT NULL" if not RowsEvent .__is_null (bit_mask , i ) else ""
734+ column_definition .append (nullability )
735+
736+ columns .append (" " .join (column_definition ))
737+
738+ create_query += f' ({ ", " .join (columns )} )'
739+
740+ # Prepare insert_query
741+ insert_query = "INSERT into test values"
742+
743+ values = []
744+ for i in range (16 ):
745+ values .append ('0' )
746+
747+ insert_query += f' ({ "," .join (values )} )' )
748+
749+ self .execute (create_query )
750+ self .execute (insert_query )
751+ self .execute ("COMMIT" )
752+
753+ self .assertIsInstance (self .stream .fetchone (), RotateEvent )
754+ self .assertIsInstance (self .stream .fetchone (), FormatDescriptionEvent )
755+ #QueryEvent for the Create Table
756+ self .assertIsInstance (self .stream .fetchone (), QueryEvent )
757+
758+ #QueryEvent for the BEGIN
759+ self .assertIsInstance (self .stream .fetchone (), QueryEvent )
760+
761+ event = self .stream .fetchone ()
762+
763+ self .assertEqual (event .event_type , TABLE_MAP_EVENT )
764+ self .assertEqual (event .null_bitmask , bit_mask )
765+
683766if __name__ == "__main__" :
684767 unittest .main ()
0 commit comments