Now that DELETE has a USING clause, we should be able to make
add_missing_from=false the default in 8.1; the attached patch implements
this and updates the documentation.
Barring any objections, I'll apply this tomorrow.
-Neil
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql/doc/src/sgml/runtime.sgml,v
retrieving revision 1.312
diff -c -r1.312 runtime.sgml
*** doc/src/sgml/runtime.sgml 29 Mar 2005 03:01:29 -0000 1.312
--- doc/src/sgml/runtime.sgml 7 Apr 2005 07:02:30 -0000
***************
*** 3553,3567 ****
</indexterm>
<listitem>
<para>
! When <literal>true</>, tables that are referenced by a query will be
! automatically added to the <literal>FROM</> clause if not already
! present. The default is <literal>true</> for compatibility with
! previous releases of <productname>PostgreSQL</>. However, this
! behavior is not SQL-standard, and many people dislike it because it
! can mask mistakes (such as referencing a table where you should have
! referenced its alias). Set to <literal>false</> for the SQL-standard
! behavior of rejecting references to tables that are not listed in
! <literal>FROM</>.
</para>
</listitem>
</varlistentry>
--- 3553,3577 ----
</indexterm>
<listitem>
<para>
! When <literal>true</>, tables that are referenced by a query
! will be automatically added to the <literal>FROM</> clause if
! not already present. This behavior does not comply with the
! SQL standard and many people dislike it because it can mask
! mistakes (such as referencing a table where you should have
! referenced its alias). The default is <literal>false</>. This
! variable can be enabled for compatibility with releases of
! <productname>PostgreSQL</> prior to 8.1, where this behavior
! was allowed by default.
! </para>
!
! <para>
! Note that even when this variable is enabled, a warning
! message will be emitted for each implicit <literal>FROM</>
! entry referenced by a query. Users are encouraged to update
! their applications to not rely on this behavior, by adding all
! tables referenced by a query to the query's <literal>FROM</>
! clause (or its <literal>USING</> clause in the case of
! <command>DELETE</>).
</para>
</listitem>
</varlistentry>
Index: doc/src/sgml/ref/delete.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/delete.sgml,v
retrieving revision 1.23
diff -c -r1.23 delete.sgml
*** doc/src/sgml/ref/delete.sgml 7 Apr 2005 01:51:37 -0000 1.23
--- doc/src/sgml/ref/delete.sgml 7 Apr 2005 06:30:31 -0000
***************
*** 148,159 ****
In some cases the join style is easier to write or faster to
execute than the sub-select style.
</para>
-
- <para>
- If <varname>add_missing_from</varname> is enabled, any relations
- mentioned in the <literal>WHERE</literal> condition will be
- implicitly added to the <literal>USING</literal> clause.
- </para>
</refsect1>
<refsect1>
--- 148,153 ----
Index: doc/src/sgml/ref/select.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/select.sgml,v
retrieving revision 1.82
diff -c -r1.82 select.sgml
*** doc/src/sgml/ref/select.sgml 10 Mar 2005 23:21:20 -0000 1.82
--- doc/src/sgml/ref/select.sgml 7 Apr 2005 06:12:25 -0000
***************
*** 1011,1052 ****
</para>
<para>
! A less obvious use is to abbreviate a normal
! <command>SELECT</command> from tables:
<programlisting>
SELECT distributors.* WHERE distributors.name = 'Westward';
-
- did | name
- -----+----------
- 108 | Westward
- </programlisting>
- This works because an implicit <literal>FROM</literal> item is
- added for each table that is referenced in other parts of the
- <command>SELECT</command> statement but not mentioned in
- <literal>FROM</literal>.
- </para>
-
- <para>
- While this is a convenient shorthand, it's easy to misuse. For
- example, the command
- <programlisting>
- SELECT distributors.* FROM distributors d;
- </programlisting>
- is probably a mistake; most likely the user meant
- <programlisting>
- SELECT d.* FROM distributors d;
- </programlisting>
- rather than the unconstrained join
- <programlisting>
- SELECT distributors.* FROM distributors d, distributors distributors;
</programlisting>
! that he will actually get. To help detect this sort of mistake,
! <productname>PostgreSQL</productname> will warn if the
! implicit-<literal>FROM</literal> feature is used in a
! <command>SELECT</command> statement that also contains an explicit
! <literal>FROM</literal> clause. Also, it is possible to disable
! the implicit-<literal>FROM</literal> feature by setting the
! <xref linkend="guc-add-missing-from"> parameter to false.
</para>
</refsect2>
--- 1011,1031 ----
</para>
<para>
! Note that if a <literal>FROM</literal> clause is not specified,
! the query cannot reference any database tables. For example, the
! following query is invalid:
<programlisting>
SELECT distributors.* WHERE distributors.name = 'Westward';
</programlisting>
! <productname>PostgreSQL</productname> releases prior to
! 8.1 would accept queries of this form, and add an implicit entry
! to the query's <literal>FROM</literal> clause for each table
! referenced by the query. This is no longer the default behavior,
! because it does not comply with the SQL standard, and is
! considered by many to be error-prone. For compatibility with
! applications that rely on this behavior the <xref
! linkend="guc-add-missing-from"> configuration variable can be
! enabled.
</para>
</refsect2>
Index: doc/src/sgml/ref/show.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql/doc/src/sgml/ref/show.sgml,v
retrieving revision 1.37
diff -c -r1.37 show.sgml
*** doc/src/sgml/ref/show.sgml 4 Jan 2005 03:58:16 -0000 1.37
--- doc/src/sgml/ref/show.sgml 7 Apr 2005 05:37:12 -0000
***************
*** 166,172 ****
SHOW ALL;
name | setting
--------------------------------+----------------------------------------------
! add_missing_from | on
archive_command | unset
australian_timezones | off
.
--- 166,172 ----
SHOW ALL;
name | setting
--------------------------------+----------------------------------------------
! add_missing_from | off
archive_command | unset
australian_timezones | off
.
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /var/lib/cvs/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.257
diff -c -r1.257 guc.c
*** src/backend/utils/misc/guc.c 25 Mar 2005 16:17:27 -0000 1.257
--- src/backend/utils/misc/guc.c 7 Apr 2005 05:34:40 -0000
***************
*** 791,797 ****
NULL
},
&add_missing_from,
! true, NULL, NULL
},
{
{"check_function_bodies", PGC_USERSET, CLIENT_CONN_STATEMENT,
--- 791,797 ----
NULL
},
&add_missing_from,
! false, NULL, NULL
},
{
{"check_function_bodies", PGC_USERSET, CLIENT_CONN_STATEMENT,
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /var/lib/cvs/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.138
diff -c -r1.138 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample 24 Mar 2005 04:36:18 -0000 1.138
--- src/backend/utils/misc/postgresql.conf.sample 7 Apr 2005 05:35:04 -0000
***************
*** 313,319 ****
# - Previous Postgres Versions -
! #add_missing_from = true
#regex_flavor = advanced # advanced, extended, or basic
#sql_inheritance = true
#default_with_oids = false
--- 313,319 ----
# - Previous Postgres Versions -
! #add_missing_from = false
#regex_flavor = advanced # advanced, extended, or basic
#sql_inheritance = true
#default_with_oids = false