@@ -79,6 +79,42 @@ void mysqlStartsAreStructured(String sql) throws Exception {
7979 assertInstanceOf (StartTransaction .class , roundTrip (sql , Dialect .MYSQL ));
8080 }
8181
82+ @ ParameterizedTest
83+ @ ValueSource (strings = {"START TRANSACTION READ ONLY, READ WRITE" ,
84+ "START TRANSACTION READ WRITE, READ ONLY" })
85+ void contradictoryAccessModesAreRejectedOnlyForMysql (String sql ) throws Exception {
86+ JSQLParserException error = assertThrows (JSQLParserException .class ,
87+ () -> parse (sql , Dialect .MYSQL ));
88+ assertTrue (error .getCause ().getMessage ()
89+ .contains ("cannot specify both READ ONLY and READ WRITE" ));
90+ assertThrows (JSQLParserException .class ,
91+ () -> parse (sql .replace (", " , ", WITH CONSISTENT SNAPSHOT, " ), Dialect .MYSQL ));
92+ StartTransaction postgres = assertInstanceOf (StartTransaction .class ,
93+ roundTrip (sql , Dialect .POSTGRESQL ));
94+ List <StartTransaction .Mode > expected = sql .endsWith ("READ WRITE" )
95+ ? List .of (StartTransaction .Mode .READ_ONLY , StartTransaction .Mode .READ_WRITE )
96+ : List .of (StartTransaction .Mode .READ_WRITE , StartTransaction .Mode .READ_ONLY );
97+ assertEquals (expected , postgres .getModes ());
98+ assertEquals (sql , postgres .toString ());
99+ StartTransaction permissive = assertInstanceOf (StartTransaction .class ,
100+ CCJSqlParserUtil .parse (sql ));
101+ assertEquals (expected , permissive .getModes ());
102+ assertEquals (sql , permissive .toString ());
103+ }
104+
105+ @ ParameterizedTest
106+ @ ValueSource (strings = {"START TRANSACTION READ ONLY, READ ONLY" ,
107+ "START TRANSACTION READ WRITE, READ WRITE" })
108+ void mysqlRepeatedAccessModesArePreserved (String sql ) throws Exception {
109+ StartTransaction statement = assertInstanceOf (StartTransaction .class ,
110+ roundTrip (sql , Dialect .MYSQL ));
111+ StartTransaction .Mode mode = sql .endsWith ("READ ONLY" )
112+ ? StartTransaction .Mode .READ_ONLY
113+ : StartTransaction .Mode .READ_WRITE ;
114+ assertEquals (List .of (mode , mode ), statement .getModes ());
115+ assertEquals (sql , statement .toString ());
116+ }
117+
82118 @ ParameterizedTest
83119 @ ValueSource (strings = {"COMMIT" , "COMMIT WORK" , "COMMIT TRANSACTION" , "COMMIT AND CHAIN" ,
84120 "COMMIT WORK AND NO CHAIN" , "COMMIT TRANSACTION AND CHAIN" , "ROLLBACK" ,
0 commit comments