aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/indexnode.c
blob: 43f870cb1fc5569c81d542eb11169e0020f91718 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*-------------------------------------------------------------------------
 *
 * indexnode.c--
 *	  Routines to find all indices on a relation
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/indexnode.c,v 1.8 1998/07/18 04:22:40 momjian Exp $
 *
 *-------------------------------------------------------------------------
 */
#include <sys/types.h>

#include "postgres.h"

#include "nodes/plannodes.h"
#include "nodes/parsenodes.h"
#include "nodes/relation.h"

#include "optimizer/internal.h"
#include "optimizer/plancat.h"
#include "optimizer/pathnode.h" /* where the decls go */


static List *find_secondary_index(Query *root, Oid relid);

/*
 * find-relation-indices--
 *	  Returns a list of index nodes containing appropriate information for
 *	  each (secondary) index defined on a relation.
 *
 */
List *
find_relation_indices(Query *root, RelOptInfo *rel)
{
	if (rel->indexed)
		return (find_secondary_index(root, lfirsti(rel->relids)));
	else
		return (NIL);
}

/*
 * find-secondary-index--
 *	  Creates a list of index path nodes containing information for each
 *	  secondary index defined on a relation by searching through the index
 *	  catalog.
 *
 * 'relid' is the OID of the relation for which indices are being located
 *
 * Returns a list of new index nodes.
 *
 */
static List *
find_secondary_index(Query *root, Oid relid)
{
	IdxInfoRetval indexinfo;
	List	   *indexes = NIL;
	bool		first = TRUE;

	while (index_info(root, first, relid, &indexinfo))
	{
		RelOptInfo		   *indexnode = makeNode(RelOptInfo);

		indexnode->relids = lconsi(indexinfo.relid, NIL);
		indexnode->relam = indexinfo.relam;
		indexnode->pages = indexinfo.pages;
		indexnode->tuples = indexinfo.tuples;
		indexnode->indexkeys = indexinfo.indexkeys;
		indexnode->ordering = indexinfo.orderOprs;
		indexnode->classlist = indexinfo.classlist;
		indexnode->indproc = indexinfo.indproc;
		indexnode->indpred = (List *) indexinfo.indpred;

		indexnode->indexed = false;		/* not indexed itself */
		indexnode->size = 0;
		indexnode->width = 0;
		indexnode->targetlist = NIL;
		indexnode->pathlist = NIL;
		indexnode->unorderedpath = NULL;
		indexnode->cheapestpath = NULL;
		indexnode->pruneable = true;
		indexnode->clauseinfo = NIL;
		indexnode->joininfo = NIL;
		indexnode->innerjoin = NIL;

		indexes = lcons(indexnode, indexes);
		first = FALSE;
	}

	return indexes;
}