Skip to content

Commit 4599547

Browse files
authored
Add a test to verify setOption LOG_QUERY works per statement (#3369)
This PR adds a test to verify that `RelationalConnection.setOption(LOG_QUERY, true)`, on an existing connection, works as expected. That is, we can put it `true` before executing a statement and set it to `false` to disable logging afterwards.
1 parent 5caafc5 commit 4599547

File tree

1 file changed

+120
-1
lines changed

1 file changed

+120
-1
lines changed

fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/QueryLoggingTest.java

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,30 @@
2222

2323
import com.apple.foundationdb.record.PlanHashable;
2424
import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreBase;
25+
import com.apple.foundationdb.relational.api.Continuation;
2526
import com.apple.foundationdb.relational.api.Options;
2627
import com.apple.foundationdb.relational.api.RelationalConnection;
2728
import com.apple.foundationdb.relational.api.RelationalDriver;
29+
import com.apple.foundationdb.relational.api.RelationalPreparedStatement;
2830
import com.apple.foundationdb.relational.api.RelationalResultSet;
2931
import com.apple.foundationdb.relational.recordlayer.query.AstNormalizer;
3032
import com.apple.foundationdb.relational.recordlayer.query.PlanContext;
3133
import com.apple.foundationdb.relational.recordlayer.query.PlanGenerator;
3234
import com.apple.foundationdb.relational.utils.SimpleDatabaseRule;
3335
import com.apple.foundationdb.relational.utils.TestSchemas;
34-
3536
import org.apache.logging.log4j.Level;
3637
import org.assertj.core.api.Assertions;
3738
import org.junit.Assert;
3839
import org.junit.jupiter.api.Order;
3940
import org.junit.jupiter.api.Test;
4041
import org.junit.jupiter.api.extension.RegisterExtension;
42+
import org.junit.jupiter.params.ParameterizedTest;
43+
import org.junit.jupiter.params.provider.ValueSource;
4144

4245
import java.sql.DriverManager;
4346
import java.sql.PreparedStatement;
4447
import java.sql.ResultSet;
48+
import java.sql.SQLException;
4549
import java.sql.Statement;
4650
import java.util.List;
4751

@@ -169,6 +173,115 @@ void testRelationalConnectionOptionExplicitlyDisabled() throws Exception {
169173
}
170174
}
171175

