// Path: cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/statement/TypedNull.java
// public class TypedNull {
// 
//   private final Class<?> type;
// 
//   public TypedNull(Class<?> type) {
//     this.type = type;
//   }
// 
//   public Class<?> getType() {
//     return this.type;
//   }
// }


import com.google.cloud.spanner.r2dbc.statement.TypedNull;
import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
import io.r2dbc.spi.Result;
import io.r2dbc.spi.Statement;
import java.util.ArrayList;
import java.util.List;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
      return executeMultiple(this.statements);
    }
    return executeSingle(this.currentStatementBuilder.build());
  }

  protected abstract Mono<SpannerClientLibraryResult> executeSingle(
      com.google.cloud.spanner.Statement statement);

  protected abstract Flux<SpannerClientLibraryResult> executeMultiple(
      List<com.google.cloud.spanner.Statement> statements);

  @Override
  public Statement bind(int index, Object value) {
    throw new UnsupportedOperationException();
  }

  @Override
  public Statement bind(String name, Object value) {
    ClientLibraryBinder.bind(this.currentStatementBuilder, name, value);
    this.startedBinding = true;
    return this;
  }

  @Override
  public Statement bindNull(int index, Class<?> type) {
    throw new UnsupportedOperationException();
  }

  @Override
  public Statement bindNull(String name, Class<?> type) {
// Path: cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/statement/TypedNull.java
// public class TypedNull {
// 
//   private final Class<?> type;
// 
//   public TypedNull(Class<?> type) {
//     this.type = type;
//   }
// 
//   public Class<?> getType() {
//     return this.type;
//   }
// }


// Path: cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/v2/AbstractSpannerClientLibraryStatement.java
import com.google.cloud.spanner.r2dbc.statement.TypedNull;
import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
import io.r2dbc.spi.Result;
import io.r2dbc.spi.Statement;
import java.util.ArrayList;
import java.util.List;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

      return executeMultiple(this.statements);
    }
    return executeSingle(this.currentStatementBuilder.build());
  }

  protected abstract Mono<SpannerClientLibraryResult> executeSingle(
      com.google.cloud.spanner.Statement statement);

  protected abstract Flux<SpannerClientLibraryResult> executeMultiple(
      List<com.google.cloud.spanner.Statement> statements);

  @Override
  public Statement bind(int index, Object value) {
    throw new UnsupportedOperationException();
  }

  @Override
  public Statement bind(String name, Object value) {
    ClientLibraryBinder.bind(this.currentStatementBuilder, name, value);
    this.startedBinding = true;
    return this;
  }

  @Override
  public Statement bindNull(int index, Class<?> type) {
    throw new UnsupportedOperationException();
  }

  @Override
  public Statement bindNull(String name, Class<?> type) {
    ClientLibraryBinder.bind(this.currentStatementBuilder, name, new TypedNull(type));