nl.topicus.jdbc.statement

## Class CloudSpannerStatement

- java.lang.Object
- - nl.topicus.jdbc.metadata.AbstractCloudSpannerWrapper
  - - nl.topicus.jdbc.AbstractCloudSpannerFetcher
    - - nl.topicus.jdbc.statement.CloudSpannerStatement

All Implemented Interfaces:
  AutoCloseable, Statement, Wrapper

Direct Known Subclasses:
  AbstractCloudSpannerPreparedStatement

    public class CloudSpannerStatement
    extends AbstractCloudSpannerFetcher

Author:
  loite

### Nested Class Summary

Nested Classes
`class` `CloudSpannerStatement.CustomDriverStatement`

### Field Summary

Fields
`protected int` `currentResultSetIndex`
`protected List<ResultSet>` `currentResultSets`
`protected int` `lastUpdateCount`
`protected static String` `NO_MUTATIONS_IN_READ_ONLY_MODE_EXCEPTION`

### Fields inherited from interface java.sql.Statement

`CLOSE_ALL_RESULTS, CLOSE_CURRENT_RESULT, EXECUTE_FAILED, KEEP_CURRENT_RESULT, NO_GENERATED_KEYS, RETURN_GENERATED_KEYS, SUCCESS_NO_INFO`

### Constructor Summary

Constructors
Constructor and Description
`CloudSpannerStatement(CloudSpannerConnection connection, com.google.cloud.spanner.DatabaseClient dbClient)`

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `addBatch(String sql)`
`void` `cancel()`
`protected void` `checkClosed()`
`void` `clearBatch()`
`void` `clearWarnings()`
`void` `close()`
`void` `closeOnCompletion()`
`protected String` `createInsertSelectOnDuplicateKeyUpdateStatement(net.sf.jsqlparser.statement.update.Update update)` Transform the given UPDATE-statement into an "INSERT INTO TAB1 (...) SELECT ...
`protected void` `determineForceSingleUseReadContext(net.sf.jsqlparser.statement.select.Select select)` Determines whether the given sql statement must be executed in a single use read context.
`boolean` `execute(String sql)`
`boolean` `execute(String sql, int autoGeneratedKeys)`
`boolean` `execute(String sql, int[] columnIndexes)`
`boolean` `execute(String sql, String[] columnNames)`
`int[]` `executeBatch()`
`protected void` `executeDDL(List<String> ddl)`
`protected int` `executeDDL(String ddl)`
`ResultSet` `executeQuery(String sql)`
`int` `executeUpdate(String sql)`
`int` `executeUpdate(String sql, int autoGeneratedKeys)`
`int` `executeUpdate(String sql, int[] columnIndexes)`
`int` `executeUpdate(String sql, String[] columnNames)`
`protected String` `formatDDLStatement(String sql)` Does some formatting to DDL statements that might have been generated by standard SQL generators to make it compatible with Google Cloud Spanner.
`List<String>` `getBatch()`
`protected com.google.cloud.spanner.BatchReadOnlyTransaction` `getBatchReadOnlyTransaction()`
`CloudSpannerConnection` `getConnection()`
`nl.topicus.jdbc.statement.CloudSpannerStatement.BatchMode` `getCurrentBatchMode()` Batching of DML and DDL statements together is not supported.
`protected CloudSpannerStatement.CustomDriverStatement` `getCustomDriverStatement(String[] sqlTokens)` Checks if a sql statement is a custom statement only recognized by this driver
`ResultSet` `getGeneratedKeys()`
`int` `getMaxFieldSize()`
`int` `getMaxRows()`
`boolean` `getMoreResults()`
`boolean` `getMoreResults(int current)`
`int` `getQueryTimeout()`
`protected com.google.cloud.spanner.ReadContext` `getReadContext()`
`ResultSet` `getResultSet()`
`int` `getResultSetConcurrency()`
`int` `getResultSetHoldability()`
`int` `getResultSetType()`
`protected String[]` `getTokens(String sql)` Remove comments from the given sql string and split it into parts based on all space characters
`protected String[]` `getTokens(String sql, int limit)` Remove comments from the given sql string and split it into parts based on all space characters
`int` `getUpdateCount()`
`SQLWarning` `getWarnings()`
`boolean` `isClosed()`
`boolean` `isCloseOnCompletion()`
`protected boolean` `isDDLStatement(String[] sqlTokens)` Do a quick check if this SQL statement is a DDL statement
`boolean` `isForceSingleUseReadContext()`
`boolean` `isPoolable()`
`protected boolean` `isSelectStatement(String[] sqlTokens)`
`protected List<com.google.cloud.spanner.Partition>` `partitionQuery(com.google.cloud.spanner.Statement statement)`
`protected String` `quoteIdentifier(String identifier)`
`protected String` `removeComments(String sql)`
`protected String` `sanitizeSQL(String sql)`
`void` `setCursorName(String name)`
`void` `setEscapeProcessing(boolean enable)`
`void` `setForceSingleUseReadContext(boolean forceSingleUseReadContext)`
`void` `setMaxFieldSize(int max)`
`void` `setMaxRows(int max)`
`void` `setPoolable(boolean poolable)`
`void` `setQueryTimeout(int seconds)`
`protected String` `unquoteIdentifier(String identifier)`
`protected long` `writeMutations(nl.topicus.jdbc.statement.Mutations mutations)`

