mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
A little further progress on schemas: push down RangeVars into
addRangeTableEntry calls. Remove relname field from RTEs, since it will no longer be a useful unique identifier of relations; we want to encourage people to rely on the relation OID instead. Further work on dumping qual expressions in EXPLAIN, too.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.172 2002/03/21 16:00:39 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.173 2002/03/22 02:56:31 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1476,8 +1476,6 @@ _copyRangeTblEntry(RangeTblEntry *from)
|
||||
RangeTblEntry *newnode = makeNode(RangeTblEntry);
|
||||
|
||||
newnode->rtekind = from->rtekind;
|
||||
if (from->relname)
|
||||
newnode->relname = pstrdup(from->relname);
|
||||
newnode->relid = from->relid;
|
||||
Node_Copy(from, newnode, subquery);
|
||||
newnode->jointype = from->jointype;
|
||||
@@ -2004,19 +2002,6 @@ _copyCreateStmt(CreateStmt *from)
|
||||
return newnode;
|
||||
}
|
||||
|
||||
static VersionStmt *
|
||||
_copyVersionStmt(VersionStmt *from)
|
||||
{
|
||||
VersionStmt *newnode = makeNode(VersionStmt);
|
||||
|
||||
newnode->relname = pstrdup(from->relname);
|
||||
newnode->direction = from->direction;
|
||||
newnode->fromRelname = pstrdup(from->fromRelname);
|
||||
newnode->date = pstrdup(from->date);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
||||
static DefineStmt *
|
||||
_copyDefineStmt(DefineStmt *from)
|
||||
{
|
||||
@@ -2847,9 +2832,6 @@ copyObject(void *from)
|
||||
case T_CreateStmt:
|
||||
retval = _copyCreateStmt(from);
|
||||
break;
|
||||
case T_VersionStmt:
|
||||
retval = _copyVersionStmt(from);
|
||||
break;
|
||||
case T_DefineStmt:
|
||||
retval = _copyDefineStmt(from);
|
||||
break;
|
||||
|
@@ -20,7 +20,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.120 2002/03/21 16:00:39 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.121 2002/03/22 02:56:31 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -831,21 +831,6 @@ _equalCreateStmt(CreateStmt *a, CreateStmt *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalVersionStmt(VersionStmt *a, VersionStmt *b)
|
||||
{
|
||||
if (!equalstr(a->relname, b->relname))
|
||||
return false;
|
||||
if (a->direction != b->direction)
|
||||
return false;
|
||||
if (!equalstr(a->fromRelname, b->fromRelname))
|
||||
return false;
|
||||
if (!equalstr(a->date, b->date))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalDefineStmt(DefineStmt *a, DefineStmt *b)
|
||||
{
|
||||
@@ -1679,8 +1664,6 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
|
||||
{
|
||||
if (a->rtekind != b->rtekind)
|
||||
return false;
|
||||
if (!equalstr(a->relname, b->relname))
|
||||
return false;
|
||||
if (a->relid != b->relid)
|
||||
return false;
|
||||
if (!equal(a->subquery, b->subquery))
|
||||
@@ -2004,9 +1987,6 @@ equal(void *a, void *b)
|
||||
case T_CreateStmt:
|
||||
retval = _equalCreateStmt(a, b);
|
||||
break;
|
||||
case T_VersionStmt:
|
||||
retval = _equalVersionStmt(a, b);
|
||||
break;
|
||||
case T_DefineStmt:
|
||||
retval = _equalDefineStmt(a, b);
|
||||
break;
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.28 2002/03/21 16:00:40 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.29 2002/03/22 02:56:32 tgl Exp $
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
@@ -190,3 +190,22 @@ makeRelabelType(Node *arg, Oid rtype, int32 rtypmod)
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* makeRangeVar -
|
||||
* creates a RangeVar node (rather oversimplified case)
|
||||
*/
|
||||
RangeVar *
|
||||
makeRangeVar(char *schemaname, char *relname)
|
||||
{
|
||||
RangeVar *r = makeNode(RangeVar);
|
||||
|
||||
r->catalogname = NULL;
|
||||
r->schemaname = schemaname;
|
||||
r->relname = relname;
|
||||
r->inhOpt = INH_DEFAULT;
|
||||
r->istemp = false;
|
||||
r->alias = NULL;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.150 2002/03/21 16:00:40 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.151 2002/03/22 02:56:32 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Every (plan) node in POSTGRES has an associated "out" routine which
|
||||
@@ -968,25 +968,38 @@ _outAlias(StringInfo str, Alias *node)
|
||||
static void
|
||||
_outRangeTblEntry(StringInfo str, RangeTblEntry *node)
|
||||
{
|
||||
appendStringInfo(str, " RTE :rtekind %d :relname ",
|
||||
(int) node->rtekind);
|
||||
_outToken(str, node->relname);
|
||||
appendStringInfo(str, " :relid %u :subquery ",
|
||||
node->relid);
|
||||
_outNode(str, node->subquery);
|
||||
appendStringInfo(str, " :jointype %d :joincoltypes ",
|
||||
(int) node->jointype);
|
||||
_outOidList(str, node->joincoltypes);
|
||||
appendStringInfo(str, " :joincoltypmods ");
|
||||
_outIntList(str, node->joincoltypmods);
|
||||
appendStringInfo(str, " :joinleftcols ");
|
||||
_outIntList(str, node->joinleftcols);
|
||||
appendStringInfo(str, " :joinrightcols ");
|
||||
_outIntList(str, node->joinrightcols);
|
||||
appendStringInfo(str, " :alias ");
|
||||
/* put alias + eref first to make dump more legible */
|
||||
appendStringInfo(str, " RTE :alias ");
|
||||
_outNode(str, node->alias);
|
||||
appendStringInfo(str, " :eref ");
|
||||
_outNode(str, node->eref);
|
||||
appendStringInfo(str, " :rtekind %d ",
|
||||
(int) node->rtekind);
|
||||
switch (node->rtekind)
|
||||
{
|
||||
case RTE_RELATION:
|
||||
case RTE_SPECIAL:
|
||||
appendStringInfo(str, ":relid %u ", node->relid);
|
||||
break;
|
||||
case RTE_SUBQUERY:
|
||||
appendStringInfo(str, ":subquery ");
|
||||
_outNode(str, node->subquery);
|
||||
break;
|
||||
case RTE_JOIN:
|
||||
appendStringInfo(str, ":jointype %d :joincoltypes ",
|
||||
(int) node->jointype);
|
||||
_outOidList(str, node->joincoltypes);
|
||||
appendStringInfo(str, " :joincoltypmods ");
|
||||
_outIntList(str, node->joincoltypmods);
|
||||
appendStringInfo(str, " :joinleftcols ");
|
||||
_outIntList(str, node->joinleftcols);
|
||||
appendStringInfo(str, " :joinrightcols ");
|
||||
_outIntList(str, node->joinrightcols);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "bogus rte kind %d", (int) node->rtekind);
|
||||
break;
|
||||
}
|
||||
appendStringInfo(str, " :inh %s :inFromCl %s :checkForRead %s"
|
||||
" :checkForWrite %s :checkAsUser %u",
|
||||
booltostr(node->inh),
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.52 2002/03/21 16:00:41 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.53 2002/03/22 02:56:32 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@@ -146,17 +146,17 @@ print_rt(List *rtable)
|
||||
List *l;
|
||||
int i = 1;
|
||||
|
||||
printf("resno\trelname(refname)\trelid\tinFromCl\n");
|
||||
printf("-----\t----------------\t-----\t--------\n");
|
||||
printf("resno\trefname \trelid\tinFromCl\n");
|
||||
printf("-----\t---------\t-----\t--------\n");
|
||||
foreach(l, rtable)
|
||||
{
|
||||
RangeTblEntry *rte = lfirst(l);
|
||||
|
||||
if (rte->relname)
|
||||
printf("%d\t%s (%s)\t%u",
|
||||
i, rte->relname, rte->eref->aliasname, rte->relid);
|
||||
if (rte->rtekind == RTE_RELATION)
|
||||
printf("%d\t%s\t%u",
|
||||
i, rte->eref->aliasname, rte->relid);
|
||||
else
|
||||
printf("%d\t[subquery] (%s)\t",
|
||||
printf("%d\t%s\t[subquery]",
|
||||
i, rte->eref->aliasname);
|
||||
printf("\t%s\t%s\n",
|
||||
(rte->inh ? "inh" : ""),
|
||||
@@ -406,19 +406,20 @@ print_plan_recursive(Plan *p, Query *parsetree, int indentLevel, char *label)
|
||||
printf("%s%s :c=%.2f..%.2f :r=%.0f :w=%d ", label, plannode_type(p),
|
||||
p->startup_cost, p->total_cost,
|
||||
p->plan_rows, p->plan_width);
|
||||
if (IsA(p, Scan) ||IsA(p, SeqScan))
|
||||
if (IsA(p, Scan) ||
|
||||
IsA(p, SeqScan))
|
||||
{
|
||||
RangeTblEntry *rte;
|
||||
|
||||
rte = rt_fetch(((Scan *) p)->scanrelid, parsetree->rtable);
|
||||
StrNCpy(extraInfo, rte->relname, NAMEDATALEN);
|
||||
StrNCpy(extraInfo, rte->eref->aliasname, NAMEDATALEN);
|
||||
}
|
||||
else if (IsA(p, IndexScan))
|
||||
{
|
||||
RangeTblEntry *rte;
|
||||
|
||||
rte = rt_fetch(((IndexScan *) p)->scan.scanrelid, parsetree->rtable);
|
||||
StrNCpy(extraInfo, rte->relname, NAMEDATALEN);
|
||||
StrNCpy(extraInfo, rte->eref->aliasname, NAMEDATALEN);
|
||||
}
|
||||
else
|
||||
extraInfo[0] = '\0';
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.117 2002/03/21 16:00:42 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.118 2002/03/22 02:56:32 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Most of the read functions for plan nodes are tested. (In fact, they
|
||||
@@ -1498,43 +1498,53 @@ _readRangeTblEntry(void)
|
||||
|
||||
local_node = makeNode(RangeTblEntry);
|
||||
|
||||
token = pg_strtok(&length); /* eat :rtekind */
|
||||
token = pg_strtok(&length); /* get :rtekind */
|
||||
local_node->rtekind = (RTEKind) atoi(token);
|
||||
|
||||
token = pg_strtok(&length); /* eat :relname */
|
||||
token = pg_strtok(&length); /* get :relname */
|
||||
local_node->relname = nullable_string(token, length);
|
||||
|
||||
token = pg_strtok(&length); /* eat :relid */
|
||||
token = pg_strtok(&length); /* get :relid */
|
||||
local_node->relid = atooid(token);
|
||||
|
||||
token = pg_strtok(&length); /* eat :subquery */
|
||||
local_node->subquery = nodeRead(true); /* now read it */
|
||||
|
||||
token = pg_strtok(&length); /* eat :jointype */
|
||||
token = pg_strtok(&length); /* get jointype */
|
||||
local_node->jointype = (JoinType) atoi(token);
|
||||
|
||||
token = pg_strtok(&length); /* eat :joincoltypes */
|
||||
local_node->joincoltypes = toOidList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joincoltypmods */
|
||||
local_node->joincoltypmods = toIntList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joinleftcols */
|
||||
local_node->joinleftcols = toIntList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joinrightcols */
|
||||
local_node->joinrightcols = toIntList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :alias */
|
||||
local_node->alias = nodeRead(true); /* now read it */
|
||||
|
||||
token = pg_strtok(&length); /* eat :eref */
|
||||
local_node->eref = nodeRead(true); /* now read it */
|
||||
|
||||
token = pg_strtok(&length); /* eat :rtekind */
|
||||
token = pg_strtok(&length); /* get rtekind */
|
||||
local_node->rtekind = (RTEKind) atoi(token);
|
||||
|
||||
switch (local_node->rtekind)
|
||||
{
|
||||
case RTE_RELATION:
|
||||
case RTE_SPECIAL:
|
||||
token = pg_strtok(&length); /* eat :relid */
|
||||
token = pg_strtok(&length); /* get :relid */
|
||||
local_node->relid = atooid(token);
|
||||
break;
|
||||
|
||||
case RTE_SUBQUERY:
|
||||
token = pg_strtok(&length); /* eat :subquery */
|
||||
local_node->subquery = nodeRead(true); /* now read it */
|
||||
break;
|
||||
|
||||
case RTE_JOIN:
|
||||
token = pg_strtok(&length); /* eat :jointype */
|
||||
token = pg_strtok(&length); /* get jointype */
|
||||
local_node->jointype = (JoinType) atoi(token);
|
||||
|
||||
token = pg_strtok(&length); /* eat :joincoltypes */
|
||||
local_node->joincoltypes = toOidList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joincoltypmods */
|
||||
local_node->joincoltypmods = toIntList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joinleftcols */
|
||||
local_node->joinleftcols = toIntList(nodeRead(true));
|
||||
|
||||
token = pg_strtok(&length); /* eat :joinrightcols */
|
||||
local_node->joinrightcols = toIntList(nodeRead(true));
|
||||
break;
|
||||
|
||||
default:
|
||||
elog(ERROR, "bogus rte kind %d", (int) local_node->rtekind);
|
||||
break;
|
||||
}
|
||||
|
||||
token = pg_strtok(&length); /* eat :inh */
|
||||
token = pg_strtok(&length); /* get :inh */
|
||||
local_node->inh = strtobool(token);
|
||||
|
Reference in New Issue
Block a user