Andrew Dunstan <and...@dunslane.net> writes:
> Squawk. I am currently travelling. Please give me until early next week 
> to research and react.

Okay, I'll hold off for a bit.  For reference, attached is the patch
I was about to apply.  This doesn't do any of the refactoring I had
in mind, it just removes the implicit-RTE logic.

                        regards, tom lane

Index: doc/src/sgml/config.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/config.sgml,v
retrieving revision 1.230
diff -c -r1.230 config.sgml
*** doc/src/sgml/config.sgml	3 Oct 2009 23:10:47 -0000	1.230
--- doc/src/sgml/config.sgml	17 Oct 2009 20:37:00 -0000
***************
*** 4659,4695 ****
  
       <variablelist>
  
-      <varlistentry id="guc-add-missing-from" xreflabel="add_missing_from">
-       <term><varname>add_missing_from</varname> (<type>boolean</type>)</term>
-       <indexterm><primary>FROM</><secondary>missing</></>
-       <indexterm>
-        <primary><varname>add_missing_from</> configuration parameter</primary>
-       </indexterm>
-       <listitem>
-        <para>
-         When on, 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>off</>. 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>
- 
       <varlistentry id="guc-array-nulls" xreflabel="array_nulls">
        <term><varname>array_nulls</varname> (<type>boolean</type>)</term>
        <indexterm>
--- 4659,4664 ----
Index: doc/src/sgml/queries.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/queries.sgml,v
retrieving revision 1.55
diff -c -r1.55 queries.sgml
*** doc/src/sgml/queries.sgml	17 Jun 2009 21:58:49 -0000	1.55
--- doc/src/sgml/queries.sgml	17 Oct 2009 20:37:00 -0000
***************
*** 521,543 ****
      </para>
  
      <para>
!      The alias becomes the new name of the table reference for the
!      current query &mdash; it is no longer possible to refer to the table
!      by the original name.  Thus:
! <programlisting>
! SELECT * FROM my_table AS m WHERE my_table.a &gt; 5;
! </programlisting>
!      is not valid according to the SQL standard.  In
!      <productname>PostgreSQL</productname> this will draw an error, assuming the
!      <xref linkend="guc-add-missing-from"> configuration variable is
!      <literal>off</> (as it is by default).  If it is <literal>on</>,
!      an implicit table reference will be added to the
!      <literal>FROM</literal> clause, so the query is processed as if
!      it were written as:
  <programlisting>
! SELECT * FROM my_table AS m, my_table AS my_table WHERE my_table.a &gt; 5;
  </programlisting>
-      That will result in a cross join, which is usually not what you want.
      </para>
  
      <para>
--- 521,533 ----
      </para>
  
      <para>
!      The alias becomes the new name of the table reference so far as the
!      current query is concerned &mdash; it is not allowed to refer to the
!      table by the original name elsewhere in the query.  Thus, this is not
!      valid:
  <programlisting>
! SELECT * FROM my_table AS m WHERE my_table.a &gt; 5;    -- wrong
  </programlisting>
      </para>
  
      <para>
Index: doc/src/sgml/ref/select.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/select.sgml,v
retrieving revision 1.125
diff -c -r1.125 select.sgml
*** doc/src/sgml/ref/select.sgml	18 Sep 2009 05:00:42 -0000	1.125
--- doc/src/sgml/ref/select.sgml	17 Oct 2009 20:37:01 -0000
***************
*** 1451,1462 ****
      <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>
  
--- 1451,1457 ----
      <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 allowed.
     </para>
    </refsect2>
  
Index: doc/src/sgml/ref/show.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/show.sgml,v
retrieving revision 1.47
diff -c -r1.47 show.sgml
*** doc/src/sgml/ref/show.sgml	14 Nov 2008 10:22:47 -0000	1.47
--- doc/src/sgml/ref/show.sgml	17 Oct 2009 20:37:01 -0000
***************
*** 168,183 ****
     Show all settings:
  <programlisting>
  SHOW ALL;
!               name              |            setting             |                                         description                                          
! --------------------------------+--------------------------------+----------------------------------------------------------------------------------------------
!  add_missing_from               | off                            | Automatically adds missing table references to FROM clauses.
!  allow_system_table_mods        | off                            | Allows modifications of the structure of system tables.
      .
      .
      .
