code: function () {
                  if (this.__columns) {
                      return asyncArray(this.__columns);
                  } else {
                      var ds = this.unfiltered().unordered().mergeOptions({distinct: null, limit: 1});
                      return asyncArray(ds.forEach().chain(function () {
                          var columns = this.__columns = ds.__columns || [];
                          return columns;
                      }.bind(this)));
                  }
              }
docs: @lends patio.Dataset.prototype 
  @field
  @type {comb.Promise}
  
  Returns a promise that is resolved with the columns in the result set in order as an array of strings.
  If the columns are currently cached, then the promise is immediately resolved with the cached value. Otherwise,
  a SELECT query is performed to retrieve a single row in order to get the columns.
  
  If you are looking for all columns for a single table and maybe some information about
  each column (e.g. database type), see {@link patio.Database#schema}.
  
  <pre class="code">
  DB.from("table").columns.chain(function(columns){
  // => ["id", "name"]
  });
  </pre>