docs: Table SYSTEM_PROCEDURECOLUMNS() {
  
          Table t = sysTables[SYSTEM_PROCEDURECOLUMNS];
  
          if (t == null) {
              t = createBlankTable(sysTableHsqlNames[SYSTEM_PROCEDURECOLUMNS]);
  
              // ----------------------------------------------------------------
              // required
              // ----------------------------------------------------------------
              addColumn(t, "PROCEDURE_CAT", SQL_IDENTIFIER);          // 0
              addColumn(t, "PROCEDURE_SCHEM", SQL_IDENTIFIER);        // 1
              addColumn(t, "PROCEDURE_NAME", SQL_IDENTIFIER);         // not null
              addColumn(t, "COLUMN_NAME", SQL_IDENTIFIER);            // not null
              addColumn(t, "COLUMN_TYPE", Type.SQL_SMALLINT);         // not null
              addColumn(t, "DATA_TYPE", Type.SQL_SMALLINT);           // not null
              addColumn(t, "TYPE_NAME", SQL_IDENTIFIER);              // not null
              addColumn(t, "PRECISION", Type.SQL_INTEGER);            // 7
              addColumn(t, "LENGTH", Type.SQL_INTEGER);               // 8
              addColumn(t, "SCALE", Type.SQL_SMALLINT);               // 9
              addColumn(t, "RADIX", Type.SQL_SMALLINT);               // 10
              addColumn(t, "NULLABLE", Type.SQL_SMALLINT);            // not null
              addColumn(t, "REMARKS", CHARACTER_DATA);                // 12
  
              // ----------------------------------------------------------------
              // JDBC 4.0
              // ----------------------------------------------------------------
              addColumn(t, "COLUMN_DEF", CHARACTER_DATA);             // 13
              addColumn(t, "SQL_DATA_TYPE", Type.SQL_INTEGER);        // 14
              addColumn(t, "SQL_DATETIME_SUB", Type.SQL_INTEGER);     // 15
              addColumn(t, "CHAR_OCTET_LENGTH", Type.SQL_INTEGER);    // 16
              addColumn(t, "ORDINAL_POSITION", Type.SQL_INTEGER);     // not null
              addColumn(t, "IS_NULLABLE", CHARACTER_DATA);            // not null
              addColumn(t, "SPECIFIC_NAME", SQL_IDENTIFIER);          // not null
  
              // ----------------------------------------------------------------
              // just for JDBC sort contract
              // ----------------------------------------------------------------
              addColumn(t, "JDBC_SEQ", Type.SQL_INTEGER);             // not null
  
              // ----------------------------------------------------------------
              // order: PROCEDURE_SCHEM, PROCEDURE_NAME, SPECIFIC_NAME, SEQ
              // added for unique: PROCEDURE_CAT
              // false PK, as PROCEDURE_SCHEM and/or PROCEDURE_CAT may be null
              HsqlName name = HsqlNameManager.newInfoSchemaObjectName(
                  sysTableHsqlNames[SYSTEM_PROCEDURECOLUMNS].name, false,
                  SchemaObject.INDEX);
  
              t.createPrimaryKey(name, new int[] {
                  1, 2, 19, 20, 0
              }, false);
  
              return t;
          }
  
          // calculated column values
          String  procedureCatalog;
          String  procedureSchema;
          String  procedureName;
          String  columnName;
          Integer columnType;
          Integer dataType;
          String  dataTypeName;
          Integer precision;
          Integer length;
          Integer scale;
          Integer radix;
          Integer nullability;
          String  remark;
  
          // JDBC 4.0
          String  colDefault;
          Integer sqlDataType;
          Integer sqlDateTimeSub;
          Integer charOctetLength;
          Integer ordinalPosition;
          String  isNullable;
          String  specificName;
  
          // extended
          int jdbcSequence;
  
          // intermediate holders
          int           colCount;
          HsqlArrayList aliasList;
          Object[]      info;
          Method        method;
          Iterator      methods;
          Object[]      row;
          DITypeInfo    ti;
  
          // Initialization
          methods = ns.iterateAllAccessibleMethods(session, true);    // and aliases
          ti      = new DITypeInfo();
  
          // no such thing as identity or ignorecase return/parameter
          // procedure columns.  Future: may need to worry about this if
          // result columns are ever reported
          ti.setTypeSub(Types.TYPE_SUB_DEFAULT);
  
          // JDBC 4.0
  
          /**
           * @todo we do not yet support declarative p-column defaults.
           * In essence, the default value for a procedure column is NULL
           */
          colDefault       = null;
          procedureCatalog = database.getCatalogName().name;
          procedureSchema =
              database.schemaManager.getDefaultSchemaHsqlName().name;
  
          // Do it.
          while (methods.hasNext()) {
              info      = (Object[]) methods.next();
              method    = (Method) info[0];
              aliasList = (HsqlArrayList) info[1];
  
              pi.setMethod(method);
  
              specificName  = pi.getSpecificName();
              procedureName = pi.getFQN();
              colCount      = pi.getColCount();
  
              for (int i = 0; i < colCount; i++) {
                  ti.setTypeCode(pi.getColTypeCode(i));
  
                  columnName   = pi.getColName(i);
                  columnType   = pi.getColUsage(i);
                  dataType     = pi.getColJDBCDataType(i);
                  dataTypeName = ti.getTypeName();
                  precision    = ti.getPrecision();
                  length       = pi.getColLen(i);
                  scale        = ti.getDefaultScale();
                  radix        = ti.getNumPrecRadix();
                  nullability  = pi.getColNullability(i);
                  remark       = pi.getColRemark(i);
  
                  // JDBC 4.0
                  //colDefault    = null;
                  sqlDataType     = ti.getSqlDataType();
                  sqlDateTimeSub  = ti.getSqlDateTimeSub();
                  charOctetLength = ti.getCharOctLen();
                  ordinalPosition = pi.getColOrdinalPosition(i);
                  isNullable      = pi.getColIsNullable(i);
  
                  // extended
                  jdbcSequence = pi.getColSequence(i);
  
                  addPColRows(t, aliasList, procedureCatalog, procedureSchema,
                              procedureName, columnName, columnType, dataType,
                              dataTypeName, precision, length, scale, radix,
                              nullability, remark, colDefault, sqlDataType,
                              sqlDateTimeSub, charOctetLength, ordinalPosition,
                              isNullable, specificName, jdbcSequence);
              }
          }
  
          return t;
      }