!  work_mem                       | 1024                           | Sets the maximum memory to be used for query workspaces.
!  zero_damaged_pages             | off                            | Continues processing past damaged page headers.
! (146 rows)
  </programlisting>
    </para>
   </refsect1>
--- 168,182 ----
     Show all settings:
  <programlisting>
  SHOW ALL;
!               name               |                     setting                     |                                                          description                                                          
! ---------------------------------+-------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------
!  allow_system_table_mods         | off                                             | Allows modifications of the structure of system tables.
      .
      .
      .
!  xmloption                       | content                                         | Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments.
!  zero_damaged_pages              | off                                             | Continues processing past damaged page headers.
! (196 rows)
  </programlisting>
    </para>
   </refsect1>
Index: src/backend/parser/parse_expr.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v
retrieving revision 1.244
diff -c -r1.244 parse_expr.c
*** src/backend/parser/parse_expr.c	8 Oct 2009 02:39:23 -0000	1.244
--- src/backend/parser/parse_expr.c	17 Oct 2009 20:37:01 -0000
***************
*** 500,513 ****
  				name2 = strVal(field2);
  
  				/* Try to identify as a once-qualified column */
! 				node = qualifiedNameToVar(pstate, NULL, name1, name2, true,
  										  cref->location);
  				if (node == NULL)
  				{
  					/*
  					 * Not known as a column of any range-table entry, so try
! 					 * it as a function call.  Here, we will create an
! 					 * implicit RTE for tables not already entered.
  					 */
  					node = transformWholeRowRef(pstate, NULL, name1,
  												cref->location);
--- 500,512 ----
  				name2 = strVal(field2);
  
  				/* Try to identify as a once-qualified column */
! 				node = qualifiedNameToVar(pstate, NULL, name1, name2,
  										  cref->location);
  				if (node == NULL)
  				{
  					/*
  					 * Not known as a column of any range-table entry, so try
! 					 * it as a function call.
  					 */
  					node = transformWholeRowRef(pstate, NULL, name1,
  												cref->location);
***************
*** 545,551 ****
  				name3 = strVal(field3);
  
  				/* Try to identify as a twice-qualified column */
! 				node = qualifiedNameToVar(pstate, name1, name2, name3, true,
  										  cref->location);
  				if (node == NULL)
  				{
--- 544,550 ----
  				name3 = strVal(field3);
  
  				/* Try to identify as a twice-qualified column */
! 				node = qualifiedNameToVar(pstate, name1, name2, name3,
  										  cref->location);
  				if (node == NULL)
  				{
***************
*** 600,606 ****
  				name4 = strVal(field4);
  
  				/* Try to identify as a twice-qualified column */
! 				node = qualifiedNameToVar(pstate, name2, name3, name4, true,
  										  cref->location);
  				if (node == NULL)
  				{
--- 599,605 ----
  				name4 = strVal(field4);
  
  				/* Try to identify as a twice-qualified column */
! 				node = qualifiedNameToVar(pstate, name2, name3, name4,
  										  cref->location);
  				if (node == NULL)
  				{
***************
*** 1906,1919 ****
  	int			sublevels_up;
  	Oid			toid;
  
! 	/* Look up the referenced RTE, creating it if needed */
  
  	rte = refnameRangeTblEntry(pstate, schemaname, relname, location,
  							   &sublevels_up);
  
  	if (rte == NULL)
! 		rte = addImplicitRTE(pstate,
! 							 makeRangeVar(schemaname, relname, location));
  
  	vnum = RTERangeTablePosn(pstate, rte, &sublevels_up);
  
--- 1905,1918 ----
  	int			sublevels_up;
  	Oid			toid;
  
! 	/* Look up the referenced RTE, failing if not present */
  
  	rte = refnameRangeTblEntry(pstate, schemaname, relname, location,
  							   &sublevels_up);
  
  	if (rte == NULL)
! 		errorMissingRTE(pstate,
! 						makeRangeVar(schemaname, relname, location));
  
  	vnum = RTERangeTablePosn(pstate, rte, &sublevels_up);
  
Index: src/backend/parser/parse_relation.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v
retrieving revision 1.143
diff -c -r1.143 parse_relation.c
*** src/backend/parser/parse_relation.c	16 Jul 2009 06:33:43 -0000	1.143
--- src/backend/parser/parse_relation.c	17 Oct 2009 20:37:01 -0000
***************
*** 32,40 ****
  #include "utils/syscache.h"
  
  
- /* GUC parameter */
- bool		add_missing_from;
- 
  static RangeTblEntry *scanNameSpaceForRefname(ParseState *pstate,
  						const char *refname, int location);
  static RangeTblEntry *scanNameSpaceForRelid(ParseState *pstate, Oid relid,
--- 32,37 ----
***************
*** 51,57 ****
  				int location, bool include_dropped,
  				List **colnames, List **colvars);
  static int	specialAttNum(const char *attname);
- static void warnAutoRange(ParseState *pstate, RangeVar *relation);
  
  
  /*
--- 48,53 ----
***************
*** 249,255 ****
   * visible in the p_relnamespace lists.  This behavior is invalid per the SQL
   * spec, and it may give ambiguous results (there might be multiple equally
   * valid matches, but only one will be returned).  This must be used ONLY
!  * as a heuristic in giving suitable error messages.  See warnAutoRange.
   *
   * Notice that we consider both matches on actual relation (or CTE) name
   * and matches on alias.
--- 245,251 ----
   * visible in the p_relnamespace lists.  This behavior is invalid per the SQL
   * spec, and it may give ambiguous results (there might be multiple equally
   * valid matches, but only one will be returned).  This must be used ONLY
!  * as a heuristic in giving suitable error messages.  See errorMissingRTE.
   *
   * Notice that we consider both matches on actual relation (or CTE) name
   * and matches on alias.
***************
*** 573,579 ****
  				   char *schemaname,
  				   char *refname,
  				   char *colname,
- 				   bool implicitRTEOK,
  				   int location)
  {
  	RangeTblEntry *rte;
--- 569,574 ----
***************
*** 581,594 ****
  
  	rte = refnameRangeTblEntry(pstate, schemaname, refname, location,
  							   &sublevels_up);
- 
  	if (rte == NULL)
! 	{
! 		if (!implicitRTEOK)
! 			return NULL;
! 		rte = addImplicitRTE(pstate,
! 							 makeRangeVar(schemaname, refname, location));
! 	}
  
  	return scanRTEForColumn(pstate, rte, colname, location);
  }
--- 576,583 ----
  
  	rte = refnameRangeTblEntry(pstate, schemaname, refname, location,
  							   &sublevels_up);
  	if (rte == NULL)
! 		return NULL;
  
  	return scanRTEForColumn(pstate, rte, colname, location);
  }
***************
*** 1528,1569 ****
  }
  
  /*
-  * Add a POSTQUEL-style implicit RTE.
-  *
-  * We assume caller has already checked that there is no RTE or join with
-  * a conflicting name.
-  */
- RangeTblEntry *
- addImplicitRTE(ParseState *pstate, RangeVar *relation)
- {
- 	CommonTableExpr *cte = NULL;
- 	Index		levelsup = 0;
- 	RangeTblEntry *rte;
- 
- 	/* issue warning or error as needed */
- 	warnAutoRange(pstate, relation);
- 
- 	/* if it is an unqualified name, it might be a CTE reference */
- 	if (!relation->schemaname)
- 		cte = scanNameSpaceForCTE(pstate, relation->relname, &levelsup);
- 
- 	/*
- 	 * Note that we set inFromCl true, so that the RTE will be listed
- 	 * explicitly if the parsetree is ever decompiled by ruleutils.c. This
- 	 * provides a migration path for views/rules that were originally written
- 	 * with implicit-RTE syntax.
- 	 */
- 	if (cte)
- 		rte = addRangeTableEntryForCTE(pstate, cte, levelsup, NULL, true);
- 	else
- 		rte = addRangeTableEntry(pstate, relation, NULL, false, true);
- 	/* Add to joinlist and relnamespace, but not varnamespace */
- 	addRTEtoQuery(pstate, rte, true, true, false);
- 
- 	return rte;
- }
- 
- /*
   * expandRTE -- expand the columns of a rangetable entry
   *
   * This creates lists of an RTE's column names (aliases if provided, else
--- 1517,1522 ----
***************
*** 2417,2429 ****
  }
  
  /*
!  * Generate a warning or error about an implicit RTE, if appropriate.
   *
!  * If ADD_MISSING_FROM is not enabled, raise an error. Otherwise, emit
!  * a warning.
   */
! static void
! warnAutoRange(ParseState *pstate, RangeVar *relation)
  {
  	RangeTblEntry *rte;
  	int			sublevels_up;
--- 2370,2382 ----
  }
  
  /*
!  * Generate a suitable error about a missing RTE.
   *
!  * Since this is a very common type of error, we work rather hard to
!  * produce a helpful message.
   */
! void
! errorMissingRTE(ParseState *pstate, RangeVar *relation)
  {
  	RangeTblEntry *rte;
  	int			sublevels_up;
***************
*** 2431,2437 ****
  
  	/*
  	 * Check to see if there are any potential matches in the query's
! 	 * rangetable.	This affects the message we provide.
  	 */
  	rte = searchRangeTable(pstate, relation);
  
--- 2384,2390 ----
  
  	/*
  	 * Check to see if there are any potential matches in the query's
! 	 * rangetable.
  	 */
  	rte = searchRangeTable(pstate, relation);
  
***************
*** 2452,2490 ****
  							 &sublevels_up) == rte)
  		badAlias = rte->eref->aliasname;
  
! 	if (!add_missing_from)
! 	{
! 		if (rte)
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_TABLE),
! 			errmsg("invalid reference to FROM-clause entry for table \"%s\"",
! 				   relation->relname),
! 					 (badAlias ?
! 			errhint("Perhaps you meant to reference the table alias \"%s\".",
! 					badAlias) :
! 					  errhint("There is an entry for table \"%s\", but it cannot be referenced from this part of the query.",
! 							  rte->eref->aliasname)),
! 					 parser_errposition(pstate, relation->location)));
! 		else
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_TABLE),
! 					 errmsg("missing FROM-clause entry for table \"%s\"",
! 							relation->relname),
! 					 parser_errposition(pstate, relation->location)));
! 	}
! 	else
! 	{
! 		/* just issue a warning */
! 		ereport(NOTICE,
  				(errcode(ERRCODE_UNDEFINED_TABLE),
! 				 errmsg("adding missing FROM-clause entry for table \"%s\"",
  						relation->relname),
  				 (badAlias ?
! 			errhint("Perhaps you meant to reference the table alias \"%s\".",
! 					badAlias) :
! 				  (rte ?
! 				   errhint("There is an entry for table \"%s\", but it cannot be referenced from this part of the query.",
! 						   rte->eref->aliasname) : 0)),
  				 parser_errposition(pstate, relation->location)));
- 	}
  }
