mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Remove add_missing_from GUC and associated parser support for "implicit RTEs".
Per recent discussion, add_missing_from has been deprecated for long enough to consider removing, and it's getting in the way of planned parser refactoring. The system now always behaves as though add_missing_from were OFF.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.143 2009/07/16 06:33:43 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.144 2009/10/21 20:22:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -32,9 +32,6 @@
|
||||
#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,
|
||||
@ -51,7 +48,6 @@ static void expandTupleDesc(TupleDesc tupdesc, Alias *eref,
|
||||
int location, bool include_dropped,
|
||||
List **colnames, List **colvars);
|
||||
static int specialAttNum(const char *attname);
|
||||
static void warnAutoRange(ParseState *pstate, RangeVar *relation);
|
||||
|
||||
|
||||
/*
|
||||
@ -249,7 +245,7 @@ isFutureCTE(ParseState *pstate, const char *refname)
|
||||
* 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.
|
||||
* 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,7 +569,6 @@ qualifiedNameToVar(ParseState *pstate,
|
||||
char *schemaname,
|
||||
char *refname,
|
||||
char *colname,
|
||||
bool implicitRTEOK,
|
||||
int location)
|
||||
{
|
||||
RangeTblEntry *rte;
|
||||
@ -581,14 +576,8 @@ qualifiedNameToVar(ParseState *pstate,
|
||||
|
||||
rte = refnameRangeTblEntry(pstate, schemaname, refname, location,
|
||||
&sublevels_up);
|
||||
|
||||
if (rte == NULL)
|
||||
{
|
||||
if (!implicitRTEOK)
|
||||
return NULL;
|
||||
rte = addImplicitRTE(pstate,
|
||||
makeRangeVar(schemaname, refname, location));
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return scanRTEForColumn(pstate, rte, colname, location);
|
||||
}
|
||||
@ -1527,42 +1516,6 @@ addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
|
||||
pstate->p_varnamespace = lappend(pstate->p_varnamespace, rte);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
@ -2417,13 +2370,13 @@ attnumTypeId(Relation rd, int attid)
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a warning or error about an implicit RTE, if appropriate.
|
||||
* Generate a suitable error about a missing RTE.
|
||||
*
|
||||
* If ADD_MISSING_FROM is not enabled, raise an error. Otherwise, emit
|
||||
* a warning.
|
||||
* Since this is a very common type of error, we work rather hard to
|
||||
* produce a helpful message.
|
||||
*/
|
||||
static void
|
||||
warnAutoRange(ParseState *pstate, RangeVar *relation)
|
||||
void
|
||||
errorMissingRTE(ParseState *pstate, RangeVar *relation)
|
||||
{
|
||||
RangeTblEntry *rte;
|
||||
int sublevels_up;
|
||||
@ -2431,7 +2384,7 @@ warnAutoRange(ParseState *pstate, RangeVar *relation)
|
||||
|
||||
/*
|
||||
* Check to see if there are any potential matches in the query's
|
||||
* rangetable. This affects the message we provide.
|
||||
* rangetable.
|
||||
*/
|
||||
rte = searchRangeTable(pstate, relation);
|
||||
|
||||
@ -2452,39 +2405,21 @@ warnAutoRange(ParseState *pstate, RangeVar *relation)
|
||||
&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,
|
||||
if (rte)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_TABLE),
|
||||
errmsg("adding missing FROM-clause entry for table \"%s\"",
|
||||
errmsg("invalid reference to 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)),
|
||||
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)));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user