mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Optimizer cleanup.
This commit is contained in:
190
src/backend/optimizer/util/restrictinfo.c
Normal file
190
src/backend/optimizer/util/restrictinfo.c
Normal file
@@ -0,0 +1,190 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user