--- 2405,2425 ----
  							 &sublevels_up) == rte)
  		badAlias = rte->eref->aliasname;
  
! 	if (rte)
! 		ereport(ERROR,
  				(errcode(ERRCODE_UNDEFINED_TABLE),
! 				 errmsg("invalid reference to FROM-clause entry for table \"%s\"",
  						relation->relname),
  				 (badAlias ?
! 				  errhint("Perhaps you meant to reference the table alias \"%s\".",
! 						  badAlias) :
! 				  errhint("There is an entry for table \"%s\", but it cannot be referenced from this part of the query.",
! 						  rte->eref->aliasname)),
! 				 parser_errposition(pstate, relation->location)));
! 	else
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_TABLE),
! 				 errmsg("missing FROM-clause entry for table \"%s\"",
! 						relation->relname),
  				 parser_errposition(pstate, relation->location)));
  }
Index: src/backend/parser/parse_target.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/parse_target.c,v
retrieving revision 1.172
diff -c -r1.172 parse_target.c
*** src/backend/parser/parse_target.c	16 Jul 2009 06:33:43 -0000	1.172
--- src/backend/parser/parse_target.c	17 Oct 2009 20:37:01 -0000
***************
*** 927,935 ****
  		rte = refnameRangeTblEntry(pstate, schemaname, relname, cref->location,
  								   &sublevels_up);
  		if (rte == NULL)
