Skip to content

Commit 47f44a2

Browse files
authored
Updated implementation of TableTxExecutor (#130)
2 parents 03a729d + c98d831 commit 47f44a2

File tree

3 files changed

+78
-19
lines changed

3 files changed

+78
-19
lines changed

jdbc/src/main/java/tech/ydb/jdbc/context/TableTxExecutor.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,20 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
8787
@Override
8888
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params,
8989
long timeout, boolean keepInCache) throws SQLException {
90-
YdbQueryResult result = super.executeDataQuery(statement, query, preparedYql, params, timeout, keepInCache);
91-
isWriteTx = isInsideTransaction() && (isWriteTx || query.isWriting());
90+
try {
91+
YdbQueryResult result = super.executeDataQuery(statement, query, preparedYql, params, timeout, keepInCache);
92+
isWriteTx = isInsideTransaction() && (isWriteTx || query.isWriting());
93+
return result;
94+
} catch (YdbConditionallyRetryableException ex) {
95+
if (isAutoCommit()) {
96+
throw ex;
97+
}
9298

93-
return result;
99+
Status status = Status.of(StatusCode.ABORTED).withCause(ex);
100+
throw ExceptionFactory.createException("Data query wasn't executed",
101+
new UnexpectedResultException(ex.getMessage(), status)
102+
);
103+
}
94104
}
95105

96106
@Override

jdbc/src/test/java/tech/ydb/jdbc/YdbDriverStaticCredsTest.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.junit.jupiter.api.AfterAll;
1010
import org.junit.jupiter.api.Assertions;
1111
import org.junit.jupiter.api.BeforeAll;
12-
import org.junit.jupiter.api.Disabled;
1312
import org.junit.jupiter.api.Test;
1413
import org.junit.jupiter.api.extension.RegisterExtension;
1514

@@ -22,7 +21,6 @@
2221
*
2322
* @author Aleksandr Gorshenin
2423
*/
25-
@Disabled
2624
public class YdbDriverStaticCredsTest {
2725
@RegisterExtension
2826
private static final YdbHelperExtension ydb = new YdbHelperExtension();
@@ -38,15 +36,17 @@ public static void createUsers() throws SQLException {
3836
statement.execute(""
3937
+ "CREATE USER user1 PASSWORD NULL;\n"
4038
+ "CREATE USER user2 PASSWORD 'pwss';\n"
41-
+ "CREATE USER user3 PASSWORD 'pw :ss;'\n;"
39+
+ "CREATE USER user3 PASSWORD 'pwss';\n"
40+
+ "CREATE USER user4 PASSWORD 'pw@&ss'\n;"
41+
+ "CREATE USER user5 PASSWORD 'pw@&ss'\n;"
4242
);
4343
}
4444
}
4545

4646
@AfterAll
4747
public static void dropUsers() throws SQLException {
4848
try (Statement statement = jdbc.connection().createStatement()) {
49-
statement.execute("DROP USER IF EXISTS user1, user2, user3;");
49+
statement.execute("DROP USER IF EXISTS user1, user2, user3, user4, user5;");
5050
}
5151
}
5252

@@ -91,10 +91,10 @@ public void connectOK() throws SQLException {
9191
testConnection(connectByAuthority("user1", null), "user1");
9292

9393
testConnection(connectByProperties("user2", "pwss"), "user2");
94-
testConnection(connectByAuthority("user2", "pwss"), "user2");
94+
testConnection(connectByAuthority("user3", "pwss"), "user3");
9595

96-
testConnection(connectByProperties("user3", "pw :ss;"), "user3");
97-
testConnection(connectByAuthority("user3", "pw :ss;"), "user3");
96+
testConnection(connectByProperties("user4", "pw@&ss"), "user4");
97+
testConnection(connectByAuthority("user5", "pw@&ss"), "user5");
9898
}
9999