### Methods inherited from class nl.topicus.jdbc.AbstractCloudSpannerFetcher

`getFetchDirection, getFetchSize, setFetchDirection, setFetchSize`

### Methods inherited from class nl.topicus.jdbc.metadata.AbstractCloudSpannerWrapper

`extractColumnType, getClassName, getClassName, getGoogleTypeName, isWrapperFor, unwrap`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface java.sql.Statement

`executeLargeBatch, executeLargeUpdate, executeLargeUpdate, executeLargeUpdate, executeLargeUpdate, getFetchDirection, getFetchSize, getLargeMaxRows, getLargeUpdateCount, setFetchDirection, setFetchSize, setLargeMaxRows`

### Methods inherited from interface java.sql.Wrapper

`isWrapperFor, unwrap`

### Field Detail

#### currentResultSets

    protected List<ResultSet> currentResultSets

#### currentResultSetIndex

    protected int currentResultSetIndex

#### lastUpdateCount

    protected int lastUpdateCount

#### NO_MUTATIONS_IN_READ_ONLY_MODE_EXCEPTION

    protected static final String NO_MUTATIONS_IN_READ_ONLY_MODE_EXCEPTION

See Also:
  Constant Field Values

### Constructor Detail

#### CloudSpannerStatement

    public CloudSpannerStatement(CloudSpannerConnection connection,
                                 com.google.cloud.spanner.DatabaseClient dbClient)

### Method Detail

#### formatDDLStatement

    protected String formatDDLStatement(String sql)

Does some formatting to DDL statements that might have been generated by standard SQL generators to make it compatible with Google Cloud Spanner. We also need to get rid of any comments, as Google Cloud Spanner does not accept comments in DDL-statements.

Parameters:
  `sql` - The sql to format
Returns:
  The formatted DDL statement.

#### getCurrentBatchMode

    public nl.topicus.jdbc.statement.CloudSpannerStatement.BatchMode getCurrentBatchMode()

Batching of DML and DDL statements together is not supported. The batch mode of a statement is determined by the first statement that is batched. All subsequent statements that are added to the batch must be of the same type.

Returns:
  The current batch mode of this statement

#### getBatch

    public List<String> getBatch()

Returns:
  An unmodifiable list of the currently batched statements that will be executed if `executeBatch()` is called.

#### addBatch

    public void addBatch(String sql)
                  throws SQLException

Throws:
  `SQLException`

#### clearBatch

    public void clearBatch()
                    throws SQLException

Throws:
  `SQLException`

#### executeBatch

    public int[] executeBatch()
                       throws SQLException

Throws:
  `SQLException`

#### executeDDL

    protected int executeDDL(String ddl)
                      throws SQLException

Throws:
  `SQLException`

#### executeDDL

    protected void executeDDL(List<String> ddl)
                       throws SQLException

Throws:
  `SQLException`

#### executeQuery

    public ResultSet executeQuery(String sql)
                           throws SQLException

Throws:
  `SQLException`

#### executeUpdate

    public int executeUpdate(String sql)
                      throws SQLException

Throws:
  `SQLException`

#### execute

    public boolean execute(String sql)
                    throws SQLException

Throws:
  `SQLException`

