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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * nodeFuncs.c
  4.  *   All node routines more complicated than simple access/modification
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/nodes/nodeFuncs.c,v 1.9 1999/02/13 23:15:59 momjian Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <sys/types.h>
  15. #include "postgres.h"
  16. #include "nodes/primnodes.h"
  17. #include "nodes/plannodes.h"
  18. #include "nodes/pg_list.h"
  19. #include "nodes/relation.h"
  20. #include "nodes/nodeFuncs.h"
  21. #include "utils/lsyscache.h"
  22. static bool var_is_inner(Var *var);
  23. /*
  24.  * single_node -
  25.  *   Returns t if node corresponds to a single-noded expression
  26.  */
  27. bool
  28. single_node(Node *node)
  29. {
  30. if (IsA(node, Ident) ||IsA(node, Const) ||IsA(node, Var) ||IsA(node, Param))
  31. return true;
  32. else
  33. return false;
  34. }
  35. /*****************************************************************************
  36.  * VAR nodes
  37.  *****************************************************************************/
  38. /*
  39.  * var_is_outer
  40.  * var_is_inner
  41.  * var_is_mat
  42.  * var_is_rel
  43.  *
  44.  * Returns t iff the var node corresponds to (respectively):
  45.  * the outer relation in a join
  46.  * the inner relation of a join
  47.  * a materialized relation
  48.  * a base relation (i.e., not an attribute reference, a variable from
  49.  * some lower join level, or a sort result)
  50.  * var node is an array reference
  51.  *
  52.  */
  53. bool
  54. var_is_outer(Var *var)
  55. {
  56. return (bool) (var->varno == OUTER);
  57. }
  58. static bool
  59. var_is_inner(Var *var)
  60. {
  61. return (bool) (var->varno == INNER);
  62. }
  63. bool
  64. var_is_rel(Var *var)
  65. {
  66. return (bool)
  67. !(var_is_inner(var) || var_is_outer(var));
  68. }
  69. /*****************************************************************************
  70.  * OPER nodes
  71.  *****************************************************************************/
  72. /*
  73.  * replace_opid -
  74.  *
  75.  * Given a oper node, resets the opfid field with the
  76.  * procedure OID (regproc id).
  77.  *
  78.  * Returns the modified oper node.
  79.  *
  80.  */
  81. Oper *
  82. replace_opid(Oper *oper)
  83. {
  84. oper->opid = get_opcode(oper->opno);
  85. oper->op_fcache = NULL;
  86. return oper;
  87. }
  88. /*****************************************************************************
  89.  * constant (CONST, PARAM) nodes
  90.  *****************************************************************************/
  91. /*
  92.  * non_null -
  93.  * Returns t if the node is a non-null constant, e.g., if the node has a
  94.  * valid `constvalue' field.
  95.  *
  96.  */
  97. bool
  98. non_null(Expr *c)
  99. {
  100. if (IsA(c, Const) &&!((Const *) c)->constisnull)
  101. return true;
  102. else
  103. return false;
  104. }