Skip to content

Commit de96a79

Browse files
committed
chore: register a default mock result for column defaults
The Spanner Liquibase provider executes an extra query to get the column default value, as the Spanner JDBC driver does not include that in the metadata it returns. This will be fixed in googleapis/java-spanner-jdbc#1937
1 parent 76abf26 commit de96a79

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/main/java/liquibase/ext/spanner/snapshotgenerator/ColumnSnapshotGeneratorSpanner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ protected Object readDefaultValue(
4040
CachedRow columnMetadataResultSet, Column columnInfo, Database database) {
4141
if (database instanceof ICloudSpanner) {
4242
try {
43+
// TODO: Remove when COLUMN_DEF is included in the results for getColumns
4344
String selectQuery =
4445
"SELECT DISTINCT COLUMN_DEFAULT AS COLUMN_DEF FROM INFORMATION_SCHEMA.COLUMNS "
4546
+ "WHERE TABLE_CATALOG = ? "

src/test/java/liquibase/ext/spanner/AbstractMockServerTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.google.protobuf.Any;
1515
import com.google.protobuf.Empty;
1616
import com.google.protobuf.ListValue;
17+
import com.google.protobuf.NullValue;
1718
import com.google.protobuf.Value;
1819
import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata;
1920
import com.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest;
@@ -76,6 +77,10 @@ public abstract class AbstractMockServerTest {
7677
Statement.of(
7778
"INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID)");
7879

80+
static final Statement GET_COLUMN_DEFAULT_STATEMENT =
81+
Statement.of(
82+
"SELECT DISTINCT COLUMN_DEFAULT AS COLUMN_DEF FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = @p1 AND TABLE_SCHEMA = @p2 AND TABLE_NAME = @p3 AND COLUMN_NAME = @p4");
83+
7984
private static final ResultSetMetadata SINGLE_COL_INT64_METADATA =
8085
ResultSetMetadata.newBuilder()
8186
.setRowType(
@@ -324,6 +329,28 @@ private static void registerDefaultResults() {
324329
mockSpanner.putStatementResult(
325330
StatementResult.query(SELECT_MAX_ORDER_EXEC, createInt64ResultSet(0L)));
326331
mockSpanner.putPartialStatementResult(StatementResult.update(INSERT_DATABASECHANGELOG, 1L));
332+
333+
// TODO: Remove when the JDBC driver includes the column default in getColumns
334+
mockSpanner.putPartialStatementResult(
335+
StatementResult.query(
336+
GET_COLUMN_DEFAULT_STATEMENT,
337+
ResultSet.newBuilder()
338+
.setMetadata(
339+
ResultSetMetadata.newBuilder()
340+
.setRowType(
341+
StructType.newBuilder()
342+
.addFields(
343+
Field.newBuilder()
344+
.setName("COLUMN_DEF")
345+
.setType(Type.newBuilder().setCode(TypeCode.STRING).build())
346+
.build())
347+
.build())
348+
.build())
349+
.addRows(
350+
ListValue.newBuilder()
351+
.addValues(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build())
352+
.build())
353+
.build()));
327354
}
328355

329356
@AfterAll

0 commit comments

Comments
 (0)