#### isDDLStatement

    protected boolean isDDLStatement(String[] sqlTokens)

Do a quick check if this SQL statement is a DDL statement

Parameters:
  `sqlTokens` - The statement to check
Returns:
  true if the SQL statement is a DDL statement

#### getTokens

    protected String[] getTokens(String sql)

Remove comments from the given sql string and split it into parts based on all space characters

Parameters:
  `sql` - The sql string to split into tokens
Returns:
  String array with all the parts of the sql statement

#### getTokens

    protected String[] getTokens(String sql,
                                 int limit)

Remove comments from the given sql string and split it into parts based on all space characters

Parameters:
  `sql` - The sql statement to break into parts
  `limit` - The maximum number of times the pattern should be applied
Returns:
  String array with all the parts of the sql statement

#### removeComments

    protected String removeComments(String sql)

#### isSelectStatement

    protected boolean isSelectStatement(String[] sqlTokens)

#### getCustomDriverStatement

    protected CloudSpannerStatement.CustomDriverStatement getCustomDriverStatement(String[] sqlTokens)

Checks if a sql statement is a custom statement only recognized by this driver

Parameters:
  `sqlTokens` - The statement to check
Returns:
  The custom driver statement if the given statement is a custom statement only recognized by the Cloud Spanner JDBC driver, such as show_ddl_operations

#### getResultSet

    public ResultSet getResultSet()
                           throws SQLException

Throws:
  `SQLException`

#### getUpdateCount

    public int getUpdateCount()
                       throws SQLException

Throws:
  `SQLException`

#### getMoreResults

    public boolean getMoreResults()
                           throws SQLException

Throws:
  `SQLException`

#### getMoreResults

    public boolean getMoreResults(int current)
                           throws SQLException

Throws:
  `SQLException`

#### executeUpdate

    public int executeUpdate(String sql,
                             int autoGeneratedKeys)
                      throws SQLException

Throws:
  `SQLException`

#### executeUpdate

    public int executeUpdate(String sql,
                             int[] columnIndexes)
                      throws SQLException

Throws:
  `SQLException`

#### executeUpdate

    public int executeUpdate(String sql,
                             String[] columnNames)
                      throws SQLException

Throws:
  `SQLException`

#### execute

    public boolean execute(String sql,
                           int autoGeneratedKeys)
                    throws SQLException

Throws:
  `SQLException`

#### execute

    public boolean execute(String sql,
                           int[] columnIndexes)
                    throws SQLException

Throws:
  `SQLException`

#### execute

    public boolean execute(String sql,
                           String[] columnNames)
                    throws SQLException

Throws:
  `SQLException`

#### getGeneratedKeys

    public ResultSet getGeneratedKeys()
                               throws SQLException

Throws:
  `SQLException`

#### sanitizeSQL

    protected String sanitizeSQL(String sql)

#### createInsertSelectOnDuplicateKeyUpdateStatement

    protected String createInsertSelectOnDuplicateKeyUpdateStatement(net.sf.jsqlparser.statement.update.Update update)
                                                              throws SQLException

Transform the given UPDATE-statement into an "INSERT INTO TAB1 (...) SELECT ... FROM TAB1 WHERE ... ON DUPLICATE KEY UPDATE"

Parameters:
  `update` - The UPDATE-statement
Returns:
  An SQL-statement equal to the UPDATE-statement but in INSERT form
Throws:
  `SQLException` - if a database exception occurs while getting the table meta data or if the statement tries to update the primary key value

#### quoteIdentifier

    protected String quoteIdentifier(String identifier)

#### unquoteIdentifier

    protected String unquoteIdentifier(String identifier)

#### determineForceSingleUseReadContext

    protected void determineForceSingleUseReadContext(net.sf.jsqlparser.statement.select.Select select)

Determines whether the given sql statement must be executed in a single use read context. This must be done for queries against the information schema. This method sets the `forceSingleUseReadContext` to true if necessary.

Parameters:
  `select` - The sql statement to be examined.

#### isForceSingleUseReadContext

    public boolean isForceSingleUseReadContext()

#### setForceSingleUseReadContext

    public void setForceSingleUseReadContext(boolean forceSingleUseReadContext)

#### getReadContext

    protected com.google.cloud.spanner.ReadContext getReadContext()
                                                           throws SQLException

Throws:
  `SQLException`

