1: # include <ingres.h> 2: # include <symbol.h> 3: # include <tree.h> 4: # include <sccs.h> 5: 6: SCCSID(@(#)mapvars.c 8.1 12/31/84) 7: 8: /* 9: ** MAPVARS -- remap varno's to be unique in 'tree' tree 10: ** 11: ** A tree is scanned for VAR nodes; when found, the 12: ** mapping defined in Qt.qt_remap[] is applied. This is done so that 13: ** varno's as defined in trees in the 'tree' catalog will be 14: ** unique with respect to varno's in the user's query tree. For 15: ** example, if the view definition uses variable 1 and the user's 16: ** query also uses variable 1, the routine 'readqry' will (after 17: ** calling 'declare' to assign a new slot), put the index of this 18: ** new slot into the corresponding entry of Qt.qt_remap; 19: ** in this example, Qt.qt_remap[1] == 3. This routine does the actual 20: ** mapping in the tree. 21: ** 22: ** Parameters: 23: ** tree -- pointer to tree to be remapped. 24: ** 25: ** Returns: 26: ** none 27: ** 28: ** Side Effects: 29: ** the tree pointed to by 'tree' is modified according 30: ** to Qt.qt_remap[]. 31: ** 32: ** Trace Flags: 33: ** 7.4-7.7 34: */ 35: 36: mapvars(tree) 37: QTREE *tree; 38: { 39: register QTREE *t; 40: register int i; 41: 42: t = tree; 43: # ifdef xQTR3 44: if (tTf(7, 4) && t != NULL && t->sym.type == ROOT) 45: { 46: printf("mapvars:"); 47: treepr(t); 48: for (i = 0; i < MAXVAR + 1; i++) 49: if (Qt.qt_rangev[i].rngvdesc != NULL && Qt.qt_remap[i] >= 0) 50: printf("\t%d => %d\n", i, Qt.qt_remap[i]); 51: } 52: # endif 53: 54: while (t != NULL) 55: { 56: /* map right subtree */ 57: mapvars(t->right); 58: 59: /* check this node */ 60: if (t->sym.type == VAR) 61: t->sym.value.sym_var.varno = Qt.qt_remap[t->sym.value.sym_var.varno]; 62: 63: /* map left subtree (iteratively) */ 64: t = t->left; 65: } 66: }