aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/restrictinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/restrictinfo.c')
-rw-r--r--src/backend/optimizer/util/restrictinfo.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c
new file mode 100644
index 00000000000..22ffe665e2e
--- /dev/null
+++ b/src/backend/optimizer/util/restrictinfo.c
@@ -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;
+}