Skip to content

Commit bbea838

Browse files
committed
fix: serialize bound statement ddl in ci
1 parent dcb92a4 commit bbea838

1 file changed

Lines changed: 113 additions & 106 deletions

File tree

integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BoundStatementCcmIT.java

Lines changed: 113 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -452,114 +452,121 @@ public static Object[][] cql4SkipMetadataResolveMethod() {
452452
@UseDataProvider(value = "cql4SkipMetadataResolveMethod")
453453
public void prepared_stmt_metadata_update_loopholes_test(
454454
CQL4SkipMetadataResolveMethod cql4SkipMetadataResolveMethod) {
455-
// v0 is an int column, but we'll bind a String to it
456-
try (CqlSession session =
457-
sessionWithSkipCQL4MetadataResolveMethod(cql4SkipMetadataResolveMethod)) {
458-
String udtName =
459-
String.format(
460-
"skip_metadata_test_%s_udt", cql4SkipMetadataResolveMethod.name().toLowerCase());
461-
String udtTable =
462-
String.format(
463-
"skip_metadata_test_%s_udttable", cql4SkipMetadataResolveMethod.name().toLowerCase());
464-
String table =
465-
String.format(
466-
"skip_metadata_test_%s_table", cql4SkipMetadataResolveMethod.name().toLowerCase());
467-
session.execute(String.format("CREATE TYPE IF NOT EXISTS %s (x int, y int)", udtName));
468-
469-
session.execute(
470-
String.format("CREATE TABLE %s (pk int, v %s, PRIMARY KEY (pk))", udtTable, udtName));
471-
session.execute(String.format("CREATE TABLE %s (pk int, v int, PRIMARY KEY (pk))", table));
472-
473-
session.execute(String.format("INSERT INTO %s (pk, v) VALUES (1, 1)", table));
474-
session.execute(String.format("INSERT INTO %s (pk, v) VALUES (1, {x: 1, y: 1})", udtTable));
475-
476-
PreparedStatement stmtRegularTableWCS =
477-
session.prepare(String.format("SELECT * FROM %s WHERE pk = ?", table));
478-
PreparedStatement stmtRegularTableTS =
479-
session.prepare(String.format("SELECT pk, v FROM %s WHERE pk = ?", table));
480-
PreparedStatement stmtUDTTableWCS =
481-
session.prepare(String.format("SELECT * FROM %s WHERE pk = ?", udtTable));
482-
PreparedStatement stmtUDTTableTS =
483-
session.prepare(String.format("SELECT pk, v FROM %s WHERE pk = ?", udtTable));
484-
485-
// Metadata ID feature makes prepared statement invalidation works properly.
486-
// It is mostly supported on CQL >= 5
487-
boolean isMetadataIDFeatureSupported = stmtRegularTableWCS.getResultMetadataId() == null;
488-
boolean isPreparedStatementInvalidationBroken =
489-
isMetadataIDFeatureSupported
490-
&& cql4SkipMetadataResolveMethod == CQL4SkipMetadataResolveMethod.ENABLED;
491-
492-
if (isMetadataIDFeatureSupported) {
493-
switch (cql4SkipMetadataResolveMethod) {
494-
case ENABLED:
495-
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
496-
.isEqualTo(true);
497-
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
498-
.isEqualTo(true);
499-
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
500-
.isEqualTo(true);
501-
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
502-
.isEqualTo(true);
503-
break;
504-
case DISABLED:
505-
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
506-
.isEqualTo(false);
507-
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
508-
.isEqualTo(false);
509-
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
510-
.isEqualTo(false);
511-
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
512-
.isEqualTo(false);
513-
break;
514-
default: // "SMART"
515-
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
516-
.isEqualTo(true);
517-
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
518-
.isEqualTo(false);
519-
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
520-
.isEqualTo(false);
521-
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
522-
.isEqualTo(false);
523-
}
524-
}
525-
526-
Row row = session.execute(stmtUDTTableWCS.bind(1)).one();
527-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
528-
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1))).isEqualTo(2);
529-
row = session.execute(stmtUDTTableTS.bind(1)).one();
530-
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1))).isEqualTo(2);
531-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
532-
row = session.execute(stmtRegularTableWCS.bind(1)).one();
533-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
534-
row = session.execute(stmtRegularTableWCS.bind(1)).one();
535-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
536-
537-
session.execute(String.format("ALTER TABLE %s ADD z int;", table));
538-
session.execute(String.format("ALTER TYPE %s ADD z int;", udtName));
539-
540-
int expectedColumnCount = 3;
541-
if (isPreparedStatementInvalidationBroken) {
542-
// When case of CQL4 and skip metadata is set prepared statements will not be invalidated.
543-
expectedColumnCount = 2;
544-
}
545-
546-
row = session.execute(stmtUDTTableWCS.bind(1)).one();
547-
548-
assertThat(row.getUdtValue(1).size()).isEqualTo(expectedColumnCount);
549-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
550-
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1)))
551-
.isEqualTo(expectedColumnCount);
552-
553-
row = session.execute(stmtUDTTableTS.bind(1)).one();
455+
SchemaChangeSynchronizer.withLock(
456+
() -> {
457+
// v0 is an int column, but we'll bind a String to it
458+
try (CqlSession session =
459+
sessionWithSkipCQL4MetadataResolveMethod(cql4SkipMetadataResolveMethod)) {
460+
String udtName =
461+
String.format(
462+
"skip_metadata_test_%s_udt",
463+
cql4SkipMetadataResolveMethod.name().toLowerCase());
464+
String udtTable =
465+
String.format(
466+
"skip_metadata_test_%s_udttable",
467+
cql4SkipMetadataResolveMethod.name().toLowerCase());
468+
String table =
469+
String.format(
470+
"skip_metadata_test_%s_table",
471+
cql4SkipMetadataResolveMethod.name().toLowerCase());
472+
session.execute(String.format("CREATE TYPE IF NOT EXISTS %s (x int, y int)", udtName));
554473

555-
assertThat(row.getUdtValue(1).size()).isEqualTo(expectedColumnCount);
556-
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
557-
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1)))
558-
.isEqualTo(expectedColumnCount);
474+
session.execute(
475+
String.format("CREATE TABLE %s (pk int, v %s, PRIMARY KEY (pk))", udtTable, udtName));
476+
session.execute(String.format("CREATE TABLE %s (pk int, v int, PRIMARY KEY (pk))", table));
559477

