-
Notifications
You must be signed in to change notification settings - Fork 17
Closed
googleapis/java-spanner
#3879Description
Code that reproduces the error (you need access to a Spanner database): https://github.com/bhhoffmann/liquibase-spanner-bug
The SQL for creating the change log table seems to be invalid when using com.google.cloud:google-cloud-spanner newer than 6.90.0. The following error is thrown:
Caused by: com.google.cloud.spanner.SpannerException: INVALID_ARGUMENT: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: Error parsing Spanner DDL statement: CREATE TABLE DATABASECHANGELOG
(
id string(MAX) not null,
author string(MAX) not null,
filename string(MAX) not null,
dateExecuted timestamp not null,
orderExecuted int64 not null,
execType string(MAX),
md5sum string(MAX),
description string(MAX),
comments string(MAX),
tag string(MAX),
liquibase string(MAX),
contexts string(MAX),
labels string(MAX),
deployment_id string(MAX),
) primary key (id, author, filename); : Syntax error on line 17, column 37: Expecting 'EOF' but found an unknown character (';').
at com.google.cloud.spanner.SpannerExceptionFactory.newSpannerExceptionPreformatted(SpannerExceptionFactory.java:394)
at com.google.cloud.spanner.SpannerExceptionFactory.fromApiException(SpannerExceptionFactory.java:416)
at com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException(SpannerExceptionFactory.java:225)
at com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException(SpannerExceptionFactory.java:135)
at com.google.cloud.spanner.DatabaseAdminClientImpl.lambda$updateDatabaseDdl$11(DatabaseAdminClientImpl.java:470)
at com.google.api.core.ApiFutures$ApiFunctionToGuavaFunction.apply(ApiFutures.java:396)
at com.google.common.util.concurrent.AbstractCatchingFuture$CatchingFuture.doFallback(AbstractCatchingFuture.java:238)
at com.google.common.util.concurrent.AbstractCatchingFuture$CatchingFuture.doFallback(AbstractCatchingFuture.java:226)
at com.google.common.util.concurrent.AbstractCatchingFuture.run(AbstractCatchingFuture.java:136)
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30)
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1004)
at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:469)
at com.google.common.util.concurrent.FluentFuture$TrustedFuture.addListener(FluentFuture.java:114)
at com.google.common.util.concurrent.ForwardingListenableFuture.addListener(ForwardingListenableFuture.java:44)
at com.google.api.core.ApiFutureToListenableFuture.addListener(ApiFutureToListenableFuture.java:50)
at com.google.common.util.concurrent.AbstractCatchingFuture.create(AbstractCatchingFuture.java:48)
at com.google.common.util.concurrent.Futures.catching(Futures.java:305)
at com.google.api.core.ApiFutures.catching(ApiFutures.java:140)
at com.google.api.gax.longrunning.OperationFutureImpl.<init>(OperationFutureImpl.java:95)
at com.google.cloud.spanner.DatabaseAdminClientImpl.updateDatabaseDdl(DatabaseAdminClientImpl.java:468)
at com.google.cloud.spanner.connection.DdlClient.executeDdl(DdlClient.java:140)
at com.google.cloud.spanner.connection.DdlClient.executeDdl(DdlClient.java:123)
at com.google.cloud.spanner.connection.SingleUseTransaction.lambda$executeDdlAsync$4(SingleUseTransaction.java:395)
at com.google.cloud.spanner.connection.DdlClient.runWithRetryForMissingDefaultSequenceKind(DdlClient.java:155)
at com.google.cloud.spanner.connection.SingleUseTransaction.lambda$executeDdlAsync$5(SingleUseTransaction.java:392)
at io.grpc.Context$2.call(Context.java:583)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:128)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:74)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:80)
at com.google.common.util.concurrent.DirectExecutorService.execute(DirectExecutorService.java:52)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:78)
at com.google.cloud.spanner.connection.StatementExecutor.submit(StatementExecutor.java:207)
at com.google.cloud.spanner.connection.AbstractBaseUnitOfWork.executeStatementAsync(AbstractBaseUnitOfWork.java:383)
at com.google.cloud.spanner.connection.AbstractBaseUnitOfWork.executeStatementAsync(AbstractBaseUnitOfWork.java:284)
at com.google.cloud.spanner.connection.SingleUseTransaction.executeDdlAsync(SingleUseTransaction.java:409)
at com.google.cloud.spanner.connection.ConnectionImpl.executeDdlAsync(ConnectionImpl.java:2315)
at com.google.cloud.spanner.connection.ConnectionImpl.internalExecute(ConnectionImpl.java:1422)
at com.google.cloud.spanner.connection.ConnectionImpl.execute(ConnectionImpl.java:1392)
at com.google.cloud.spanner.jdbc.AbstractJdbcStatement.lambda$execute$2(AbstractJdbcStatement.java:309)
at com.google.cloud.spanner.jdbc.AbstractJdbcStatement.doWithStatementTimeout(AbstractJdbcStatement.java:260)
A simple workaround would be to remove the semicolon from the SQL statement, but I don't know whether google-cloud-spanner is supposed to support this or not (if its a bug in that lib or not)
narhen, adriantr, sberglann, torkjel, brandhaug and 1 more
Metadata
Metadata
Assignees
Labels
No labels