! 			rte = addImplicitRTE(pstate,
! 								 makeRangeVar(schemaname, relname,
! 											  cref->location));
  
  		rtindex = RTERangeTablePosn(pstate, rte, &sublevels_up);
  
--- 927,934 ----
  		rte = refnameRangeTblEntry(pstate, schemaname, relname, cref->location,
  								   &sublevels_up);
  		if (rte == NULL)
! 			errorMissingRTE(pstate,
! 							makeRangeVar(schemaname, relname, cref->location));
  
  		rtindex = RTERangeTablePosn(pstate, rte, &sublevels_up);
  
***************
*** 973,980 ****
   *
   * tlist entries are generated for each relation appearing in the query's
   * varnamespace.  We do not consider relnamespace because that would include
!  * input tables of aliasless JOINs, NEW/OLD pseudo-entries, implicit RTEs,
!  * etc.
   *
   * The referenced relations/columns are marked as requiring SELECT access.
   */
--- 972,978 ----
   *
   * tlist entries are generated for each relation appearing in the query's
   * varnamespace.  We do not consider relnamespace because that would include
!  * input tables of aliasless JOINs, NEW/OLD pseudo-entries, etc.
   *
   * The referenced relations/columns are marked as requiring SELECT access.
   */
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.521
diff -c -r1.521 guc.c
*** src/backend/utils/misc/guc.c	13 Oct 2009 14:18:40 -0000	1.521
--- src/backend/utils/misc/guc.c	17 Oct 2009 20:37:01 -0000
***************
*** 45,51 ****
  #include "optimizer/paths.h"
  #include "optimizer/planmain.h"
  #include "parser/parse_expr.h"
