diff --git a/google-cloud-spanner/clirr-ignored-differences.xml b/google-cloud-spanner/clirr-ignored-differences.xml
index 28e22e4a86c..e79cac4fc78 100644
--- a/google-cloud-spanner/clirr-ignored-differences.xml
+++ b/google-cloud-spanner/clirr-ignored-differences.xml
@@ -566,6 +566,38 @@
java.util.List getFloat32Array()
+
+
+ 7012
+ com/google/cloud/spanner/StructReader
+ java.util.UUID getUuid(int)
+
+
+ 7012
+ com/google/cloud/spanner/StructReader
+ java.util.UUID getUuid(java.lang.String)
+
+
+ 7012
+ com/google/cloud/spanner/StructReader
+ java.util.List getUuidList(int)
+
+
+ 7012
+ com/google/cloud/spanner/StructReader
+ java.util.List getUuidList(java.lang.String)
+
+
+ 7013
+ com/google/cloud/spanner/Value
+ java.util.UUID getUuid()
+
+
+ 7013
+ com/google/cloud/spanner/Value
+ java.util.List getUuidArray()
+
+
7012
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java
index 49df1167bd5..fc3a5609bb1 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java
@@ -38,6 +38,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
+import java.util.UUID;
import java.util.function.Function;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -434,6 +435,11 @@ protected Date getDateInternal(int columnIndex) {
return currRow().getDateInternal(columnIndex);
}
+ @Override
+ protected UUID getUuidInternal(int columnIndex) {
+ return currRow().getUuidInternal(columnIndex);
+ }
+
@Override
protected Interval getIntervalInternal(int columnIndex) {
return currRow().getIntervalInternal(columnIndex);
@@ -531,6 +537,11 @@ protected List getDateListInternal(int columnIndex) {
return currRow().getDateListInternal(columnIndex);
}
+ @Override
+ protected List getUuidListInternal(int columnIndex) {
+ return currRow().getUuidListInternal(columnIndex);
+ }
+
@Override
protected List getIntervalListInternal(int columnIndex) {
return currRow().getIntervalListInternal(columnIndex);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractStructReader.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractStructReader.java
index e5b9fa00123..60ff4fd330e 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractStructReader.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractStructReader.java
@@ -28,6 +28,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/**
@@ -67,6 +68,10 @@ protected String getPgJsonbInternal(int columnIndex) {
protected abstract Date getDateInternal(int columnIndex);
+ protected UUID getUuidInternal(int columnIndex) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
protected Interval getIntervalInternal(int columnIndex) {
throw new UnsupportedOperationException("Not implemented");
}
@@ -132,6 +137,10 @@ protected List getPgJsonbListInternal(int columnIndex) {
protected abstract List getDateListInternal(int columnIndex);
+ protected List getUuidListInternal(int columnIndex) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
protected List getIntervalListInternal(int columnIndex) {
throw new UnsupportedOperationException("Not implemented");
}
@@ -307,6 +316,19 @@ public Date getDate(String columnName) {
return getDateInternal(columnIndex);
}
+ @Override
+ public UUID getUuid(int columnIndex) {
+ checkNonNullOfType(columnIndex, Type.uuid(), columnIndex);
+ return getUuidInternal(columnIndex);
+ }
+
+ @Override
+ public UUID getUuid(String columnName) {
+ final int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, Type.uuid(), columnName);
+ return getUuidInternal(columnIndex);
+ }
+
@Override
public Interval getInterval(int columnIndex) {
checkNonNullOfType(columnIndex, Type.interval(), columnIndex);
@@ -604,6 +626,19 @@ public List getDateList(String columnName) {
return getDateListInternal(columnIndex);
}
+ @Override
+ public List getUuidList(int columnIndex) {
+ checkNonNullOfType(columnIndex, Type.array(Type.uuid()), columnIndex);
+ return getUuidListInternal(columnIndex);
+ }
+
+ @Override
+ public List getUuidList(String columnName) {
+ final int columnIndex = getColumnIndex(columnName);
+ checkNonNullOfType(columnIndex, Type.array(Type.uuid()), columnName);
+ return getUuidListInternal(columnIndex);
+ }
+
@Override
public List getIntervalList(int columnIndex) {
checkNonNullOfType(columnIndex, Type.array(Type.interval()), columnIndex);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ForwardingStructReader.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ForwardingStructReader.java
index c747c2a5908..839202bb9fe 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ForwardingStructReader.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ForwardingStructReader.java
@@ -26,6 +26,7 @@
import com.google.protobuf.ProtocolMessageEnum;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/** Forwarding implements of StructReader */
@@ -231,6 +232,18 @@ public Date getDate(String columnName) {
return delegate.get().getDate(columnName);
}
+ @Override
+ public UUID getUuid(int columnIndex) {
+ checkValidState();
+ return delegate.get().getUuid(columnIndex);
+ }
+
+ @Override
+ public UUID getUuid(String columnName) {
+ checkValidState();
+ return delegate.get().getUuid(columnName);
+ }
+
@Override
public Interval getInterval(int columnIndex) {
checkValidState();
@@ -421,6 +434,18 @@ public List getDateList(String columnName) {
return delegate.get().getDateList(columnName);
}
+ @Override
+ public List getUuidList(int columnIndex) {
+ checkValidState();
+ return delegate.get().getUuidList(columnIndex);
+ }
+
+ @Override
+ public List getUuidList(String columnName) {
+ checkValidState();
+ return delegate.get().getUuidList(columnName);
+ }
+
@Override
public List getIntervalList(int columnIndex) {
checkValidState();
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/GrpcStruct.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/GrpcStruct.java
index bd783366997..49629f09f57 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/GrpcStruct.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/GrpcStruct.java
@@ -49,6 +49,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -131,6 +132,9 @@ private Object writeReplace() {
case DATE:
builder.set(fieldName).to((Date) value);
break;
+ case UUID:
+ builder.set(fieldName).to((UUID) value);
+ break;
case INTERVAL:
builder.set(fieldName).to((Interval) value);
break;
@@ -187,6 +191,9 @@ private Object writeReplace() {
case DATE:
builder.set(fieldName).toDateArray((Iterable) value);
break;
+ case UUID:
+ builder.set(fieldName).toUuidArray((Iterable) value);
+ break;
case INTERVAL:
builder.set(fieldName).toIntervalArray((Iterable) value);
break;
@@ -304,6 +311,9 @@ private static Object decodeValue(Type fieldType, com.google.protobuf.Value prot
case DATE:
checkType(fieldType, proto, KindCase.STRING_VALUE);
return Date.parseDate(proto.getStringValue());
+ case UUID:
+ checkType(fieldType, proto, KindCase.STRING_VALUE);
+ return UUID.fromString(proto.getStringValue());
case INTERVAL:
checkType(fieldType, proto, KindCase.STRING_VALUE);
return Interval.parseFromString(proto.getStringValue());
@@ -356,6 +366,7 @@ static Object decodeArrayValue(Type elementType, ListValue listValue) {
case BYTES:
case TIMESTAMP:
case DATE:
+ case UUID:
case INTERVAL:
case STRUCT:
case PROTO:
@@ -513,6 +524,12 @@ protected Date getDateInternal(int columnIndex) {
return (Date) rowData.get(columnIndex);
}
+ @Override
+ protected UUID getUuidInternal(int columnIndex) {
+ ensureDecoded(columnIndex);
+ return (UUID) rowData.get(columnIndex);
+ }
+
@Override
protected Interval getIntervalInternal(int columnIndex) {
ensureDecoded(columnIndex);
@@ -640,6 +657,8 @@ protected Value getValueInternal(int columnIndex) {
return Value.timestamp(isNull ? null : getTimestampInternal(columnIndex));
case DATE:
return Value.date(isNull ? null : getDateInternal(columnIndex));
+ case UUID:
+ return Value.uuid(isNull ? null : getUuidInternal(columnIndex));
case INTERVAL:
return Value.interval(isNull ? null : getIntervalInternal(columnIndex));
case STRUCT:
@@ -682,6 +701,8 @@ protected Value getValueInternal(int columnIndex) {
return Value.timestampArray(isNull ? null : getTimestampListInternal(columnIndex));
case DATE:
return Value.dateArray(isNull ? null : getDateListInternal(columnIndex));
+ case UUID:
+ return Value.uuidArray(isNull ? null : getUuidListInternal(columnIndex));
case INTERVAL:
return Value.intervalArray(isNull ? null : getIntervalListInternal(columnIndex));
case STRUCT:
@@ -867,6 +888,13 @@ protected List getDateListInternal(int columnIndex) {
return Collections.unmodifiableList((List) rowData.get(columnIndex));
}
+ @Override
+ @SuppressWarnings("unchecked") // We know ARRAY produces a List.
+ protected List getUuidListInternal(int columnIndex) {
+ ensureDecoded(columnIndex);
+ return Collections.unmodifiableList((List) rowData.get(columnIndex));
+ }
+
@Override
@SuppressWarnings("unchecked") // We know ARRAY produces a List.
protected List getIntervalListInternal(int columnIndex) {
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ResultSets.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ResultSets.java
index d91bc2104af..92a12286ae2 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ResultSets.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ResultSets.java
@@ -35,6 +35,7 @@
import com.google.spanner.v1.ResultSetStats;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/** Utility methods for working with {@link com.google.cloud.spanner.ResultSet}. */
@@ -326,6 +327,16 @@ public Date getDate(String columnName) {
return getCurrentRowAsStruct().getDate(columnName);
}
+ @Override
+ public UUID getUuid(int columnIndex) {
+ return getCurrentRowAsStruct().getUuid(columnIndex);
+ }
+
+ @Override
+ public UUID getUuid(String columnName) {
+ return getCurrentRowAsStruct().getUuid(columnName);
+ }
+
@Override
public Interval getInterval(int columnIndex) {
return getCurrentRowAsStruct().getInterval(columnIndex);
@@ -518,6 +529,16 @@ public List getDateList(String columnName) {
return getCurrentRowAsStruct().getDateList(columnName);
}
+ @Override
+ public List getUuidList(int columnIndex) {
+ return getCurrentRowAsStruct().getUuidList(columnIndex);
+ }
+
+ @Override
+ public List getUuidList(String columnName) {
+ return getCurrentRowAsStruct().getUuidList(columnName);
+ }
+
@Override
public List getIntervalList(int columnIndex) {
return getCurrentRowAsStruct().getIntervalList(columnIndex);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Struct.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Struct.java
index 7944c7f409d..38a47e99dff 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Struct.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Struct.java
@@ -36,6 +36,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.UUID;
import java.util.function.Function;
import javax.annotation.concurrent.Immutable;
@@ -226,6 +227,11 @@ protected Date getDateInternal(int columnIndex) {
return values.get(columnIndex).getDate();
}
+ @Override
+ protected UUID getUuidInternal(int columnIndex) {
+ return values.get(columnIndex).getUuid();
+ }
+
@Override
protected Interval getIntervalInternal(int columnIndex) {
return values.get(columnIndex).getInterval();
@@ -339,6 +345,11 @@ protected List getDateListInternal(int columnIndex) {
return values.get(columnIndex).getDateArray();
}
+ @Override
+ protected List getUuidListInternal(int columnIndex) {
+ return values.get(columnIndex).getUuidArray();
+ }
+
@Override
protected List getIntervalListInternal(int columnIndex) {
return values.get(columnIndex).getIntervalArray();
@@ -430,6 +441,8 @@ private Object getAsObject(int columnIndex) {
return getTimestampInternal(columnIndex);
case DATE:
return getDateInternal(columnIndex);
+ case UUID:
+ return getUuidInternal(columnIndex);
case INTERVAL:
return getIntervalInternal(columnIndex);
case STRUCT:
@@ -463,6 +476,8 @@ private Object getAsObject(int columnIndex) {
return getTimestampListInternal(columnIndex);
case DATE:
return getDateListInternal(columnIndex);
+ case UUID:
+ return getUuidListInternal(columnIndex);
case INTERVAL:
return getIntervalListInternal(columnIndex);
case STRUCT:
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
index 33e88c39d38..b235cb2db62 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
@@ -23,6 +23,7 @@
import com.google.protobuf.ProtocolMessageEnum;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/**
@@ -291,12 +292,16 @@ default T getProtoEnum(
*/
Date getDate(int columnIndex);
+ UUID getUuid(int columnIndex);
+
/**
* @param columnName name of the column
* @return the value of a non-{@code NULL} column with type {@link Type#date()}.
*/
Date getDate(String columnName);
+ UUID getUuid(String columnName);
+
/**
* @param columnIndex index of the column
* @return the value of a non-{@code NULL} column with type {@link Type#interval()}.
@@ -637,6 +642,10 @@ default List getProtoEnumList(
*/
List getDateList(String columnName);
+ List getUuidList(int columnIndex);
+
+ List getUuidList(String columnNameĆ);
+
/**
* @param columnIndex index of the column
* @return the value of a non-{@code NULL} column with type {@code Type.array(Type.interval())}.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Type.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Type.java
index 7cb3f131f73..71120a0f420 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Type.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Type.java
@@ -59,6 +59,7 @@ public final class Type implements Serializable {
private static final Type TYPE_BYTES = new Type(Code.BYTES, null, null);
private static final Type TYPE_TIMESTAMP = new Type(Code.TIMESTAMP, null, null);
private static final Type TYPE_DATE = new Type(Code.DATE, null, null);
+ private static final Type TYPE_UUID = new Type(Code.UUID, null, null);
private static final Type TYPE_INTERVAL = new Type(Code.INTERVAL, null, null);
private static final Type TYPE_ARRAY_BOOL = new Type(Code.ARRAY, TYPE_BOOL, null);
private static final Type TYPE_ARRAY_INT64 = new Type(Code.ARRAY, TYPE_INT64, null);
@@ -73,6 +74,7 @@ public final class Type implements Serializable {
private static final Type TYPE_ARRAY_BYTES = new Type(Code.ARRAY, TYPE_BYTES, null);
private static final Type TYPE_ARRAY_TIMESTAMP = new Type(Code.ARRAY, TYPE_TIMESTAMP, null);
private static final Type TYPE_ARRAY_DATE = new Type(Code.ARRAY, TYPE_DATE, null);
+ private static final Type TYPE_ARRAY_UUID = new Type(Code.ARRAY, TYPE_UUID, null);
private static final Type TYPE_ARRAY_INTERVAL = new Type(Code.ARRAY, TYPE_INTERVAL, null);
private static final int AMBIGUOUS_FIELD = -1;
@@ -185,6 +187,11 @@ public static Type date() {
return TYPE_DATE;
}
+ /** Returns the descriptor for the {@code UUID} type. */
+ public static Type uuid() {
+ return TYPE_UUID;
+ }
+
/**
* Returns the descriptor for the {@code INTERVAL} type: an interval which represents a time
* duration as a tuple of 3 values (months, days, nanoseconds). [Interval(months:-120000, days:
@@ -225,6 +232,8 @@ public static Type array(Type elementType) {
return TYPE_ARRAY_TIMESTAMP;
case DATE:
return TYPE_ARRAY_DATE;
+ case UUID:
+ return TYPE_ARRAY_UUID;
case INTERVAL:
return TYPE_ARRAY_INTERVAL;
default:
@@ -309,6 +318,7 @@ public enum Code {
BYTES(TypeCode.BYTES, "bytea"),
TIMESTAMP(TypeCode.TIMESTAMP, "timestamp with time zone"),
DATE(TypeCode.DATE, "date"),
+ UUID(TypeCode.UUID, "uuid"),
INTERVAL(TypeCode.INTERVAL, "interval"),
ARRAY(TypeCode.ARRAY, "array"),
STRUCT(TypeCode.STRUCT, "struct");
@@ -625,6 +635,8 @@ static Type fromProto(com.google.spanner.v1.Type proto) {
return timestamp();
case DATE:
return date();
+ case UUID:
+ return uuid();
case INTERVAL:
return interval();
case PROTO:
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Value.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Value.java
index 5befba04e57..49a692aa0e2 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Value.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Value.java
@@ -60,6 +60,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
+import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -409,6 +410,10 @@ public static Value date(@Nullable Date v) {
return new DateImpl(v == null, v);
}
+ public static Value uuid(@Nullable UUID v) {
+ return new UuidImpl(v == null, v);
+ }
+
/** Returns a non-{@code NULL} {#code STRUCT} value. */
public static Value struct(Struct v) {
Preconditions.checkNotNull(v, "Illegal call to create a NULL struct value.");
@@ -799,6 +804,16 @@ public static Value dateArray(@Nullable Iterable v) {
return new DateArrayImpl(v == null, v == null ? null : immutableCopyOf(v));
}
+ /**
+ * Returns an {@code ARRAY} value.
+ *
+ * @param v the source of element values. This may be {@code null} to produce a value for which
+ * {@code isNull()} is {@code true}. Individual elements may also be {@code null}.
+ */
+ public static Value uuidArray(@Nullable Iterable v) {
+ return new UuidArrayImpl(v == null, v == null ? null : immutableCopyOf(v));
+ }
+
/**
* Returns an {@code ARRAY} value.
*
@@ -869,6 +884,9 @@ static Value toValue(Object value) {
if (value instanceof Date) {
return Value.date((Date) value);
}
+ if (value instanceof UUID) {
+ return Value.uuid((UUID) value);
+ }
if (value instanceof LocalDate) {
return Value.date(convertLocalDateToSpannerDate((LocalDate) value));
}
@@ -937,6 +955,9 @@ static Value toValue(Object value) {
if (object instanceof Date) {
return Value.dateArray(convertToTypedIterable((Date) object, iterator));
}
+ if (object instanceof UUID) {
+ return Value.uuidArray(convertToTypedIterable((UUID) object, iterator));
+ }
if (object instanceof LocalDate) {
return Value.dateArray(
SpannerTypeConverter.convertToTypedIterable(
@@ -1101,6 +1122,13 @@ public T getProtoEnum(
*/
public abstract Date getDate();
+ /**
+ * Returns the value of a {@code UUID}-typed instance.
+ *
+ * @throws IllegalStateException if {@code isNull()} or the value is not of the expected type
+ */
+ public abstract UUID getUuid();
+
/**
* Returns the value of a {@code INTERVAL}-typed instance.
*
@@ -1228,6 +1256,14 @@ public List getProtoEnumArray(
*/
public abstract List getDateArray();
+ /**
+ * Returns the value of an {@code ARRAY}-typed instance. While the returned list itself will
+ * never be {@code null}, elements of that list may be null.
+ *
+ * @throws IllegalStateException if {@code isNull()} or the value is not of the expected type
+ */
+ public abstract List getUuidArray();
+
/**
* Returns the value of an {@code ARRAY}-typed instance. While the returned list itself
* will never be {@code null}, elements of that list may be null.
@@ -1515,6 +1551,11 @@ public Date getDate() {
throw defaultGetter(Type.date());
}
+ @Override
+ public UUID getUuid() {
+ throw defaultGetter(Type.uuid());
+ }
+
@Override
public Interval getInterval() {
throw defaultGetter(Type.interval());
@@ -1584,6 +1625,11 @@ public List getDateArray() {
throw defaultGetter(Type.array(Type.date()));
}
+ @Override
+ public List getUuidArray() {
+ throw defaultGetter(Type.array(Type.uuid()));
+ }
+
@Override
public List getIntervalArray() {
throw defaultGetter(Type.array(Type.interval()));
@@ -2006,6 +2052,24 @@ void valueToString(StringBuilder b) {
}
}
+ private static class UuidImpl extends AbstractObjectValue {
+
+ private UuidImpl(boolean isNull, UUID value) {
+ super(isNull, Type.uuid(), value);
+ }
+
+ @Override
+ public UUID getUuid() {
+ checkNotNull();
+ return value;
+ }
+
+ @Override
+ void valueToString(StringBuilder b) {
+ b.append(value);
+ }
+ }
+
private static class IntervalImpl extends AbstractObjectValue {
private IntervalImpl(boolean isNull, Interval value) {
@@ -3037,6 +3101,24 @@ void appendElement(StringBuilder b, Date element) {
}
}
+ private static class UuidArrayImpl extends AbstractArrayValue {
+
+ private UuidArrayImpl(boolean isNull, @Nullable List values) {
+ super(isNull, Type.uuid(), values);
+ }
+
+ @Override
+ public List getUuidArray() {
+ checkNotNull();
+ return value;
+ }
+
+ @Override
+ void appendElement(StringBuilder b, UUID element) {
+ b.append(element);
+ }
+ }
+
private static class IntervalArrayImpl extends AbstractArrayValue {
private IntervalArrayImpl(boolean isNull, @Nullable List values) {
@@ -3201,6 +3283,8 @@ private Value getValue(int fieldIndex) {
return Value.pgOid(value.getLong(fieldIndex));
case DATE:
return Value.date(value.getDate(fieldIndex));
+ case UUID:
+ return Value.uuid(value.getUuid(fieldIndex));
case TIMESTAMP:
return Value.timestamp(value.getTimestamp(fieldIndex));
case INTERVAL:
@@ -3241,6 +3325,8 @@ private Value getValue(int fieldIndex) {
return Value.pgNumericArray(value.getStringList(fieldIndex));
case DATE:
return Value.dateArray(value.getDateList(fieldIndex));
+ case UUID:
+ return Value.uuidArray(value.getUuidList(fieldIndex));
case TIMESTAMP:
return Value.timestampArray(value.getTimestampList(fieldIndex));
case INTERVAL:
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ValueBinder.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ValueBinder.java
index 45b08ca582d..e0b420e07ab 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ValueBinder.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/ValueBinder.java
@@ -24,6 +24,7 @@
import com.google.protobuf.Descriptors.EnumDescriptor;
import com.google.protobuf.ProtocolMessageEnum;
import java.math.BigDecimal;
+import java.util.UUID;
import javax.annotation.Nullable;
/**
@@ -165,6 +166,11 @@ public R to(@Nullable Date value) {
return handle(Value.date(value));
}
+ /** Binds to {@code Value.uuid(value)} */
+ public R to(@Nullable UUID value) {
+ return handle(Value.uuid(value));
+ }
+
/** Binds to {@code Value.interval(value)} */
public R to(@Nullable Interval value) {
return handle(Value.interval(value));
@@ -328,6 +334,11 @@ public R toDateArray(@Nullable Iterable values) {
return handle(Value.dateArray(values));
}
+ /** Binds to {@code Value.uuidArray(values)} */
+ public R toUuidArray(@Nullable Iterable values) {
+ return handle(Value.uuidArray(values));
+ }
+
/** Binds to {@code Value.intervalArray(values)} */
public R toIntervalArray(@Nullable Iterable values) {
return handle(Value.intervalArray(values));
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DirectExecuteResultSet.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DirectExecuteResultSet.java
index 5339c4b69f6..f0c289a6d80 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DirectExecuteResultSet.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/DirectExecuteResultSet.java
@@ -33,6 +33,7 @@
import com.google.spanner.v1.ResultSetStats;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/**
@@ -289,6 +290,18 @@ public Date getDate(String columnName) {
return delegate.getDate(columnName);
}
+ @Override
+ public UUID getUuid(int columnIndex) {
+ Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
+ return delegate.getUuid(columnIndex);
+ }
+
+ @Override
+ public UUID getUuid(String columnName) {
+ Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
+ return delegate.getUuid(columnName);
+ }
+
@Override
public Interval getInterval(int columnIndex) {
Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
@@ -493,6 +506,18 @@ public List getDateList(String columnName) {
return delegate.getDateList(columnName);
}
+ @Override
+ public List getUuidList(int columnIndex) {
+ Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
+ return delegate.getUuidList(columnIndex);
+ }
+
+ @Override
+ public List getUuidList(String columnName) {
+ Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
+ return delegate.getUuidList(columnName);
+ }
+
@Override
public List getIntervalList(int columnIndex) {
Preconditions.checkState(nextCalledByClient, MISSING_NEXT_CALL);
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReplaceableForwardingResultSet.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReplaceableForwardingResultSet.java
index a6198b7d633..8a73318c880 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReplaceableForwardingResultSet.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ReplaceableForwardingResultSet.java
@@ -35,6 +35,7 @@
import com.google.spanner.v1.ResultSetStats;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
/**
@@ -292,12 +293,24 @@ public Date getDate(int columnIndex) {
return delegate.getDate(columnIndex);
}
+ @Override
+ public UUID getUuid(int columnIndex) {
+ checkClosed();
+ return delegate.getUuid(columnIndex);
+ }
+
@Override
public Date getDate(String columnName) {
checkClosed();
return delegate.getDate(columnName);
}
+ @Override
+ public UUID getUuid(String columnName) {
+ checkClosed();
+ return delegate.getUuid(columnName);
+ }
+
@Override
public Interval getInterval(int columnIndex) {
checkClosed();
@@ -502,6 +515,18 @@ public List getDateList(String columnName) {
return delegate.getDateList(columnName);
}
+ @Override
+ public List getUuidList(int columnIndex) {
+ checkClosed();
+ return delegate.getUuidList(columnIndex);
+ }
+
+ @Override
+ public List getUuidList(String columnName) {
+ checkClosed();
+ return delegate.getUuidList(columnName);
+ }
+
@Override
public List getIntervalList(int columnIndex) {
checkClosed();
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractStructReaderTypesTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractStructReaderTypesTest.java
index b6aaf8471f6..66596cacb92 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractStructReaderTypesTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AbstractStructReaderTypesTest.java
@@ -36,6 +36,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
import java.util.function.Function;
import javax.annotation.Nullable;
import org.junit.Before;
@@ -104,6 +105,10 @@ protected Date getDateInternal(int columnIndex) {
}
@Override
+ protected UUID getUuidInternal(int columnIndex) {
+ return null;
+ }
+
protected Interval getIntervalInternal(int columnIndex) {
return null;
}
@@ -211,6 +216,11 @@ protected List getDateListInternal(int columnIndex) {
return null;
}
+ @Override
+ protected List getUuidListInternal(int columnIndex) {
+ return null;
+ }
+
@Override
protected List getIntervalListInternal(int columnIndex) {
return null;
@@ -311,6 +321,13 @@ public static Collection