/** Provides the toString() implementation. */
  String describeImpl(Session session) throws Exception {

    StringBuffer sb;

    sb = new StringBuffer();

    int blanks = 0;

    switch (type) {
      case StatementTypes.SELECT_CURSOR:
        {
          sb.append(queryExpression.describe(session, 0));
          appendParms(sb).append('\n');
          appendSubqueries(session, sb, 2);

          return sb.toString();
        }
      case StatementTypes.INSERT:
        {
          if (queryExpression == null) {
            sb.append("INSERT VALUES");
            sb.append('[').append('\n');
            appendMultiColumns(sb, insertColumnMap).append('\n');
            appendTable(sb).append('\n');
            appendParms(sb).append('\n');
            appendSubqueries(session, sb, 2).append(']');

            return sb.toString();
          } else {
            sb.append("INSERT SELECT");
            sb.append('[').append('\n');
            appendColumns(sb, insertColumnMap).append('\n');
            appendTable(sb).append('\n');
            sb.append(queryExpression.describe(session, blanks)).append('\n');
            appendParms(sb).append('\n');
            appendSubqueries(session, sb, 2).append(']');

            return sb.toString();
          }
        }
      case StatementTypes.UPDATE_WHERE:
        {
          sb.append("UPDATE");
          sb.append('[').append('\n');
          appendColumns(sb, updateColumnMap).append('\n');
          appendTable(sb).append('\n');
          appendCondition(session, sb);

          for (int i = 0; i < targetRangeVariables.length; i++) {
            sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n');
          }

          appendParms(sb).append('\n');
          appendSubqueries(session, sb, 2).append(']');

          return sb.toString();
        }
      case StatementTypes.DELETE_WHERE:
        {
          sb.append("DELETE");
          sb.append('[').append('\n');
          appendTable(sb).append('\n');
          appendCondition(session, sb);

          for (int i = 0; i < targetRangeVariables.length; i++) {
            sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n');
          }

          appendParms(sb).append('\n');
          appendSubqueries(session, sb, 2).append(']');

          return sb.toString();
        }
      case StatementTypes.CALL:
        {
          sb.append("CALL");
          sb.append('[').append(']');

          return sb.toString();
        }
      case StatementTypes.MERGE:
        {
          sb.append("MERGE");
          sb.append('[').append('\n');
          appendMultiColumns(sb, insertColumnMap).append('\n');
          appendColumns(sb, updateColumnMap).append('\n');
          appendTable(sb).append('\n');
          appendCondition(session, sb);

          for (int i = 0; i < targetRangeVariables.length; i++) {
            sb.append(targetRangeVariables[i].describe(session, blanks)).append('\n');
          }

          appendParms(sb).append('\n');
          appendSubqueries(session, sb, 2).append(']');

          return sb.toString();
        }
      default:
        {
          return "UNKNOWN";
        }
    }
  }