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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * var.c
  4.  *   Var 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/var.c,v 1.20.2.1 1999/08/02 06:27:09 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <sys/types.h>
  15. #include "postgres.h"
  16. #include "optimizer/clauses.h"
  17. #include "optimizer/var.h"
  18. static bool pull_varnos_walker(Node *node, List **listptr);
  19. static bool contain_var_clause_walker(Node *node, void *context);
  20. static bool pull_var_clause_walker(Node *node, List **listptr);
  21. /*
  22.  * pull_varnos
  23.  *
  24.  * Create a list of all the distinct varnos present in a parsetree
  25.  * (tlist or qual).
  26.  */
  27. List *
  28. pull_varnos(Node *node)
  29. {
  30. List    *result = NIL;
  31. pull_varnos_walker(node, &result);
  32. return result;
  33. }
  34. static bool
  35. pull_varnos_walker(Node *node, List **listptr)
  36. {
  37. if (node == NULL)
  38. return false;
  39. if (IsA(node, Var))
  40. {
  41. Var    *var = (Var *) node;
  42. if (!intMember(var->varno, *listptr))
  43. *listptr = lconsi(var->varno, *listptr);
  44. return false;
  45. }
  46. return expression_tree_walker(node, pull_varnos_walker, (void *) listptr);
  47. }
  48. /*
  49.  * contain_var_clause
  50.  *   Recursively scan a clause to discover whether it contains any Var nodes.
  51.  *
  52.  *   Returns true if any varnode found.
  53.  */
  54. bool
  55. contain_var_clause(Node *clause)
  56. {
  57. return contain_var_clause_walker(clause, NULL);
  58. }
  59. static bool
  60. contain_var_clause_walker(Node *node, void *context)
  61. {
  62. if (node == NULL)
  63. return false;
  64. if (IsA(node, Var))
  65. return true; /* abort the tree traversal and return true */
  66. return expression_tree_walker(node, contain_var_clause_walker, context);
  67. }
  68. /*
  69.  * pull_var_clause
  70.  *   Recursively pulls all var nodes from an expression clause.
  71.  *
  72.  *   Returns list of varnodes found.  Note the varnodes themselves are not
  73.  *   copied, only referenced.
  74.  */
  75. List *
  76. pull_var_clause(Node *clause)
  77. {
  78. List    *result = NIL;
  79. pull_var_clause_walker(clause, &result);
  80. return result;
  81. }
  82. static bool
  83. pull_var_clause_walker(Node *node, List **listptr)
  84. {
  85. if (node == NULL)
  86. return false;
  87. if (IsA(node, Var))
  88. {
  89. *listptr = lappend(*listptr, node);
  90. return false;
  91. }
  92. return expression_tree_walker(node, pull_var_clause_walker,
  93.   (void *) listptr);
  94. }
  95. /*
  96.  * var_equal
  97.  *
  98.  * The only difference between this an equal() is that this does not
  99.  * test varnoold and varoattno.
  100.  *
  101.  * Returns t iff two var nodes correspond to the same attribute.
  102.  */
  103. bool
  104. var_equal(Var *var1, Var *var2)
  105. {
  106. if (IsA(var1, Var) &&IsA(var2, Var) &&
  107. (((Var *) var1)->varno == ((Var *) var2)->varno) &&
  108. (((Var *) var1)->vartype == ((Var *) var2)->vartype) &&
  109. (((Var *) var1)->vartypmod == ((Var *) var2)->vartypmod) &&
  110. (((Var *) var1)->varlevelsup == ((Var *) var2)->varlevelsup) &&
  111. (((Var *) var1)->varattno == ((Var *) var2)->varattno))
  112. {
  113. Assert(((Var *) var1)->varlevelsup == 0);
  114. return true;
  115. }
  116. else
  117. return false;
  118. }