- #include "parser/parse_relation.h"
  #include "parser/parse_type.h"
  #include "parser/parser.h"
  #include "parser/scansup.h"
--- 45,50 ----
***************
*** 1058,1071 ****
  		false, assign_transaction_read_only, NULL
  	},
  	{
- 		{"add_missing_from", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
- 			gettext_noop("Automatically adds missing table references to FROM clauses."),
- 			NULL
- 		},
- 		&add_missing_from,
- 		false, NULL, NULL
- 	},
- 	{
  		{"check_function_bodies", PGC_USERSET, CLIENT_CONN_STATEMENT,
  			gettext_noop("Check function bodies during CREATE FUNCTION."),
  			NULL
--- 1057,1062 ----
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.267
diff -c -r1.267 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample	22 Sep 2009 23:43:38 -0000	1.267
--- src/backend/utils/misc/postgresql.conf.sample	17 Oct 2009 20:37:01 -0000
***************
*** 484,490 ****
  
  # - Previous PostgreSQL Versions -
  
- #add_missing_from = off
  #array_nulls = on
  #backslash_quote = safe_encoding	# on, off, or safe_encoding
  #default_with_oids = off
--- 484,489 ----
Index: src/include/parser/parse_relation.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/parser/parse_relation.h,v
retrieving revision 1.64
diff -c -r1.64 parse_relation.h
*** src/include/parser/parse_relation.h	11 Jun 2009 14:49:11 -0000	1.64
--- src/include/parser/parse_relation.h	17 Oct 2009 20:37:01 -0000
***************
*** 16,23 ****
  
  #include "parser/parse_node.h"
  
- extern bool add_missing_from;
- 
  extern RangeTblEntry *refnameRangeTblEntry(ParseState *pstate,
  					 const char *schemaname,
  					 const char *refname,
--- 16,21 ----
***************
*** 44,50 ****
  				   char *schemaname,
  				   char *refname,
  				   char *colname,
- 				   bool implicitRTEOK,
  				   int location);
  extern void markVarForSelectPriv(ParseState *pstate, Var *var,
  					 RangeTblEntry *rte);
--- 42,47 ----
***************
*** 87,93 ****
  extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
  			  bool addToJoinList,
  			  bool addToRelNameSpace, bool addToVarNameSpace);
! extern RangeTblEntry *addImplicitRTE(ParseState *pstate, RangeVar *relation);
  extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
  		  int location, bool include_dropped,
  		  List **colnames, List **colvars);
--- 84,90 ----
  extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
  			  bool addToJoinList,
  			  bool addToRelNameSpace, bool addToVarNameSpace);
! extern void errorMissingRTE(ParseState *pstate, RangeVar *relation);
  extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
  		  int location, bool include_dropped,
  		  List **colnames, List **colvars);
Index: src/test/regress/expected/delete.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/delete.out,v
retrieving revision 1.2
diff -c -r1.2 delete.out
*** src/test/regress/expected/delete.out	14 Mar 2006 22:50:46 -0000	1.2
--- src/test/regress/expected/delete.out	17 Oct 2009 20:37:01 -0000
***************
*** 11,24 ****
  DELETE FROM delete_test AS dt WHERE dt.a > 75;
  -- if an alias is specified, don't allow the original table name
  -- to be referenced
