@@ -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