#### partitionQuery

    protected List<com.google.cloud.spanner.Partition> partitionQuery(com.google.cloud.spanner.Statement statement)

#### getBatchReadOnlyTransaction

    protected com.google.cloud.spanner.BatchReadOnlyTransaction getBatchReadOnlyTransaction()

#### writeMutations

    protected long writeMutations(nl.topicus.jdbc.statement.Mutations mutations)
                           throws SQLException

Throws:
  `SQLException`

#### isClosed

    public boolean isClosed()
                     throws SQLException

Specified by:
  `isClosed` in interface `Statement`
Throws:
  `SQLException`

#### close

    public void close()
               throws SQLException

Specified by:
  `close` in interface `AutoCloseable`
Specified by:
  `close` in interface `Statement`
Throws:
  `SQLException`

#### checkClosed

    protected void checkClosed()
                        throws SQLException

Throws:
  `SQLException`

#### getMaxFieldSize

    public int getMaxFieldSize()
                        throws SQLException

Specified by:
  `getMaxFieldSize` in interface `Statement`
Throws:
  `SQLException`

#### setMaxFieldSize

    public void setMaxFieldSize(int max)
                         throws SQLException

Specified by:
  `setMaxFieldSize` in interface `Statement`
Throws:
  `SQLException`

#### getMaxRows

    public int getMaxRows()
                   throws SQLException

Specified by:
  `getMaxRows` in interface `Statement`
Throws:
  `SQLException`

#### setMaxRows

    public void setMaxRows(int max)
                    throws SQLException

Specified by:
  `setMaxRows` in interface `Statement`
Throws:
  `SQLException`

#### setEscapeProcessing

    public void setEscapeProcessing(boolean enable)
                             throws SQLException

Specified by:
  `setEscapeProcessing` in interface `Statement`
Throws:
  `SQLException`

#### getQueryTimeout

    public int getQueryTimeout()
                        throws SQLException

Specified by:
  `getQueryTimeout` in interface `Statement`
Throws:
  `SQLException`

#### setQueryTimeout

    public void setQueryTimeout(int seconds)
                         throws SQLException

Specified by:
  `setQueryTimeout` in interface `Statement`
Throws:
  `SQLException`

#### cancel

    public void cancel()
                throws SQLException

Specified by:
  `cancel` in interface `Statement`
Throws:
  `SQLException`

#### getWarnings

    public SQLWarning getWarnings()
                           throws SQLException

Specified by:
  `getWarnings` in interface `Statement`
Throws:
  `SQLException`

#### clearWarnings

    public void clearWarnings()
                       throws SQLException

Specified by:
  `clearWarnings` in interface `Statement`
Throws:
  `SQLException`

#### setCursorName

    public void setCursorName(String name)
                       throws SQLException

Specified by:
  `setCursorName` in interface `Statement`
Throws:
  `SQLException`

#### getResultSetConcurrency

    public int getResultSetConcurrency()
                                throws SQLException

Specified by:
  `getResultSetConcurrency` in interface `Statement`
Throws:
  `SQLException`

#### getResultSetType

    public int getResultSetType()
                         throws SQLException

Specified by:
  `getResultSetType` in interface `Statement`
Throws:
  `SQLException`

#### getConnection

    public CloudSpannerConnection getConnection()
                                         throws SQLException

Specified by:
  `getConnection` in interface `Statement`
Throws:
  `SQLException`

#### getResultSetHoldability

    public int getResultSetHoldability()
                                throws SQLException

Specified by:
  `getResultSetHoldability` in interface `Statement`
Throws:
  `SQLException`

#### setPoolable

    public void setPoolable(boolean poolable)
                     throws SQLException

Specified by:
  `setPoolable` in interface `Statement`
Throws:
  `SQLException`

#### isPoolable

    public boolean isPoolable()
                       throws SQLException

Specified by:
  `isPoolable` in interface `Statement`
Throws:
  `SQLException`

#### closeOnCompletion

    public void closeOnCompletion()
                           throws SQLException

Specified by:
  `closeOnCompletion` in interface `Statement`
Throws:
  `SQLException`

#### isCloseOnCompletion

    public boolean isCloseOnCompletion()
                                throws SQLException

Specified by:
  `isCloseOnCompletion` in interface `Statement`
Throws:
  `SQLException`