/**
   * Registers a compiled statement to be managed.
   *
   * <p>The only caller should be a Session that is attempting to prepare a statement for the first
   * time, or a statement that has been invalidated due to DDL changes.
   *
   * @param csid existing id or negative if the statement is not yet managed
   * @param cs The CompiledStatement to add
   * @return The compiled statement id assigned to the CompiledStatement object
   */
  synchronized int registerStatement(int csid, CompiledStatement cs) {

    if (csid < 0) {
      csid = nextID();

      sqlMap.put(cs.sql, csid);
      sqlLookup.put(csid, cs.sql);
    }

    csidMap.put(csid, cs);

    return csid;
  }
  /**
   * Retrieves a new map from set of string tokens to numeric tokens for commonly encountered
   * database command token occurences.
   *
   * @return a new map for the database command token set
   */
  private static IntValueHashMap newCommandSet() {

    IntValueHashMap commandSet;

    commandSet = new IntValueHashMap(67);

    commandSet.put(T_ADD, ADD);
    commandSet.put(T_ALIAS, ALIAS);
    commandSet.put(T_ALTER, ALTER);
    commandSet.put(T_AUTOCOMMIT, AUTOCOMMIT);
    commandSet.put(T_CACHED, CACHED);
    commandSet.put(T_CALL, CALL);
    commandSet.put(T_CHECK, CHECK);
    commandSet.put(T_CHECKPOINT, CHECKPOINT);
    commandSet.put(T_COLUMN, COLUMN);
    commandSet.put(T_COMMIT, COMMIT);
    commandSet.put(T_CONNECT, CONNECT);
    commandSet.put(T_CONSTRAINT, CONSTRAINT);
    commandSet.put(T_CREATE, CREATE);
    commandSet.put(T_DATABASE, DATABASE);
    commandSet.put(T_DELETE, DELETE);
    commandSet.put(T_DEFRAG, DEFRAG);
    commandSet.put(T_DISCONNECT, DISCONNECT);
    commandSet.put(T_DROP, DROP);
    commandSet.put(T_EXCEPT, EXCEPT);
    commandSet.put(T_EXPLAIN, EXPLAIN);
    commandSet.put(T_FOREIGN, FOREIGN);
    commandSet.put(T_GRANT, GRANT);
    commandSet.put(T_IGNORECASE, IGNORECASE);
    commandSet.put(T_INCREMENT, INCREMENT);
    commandSet.put(T_INDEX, INDEX);
    commandSet.put(T_INITIAL, INITIAL);
    commandSet.put(T_INSERT, INSERT);
    commandSet.put(T_INTERSECT, INTERSECT);
    commandSet.put(T_LOGSIZE, LOGSIZE);
    commandSet.put(T_MAXROWS, MAXROWS);
    commandSet.put(T_MEMORY, MEMORY);
    commandSet.put(T_MINUS, MINUS);
    commandSet.put(T_NEXT, NEXT);
    commandSet.put(T_NOT, NOT);
    commandSet.put(T_OPENBRACKET, OPENBRACKET);
    commandSet.put(T_PASSWORD, PASSWORD);
    commandSet.put(T_PLAN, PLAN);
    commandSet.put(T_PRIMARY, PRIMARY);
    commandSet.put(T_PROPERTY, PROPERTY);
    commandSet.put(T_READONLY, READONLY);
    commandSet.put(T_REFERENTIAL_INTEGRITY, REFERENTIAL_INTEGRITY);
    commandSet.put(T_RELEASE, RELEASE);
    commandSet.put(T_RENAME, RENAME);
    commandSet.put(T_RESTART, RESTART);
    commandSet.put(T_REVOKE, REVOKE);
    commandSet.put(T_ROLE, ROLE);
    commandSet.put(T_ROLLBACK, ROLLBACK);
    commandSet.put(T_SAVEPOINT, SAVEPOINT);
    commandSet.put(T_SCRIPT, SCRIPT);
    commandSet.put(T_SCRIPTFORMAT, SCRIPTFORMAT);
    commandSet.put(T_SELECT, SELECT);
    commandSet.put(T_SEMICOLON, SEMICOLON);
    commandSet.put(T_SEQUENCE, SEQUENCE);
    commandSet.put(T_SET, SET);
    commandSet.put(T_SHUTDOWN, SHUTDOWN);
    commandSet.put(T_SOURCE, SOURCE);
    commandSet.put(T_TABLE, TABLE);
    commandSet.put(T_TEMP, TEMP);
    commandSet.put(T_TEXT, TEXT);
    commandSet.put(T_TRIGGER, TRIGGER);
    commandSet.put(T_UNIQUE, UNIQUE);
    commandSet.put(T_UPDATE, UPDATE);
    commandSet.put(T_UNION, UNION);
    commandSet.put(T_USER, USER);
    commandSet.put(T_VALUES, VALUES);
    commandSet.put(T_VIEW, VIEW);
    commandSet.put(T_WRITE_DELAY, WRITE_DELAY);
    commandSet.put(T_SCHEMA, SCHEMA);

    return commandSet;
  }
  static {
    typeNames = new IntValueHashMap(37);

    typeNames.put("CHARACTER", Types.SQL_CHAR);
    typeNames.put("VARCHAR", Types.SQL_VARCHAR);
    typeNames.put("VARCHAR_IGNORECASE", Types.VARCHAR_IGNORECASE);
    typeNames.put("DATE", Types.SQL_DATE);
    typeNames.put("TIME", Types.SQL_TIME);
    typeNames.put("TIMESTAMP", Types.SQL_TIMESTAMP);
    typeNames.put("INTERVAL", Types.SQL_INTERVAL);
    typeNames.put("TINYINT", Types.TINYINT);
    typeNames.put("SMALLINT", Types.SQL_SMALLINT);
    typeNames.put("INTEGER", Types.SQL_INTEGER);
    typeNames.put("BIGINT", Types.SQL_BIGINT);
    typeNames.put("REAL", Types.SQL_REAL);
    typeNames.put("FLOAT", Types.SQL_FLOAT);
    typeNames.put("DOUBLE", Types.SQL_DOUBLE);
    typeNames.put("NUMERIC", Types.SQL_NUMERIC);
    typeNames.put("DECIMAL", Types.SQL_DECIMAL);
    typeNames.put("BOOLEAN", Types.SQL_BOOLEAN);
    typeNames.put("BINARY", Types.SQL_BINARY);
    typeNames.put("VARBINARY", Types.SQL_VARBINARY);
    typeNames.put("CLOB", Types.SQL_CLOB);
    typeNames.put("BLOB", Types.SQL_BLOB);
    typeNames.put("OTHER", Types.OTHER);

    //
    typeAliases = new IntValueHashMap(67, 1);

    typeAliases.put("CHAR", Types.SQL_CHAR);
    typeAliases.put("CHAR VARYING", Types.SQL_VARCHAR);
    typeAliases.put("CHARACTER VARYING", Types.SQL_VARCHAR);
    typeAliases.put("CHARACTER LARGE OBJECT", Types.SQL_CLOB);
    typeAliases.put("INT", Types.SQL_INTEGER);
    typeAliases.put("DEC", Types.SQL_DECIMAL);
    typeAliases.put("LONGVARCHAR", Types.SQL_VARCHAR);
    typeAliases.put("DATETIME", Types.SQL_TIMESTAMP);
    typeAliases.put("BIT", Types.SQL_BOOLEAN);
    typeAliases.put("LONGVARBINARY", Types.SQL_VARBINARY);
    typeAliases.put("OBJECT", Types.OTHER);
  }
  static {
    typeAliases = new IntValueHashMap(67, 1);

    typeAliases.put("INTEGER", Types.INTEGER);
    typeAliases.put("INT", Types.INTEGER);
    typeAliases.put("int", Types.INTEGER);
    typeAliases.put("java.lang.Integer", Types.INTEGER);
    typeAliases.put("IDENTITY", Types.INTEGER);
    typeAliases.put("DOUBLE", Types.DOUBLE);
    typeAliases.put("double", Types.DOUBLE);
    typeAliases.put("java.lang.Double", Types.DOUBLE);
    typeAliases.put("FLOAT", Types.FLOAT);
    typeAliases.put("REAL", Types.REAL);
    typeAliases.put("VARCHAR", Types.VARCHAR);
    typeAliases.put("java.lang.String", Types.VARCHAR);
    typeAliases.put("CHAR", Types.CHAR);
    typeAliases.put("CHARACTER", Types.CHAR);
    typeAliases.put("LONGVARCHAR", Types.LONGVARCHAR);
    typeAliases.put("VARCHAR_IGNORECASE", VARCHAR_IGNORECASE);
    typeAliases.put("DATE", Types.DATE);
    typeAliases.put("java.sql.Date", Types.DATE);
    typeAliases.put("TIME", Types.TIME);
    typeAliases.put("java.sql.Time", Types.TIME);
    typeAliases.put("TIMESTAMP", Types.TIMESTAMP);
    typeAliases.put("java.sql.Timestamp", Types.TIMESTAMP);
    typeAliases.put("DATETIME", Types.TIMESTAMP);
    typeAliases.put("DECIMAL", Types.DECIMAL);
    typeAliases.put("java.math.BigDecimal", Types.DECIMAL);
    typeAliases.put("NUMERIC", Types.NUMERIC);
    typeAliases.put("BIT", Types.BIT);
    typeAliases.put("boolean", Types.BIT);
    typeAliases.put("java.lang.Boolean", Types.BIT);
    typeAliases.put("TINYINT", Types.TINYINT);
    typeAliases.put("byte", Types.TINYINT);
    typeAliases.put("java.lang.Byte", Types.TINYINT);
    typeAliases.put("SMALLINT", Types.SMALLINT);
    typeAliases.put("short", Types.SMALLINT);
    typeAliases.put("java.lang.Short", Types.SMALLINT);
    typeAliases.put("BIGINT", Types.BIGINT);
    typeAliases.put("long", Types.BIGINT);
    typeAliases.put("java.lang.Long", Types.BIGINT);
    typeAliases.put("BINARY", Types.BINARY);
    typeAliases.put("[B", Types.BINARY);
    typeAliases.put("VARBINARY", Types.VARBINARY);
    typeAliases.put("LONGVARBINARY", Types.LONGVARBINARY);
    typeAliases.put("OTHER", Types.OTHER);
    typeAliases.put("OBJECT", Types.OTHER);
    typeAliases.put("java.lang.Object", Types.OTHER);
    typeAliases.put("NULL", Types.NULL);
    typeAliases.put("void", Types.NULL);
    typeAliases.put("java.lang.Void", Types.NULL);

    //
    typeNames = new IntKeyHashMap(37);

    typeNames.put(Types.NULL, "NULL");
    typeNames.put(Types.INTEGER, "INTEGER");
    typeNames.put(Types.DOUBLE, "DOUBLE");
    typeNames.put(VARCHAR_IGNORECASE, "VARCHAR_IGNORECASE");
    typeNames.put(Types.VARCHAR, "VARCHAR");
    typeNames.put(Types.CHAR, "CHAR");
    typeNames.put(Types.LONGVARCHAR, "LONGVARCHAR");
    typeNames.put(Types.DATE, "DATE");
    typeNames.put(Types.TIME, "TIME");
    typeNames.put(Types.DECIMAL, "DECIMAL");
    typeNames.put(Types.BIT, "BIT");
    typeNames.put(Types.TINYINT, "TINYINT");
    typeNames.put(Types.SMALLINT, "SMALLINT");
    typeNames.put(Types.BIGINT, "BIGINT");
    typeNames.put(Types.REAL, "REAL");
    typeNames.put(Types.FLOAT, "FLOAT");
    typeNames.put(Types.NUMERIC, "NUMERIC");
    typeNames.put(Types.TIMESTAMP, "TIMESTAMP");
    typeNames.put(Types.BINARY, "BINARY");
    typeNames.put(Types.VARBINARY, "VARBINARY");
    typeNames.put(Types.LONGVARBINARY, "LONGVARBINARY");
    typeNames.put(Types.OTHER, "OBJECT");

    //
    illegalParameterClasses = new org.hsqldb.lib.HashSet(13);

    illegalParameterClasses.add(Byte.TYPE);
    illegalParameterClasses.add(Short.TYPE);
    illegalParameterClasses.add(Float.TYPE);
    illegalParameterClasses.add(Byte.class);
    illegalParameterClasses.add(Short.class);
    illegalParameterClasses.add(Float.class);
  }