add_missing_from = false - Mailing list pgsql-patches

From Neil Conway
Subject add_missing_from = false
Date
Msg-id 4254DB7A.1020608@samurai.com
Whole thread Raw
Responses Re: add_missing_from = false
List pgsql-patches
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

pgsql-patches by date:

Previous
From: Neil Conway
Date:
Subject: Re: DELETE ... USING
Next
From: Neil Conway
Date:
Subject: fork_process() for pgstat