560-
row = session.execute(stmtRegularTableWCS.bind(1)).one();
561-
assertThat(row.getColumnDefinitions().size()).isEqualTo(expectedColumnCount);
562-
}
478+
session.execute(String.format("INSERT INTO %s (pk, v) VALUES (1, 1)", table));
479+
session.execute(
480+
String.format("INSERT INTO %s (pk, v) VALUES (1, {x: 1, y: 1})", udtTable));
481+
482+
PreparedStatement stmtRegularTableWCS =
483+
session.prepare(String.format("SELECT * FROM %s WHERE pk = ?", table));
484+
PreparedStatement stmtRegularTableTS =
485+
session.prepare(String.format("SELECT pk, v FROM %s WHERE pk = ?", table));
486+
PreparedStatement stmtUDTTableWCS =
487+
session.prepare(String.format("SELECT * FROM %s WHERE pk = ?", udtTable));
488+
PreparedStatement stmtUDTTableTS =
489+
session.prepare(String.format("SELECT pk, v FROM %s WHERE pk = ?", udtTable));
490+
491+
// Metadata ID feature makes prepared statement invalidation works properly.
492+
// It is mostly supported on CQL >= 5
493+
boolean isMetadataIDFeatureSupported = stmtRegularTableWCS.getResultMetadataId() == null;
494+
boolean isPreparedStatementInvalidationBroken =
495+
isMetadataIDFeatureSupported
496+
&& cql4SkipMetadataResolveMethod == CQL4SkipMetadataResolveMethod.ENABLED;
497+
498+
if (isMetadataIDFeatureSupported) {
499+
switch (cql4SkipMetadataResolveMethod) {
500+
case ENABLED:
501+
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
502+
.isEqualTo(true);
503+
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
504+
.isEqualTo(true);
505+
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
506+
.isEqualTo(true);
507+
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
508+
.isEqualTo(true);
509+
break;
510+
case DISABLED:
511+
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
512+
.isEqualTo(false);
513+
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
514+
.isEqualTo(false);
515+
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
516+
.isEqualTo(false);
517+
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
518+
.isEqualTo(false);
519+
break;
520+
default: // "SMART"
521+
assertThat(((DefaultPreparedStatement) stmtRegularTableTS).isSkipMetadata())
522+
.isEqualTo(true);
523+
assertThat(((DefaultPreparedStatement) stmtRegularTableWCS).isSkipMetadata())
524+
.isEqualTo(false);
525+
assertThat(((DefaultPreparedStatement) stmtUDTTableWCS).isSkipMetadata())
526+
.isEqualTo(false);
527+
assertThat(((DefaultPreparedStatement) stmtUDTTableTS).isSkipMetadata())
528+
.isEqualTo(false);
529+
}
530+
}
531+
532+
Row row = session.execute(stmtUDTTableWCS.bind(1)).one();
533+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
534+
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1))).isEqualTo(2);
535+
row = session.execute(stmtUDTTableTS.bind(1)).one();
536+
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1))).isEqualTo(2);
537+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
538+
row = session.execute(stmtRegularTableWCS.bind(1)).one();
539+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
540+
row = session.execute(stmtRegularTableWCS.bind(1)).one();
541+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
542+
543+
session.execute(String.format("ALTER TABLE %s ADD z int;", table));
544+
session.execute(String.format("ALTER TYPE %s ADD z int;", udtName));
545+
546+
int expectedColumnCount = 3;
547+
if (isPreparedStatementInvalidationBroken) {
548+
// When case of CQL4 and skip metadata is set prepared statements will not be invalidated.
549+
expectedColumnCount = 2;
550+
}
551+
552+
row = session.execute(stmtUDTTableWCS.bind(1)).one();
553+
554+
assertThat(row.getUdtValue(1).size()).isEqualTo(expectedColumnCount);
555+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
556+
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1)))
557+
.isEqualTo(expectedColumnCount);
558+
559+
row = session.execute(stmtUDTTableTS.bind(1)).one();
560+
561+
assertThat(row.getUdtValue(1).size()).isEqualTo(expectedColumnCount);
562+
assertThat(row.getColumnDefinitions().size()).isEqualTo(2);
563+
assertThat(getUDTColumnCount(row.getColumnDefinitions().get(1)))
564+
.isEqualTo(expectedColumnCount);
565+
566+
row = session.execute(stmtRegularTableWCS.bind(1)).one();
567+
assertThat(row.getColumnDefinitions().size()).isEqualTo(expectedColumnCount);
568+
}
569+
});
563570
}
564571

565572
private int getUDTColumnCount(ColumnDefinition cd) {

0 commit comments

Comments
 (0)