On Sun, Nov 24, 2013 at 02:03:18AM +0100, Vik Fearing wrote:
> On 10/15/2013 07:50 AM, David Fetter wrote:
> > On Mon, Oct 07, 2013 at 11:16:56PM -0700, David Fetter wrote:
> >> Folks,
> >>
> >> Please find attached a patch implementing and documenting, to some
> >> extent, $subject. I did this in aid of being able to import SQL
> >> standard catalogs and other entities where a known example could
> >> provide a template for a foreign table.
> >>
> >> Should there be errhint()s, too? Should we pile up all such errors
> >> and mention them at the end rather than simply bailing on the first
> >> one?
> >>
> >> TBD: regression tests.
> > Now included: regression tests for disallowed LIKE options.
>
> I like this patch, but I don't like its implementation at all.
>
> First of all, the documentation doesn't compile:
>
> openjade:ref/create_foreign_table.sgml:124:17:E: end tag for "LISTITEM"
> omitted, but OMITTAG NO was specified
> openjade:ref/create_foreign_table.sgml:119:4: start tag was here
Fixed.
> I fixed that, and then noticed that like_option is not explained like it
> is in CREATE TABLE.
Also fixed.
> Then I got down to the description of the LIKE clause in both pages, and
> I noticed the last line of CREATE TABLE, which is "Inapplicable options
> (e.g., INCLUDING INDEXES from a view) are ignored.". This is
> inconsistent with the behavior of this patch to throw errors for
> inapplicable options.
Fixed.
Please find attached the next rev :)
Cheers,
David.
--
David Fetter <[email protected]> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: [email protected]
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
diff --git a/doc/src/sgml/ref/create_foreign_table.sgml
b/doc/src/sgml/ref/create_foreign_table.sgml
index 1ef4b5e..375bd1a 100644
--- a/doc/src/sgml/ref/create_foreign_table.sgml
+++ b/doc/src/sgml/ref/create_foreign_table.sgml
@@ -20,6 +20,7 @@
<synopsis>
CREATE FOREIGN TABLE [ IF NOT EXISTS ] <replaceable
class="PARAMETER">table_name</replaceable> ( [
<replaceable class="PARAMETER">column_name</replaceable> <replaceable
class="PARAMETER">data_type</replaceable> [ OPTIONS ( <replaceable
class="PARAMETER">option</replaceable> '<replaceable
class="PARAMETER">value</replaceable>' [, ... ] ) ] [ COLLATE
<replaceable>collation</replaceable> ] [ <replaceable
class="PARAMETER">column_constraint</replaceable> [ ... ] ]
+ | LIKE <replaceable>source_table</replaceable> [
<replaceable>like_option</replaceable> ... ] }
[, ... ]
] )
SERVER <replaceable class="parameter">server_name</replaceable>
@@ -31,6 +32,8 @@ CREATE FOREIGN TABLE [ IF NOT EXISTS ] <replaceable
class="PARAMETER">table_name
{ NOT NULL |
NULL |
DEFAULT <replaceable>default_expr</replaceable> }
+
+ <phrase> and <replaceable class="PARAMETER">like_option</replaceable> is the
same as for <xref linkend="SQL-CREATETABLE">.</phrase>
</synopsis>
</refsynopsisdiv>
@@ -114,6 +117,19 @@ CREATE FOREIGN TABLE [ IF NOT EXISTS ] <replaceable
class="PARAMETER">table_name
</varlistentry>
<varlistentry>
+ <term><literal>LIKE <replaceable>source_table</replaceable> [
<replaceable>like_option</replaceable> ... ]</literal></term>
+ <listitem>
+ <para>
+ The <literal>LIKE</literal> clause specifies a table from which
+ the new foreign table automatically copies all column names and their
data types.
+ </para>
+ <para>
+ Inapplicable options like <literal>INCLUDING STORAGE</literal> are
ignored.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>NOT NULL</></term>
<listitem>
<para>
diff --git a/src/backend/parser/parse_utilcmd.c
b/src/backend/parser/parse_utilcmd.c
index eb07ca3..82c77eb 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -649,7 +649,7 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint
*constraint)
/*
* transformTableLikeClause
*
- * Change the LIKE <srctable> portion of a CREATE TABLE statement into
+ * Change the LIKE <srctable> portion of a CREATE [FOREIGN] TABLE statement
into
* column definitions which recreate the user defined column portions of
* <srctable>.
*/
@@ -668,12 +668,6 @@ transformTableLikeClause(CreateStmtContext *cxt,
TableLikeClause *table_like_cla
setup_parser_errposition_callback(&pcbstate, cxt->pstate,
table_like_clause->relation->location);
- /* we could support LIKE in many cases, but worry about it another day
*/
- if (cxt->isforeign)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("LIKE is not supported for creating
foreign tables")));
-
relation = relation_openrv(table_like_clause->relation,
AccessShareLock);
if (relation->rd_rel->relkind != RELKIND_RELATION &&
@@ -689,6 +683,12 @@ transformTableLikeClause(CreateStmtContext *cxt,
TableLikeClause *table_like_cla
cancel_parser_errposition_callback(&pcbstate);
/*
+ * For foreign tables, ignore all but applicable options.
+ */
+ if (cxt->isforeign)
+ table_like_clause->options &= CREATE_TABLE_LIKE_DEFAULTS |
CREATE_TABLE_LIKE_COMMENTS;
+
+ /*
* Check for privileges
*/
if (relation->rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers