restrictinfo.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:4k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * restrictinfo.c
  4.  *   RestrictInfo node manipulation routines.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.4.2.1 1999/08/02 06:27:08 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "nodes/nodeFuncs.h"
  16. #include "optimizer/clauses.h"
  17. #include "optimizer/internal.h" 
  18. #include "optimizer/restrictinfo.h"
  19. /*
  20.  * valid_or_clause
  21.  *
  22.  * Returns t iff the restrictinfo node contains a 'normal' 'or' clause.
  23.  *
  24.  */
  25. bool
  26. valid_or_clause(RestrictInfo *restrictinfo)
  27. {
  28. if (restrictinfo != NULL &&
  29. !single_node((Node *) restrictinfo->clause) &&
  30. !restrictinfo->notclause &&
  31. or_clause((Node *) restrictinfo->clause))
  32. return true;
  33. else
  34. return false;
  35. }
  36. /*
  37.  * get_actual_clauses
  38.  *
  39.  * Returns a list containing the clauses from 'restrictinfo_list'.
  40.  *
  41.  */
  42. List *
  43. get_actual_clauses(List *restrictinfo_list)
  44. {
  45. List    *temp = NIL;
  46. List    *result = NIL;
  47. RestrictInfo *clause = (RestrictInfo *) NULL;
  48. foreach(temp, restrictinfo_list)
  49. {
  50. clause = (RestrictInfo *) lfirst(temp);
  51. result = lappend(result, clause->clause);
  52. }
  53. return result;
  54. }
  55. /*
  56.  * XXX NOTE:
  57.  * The following routines must return their contents in the same order
  58.  * (e.g., the first clause's info should be first, and so on) or else
  59.  * get_index_sel() won't work.
  60.  *
  61.  */
  62. /*
  63.  * get_relattvals
  64.  *   For each member of  a list of restrictinfo nodes to be used with an
  65.  *   index, create a vectori-long specifying:
  66.  * the attnos,
  67.  * the values of the clause constants, and
  68.  * flags indicating the type and location of the constant within
  69.  * each clause.
  70.  *   Each clause is of the form (op var some_type_of_constant), thus the
  71.  *   flag indicating whether the constant is on the left or right should
  72.  *   always be *SELEC-CONSTANT-RIGHT*.
  73.  *
  74.  * 'restrictinfo_list' is a list of restrictinfo nodes
  75.  *
  76.  * Returns a list of vectori-longs.
  77.  *
  78.  */
  79. void
  80. get_relattvals(List *restrictinfo_list,
  81.    List **attnos,
  82.    List **values,
  83.    List **flags)
  84. {
  85. List    *result1 = NIL;
  86. List    *result2 = NIL;
  87. List    *result3 = NIL;
  88. RestrictInfo *temp = (RestrictInfo *) NULL;
  89. List    *i = NIL;
  90. foreach(i, restrictinfo_list)
  91. {
  92. int dummy;
  93. AttrNumber attno;
  94. Datum constval;
  95. int flag;
  96. temp = (RestrictInfo *) lfirst(i);
  97. get_relattval((Node *) temp->clause, &dummy, &attno, &constval, &flag);
  98. result1 = lappendi(result1, (int) attno);
  99. result2 = lappendi(result2, constval);
  100. result3 = lappendi(result3, flag);
  101. }
  102. *attnos = result1;
  103. *values = result2;
  104. *flags = result3;
  105. return;
  106. }
  107. /*
  108.  * get_joinvars
  109.  *   Given a list of join restrictinfo nodes to be used with the index
  110.  *   of an inner join relation, return three lists consisting of:
  111.  * the attributes corresponding to the inner join relation
  112.  * the value of the inner var clause (always "")
  113.  * whether the attribute appears on the left or right side of
  114.  * the operator.
  115.  *
  116.  * 'relid' is the inner join relation
  117.  * 'restrictinfo_list' is a list of qualification clauses to be used with
  118.  * 'rel'
  119.  *
  120.  */
  121. void
  122. get_joinvars(Oid relid,
  123.  List *restrictinfo_list,
  124.  List **attnos,
  125.  List **values,
  126.  List **flags)
  127. {
  128. List    *result1 = NIL;
  129. List    *result2 = NIL;
  130. List    *result3 = NIL;
  131. List    *temp;
  132. foreach(temp, restrictinfo_list)
  133. {
  134. RestrictInfo *restrictinfo = lfirst(temp);
  135. Expr    *clause = restrictinfo->clause;
  136. if (IsA(get_leftop(clause), Var) &&
  137. (relid == (get_leftop(clause))->varno))
  138. {
  139. result1 = lappendi(result1, (int4) (get_leftop(clause))->varattno);
  140. result2 = lappend(result2, "");
  141. result3 = lappendi(result3, _SELEC_CONSTANT_RIGHT_);
  142. }
  143. else
  144. {
  145. result1 = lappendi(result1, (int4) (get_rightop(clause))->varattno);
  146. result2 = lappend(result2, "");
  147. result3 = lappendi(result3, _SELEC_CONSTANT_LEFT_);
  148. }
  149. }
  150. *attnos = result1;
  151. *values = result2;
  152. *flags = result3;
  153. return;
  154. }
  155. /*
  156.  * get_opnos
  157.  *   Create and return a list containing the clause operators of each member
  158.  *   of a list of restrictinfo nodes to be used with an index.
  159.  *
  160.  */
  161. List *
  162. get_opnos(List *restrictinfo_list)
  163. {
  164. RestrictInfo *temp = (RestrictInfo *) NULL;
  165. List    *result = NIL;
  166. List    *i = NIL;
  167. foreach(i, restrictinfo_list)
  168. {
  169. temp = (RestrictInfo *) lfirst(i);
  170. result = lappendi(result,
  171.   (((Oper *) temp->clause->oper)->opno));
  172. }
  173. return result;
  174. }