100100
@Test
@@ -106,17 +106,17 @@ public void connectWrong() throws SQLException {
106106
wrongConnection(connectByProperties("user2", null));
107107
wrongConnection(connectByProperties("user2", "pass"));
108108

109-
wrongConnection(connectByAuthority("user2", ""));
110-
wrongConnection(connectByAuthority("user2", null));
111-
wrongConnection(connectByAuthority("user2", "pass"));
112-
113-
wrongConnection(connectByProperties("user3", ""));
114-
wrongConnection(connectByProperties("user3", null));
115-
wrongConnection(connectByProperties("user3", "pw:ss;"));
116-
117109
wrongConnection(connectByAuthority("user3", ""));
118110
wrongConnection(connectByAuthority("user3", null));
119-
wrongConnection(connectByAuthority("user3", "pw:ss;"));
111+
wrongConnection(connectByAuthority("user3", "pass"));
112+
113+
wrongConnection(connectByProperties("user4", ""));
114+
wrongConnection(connectByProperties("user4", null));
115+
wrongConnection(connectByProperties("user4", "pw:ss;"));
116+
117+
wrongConnection(connectByAuthority("user5", ""));
118+
wrongConnection(connectByAuthority("user5", null));
119+
wrongConnection(connectByAuthority("user5", "pw:@&ss"));
120120
}
121121

122122
interface ConnectionSupplier {

jdbc/src/test/java/tech/ydb/jdbc/YdbDriverTxValidateTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import tech.ydb.core.StatusCode;
1919
import tech.ydb.core.UnexpectedResultException;
2020
import tech.ydb.jdbc.context.YdbContext;
21+
import tech.ydb.jdbc.context.YdbExecutor;
22+
import tech.ydb.jdbc.exception.YdbConditionallyRetryableException;
23+
import tech.ydb.jdbc.exception.YdbRetryableException;
2124
import tech.ydb.jdbc.impl.YdbTracerImpl;
2225
import tech.ydb.jdbc.impl.helper.ExceptionAssert;
2326
import tech.ydb.jdbc.impl.helper.JdbcConnectionExtention;
@@ -153,6 +156,52 @@ public void commitedTxTest() throws SQLException {
153156
}
154157
}
155158

159+
@Test
160+
public void executeDataQueryTest() throws SQLException {
161+
String url = jdbcURL.withArg("withTxValidationTable", "tx1_store").build();
162+
try (Connection conn = DriverManager.getConnection(url)) {
163+
ErrorTxTracer tracer = YdbTracerImpl.use(new ErrorTxTracer());
164+
// table was created automatically
165+
assertTxCount("tx1_store", 0);
166+
167+
conn.setAutoCommit(true);
168+
try (Statement st = conn.createStatement()) {
169+
st.execute("DELETE FROM tx1_store");
170+
171+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.UNDETERMINED));
172+
YdbConditionallyRetryableException e = Assertions.assertThrows(YdbConditionallyRetryableException.class,
173+
() -> st.execute("DELETE FROM tx1_store"));
174+
Assertions.assertEquals(Status.of(StatusCode.UNDETERMINED), e.getStatus());
175+
176+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.ABORTED));
177+
YdbRetryableException e2 = Assertions.assertThrows(YdbRetryableException.class,
178+
() -> st.execute("DELETE FROM tx1_store"));
179+
Assertions.assertEquals(Status.of(StatusCode.ABORTED), e2.getStatus());
180+
}
181+
182+
183+
conn.setAutoCommit(false);
184+
try (Statement st = conn.createStatement()) {
185+
YdbExecutor executor = st.unwrap(YdbStatement.class).getConnection().getExecutor();
186+
st.execute("DELETE FROM tx1_store");
187+
conn.commit();
188+
189+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.UNDETERMINED));
190+
YdbRetryableException e = Assertions.assertThrows(YdbRetryableException.class,
191+
() -> st.execute("DELETE FROM tx1_store"));
192+
Assertions.assertEquals(StatusCode.ABORTED, e.getStatus().getCode());
193+
Assertions.assertNotNull(e.getStatus().getCause());
194+
195+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.ABORTED));
196+
YdbRetryableException e2 = Assertions.assertThrows(YdbRetryableException.class,
197+
() -> st.execute("DELETE FROM tx1_store"));
198+
Assertions.assertEquals(Status.of(StatusCode.ABORTED), e2.getStatus());
199+
}
200+
} finally {
201+
jdbc.connection().createStatement().execute("DROP TABLE tx1_store");
202+
}
203+
}
204+
156205
@Test
157206
public void invalididTxTableTest() throws SQLException {
158207
String url = jdbcURL.withArg("withTxValidationTable", "tx store").build();

0 commit comments

Comments
 (0)