1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-10 17:42:29 +03:00

First cut at full support for OUTER JOINs. There are still a few loose

ends to clean up (see my message of same date to pghackers), but mostly
it works.  INITDB REQUIRED!
This commit is contained in:
Tom Lane
2000-09-12 21:07:18 +00:00
parent b5c0ab278b
commit ed5003c584
93 changed files with 6386 additions and 4262 deletions

View File

@@ -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.72 2000/08/11 23:45:31 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.73 2000/09/12 21:06:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -256,6 +256,26 @@ _equalSubLink(SubLink *a, SubLink *b)
return true;
}
static bool
_equalArrayRef(ArrayRef *a, ArrayRef *b)
{
if (a->refelemtype != b->refelemtype)
return false;
if (a->refattrlength != b->refattrlength)
return false;
if (a->refelemlength != b->refelemlength)
return false;
if (a->refelembyval != b->refelembyval)
return false;
if (!equal(a->refupperindexpr, b->refupperindexpr))
return false;
if (!equal(a->reflowerindexpr, b->reflowerindexpr))
return false;
if (!equal(a->refexpr, b->refexpr))
return false;
return equal(a->refassgnexpr, b->refassgnexpr);
}
static bool
_equalFieldSelect(FieldSelect *a, FieldSelect *b)
{
@@ -283,23 +303,37 @@ _equalRelabelType(RelabelType *a, RelabelType *b)
}
static bool
_equalArrayRef(ArrayRef *a, ArrayRef *b)
_equalRangeTblRef(RangeTblRef *a, RangeTblRef *b)
{
if (a->refelemtype != b->refelemtype)
if (a->rtindex != b->rtindex)
return false;
if (a->refattrlength != b->refattrlength)
return true;
}
static bool
_equalJoinExpr(JoinExpr *a, JoinExpr *b)
{
if (a->jointype != b->jointype)
return false;
if (a->refelemlength != b->refelemlength)
if (a->isNatural != b->isNatural)
return false;
if (a->refelembyval != b->refelembyval)
if (!equal(a->larg, b->larg))
return false;
if (!equal(a->refupperindexpr, b->refupperindexpr))
if (!equal(a->rarg, b->rarg))
return false;
if (!equal(a->reflowerindexpr, b->reflowerindexpr))
if (!equal(a->using, b->using))
return false;
if (!equal(a->refexpr, b->refexpr))
if (!equal(a->quals, b->quals))
return false;
return equal(a->refassgnexpr, b->refassgnexpr);
if (!equal(a->alias, b->alias))
return false;
if (!equal(a->colnames, b->colnames))
return false;
if (!equal(a->colvars, b->colvars))
return false;
return true;
}
/*
@@ -370,6 +404,8 @@ _equalIndexPath(IndexPath *a, IndexPath *b)
return false;
if (!equali(a->joinrelids, b->joinrelids))
return false;
if (a->alljoinquals != b->alljoinquals)
return false;
/*
* Skip 'rows' because of possibility of floating-point roundoff
@@ -395,6 +431,8 @@ _equalJoinPath(JoinPath *a, JoinPath *b)
{
if (!_equalPath((Path *) a, (Path *) b))
return false;
if (a->jointype != b->jointype)
return false;
if (!equal(a->outerjoinpath, b->outerjoinpath))
return false;
if (!equal(a->innerjoinpath, b->innerjoinpath))
@@ -457,6 +495,8 @@ _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
{
if (!equal(a->clause, b->clause))
return false;
if (a->isjoinqual != b->isjoinqual)
return false;
if (!equal(a->subclauseindices, b->subclauseindices))
return false;
if (a->mergejoinoperator != b->mergejoinoperator)
@@ -557,6 +597,8 @@ _equalQuery(Query *a, Query *b)
return false;
if (!equal(a->rtable, b->rtable))
return false;
if (!equal(a->jointree, b->jointree))
return false;
if (!equal(a->targetList, b->targetList))
return false;
if (!equal(a->qual, b->qual))
@@ -1475,17 +1517,6 @@ _equalTypeCast(TypeCast *a, TypeCast *b)
return true;
}
static bool
_equalRelExpr(RelExpr *a, RelExpr *b)
{
if (!equalstr(a->relname, b->relname))
return false;
if (a->inh != b->inh)
return false;
return true;
}
static bool
_equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
{
@@ -1500,7 +1531,20 @@ _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
static bool
_equalRangeVar(RangeVar *a, RangeVar *b)
{
if (!equal(a->relExpr, b->relExpr))
if (!equalstr(a->relname, b->relname))
return false;
if (a->inh != b->inh)
return false;
if (!equal(a->name, b->name))
return false;
return true;
}
static bool
_equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
{
if (!equal(a->subquery, b->subquery))
return false;
if (!equal(a->name, b->name))
return false;
@@ -1605,17 +1649,16 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
{
if (!equalstr(a->relname, b->relname))
return false;
if (!equal(a->ref, b->ref))
return false;
/* XXX what about eref? */
if (a->relid != b->relid)
return false;
if (!equal(a->alias, b->alias))
return false;
if (!equal(a->eref, b->eref))
return false;
if (a->inh != b->inh)
return false;
if (a->inFromCl != b->inFromCl)
return false;
if (a->inJoinSet != b->inJoinSet)
return false;
if (a->skipAcl != b->skipAcl)
return false;
@@ -1644,25 +1687,6 @@ _equalRowMark(RowMark *a, RowMark *b)
return true;
}
static bool
_equalJoinExpr(JoinExpr *a, JoinExpr *b)
{
if (a->jointype != b->jointype)
return false;
if (a->isNatural != b->isNatural)
return false;
if (!equal(a->larg, b->larg))
return false;
if (!equal(a->rarg, b->rarg))
return false;
if (!equal(a->alias, b->alias))
return false;
if (!equal(a->quals, b->quals))
return false;
return true;
}
static bool
_equalFkConstraint(FkConstraint *a, FkConstraint *b)
{
@@ -1808,6 +1832,12 @@ equal(void *a, void *b)
case T_RelabelType:
retval = _equalRelabelType(a, b);
break;
case T_RangeTblRef:
retval = _equalRangeTblRef(a, b);
break;
case T_JoinExpr:
retval = _equalJoinExpr(a, b);
break;
case T_RelOptInfo:
retval = _equalRelOptInfo(a, b);
@@ -2067,15 +2097,15 @@ equal(void *a, void *b)
case T_TypeCast:
retval = _equalTypeCast(a, b);
break;
case T_RelExpr:
retval = _equalRelExpr(a, b);
break;
case T_SortGroupBy:
retval = _equalSortGroupBy(a, b);
break;
case T_RangeVar:
retval = _equalRangeVar(a, b);
break;
case T_RangeSubselect:
retval = _equalRangeSubselect(a, b);
break;
case T_TypeName:
retval = _equalTypeName(a, b);
break;
@@ -2104,9 +2134,6 @@ equal(void *a, void *b)
/* GroupClause is equivalent to SortClause */
retval = _equalSortClause(a, b);
break;
case T_JoinExpr:
retval = _equalJoinExpr(a, b);
break;
case T_CaseExpr:
retval = _equalCaseExpr(a, b);
break;