net.sourceforge.jtds.jdbc
Class JtdsStatement

java.lang.Object
  extended by net.sourceforge.jtds.jdbc.JtdsStatement
All Implemented Interfaces:
java.sql.Statement, java.sql.Wrapper
Direct Known Subclasses:
JtdsPreparedStatement

public class JtdsStatement
extends java.lang.Object
implements java.sql.Statement

jTDS implementation of the java.sql.Statement interface.

NB. As allowed by the JDBC standard and like most other drivers, this implementation only allows one open result set at a time.

Implementation notes:

I experimented with allowing multiple open result sets as supported by the origianal jTDS but rejected this approach for the following reasons:

  1. It is more difficult to ensure that there are no memory leaks and that cursors are closed if multiple open sets are allowed.
  2. The use of one result set allows cursor and non cursor result sets to be derived from exeuteQuery() or execute() and getResultSet() in the same way that other drivers do.
In the event of an IO failure the setClosed() method forces this statement and associated result set to close preventing the propogation of errors. This class includes a finalize method which increases the chances of the statement being closed tidly in a pooled environment where the user has forgotten to explicitly close the statement before it goes out of scope.

Version:
$Id: JtdsStatement.java,v 1.64.2.4 2009/12/30 08:45:34 ickzon Exp $
Author:
Mike Hutchinson
See Also:
Statement, Connection.createStatement(), ResultSet

Field Summary
protected  java.util.ArrayList batchValues
          Batched SQL Statement array.
(package private) static int BOOLEAN
           
(package private) static int CLOSE_ALL_RESULTS
           
(package private) static int CLOSE_CURRENT_RESULT
           
protected  boolean closed
          True if this statement is closed.
protected  ColInfo[] colMetaData
          The cached column meta data.
protected  ConnectionJDBC2 connection
          The connection owning this statement object.
protected  JtdsResultSet currentResult
          The current ResultSet.
protected  java.lang.String cursorName
          The cursor name to be used for positioned updates.
(package private) static int DATALINK
           
(package private) static int DEFAULT_FETCH_SIZE
           
protected  boolean escapeProcessing
          True if SQL statements should be preprocessed.
(package private) static java.lang.Integer EXECUTE_FAILED
           
protected  int fetchDirection
          The fetch direction for result sets.
protected  int fetchSize
          The fetch size (default 100, only used by cursor ResultSets).
protected  JtdsResultSet genKeyResultSet
          Dummy result set for getGeneratedKeys.
(package private) static int KEEP_CURRENT_RESULT
           
protected  int maxFieldSize
          The maximum field size (not used at present).
protected  int maxRows
          The maximum number of rows to return (not used at present).
protected  SQLDiagnostic messages
          SQL Diagnostic exceptions and warnings.
(package private) static int NO_GENERATED_KEYS
           
protected  java.util.ArrayList openResultSets
          List of open result sets.
protected  int queryTimeout
          The read query timeout in seconds
protected  java.util.LinkedList resultQueue
          List of queued results (update counts, possibly followed by a ResultSet).
protected  int resultSetConcurrency
          The concurrency of result sets created by this statement.
protected  int resultSetType
          The type of result sets created by this statement.
(package private) static int RETURN_GENERATED_KEYS
           
(package private) static java.lang.Integer SUCCESS_NO_INFO
           
protected  TdsCore tds
          The TDS object used for server access.
private  int updateCount
          The current update count.
 
Constructor Summary
JtdsStatement(ConnectionJDBC2 connection, int resultSetType, int resultSetConcurrency)
          Construct a new Statement object.
 
Method Summary
 void addBatch(java.lang.String sql)
           
(package private)  void addWarning(java.sql.SQLWarning w)
          Add an SQLWarning object to the statment warnings list.
protected  void cacheResults()
          Cache as many results as possible (up to the first ResultSet).
 void cancel()
           
protected  void checkCursorException(java.sql.SQLException e)
          Check that the exception is caused by the failure to open a cursor and not by a more serious SQL error.
protected  void checkOpen()
          Check that this statement is still open.
 void clearBatch()
           
 void clearWarnings()
           
 void close()
           
(package private)  void closeAllResultSets()
          Close all result sets.
(package private)  void closeCurrentResultSet()
          Close current result set (if any).
 boolean execute(java.lang.String sql)
           
 boolean execute(java.lang.String sql, int autoGeneratedKeys)
           
 boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean execute(java.lang.String sql, int[] columntle="op" WIDTH="1%">  boolean