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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * indexnode.c
  4.  *   Routines to find all indices on a relation
  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/indexnode.c,v 1.16.2.1 1999/08/02 06:27:07 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <sys/types.h>
  15. #include "postgres.h"
  16. #include "optimizer/pathnode.h"
  17. #include "optimizer/plancat.h"
  18. static List *find_secondary_index(Query *root, Oid relid);
  19. /*
  20.  * find_relation_indices
  21.  *   Returns a list of index nodes containing appropriate information for
  22.  *   each (secondary) index defined on a relation.
  23.  *
  24.  */
  25. List *
  26. find_relation_indices(Query *root, RelOptInfo *rel)
  27. {
  28. if (rel->indexed)
  29. return find_secondary_index(root, lfirsti(rel->relids));
  30. else
  31. return NIL;
  32. }
  33. /*
  34.  * find_secondary_index
  35.  *   Creates a list of index path nodes containing information for each
  36.  *   secondary index defined on a relation by searching through the index
  37.  *   catalog.
  38.  *
  39.  * 'relid' is the OID of the relation for which indices are being located
  40.  *
  41.  * Returns a list of new index nodes.
  42.  *
  43.  */
  44. static List *
  45. find_secondary_index(Query *root, Oid relid)
  46. {
  47. IdxInfoRetval indexinfo;
  48. List    *indexes = NIL;
  49. bool first = TRUE;
  50. while (index_info(root, first, relid, &indexinfo))
  51. {
  52. RelOptInfo *indexnode = makeNode(RelOptInfo);
  53. indexnode->relids = lconsi(indexinfo.relid, NIL);
  54. indexnode->relam = indexinfo.relam;
  55. indexnode->pages = indexinfo.pages;
  56. indexnode->tuples = indexinfo.tuples;
  57. indexnode->indexkeys = indexinfo.indexkeys;
  58. indexnode->ordering = indexinfo.orderOprs;
  59. indexnode->classlist = indexinfo.classlist;
  60. indexnode->indproc = indexinfo.indproc;
  61. indexnode->indpred = (List *) indexinfo.indpred;
  62. indexnode->indexed = false; /* not indexed itself */
  63. indexnode->size = 0;
  64. indexnode->width = 0;
  65. indexnode->targetlist = NIL;
  66. indexnode->pathlist = NIL;
  67. indexnode->cheapestpath = NULL;
  68. indexnode->pruneable = true;
  69. indexnode->restrictinfo = NIL;
  70. indexnode->joininfo = NIL;
  71. indexnode->innerjoin = NIL;
  72. indexes = lcons(indexnode, indexes);
  73. first = FALSE;
  74. }
  75. return indexes;
  76. }