4040import java .util .Base64 ;
4141import java .util .List ;
4242import java .util .Map ;
43+ import java .util .UUID ;
4344import java .util .stream .Collectors ;
4445import java .util .stream .IntStream ;
4546import org .junit .After ;
@@ -76,6 +77,7 @@ public static Object[] data() {
7677 public static final long PG_OID_VALUE = 1L ;
7778 public static final byte [] BYTES_VALUE = "test-bytes" .getBytes (StandardCharsets .UTF_8 );
7879 public static final Date DATE_VALUE = Date .fromYearMonthDay (2024 , 3 , 2 );
80+ public static final UUID UUID_VALUE = UUID .randomUUID ();
7981 public static final Timestamp TIMESTAMP_VALUE =
8082 Timestamp .parseTimestamp ("2024-03-02T07:07:00.20982735Z" );
8183
@@ -124,6 +126,12 @@ public static Object[] data() {
124126 Date .fromYearMonthDay (2024 , 3 , 3 ),
125127 Date .fromYearMonthDay (1 , 1 , 1 ),
126128 Date .fromYearMonthDay (9999 , 12 , 31 ));
129+
130+ public static final List <UUID > UUID_ARRAY_VALUE =
131+ Arrays .asList (
132+ UUID .randomUUID (),
133+ null ,
134+ UUID .randomUUID ());
127135 public static final List <Timestamp > TIMESTAMP_ARRAY_VALUE =
128136 Arrays .asList (
129137 Timestamp .parseTimestamp ("2024-03-01T07:07:00.20982735Z" ),
@@ -157,15 +165,16 @@ private void setupAllTypesResultSet(Dialect dialect) {
157165 // COL7: JSON / PG_JSONB
158166 // COL8: BYTES
159167 // COL9: DATE
160- // COL10: TIMESTAMP
161- // COL11: PG_OID (added only for POSTGRESQL dialect)
162- // COL12-21: ARRAY<..> for the types above.
168+ // COL10: UUID
169+ // COL11: TIMESTAMP
170+ // COL12: PG_OID (added only for POSTGRESQL dialect)
171+ // COL13-22: ARRAY<..> for the types above.
163172 // Only for GoogleSQL:
164- // COL22 : PROTO
165- // COL23 : ENUM
166- // COL24 : ARRAY<PROTO>
167- // COL25 : ARRAY<ENUM>
168- // COL26 : ARRAY<PG_OID> (added only for POSTGRESQL dialect)
173+ // COL23 : PROTO
174+ // COL24 : ENUM
175+ // COL25 : ARRAY<PROTO>
176+ // COL26 : ARRAY<ENUM>
177+ // COL27 : ARRAY<PG_OID> (added only for POSTGRESQL dialect)
169178 ListValue .Builder row1Builder =
170179 ListValue .newBuilder ()
171180 .addValues (Value .newBuilder ().setBoolValue (BOOL_VALUE ))
@@ -183,6 +192,7 @@ private void setupAllTypesResultSet(Dialect dialect) {
183192 .addValues (
184193 Value .newBuilder ().setStringValue (Base64 .getEncoder ().encodeToString (BYTES_VALUE )))
185194 .addValues (Value .newBuilder ().setStringValue (DATE_VALUE .toString ()))
195+ .addValues (Value .newBuilder ().setStringValue (UUID_VALUE .toString ()))
186196 .addValues (Value .newBuilder ().setStringValue (TIMESTAMP_VALUE .toString ()));
187197 if (dialect == Dialect .POSTGRESQL ) {
188198 row1Builder .addValues (
@@ -356,6 +366,23 @@ private void setupAllTypesResultSet(Dialect dialect) {
356366 .build ())
357367 .collect (Collectors .toList ()))
358368 .build ()))
369+ .addValues (
370+ Value .newBuilder ()
371+ .setListValue (
372+ ListValue .newBuilder ()
373+ .addAllValues (
374+ UUID_ARRAY_VALUE .stream ()
375+ .map (
376+ uuid ->
377+ uuid == null
378+ ? Value .newBuilder ()
379+ .setNullValue (NullValue .NULL_VALUE )
380+ .build ()
381+ : Value .newBuilder ()
382+ .setStringValue (uuid .toString ())
383+ .build ())
384+ .collect (Collectors .toList ()))
385+ .build ()))
359386 .addValues (
360387 Value .newBuilder ()
361388 .setListValue (
@@ -509,6 +536,8 @@ public static Statement createInsertStatement(Dialect dialect) {
509536 .bind ("p" + ++param )
510537 .to (DATE_VALUE )
511538 .bind ("p" + ++param )
539+ .to (UUID_VALUE )
540+ .bind ("p" + ++param )
512541 .to (TIMESTAMP_VALUE );
513542 if (dialect == Dialect .POSTGRESQL ) {
514543 builder .bind ("p" + ++param ).to (PG_OID_VALUE );
@@ -539,6 +568,8 @@ public static Statement createInsertStatement(Dialect dialect) {
539568 .bind ("p" + ++param )
540569 .toDateArray (DATE_ARRAY_VALUE )
541570 .bind ("p" + ++param )
571+ .toUuidArray (UUID_ARRAY_VALUE )
572+ .bind ("p" + ++param )
542573 .toTimestampArray (TIMESTAMP_ARRAY_VALUE );
543574 if (dialect == Dialect .POSTGRESQL ) {
544575 builder .bind ("p" + ++param ).toInt64Array (PG_OID_ARRAY_VALUE );
@@ -573,6 +604,7 @@ public void testSelectAllTypes() {
573604 dialect == Dialect .POSTGRESQL ? resultSet .getPgJsonb (++col ) : resultSet .getJson (++col ));
574605 assertArrayEquals (BYTES_VALUE , resultSet .getBytes (++col ).toByteArray ());
575606 assertEquals (DATE_VALUE , resultSet .getDate (++col ));
607+ assertEquals (UUID_VALUE , resultSet .getUuid (++col ));
576608 assertEquals (TIMESTAMP_VALUE , resultSet .getTimestamp (++col ));
577609 if (dialect == Dialect .POSTGRESQL ) {
578610 assertEquals (PG_OID_VALUE , resultSet .getLong (++col ));
@@ -595,6 +627,7 @@ public void testSelectAllTypes() {
595627 : resultSet .getJsonList (++col ));
596628 assertEquals (BYTES_ARRAY_VALUE , resultSet .getBytesList (++col ));
597629 assertEquals (DATE_ARRAY_VALUE , resultSet .getDateList (++col ));
630+ assertEquals (UUID_ARRAY_VALUE , resultSet .getUuidList (++col ));
598631 assertEquals (TIMESTAMP_ARRAY_VALUE , resultSet .getTimestampList (++col ));
599632 if (dialect == Dialect .POSTGRESQL ) {
600633 assertEquals (PG_OID_ARRAY_VALUE , resultSet .getLongList (++col ));
@@ -613,8 +646,8 @@ public void testInsertAllTypes() {
613646 ExecuteSqlRequest request = mockSpanner .getRequestsOfType (ExecuteSqlRequest .class ).get (0 );
614647 Map <String , Type > paramTypes = request .getParamTypesMap ();
615648 Map <String , Value > params = request .getParams ().getFieldsMap ();
616- assertEquals (dialect == Dialect .POSTGRESQL ? 22 : 20 , paramTypes .size ());
617- assertEquals (dialect == Dialect .POSTGRESQL ? 22 : 20 , params .size ());
649+ assertEquals (dialect == Dialect .POSTGRESQL ? 24 : 22 , paramTypes .size ());
650+ assertEquals (dialect == Dialect .POSTGRESQL ? 24 : 22 , params .size ());
618651
619652 // Verify param types.
620653 ImmutableList <TypeCode > expectedTypes ;
@@ -630,6 +663,7 @@ public void testInsertAllTypes() {
630663 TypeCode .JSON ,
631664 TypeCode .BYTES ,
632665 TypeCode .DATE ,
666+ TypeCode .UUID ,
633667 TypeCode .TIMESTAMP ,
634668 TypeCode .INT64 );
635669 } else {
@@ -644,6 +678,7 @@ public void testInsertAllTypes() {
644678 TypeCode .JSON ,
645679 TypeCode .BYTES ,
646680 TypeCode .DATE ,
681+ TypeCode .UUID ,
647682 TypeCode .TIMESTAMP );
648683 }
649684 for (int col = 0 ; col < expectedTypes .size (); col ++) {
@@ -670,6 +705,7 @@ public void testInsertAllTypes() {
670705 Base64 .getEncoder ().encodeToString (BYTES_VALUE ),
671706 params .get ("p" + ++col ).getStringValue ());
672707 assertEquals (DATE_VALUE .toString (), params .get ("p" + ++col ).getStringValue ());
708+ assertEquals (UUID_VALUE .toString (), params .get ("p" + ++col ).getStringValue ());
673709 assertEquals (TIMESTAMP_VALUE .toString (), params .get ("p" + ++col ).getStringValue ());
674710 if (dialect == Dialect .POSTGRESQL ) {
675711 assertEquals (String .valueOf (PG_OID_VALUE ), params .get ("p" + ++col ).getStringValue ());
@@ -730,6 +766,11 @@ public void testInsertAllTypes() {
730766 params .get ("p" + ++col ).getListValue ().getValuesList ().stream ()
731767 .map (value -> value .hasNullValue () ? null : Date .parseDate (value .getStringValue ()))
732768 .collect (Collectors .toList ()));
769+ assertEquals (
770+ UUID_ARRAY_VALUE ,
771+ params .get ("p" + ++col ).getListValue ().getValuesList ().stream ()
772+ .map (value -> value .hasNullValue () ? null : UUID .fromString (value .getStringValue ()))
773+ .collect (Collectors .toList ()));
733774 assertEquals (
734775 TIMESTAMP_ARRAY_VALUE ,
735776 params .get ("p" + ++col ).getListValue ().getValuesList ().stream ()
0 commit comments