Skip to content

Commit 6c59886

Browse files
committed
Second try at fixing join alias variables. Instead of attaching miscellaneous
lists to join RTEs, attach a list of Vars and COALESCE expressions that will replace the join's alias variables during planning. This simplifies flatten_join_alias_vars while still making it easy to fix up varno references when transforming the query tree. Add regression test cases for interactions of subqueries with outer joins.
1 parent c8996f9 commit 6c59886

File tree

21 files changed

+622
-651
lines changed

21 files changed

+622
-651
lines changed

src/backend/nodes/copyfuncs.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.181 2002/04/24 02:48:54 momjian Exp $
18+
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.182 2002/04/28 19:54:28 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -323,7 +323,6 @@ CopyJoinFields(Join *from, Join *newnode)
323323
{
324324
newnode->jointype = from->jointype;
325325
Node_Copy(from, newnode, joinqual);
326-
newnode->joinrti = from->joinrti;
327326
/* subPlan list must point to subplans in the new subtree, not the old */
328327
if (from->plan.subPlan != NIL)
329328
newnode->plan.subPlan = nconc(newnode->plan.subPlan,
@@ -1475,10 +1474,7 @@ _copyRangeTblEntry(RangeTblEntry *from)
14751474
newnode->relid = from->relid;
14761475
Node_Copy(from, newnode, subquery);
14771476
newnode->jointype = from->jointype;
1478-
newnode->joincoltypes = listCopy(from->joincoltypes);
1479-
newnode->joincoltypmods = listCopy(from->joincoltypmods);
1480-
newnode->joinleftcols = listCopy(from->joinleftcols);
1481-
newnode->joinrightcols = listCopy(from->joinrightcols);
1477+
Node_Copy(from, newnode, joinaliasvars);
14821478
Node_Copy(from, newnode, alias);
14831479
Node_Copy(from, newnode, eref);
14841480
newnode->inh = from->inh;

src/backend/nodes/equalfuncs.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* Portions Copyright (c) 1994, Regents of the University of California
2121
*
2222
* IDENTIFICATION
23-
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.129 2002/04/24 02:48:54 momjian Exp $
23+
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.130 2002/04/28 19:54:28 tgl Exp $
2424
*
2525
*-------------------------------------------------------------------------
2626
*/
@@ -1680,13 +1680,7 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
16801680
return false;
16811681
if (a->jointype != b->jointype)
16821682
return false;
1683-
if (!equali(a->joincoltypes, b->joincoltypes))
1684-
return false;
1685-
if (!equali(a->joincoltypmods, b->joincoltypmods))
1686-
return false;
1687-
if (!equali(a->joinleftcols, b->joinleftcols))
1688-
return false;
1689-
if (!equali(a->joinrightcols, b->joinrightcols))
1683+
if (!equal(a->joinaliasvars, b->joinaliasvars))
16901684
return false;
16911685
if (!equal(a->alias, b->alias))
16921686
return false;

src/backend/nodes/outfuncs.c

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
66
* Portions Copyright (c) 1994, Regents of the University of California
77
*
8-
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.156 2002/04/17 20:57:56 tgl Exp $
8+
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.157 2002/04/28 19:54:28 tgl Exp $
99
*
1010
* NOTES
1111
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -408,8 +408,6 @@ _outJoin(StringInfo str, Join *node)
408408
appendStringInfo(str, " :jointype %d :joinqual ",
409409
(int) node->jointype);
410410
_outNode(str, node->joinqual);
411-
appendStringInfo(str, " :joinrti %d ",
412-
node->joinrti);
413411
}
414412

415413
/*
@@ -423,8 +421,6 @@ _outNestLoop(StringInfo str, NestLoop *node)
423421
appendStringInfo(str, " :jointype %d :joinqual ",
424422
(int) node->join.jointype);
425423
_outNode(str, node->join.joinqual);
426-
appendStringInfo(str, " :joinrti %d ",
427-
node->join.joinrti);
428424
}
429425

430426
/*
@@ -438,8 +434,6 @@ _outMergeJoin(StringInfo str, MergeJoin *node)
438434
appendStringInfo(str, " :jointype %d :joinqual ",
439435
(int) node->join.jointype);
440436
_outNode(str, node->join.joinqual);
441-
appendStringInfo(str, " :joinrti %d ",
442-
node->join.joinrti);
443437

444438
appendStringInfo(str, " :mergeclauses ");
445439
_outNode(str, node->mergeclauses);
@@ -456,8 +450,6 @@ _outHashJoin(StringInfo str, HashJoin *node)
456450
appendStringInfo(str, " :jointype %d :joinqual ",
457451
(int) node->join.jointype);
458452
_outNode(str, node->join.joinqual);
459-
appendStringInfo(str, " :joinrti %d ",
460-
node->join.joinrti);
461453

462454
appendStringInfo(str, " :hashclauses ");
463455
_outNode(str, node->hashclauses);
@@ -982,22 +974,16 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
982974
{
983975
case RTE_RELATION:
984976
case RTE_SPECIAL:
985-
appendStringInfo(str, ":relid %u ", node->relid);
977+
appendStringInfo(str, ":relid %u", node->relid);
986978
break;
987979
case RTE_SUBQUERY:
988980
appendStringInfo(str, ":subquery ");
989981
_outNode(str, node->subquery);
990982
break;
991983
case RTE_JOIN:
992-
appendStringInfo(str, ":jointype %d :joincoltypes ",
984+
appendStringInfo(str, ":jointype %d :joinaliasvars ",
993985
(int) node->jointype);
994-
_outOidList(str, node->joincoltypes);
995-
appendStringInfo(str, " :joincoltypmods ");
996-
_outIntList(str, node->joincoltypmods);
997-
appendStringInfo(str, " :joinleftcols ");
998-
_outIntList(str, node->joinleftcols);
999-
appendStringInfo(str, " :joinrightcols ");
1000-
_outIntList(str, node->joinrightcols);
986+
_outNode(str, node->joinaliasvars);
1001987
break;
1002988
default:
1003989
elog(ERROR, "bogus rte kind %d", (int) node->rtekind);

src/backend/nodes/readfuncs.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.119 2002/04/11 20:00:00 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.120 2002/04/28 19:54:28 tgl Exp $
1212
*
1313
* NOTES
1414
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -421,10 +421,6 @@ _getJoin(Join *node)
421421

422422
token = pg_strtok(&length); /* skip the :joinqual */
423423
node->joinqual = nodeRead(true); /* get the joinqual */
424-
425-
token = pg_strtok(&length); /* skip the :joinrti */
426-
token = pg_strtok(&length); /* get the joinrti */
427-
node->joinrti = atoi(token);
428424
}
429425

430426

@@ -1523,17 +1519,8 @@ _readRangeTblEntry(void)
15231519
token = pg_strtok(&length); /* get jointype */
15241520
local_node->jointype = (JoinType) atoi(token);
15251521

1526-
token = pg_strtok(&length); /* eat :joincoltypes */
1527-
local_node->joincoltypes = toOidList(nodeRead(true));
1528-
1529-
token = pg_strtok(&length); /* eat :joincoltypmods */
1530-
local_node->joincoltypmods = toIntList(nodeRead(true));
1531-
1532-
token = pg_strtok(&length); /* eat :joinleftcols */
1533-
local_node->joinleftcols = toIntList(nodeRead(true));
1534-
1535-
token = pg_strtok(&length); /* eat :joinrightcols */
1536-
local_node->joinrightcols = toIntList(nodeRead(true));
1522+
token = pg_strtok(&length); /* eat :joinaliasvars */
1523+
local_node->joinaliasvars = nodeRead(true); /* now read it */
15371524
break;
15381525

15391526
default:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy