191 lines
4.5 KiB
C
191 lines
4.5 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* restrictinfo.c--
|
|
* RestrictInfo node manipulation routines.
|
|
*
|
|
* Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.1 1999/02/05 19:59:31 momjian Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "nodes/relation.h"
|
|
#include "nodes/nodeFuncs.h"
|
|
|
|
#include "optimizer/internal.h"
|
|
#include "optimizer/clauses.h"
|
|
#include "optimizer/restrictinfo.h"
|
|
|
|
/*
|
|
* valid-or-clause--
|
|
*
|
|
* Returns t iff the restrictinfo node contains a 'normal' 'or' clause.
|
|
*
|
|
*/
|
|
bool
|
|
valid_or_clause(RestrictInfo * restrictinfo)
|
|
{
|
|
if (restrictinfo != NULL &&
|
|
!single_node((Node *) restrictinfo->clause) &&
|
|
!restrictinfo->notclause &&
|
|
or_clause((Node *) restrictinfo->clause))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* get-actual-clauses--
|
|
*
|
|
* Returns a list containing the clauses from 'restrictinfo-list'.
|
|
*
|
|
*/
|
|
List *
|
|
get_actual_clauses(List *restrictinfo_list)
|
|
{
|
|
List *temp = NIL;
|
|
List *result = NIL;
|
|
RestrictInfo *clause = (RestrictInfo *) NULL;
|
|
|
|
foreach(temp, restrictinfo_list)
|
|
{
|
|
clause = (RestrictInfo *) lfirst(temp);
|
|
result = lappend(result, clause->clause);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
* XXX NOTE:
|
|
* The following routines must return their contents in the same order
|
|
* (e.g., the first clause's info should be first, and so on) or else
|
|
* get_index_sel() won't work.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* get_relattvals--
|
|
* For each member of a list of restrictinfo nodes to be used with an
|
|
* index, create a vectori-long specifying:
|
|
* the attnos,
|
|
* the values of the clause constants, and
|
|
* flags indicating the type and location of the constant within
|
|
* each clause.
|
|
* Each clause is of the form (op var some_type_of_constant), thus the
|
|
* flag indicating whether the constant is on the left or right should
|
|
* always be *SELEC-CONSTANT-RIGHT*.
|
|
*
|
|
* 'restrictinfo-list' is a list of restrictinfo nodes
|
|
*
|
|
* Returns a list of vectori-longs.
|
|
*
|
|
*/
|
|
void
|
|
get_relattvals(List *restrictinfo_list,
|
|
List **attnos,
|
|
List **values,
|
|
List **flags)
|
|
{
|
|
List *result1 = NIL;
|
|
List *result2 = NIL;
|
|
List *result3 = NIL;
|
|
RestrictInfo *temp = (RestrictInfo *) NULL;
|
|
List *i = NIL;
|
|
|
|
foreach(i, restrictinfo_list)
|
|
{
|
|
int dummy;
|
|
AttrNumber attno;
|
|
Datum constval;
|
|
int flag;
|
|
|
|
temp = (RestrictInfo *) lfirst(i);
|
|
get_relattval((Node *) temp->clause, &dummy, &attno, &constval, &flag);
|
|
result1 = lappendi(result1, (int) attno);
|
|
result2 = lappendi(result2, constval);
|
|
result3 = lappendi(result3, flag);
|
|
}
|
|
|
|
*attnos = result1;
|
|
*values = result2;
|
|
*flags = result3;
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* get_joinvars --
|
|
* Given a list of join restrictinfo nodes to be used with the index
|
|
* of an inner join relation, return three lists consisting of:
|
|
* the attributes corresponding to the inner join relation
|
|
* the value of the inner var clause (always "")
|
|
* whether the attribute appears on the left or right side of
|
|
* the operator.
|
|
*
|
|
* 'relid' is the inner join relation
|
|
* 'restrictinfo-list' is a list of qualification clauses to be used with
|
|
* 'rel'
|
|
*
|
|
*/
|
|
void
|
|
get_joinvars(Oid relid,
|
|
List *restrictinfo_list,
|
|
List **attnos,
|
|
List **values,
|
|
List **flags)
|
|
{
|
|
List *result1 = NIL;
|
|
List *result2 = NIL;
|
|
List *result3 = NIL;
|
|
List *temp;
|
|
|
|
foreach(temp, restrictinfo_list)
|
|
{
|
|
RestrictInfo *restrictinfo = lfirst(temp);
|
|
Expr *clause = restrictinfo->clause;
|
|
|
|
if (IsA(get_leftop(clause), Var) &&
|
|
(relid == (get_leftop(clause))->varno))
|
|
{
|
|
result1 = lappendi(result1, (int4) (get_leftop(clause))->varattno);
|
|
result2 = lappend(result2, "");
|
|
result3 = lappendi(result3, _SELEC_CONSTANT_RIGHT_);
|
|
}
|
|
else
|
|
{
|
|
result1 = lappendi(result1, (int4) (get_rightop(clause))->varattno);
|
|
result2 = lappend(result2, "");
|
|
result3 = lappendi(result3, _SELEC_CONSTANT_LEFT_);
|
|
}
|
|
}
|
|
*attnos = result1;
|
|
*values = result2;
|
|
*flags = result3;
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* get_opnos--
|
|
* Create and return a list containing the clause operators of each member
|
|
* of a list of restrictinfo nodes to be used with an index.
|
|
*
|
|
*/
|
|
List *
|
|
get_opnos(List *restrictinfo_list)
|
|
{
|
|
RestrictInfo *temp = (RestrictInfo *) NULL;
|
|
List *result = NIL;
|
|
List *i = NIL;
|
|
|
|
foreach(i, restrictinfo_list)
|
|
{
|
|
temp = (RestrictInfo *) lfirst(i);
|
|
result = lappendi(result,
|
|
(((Oper *) temp->clause->oper)->opno));
|
|
}
|
|
return result;
|
|
}
|