1: # include "../ingres.h"
2: # include "../tree.h"
3: # include "../symbol.h"
4:
5: /*
6: ** MAPVAR -- construct varable maps for ROOT, AND, and AGHEAD nodes.
7: ** tl is a flag which indicates if the target list should
8: ** be included in the mapping. If tl = 0, it should; else it should not.
9: */
10:
11: mapvar(tree, tl)
12: struct querytree *tree;
13: int tl;
14: {
15: register struct querytree *t;
16: register int rmap, lmap;
17: extern struct querytree *ckvar();
18:
19: t = tree;
20: if (t == 0)
21: return (0);
22:
23: switch (t->sym.type)
24: {
25: case ROOT:
26: case AND:
27: case AGHEAD:
28: /* map the right side */
29: ((struct qt_root *)t)->rvarm = rmap = mapvar(t->right, tl);
30:
31: /* map the left side or else use existing values */
32: if (tl == 0)
33: {
34: ((struct qt_root *)t)->lvarm = lmap = mapvar(t->left, tl);
35: ((struct qt_root *)t)->lvarc = bitcnt(lmap);
36: }
37: else
38: lmap = ((struct qt_root *)t)->lvarm;
39:
40: /* form map of both sides */
41: rmap |= lmap;
42:
43: /* compute total var count */
44: ((struct qt_root *)t)->tvarc = bitcnt(rmap);
45:
46: return (rmap);
47:
48: case VAR:
49: if (((struct qt_var *)(t = ckvar(t)))->valptr)
50: return (0); /* var is a constant */
51: return (01 << ((struct qt_var *)t)->varno);
52: }
53:
54: /* node is not a VAR, AND, ROOT, or AGHEAD */
55: return (mapvar(t->left, tl) | mapvar(t->right, tl));
56: }
Defined functions
mapvar
defined in line
11; used 12 times