[] (PGresult)

    /*
     * call-seq:
     *    res[ n ]
     *
     * Returns the tuple (row) corresponding to _n_. Returns +nil+ if <tt>_n_ >= res.num_tuples</tt>.
     *
     * Equivalent to <tt>res.result[n]</tt>.
     */
    static VALUE
    pgresult_aref(argc, argv, obj)
        int argc;
        VALUE *argv;
        VALUE obj;
    {
        PGresult *result;
        VALUE a1, a2, val;
        int i, j, nf, nt;

        result = get_pgresult(obj);
        nt = PQntuples(result);
        nf = PQnfields(result);
        switch (rb_scan_args(argc, argv, "11", &a1, &a2)) {
        case 1:
          i = NUM2INT(a1);
          if( i >= nt ) return Qnil;

          val = rb_ary_new();
          for (j=0; j<nf; j++) {
              VALUE value = fetch_pgresult(result, i, j);
              rb_ary_push(val, value);
          }
          return val;

        case 2:
          i = NUM2INT(a1);
          if( i >= nt ) return Qnil;
          j = NUM2INT(a2);
          if( j >= nf ) return Qnil;
          return fetch_pgresult(result, i, j);

        default:
          return Qnil;            /* not reached */
        }
    }