|
36 | 36 | import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; |
37 | 37 | import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
38 | 38 | import com.datastax.oss.driver.api.core.cql.BoundStatement; |
| 39 | +import com.datastax.oss.driver.api.core.cql.ColumnDefinition; |
39 | 40 | import com.datastax.oss.driver.api.core.cql.ColumnDefinitions; |
40 | 41 | import com.datastax.oss.driver.api.core.cql.PreparedStatement; |
41 | 42 | import com.datastax.oss.driver.api.core.cql.ResultSet; |
|
56 | 57 | import com.datastax.oss.driver.internal.core.DefaultProtocolFeature; |
57 | 58 | import com.datastax.oss.driver.internal.core.ProtocolVersionRegistry; |
58 | 59 | import com.datastax.oss.driver.internal.core.context.InternalDriverContext; |
| 60 | +import com.datastax.oss.driver.internal.core.type.DefaultUserDefinedType; |
59 | 61 | import com.datastax.oss.driver.internal.core.util.RoutingKey; |
60 | 62 | import com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures; |
61 | 63 | import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableList; |
@@ -397,6 +399,53 @@ public void should_set_all_occurrences_of_variable() { |
397 | 399 | should_set_all_occurrences_of_variable(ps.boundStatementBuilder().setInt(id, 12).build()); |
398 | 400 | } |
399 | 401 |
|
| 402 | + @Test |
| 403 | + public void disable_skip_metadata() { |
| 404 | + // v0 is an int column, but we'll bind a String to it |
| 405 | + try (CqlSession session = sessionWithNoSkipMetadata()) { |
| 406 | + session.execute("CREATE TYPE IF NOT EXISTS udttype(x int, y int)"); |
| 407 | + |
| 408 | + session.execute("CREATE TABLE udt_test (pk int, v udttype, PRIMARY KEY (pk))"); |
| 409 | + session.execute("CREATE TABLE regular_table (pk int, v int, PRIMARY KEY (pk))"); |
| 410 | + |
| 411 | + session.execute("INSERT INTO regular_table (pk, v) VALUES (1, 1)"); |
| 412 | + session.execute("INSERT INTO udt_test (pk, v) VALUES (1, {x: 1, y: 1})"); |
| 413 | + |
| 414 | + PreparedStatement prepared_regular_table = |
| 415 | + session.prepare("SELECT * FROM regular_table WHERE pk = ?"); |
| 416 | + PreparedStatement prepared_udt_all = session.prepare("SELECT * FROM udt_test WHERE pk = ?"); |
| 417 | + PreparedStatement prepared_udt_concrete = |
| 418 | + session.prepare("SELECT pk, v FROM udt_test WHERE pk = ?"); |
| 419 | + |
| 420 | + Row row = session.execute(prepared_udt_all.bind(1)).one(); |
| 421 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(2); |
| 422 | + assertThat(get_udt_column_count(row.getColumnDefinitions().get(1))).isEqualTo(2); |
| 423 | + row = session.execute(prepared_udt_concrete.bind(1)).one(); |
| 424 | + assertThat(get_udt_column_count(row.getColumnDefinitions().get(1))).isEqualTo(2); |
| 425 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(2); |
| 426 | + row = session.execute(prepared_regular_table.bind(1)).one(); |
| 427 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(2); |
| 428 | + |
| 429 | + session.execute("ALTER TABLE regular_table ADD z int;"); |
| 430 | + session.execute("ALTER TYPE udttype ADD z int;"); |
| 431 | + |
| 432 | + row = session.execute(prepared_udt_all.bind(1)).one(); |
| 433 | + row.getUdtValue(1); |
| 434 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(2); |
| 435 | + assertThat(get_udt_column_count(row.getColumnDefinitions().get(1))).isEqualTo(3); |
| 436 | + row = session.execute(prepared_udt_concrete.bind(1)).one(); |
| 437 | + row.getUdtValue(1); |
| 438 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(2); |
| 439 | + assertThat(get_udt_column_count(row.getColumnDefinitions().get(1))).isEqualTo(3); |
| 440 | + row = session.execute(prepared_regular_table.bind(1)).one(); |
| 441 | + assertThat(row.getColumnDefinitions().size()).isEqualTo(3); |
| 442 | + } |
| 443 | + } |
| 444 | + |
| 445 | + private int get_udt_column_count(ColumnDefinition cd) { |
| 446 | + return ((DefaultUserDefinedType) cd.getType()).getFieldTypes().size(); |
| 447 | + } |
| 448 | + |
400 | 449 | private void should_set_all_occurrences_of_variable(BoundStatement bs) { |
401 | 450 | assertThat(bs.getInt(0)).isEqualTo(12); |
402 | 451 | assertThat(bs.getInt(1)).isEqualTo(12); |
@@ -448,6 +497,18 @@ private CqlSession sessionWithCustomCodec(CqlIntToStringCodec codec) { |
448 | 497 | .build(); |
449 | 498 | } |
450 | 499 |
|
| 500 | + private CqlSession sessionWithNoSkipMetadata() { |
| 501 | + return (CqlSession) |
| 502 | + SessionUtils.baseBuilder() |
| 503 | + .addContactEndPoints(ccmRule.getContactPoints()) |
| 504 | + .withKeyspace(sessionRule.keyspace()) |
| 505 | + .withConfigLoader( |
| 506 | + SessionUtils.configLoaderBuilder() |
| 507 | + .withBoolean(DefaultDriverOption.REQUEST_DISABLE_SKIP_METADATA, true) |
| 508 | + .build()) |
| 509 | + .build(); |
| 510 | + } |
| 511 | + |
451 | 512 | private boolean supportsPerRequestKeyspace(CqlSession session) { |
452 | 513 | InternalDriverContext context = (InternalDriverContext) session.getContext(); |
453 | 514 | ProtocolVersionRegistry protocolVersionRegistry = context.getProtocolVersionRegistry(); |
|
0 commit comments