docs: function (values) {
              values = argsToArray(arguments);
              var opts = this.__opts;
              if (opts.sql) {
                  return this._staticSql(opts.sql);
              }
              this.__checkModificationAllowed();
  
              var columns = [];
  
              switch (values.length) {
              case 0 :
                  //we have no values
                  return this.insertSql({});
              case 1 :
                  var vals = values[0], v;
                  if (isInstanceOf(vals, Dataset, LiteralString) || isArray(vals)) {
                      values = vals;
                  } else if (vals.hasOwnProperty("values") && isObject((v = vals.values))) {
                      return this.insertSql(v);
                  } else if (isHash(vals)) {
                      vals = merge({}, opts.defaults || {}, vals);
                      vals = merge({}, vals, opts.overrides || {});
                      values = [];
                      for (var i in vals) {
                          columns.push(i);
                          values.push(vals[i]);
                      }
                  } else if (isInstanceOf(vals, BooleanExpression)) {
                      var op = vals.op;
                      values = [];
                      if (!isUndefinedOrNull(this._static.TWO_ARITY_OPERATORS[op])) {
                          var args = vals.args;
                          columns.push(args[0]);
                          values.push(args[1]);
                      } else {
                          throw new QueryError("Invalid Expression op: " + op);
                      }
                  }
                  break;
              case 2 :
                  var v0 = values[0], v1 = values[1];
                  if (isArray(v0) && isArray(v1) || isInstanceOf(v1, Dataset, LiteralString)) {
                      columns = v0, values = v1;
                      if (isArray(values) && columns.length !== values.length) {
                          throw new QueryError("Different number of values and columns given to insertSql");
                      }
                  }
                  break;
              }
              columns = columns.map(function (k) {
                  return isString(k) ? new Identifier(k) : k;
              }, this);
              return this.mergeOptions({columns: columns, values: values})._insertSql();
          }