'Return a new :class:`.Insert` construct which represents
an ``INSERT...FROM SELECT`` statement.
e.g.::
sel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5)
ins = table2.insert().from_select([\'a\', \'b\'], sel)
:param names: a sequence of string column names or :class:`.Column`
objects representing the target columns.
:param select: a :func:`.select` construct, :class:`.FromClause`
or other construct which resolves into a :class:`.FromClause`,
such as an ORM :class:`.Query` object, etc.  The order of
columns returned from this FROM clause should correspond to the
order of columns sent as the ``names`` parameter;  while this
is not checked before passing along to the database, the database
would normally raise an exception if these column lists don\'t
correspond.
.. note::
Depending on backend, it may be necessary for the :class:`.Insert`
statement to be constructed using the ``inline=True`` flag; this
flag will prevent the implicit usage of ``RETURNING`` when the
``INSERT`` statement is rendered, which isn\'t supported on a backend
such as Oracle in conjunction with an ``INSERT..SELECT`` combination::
sel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5)
ins = table2.insert(inline=True).from_select([\'a\', \'b\'], sel)
.. note::
A SELECT..INSERT construct in SQL has no VALUES clause.  Therefore
:class:`.Column` objects which utilize Python-side defaults
(e.g. as described at :ref:`metadata_defaults_toplevel`)
will **not** take effect when using :meth:`.Insert.from_select`.
.. versionadded:: 0.8.3'

@_generative
def from_select(self, names, select):

    if self.parameters:
        raise exc.InvalidRequestError('This    construct    already    inserts    value    expressions')
    (self.parameters, self._has_multi_parameters) = self._process_colparams(dict(((n, Null()) for n in names)))
    self.select_names = names
    self.select = _interpret_as_select(select)