- BEGIN;
- SET LOCAL add_missing_from = false;
  DELETE FROM delete_test dt WHERE delete_test.a > 25;
  ERROR:  invalid reference to FROM-clause entry for table "delete_test"
  LINE 1: DELETE FROM delete_test dt WHERE delete_test.a > 25;
                                           ^
  HINT:  Perhaps you meant to reference the table alias "dt".
- ROLLBACK;
  SELECT * FROM delete_test;
   id | a  
  ----+----
--- 11,21 ----
Index: src/test/regress/expected/rowtypes.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/rowtypes.out,v
retrieving revision 1.13
diff -c -r1.13 rowtypes.out
*** src/test/regress/expected/rowtypes.out	13 Oct 2008 16:25:20 -0000	1.13
--- src/test/regress/expected/rowtypes.out	17 Oct 2009 20:37:01 -0000
***************
*** 63,75 ****
    2 | ("(,4.4)","(5.5,6.6)")
  (2 rows)
  
- begin;
- set local add_missing_from = false;
  select f1, q.c1 from quadtable;		-- fails, q is a table reference
  ERROR:  missing FROM-clause entry for table "q"
  LINE 1: select f1, q.c1 from quadtable;
                     ^
- rollback;
  select f1, (q).c1, (qq.q).c1.i from quadtable qq;
   f1 |    c1     |  i  
  ----+-----------+-----
--- 63,72 ----
Index: src/test/regress/expected/update.out
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/expected/update.out,v
retrieving revision 1.5
diff -c -r1.5 update.out
*** src/test/regress/expected/update.out	3 Sep 2006 22:37:06 -0000	1.5
--- src/test/regress/expected/update.out	17 Oct 2009 20:37:01 -0000
***************
*** 82,93 ****
                                          ^
  -- if an alias for the target table is specified, don't allow references
  -- to the original table name
- BEGIN;
- SET LOCAL add_missing_from = false;
  UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10;
  ERROR:  invalid reference to FROM-clause entry for table "update_test"
  LINE 1: UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a...
                                          ^
  HINT:  Perhaps you meant to reference the table alias "t".
- ROLLBACK;
  DROP TABLE update_test;
--- 82,90 ----
Index: src/test/regress/sql/delete.sql
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/sql/delete.sql,v
retrieving revision 1.1
diff -c -r1.1 delete.sql
*** src/test/regress/sql/delete.sql	22 Jan 2006 05:20:35 -0000	1.1
--- src/test/regress/sql/delete.sql	17 Oct 2009 20:37:01 -0000
***************
*** 12,22 ****
  
  -- if an alias is specified, don't allow the original table name
  -- to be referenced
- BEGIN;
- SET LOCAL add_missing_from = false;
  DELETE FROM delete_test dt WHERE delete_test.a > 25;
- ROLLBACK;
  
  SELECT * FROM delete_test;
  
! DROP TABLE delete_test;
\ No newline at end of file
--- 12,19 ----
  
  -- if an alias is specified, don't allow the original table name
  -- to be referenced
  DELETE FROM delete_test dt WHERE delete_test.a > 25;
  
  SELECT * FROM delete_test;
  
! DROP TABLE delete_test;
Index: src/test/regress/sql/rowtypes.sql
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/sql/rowtypes.sql,v
retrieving revision 1.9
diff -c -r1.9 rowtypes.sql
*** src/test/regress/sql/rowtypes.sql	13 Oct 2008 16:25:20 -0000	1.9
--- src/test/regress/sql/rowtypes.sql	17 Oct 2009 20:37:01 -0000
***************
*** 35,44 ****
  
  select * from quadtable;
  
- begin;
- set local add_missing_from = false;
  select f1, q.c1 from quadtable;		-- fails, q is a table reference
- rollback;
  
  select f1, (q).c1, (qq.q).c1.i from quadtable qq;
  
--- 35,41 ----
Index: src/test/regress/sql/update.sql
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/sql/update.sql,v
retrieving revision 1.5
diff -c -r1.5 update.sql
*** src/test/regress/sql/update.sql	3 Sep 2006 22:37:06 -0000	1.5
--- src/test/regress/sql/update.sql	17 Oct 2009 20:37:01 -0000
***************
*** 52,60 ****
  
  -- if an alias for the target table is specified, don't allow references
  -- to the original table name
- BEGIN;
- SET LOCAL add_missing_from = false;
  UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10;
- ROLLBACK;
  
  DROP TABLE update_test;
--- 52,57 ----
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to