176+
@Test
177+
void testRelationalConnectionSetLogOnThenOff() throws Exception {
178+
final var driver = (RelationalDriver) DriverManager.getDriver(database.getConnectionUri().toString());
179+
try (RelationalConnection conn = driver.connect(database.getConnectionUri(), Options.NONE)) {
180+
conn.setSchema(database.getSchemaName());
181+
try (Statement stmt = conn.createStatement()) {
182+
try (ResultSet rs = stmt.executeQuery("select name from restaurant")) {
183+
rs.next();
184+
}
185+
Assertions.assertThat(logAppender.getLogEvents()).isEmpty();
186+
}
187+
// set logging to true
188+
conn.setOption(Options.Name.LOG_QUERY, true);
189+
try (PreparedStatement ps = conn.prepareStatement("SELECT name from restaurant where rest_no = ?")) {
190+
ps.setLong(1, 0);
191+
try (ResultSet rs = ps.executeQuery()) {
192+
rs.next();
193+
}
194+
Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("query=\"SELECT 'NAME' from 'RESTAURANT' where 'REST_NO' = ?\"");
195+
Assertions.assertThat(logAppender.getLogEvents()).hasSize(1);
196+
}
197+
logAppender.getLogEvents().clear();
198+
// ... and then explicitly to false
199+
conn.setOption(Options.Name.LOG_QUERY, false);
200+
try (Statement stmt = conn.createStatement()) {
201+
try (ResultSet rs = stmt.executeQuery("select name from restaurant")) {
202+
rs.next();
203+
}
204+
Assertions.assertThat(logAppender.getLogEvents()).isEmpty();
205+
}
206+
}
207+
}
208+
209+
@Test
210+
void testRelationalConnectionSetLogIsOverriddenByQueryOption() throws Exception {
211+
final var driver = (RelationalDriver) DriverManager.getDriver(database.getConnectionUri().toString());
212+
try (RelationalConnection conn = driver.connect(database.getConnectionUri(), Options.NONE)) {
213+
conn.setSchema(database.getSchemaName());
214+
conn.setOption(Options.Name.LOG_QUERY, false);
215+
try (PreparedStatement ps = conn.prepareStatement("SELECT name from restaurant where rest_no = ? OPTIONS(LOG QUERY)")) {
216+
ps.setLong(1, 0);
217+
try (ResultSet rs = ps.executeQuery()) {
218+
rs.next();
219+
}
220+
Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("query=\"SELECT 'NAME' from 'RESTAURANT' where 'REST_NO' = ?\"");
221+
Assertions.assertThat(logAppender.getLogEvents()).hasSize(1);
222+
}
223+
}
224+
}
225+
226+
@Test
227+
void testRelationalConnectionSetLogIsOverriddenByExecuteContinuationQueryOption() throws Exception {
228+
insertRows();
229+
final var driver = (RelationalDriver) DriverManager.getDriver(database.getConnectionUri().toString());
230+
try (RelationalConnection conn = driver.connect(database.getConnectionUri(), Options.NONE)) {
231+
Continuation continuation;
232+
conn.setSchema(database.getSchemaName());
233+
try (RelationalPreparedStatement ps = conn.prepareStatement("SELECT name from restaurant")) {
234+
ps.setMaxRows(1);
235+
try (RelationalResultSet rs = ps.executeQuery()) {
236+
rs.next();
237+
continuation = rs.getContinuation();
238+
}
239+
Assertions.assertThat(logAppender.getLogEvents()).isEmpty();
240+
}
241+
conn.setOption(Options.Name.LOG_QUERY, false);
242+
try (RelationalPreparedStatement ps = conn.prepareStatement("EXECUTE CONTINUATION ?continuation OPTIONS(LOG QUERY)")) {
243+
ps.setBytes("continuation", continuation.serialize());
244+
try (RelationalResultSet rs = ps.executeQuery()) {
245+
rs.next();
246+
}
247+
Assertions.assertThat(logAppender.getLogEvents()).isNotEmpty();
248+
Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING <,> -> [NAME: VALUE[0], REST_NO: KEY[0]]) | MAP (_.NAME AS NAME)\"");
249+
}
250+
}
251+
}
252+
253+
@ParameterizedTest
254+
@ValueSource(booleans = {true, false})
255+
void testRelationalConnectionSetLogWithExecuteContinuation(boolean setLogging) throws Exception {
256+
insertRows();
257+
final var driver = (RelationalDriver) DriverManager.getDriver(database.getConnectionUri().toString());
258+
try (RelationalConnection conn = driver.connect(database.getConnectionUri(), Options.NONE)) {
259+
Continuation continuation;
260+
conn.setSchema(database.getSchemaName());
261+
try (RelationalPreparedStatement ps = conn.prepareStatement("SELECT name from restaurant")) {
262+
ps.setMaxRows(1);
263+
try (RelationalResultSet rs = ps.executeQuery()) {
264+
rs.next();
265+
continuation = rs.getContinuation();
266+
}
267+
Assertions.assertThat(logAppender.getLogEvents()).isEmpty();
268+
}
269+
conn.setOption(Options.Name.LOG_QUERY, setLogging);
270+
try (RelationalPreparedStatement ps = conn.prepareStatement("EXECUTE CONTINUATION ?continuation")) {
271+
ps.setBytes("continuation", continuation.serialize());
272+
try (RelationalResultSet rs = ps.executeQuery()) {
273+
rs.next();
274+
}
275+
if (!setLogging) {
276+
Assertions.assertThat(logAppender.getLogEvents()).isEmpty();
277+
} else {
278+
Assertions.assertThat(logAppender.getLogEvents()).isNotEmpty();
279+
Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING <,> -> [NAME: VALUE[0], REST_NO: KEY[0]]) | MAP (_.NAME AS NAME)\"");
280+
}
281+
}
282+
}
283+
}
284+
172285
@Test
173286
void testLogQueryBecauseLoggerIsSetToDebug() throws Exception {
174287
try (LogAppenderRule debugRule = LogAppenderRule.of("DebugLogAppender", PlanGenerator.class, Level.DEBUG)) {
@@ -272,4 +385,10 @@ void testLogDelete() throws Exception {
272385
statement.executeUpdate("DELETE FROM RESTAURANT WHERE rest_no = 54 OPTIONS (LOG QUERY)");
273386
Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("query=\"DELETE FROM 'RESTAURANT' WHERE 'REST_NO' = ?\"");
274387
}
388+
389+
// insert to the table and closes the running statement.
390+
private void insertRows() throws SQLException {
391+
statement.executeUpdate("INSERT INTO RESTAURANT(REST_NO) VALUES (1), (2), (3)");
392+
statement.close();
393+
}
275394
}

0 commit comments

Comments
 (0)